/** @file Virtio GPU Device specific type and macro definitions. At the time of this writing, the Virtio 1.0 specification has not incorporated the GPU device yet. The following work-in-progress specification is used as basis for the implementation: - https://lists.oasis-open.org/archives/virtio-dev/201605/msg00002.html - https://www.kraxel.org/virtio/ This header file is minimal, and only defines the types and macros that are necessary for the OvmfPkg implementation. Copyright (C) 2016, Red Hat, Inc. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _VIRTIO_GPU_H_ #define _VIRTIO_GPU_H_ #include // // Queue number for sending control commands. // #define VIRTIO_GPU_CONTROL_QUEUE 0 // // Command and response types. // typedef enum { // // Commands related to mode setup: // // - create/release a host-side 2D resource, // VirtioGpuCmdGetDisplayInfo = 0x0100, VirtioGpuCmdResourceCreate2d = 0x0101, VirtioGpuCmdResourceUnref = 0x0102, // // - attach/detach guest RAM to/from a host-side 2D resource, // VirtioGpuCmdResourceAttachBacking = 0x0106, VirtioGpuCmdResourceDetachBacking = 0x0107, // // - assign/unassign a host-side 2D resource to/from a scanout ("head"). // VirtioGpuCmdSetScanout = 0x0103, // // Commands related to drawing: // // - transfer a guest RAM update to the host-side 2D resource (does not imply // host display refresh), // VirtioGpuCmdTransferToHost2d = 0x0105, // // - trigger a host display refresh from the 2D resource. // VirtioGpuCmdResourceFlush = 0x0104, // // Success code for all of the above commands. // VirtioGpuRespOkNodata = 0x1100, VirtioGpuRespOkDisplayInfo = 0x1101, } VIRTIO_GPU_CONTROL_TYPE; // // Common request/response header. // #define VIRTIO_GPU_FLAG_FENCE BIT0 #pragma pack (1) typedef struct { // // The guest sets Type to VirtioGpuCmd* in the requests. The host sets Type // to VirtioGpuResp* in the responses. // UINT32 Type; // // Fencing forces the host to complete the command before producing a // response. // UINT32 Flags; UINT64 FenceId; // // Unused. // UINT32 CtxId; UINT32 Padding; } VIRTIO_GPU_CONTROL_HEADER; #pragma pack () // // Rectangle structure used by several operations. // #pragma pack (1) typedef struct { UINT32 X; UINT32 Y; UINT32 Width; UINT32 Height; } VIRTIO_GPU_RECTANGLE; #pragma pack () // // Request structure for VirtioGpuCmdResourceCreate2d. // typedef enum { // // 32-bit depth, BGRX component order, X component ignored. // VirtioGpuFormatB8G8R8X8Unorm = 2, } VIRTIO_GPU_FORMATS; #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; UINT32 ResourceId; // note: 0 is invalid UINT32 Format; // from VIRTIO_GPU_FORMATS UINT32 Width; UINT32 Height; } VIRTIO_GPU_RESOURCE_CREATE_2D; #pragma pack () // // Request structure for VirtioGpuCmdResourceUnref. // #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; UINT32 ResourceId; UINT32 Padding; } VIRTIO_GPU_RESOURCE_UNREF; #pragma pack () // // Request structure for VirtioGpuCmdResourceAttachBacking. // // The spec allows for a scatter-gather list, but for simplicity we hard-code a // single guest buffer. // #pragma pack (1) typedef struct { UINT64 Addr; UINT32 Length; UINT32 Padding; } VIRTIO_GPU_MEM_ENTRY; typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; UINT32 ResourceId; UINT32 NrEntries; // number of entries: constant 1 VIRTIO_GPU_MEM_ENTRY Entry; } VIRTIO_GPU_RESOURCE_ATTACH_BACKING; #pragma pack () // // Request structure for VirtioGpuCmdResourceDetachBacking. // #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; UINT32 ResourceId; UINT32 Padding; } VIRTIO_GPU_RESOURCE_DETACH_BACKING; #pragma pack () // // Request structure for VirtioGpuCmdSetScanout. // #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; VIRTIO_GPU_RECTANGLE Rectangle; UINT32 ScanoutId; UINT32 ResourceId; } VIRTIO_GPU_SET_SCANOUT; #pragma pack () // // Request structure for VirtioGpuCmdTransferToHost2d. // #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; VIRTIO_GPU_RECTANGLE Rectangle; UINT64 Offset; UINT32 ResourceId; UINT32 Padding; } VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D; #pragma pack () // // Request structure for VirtioGpuCmdResourceFlush. // #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; VIRTIO_GPU_RECTANGLE Rectangle; UINT32 ResourceId; UINT32 Padding; } VIRTIO_GPU_RESOURCE_FLUSH; #pragma pack () // // Response structure for VirtioGpuCmdGetDisplayInfo // #define VIRTIO_GPU_MAX_SCANOUTS 16 #pragma pack (1) typedef struct { VIRTIO_GPU_CONTROL_HEADER Header; struct { VIRTIO_GPU_RECTANGLE Rectangle; UINT32 Enabled; UINT32 Flags; } Pmodes[VIRTIO_GPU_MAX_SCANOUTS]; } VIRTIO_GPU_RESP_DISPLAY_INFO; #pragma pack () #endif // _VIRTIO_GPU_H_