/** @file\r
\r
- Type and macro definitions corresponding to the virtio-0.9.5 specification.\r
+ Generic type and macro definitions corresponding to the virtio-0.9.5\r
+ specification.\r
\r
Copyright (C) 2012, Red Hat, Inc.\r
+ Portion of Copyright (C) 2013, ARM Ltd.\r
\r
This program and the accompanying materials are licensed and made available\r
under the terms and conditions of the BSD License which accompanies this\r
\r
#include <Base.h>\r
\r
+//\r
+// VirtIo Subsystem Device IDs\r
+//\r
+#define VIRTIO_SUBSYSTEM_NETWORK_CARD 1\r
+#define VIRTIO_SUBSYSTEM_BLOCK_DEVICE 2\r
+#define VIRTIO_SUBSYSTEM_CONSOLE 3\r
+#define VIRTIO_SUBSYSTEM_ENTROPY_SOURCE 4\r
+#define VIRTIO_SUBSYSTEM_MEMORY_BALLOONING 5\r
+#define VIRTIO_SUBSYSTEM_IO_MEMORY 6\r
+#define VIRTIO_SUBSYSTEM_RPMSG 7\r
+#define VIRTIO_SUBSYSTEM_SCSI_HOST 8\r
+#define VIRTIO_SUBSYSTEM_9P_TRANSPORT 9\r
+#define VIRTIO_SUBSYSTEM_MAC80211_WLAN 10\r
+\r
+//\r
+// Virtio IDs\r
+//\r
+#define VIRTIO_VENDOR_ID 0x1AF4\r
+#define VIRTIO_MMIO_MAGIC 0x74726976 // "virt"\r
+\r
+\r
+//\r
+// VirtIo Device Specific Configuration Offsets\r
+//\r
+#define VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_PCI 20\r
+#define VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_PCI_WITH_MSI_X 24\r
+#define VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_MMIO 0x100\r
+\r
+//\r
+// PCI VirtIo Header Offsets\r
+//\r
+#define VIRTIO_PCI_OFFSET_DEVICE_FEATURES 0x00\r
+#define VIRTIO_PCI_OFFSET_GUEST_FEATURES 0x04\r
+#define VIRTIO_PCI_OFFSET_QUEUE_ADDRESS 0x08\r
+#define VIRTIO_PCI_OFFSET_QUEUE_SIZE 0x0C\r
+#define VIRTIO_PCI_OFFSET_QUEUE_SELECT 0x0E\r
+#define VIRTIO_PCI_OFFSET_QUEUE_NOTIFY 0x10\r
+#define VIRTIO_PCI_OFFSET_QUEUE_DEVICE_STATUS 0x12\r
+#define VIRTIO_PCI_OFFSET_QUEUE_DEVICE_ISR 0x13\r
+\r
+//\r
+// MMIO VirtIo Header Offsets\r
+//\r
+#define VIRTIO_MMIO_OFFSET_MAGIC 0x00\r
+#define VIRTIO_MMIO_OFFSET_VERSION 0x04\r
+#define VIRTIO_MMIO_OFFSET_DEVICE_ID 0x08\r
+#define VIRTIO_MMIO_OFFSET_VENDOR_ID 0x0C\r
+#define VIRTIO_MMIO_OFFSET_HOST_FEATURES 0x10\r
+#define VIRTIO_MMIO_OFFSET_HOST_FEATURES_SEL 0x14\r
+#define VIRTIO_MMIO_OFFSET_GUEST_FEATURES 0x20\r
+#define VIRTIO_MMIO_OFFSET_GUEST_FEATURES_SEL 0x24\r
+#define VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE 0x28\r
+#define VIRTIO_MMIO_OFFSET_QUEUE_SEL 0x30\r
+#define VIRTIO_MMIO_OFFSET_QUEUE_NUM_MAX 0x34\r
+#define VIRTIO_MMIO_OFFSET_QUEUE_NUM 0x38\r
+#define VIRTIO_MMIO_OFFSET_QUEUE_ALIGN 0x3C\r
+#define VIRTIO_MMIO_OFFSET_QUEUE_PFN 0x40\r
+#define VIRTIO_MMIO_OFFSET_QUEUE_NOTIFY 0x50\r
+#define VIRTIO_MMIO_OFFSET_INTERRUPT_STATUS 0x60\r
+#define VIRTIO_MMIO_OFFSET_INTERRUPT_ACK 0x64\r
+#define VIRTIO_MMIO_OFFSET_STATUS 0x70\r
\r
//\r
// Data in the communication area is defined as packed and accessed as\r
UINT8 VhdrDeviceStatus;\r
UINT8 VhdrISR;\r
} VIRTIO_HDR;\r
-\r
-//\r
-// virtio-0.9.5, Appendix D: Block Device\r
-//\r
-typedef struct {\r
- VIRTIO_HDR Generic;\r
- UINT64 VhdrCapacity;\r
- UINT32 VhdrSizeMax;\r
- UINT32 VhdrSegMax;\r
- UINT16 VhdrCylinders;\r
- UINT8 VhdrHeads;\r
- UINT8 VhdrSectors;\r
- UINT32 VhdrBlkSize;\r
-} VBLK_HDR;\r
#pragma pack()\r
\r
-#define OFFSET_OF_VHDR(Field) OFFSET_OF (VBLK_HDR, Field)\r
-#define SIZE_OF_VHDR(Field) (sizeof ((VBLK_HDR *) 0)->Field)\r
-\r
\r
//\r
// virtio-0.9.5, 2.2.2.1 Device Status\r
#define VIRTIO_F_RING_INDIRECT_DESC BIT28\r
#define VIRTIO_F_RING_EVENT_IDX BIT29\r
\r
-//\r
-// virtio-0.9.5, Appendix D: Block Device\r
-//\r
-#define VIRTIO_BLK_F_BARRIER BIT0\r
-#define VIRTIO_BLK_F_SIZE_MAX BIT1\r
-#define VIRTIO_BLK_F_SEG_MAX BIT2\r
-#define VIRTIO_BLK_F_GEOMETRY BIT4\r
-#define VIRTIO_BLK_F_RO BIT5\r
-#define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in\r
- // practice; actual host side implementation\r
- // negotiates "optimal" block size\r
- // separately\r
-#define VIRTIO_BLK_F_SCSI BIT7\r
-#define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled"\r
-\r
-\r
-//\r
-// We keep the status byte separate from the rest of the virtio-blk request\r
-// header. See description of historical scattering at the end of Appendix D:\r
-// we're going to put the status byte in a separate VRING_DESC.\r
-//\r
-#pragma pack(1)\r
-typedef struct {\r
- UINT32 Type;\r
- UINT32 IoPrio;\r
- UINT64 Sector;\r
-} VIRTIO_BLK_REQ;\r
-#pragma pack()\r
-\r
-#define VIRTIO_BLK_T_IN 0x00000000\r
-#define VIRTIO_BLK_T_OUT 0x00000001\r
-#define VIRTIO_BLK_T_SCSI_CMD 0x00000002\r
-#define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003\r
-#define VIRTIO_BLK_T_FLUSH 0x00000004\r
-#define VIRTIO_BLK_T_FLUSH_OUT 0x00000005\r
-#define VIRTIO_BLK_T_BARRIER BIT31\r
-\r
-#define VIRTIO_BLK_S_OK 0x00\r
-#define VIRTIO_BLK_S_IOERR 0x01\r
-#define VIRTIO_BLK_S_UNSUPP 0x02\r
\r
#endif // _VIRTIO_H_\r