virtio/devices/virtio_gpu/messages/
resource_attach_backing.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2025.
4
5use kernel::ErrorCode;
6
7use super::super::helpers::copy_to_iter;
8use super::ctrl_header::{CtrlHeader, CtrlType};
9use super::{VirtIOGPUReq, VirtIOGPUResp};
10
11#[derive(Debug, Copy, Clone)]
12#[repr(C)]
13pub struct MemEntry {
14    pub addr: u64,
15    pub length: u32,
16    pub padding: u32,
17}
18
19impl MemEntry {
20    fn write_to_byte_iter<'a>(
21        &self,
22        dst: &mut impl Iterator<Item = &'a mut u8>,
23    ) -> Result<(), ErrorCode> {
24        // Write out fields to iterator.
25        //
26        // This struct doesn't need any padding bytes.
27        copy_to_iter(dst, u64::to_le_bytes(self.addr).into_iter())?;
28        copy_to_iter(dst, u32::to_le_bytes(self.length).into_iter())?;
29        copy_to_iter(dst, u32::to_le_bytes(self.padding).into_iter())?;
30
31        Ok(())
32    }
33}
34
35#[derive(Debug, Copy, Clone)]
36#[repr(C)]
37pub struct ResourceAttachBackingReq<const ENTRIES: usize> {
38    pub ctrl_header: CtrlHeader,
39    pub resource_id: u32,
40    pub nr_entries: u32,
41    pub entries: [MemEntry; ENTRIES],
42}
43
44impl<const ENTRIES: usize> VirtIOGPUReq for ResourceAttachBackingReq<ENTRIES> {
45    const ENCODED_SIZE: usize = core::mem::size_of::<Self>();
46    const CTRL_TYPE: CtrlType = CtrlType::CmdResourceAttachBacking;
47    type ExpectedResponse = ResourceAttachBackingResp;
48
49    fn write_to_byte_iter<'a>(
50        &self,
51        dst: &mut impl Iterator<Item = &'a mut u8>,
52    ) -> Result<(), ErrorCode> {
53        // Write out fields to iterator.
54        //
55        // This struct doesn't need any padding bytes.
56        self.ctrl_header.write_to_byte_iter(dst)?;
57        copy_to_iter(dst, u32::to_le_bytes(self.resource_id).into_iter())?;
58        copy_to_iter(dst, u32::to_le_bytes(self.nr_entries).into_iter())?;
59
60        for entry in self.entries {
61            entry.write_to_byte_iter(dst)?;
62        }
63
64        Ok(())
65    }
66}
67
68#[derive(Debug, Copy, Clone)]
69#[repr(C)]
70pub struct ResourceAttachBackingResp {
71    pub ctrl_header: CtrlHeader,
72}
73
74impl VirtIOGPUResp for ResourceAttachBackingResp {
75    const ENCODED_SIZE: usize = core::mem::size_of::<Self>();
76    const EXPECTED_CTRL_TYPE: CtrlType = CtrlType::RespOkNoData;
77
78    fn from_byte_iter_post_checked_ctrl_header(
79        ctrl_header: CtrlHeader,
80        _src: &mut impl Iterator<Item = u8>,
81    ) -> Result<Self, ErrorCode> {
82        Ok(ResourceAttachBackingResp { ctrl_header })
83    }
84}