1 // Copyright 2021 The ChromiumOS Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 //! Hand-written protocol for the cross-domain context type. Intended to be shared with C/C++ 6 //! components. 7 8 #![allow(dead_code)] 9 10 use zerocopy::FromBytes; 11 use zerocopy::Immutable; 12 use zerocopy::IntoBytes; 13 14 /// Cross-domain commands (only a maximum of 255 supported) 15 pub const CROSS_DOMAIN_CMD_INIT: u8 = 1; 16 pub const CROSS_DOMAIN_CMD_GET_IMAGE_REQUIREMENTS: u8 = 2; 17 pub const CROSS_DOMAIN_CMD_POLL: u8 = 3; 18 pub const CROSS_DOMAIN_CMD_SEND: u8 = 4; 19 pub const CROSS_DOMAIN_CMD_RECEIVE: u8 = 5; 20 pub const CROSS_DOMAIN_CMD_READ: u8 = 6; 21 pub const CROSS_DOMAIN_CMD_WRITE: u8 = 7; 22 23 /// Channel types (must match rutabaga channel types) 24 pub const CROSS_DOMAIN_CHANNEL_TYPE_WAYLAND: u32 = 0x0001; 25 pub const CROSS_DOMAIN_CHANNEL_TYPE_CAMERA: u32 = 0x0002; 26 27 /// The maximum number of identifiers 28 pub const CROSS_DOMAIN_MAX_IDENTIFIERS: usize = 28; 29 30 /// virtgpu memory resource ID. Also works with non-blob memory resources, despite the name. 31 pub const CROSS_DOMAIN_ID_TYPE_VIRTGPU_BLOB: u32 = 1; 32 /// virtgpu synchronization resource id. 33 pub const CROSS_DOMAIN_ID_TYPE_VIRTGPU_SYNC: u32 = 2; 34 /// ID for Wayland pipe used for reading. The reading is done by the guest proxy and the host 35 /// proxy. The host sends the write end of the proxied pipe over the host Wayland socket. 36 pub const CROSS_DOMAIN_ID_TYPE_READ_PIPE: u32 = 3; 37 /// ID for Wayland pipe used for writing. The writing is done by the guest and the host proxy. 38 /// The host receives the write end of the pipe over the host Wayland socket. 39 pub const CROSS_DOMAIN_ID_TYPE_WRITE_PIPE: u32 = 4; 40 41 /// No ring 42 pub const CROSS_DOMAIN_RING_NONE: u32 = 0xffffffff; 43 /// A ring for metadata queries. 44 pub const CROSS_DOMAIN_QUERY_RING: u32 = 0; 45 /// A ring based on this particular context's channel. 46 pub const CROSS_DOMAIN_CHANNEL_RING: u32 = 1; 47 48 /// Read pipe IDs start at this value. 49 pub const CROSS_DOMAIN_PIPE_READ_START: u32 = 0x80000000; 50 51 #[repr(C)] 52 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 53 pub struct CrossDomainCapabilities { 54 pub version: u32, 55 pub supported_channels: u32, 56 pub supports_dmabuf: u32, 57 pub supports_external_gpu_memory: u32, 58 } 59 60 #[repr(C)] 61 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 62 pub struct CrossDomainImageRequirements { 63 pub strides: [u32; 4], 64 pub offsets: [u32; 4], 65 pub modifier: u64, 66 pub size: u64, 67 pub blob_id: u32, 68 pub map_info: u32, 69 pub memory_idx: i32, 70 pub physical_device_idx: i32, 71 } 72 73 #[repr(C)] 74 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 75 pub struct CrossDomainHeader { 76 pub cmd: u8, 77 pub ring_idx: u8, 78 pub cmd_size: u16, 79 pub pad: u32, 80 } 81 82 #[repr(C)] 83 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 84 pub struct CrossDomainInit { 85 pub hdr: CrossDomainHeader, 86 pub query_ring_id: u32, 87 pub channel_ring_id: u32, 88 pub channel_type: u32, 89 } 90 91 #[repr(C)] 92 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 93 pub struct CrossDomainGetImageRequirements { 94 pub hdr: CrossDomainHeader, 95 pub width: u32, 96 pub height: u32, 97 pub drm_format: u32, 98 pub flags: u32, 99 } 100 101 #[repr(C)] 102 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 103 pub struct CrossDomainSendReceive { 104 pub hdr: CrossDomainHeader, 105 pub num_identifiers: u32, 106 pub opaque_data_size: u32, 107 pub identifiers: [u32; CROSS_DOMAIN_MAX_IDENTIFIERS], 108 pub identifier_types: [u32; CROSS_DOMAIN_MAX_IDENTIFIERS], 109 pub identifier_sizes: [u32; CROSS_DOMAIN_MAX_IDENTIFIERS], 110 // Data of size "opaque data size follows" 111 } 112 113 #[repr(C)] 114 #[derive(Copy, Clone, Debug, Default, FromBytes, IntoBytes, Immutable)] 115 pub struct CrossDomainReadWrite { 116 pub hdr: CrossDomainHeader, 117 pub identifier: u32, 118 pub hang_up: u32, 119 pub opaque_data_size: u32, 120 pub pad: u32, 121 // Data of size "opaque data size follows" 122 } 123