]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmVirtPkg: VirtFdtDxe: detect fw-cfg DMA interface from the DTB
authorLaszlo Ersek <lersek@redhat.com>
Thu, 24 Sep 2015 21:40:36 +0000 (21:40 +0000)
committerlersek <lersek@Edk2>
Thu, 24 Sep 2015 21:40:36 +0000 (21:40 +0000)
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 <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18544 6f19259b-4bc3-4df7-8a09-765794883524

ArmVirtPkg/ArmVirtPkg.dec
ArmVirtPkg/ArmVirtQemu.dsc
ArmVirtPkg/ArmVirtXen.dsc
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf

index d9870355157d2ee9cdc403ed396fef573fd3b1ca..89e8448a8443652525e83e20b7a6349bfea608a4 100644 (file)
@@ -67,6 +67,7 @@
 \r
   gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0|UINT64|0x00000004\r
   gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0|UINT64|0x00000005\r
+  gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress|0x0|UINT64|0x00000009\r
 \r
   #\r
   # Supported GIC revision (2, 3, ...)\r
index f1af96827fded08a35861a0de2e6b9f094626e30..9e40f39e4b7dca053b1dfbf82c2d52a94092a859 100644 (file)
 \r
   gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0\r
   gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0\r
+  gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress|0x0\r
 \r
   #\r
   # Set video resolution for boot options and for text setup.\r
index 5c19afca30b9a87fefe58d1cb73bdca591b259b0..ac37cd2a43453544dd750340e88d6840ef5420db 100644 (file)
 \r
   gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0\r
   gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0\r
+  gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress|0x0\r
 \r
   gArmVirtTokenSpaceGuid.PcdArmPsciMethod|0\r
 \r
index 73db63078ffbcddbdec278df003a449e0625e872..74f80d1d2b78bc30c1e2a56eb3e15b688f4b31a2 100644 (file)
@@ -302,6 +302,8 @@ InitializeVirtFdtDxe (
   UINT64                         FwCfgSelectorSize;\r
   UINT64                         FwCfgDataAddress;\r
   UINT64                         FwCfgDataSize;\r
+  UINT64                         FwCfgDmaAddress;\r
+  UINT64                         FwCfgDmaSize;\r
 \r
   Hob = GetFirstGuidHob(&gFdtHobGuid);\r
   if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) {\r
@@ -382,6 +384,19 @@ InitializeVirtFdtDxe (
 \r
       DEBUG ((EFI_D_INFO, "Found FwCfg @ 0x%Lx/0x%Lx\n", FwCfgSelectorAddress,\r
         FwCfgDataAddress));\r
+\r
+      if (fdt64_to_cpu (((UINT64 *)RegProp)[1]) >= 0x18) {\r
+        FwCfgDmaAddress = FwCfgDataAddress + 0x10;\r
+        FwCfgDmaSize    = 0x08;\r
+\r
+        //\r
+        // See explanation above.\r
+        //\r
+        ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1);\r
+\r
+        PcdSet64 (PcdFwCfgDmaAddress, FwCfgDmaAddress);\r
+        DEBUG ((EFI_D_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress));\r
+      }\r
       break;\r
 \r
     case PropertyTypeVirtio:\r
index 657b4e88019d8d0debd464af80abe060eb872fe1..ee2503ac4a7e7b2e726f1e7a111d33a042fac7d9 100644 (file)
@@ -53,6 +53,7 @@
   gArmVirtTokenSpaceGuid.PcdArmPsciMethod\r
   gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress\r
   gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress\r
+  gArmVirtTokenSpaceGuid.PcdFwCfgDmaAddress\r
   gArmVirtTokenSpaceGuid.PcdArmGicRevision\r
   gArmTokenSpaceGuid.PcdGicDistributorBase\r
   gArmTokenSpaceGuid.PcdGicRedistributorsBase\r