)\r
{\r
VIRTIO_MMIO_DEVICE *Device;\r
+ UINT64 Address;\r
\r
ASSERT (RingBaseShift == 0);\r
\r
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);\r
\r
- VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN,\r
- (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));\r
+ if (Device->Version == VIRTIO_MMIO_DEVICE_VERSION_0_95) {\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN,\r
+ (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));\r
+ } else {\r
+ Address = (UINTN)Ring->Base;\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO,\r
+ (UINT32)Address);\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI,\r
+ (UINT32)RShiftU64(Address, 32));\r
+\r
+ Address = (UINTN)Ring->Avail.Flags;\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO,\r
+ (UINT32)Address);\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI,\r
+ (UINT32)RShiftU64(Address, 32));\r
+\r
+ Address = (UINTN)Ring->Used.Flags;\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO,\r
+ (UINT32)Address);\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI,\r
+ (UINT32)RShiftU64(Address, 32));\r
+\r
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1);\r
+ }\r
\r
return EFI_SUCCESS;\r
}\r