X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FLibrary%2FVirtioMmioDeviceLib%2FVirtioMmioDevice.c;h=2f20272c1445be542359e8654f088f1e90d25d9e;hp=03aa7bcb62442cdd4fa2d89d57785bae0d4d5d43;hb=HEAD;hpb=4120bb498fcc08344fa54bf299c64ff0450871d1 diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c index 03aa7bcb62..831dc1736d 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c @@ -5,13 +5,7 @@ Copyright (C) 2013, ARM Ltd. Copyright (C) 2017, AMD Inc. All rights reserved.
- This program and the accompanying materials are licensed and made available - under the terms and conditions of the BSD License which accompanies this - distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT - WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -20,26 +14,26 @@ #include "VirtioMmioDevice.h" -STATIC CONST VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = { - 0, // Revision - 0, // SubSystemDeviceId - VirtioMmioGetDeviceFeatures, // GetDeviceFeatures - VirtioMmioSetGuestFeatures, // SetGuestFeatures - VirtioMmioSetQueueAddress, // SetQueueAddress - VirtioMmioSetQueueSel, // SetQueueSel - VirtioMmioSetQueueNotify, // SetQueueNotify - VirtioMmioSetQueueAlignment, // SetQueueAlign - VirtioMmioSetPageSize, // SetPageSize - VirtioMmioGetQueueSize, // GetQueueNumMax - VirtioMmioSetQueueSize, // SetQueueNum - VirtioMmioGetDeviceStatus, // GetDeviceStatus - VirtioMmioSetDeviceStatus, // SetDeviceStatus - VirtioMmioDeviceWrite, // WriteDevice - VirtioMmioDeviceRead, // ReadDevice - VirtioMmioAllocateSharedPages, // AllocateSharedPages - VirtioMmioFreeSharedPages, // FreeSharedPages - VirtioMmioMapSharedBuffer, // MapSharedBuffer - VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer +STATIC CONST VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = { + 0, // Revision + 0, // SubSystemDeviceId + VirtioMmioGetDeviceFeatures, // GetDeviceFeatures + VirtioMmioSetGuestFeatures, // SetGuestFeatures + VirtioMmioSetQueueAddress, // SetQueueAddress + VirtioMmioSetQueueSel, // SetQueueSel + VirtioMmioSetQueueNotify, // SetQueueNotify + VirtioMmioSetQueueAlignment, // SetQueueAlign + VirtioMmioSetPageSize, // SetPageSize + VirtioMmioGetQueueSize, // GetQueueNumMax + VirtioMmioSetQueueSize, // SetQueueNum + VirtioMmioGetDeviceStatus, // GetDeviceStatus + VirtioMmioSetDeviceStatus, // SetDeviceStatus + VirtioMmioDeviceWrite, // WriteDevice + VirtioMmioDeviceRead, // ReadDevice + VirtioMmioAllocateSharedPages, // AllocateSharedPages + VirtioMmioFreeSharedPages, // FreeSharedPages + VirtioMmioMapSharedBuffer, // MapSharedBuffer + VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer }; /** @@ -60,22 +54,22 @@ EFI_STATUS EFIAPI VirtioMmioInit ( IN PHYSICAL_ADDRESS BaseAddress, - IN OUT VIRTIO_MMIO_DEVICE *Device + IN OUT VIRTIO_MMIO_DEVICE *Device ) { - UINT32 MagicValue; - UINT32 VendorId; - UINT32 Version; + UINT32 MagicValue; // // Initialize VirtIo Mmio Device // - CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate, - sizeof (VIRTIO_DEVICE_PROTOCOL)); - Device->BaseAddress = BaseAddress; - Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); + CopyMem ( + &Device->VirtioDevice, + &mMmioDeviceProtocolTemplate, + sizeof (VIRTIO_DEVICE_PROTOCOL) + ); + Device->BaseAddress = BaseAddress; Device->VirtioDevice.SubSystemDeviceId = - MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID); + MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID); // // Double-check MMIO-specific values @@ -85,29 +79,33 @@ VirtioMmioInit ( return EFI_UNSUPPORTED; } - Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); - if (Version != 1) { - return EFI_UNSUPPORTED; - } - - // - // Double-check MMIO-specific values - // - VendorId = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VENDOR_ID); - if (VendorId != VIRTIO_VENDOR_ID) { - // - // The ARM Base and Foundation Models do not report a valid VirtIo VendorId. - // They return a value of 0x0 for the VendorId. - // - DEBUG((EFI_D_WARN, "VirtioMmioInit: Warning: The VendorId (0x%X) does not " - "match the VirtIo VendorId (0x%X).\n", - VendorId, VIRTIO_VENDOR_ID)); + Device->Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); + switch (Device->Version) { + case VIRTIO_MMIO_DEVICE_VERSION_0_95: + DEBUG (( + DEBUG_INFO, + "%a virtio 0.9.5, id %d\n", + __FUNCTION__, + Device->VirtioDevice.SubSystemDeviceId + )); + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); + break; + case VIRTIO_MMIO_DEVICE_VERSION_1_00: + DEBUG (( + DEBUG_INFO, + "%a virtio 1.0, id %d\n", + __FUNCTION__, + Device->VirtioDevice.SubSystemDeviceId + )); + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0); + break; + default: + return EFI_UNSUPPORTED; } return EFI_SUCCESS; } - /** Uninitialize the internals of a virtio-mmio device that has been successfully @@ -116,12 +114,11 @@ VirtioMmioInit ( @param[in, out] Device The device to clean up. **/ - STATIC VOID EFIAPI VirtioMmioUninit ( - IN VIRTIO_MMIO_DEVICE *Device + IN VIRTIO_MMIO_DEVICE *Device ) { // @@ -132,16 +129,17 @@ VirtioMmioUninit ( EFI_STATUS VirtioMmioInstallDevice ( - IN PHYSICAL_ADDRESS BaseAddress, - IN EFI_HANDLE Handle + IN PHYSICAL_ADDRESS BaseAddress, + IN EFI_HANDLE Handle ) { EFI_STATUS Status; - VIRTIO_MMIO_DEVICE *VirtIo; + VIRTIO_MMIO_DEVICE *VirtIo; if (!BaseAddress) { return EFI_INVALID_PARAMETER; } + if (Handle == NULL) { return EFI_INVALID_PARAMETER; } @@ -164,9 +162,12 @@ VirtioMmioInstallDevice ( // // Install VIRTIO_DEVICE_PROTOCOL to Handle // - Status = gBS->InstallProtocolInterface (&Handle, - &gVirtioDeviceProtocolGuid, EFI_NATIVE_INTERFACE, - &VirtIo->VirtioDevice); + Status = gBS->InstallProtocolInterface ( + &Handle, + &gVirtioDeviceProtocolGuid, + EFI_NATIVE_INTERFACE, + &VirtIo->VirtioDevice + ); if (EFI_ERROR (Status)) { goto UninitVirtio; } @@ -183,7 +184,7 @@ FreeVirtioMem: EFI_STATUS VirtioMmioUninstallDevice ( - IN EFI_HANDLE DeviceHandle + IN EFI_HANDLE DeviceHandle ) { VIRTIO_DEVICE_PROTOCOL *VirtioDevice; @@ -210,9 +211,11 @@ VirtioMmioUninstallDevice ( // // Uninstall the protocol interface // - Status = gBS->UninstallProtocolInterface (DeviceHandle, - &gVirtioDeviceProtocolGuid, &MmioDevice->VirtioDevice - ); + Status = gBS->UninstallProtocolInterface ( + DeviceHandle, + &gVirtioDeviceProtocolGuid, + &MmioDevice->VirtioDevice + ); if (EFI_ERROR (Status)) { return Status; }