X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FLibrary%2FVirtioMmioDeviceLib%2FVirtioMmioDevice.c;h=2f20272c1445be542359e8654f088f1e90d25d9e;hb=HEAD;hp=d5bed3546d7760ffca2719bf6da7b82ec55ec87b;hpb=b26f0cf9ee09a180c91a4beeeb1b149e7f92afed;p=mirror_edk2.git diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c index d5bed3546d..831dc1736d 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c @@ -14,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 }; /** @@ -54,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 @@ -79,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 @@ -110,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 ) { // @@ -126,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; } @@ -158,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; } @@ -177,7 +184,7 @@ FreeVirtioMem: EFI_STATUS VirtioMmioUninstallDevice ( - IN EFI_HANDLE DeviceHandle + IN EFI_HANDLE DeviceHandle ) { VIRTIO_DEVICE_PROTOCOL *VirtioDevice; @@ -204,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; }