@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL\r
\r
@param[in] Ring The initialized VRING object to take the\r
- addresses from.\r
+ addresses from. The caller is responsible for\r
+ ensuring that on input, all Ring->NumPages pages,\r
+ starting at Ring->Base, have been successfully\r
+ mapped with a single call to\r
+ This->MapSharedBuffer() for CommonBuffer bus\r
+ master operation.\r
+\r
+ @param[in] RingBaseShift Adding this value using UINT64 arithmetic to the\r
+ addresses found in Ring translates them from\r
+ system memory to bus addresses. The caller shall\r
+ calculate RingBaseShift as\r
+ (DeviceAddress - (UINT64)(UINTN)HostAddress),\r
+ where DeviceAddress and HostAddress (i.e.,\r
+ Ring->Base) were output and input parameters of\r
+ This->MapSharedBuffer(), respectively.\r
\r
@retval EFI_SUCCESS The data was written successfully.\r
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the\r
EFI_STATUS\r
(EFIAPI *VIRTIO_SET_QUEUE_ADDRESS) (\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
);\r
\r
/**\r
EFI_STATUS\r
VirtioMmioSetQueueAddress (\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
);\r
\r
EFI_STATUS\r
EFI_STATUS\r
VirtioMmioSetQueueAddress (\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
)\r
{\r
VIRTIO_MMIO_DEVICE *Device;\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
EFIAPI\r
Virtio10SetQueueAddress (\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
)\r
{\r
VIRTIO_1_0_DEV *Dev;\r
UINT64 Address;\r
UINT16 Enable;\r
\r
+ ASSERT (RingBaseShift == 0);\r
+\r
Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
\r
Address = (UINTN)Ring->Desc;\r
//\r
// step 4c -- Report GPFN (guest-physical frame number) of queue.\r
//\r
- Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring);\r
+ Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring, 0);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
- Status = VgpuDev->VirtIo->SetQueueAddress (VgpuDev->VirtIo, &VgpuDev->Ring);\r
+ Status = VgpuDev->VirtIo->SetQueueAddress (\r
+ VgpuDev->VirtIo,\r
+ &VgpuDev->Ring,\r
+ 0\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
//\r
// step 4c -- report GPFN (guest-physical frame number) of queue\r
//\r
- Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, Ring);\r
+ Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, Ring, 0);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
EFIAPI\r
VirtioPciSetQueueAddress (\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioPciSetQueueAddress (\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
)\r
{\r
VIRTIO_PCI_DEVICE *Dev;\r
\r
+ ASSERT (RingBaseShift == 0);\r
+\r
Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
\r
return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_ADDRESS, sizeof (UINT32),\r
//\r
// step 4c -- Report GPFN (guest-physical frame number) of queue.\r
//\r
- Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring);\r
+ Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring, 0);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
//\r
// step 4c -- Report GPFN (guest-physical frame number) of queue.\r
//\r
- Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring);\r
+ Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring, 0);\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r