* [PATCH v3 1/5] OvmfPkg/Microvm/fdt: add device tree support
2021-12-13 8:16 [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Gerd Hoffmann
@ 2021-12-13 8:16 ` Gerd Hoffmann
2021-12-13 9:38 ` Philippe Mathieu-Daudé
2021-12-13 8:16 ` [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg Gerd Hoffmann
` (4 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 8:16 UTC (permalink / raw)
To: devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Gerd Hoffmann, Ard Biesheuvel
Add fdt parser from EmbeddedPkg (FdtLib and FdtClientDxe) to MicrovmX64.
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3689
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
OvmfPkg/Microvm/MicrovmX64.dsc | 6 ++++++
OvmfPkg/Microvm/MicrovmX64.fdf | 2 ++
2 files changed, 8 insertions(+)
diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc
index 5f4d9226791b..edddf6c29b32 100644
--- a/OvmfPkg/Microvm/MicrovmX64.dsc
+++ b/OvmfPkg/Microvm/MicrovmX64.dsc
@@ -232,6 +232,7 @@ [LibraryClasses.common]
VmgExitLib|OvmfPkg/Library/VmgExitLib/VmgExitLib.inf
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
+ FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
[LibraryClasses.common.SEC]
QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf
@@ -739,6 +740,11 @@ [Components]
#
MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+ #
+ # device tree
+ #
+ EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf
+
#
# SMBIOS Support
#
diff --git a/OvmfPkg/Microvm/MicrovmX64.fdf b/OvmfPkg/Microvm/MicrovmX64.fdf
index 4570bc866c9b..905d23b843d3 100644
--- a/OvmfPkg/Microvm/MicrovmX64.fdf
+++ b/OvmfPkg/Microvm/MicrovmX64.fdf
@@ -276,6 +276,8 @@ [FV.DXEFV]
INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf
INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf
+INF EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf
+
!if $(TOOL_CHAIN_TAG) != "XCODE5"
INF ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf
INF ShellPkg/DynamicCommand/HttpDynamicCommand/HttpDynamicCommand.inf
--
2.33.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg
2021-12-13 8:16 [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Gerd Hoffmann
2021-12-13 8:16 ` [PATCH v3 1/5] OvmfPkg/Microvm/fdt: add device tree support Gerd Hoffmann
@ 2021-12-13 8:16 ` Gerd Hoffmann
2021-12-13 9:33 ` Philippe Mathieu-Daudé
2021-12-13 9:43 ` [edk2-devel] " Ard Biesheuvel
2021-12-13 8:16 ` [PATCH v3 3/5] OvmfPkg/Microvm/fdt: add empty fdt Gerd Hoffmann
` (3 subsequent siblings)
5 siblings, 2 replies; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 8:16 UTC (permalink / raw)
To: devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Gerd Hoffmann, Ard Biesheuvel
Needed for hardware detection: virtio-mmio devices for now,
later also pcie root bridge.
Depends on patched qemu which actually provides an fdt:
https://gitlab.com/kraxel/qemu/-/commits/sirius/microvm-device-tree
https://bugzilla.tianocore.org/show_bug.cgi?id=3689
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
OvmfPkg/PlatformPei/PlatformPei.inf | 1 +
OvmfPkg/PlatformPei/Platform.c | 45 +++++++++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf
index 1c56ba275835..8ef404168c45 100644
--- a/OvmfPkg/PlatformPei/PlatformPei.inf
+++ b/OvmfPkg/PlatformPei/PlatformPei.inf
@@ -44,6 +44,7 @@ [Packages]
[Guids]
gEfiMemoryTypeInformationGuid
+ gFdtHobGuid
[LibraryClasses]
BaseLib
diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
index 906f64615de7..c9ec1d7e99fb 100644
--- a/OvmfPkg/PlatformPei/Platform.c
+++ b/OvmfPkg/PlatformPei/Platform.c
@@ -321,6 +321,50 @@ PciExBarInitialization (
);
}
+VOID
+MicrovmInitialization (
+ VOID
+ )
+{
+ FIRMWARE_CONFIG_ITEM FdtItem;
+ UINTN FdtSize;
+ UINTN FdtPages;
+ EFI_STATUS Status;
+ UINT64 *FdtHobData;
+ VOID *NewBase;
+
+ Status = QemuFwCfgFindFile ("etc/fdt", &FdtItem, &FdtSize);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_INFO, "%a: no etc/fdt found in fw_cfg\n", __FUNCTION__));
+ return;
+ }
+
+ FdtPages = EFI_SIZE_TO_PAGES (FdtSize);
+ NewBase = AllocatePages (FdtPages);
+ if (NewBase == NULL) {
+ DEBUG ((DEBUG_INFO, "%a: AllocatePages failed\n", __FUNCTION__));
+ return;
+ }
+
+ QemuFwCfgSelectItem (FdtItem);
+ QemuFwCfgReadBytes (FdtSize, NewBase);
+
+ FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof (*FdtHobData));
+ if (FdtHobData == NULL) {
+ DEBUG ((DEBUG_INFO, "%a: BuildGuidHob failed\n", __FUNCTION__));
+ return;
+ }
+
+ DEBUG ((
+ DEBUG_INFO,
+ "%a: fdt at 0x%x (size %d)\n",
+ __FUNCTION__,
+ NewBase,
+ FdtSize
+ ));
+ *FdtHobData = (UINTN)NewBase;
+}
+
VOID
MiscInitialization (
VOID
@@ -368,6 +412,7 @@ MiscInitialization (
break;
case 0xffff: /* microvm */
DEBUG ((DEBUG_INFO, "%a: microvm\n", __FUNCTION__));
+ MicrovmInitialization ();
PcdStatus = PcdSet16S (
PcdOvmfHostBridgePciDevId,
MICROVM_PSEUDO_DEVICE_ID
--
2.33.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg
2021-12-13 8:16 ` [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg Gerd Hoffmann
@ 2021-12-13 9:33 ` Philippe Mathieu-Daudé
2021-12-13 11:21 ` Gerd Hoffmann
2021-12-13 9:43 ` [edk2-devel] " Ard Biesheuvel
1 sibling, 1 reply; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-12-13 9:33 UTC (permalink / raw)
To: Gerd Hoffmann, devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski, Ard Biesheuvel
On 12/13/21 09:16, Gerd Hoffmann wrote:
> Needed for hardware detection: virtio-mmio devices for now,
> later also pcie root bridge.
>
> Depends on patched qemu which actually provides an fdt:
> https://gitlab.com/kraxel/qemu/-/commits/sirius/microvm-device-tree
Link returns 404.
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=3689
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> OvmfPkg/PlatformPei/PlatformPei.inf | 1 +
> OvmfPkg/PlatformPei/Platform.c | 45 +++++++++++++++++++++++++++++
> 2 files changed, 46 insertions(+)
>
> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf
> index 1c56ba275835..8ef404168c45 100644
> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
> @@ -44,6 +44,7 @@ [Packages]
>
> [Guids]
> gEfiMemoryTypeInformationGuid
> + gFdtHobGuid
>
> [LibraryClasses]
> BaseLib
> diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
> index 906f64615de7..c9ec1d7e99fb 100644
> --- a/OvmfPkg/PlatformPei/Platform.c
> +++ b/OvmfPkg/PlatformPei/Platform.c
> @@ -321,6 +321,50 @@ PciExBarInitialization (
> );
> }
>
> +VOID
> +MicrovmInitialization (
> + VOID
> + )
> +{
> + FIRMWARE_CONFIG_ITEM FdtItem;
> + UINTN FdtSize;
> + UINTN FdtPages;
> + EFI_STATUS Status;
> + UINT64 *FdtHobData;
> + VOID *NewBase;
> +
> + Status = QemuFwCfgFindFile ("etc/fdt", &FdtItem, &FdtSize);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_INFO, "%a: no etc/fdt found in fw_cfg\n", __FUNCTION__));
> + return;
> + }
> +
> + FdtPages = EFI_SIZE_TO_PAGES (FdtSize);
> + NewBase = AllocatePages (FdtPages);
> + if (NewBase == NULL) {
> + DEBUG ((DEBUG_INFO, "%a: AllocatePages failed\n", __FUNCTION__));
> + return;
> + }
> +
> + QemuFwCfgSelectItem (FdtItem);
> + QemuFwCfgReadBytes (FdtSize, NewBase);
> +
> + FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof (*FdtHobData));
> + if (FdtHobData == NULL) {
> + DEBUG ((DEBUG_INFO, "%a: BuildGuidHob failed\n", __FUNCTION__));
FreePages (NewBase)?
Otherwise:
Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com>
> + return;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "%a: fdt at 0x%x (size %d)\n",
> + __FUNCTION__,
> + NewBase,
> + FdtSize
> + ));
> + *FdtHobData = (UINTN)NewBase;
> +}
> +
> VOID
> MiscInitialization (
> VOID
> @@ -368,6 +412,7 @@ MiscInitialization (
> break;
> case 0xffff: /* microvm */
> DEBUG ((DEBUG_INFO, "%a: microvm\n", __FUNCTION__));
> + MicrovmInitialization ();
> PcdStatus = PcdSet16S (
> PcdOvmfHostBridgePciDevId,
> MICROVM_PSEUDO_DEVICE_ID
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg
2021-12-13 9:33 ` Philippe Mathieu-Daudé
@ 2021-12-13 11:21 ` Gerd Hoffmann
0 siblings, 0 replies; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 11:21 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: devel, Jordan Justen, Jiewen Yao, Pawel Polawski, Ard Biesheuvel
On Mon, Dec 13, 2021 at 10:33:55AM +0100, Philippe Mathieu-Daudé wrote:
> On 12/13/21 09:16, Gerd Hoffmann wrote:
> > Needed for hardware detection: virtio-mmio devices for now,
> > later also pcie root bridge.
> >
> > Depends on patched qemu which actually provides an fdt:
> > https://gitlab.com/kraxel/qemu/-/commits/sirius/microvm-device-tree
>
> Link returns 404.
Oh, need to fix the commit message. It's upstream in qemu 6.2+
meanwhile.
take care,
Gerd
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg
2021-12-13 8:16 ` [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg Gerd Hoffmann
2021-12-13 9:33 ` Philippe Mathieu-Daudé
@ 2021-12-13 9:43 ` Ard Biesheuvel
2021-12-13 11:26 ` Gerd Hoffmann
1 sibling, 1 reply; 16+ messages in thread
From: Ard Biesheuvel @ 2021-12-13 9:43 UTC (permalink / raw)
To: edk2-devel-groups-io, Gerd Hoffmann
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Ard Biesheuvel
On Mon, 13 Dec 2021 at 09:17, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> Needed for hardware detection: virtio-mmio devices for now,
> later also pcie root bridge.
>
> Depends on patched qemu which actually provides an fdt:
> https://gitlab.com/kraxel/qemu/-/commits/sirius/microvm-device-tree
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=3689
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> OvmfPkg/PlatformPei/PlatformPei.inf | 1 +
> OvmfPkg/PlatformPei/Platform.c | 45 +++++++++++++++++++++++++++++
> 2 files changed, 46 insertions(+)
>
> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf
> index 1c56ba275835..8ef404168c45 100644
> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
> @@ -44,6 +44,7 @@ [Packages]
>
> [Guids]
> gEfiMemoryTypeInformationGuid
> + gFdtHobGuid
>
> [LibraryClasses]
> BaseLib
> diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
> index 906f64615de7..c9ec1d7e99fb 100644
> --- a/OvmfPkg/PlatformPei/Platform.c
> +++ b/OvmfPkg/PlatformPei/Platform.c
> @@ -321,6 +321,50 @@ PciExBarInitialization (
> );
> }
>
> +VOID
> +MicrovmInitialization (
> + VOID
> + )
> +{
> + FIRMWARE_CONFIG_ITEM FdtItem;
> + UINTN FdtSize;
> + UINTN FdtPages;
> + EFI_STATUS Status;
> + UINT64 *FdtHobData;
> + VOID *NewBase;
> +
> + Status = QemuFwCfgFindFile ("etc/fdt", &FdtItem, &FdtSize);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_INFO, "%a: no etc/fdt found in fw_cfg\n", __FUNCTION__));
> + return;
> + }
> +
> + FdtPages = EFI_SIZE_TO_PAGES (FdtSize);
> + NewBase = AllocatePages (FdtPages);
> + if (NewBase == NULL) {
> + DEBUG ((DEBUG_INFO, "%a: AllocatePages failed\n", __FUNCTION__));
> + return;
> + }
> +
> + QemuFwCfgSelectItem (FdtItem);
> + QemuFwCfgReadBytes (FdtSize, NewBase);
> +
> + FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof (*FdtHobData));
> + if (FdtHobData == NULL) {
> + DEBUG ((DEBUG_INFO, "%a: BuildGuidHob failed\n", __FUNCTION__));
> + return;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "%a: fdt at 0x%x (size %d)\n",
> + __FUNCTION__,
> + NewBase,
> + FdtSize
> + ));
> + *FdtHobData = (UINTN)NewBase;
> +}
> +
> VOID
> MiscInitialization (
> VOID
> @@ -368,6 +412,7 @@ MiscInitialization (
> break;
> case 0xffff: /* microvm */
> DEBUG ((DEBUG_INFO, "%a: microvm\n", __FUNCTION__));
> + MicrovmInitialization ();
Is this the best spot for calling Microvm related init code that is
entirely unrelated to PCIe?
> PcdStatus = PcdSet16S (
> PcdOvmfHostBridgePciDevId,
> MICROVM_PSEUDO_DEVICE_ID
> --
> 2.33.1
>
>
>
>
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg
2021-12-13 9:43 ` [edk2-devel] " Ard Biesheuvel
@ 2021-12-13 11:26 ` Gerd Hoffmann
2021-12-13 11:30 ` Ard Biesheuvel
0 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 11:26 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: edk2-devel-groups-io, Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Ard Biesheuvel
Hi,
> > @@ -368,6 +412,7 @@ MiscInitialization (
> > break;
> > case 0xffff: /* microvm */
> > DEBUG ((DEBUG_INFO, "%a: microvm\n", __FUNCTION__));
> > + MicrovmInitialization ();
>
> Is this the best spot for calling Microvm related init code that is
> entirely unrelated to PCIe?
Looked like the best place to me. Various platform-specific
initialization happens there. And, yes, for 'pc' and 'q35'
qemu machines this includes pci host bridge setup.
Do you have a better suggestion?
take care,
Gerd
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [edk2-devel] [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg
2021-12-13 11:26 ` Gerd Hoffmann
@ 2021-12-13 11:30 ` Ard Biesheuvel
0 siblings, 0 replies; 16+ messages in thread
From: Ard Biesheuvel @ 2021-12-13 11:30 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: edk2-devel-groups-io, Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Ard Biesheuvel
On Mon, 13 Dec 2021 at 12:26, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> Hi,
>
> > > @@ -368,6 +412,7 @@ MiscInitialization (
> > > break;
> > > case 0xffff: /* microvm */
> > > DEBUG ((DEBUG_INFO, "%a: microvm\n", __FUNCTION__));
> > > + MicrovmInitialization ();
> >
> > Is this the best spot for calling Microvm related init code that is
> > entirely unrelated to PCIe?
>
> Looked like the best place to me. Various platform-specific
> initialization happens there. And, yes, for 'pc' and 'q35'
> qemu machines this includes pci host bridge setup.
>
Fair enough. Given the comment that future changes will include DT
based PCIe host bridge probing, I think this is fine.
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 3/5] OvmfPkg/Microvm/fdt: add empty fdt
2021-12-13 8:16 [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Gerd Hoffmann
2021-12-13 8:16 ` [PATCH v3 1/5] OvmfPkg/Microvm/fdt: add device tree support Gerd Hoffmann
2021-12-13 8:16 ` [PATCH v3 2/5] OvmfPkg/Microvm/fdt: load fdt from fw_cfg Gerd Hoffmann
@ 2021-12-13 8:16 ` Gerd Hoffmann
2021-12-13 9:35 ` Philippe Mathieu-Daudé
2021-12-13 8:16 ` [PATCH v3 4/5] OvmfPkg/Microvm/virtio: add virtio-mmio support Gerd Hoffmann
` (2 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 8:16 UTC (permalink / raw)
To: devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Gerd Hoffmann, Ard Biesheuvel
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,
thats 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.
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>
---
OvmfPkg/PlatformPei/Platform.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
index c9ec1d7e99fb..d0323c645162 100644
--- a/OvmfPkg/PlatformPei/Platform.c
+++ b/OvmfPkg/PlatformPei/Platform.c
@@ -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) {
--
2.33.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v3 3/5] OvmfPkg/Microvm/fdt: add empty fdt
2021-12-13 8:16 ` [PATCH v3 3/5] OvmfPkg/Microvm/fdt: add empty fdt Gerd Hoffmann
@ 2021-12-13 9:35 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-12-13 9:35 UTC (permalink / raw)
To: Gerd Hoffmann, devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski, Ard Biesheuvel
On 12/13/21 09:16, Gerd Hoffmann wrote:
> 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,
> thats why FdtClient fails hard.
"that's"
>
> 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.
>
> 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>
> ---
> OvmfPkg/PlatformPei/Platform.c | 26 ++++++++++++++++++++++----
> 1 file changed, 22 insertions(+), 4 deletions(-)
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 4/5] OvmfPkg/Microvm/virtio: add virtio-mmio support
2021-12-13 8:16 [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Gerd Hoffmann
` (2 preceding siblings ...)
2021-12-13 8:16 ` [PATCH v3 3/5] OvmfPkg/Microvm/fdt: add empty fdt Gerd Hoffmann
@ 2021-12-13 8:16 ` Gerd Hoffmann
2021-12-13 9:38 ` Philippe Mathieu-Daudé
2021-12-13 8:16 ` [PATCH v3 5/5] OvmfPkg/Microvm: add README Gerd Hoffmann
2021-12-13 12:18 ` [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Ard Biesheuvel
5 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 8:16 UTC (permalink / raw)
To: devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Gerd Hoffmann, Ard Biesheuvel
Add virtio-mmio support (VirtioMmioDeviceLib and VirtioFdtDxe).
With this patch added and a new enough qemu version (6.2+) edk2
will detect virtio-mmio devices, so it is possible to boot from
storage (virtio-blk, virtio-scsi) or network (virtio-net).
https://bugzilla.tianocore.org/show_bug.cgi?id=3689
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
OvmfPkg/Microvm/MicrovmX64.dsc | 2 ++
OvmfPkg/Microvm/MicrovmX64.fdf | 1 +
2 files changed, 3 insertions(+)
diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc
index edddf6c29b32..a78c8f3dd89f 100644
--- a/OvmfPkg/Microvm/MicrovmX64.dsc
+++ b/OvmfPkg/Microvm/MicrovmX64.dsc
@@ -233,6 +233,7 @@ [LibraryClasses.common]
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
+ VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf
[LibraryClasses.common.SEC]
QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf
@@ -744,6 +745,7 @@ [Components]
# device tree
#
EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf
+ OvmfPkg/Fdt/VirtioFdtDxe/VirtioFdtDxe.inf
#
# SMBIOS Support
diff --git a/OvmfPkg/Microvm/MicrovmX64.fdf b/OvmfPkg/Microvm/MicrovmX64.fdf
index 905d23b843d3..6999ac1a87b9 100644
--- a/OvmfPkg/Microvm/MicrovmX64.fdf
+++ b/OvmfPkg/Microvm/MicrovmX64.fdf
@@ -277,6 +277,7 @@ [FV.DXEFV]
INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf
INF EmbeddedPkg/Drivers/FdtClientDxe/FdtClientDxe.inf
+INF OvmfPkg/Fdt/VirtioFdtDxe/VirtioFdtDxe.inf
!if $(TOOL_CHAIN_TAG) != "XCODE5"
INF ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf
--
2.33.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 5/5] OvmfPkg/Microvm: add README
2021-12-13 8:16 [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Gerd Hoffmann
` (3 preceding siblings ...)
2021-12-13 8:16 ` [PATCH v3 4/5] OvmfPkg/Microvm/virtio: add virtio-mmio support Gerd Hoffmann
@ 2021-12-13 8:16 ` Gerd Hoffmann
2021-12-13 9:37 ` Philippe Mathieu-Daudé
2021-12-13 12:18 ` [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Ard Biesheuvel
5 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2021-12-13 8:16 UTC (permalink / raw)
To: devel
Cc: Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Gerd Hoffmann, Ard Biesheuvel,
Jiewen Yao
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3599
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
---
OvmfPkg/Microvm/README | 50 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
create mode 100644 OvmfPkg/Microvm/README
diff --git a/OvmfPkg/Microvm/README b/OvmfPkg/Microvm/README
new file mode 100644
index 000000000000..540d39f2ec21
--- /dev/null
+++ b/OvmfPkg/Microvm/README
@@ -0,0 +1,50 @@
+
+This is an *experimental* port of OVMF for the QEMU microvm
+machine type.
+
+microvm background info
+-----------------------
+
+microvm is designed for modern, virtio-based workloads. Most legacy
+lpc/isa devices like pit and pic can be turned off. virtio-mmio
+(i.e. '-device virtio-{blk,net,scsi,...}-device') is used for
+storage/network/etc.
+
+Optional pcie support is available and any pcie device supported by
+QEMU can be plugged in (including virtio-pci if you prefer that over
+virtio-mmio).
+
+https://qemu.readthedocs.io/en/latest/system/i386/microvm.html
+https://www.kraxel.org/blog/2020/10/qemu-microvm-acpi/
+
+design issues
+-------------
+
+Not fully clear yet how to do hardware detection best. Right now
+using device tree to find virtio-mmio devices and pcie host bridge,
+can reuse existing ArmVirtPkg code that way. Needs patched QEMU.
+
+features
+--------
+ [working] serial console
+ [working] direct kernel boot
+ [working] virtio-mmio support
+ [in progress] pcie support
+
+known limitations
+-----------------
+ * rtc=on is required for now.
+ * can't use separate code/vars (actually an microvm limitation,
+ there is no pflash support).
+ * transitional virtio-pci devices do not work. microvm doesn't
+ support ioports on pcie, and ovmf doesn't initialize pcie devices
+ with ioports if there is no address space for them (even though
+ pcie devices are required to be functional without ioports).
+
+usage
+-----
+qemu-system-x86_64 \
+ -nographic \
+ -machine microvm,acpi=on,pit=off,pic=off,rtc=on \
+ -bios /path/to/MICROVM.fd \
+ [ ... more args here ... ]
--
2.33.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches
2021-12-13 8:16 [PATCH v3 0/5] OvmfPkg/Microvm: second batch of microvm patches Gerd Hoffmann
` (4 preceding siblings ...)
2021-12-13 8:16 ` [PATCH v3 5/5] OvmfPkg/Microvm: add README Gerd Hoffmann
@ 2021-12-13 12:18 ` Ard Biesheuvel
5 siblings, 0 replies; 16+ messages in thread
From: Ard Biesheuvel @ 2021-12-13 12:18 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: edk2-devel-groups-io, Jordan Justen, Jiewen Yao, Pawel Polawski,
Philippe Mathieu-Daudé, Ard Biesheuvel
On Mon, 13 Dec 2021 at 09:17, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> Adds support for virtio-mmio devices to microvm.
>
> While being at it also add the README, the
> patch somehow disappeared from the first batch.
>
> v3:
> - uncrustify & rebase to latest master
> - pick up some review tags
> - minor README updates.
>
> v2:
> - qemu changes needed for this are merged and will be
> in the 6.2 release (dec 2021).
> - more verbose commit messages.
>
> Gerd Hoffmann (5):
> OvmfPkg/Microvm/fdt: add device tree support
> OvmfPkg/Microvm/fdt: load fdt from fw_cfg
> OvmfPkg/Microvm/fdt: add empty fdt
> OvmfPkg/Microvm/virtio: add virtio-mmio support
> OvmfPkg/Microvm: add README
>
Merged as #2295
Thanks,
> OvmfPkg/Microvm/MicrovmX64.dsc | 8 ++++
> OvmfPkg/Microvm/MicrovmX64.fdf | 3 ++
> OvmfPkg/PlatformPei/PlatformPei.inf | 1 +
> OvmfPkg/PlatformPei/Platform.c | 63 +++++++++++++++++++++++++++++
> OvmfPkg/Microvm/README | 50 +++++++++++++++++++++++
> 5 files changed, 125 insertions(+)
> create mode 100644 OvmfPkg/Microvm/README
>
> --
> 2.33.1
>
^ permalink raw reply [flat|nested] 16+ messages in thread