forked from M-Labs/artiq-zynq
implement rtio_get_destination_status (#177)
Co-authored-by: mwojcik <mw@m-labs.hk> Co-committed-by: mwojcik <mw@m-labs.hk>
This commit is contained in:
parent
dc54d5f9b6
commit
a92561b9d3
@ -159,7 +159,7 @@ async fn write_exception_string(stream: &TcpStream, s: CSlice<'static, u8>) -> R
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_run_kernel(stream: Option<&TcpStream>, control: &Rc<RefCell<kernel::Control>>) -> Result<()> {
|
async fn handle_run_kernel(stream: Option<&TcpStream>, control: &Rc<RefCell<kernel::Control>>, up_destinations: &Rc<RefCell<[bool; drtio_routing::DEST_COUNT]>>) -> Result<()> {
|
||||||
control.borrow_mut().tx.async_send(kernel::Message::StartRequest).await;
|
control.borrow_mut().tx.async_send(kernel::Message::StartRequest).await;
|
||||||
loop {
|
loop {
|
||||||
let reply = control.borrow_mut().rx.async_recv().await;
|
let reply = control.borrow_mut().rx.async_recv().await;
|
||||||
@ -290,6 +290,10 @@ async fn handle_run_kernel(stream: Option<&TcpStream>, control: &Rc<RefCell<kern
|
|||||||
let result = DMA_RECORD_STORE.lock().get(&name).map(|v| v.clone());
|
let result = DMA_RECORD_STORE.lock().get(&name).map(|v| v.clone());
|
||||||
control.borrow_mut().tx.async_send(kernel::Message::DmaGetReply(result)).await;
|
control.borrow_mut().tx.async_send(kernel::Message::DmaGetReply(result)).await;
|
||||||
},
|
},
|
||||||
|
kernel::Message::UpDestinationsRequest(destination) => {
|
||||||
|
let result = up_destinations.borrow()[destination as usize];
|
||||||
|
control.borrow_mut().tx.async_send(kernel::Message::UpDestinationsReply(result)).await;
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
panic!("unexpected message from core1 while kernel was running: {:?}", reply);
|
panic!("unexpected message from core1 while kernel was running: {:?}", reply);
|
||||||
}
|
}
|
||||||
@ -331,7 +335,7 @@ async fn load_kernel(buffer: &Vec<u8>, control: &Rc<RefCell<kernel::Control>>, s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_connection(stream: &mut TcpStream, control: Rc<RefCell<kernel::Control>>) -> Result<()> {
|
async fn handle_connection(stream: &mut TcpStream, control: Rc<RefCell<kernel::Control>>, up_destinations: &Rc<RefCell<[bool; drtio_routing::DEST_COUNT]>>) -> Result<()> {
|
||||||
stream.set_ack_delay(None);
|
stream.set_ack_delay(None);
|
||||||
|
|
||||||
if !expect(stream, b"ARTIQ coredev\n").await? {
|
if !expect(stream, b"ARTIQ coredev\n").await? {
|
||||||
@ -354,7 +358,7 @@ async fn handle_connection(stream: &mut TcpStream, control: Rc<RefCell<kernel::C
|
|||||||
load_kernel(&buffer, &control, Some(stream)).await?;
|
load_kernel(&buffer, &control, Some(stream)).await?;
|
||||||
},
|
},
|
||||||
Request::RunKernel => {
|
Request::RunKernel => {
|
||||||
handle_run_kernel(Some(stream), &control).await?;
|
handle_run_kernel(Some(stream), &control, &up_destinations).await?;
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
error!("unexpected request from host: {:?}", request);
|
error!("unexpected request from host: {:?}", request);
|
||||||
@ -427,7 +431,7 @@ pub fn main(timer: GlobalTimer, cfg: Config) {
|
|||||||
info!("Loading startup kernel...");
|
info!("Loading startup kernel...");
|
||||||
if let Ok(()) = task::block_on(load_kernel(&buffer, &control, None)) {
|
if let Ok(()) = task::block_on(load_kernel(&buffer, &control, None)) {
|
||||||
info!("Starting startup kernel...");
|
info!("Starting startup kernel...");
|
||||||
let _ = task::block_on(handle_run_kernel(None, &control));
|
let _ = task::block_on(handle_run_kernel(None, &control, &up_destinations));
|
||||||
info!("Startup kernel finished!");
|
info!("Startup kernel finished!");
|
||||||
} else {
|
} else {
|
||||||
error!("Error loading startup kernel!");
|
error!("Error loading startup kernel!");
|
||||||
@ -452,13 +456,14 @@ pub fn main(timer: GlobalTimer, cfg: Config) {
|
|||||||
let idle_kernel = idle_kernel.clone();
|
let idle_kernel = idle_kernel.clone();
|
||||||
let connection = connection.clone();
|
let connection = connection.clone();
|
||||||
let terminate = terminate.clone();
|
let terminate = terminate.clone();
|
||||||
|
let up_destinations = up_destinations.clone();
|
||||||
|
|
||||||
// we make sure the value of terminate is 0 before we start
|
// we make sure the value of terminate is 0 before we start
|
||||||
let _ = terminate.try_wait();
|
let _ = terminate.try_wait();
|
||||||
task::spawn(async move {
|
task::spawn(async move {
|
||||||
select_biased! {
|
select_biased! {
|
||||||
_ = (async {
|
_ = (async {
|
||||||
let _ = handle_connection(&mut stream, control.clone())
|
let _ = handle_connection(&mut stream, control.clone(), &up_destinations)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| warn!("connection terminated: {}", e));
|
.map_err(|e| warn!("connection terminated: {}", e));
|
||||||
if let Some(buffer) = &*idle_kernel {
|
if let Some(buffer) = &*idle_kernel {
|
||||||
@ -466,7 +471,7 @@ pub fn main(timer: GlobalTimer, cfg: Config) {
|
|||||||
let _ = load_kernel(&buffer, &control, None)
|
let _ = load_kernel(&buffer, &control, None)
|
||||||
.await.map_err(|_| warn!("error loading idle kernel"));
|
.await.map_err(|_| warn!("error loading idle kernel"));
|
||||||
info!("Running idle kernel");
|
info!("Running idle kernel");
|
||||||
let _ = handle_run_kernel(None, &control)
|
let _ = handle_run_kernel(None, &control, &up_destinations)
|
||||||
.await.map_err(|_| warn!("error running idle kernel"));
|
.await.map_err(|_| warn!("error running idle kernel"));
|
||||||
info!("Idle kernel terminated");
|
info!("Idle kernel terminated");
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ use crate::i2c;
|
|||||||
use super::rpc::{rpc_send, rpc_send_async, rpc_recv};
|
use super::rpc::{rpc_send, rpc_send_async, rpc_recv};
|
||||||
use super::dma;
|
use super::dma;
|
||||||
use super::cache;
|
use super::cache;
|
||||||
|
use super::core1::rtio_get_destination_status;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn vsnprintf_(buffer: *mut c_char, count: size_t, format: *const c_char, va: VaList) -> c_int;
|
fn vsnprintf_(buffer: *mut c_char, count: size_t, format: *const c_char, va: VaList) -> c_int;
|
||||||
@ -87,7 +87,7 @@ pub fn resolve(required: &[u8]) -> Option<u32> {
|
|||||||
|
|
||||||
// rtio
|
// rtio
|
||||||
api!(rtio_init = rtio::init),
|
api!(rtio_init = rtio::init),
|
||||||
api!(rtio_get_destination_status = rtio::get_destination_status),
|
api!(rtio_get_destination_status = rtio_get_destination_status),
|
||||||
api!(rtio_get_counter = rtio::get_counter),
|
api!(rtio_get_counter = rtio::get_counter),
|
||||||
api!(rtio_output = rtio::output),
|
api!(rtio_output = rtio::output),
|
||||||
api!(rtio_output_wide = rtio::output_wide),
|
api!(rtio_output_wide = rtio::output_wide),
|
||||||
|
@ -233,3 +233,21 @@ extern fn dl_unwind_find_exidx(pc: *const u32, len_ptr: *mut u32) -> *const u32
|
|||||||
}
|
}
|
||||||
start
|
start
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub extern fn rtio_get_destination_status(destination: i32) -> bool {
|
||||||
|
#[cfg(has_drtio)]
|
||||||
|
if destination > 0 && destination < 255 {
|
||||||
|
let reply = unsafe {
|
||||||
|
let core1_rx = KERNEL_CHANNEL_0TO1.as_mut().unwrap();
|
||||||
|
let core1_tx = KERNEL_CHANNEL_1TO0.as_mut().unwrap();
|
||||||
|
core1_tx.send(Message::UpDestinationsRequest(destination));
|
||||||
|
core1_rx.recv()
|
||||||
|
};
|
||||||
|
return match reply {
|
||||||
|
Message::UpDestinationsReply(x) => x,
|
||||||
|
_ => panic!("received unexpected reply to UpDestinationsRequest: {:?}", reply)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
destination == 0
|
||||||
|
}
|
@ -47,6 +47,9 @@ pub enum Message {
|
|||||||
DmaEraseRequest(String),
|
DmaEraseRequest(String),
|
||||||
DmaGetRequest(String),
|
DmaGetRequest(String),
|
||||||
DmaGetReply(Option<(Vec<u8>, i64)>),
|
DmaGetReply(Option<(Vec<u8>, i64)>),
|
||||||
|
|
||||||
|
UpDestinationsRequest(i32),
|
||||||
|
UpDestinationsReply(bool),
|
||||||
}
|
}
|
||||||
|
|
||||||
static CHANNEL_0TO1: Mutex<Option<sync_channel::Sender<'static, Message>>> = Mutex::new(None);
|
static CHANNEL_0TO1: Mutex<Option<sync_channel::Sender<'static, Message>>> = Mutex::new(None);
|
||||||
|
@ -57,11 +57,6 @@ pub extern fn init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub extern fn get_destination_status(destination: i32) -> bool {
|
|
||||||
// TODO
|
|
||||||
destination == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pub extern fn get_counter() -> i64 {
|
pub extern fn get_counter() -> i64 {
|
||||||
unsafe {
|
unsafe {
|
||||||
csr::rtio::counter_update_write(1);
|
csr::rtio::counter_update_write(1);
|
||||||
|
@ -25,11 +25,6 @@ pub extern fn init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub extern fn get_destination_status(destination: i32) -> bool {
|
|
||||||
// TODO
|
|
||||||
destination == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pub extern fn get_counter() -> i64 {
|
pub extern fn get_counter() -> i64 {
|
||||||
unsafe {
|
unsafe {
|
||||||
csr::rtio::counter_update_write(1);
|
csr::rtio::counter_update_write(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user