\r
Copyright (C) 2016, Linaro Ltd.\r
\r
- This program and the accompanying materials are licensed and made available\r
- under the terms and conditions of the BSD License which accompanies this\r
- distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
- WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioRngGetInfo (\r
- IN EFI_RNG_PROTOCOL *This,\r
- IN OUT UINTN *RNGAlgorithmListSize,\r
- OUT EFI_RNG_ALGORITHM *RNGAlgorithmList\r
+ IN EFI_RNG_PROTOCOL *This,\r
+ IN OUT UINTN *RNGAlgorithmListSize,\r
+ OUT EFI_RNG_ALGORITHM *RNGAlgorithmList\r
)\r
{\r
- if (This == NULL || RNGAlgorithmListSize == NULL) {\r
+ if ((This == NULL) || (RNGAlgorithmListSize == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioRngGetRNG (\r
- IN EFI_RNG_PROTOCOL *This,\r
- IN EFI_RNG_ALGORITHM *RNGAlgorithm, OPTIONAL\r
- IN UINTN RNGValueLength,\r
- OUT UINT8 *RNGValue\r
+ IN EFI_RNG_PROTOCOL *This,\r
+ IN EFI_RNG_ALGORITHM *RNGAlgorithm OPTIONAL,\r
+ IN UINTN RNGValueLength,\r
+ OUT UINT8 *RNGValue\r
)\r
{\r
- VIRTIO_RNG_DEV *Dev;\r
- DESC_INDICES Indices;\r
- volatile UINT8 *Buffer;\r
- UINTN Index;\r
- UINT32 Len;\r
- UINT32 BufferSize;\r
- EFI_STATUS Status;\r
- EFI_PHYSICAL_ADDRESS DeviceAddress;\r
- VOID *Mapping;\r
-\r
- if (This == NULL || RNGValueLength == 0 || RNGValue == NULL) {\r
+ VIRTIO_RNG_DEV *Dev;\r
+ DESC_INDICES Indices;\r
+ volatile UINT8 *Buffer;\r
+ UINTN Index;\r
+ UINT32 Len;\r
+ UINT32 BufferSize;\r
+ EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS DeviceAddress;\r
+ VOID *Mapping;\r
+\r
+ if ((This == NULL) || (RNGValueLength == 0) || (RNGValue == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// We only support the raw algorithm, so reject requests for anything else\r
//\r
- if (RNGAlgorithm != NULL &&\r
- !CompareGuid (RNGAlgorithm, &gEfiRngAlgorithmRaw)) {\r
+ if ((RNGAlgorithm != NULL) &&\r
+ !CompareGuid (RNGAlgorithm, &gEfiRngAlgorithmRaw))\r
+ {\r
return EFI_UNSUPPORTED;\r
}\r
\r
\r
Dev = VIRTIO_ENTROPY_SOURCE_FROM_RNG (This);\r
//\r
- // Map Buffer's system phyiscal address to device address\r
+ // Map Buffer's system physical address to device address\r
//\r
Status = VirtioMapAllBytesInSharedBuffer (\r
Dev->VirtIo,\r
BufferSize = (UINT32)MIN (RNGValueLength - Index, (UINTN)MAX_UINT32);\r
\r
VirtioPrepare (&Dev->Ring, &Indices);\r
- VirtioAppendDesc (&Dev->Ring,\r
+ VirtioAppendDesc (\r
+ &Dev->Ring,\r
DeviceAddress + Index,\r
BufferSize,\r
VRING_DESC_F_WRITE,\r
- &Indices);\r
+ &Indices\r
+ );\r
\r
if (VirtioFlush (Dev->VirtIo, 0, &Dev->Ring, &Indices, &Len) !=\r
- EFI_SUCCESS) {\r
+ EFI_SUCCESS)\r
+ {\r
Status = EFI_DEVICE_ERROR;\r
goto UnmapBuffer;\r
}\r
+\r
ASSERT (Len > 0);\r
ASSERT (Len <= BufferSize);\r
}\r
for (Index = 0; Index < RNGValueLength; Index++) {\r
RNGValue[Index] = Buffer[Index];\r
}\r
+\r
Status = EFI_SUCCESS;\r
\r
UnmapBuffer:\r
EFI_STATUS\r
EFIAPI\r
VirtioRngInit (\r
- IN OUT VIRTIO_RNG_DEV *Dev\r
+ IN OUT VIRTIO_RNG_DEV *Dev\r
)\r
{\r
- UINT8 NextDevStat;\r
- EFI_STATUS Status;\r
- UINT16 QueueSize;\r
- UINT64 Features;\r
- UINT64 RingBaseShift;\r
+ UINT8 NextDevStat;\r
+ EFI_STATUS Status;\r
+ UINT16 QueueSize;\r
+ UINT64 Features;\r
+ UINT64 RingBaseShift;\r
\r
//\r
// Execute virtio-0.9.5, 2.2.1 Device Initialization Sequence.\r
//\r
NextDevStat = 0; // step 1 -- reset device\r
- Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
+ Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
\r
NextDevStat |= VSTAT_ACK; // step 2 -- acknowledge device presence\r
- Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
+ Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 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 = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
+ Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
+\r
Status = Dev->VirtIo->GetQueueNumMax (Dev->VirtIo, &QueueSize);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
//\r
if (Dev->VirtIo->Revision < VIRTIO_SPEC_REVISION (1, 0, 0)) {\r
Features &= ~(UINT64)(VIRTIO_F_VERSION_1 | VIRTIO_F_IOMMU_PLATFORM);\r
- Status = Dev->VirtIo->SetGuestFeatures (Dev->VirtIo, Features);\r
+ Status = Dev->VirtIo->SetGuestFeatures (Dev->VirtIo, Features);\r
if (EFI_ERROR (Status)) {\r
goto UnmapQueue;\r
}\r
// step 6 -- initialization complete\r
//\r
NextDevStat |= VSTAT_DRIVER_OK;\r
- Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
+ Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto UnmapQueue;\r
}\r
//\r
// populate the exported interface's attributes\r
//\r
- Dev->Rng.GetInfo = VirtioRngGetInfo;\r
- Dev->Rng.GetRNG = VirtioRngGetRNG;\r
+ Dev->Rng.GetInfo = VirtioRngGetInfo;\r
+ Dev->Rng.GetRNG = VirtioRngGetRNG;\r
\r
return EFI_SUCCESS;\r
\r
return Status; // reached only via Failed above\r
}\r
\r
-\r
STATIC\r
VOID\r
EFIAPI\r
VirtioRngUninit (\r
- IN OUT VIRTIO_RNG_DEV *Dev\r
+ IN OUT VIRTIO_RNG_DEV *Dev\r
)\r
{\r
//\r
VOID\r
EFIAPI\r
VirtioRngExitBoot (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- VIRTIO_RNG_DEV *Dev;\r
+ VIRTIO_RNG_DEV *Dev;\r
\r
+ DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context));\r
//\r
// Reset the device. This causes the hypervisor to forget about the virtio\r
// ring.\r
//\r
Dev = Context;\r
Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0);\r
-\r
- //\r
- // Unmap the ring buffer so that hypervisor will not be able to get readable\r
- // data after device reset.\r
- //\r
- Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, Dev->RingMap);\r
}\r
\r
-\r
//\r
// Probe, start and stop functions of this driver, called by the DXE core for\r
// specific devices.\r
EFI_STATUS\r
EFIAPI\r
VirtioRngDriverBindingSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE DeviceHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE DeviceHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- VIRTIO_DEVICE_PROTOCOL *VirtIo;\r
+ EFI_STATUS Status;\r
+ VIRTIO_DEVICE_PROTOCOL *VirtIo;\r
\r
//\r
// Attempt to open the device with the VirtIo set of interfaces. On success,\r
// We needed VirtIo access only transitorily, to see whether we support the\r
// device or not.\r
//\r
- gBS->CloseProtocol (DeviceHandle, &gVirtioDeviceProtocolGuid,\r
- This->DriverBindingHandle, DeviceHandle);\r
+ gBS->CloseProtocol (\r
+ DeviceHandle,\r
+ &gVirtioDeviceProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ DeviceHandle\r
+ );\r
return Status;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioRngDriverBindingStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE DeviceHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE DeviceHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
VIRTIO_RNG_DEV *Dev;\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
- Dev = (VIRTIO_RNG_DEV *) AllocateZeroPool (sizeof *Dev);\r
+ Dev = (VIRTIO_RNG_DEV *)AllocateZeroPool (sizeof *Dev);\r
if (Dev == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- Status = gBS->OpenProtocol (DeviceHandle, &gVirtioDeviceProtocolGuid,\r
- (VOID **)&Dev->VirtIo, This->DriverBindingHandle,\r
- DeviceHandle, EFI_OPEN_PROTOCOL_BY_DRIVER);\r
+ Status = gBS->OpenProtocol (\r
+ DeviceHandle,\r
+ &gVirtioDeviceProtocolGuid,\r
+ (VOID **)&Dev->VirtIo,\r
+ This->DriverBindingHandle,\r
+ DeviceHandle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto FreeVirtioRng;\r
}\r
goto CloseVirtIo;\r
}\r
\r
- Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_CALLBACK,\r
- &VirtioRngExitBoot, Dev, &Dev->ExitBoot);\r
+ Status = gBS->CreateEvent (\r
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ TPL_CALLBACK,\r
+ &VirtioRngExitBoot,\r
+ Dev,\r
+ &Dev->ExitBoot\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto UninitDev;\r
}\r
// interface.\r
//\r
Dev->Signature = VIRTIO_RNG_SIG;\r
- Status = gBS->InstallProtocolInterface (&DeviceHandle,\r
- &gEfiRngProtocolGuid, EFI_NATIVE_INTERFACE,\r
- &Dev->Rng);\r
+ Status = gBS->InstallProtocolInterface (\r
+ &DeviceHandle,\r
+ &gEfiRngProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ &Dev->Rng\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto CloseExitBoot;\r
}\r
VirtioRngUninit (Dev);\r
\r
CloseVirtIo:\r
- gBS->CloseProtocol (DeviceHandle, &gVirtioDeviceProtocolGuid,\r
- This->DriverBindingHandle, DeviceHandle);\r
+ gBS->CloseProtocol (\r
+ DeviceHandle,\r
+ &gVirtioDeviceProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ DeviceHandle\r
+ );\r
\r
FreeVirtioRng:\r
FreePool (Dev);\r
return Status;\r
}\r
\r
-\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
VirtioRngDriverBindingStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE DeviceHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE DeviceHandle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_RNG_PROTOCOL *Rng;\r
- VIRTIO_RNG_DEV *Dev;\r
+ EFI_STATUS Status;\r
+ EFI_RNG_PROTOCOL *Rng;\r
+ VIRTIO_RNG_DEV *Dev;\r
\r
Status = gBS->OpenProtocol (\r
DeviceHandle, // candidate device\r
//\r
// Handle Stop() requests for in-use driver instances gracefully.\r
//\r
- Status = gBS->UninstallProtocolInterface (DeviceHandle,\r
- &gEfiRngProtocolGuid, &Dev->Rng);\r
+ Status = gBS->UninstallProtocolInterface (\r
+ DeviceHandle,\r
+ &gEfiRngProtocolGuid,\r
+ &Dev->Rng\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
VirtioRngUninit (Dev);\r
\r
- gBS->CloseProtocol (DeviceHandle, &gVirtioDeviceProtocolGuid,\r
- This->DriverBindingHandle, DeviceHandle);\r
+ gBS->CloseProtocol (\r
+ DeviceHandle,\r
+ &gVirtioDeviceProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ DeviceHandle\r
+ );\r
\r
FreePool (Dev);\r
\r
return EFI_SUCCESS;\r
}\r
\r
-\r
//\r
// The static object that groups the Supported() (ie. probe), Start() and\r
// Stop() functions of the driver together. Refer to UEFI Spec 2.3.1 + Errata\r
// C, 10.1 EFI Driver Binding Protocol.\r
//\r
-STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {\r
+STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {\r
&VirtioRngDriverBindingSupported,\r
&VirtioRngDriverBindingStart,\r
&VirtioRngDriverBindingStop,\r
NULL // DriverBindingHandle, ditto\r
};\r
\r
-\r
//\r
// The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and\r
// EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name\r
//\r
\r
STATIC\r
-EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {\r
+EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {\r
{ "eng;en", L"Virtio Random Number Generator Driver" },\r
- { NULL, NULL }\r
+ { NULL, NULL }\r
};\r
\r
STATIC\r
-EFI_COMPONENT_NAME_PROTOCOL gComponentName;\r
+EFI_COMPONENT_NAME_PROTOCOL gComponentName;\r
\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
VirtioRngGetDriverName (\r
- IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **DriverName\r
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **DriverName\r
)\r
{\r
return LookupUnicodeString2 (\r
EFI_STATUS\r
EFIAPI\r
VirtioRngGetDeviceName (\r
- IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
- IN EFI_HANDLE DeviceHandle,\r
- IN EFI_HANDLE ChildHandle,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **ControllerName\r
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
+ IN EFI_HANDLE DeviceHandle,\r
+ IN EFI_HANDLE ChildHandle,\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **ControllerName\r
)\r
{\r
return EFI_UNSUPPORTED;\r
}\r
\r
STATIC\r
-EFI_COMPONENT_NAME_PROTOCOL gComponentName = {\r
+EFI_COMPONENT_NAME_PROTOCOL gComponentName = {\r
&VirtioRngGetDriverName,\r
&VirtioRngGetDeviceName,\r
"eng" // SupportedLanguages, ISO 639-2 language codes\r
};\r
\r
STATIC\r
-EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {\r
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) &VirtioRngGetDriverName,\r
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) &VirtioRngGetDeviceName,\r
+EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {\r
+ (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)&VirtioRngGetDriverName,\r
+ (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)&VirtioRngGetDeviceName,\r
"en" // SupportedLanguages, RFC 4646 language codes\r
};\r
\r
-\r
//\r
// Entry point of this driver.\r
//\r
EFI_STATUS\r
EFIAPI\r
VirtioRngEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
return EfiLibInstallDriverBindingComponentName2 (\r