OvmfPkg/IndustryStandard: add type definitions for the virtio GPU device

The GPU additions to VirtIo 1.0 are a work in progress. Mark the relevant
URLs in the source code. Incorporate the absolute minimum from the WIP
spec that is necessary for implementing a GOP driver.

Add the VIRTIO_SUBSYSTEM_GPU_DEVICE macro to
"IndustryStandard/Virtio10.h", since all other such macros (dating back to
VirtIo 0.9.5) are part of "IndustryStandard/Virtio095.h".

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Ref: https://tianocore.acgmultimedia.com/show_bug.cgi?id=66
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Laszlo Ersek 2016-08-15 16:26:29 +02:00
parent 4fdb585c69
commit 92dc5e9d74
2 changed files with 221 additions and 0 deletions

View File

@ -17,6 +17,11 @@
#include <IndustryStandard/Virtio095.h>
//
// Subsystem Device IDs (to be) introduced in VirtIo 1.0
//
#define VIRTIO_SUBSYSTEM_GPU_DEVICE 16
//
// Structures for parsing the VirtIo 1.0 specific PCI capabilities from the
// config space

View File

@ -0,0 +1,216 @@
/** @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.
This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License which accompanies this
distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#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,
//
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,
} 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 ()
#endif // _VIRTIO_GPU_H_