/** @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 <IndustryStandard/Virtio.h> | |
// | |
// 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_ |