1 /** @file
2   Definitions from the VirtIo 1.0 specification (csprd05).
3 
4   Copyright (C) 2016, Red Hat, Inc.
5 
6   This program and the accompanying materials are licensed and made available
7   under the terms and conditions of the BSD License which accompanies this
8   distribution. The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
12   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 **/
14 
15 #ifndef _VIRTIO_1_0_H_
16 #define _VIRTIO_1_0_H_
17 
18 #include <IndustryStandard/Virtio095.h>
19 
20 //
21 // Subsystem Device IDs (to be) introduced in VirtIo 1.0
22 //
23 #define VIRTIO_SUBSYSTEM_GPU_DEVICE         16
24 
25 //
26 // Structures for parsing the VirtIo 1.0 specific PCI capabilities from the
27 // config space
28 //
29 #pragma pack (1)
30 typedef struct {
31   UINT8 CapId;   // Capability identifier (generic)
32   UINT8 CapNext; // Link to next capability (generic)
33 } VIRTIO_PCI_CAP_LINK;
34 
35 typedef struct {
36   UINT8  ConfigType; // Identifies the specific VirtIo 1.0 config structure
37   UINT8  Bar;        // The BAR that contains the structure
38   UINT8  Padding[3];
39   UINT32 Offset;     // Offset within Bar until the start of the structure
40   UINT32 Length;     // Length of the structure
41 } VIRTIO_PCI_CAP;
42 #pragma pack ()
43 
44 //
45 // Values for the VIRTIO_PCI_CAP.ConfigType field
46 //
47 #define VIRTIO_PCI_CAP_COMMON_CFG 1 // Common configuration
48 #define VIRTIO_PCI_CAP_NOTIFY_CFG 2 // Notifications
49 #define VIRTIO_PCI_CAP_DEVICE_CFG 4 // Device specific configuration
50 
51 //
52 // Structure pointed-to by Bar and Offset in VIRTIO_PCI_CAP when ConfigType is
53 // VIRTIO_PCI_CAP_COMMON_CFG
54 //
55 #pragma pack (1)
56 typedef struct {
57   UINT32 DeviceFeatureSelect;
58   UINT32 DeviceFeature;
59   UINT32 DriverFeatureSelect;
60   UINT32 DriverFeature;
61   UINT16 MsixConfig;
62   UINT16 NumQueues;
63   UINT8  DeviceStatus;
64   UINT8  ConfigGeneration;
65   UINT16 QueueSelect;
66   UINT16 QueueSize;
67   UINT16 QueueMsixVector;
68   UINT16 QueueEnable;
69   UINT16 QueueNotifyOff;
70   UINT64 QueueDesc;
71   UINT64 QueueAvail;
72   UINT64 QueueUsed;
73 } VIRTIO_PCI_COMMON_CFG;
74 #pragma pack ()
75 
76 //
77 // VirtIo 1.0 device status bits
78 //
79 #define VSTAT_FEATURES_OK BIT3
80 
81 //
82 // VirtIo 1.0 reserved (device-independent) feature bits
83 //
84 #define VIRTIO_F_VERSION_1 BIT32
85 
86 #endif // _VIRTIO_1_0_H_
87