**/\r
\r
#include <IndustryStandard/Pci.h>\r
+#include <IndustryStandard/VirtioBlk.h>\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
\r
#define VIRTIO_CFG_WRITE(Dev, Field, Value) (VirtioWrite ( \\r
(Dev)->PciIo, \\r
- OFFSET_OF_VHDR (Field), \\r
- SIZE_OF_VHDR (Field), \\r
+ OFFSET_OF_VBLK (Field), \\r
+ SIZE_OF_VBLK (Field), \\r
(Value) \\r
))\r
\r
#define VIRTIO_CFG_READ(Dev, Field, Pointer) (VirtioRead ( \\r
(Dev)->PciIo, \\r
- OFFSET_OF_VHDR (Field), \\r
- SIZE_OF_VHDR (Field), \\r
+ OFFSET_OF_VBLK (Field), \\r
+ SIZE_OF_VBLK (Field), \\r
sizeof *(Pointer), \\r
(Pointer) \\r
))\r
// OK. virtio-blk's only virtqueue is #0, called "requestq" (see Appendix D).\r
//\r
MemoryFence();\r
- if (EFI_ERROR (VIRTIO_CFG_WRITE (Dev, VhdrQueueNotify, 0))) {\r
+ if (EFI_ERROR (VIRTIO_CFG_WRITE (Dev, Generic.VhdrQueueNotify, 0))) {\r
return EFI_DEVICE_ERROR;\r
}\r
\r
// Execute virtio-0.9.5, 2.2.1 Device Initialization Sequence.\r
//\r
NextDevStat = 0; // step 1 -- reset device\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrDeviceStatus, NextDevStat);\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrDeviceStatus, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
\r
NextDevStat |= VSTAT_ACK; // step 2 -- acknowledge device presence\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrDeviceStatus, NextDevStat);\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrDeviceStatus, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
\r
NextDevStat |= VSTAT_DRIVER; // step 3 -- we know how to drive it\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrDeviceStatus, NextDevStat);\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrDeviceStatus, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
//\r
// step 4a -- retrieve and validate features\r
//\r
- Status = VIRTIO_CFG_READ (Dev, VhdrDeviceFeatureBits, &Features);\r
+ Status = VIRTIO_CFG_READ (Dev, Generic.VhdrDeviceFeatureBits, &Features);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
//\r
// step 4b -- allocate virtqueue\r
//\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrQueueSelect, 0);\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrQueueSelect, 0);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
- Status = VIRTIO_CFG_READ (Dev, VhdrQueueSize, &QueueSize);\r
+ Status = VIRTIO_CFG_READ (Dev, Generic.VhdrQueueSize, &QueueSize);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
// step 4c -- Report GPFN (guest-physical frame number) of queue. If anything\r
// fails from here on, we must release the ring resources.\r
//\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrQueueAddress,\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrQueueAddress,\r
(UINTN) Dev->Ring.Base >> EFI_PAGE_SHIFT);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
// device-independent (known or unknown) VIRTIO_F_* capabilities (see\r
// Appendix B).\r
//\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrGuestFeatureBits, 0);\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrGuestFeatureBits, 0);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
// step 6 -- initialization complete\r
//\r
NextDevStat |= VSTAT_DRIVER_OK;\r
- Status = VIRTIO_CFG_WRITE (Dev, VhdrDeviceStatus, NextDevStat);\r
+ Status = VIRTIO_CFG_WRITE (Dev, Generic.VhdrDeviceStatus, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
// Status. PCI IO access failure here should not mask the original error.\r
//\r
NextDevStat |= VSTAT_FAILED;\r
- VIRTIO_CFG_WRITE (Dev, VhdrDeviceStatus, NextDevStat);\r
+ VIRTIO_CFG_WRITE (Dev, Generic.VhdrDeviceStatus, NextDevStat);\r
\r
return Status; // reached only via Failed above\r
}\r
// VIRTIO_CFG_WRITE() returns, the host will have learned to stay away from\r
// the old comms area.\r
//\r
- VIRTIO_CFG_WRITE (Dev, VhdrDeviceStatus, 0);\r
+ VIRTIO_CFG_WRITE (Dev, Generic.VhdrDeviceStatus, 0);\r
\r
VirtioRingUninit (&Dev->Ring);\r
\r