A DMA-like transfer interface has recently been implemented in QEMU for fw-cfg. For ARM and AARCH64 virtual machines, the binding prescribes a new 8-byte wide register at offset 0x10 in the register block. Make VirtFdtDxe expose this register if it is present.
Please see "docs/specs/fw_cfg.txt" in the QEMU tree for more information. Cc: Ard Biesheuvel <[email protected]> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <[email protected]> --- ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf | 1 + ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c | 15 +++++++++++++++ ArmVirtPkg/ArmVirtPkg.dec | 1 + ArmVirtPkg/ArmVirtQemu.dsc | 1 + ArmVirtPkg/ArmVirtXen.dsc | 1 + 5 files changed, 19 insertions(+) diff --git a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf index 657b4e8..ee2503a 100644 --- a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf +++ b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf @@ -53,6 +53,7 @@ [Pcd] gArmVirtTokenSpaceGuid.PcdArmPsciMethod gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress + gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress gArmVirtTokenSpaceGuid.PcdArmGicRevision gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicRedistributorsBase diff --git a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c index 73db630..74f80d1 100644 --- a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c +++ b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c @@ -302,6 +302,8 @@ InitializeVirtFdtDxe ( UINT64 FwCfgSelectorSize; UINT64 FwCfgDataAddress; UINT64 FwCfgDataSize; + UINT64 FwCfgDmaAddress; + UINT64 FwCfgDmaSize; Hob = GetFirstGuidHob(&gFdtHobGuid); if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) { @@ -382,6 +384,19 @@ InitializeVirtFdtDxe ( DEBUG ((EFI_D_INFO, "Found FwCfg @ 0x%Lx/0x%Lx\n", FwCfgSelectorAddress, FwCfgDataAddress)); + + if (fdt64_to_cpu (((UINT64 *)RegProp)[1]) >= 0x18) { + FwCfgDmaAddress = FwCfgDataAddress + 0x10; + FwCfgDmaSize = 0x08; + + // + // See explanation above. + // + ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); + + PcdSet64 (PcdFwCfgDmaAddress, FwCfgDmaAddress); + DEBUG ((EFI_D_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); + } break; case PropertyTypeVirtio: diff --git a/ArmVirtPkg/ArmVirtPkg.dec b/ArmVirtPkg/ArmVirtPkg.dec index d987035..89e8448 100644 --- a/ArmVirtPkg/ArmVirtPkg.dec +++ b/ArmVirtPkg/ArmVirtPkg.dec @@ -67,6 +67,7 @@ [PcdsDynamic, PcdsFixedAtBuild] gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0|UINT64|0x00000004 gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0|UINT64|0x00000005 + gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress|0x0|UINT64|0x00000009 # # Supported GIC revision (2, 3, ...) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index f1af968..9e40f39 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -199,6 +199,7 @@ [PcdsDynamicDefault.common] gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0 gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0 + gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress|0x0 # # Set video resolution for boot options and for text setup. diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc index 5c19afc..ac37cd2 100644 --- a/ArmVirtPkg/ArmVirtXen.dsc +++ b/ArmVirtPkg/ArmVirtXen.dsc @@ -144,6 +144,7 @@ [PcdsDynamicDefault.common] gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0 gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0 + gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress|0x0 gArmVirtTokenSpaceGuid.PcdArmPsciMethod|0 -- 1.8.3.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

