forked from M-Labs/artiq-zynq
drtio_proto: add allocate step for flashing
This avoids reallocation while transfering binaries.
This commit is contained in:
parent
ac6b7d5cf0
commit
4502a47aa6
@ -332,11 +332,15 @@ pub enum Packet {
|
|||||||
CoreMgmtAllocatorDebugRequest {
|
CoreMgmtAllocatorDebugRequest {
|
||||||
destination: u8,
|
destination: u8,
|
||||||
},
|
},
|
||||||
CoreMgmtFlashRequest {
|
CoreMgmtFlashRequest {
|
||||||
|
destination: u8,
|
||||||
|
payload_length: u32,
|
||||||
|
},
|
||||||
|
CoreMgmtFlashAddDataRequest {
|
||||||
destination: u8,
|
destination: u8,
|
||||||
last: bool,
|
last: bool,
|
||||||
length: u16,
|
length: u16,
|
||||||
data: [u8; MASTER_PAYLOAD_MAX_SIZE],
|
data: [u8; MASTER_PAYLOAD_MAX_SIZE]
|
||||||
},
|
},
|
||||||
CoreMgmtDropLinkAck {
|
CoreMgmtDropLinkAck {
|
||||||
destination: u8,
|
destination: u8,
|
||||||
@ -694,24 +698,28 @@ impl Packet {
|
|||||||
0xda => Packet::CoreMgmtAllocatorDebugRequest {
|
0xda => Packet::CoreMgmtAllocatorDebugRequest {
|
||||||
destination: reader.read_u8()?,
|
destination: reader.read_u8()?,
|
||||||
},
|
},
|
||||||
0xdb => {
|
0xdb => Packet::CoreMgmtFlashRequest {
|
||||||
|
destination: reader.read_u8()?,
|
||||||
|
payload_length: reader.read_u32()?,
|
||||||
|
},
|
||||||
|
0xdc => {
|
||||||
let destination = reader.read_u8()?;
|
let destination = reader.read_u8()?;
|
||||||
let last = reader.read_bool()?;
|
let last = reader.read_bool()?;
|
||||||
let length = reader.read_u16()?;
|
let length = reader.read_u16()?;
|
||||||
let mut data: [u8; MASTER_PAYLOAD_MAX_SIZE] = [0; MASTER_PAYLOAD_MAX_SIZE];
|
let mut data: [u8; MASTER_PAYLOAD_MAX_SIZE] = [0; MASTER_PAYLOAD_MAX_SIZE];
|
||||||
reader.read_exact(&mut data[0..length as usize])?;
|
reader.read_exact(&mut data[0..length as usize])?;
|
||||||
Packet::CoreMgmtFlashRequest {
|
Packet::CoreMgmtFlashAddDataRequest {
|
||||||
destination: destination,
|
destination: destination,
|
||||||
last: last,
|
last: last,
|
||||||
length: length,
|
length: length,
|
||||||
data: data,
|
data: data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
0xdc => Packet::CoreMgmtDropLinkAck {
|
0xdd => Packet::CoreMgmtDropLinkAck {
|
||||||
destination: reader.read_u8()?,
|
destination: reader.read_u8()?,
|
||||||
},
|
},
|
||||||
0xdd => Packet::CoreMgmtDropLink,
|
0xde => Packet::CoreMgmtDropLink,
|
||||||
0xde => {
|
0xdf => {
|
||||||
let last = reader.read_bool()?;
|
let last = reader.read_bool()?;
|
||||||
let length = reader.read_u16()?;
|
let length = reader.read_u16()?;
|
||||||
let mut data: [u8; SAT_PAYLOAD_MAX_SIZE] = [0; SAT_PAYLOAD_MAX_SIZE];
|
let mut data: [u8; SAT_PAYLOAD_MAX_SIZE] = [0; SAT_PAYLOAD_MAX_SIZE];
|
||||||
@ -722,7 +730,7 @@ impl Packet {
|
|||||||
data: data,
|
data: data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
0xdf => {
|
0xe0 => {
|
||||||
let last = reader.read_bool()?;
|
let last = reader.read_bool()?;
|
||||||
let length = reader.read_u16()?;
|
let length = reader.read_u16()?;
|
||||||
let mut value: [u8; SAT_PAYLOAD_MAX_SIZE] = [0; SAT_PAYLOAD_MAX_SIZE];
|
let mut value: [u8; SAT_PAYLOAD_MAX_SIZE] = [0; SAT_PAYLOAD_MAX_SIZE];
|
||||||
@ -733,7 +741,7 @@ impl Packet {
|
|||||||
value: value,
|
value: value,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
0xe0 => Packet::CoreMgmtReply {
|
0xe1 => Packet::CoreMgmtReply {
|
||||||
succeeded: reader.read_bool()?,
|
succeeded: reader.read_bool()?,
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1182,37 +1190,42 @@ impl Packet {
|
|||||||
writer.write_u8(0xda)?;
|
writer.write_u8(0xda)?;
|
||||||
writer.write_u8(destination)?;
|
writer.write_u8(destination)?;
|
||||||
}
|
}
|
||||||
Packet::CoreMgmtFlashRequest {
|
Packet::CoreMgmtFlashRequest { destination, payload_length } => {
|
||||||
|
writer.write_u8(0xdb)?;
|
||||||
|
writer.write_u8(destination)?;
|
||||||
|
writer.write_u32(payload_length)?;
|
||||||
|
}
|
||||||
|
Packet::CoreMgmtFlashAddDataRequest {
|
||||||
destination,
|
destination,
|
||||||
last,
|
last,
|
||||||
length,
|
length,
|
||||||
data,
|
data,
|
||||||
} => {
|
} => {
|
||||||
writer.write_u8(0xdb)?;
|
writer.write_u8(0xdc)?;
|
||||||
writer.write_u8(destination)?;
|
writer.write_u8(destination)?;
|
||||||
writer.write_bool(last)?;
|
writer.write_bool(last)?;
|
||||||
writer.write_u16(length)?;
|
writer.write_u16(length)?;
|
||||||
writer.write_all(&data[..length as usize])?;
|
writer.write_all(&data[..length as usize])?;
|
||||||
}
|
}
|
||||||
Packet::CoreMgmtDropLinkAck { destination } => {
|
Packet::CoreMgmtDropLinkAck { destination } => {
|
||||||
writer.write_u8(0xdc)?;
|
writer.write_u8(0xdd)?;
|
||||||
writer.write_u8(destination)?;
|
writer.write_u8(destination)?;
|
||||||
}
|
}
|
||||||
Packet::CoreMgmtDropLink => writer.write_u8(0xdd)?,
|
Packet::CoreMgmtDropLink => writer.write_u8(0xde)?,
|
||||||
Packet::CoreMgmtGetLogReply { last, length, data } => {
|
Packet::CoreMgmtGetLogReply { last, length, data } => {
|
||||||
writer.write_u8(0xde)?;
|
writer.write_u8(0xdf)?;
|
||||||
writer.write_bool(last)?;
|
writer.write_bool(last)?;
|
||||||
writer.write_u16(length)?;
|
writer.write_u16(length)?;
|
||||||
writer.write_all(&data[0..length as usize])?;
|
writer.write_all(&data[0..length as usize])?;
|
||||||
}
|
}
|
||||||
Packet::CoreMgmtConfigReadReply { last, length, value } => {
|
Packet::CoreMgmtConfigReadReply { last, length, value } => {
|
||||||
writer.write_u8(0xdf)?;
|
writer.write_u8(0xe0)?;
|
||||||
writer.write_bool(last)?;
|
writer.write_bool(last)?;
|
||||||
writer.write_u16(length)?;
|
writer.write_u16(length)?;
|
||||||
writer.write_all(&value[0..length as usize])?;
|
writer.write_all(&value[0..length as usize])?;
|
||||||
}
|
}
|
||||||
Packet::CoreMgmtReply { succeeded } => {
|
Packet::CoreMgmtReply { succeeded } => {
|
||||||
writer.write_u8(0xe0)?;
|
writer.write_u8(0xe1)?;
|
||||||
writer.write_bool(succeeded)?;
|
writer.write_bool(succeeded)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -640,6 +640,31 @@ mod remote_coremgmt {
|
|||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut image = &image[..];
|
let mut image = &image[..];
|
||||||
|
|
||||||
|
let alloc_reply = drtio::aux_transact(
|
||||||
|
aux_mutex,
|
||||||
|
linkno,
|
||||||
|
routing_table,
|
||||||
|
&Packet::CoreMgmtFlashRequest {
|
||||||
|
destination: destination,
|
||||||
|
payload_length: image.len() as u32,
|
||||||
|
},
|
||||||
|
timer,
|
||||||
|
).await;
|
||||||
|
|
||||||
|
match alloc_reply {
|
||||||
|
Ok(Packet::CoreMgmtReply { succeeded: true }) => Ok(()),
|
||||||
|
Ok(packet) => {
|
||||||
|
error!("received unexpected aux packet: {:?}", packet);
|
||||||
|
write_i8(stream, Reply::Error as i8).await?;
|
||||||
|
Err(drtio::Error::UnexpectedReply)
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!("aux packet error ({})", e);
|
||||||
|
write_i8(stream, Reply::Error as i8).await?;
|
||||||
|
Err(drtio::Error::AuxError)
|
||||||
|
}
|
||||||
|
}?;
|
||||||
|
|
||||||
while !image.is_empty() {
|
while !image.is_empty() {
|
||||||
let mut data = [0; MASTER_PAYLOAD_MAX_SIZE];
|
let mut data = [0; MASTER_PAYLOAD_MAX_SIZE];
|
||||||
let len = image.read(&mut data).unwrap();
|
let len = image.read(&mut data).unwrap();
|
||||||
@ -649,7 +674,7 @@ mod remote_coremgmt {
|
|||||||
aux_mutex,
|
aux_mutex,
|
||||||
linkno,
|
linkno,
|
||||||
routing_table,
|
routing_table,
|
||||||
&Packet::CoreMgmtFlashRequest {
|
&Packet::CoreMgmtFlashAddDataRequest {
|
||||||
destination: destination,
|
destination: destination,
|
||||||
last: last,
|
last: last,
|
||||||
length: len as u16,
|
length: len as u16,
|
||||||
|
@ -1281,6 +1281,24 @@ fn process_aux_packet(
|
|||||||
drtioaux::send(0, &drtioaux::Packet::CoreMgmtReply { succeeded: false })
|
drtioaux::send(0, &drtioaux::Packet::CoreMgmtReply { succeeded: false })
|
||||||
}
|
}
|
||||||
drtioaux::Packet::CoreMgmtFlashRequest {
|
drtioaux::Packet::CoreMgmtFlashRequest {
|
||||||
|
destination: _destination,
|
||||||
|
payload_length
|
||||||
|
} => {
|
||||||
|
forward!(
|
||||||
|
router,
|
||||||
|
_routing_table,
|
||||||
|
_destination,
|
||||||
|
*rank,
|
||||||
|
*self_destination,
|
||||||
|
_repeaters,
|
||||||
|
&packet,
|
||||||
|
timer
|
||||||
|
);
|
||||||
|
|
||||||
|
core_manager.allocate_image_buffer(payload_length as usize);
|
||||||
|
drtioaux::send(0, &drtioaux::Packet::CoreMgmtReply { succeeded: true })
|
||||||
|
}
|
||||||
|
drtioaux::Packet::CoreMgmtFlashAddDataRequest {
|
||||||
destination: _destination,
|
destination: _destination,
|
||||||
last,
|
last,
|
||||||
length,
|
length,
|
||||||
|
@ -115,6 +115,10 @@ impl<'a> Manager<'_> {
|
|||||||
.map_err(|err| warn!("failed to erase: {:?}", err))
|
.map_err(|err| warn!("failed to erase: {:?}", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn allocate_image_buffer(&mut self, image_size: usize) {
|
||||||
|
self.image_payload = Vec::with_capacity(image_size);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_image_data(&mut self, data: &[u8], data_len: usize) {
|
pub fn add_image_data(&mut self, data: &[u8], data_len: usize) {
|
||||||
self.image_payload.extend(&data[..data_len]);
|
self.image_payload.extend(&data[..data_len]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user