X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FLibrary%2FVirtioLib%2FVirtioLib.c;h=28041dbec524f29cd4e59227414944387fe368e4;hp=e09324813c2df8ef83f9e2730d9a6bc1e733e1ed;hb=ac0a286f4d747a4c6c603a7b225917293cbe1e9f;hpb=d1050b9dff1cace252aff86630bfdb59dff5f507 diff --git a/OvmfPkg/Library/VirtioLib/VirtioLib.c b/OvmfPkg/Library/VirtioLib/VirtioLib.c index e09324813c..28041dbec5 100644 --- a/OvmfPkg/Library/VirtioLib/VirtioLib.c +++ b/OvmfPkg/Library/VirtioLib/VirtioLib.c @@ -17,7 +17,6 @@ #include - /** Configure a virtio ring. @@ -48,14 +47,14 @@ EFI_STATUS EFIAPI VirtioRingInit ( - IN VIRTIO_DEVICE_PROTOCOL *VirtIo, - IN UINT16 QueueSize, - OUT VRING *Ring + IN VIRTIO_DEVICE_PROTOCOL *VirtIo, + IN UINT16 QueueSize, + OUT VRING *Ring ) { - EFI_STATUS Status; - UINTN RingSize; - volatile UINT8 *RingPagesPtr; + EFI_STATUS Status; + UINTN RingSize; + volatile UINT8 *RingPagesPtr; RingSize = ALIGN_VALUE ( sizeof *Ring->Desc * QueueSize + @@ -63,66 +62,70 @@ VirtioRingInit ( sizeof *Ring->Avail.Idx + sizeof *Ring->Avail.Ring * QueueSize + sizeof *Ring->Avail.UsedEvent, - EFI_PAGE_SIZE); + EFI_PAGE_SIZE + ); RingSize += ALIGN_VALUE ( sizeof *Ring->Used.Flags + sizeof *Ring->Used.Idx + sizeof *Ring->Used.UsedElem * QueueSize + sizeof *Ring->Used.AvailEvent, - EFI_PAGE_SIZE); + EFI_PAGE_SIZE + ); // // Allocate a shared ring buffer // Ring->NumPages = EFI_SIZE_TO_PAGES (RingSize); - Status = VirtIo->AllocateSharedPages ( - VirtIo, - Ring->NumPages, - &Ring->Base - ); + Status = VirtIo->AllocateSharedPages ( + VirtIo, + Ring->NumPages, + &Ring->Base + ); if (EFI_ERROR (Status)) { return Status; } + SetMem (Ring->Base, RingSize, 0x00); RingPagesPtr = Ring->Base; - Ring->Desc = (volatile VOID *) RingPagesPtr; + Ring->Desc = (volatile VOID *)RingPagesPtr; RingPagesPtr += sizeof *Ring->Desc * QueueSize; - Ring->Avail.Flags = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Avail.Flags; + Ring->Avail.Flags = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Avail.Flags; - Ring->Avail.Idx = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Avail.Idx; + Ring->Avail.Idx = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Avail.Idx; - Ring->Avail.Ring = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Avail.Ring * QueueSize; + Ring->Avail.Ring = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Avail.Ring * QueueSize; - Ring->Avail.UsedEvent = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Avail.UsedEvent; + Ring->Avail.UsedEvent = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Avail.UsedEvent; - RingPagesPtr = (volatile UINT8 *) Ring->Base + - ALIGN_VALUE (RingPagesPtr - (volatile UINT8 *) Ring->Base, - EFI_PAGE_SIZE); + RingPagesPtr = (volatile UINT8 *)Ring->Base + + ALIGN_VALUE ( + RingPagesPtr - (volatile UINT8 *)Ring->Base, + EFI_PAGE_SIZE + ); - Ring->Used.Flags = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Used.Flags; + Ring->Used.Flags = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Used.Flags; - Ring->Used.Idx = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Used.Idx; + Ring->Used.Idx = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Used.Idx; - Ring->Used.UsedElem = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize; + Ring->Used.UsedElem = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize; - Ring->Used.AvailEvent = (volatile VOID *) RingPagesPtr; - RingPagesPtr += sizeof *Ring->Used.AvailEvent; + Ring->Used.AvailEvent = (volatile VOID *)RingPagesPtr; + RingPagesPtr += sizeof *Ring->Used.AvailEvent; Ring->QueueSize = QueueSize; return EFI_SUCCESS; } - /** Tear down the internal resources of a configured virtio ring. @@ -139,15 +142,14 @@ VirtioRingInit ( VOID EFIAPI VirtioRingUninit ( - IN VIRTIO_DEVICE_PROTOCOL *VirtIo, - IN OUT VRING *Ring + IN VIRTIO_DEVICE_PROTOCOL *VirtIo, + IN OUT VRING *Ring ) { VirtIo->FreeSharedPages (VirtIo, Ring->NumPages, Ring->Base); SetMem (Ring, sizeof *Ring, 0x00); } - /** Turn off interrupt notifications from the host, and prepare for appending @@ -163,15 +165,15 @@ VirtioRingUninit ( VOID EFIAPI VirtioPrepare ( - IN OUT VRING *Ring, - OUT DESC_INDICES *Indices + IN OUT VRING *Ring, + OUT DESC_INDICES *Indices ) { // // Prepare for virtio-0.9.5, 2.4.2 Receiving Used Buffers From the Device. // We're going to poll the answer, the host should not send an interrupt. // - *Ring->Avail.Flags = (UINT16) VRING_AVAIL_F_NO_INTERRUPT; + *Ring->Avail.Flags = (UINT16)VRING_AVAIL_F_NO_INTERRUPT; // // Prepare for virtio-0.9.5, 2.4.1 Supplying Buffers to the Device. @@ -224,14 +226,14 @@ VirtioPrepare ( VOID EFIAPI VirtioAppendDesc ( - IN OUT VRING *Ring, - IN UINT64 BufferDeviceAddress, - IN UINT32 BufferSize, - IN UINT16 Flags, - IN OUT DESC_INDICES *Indices + IN OUT VRING *Ring, + IN UINT64 BufferDeviceAddress, + IN UINT32 BufferSize, + IN UINT16 Flags, + IN OUT DESC_INDICES *Indices ) { - volatile VRING_DESC *Desc; + volatile VRING_DESC *Desc; Desc = &Ring->Desc[Indices->NextDescIdx++ % Ring->QueueSize]; Desc->Addr = BufferDeviceAddress; @@ -240,7 +242,6 @@ VirtioAppendDesc ( Desc->Next = Indices->NextDescIdx % Ring->QueueSize; } - /** Notify the host about the descriptor chain just built, and wait until the @@ -271,17 +272,17 @@ VirtioAppendDesc ( EFI_STATUS EFIAPI VirtioFlush ( - IN VIRTIO_DEVICE_PROTOCOL *VirtIo, - IN UINT16 VirtQueueId, - IN OUT VRING *Ring, - IN DESC_INDICES *Indices, - OUT UINT32 *UsedLen OPTIONAL + IN VIRTIO_DEVICE_PROTOCOL *VirtIo, + IN UINT16 VirtQueueId, + IN OUT VRING *Ring, + IN DESC_INDICES *Indices, + OUT UINT32 *UsedLen OPTIONAL ) { - UINT16 NextAvailIdx; - UINT16 LastUsedIdx; - EFI_STATUS Status; - UINTN PollPeriodUsecs; + UINT16 NextAvailIdx; + UINT16 LastUsedIdx; + EFI_STATUS Status; + UINTN PollPeriodUsecs; // // virtio-0.9.5, 2.4.1.2 Updating the Available Ring @@ -295,21 +296,21 @@ VirtioFlush ( // (Due to our lock-step progress, this is where the host will produce the // used element with the head descriptor's index in it.) // - LastUsedIdx = NextAvailIdx; + LastUsedIdx = NextAvailIdx; Ring->Avail.Ring[NextAvailIdx++ % Ring->QueueSize] = Indices->HeadDescIdx % Ring->QueueSize; // // virtio-0.9.5, 2.4.1.3 Updating the Index Field // - MemoryFence(); + MemoryFence (); *Ring->Avail.Idx = NextAvailIdx; // // virtio-0.9.5, 2.4.1.4 Notifying the Device -- gratuitous notifications are // OK. // - MemoryFence(); + MemoryFence (); Status = VirtIo->SetQueueNotify (VirtIo, VirtQueueId); if (EFI_ERROR (Status)) { return Status; @@ -324,20 +325,21 @@ VirtioFlush ( // Keep slowing down until we reach a poll period of slightly above 1 ms. // PollPeriodUsecs = 1; - MemoryFence(); + MemoryFence (); while (*Ring->Used.Idx != NextAvailIdx) { gBS->Stall (PollPeriodUsecs); // calls AcpiTimerLib::MicroSecondDelay if (PollPeriodUsecs < 1024) { PollPeriodUsecs *= 2; } - MemoryFence(); + + MemoryFence (); } - MemoryFence(); + MemoryFence (); if (UsedLen != NULL) { - volatile CONST VRING_USED_ELEM *UsedElem; + volatile CONST VRING_USED_ELEM *UsedElem; UsedElem = &Ring->Used.UsedElem[LastUsedIdx % Ring->QueueSize]; ASSERT (UsedElem->Id == Indices->HeadDescIdx); @@ -347,7 +349,6 @@ VirtioFlush ( return EFI_SUCCESS; } - /** Report the feature bits to the VirtIo 1.0 device that the VirtIo 1.0 driver @@ -388,12 +389,12 @@ VirtioFlush ( EFI_STATUS EFIAPI Virtio10WriteFeatures ( - IN VIRTIO_DEVICE_PROTOCOL *VirtIo, - IN UINT64 Features, - IN OUT UINT8 *DeviceStatus + IN VIRTIO_DEVICE_PROTOCOL *VirtIo, + IN UINT64 Features, + IN OUT UINT8 *DeviceStatus ) { - EFI_STATUS Status; + EFI_STATUS Status; if (VirtIo->Revision < VIRTIO_SPEC_REVISION (1, 0, 0)) { return EFI_UNSUPPORTED; @@ -405,7 +406,7 @@ Virtio10WriteFeatures ( } *DeviceStatus |= VSTAT_FEATURES_OK; - Status = VirtIo->SetDeviceStatus (VirtIo, *DeviceStatus); + Status = VirtIo->SetDeviceStatus (VirtIo, *DeviceStatus); if (EFI_ERROR (Status)) { return Status; } @@ -479,7 +480,7 @@ VirtioMapAllBytesInSharedBuffer ( UINTN Size; EFI_PHYSICAL_ADDRESS PhysicalAddress; - Size = NumberOfBytes; + Size = NumberOfBytes; Status = VirtIo->MapSharedBuffer ( VirtIo, Operation, @@ -496,7 +497,7 @@ VirtioMapAllBytesInSharedBuffer ( goto Failed; } - *Mapping = MapInfo; + *Mapping = MapInfo; *DeviceAddress = PhysicalAddress; return EFI_SUCCESS; @@ -526,10 +527,10 @@ Failed: EFI_STATUS EFIAPI VirtioRingMap ( - IN VIRTIO_DEVICE_PROTOCOL *VirtIo, - IN VRING *Ring, - OUT UINT64 *RingBaseShift, - OUT VOID **Mapping + IN VIRTIO_DEVICE_PROTOCOL *VirtIo, + IN VRING *Ring, + OUT UINT64 *RingBaseShift, + OUT VOID **Mapping ) { EFI_STATUS Status;