// Copyright 2021 The ChromiumOS Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef VM_TOOLS_SOMMELIER_VIRTUALIZATION_VIRTGPU_CROSS_DOMAIN_PROTOCOL_H_ #define VM_TOOLS_SOMMELIER_VIRTUALIZATION_VIRTGPU_CROSS_DOMAIN_PROTOCOL_H_ #include // Cross-domain commands (only a maximum of 255 supported) #define CROSS_DOMAIN_CMD_INIT 1 #define CROSS_DOMAIN_CMD_GET_IMAGE_REQUIREMENTS 2 #define CROSS_DOMAIN_CMD_POLL 3 #define CROSS_DOMAIN_CMD_SEND 4 #define CROSS_DOMAIN_CMD_RECEIVE 5 #define CROSS_DOMAIN_CMD_READ 6 #define CROSS_DOMAIN_CMD_WRITE 7 // Channel types (must match rutabaga channel types) #define CROSS_DOMAIN_CHANNEL_TYPE_WAYLAND 0x0001 #define CROSS_DOMAIN_CHANNEL_TYPE_CAMERA 0x0002 // The maximum number of identifiers (value based on wp_linux_dmabuf) #define CROSS_DOMAIN_MAX_IDENTIFIERS 4 // virtgpu memory resource ID. Also works with non-blob memory resources, // despite the name. #define CROSS_DOMAIN_ID_TYPE_VIRTGPU_BLOB 1 // virtgpu synchronization resource id. #define CROSS_DOMAIN_ID_TYPE_VIRTGPU_SYNC 2 // ID for Wayland pipe used for reading. The reading is done by the guest proxy // and the host proxy. The host sends the write end of the proxied pipe over // the host Wayland socket. #define CROSS_DOMAIN_ID_TYPE_READ_PIPE 3 // ID for Wayland pipe used for writing. The writing is done by the guest and // the host proxy. The host receives the write end of the pipe over the host // Wayland socket. #define CROSS_DOMAIN_ID_TYPE_WRITE_PIPE 4 // No ring used #define CROSS_DOMAIN_RING_NONE 0xffffffff // A ring for metadata queries. #define CROSS_DOMAIN_QUERY_RING 0 // A ring based on this particular context's channel. #define CROSS_DOMAIN_CHANNEL_RING 1 struct CrossDomainCapabilities { uint32_t version; uint32_t supported_channels; uint32_t supports_dmabuf; uint32_t supports_external_gpu_memory; }; struct CrossDomainImageRequirements { uint32_t strides[4]; uint32_t offsets[4]; uint64_t modifier; uint64_t size; uint32_t blob_id; uint32_t map_info; int32_t memory_idx; int32_t physical_device_idx; }; struct CrossDomainHeader { uint8_t cmd; uint8_t fence_ctx_idx; uint16_t cmd_size; uint32_t pad; }; struct CrossDomainInit { struct CrossDomainHeader hdr; uint32_t ring_id; uint32_t channel_type; }; struct CrossDomainGetImageRequirements { struct CrossDomainHeader hdr; uint32_t width; uint32_t height; uint32_t drm_format; uint32_t flags; }; struct CrossDomainPoll { struct CrossDomainHeader hdr; uint64_t pad; }; struct CrossDomainSendReceive { struct CrossDomainHeader hdr; uint32_t num_identifiers; uint32_t opaque_data_size; uint32_t identifiers[CROSS_DOMAIN_MAX_IDENTIFIERS]; uint32_t identifier_types[CROSS_DOMAIN_MAX_IDENTIFIERS]; uint32_t identifier_sizes[CROSS_DOMAIN_MAX_IDENTIFIERS]; }; struct CrossDomainReadWrite { struct CrossDomainHeader hdr; uint32_t identifier; uint32_t hang_up; uint32_t opaque_data_size; uint32_t pad; }; #endif