mirror of https://github.com/acidanthera/audk.git
OvmfPkg/Microvm/fdt: add empty fdt
FdtClient is unhappy without a device tree, so add an empty fdt which we can use in case etc/fdt is not present in fw_cfg. On ARM machines a device tree is mandatory for hardware detection, that's why FdtClient fails hard. On microvm the device tree is only used to detect virtio-mmio devices (this patch series) and the pcie host (future series). So edk2 can continue with limited functionality in case no device tree is present: no storage, no network, but serial console and direct kernel boot works. qemu release 6.2 & newer will provide a device tree for microvm. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3689 Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com>
This commit is contained in:
parent
79dcaf7054
commit
c802f8935c
|
@ -16,6 +16,7 @@
|
|||
//
|
||||
// The Library classes this module consumes
|
||||
//
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
|
@ -321,6 +322,18 @@ PciExBarInitialization (
|
|||
);
|
||||
}
|
||||
|
||||
static const UINT8 EmptyFdt[] = {
|
||||
0xd0, 0x0d, 0xfe, 0xed, 0x00, 0x00, 0x00, 0x48,
|
||||
0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x48,
|
||||
0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x11,
|
||||
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09,
|
||||
};
|
||||
|
||||
VOID
|
||||
MicrovmInitialization (
|
||||
VOID
|
||||
|
@ -335,8 +348,9 @@ MicrovmInitialization (
|
|||
|
||||
Status = QemuFwCfgFindFile ("etc/fdt", &FdtItem, &FdtSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_INFO, "%a: no etc/fdt found in fw_cfg\n", __FUNCTION__));
|
||||
return;
|
||||
DEBUG ((DEBUG_INFO, "%a: no etc/fdt found in fw_cfg, using dummy\n", __FUNCTION__));
|
||||
FdtItem = 0;
|
||||
FdtSize = sizeof (EmptyFdt);
|
||||
}
|
||||
|
||||
FdtPages = EFI_SIZE_TO_PAGES (FdtSize);
|
||||
|
@ -346,8 +360,12 @@ MicrovmInitialization (
|
|||
return;
|
||||
}
|
||||
|
||||
QemuFwCfgSelectItem (FdtItem);
|
||||
QemuFwCfgReadBytes (FdtSize, NewBase);
|
||||
if (FdtItem) {
|
||||
QemuFwCfgSelectItem (FdtItem);
|
||||
QemuFwCfgReadBytes (FdtSize, NewBase);
|
||||
} else {
|
||||
CopyMem (NewBase, EmptyFdt, FdtSize);
|
||||
}
|
||||
|
||||
FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof (*FdtHobData));
|
||||
if (FdtHobData == NULL) {
|
||||
|
|
Loading…
Reference in New Issue