From cfc8d51c0cbf97b5e71cfd92dcc6c5760940214f Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Thu, 15 Sep 2016 14:15:14 +0100 Subject: [PATCH] ArmVirtPkg/FdtClientDxe: report address and size cell count directly The FDT client protocol methods dealing with "reg" properties return the size of a "reg" element. Currently, we have hardcoded this as '8', since #address-cells == #size-cells == 2 in most cases. However, for different values, have a single 'reg' element size is not unambiguous, since - however unlikely - if #address-cells != #size-cells, we do not know which is which. So before adding more methods to the protocol, fix up this oversight. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- ArmVirtPkg/FdtClientDxe/FdtClientDxe.c | 6 ++++-- ArmVirtPkg/Include/Protocol/FdtClient.h | 3 ++- .../Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c | 9 ++++++--- ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c | 9 ++++++--- ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c | 8 ++++++-- ArmVirtPkg/XenioFdtDxe/XenioFdtDxe.c | 10 +++++++--- 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c index 2063a59732..382e9af6bf 100644 --- a/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c +++ b/ArmVirtPkg/FdtClientDxe/FdtClientDxe.c @@ -159,7 +159,8 @@ FindCompatibleNodeReg ( IN FDT_CLIENT_PROTOCOL *This, IN CONST CHAR8 *CompatibleString, OUT CONST VOID **Reg, - OUT UINT32 *RegElemSize, + OUT UINTN *AddressCells, + OUT UINTN *SizeCells, OUT UINT32 *RegSize ) { @@ -185,7 +186,8 @@ FindCompatibleNodeReg ( return EFI_NOT_FOUND; } - *RegElemSize = 8; + *AddressCells = 2; + *SizeCells = 2; return EFI_SUCCESS; } diff --git a/ArmVirtPkg/Include/Protocol/FdtClient.h b/ArmVirtPkg/Include/Protocol/FdtClient.h index 79a8f3ce1b..b593c74414 100644 --- a/ArmVirtPkg/Include/Protocol/FdtClient.h +++ b/ArmVirtPkg/Include/Protocol/FdtClient.h @@ -80,7 +80,8 @@ EFI_STATUS IN FDT_CLIENT_PROTOCOL *This, IN CONST CHAR8 *CompatibleString, OUT CONST VOID **Reg, - OUT UINT32 *RegElemSize, + OUT UINTN *AddressCells, + OUT UINTN *SizeCells, OUT UINT32 *RegSize ); diff --git a/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c b/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c index a1cd2da2d4..64afc4de6b 100644 --- a/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c +++ b/ArmVirtPkg/Library/ArmVirtGicArchLib/ArmVirtGicArchLib.c @@ -36,7 +36,8 @@ ArmVirtGicArchLibConstructor ( UINT32 IccSre; FDT_CLIENT_PROTOCOL *FdtClient; CONST UINT64 *Reg; - UINT32 RegElemSize, RegSize; + UINT32 RegSize; + UINTN AddressCells, SizeCells; UINTN GicRevision; EFI_STATUS Status; UINT64 DistBase, CpuBase, RedistBase; @@ -47,11 +48,13 @@ ArmVirtGicArchLibConstructor ( GicRevision = 2; Status = FdtClient->FindCompatibleNodeReg (FdtClient, "arm,cortex-a15-gic", - (CONST VOID **)&Reg, &RegElemSize, &RegSize); + (CONST VOID **)&Reg, &AddressCells, &SizeCells, + &RegSize); if (Status == EFI_NOT_FOUND) { GicRevision = 3; Status = FdtClient->FindCompatibleNodeReg (FdtClient, "arm,gic-v3", - (CONST VOID **)&Reg, &RegElemSize, &RegSize); + (CONST VOID **)&Reg, &AddressCells, &SizeCells, + &RegSize); } if (EFI_ERROR (Status)) { return Status; diff --git a/ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c b/ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c index 377262563e..8ecbe3fb5f 100644 --- a/ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c +++ b/ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c @@ -122,7 +122,8 @@ QemuFwCfgInitialize ( EFI_STATUS Status; FDT_CLIENT_PROTOCOL *FdtClient; CONST UINT64 *Reg; - UINT32 RegElemSize, RegSize; + UINT32 RegSize; + UINTN AddressCells, SizeCells; UINT64 FwCfgSelectorAddress; UINT64 FwCfgSelectorSize; UINT64 FwCfgDataAddress; @@ -135,7 +136,8 @@ QemuFwCfgInitialize ( ASSERT_EFI_ERROR (Status); Status = FdtClient->FindCompatibleNodeReg (FdtClient, "qemu,fw-cfg-mmio", - (CONST VOID **)&Reg, &RegElemSize, &RegSize); + (CONST VOID **)&Reg, &AddressCells, &SizeCells, + &RegSize); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_WARN, "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", @@ -143,7 +145,8 @@ QemuFwCfgInitialize ( return EFI_SUCCESS; } - ASSERT (RegElemSize == sizeof (UINT64)); + ASSERT (AddressCells == 2); + ASSERT (SizeCells == 2); ASSERT (RegSize == 2 * sizeof (UINT64)); FwCfgDataAddress = SwapBytes64 (Reg[0]); diff --git a/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c b/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c index 37aea80628..203946f97b 100644 --- a/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c +++ b/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c @@ -45,7 +45,8 @@ GetXenArmAcpiRsdp ( EFI_STATUS Status; FDT_CLIENT_PROTOCOL *FdtClient; CONST UINT64 *Reg; - UINT32 RegElemSize, RegSize; + UINT32 RegSize; + UINTN AddressCells, SizeCells; UINT64 RegBase; UINT8 Sum; @@ -59,13 +60,16 @@ GetXenArmAcpiRsdp ( ASSERT_EFI_ERROR (Status); Status = FdtClient->FindCompatibleNodeReg (FdtClient, "xen,guest-acpi", - (CONST VOID **)&Reg, &RegElemSize, &RegSize); + (CONST VOID **)&Reg, &AddressCells, &SizeCells, + &RegSize); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_WARN, "%a: No 'xen,guest-acpi' compatible DT node found\n", __FUNCTION__)); return EFI_NOT_FOUND; } + ASSERT (AddressCells == 2); + ASSERT (SizeCells == 2); ASSERT (RegSize == 2 * sizeof (UINT64)); RegBase = SwapBytes64(Reg[0]); diff --git a/ArmVirtPkg/XenioFdtDxe/XenioFdtDxe.c b/ArmVirtPkg/XenioFdtDxe/XenioFdtDxe.c index 4a88db3217..ae012a76f5 100644 --- a/ArmVirtPkg/XenioFdtDxe/XenioFdtDxe.c +++ b/ArmVirtPkg/XenioFdtDxe/XenioFdtDxe.c @@ -31,7 +31,8 @@ InitializeXenioFdtDxe ( EFI_STATUS Status; FDT_CLIENT_PROTOCOL *FdtClient; CONST UINT64 *Reg; - UINT32 RegElemSize, RegSize; + UINT32 RegSize; + UINTN AddressCells, SizeCells; EFI_HANDLE Handle; UINT64 RegBase; @@ -40,14 +41,17 @@ InitializeXenioFdtDxe ( ASSERT_EFI_ERROR (Status); Status = FdtClient->FindCompatibleNodeReg (FdtClient, "xen,xen", - (CONST VOID **)&Reg, &RegElemSize, &RegSize); + (CONST VOID **)&Reg, &AddressCells, &SizeCells, + &RegSize); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_WARN, "%a: No 'xen,xen' compatible DT node found\n", __FUNCTION__)); return EFI_UNSUPPORTED; } - ASSERT (RegSize == 16); + ASSERT (AddressCells == 2); + ASSERT (SizeCells == 2); + ASSERT (RegSize == 2 * sizeof (UINT64)); // // Retrieve the reg base from this node and wire it up to the -- 2.39.2