virtio/devices/virtio_gpu/messages/
transfer_to_host_2d.rs1use kernel::ErrorCode;
6
7use super::super::helpers::copy_to_iter;
8use super::ctrl_header::{CtrlHeader, CtrlType};
9use super::{Rect, VirtIOGPUReq, VirtIOGPUResp};
10
11#[derive(Debug, Copy, Clone)]
12#[repr(C)]
13pub struct TransferToHost2DReq {
14 pub ctrl_header: CtrlHeader,
15 pub r: Rect,
16 pub offset: u64,
17 pub resource_id: u32,
18 pub padding: u32,
19}
20
21impl VirtIOGPUReq for TransferToHost2DReq {
22 const ENCODED_SIZE: usize = core::mem::size_of::<Self>();
23 const CTRL_TYPE: CtrlType = CtrlType::CmdTransferToHost2d;
24 type ExpectedResponse = TransferToHost2DResp;
25
26 fn write_to_byte_iter<'a>(
27 &self,
28 dst: &mut impl Iterator<Item = &'a mut u8>,
29 ) -> Result<(), ErrorCode> {
30 self.ctrl_header.write_to_byte_iter(dst)?;
34 self.r.write_to_byte_iter(dst)?;
35 copy_to_iter(dst, u64::to_le_bytes(self.offset).into_iter())?;
36 copy_to_iter(dst, u32::to_le_bytes(self.resource_id).into_iter())?;
37 copy_to_iter(dst, u32::to_le_bytes(self.padding).into_iter())?;
38
39 Ok(())
40 }
41}
42
43#[derive(Debug, Copy, Clone)]
44#[repr(C)]
45pub struct TransferToHost2DResp {
46 pub ctrl_header: CtrlHeader,
47}
48
49impl VirtIOGPUResp for TransferToHost2DResp {
50 const ENCODED_SIZE: usize = core::mem::size_of::<Self>();
51 const EXPECTED_CTRL_TYPE: CtrlType = CtrlType::RespOkNoData;
52
53 fn from_byte_iter_post_checked_ctrl_header(
54 ctrl_header: CtrlHeader,
55 _src: &mut impl Iterator<Item = u8>,
56 ) -> Result<Self, ErrorCode> {
57 Ok(TransferToHost2DResp { ctrl_header })
58 }
59}