diff --git a/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c new file mode 100644 index 0000000000..cc60940d48 --- /dev/null +++ b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c @@ -0,0 +1,62 @@ +/** @file + FDT client library for consumers of PCI related dynamic PCDs + + Copyright (c) 2016, Linaro Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + +#include +#include +#include +#include + +#include + +RETURN_STATUS +EFIAPI +FdtPciPcdProducerLibConstructor ( + VOID + ) +{ + UINT64 PciExpressBaseAddress; + FDT_CLIENT_PROTOCOL *FdtClient; + CONST UINT64 *Reg; + UINT32 RegElemSize, RegSize; + EFI_STATUS Status; + + PciExpressBaseAddress = PcdGet64 (PcdPciExpressBaseAddress); + if (PciExpressBaseAddress != MAX_UINT64) { + return EFI_SUCCESS; + } + + Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, + (VOID **)&FdtClient); + ASSERT_EFI_ERROR (Status); + + Status = FdtClient->FindCompatibleNodeReg (FdtClient, + "pci-host-ecam-generic", (CONST VOID **)&Reg, + &RegElemSize, &RegSize); + + if (EFI_ERROR (Status)) { + PciExpressBaseAddress = 0; + } else { + ASSERT (RegElemSize == sizeof (UINT64)); + PciExpressBaseAddress = SwapBytes64 (*Reg); + + PcdSetBool (PcdPciDisableBusEnumeration, FALSE); + } + + PcdSet64 (PcdPciExpressBaseAddress, PciExpressBaseAddress); + + return RETURN_SUCCESS; +} diff --git a/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf new file mode 100644 index 0000000000..1ba71abea7 --- /dev/null +++ b/ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf @@ -0,0 +1,47 @@ +#/** @file +# FDT client library for consumers of PCI related dynamic PCDs +# +# Copyright (c) 2016, Linaro Ltd. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = FdtPciPcdProducerLib + FILE_GUID = D584275B-BF1E-4DF8-A53D-980F5645C5E7 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PciPcdProducerLib|DXE_DRIVER UEFI_DRIVER + CONSTRUCTOR = FdtPciPcdProducerLibConstructor + +[Sources] + FdtPciPcdProducerLib.c + +[Packages] + ArmVirtPkg/ArmVirtPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + PcdLib + UefiBootServicesTableLib + +[Protocols] + gFdtClientProtocolGuid ## CONSUMES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress ## PRODUCES + gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration ## PRODUCES + +[Depex] + gFdtClientProtocolGuid