\r
#include <Library/VirtioLib.h>\r
\r
-\r
/**\r
\r
Configure a virtio ring.\r
EFI_STATUS\r
EFIAPI\r
VirtioRingInit (\r
- IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
- IN UINT16 QueueSize,\r
- OUT VRING *Ring\r
+ IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
+ IN UINT16 QueueSize,\r
+ OUT VRING *Ring\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN RingSize;\r
- volatile UINT8 *RingPagesPtr;\r
+ EFI_STATUS Status;\r
+ UINTN RingSize;\r
+ volatile UINT8 *RingPagesPtr;\r
\r
RingSize = ALIGN_VALUE (\r
sizeof *Ring->Desc * QueueSize +\r
sizeof *Ring->Avail.Idx +\r
sizeof *Ring->Avail.Ring * QueueSize +\r
sizeof *Ring->Avail.UsedEvent,\r
- EFI_PAGE_SIZE);\r
+ EFI_PAGE_SIZE\r
+ );\r
\r
RingSize += ALIGN_VALUE (\r
sizeof *Ring->Used.Flags +\r
sizeof *Ring->Used.Idx +\r
sizeof *Ring->Used.UsedElem * QueueSize +\r
sizeof *Ring->Used.AvailEvent,\r
- EFI_PAGE_SIZE);\r
+ EFI_PAGE_SIZE\r
+ );\r
\r
//\r
// Allocate a shared ring buffer\r
//\r
Ring->NumPages = EFI_SIZE_TO_PAGES (RingSize);\r
- Status = VirtIo->AllocateSharedPages (\r
- VirtIo,\r
- Ring->NumPages,\r
- &Ring->Base\r
- );\r
+ Status = VirtIo->AllocateSharedPages (\r
+ VirtIo,\r
+ Ring->NumPages,\r
+ &Ring->Base\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
SetMem (Ring->Base, RingSize, 0x00);\r
RingPagesPtr = Ring->Base;\r
\r
- Ring->Desc = (volatile VOID *) RingPagesPtr;\r
+ Ring->Desc = (volatile VOID *)RingPagesPtr;\r
RingPagesPtr += sizeof *Ring->Desc * QueueSize;\r
\r
- Ring->Avail.Flags = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Avail.Flags;\r
+ Ring->Avail.Flags = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Avail.Flags;\r
\r
- Ring->Avail.Idx = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Avail.Idx;\r
+ Ring->Avail.Idx = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Avail.Idx;\r
\r
- Ring->Avail.Ring = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Avail.Ring * QueueSize;\r
+ Ring->Avail.Ring = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Avail.Ring * QueueSize;\r
\r
- Ring->Avail.UsedEvent = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Avail.UsedEvent;\r
+ Ring->Avail.UsedEvent = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Avail.UsedEvent;\r
\r
- RingPagesPtr = (volatile UINT8 *) Ring->Base +\r
- ALIGN_VALUE (RingPagesPtr - (volatile UINT8 *) Ring->Base,\r
- EFI_PAGE_SIZE);\r
+ RingPagesPtr = (volatile UINT8 *)Ring->Base +\r
+ ALIGN_VALUE (\r
+ RingPagesPtr - (volatile UINT8 *)Ring->Base,\r
+ EFI_PAGE_SIZE\r
+ );\r
\r
- Ring->Used.Flags = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Used.Flags;\r
+ Ring->Used.Flags = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Used.Flags;\r
\r
- Ring->Used.Idx = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Used.Idx;\r
+ Ring->Used.Idx = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Used.Idx;\r
\r
- Ring->Used.UsedElem = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize;\r
+ Ring->Used.UsedElem = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize;\r
\r
- Ring->Used.AvailEvent = (volatile VOID *) RingPagesPtr;\r
- RingPagesPtr += sizeof *Ring->Used.AvailEvent;\r
+ Ring->Used.AvailEvent = (volatile VOID *)RingPagesPtr;\r
+ RingPagesPtr += sizeof *Ring->Used.AvailEvent;\r
\r
Ring->QueueSize = QueueSize;\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
\r
Tear down the internal resources of a configured virtio ring.\r
VOID\r
EFIAPI\r
VirtioRingUninit (\r
- IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
- IN OUT VRING *Ring\r
+ IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
+ IN OUT VRING *Ring\r
)\r
{\r
VirtIo->FreeSharedPages (VirtIo, Ring->NumPages, Ring->Base);\r
SetMem (Ring, sizeof *Ring, 0x00);\r
}\r
\r
-\r
/**\r
\r
Turn off interrupt notifications from the host, and prepare for appending\r
VOID\r
EFIAPI\r
VirtioPrepare (\r
- IN OUT VRING *Ring,\r
- OUT DESC_INDICES *Indices\r
+ IN OUT VRING *Ring,\r
+ OUT DESC_INDICES *Indices\r
)\r
{\r
//\r
// Prepare for virtio-0.9.5, 2.4.2 Receiving Used Buffers From the Device.\r
// We're going to poll the answer, the host should not send an interrupt.\r
//\r
- *Ring->Avail.Flags = (UINT16) VRING_AVAIL_F_NO_INTERRUPT;\r
+ *Ring->Avail.Flags = (UINT16)VRING_AVAIL_F_NO_INTERRUPT;\r
\r
//\r
// Prepare for virtio-0.9.5, 2.4.1 Supplying Buffers to the Device.\r
VOID\r
EFIAPI\r
VirtioAppendDesc (\r
- IN OUT VRING *Ring,\r
- IN UINT64 BufferDeviceAddress,\r
- IN UINT32 BufferSize,\r
- IN UINT16 Flags,\r
- IN OUT DESC_INDICES *Indices\r
+ IN OUT VRING *Ring,\r
+ IN UINT64 BufferDeviceAddress,\r
+ IN UINT32 BufferSize,\r
+ IN UINT16 Flags,\r
+ IN OUT DESC_INDICES *Indices\r
)\r
{\r
- volatile VRING_DESC *Desc;\r
+ volatile VRING_DESC *Desc;\r
\r
Desc = &Ring->Desc[Indices->NextDescIdx++ % Ring->QueueSize];\r
Desc->Addr = BufferDeviceAddress;\r
Desc->Next = Indices->NextDescIdx % Ring->QueueSize;\r
}\r
\r
-\r
/**\r
\r
Notify the host about the descriptor chain just built, and wait until the\r
EFI_STATUS\r
EFIAPI\r
VirtioFlush (\r
- IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
- IN UINT16 VirtQueueId,\r
- IN OUT VRING *Ring,\r
- IN DESC_INDICES *Indices,\r
- OUT UINT32 *UsedLen OPTIONAL\r
+ IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
+ IN UINT16 VirtQueueId,\r
+ IN OUT VRING *Ring,\r
+ IN DESC_INDICES *Indices,\r
+ OUT UINT32 *UsedLen OPTIONAL\r
)\r
{\r
- UINT16 NextAvailIdx;\r
- UINT16 LastUsedIdx;\r
- EFI_STATUS Status;\r
- UINTN PollPeriodUsecs;\r
+ UINT16 NextAvailIdx;\r
+ UINT16 LastUsedIdx;\r
+ EFI_STATUS Status;\r
+ UINTN PollPeriodUsecs;\r
\r
//\r
// virtio-0.9.5, 2.4.1.2 Updating the Available Ring\r
// (Due to our lock-step progress, this is where the host will produce the\r
// used element with the head descriptor's index in it.)\r
//\r
- LastUsedIdx = NextAvailIdx;\r
+ LastUsedIdx = NextAvailIdx;\r
Ring->Avail.Ring[NextAvailIdx++ % Ring->QueueSize] =\r
Indices->HeadDescIdx % Ring->QueueSize;\r
\r
//\r
// virtio-0.9.5, 2.4.1.3 Updating the Index Field\r
//\r
- MemoryFence();\r
+ MemoryFence ();\r
*Ring->Avail.Idx = NextAvailIdx;\r
\r
//\r
// virtio-0.9.5, 2.4.1.4 Notifying the Device -- gratuitous notifications are\r
// OK.\r
//\r
- MemoryFence();\r
+ MemoryFence ();\r
Status = VirtIo->SetQueueNotify (VirtIo, VirtQueueId);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
// Keep slowing down until we reach a poll period of slightly above 1 ms.\r
//\r
PollPeriodUsecs = 1;\r
- MemoryFence();\r
+ MemoryFence ();\r
while (*Ring->Used.Idx != NextAvailIdx) {\r
gBS->Stall (PollPeriodUsecs); // calls AcpiTimerLib::MicroSecondDelay\r
\r
if (PollPeriodUsecs < 1024) {\r
PollPeriodUsecs *= 2;\r
}\r
- MemoryFence();\r
+\r
+ MemoryFence ();\r
}\r
\r
- MemoryFence();\r
+ MemoryFence ();\r
\r
if (UsedLen != NULL) {\r
- volatile CONST VRING_USED_ELEM *UsedElem;\r
+ volatile CONST VRING_USED_ELEM *UsedElem;\r
\r
UsedElem = &Ring->Used.UsedElem[LastUsedIdx % Ring->QueueSize];\r
ASSERT (UsedElem->Id == Indices->HeadDescIdx);\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
\r
Report the feature bits to the VirtIo 1.0 device that the VirtIo 1.0 driver\r
EFI_STATUS\r
EFIAPI\r
Virtio10WriteFeatures (\r
- IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
- IN UINT64 Features,\r
- IN OUT UINT8 *DeviceStatus\r
+ IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
+ IN UINT64 Features,\r
+ IN OUT UINT8 *DeviceStatus\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
if (VirtIo->Revision < VIRTIO_SPEC_REVISION (1, 0, 0)) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
*DeviceStatus |= VSTAT_FEATURES_OK;\r
- Status = VirtIo->SetDeviceStatus (VirtIo, *DeviceStatus);\r
+ Status = VirtIo->SetDeviceStatus (VirtIo, *DeviceStatus);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
UINTN Size;\r
EFI_PHYSICAL_ADDRESS PhysicalAddress;\r
\r
- Size = NumberOfBytes;\r
+ Size = NumberOfBytes;\r
Status = VirtIo->MapSharedBuffer (\r
VirtIo,\r
Operation,\r
goto Failed;\r
}\r
\r
- *Mapping = MapInfo;\r
+ *Mapping = MapInfo;\r
*DeviceAddress = PhysicalAddress;\r
\r
return EFI_SUCCESS;\r
EFI_STATUS\r
EFIAPI\r
VirtioRingMap (\r
- IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
- IN VRING *Ring,\r
- OUT UINT64 *RingBaseShift,\r
- OUT VOID **Mapping\r
+ IN VIRTIO_DEVICE_PROTOCOL *VirtIo,\r
+ IN VRING *Ring,\r
+ OUT UINT64 *RingBaseShift,\r
+ OUT VOID **Mapping\r
)\r
{\r
EFI_STATUS Status;\r