From: jljusten Date: Fri, 12 Oct 2012 18:52:24 +0000 (+0000) Subject: OvmfPkg: move VirtioBlkDxe/Virtio.h to Include/IndustryStandard/Virtio.h X-Git-Tag: edk2-stable201903~12973 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=045b46e92d2ff47a1fa1d7aece0155b87b412e3d OvmfPkg: move VirtioBlkDxe/Virtio.h to Include/IndustryStandard/Virtio.h This commit consists of: - a verbatim move ("similarity index 100%" in git parlance), - an updated #include directive in VirtioBlkDxe/VirtioBlk.h, - and an OvmfPkg.dec package entry in VirtioBlkDxe/VirtioBlk.inf, so that the new include directory is searched. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13836 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/OvmfPkg/Include/IndustryStandard/Virtio.h b/OvmfPkg/Include/IndustryStandard/Virtio.h new file mode 100644 index 0000000000..5e2e8f4c6f --- /dev/null +++ b/OvmfPkg/Include/IndustryStandard/Virtio.h @@ -0,0 +1,176 @@ +/** @file + + Type and macro definitions corresponding to the virtio-0.9.5 specification. + + Copyright (C) 2012, 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. + +**/ + +#include + + +// +// Data in the communication area is defined as packed and accessed as +// volatile. +// +// Some structures contain arrays with dynamically determined size. In such +// cases the array and its sibling fields are replaced with pointers. +// +// All indices (variables and fields named *Idx) are free-running and wrap +// around after 0xFFFF. The queue size reported by the host is always an +// integral power of 2, not greater than 32768. Actual array indices are +// consistently calculated by taking the remainder of a given Idx object modulo +// QueueSize. Since 0x10000 is an integral multiple of the QueueSize, UINT16 +// wraparound is a correct wraparound modulo QueueSize too (it doesn't offset +// the remainder class). +// +// virtio-0.9.5, 2.3.4 Available Ring +// +#define VRING_AVAIL_F_NO_INTERRUPT BIT0 + +typedef struct { + volatile UINT16 *Flags; + volatile UINT16 *Idx; + + volatile UINT16 *Ring; // QueueSize elements + volatile UINT16 *UsedEvent; // unused as per negotiation +} VRING_AVAIL; + + +// +// virtio-0.9.5, 2.3.5 Used Ring +// +#define VRING_USED_F_NO_NOTIFY BIT0 + +#pragma pack(1) +typedef struct { + UINT32 Id; + UINT32 Len; +} VRING_USED_ELEM; +#pragma pack() + +typedef struct { + volatile UINT16 *Flags; + volatile UINT16 *Idx; + volatile VRING_USED_ELEM *UsedElem; // QueueSize elements + volatile UINT16 *AvailEvent; // unused as per negotiation +} VRING_USED; + + +// +// virtio-0.9.5, 2.3.2 Descriptor Table +// +#define VRING_DESC_F_NEXT BIT0 // more descriptors in this request +#define VRING_DESC_F_WRITE BIT1 // buffer to be written *by the host* +#define VRING_DESC_F_INDIRECT BIT2 // unused + +#pragma pack(1) +typedef struct { + UINT64 Addr; + UINT32 Len; + UINT16 Flags; + UINT16 Next; +} VRING_DESC; +#pragma pack() + +typedef struct { + UINTN NumPages; + VOID *Base; // deallocate only this field + volatile VRING_DESC *Desc; // QueueSize elements + VRING_AVAIL Avail; + VRING_USED Used; + UINT16 QueueSize; +} VRING; + + +// +// virtio-0.9.5, 2.2.2 Virtio Header -- no MSI-X +// virtio-0.9.5, Appendix D +// +#pragma pack(1) +typedef struct { + UINT32 VhdrDeviceFeatureBits; + UINT32 VhdrGuestFeatureBits; + UINT32 VhdrQueueAddress; + UINT16 VhdrQueueSize; + UINT16 VhdrQueueSelect; + UINT16 VhdrQueueNotify; + UINT8 VhdrDeviceStatus; + UINT8 VhdrISR; + UINT64 VhdrCapacity; + UINT32 VhdrSizeMax; + UINT32 VhdrSegMax; + UINT16 VhdrCylinders; + UINT8 VhdrHeads; + UINT8 VhdrSectors; + UINT32 VhdrBlkSize; +} VBLK_HDR; +#pragma pack() + +#define OFFSET_OF_VHDR(Field) ((UINTN)(UINT8 *)&((VBLK_HDR *) 0)->Field) +#define SIZE_OF_VHDR(Field) (sizeof ((VBLK_HDR *) 0)->Field) + + +// +// virtio-0.9.5, 2.2.2.1 Device Status +// +#define VSTAT_ACK BIT0 +#define VSTAT_DRIVER BIT1 +#define VSTAT_DRIVER_OK BIT2 +#define VSTAT_FAILED BIT7 + +// +// virtio-0.9.5, Appendix B: Reserved (Device-Independent) Feature Bits +// +#define VIRTIO_F_NOTIFY_ON_EMPTY BIT24 +#define VIRTIO_F_RING_INDIRECT_DESC BIT28 +#define VIRTIO_F_RING_EVENT_IDX BIT29 + +// +// virtio-0.9.5, Appendix D: Block Device +// +#define VIRTIO_BLK_F_BARRIER BIT0 +#define VIRTIO_BLK_F_SIZE_MAX BIT1 +#define VIRTIO_BLK_F_SEG_MAX BIT2 +#define VIRTIO_BLK_F_GEOMETRY BIT4 +#define VIRTIO_BLK_F_RO BIT5 +#define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in + // practice; actual host side implementation + // negotiates "optimal" block size + // separately +#define VIRTIO_BLK_F_SCSI BIT7 +#define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled" + + +// +// We keep the status byte separate from the rest of the virtio-blk request +// header. See description of historical scattering at the end of Appendix D: +// we're going to put the status byte in a separate VRING_DESC. +// +#pragma pack(1) +typedef struct { + UINT32 Type; + UINT32 IoPrio; + UINT64 Sector; +} VIRTIO_BLK_REQ; +#pragma pack() + +#define VIRTIO_BLK_T_IN 0x00000000 +#define VIRTIO_BLK_T_OUT 0x00000001 +#define VIRTIO_BLK_T_SCSI_CMD 0x00000002 +#define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003 +#define VIRTIO_BLK_T_FLUSH 0x00000004 +#define VIRTIO_BLK_T_FLUSH_OUT 0x00000005 +#define VIRTIO_BLK_T_BARRIER BIT31 + +#define VIRTIO_BLK_S_OK 0x00 +#define VIRTIO_BLK_S_IOERR 0x01 +#define VIRTIO_BLK_S_UNSUPP 0x02 diff --git a/OvmfPkg/VirtioBlkDxe/Virtio.h b/OvmfPkg/VirtioBlkDxe/Virtio.h deleted file mode 100644 index 5e2e8f4c6f..0000000000 --- a/OvmfPkg/VirtioBlkDxe/Virtio.h +++ /dev/null @@ -1,176 +0,0 @@ -/** @file - - Type and macro definitions corresponding to the virtio-0.9.5 specification. - - Copyright (C) 2012, 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. - -**/ - -#include - - -// -// Data in the communication area is defined as packed and accessed as -// volatile. -// -// Some structures contain arrays with dynamically determined size. In such -// cases the array and its sibling fields are replaced with pointers. -// -// All indices (variables and fields named *Idx) are free-running and wrap -// around after 0xFFFF. The queue size reported by the host is always an -// integral power of 2, not greater than 32768. Actual array indices are -// consistently calculated by taking the remainder of a given Idx object modulo -// QueueSize. Since 0x10000 is an integral multiple of the QueueSize, UINT16 -// wraparound is a correct wraparound modulo QueueSize too (it doesn't offset -// the remainder class). -// -// virtio-0.9.5, 2.3.4 Available Ring -// -#define VRING_AVAIL_F_NO_INTERRUPT BIT0 - -typedef struct { - volatile UINT16 *Flags; - volatile UINT16 *Idx; - - volatile UINT16 *Ring; // QueueSize elements - volatile UINT16 *UsedEvent; // unused as per negotiation -} VRING_AVAIL; - - -// -// virtio-0.9.5, 2.3.5 Used Ring -// -#define VRING_USED_F_NO_NOTIFY BIT0 - -#pragma pack(1) -typedef struct { - UINT32 Id; - UINT32 Len; -} VRING_USED_ELEM; -#pragma pack() - -typedef struct { - volatile UINT16 *Flags; - volatile UINT16 *Idx; - volatile VRING_USED_ELEM *UsedElem; // QueueSize elements - volatile UINT16 *AvailEvent; // unused as per negotiation -} VRING_USED; - - -// -// virtio-0.9.5, 2.3.2 Descriptor Table -// -#define VRING_DESC_F_NEXT BIT0 // more descriptors in this request -#define VRING_DESC_F_WRITE BIT1 // buffer to be written *by the host* -#define VRING_DESC_F_INDIRECT BIT2 // unused - -#pragma pack(1) -typedef struct { - UINT64 Addr; - UINT32 Len; - UINT16 Flags; - UINT16 Next; -} VRING_DESC; -#pragma pack() - -typedef struct { - UINTN NumPages; - VOID *Base; // deallocate only this field - volatile VRING_DESC *Desc; // QueueSize elements - VRING_AVAIL Avail; - VRING_USED Used; - UINT16 QueueSize; -} VRING; - - -// -// virtio-0.9.5, 2.2.2 Virtio Header -- no MSI-X -// virtio-0.9.5, Appendix D -// -#pragma pack(1) -typedef struct { - UINT32 VhdrDeviceFeatureBits; - UINT32 VhdrGuestFeatureBits; - UINT32 VhdrQueueAddress; - UINT16 VhdrQueueSize; - UINT16 VhdrQueueSelect; - UINT16 VhdrQueueNotify; - UINT8 VhdrDeviceStatus; - UINT8 VhdrISR; - UINT64 VhdrCapacity; - UINT32 VhdrSizeMax; - UINT32 VhdrSegMax; - UINT16 VhdrCylinders; - UINT8 VhdrHeads; - UINT8 VhdrSectors; - UINT32 VhdrBlkSize; -} VBLK_HDR; -#pragma pack() - -#define OFFSET_OF_VHDR(Field) ((UINTN)(UINT8 *)&((VBLK_HDR *) 0)->Field) -#define SIZE_OF_VHDR(Field) (sizeof ((VBLK_HDR *) 0)->Field) - - -// -// virtio-0.9.5, 2.2.2.1 Device Status -// -#define VSTAT_ACK BIT0 -#define VSTAT_DRIVER BIT1 -#define VSTAT_DRIVER_OK BIT2 -#define VSTAT_FAILED BIT7 - -// -// virtio-0.9.5, Appendix B: Reserved (Device-Independent) Feature Bits -// -#define VIRTIO_F_NOTIFY_ON_EMPTY BIT24 -#define VIRTIO_F_RING_INDIRECT_DESC BIT28 -#define VIRTIO_F_RING_EVENT_IDX BIT29 - -// -// virtio-0.9.5, Appendix D: Block Device -// -#define VIRTIO_BLK_F_BARRIER BIT0 -#define VIRTIO_BLK_F_SIZE_MAX BIT1 -#define VIRTIO_BLK_F_SEG_MAX BIT2 -#define VIRTIO_BLK_F_GEOMETRY BIT4 -#define VIRTIO_BLK_F_RO BIT5 -#define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in - // practice; actual host side implementation - // negotiates "optimal" block size - // separately -#define VIRTIO_BLK_F_SCSI BIT7 -#define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled" - - -// -// We keep the status byte separate from the rest of the virtio-blk request -// header. See description of historical scattering at the end of Appendix D: -// we're going to put the status byte in a separate VRING_DESC. -// -#pragma pack(1) -typedef struct { - UINT32 Type; - UINT32 IoPrio; - UINT64 Sector; -} VIRTIO_BLK_REQ; -#pragma pack() - -#define VIRTIO_BLK_T_IN 0x00000000 -#define VIRTIO_BLK_T_OUT 0x00000001 -#define VIRTIO_BLK_T_SCSI_CMD 0x00000002 -#define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003 -#define VIRTIO_BLK_T_FLUSH 0x00000004 -#define VIRTIO_BLK_T_FLUSH_OUT 0x00000005 -#define VIRTIO_BLK_T_BARRIER BIT31 - -#define VIRTIO_BLK_S_OK 0x00 -#define VIRTIO_BLK_S_IOERR 0x01 -#define VIRTIO_BLK_S_UNSUPP 0x02 diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.h b/OvmfPkg/VirtioBlkDxe/VirtioBlk.h index c769991839..d22570def9 100644 --- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.h +++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.h @@ -23,7 +23,7 @@ #include #include -#include "Virtio.h" +#include #define VBLK_SIG SIGNATURE_32 ('V', 'B', 'L', 'K') diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.inf b/OvmfPkg/VirtioBlkDxe/VirtioBlk.inf index 26ad8f8aa7..730903d55e 100644 --- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.inf +++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.inf @@ -26,6 +26,7 @@ [Packages] MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec [LibraryClasses] BaseMemoryLib