diff --git a/OvmfPkg/Include/IndustryStandard/Virtio10.h b/OvmfPkg/Include/IndustryStandard/Virtio10.h index c47bcbd41ab77..601a26a476d84 100644 --- a/OvmfPkg/Include/IndustryStandard/Virtio10.h +++ b/OvmfPkg/Include/IndustryStandard/Virtio10.h @@ -17,6 +17,7 @@ // Subsystem Device IDs (to be) introduced in VirtIo 1.0 // #define VIRTIO_SUBSYSTEM_GPU_DEVICE 16 +#define VIRTIO_SUBSYSTEM_INPUT 18 // // Subsystem Device IDs from the VirtIo spec at git commit 87fa6b5d8155; // . diff --git a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c index d9f61757cf1bd..fd804a935b401 100644 --- a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c +++ b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c @@ -1058,6 +1058,28 @@ PrepareVirtioSerialDevicePath ( return EFI_SUCCESS; } +EFI_STATUS +PrepareVirtioKeyboardDevicePath ( + IN EFI_HANDLE DeviceHandle + ) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + DevicePath = NULL; + Status = gBS->HandleProtocol ( + DeviceHandle, + &gEfiDevicePathProtocolGuid, + (VOID *)&DevicePath + ); + if (EFI_ERROR (Status)) { + return Status; + } + + EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL); + return EFI_SUCCESS; +} + EFI_STATUS VisitAllInstancesOfProtocol ( IN EFI_GUID *Id, @@ -1234,6 +1256,13 @@ DetectAndPreparePlatformPciDevicePath ( return EFI_SUCCESS; } + if ((Pci->Hdr.VendorId == 0x1af4) && (Pci->Hdr.DeviceId == 0x1052)) + { + DEBUG ((DEBUG_INFO, "Found virtio keyboard device\n")); + PrepareVirtioKeyboardDevicePath (Handle); + return EFI_SUCCESS; + } + return Status; }