This patch is also uploaded in the following Repo, for review:- https://github.com/ashrafj/edk2-staging/commit/bcaab03c212a8d6c3e23ab986aa3ec05b60dd61d
Thanks Ashraf > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Javeed, > Ashraf > Sent: Friday, November 1, 2019 8:40 PM > To: devel@edk2.groups.io > Cc: Wang, Jian J <jian.j.w...@intel.com>; Wu, Hao A <hao.a...@intel.com>; > Ni, Ray <ray...@intel.com> > Subject: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 04/12] > PciBusDxe: Inclusion of new PCI Platform Protocol 2 > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2194 > > The code changes are made to support the new PCI Platform Protocol, as well > as the legacy PCI Platform Protocol interfaces. > > The code change is made to consume the new interface to acquire the PCI > device-specific platform policy. > > This code change is made to support the enabling of the other PCI features in > the PCI Bus driver. > > Signed-off-by: Ashraf Javeed <ashraf.jav...@intel.com> > Cc: Jian J Wang <jian.j.w...@intel.com> > Cc: Hao A Wu <hao.a...@intel.com> > Cc: Ray Ni <ray...@intel.com> > --- > MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h | 2 ++ > MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf | 2 ++ > MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.c | 208 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++-- > MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.h | 18 > ++++++++++++++++++ > 4 files changed, 228 insertions(+), 2 deletions(-) > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > index 141c158..95a677b 100644 > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h > @@ -27,6 +27,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include > <Protocol/PciOverride.h> #include <Protocol/PciEnumerationComplete.h> > #include <Protocol/IoMmu.h> > +#include <Protocol/PciPlatform2.h> > +#include <Protocol/PciOverride2.h> > > #include <Library/DebugLib.h> > #include <Library/UefiDriverEntryPoint.h> diff --git > a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > index 4ce99ce..44dec53 100644 > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf > @@ -95,6 +95,8 @@ > gEfiLoadFile2ProtocolGuid ## SOMETIMES_PRODUCES > gEdkiiIoMmuProtocolGuid ## SOMETIMES_CONSUMES > gEfiLoadedImageDevicePathProtocolGuid ## CONSUMES > + gEfiPciPlatformProtocol2Guid ## SOMETIMES_CONSUMES > + gEfiPciOverrideProtocol2Guid ## SOMETIMES_CONSUMES > > [FeaturePcd] > gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport ## > CONSUMES > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.c > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.c > index 6f95794..238959e 100644 > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.c > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.c > @@ -14,6 +14,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > EFI_PCI_PLATFORM_PROTOCOL *mPciPlatformProtocol; > EFI_PCI_OVERRIDE_PROTOCOL *mPciOverrideProtocol; > > +EFI_PCI_PLATFORM_PROTOCOL2 *mPciPlatformProtocol2; > +EFI_PCI_OVERRIDE_PROTOCOL2 *mPciOverrideProtocol2; > > > /** > @@ -24,6 +26,29 @@ VOID > LocatePciPlatformProtocol ( > ) > { > + mPciPlatformProtocol2 = NULL; > + gBS->LocateProtocol ( > + &gEfiPciPlatformProtocol2Guid, > + NULL, > + (VOID **) &mPciPlatformProtocol2 > + ); > + > + // > + // If PCI Platform protocol doesn't exist, try to get Pci Override > Protocol. > + // > + if (mPciPlatformProtocol2 == NULL) { > + mPciOverrideProtocol2 = NULL; > + gBS->LocateProtocol ( > + &gEfiPciOverrideProtocol2Guid, > + NULL, > + (VOID **) &mPciOverrideProtocol2 > + ); > + } > + // > + // fetch the old PCI Platform Protocols if new are not installed // > + if (mPciOverrideProtocol2 == NULL) { > + > mPciPlatformProtocol = NULL; > gBS->LocateProtocol ( > &gEfiPciPlatformProtocolGuid, > @@ -42,6 +67,7 @@ LocatePciPlatformProtocol ( > (VOID **) &mPciOverrideProtocol > ); > } > + } > } > > /** > @@ -52,13 +78,17 @@ BOOLEAN > CheckPciPlatformProtocolInstall ( > ) > { > - > + if (mPciPlatformProtocol2 != NULL) { > + return TRUE; > + } else if (mPciOverrideProtocol2 != NULL) { > + return TRUE; > + } else { > if (mPciPlatformProtocol != NULL) { > return TRUE; > } else if (mPciOverrideProtocol != NULL){ > return TRUE; > } > - > + } > return FALSE; > } > > @@ -90,6 +120,32 @@ PciPlatformPreprocessController ( > ) > { > EFI_STATUS Status; > + > + if (mPciPlatformProtocol2 != NULL) { > + // > + // Call PlatformPci::PrepController() if the protocol is present. > + // > + Status = mPciPlatformProtocol2->PlatformPrepController ( > + mPciPlatformProtocol2, > + HostBridgeHandle, > + RootBridgeHandle, > + RootBridgePciAddress, > + Phase, > + ExecPhase > + ); > + } else if (mPciOverrideProtocol2 != NULL) { > + // > + // Call PlatformPci::PrepController() if the protocol is present. > + // > + Status = mPciOverrideProtocol2->PlatformPrepController ( > + mPciOverrideProtocol2, > + HostBridgeHandle, > + RootBridgeHandle, > + RootBridgePciAddress, > + Phase, > + ExecPhase > + ); > + } else { > if (mPciPlatformProtocol != NULL) { > // > // Call PlatformPci::PrepController() if the protocol is present. > @@ -120,6 +176,7 @@ PciPlatformPreprocessController ( > // > return EFI_NOT_FOUND; > } > + } > return Status; > } > > @@ -142,6 +199,21 @@ PciPlatformNotifyPhase ( { > EFI_STATUS Status; > > + if (mPciPlatformProtocol2 != NULL) { > + Status = mPciPlatformProtocol2->PlatformNotify ( > + mPciPlatformProtocol2, > + HostBridgeHandle, > + Phase, > + ExecPhase > + ); > + } else if (mPciOverrideProtocol2 != NULL) { > + Status = mPciOverrideProtocol2->PlatformNotify ( > + mPciOverrideProtocol2, > + HostBridgeHandle, > + Phase, > + ExecPhase > + ); > + } else { > > if (mPciPlatformProtocol != NULL) { > Status = mPciPlatformProtocol->PlatformNotify ( @@ -163,6 +235,7 @@ > PciPlatformNotifyPhase ( > // > return EFI_NOT_FOUND; > } > + } > return Status; > } > > @@ -179,6 +252,18 @@ PciGetPlatformPolicy ( > ) > { > EFI_STATUS Status; > + > + if (mPciPlatformProtocol2 != NULL) { > + Status = mPciPlatformProtocol2->GetPlatformPolicy ( > + mPciPlatformProtocol2, > + PciPolicy > + ); } else if > + (mPciOverrideProtocol2 != NULL) { > + Status = mPciOverrideProtocol2->GetPlatformPolicy ( > + mPciOverrideProtocol2, > + PciPolicy > + ); } else { > if (mPciPlatformProtocol != NULL) { > Status = mPciPlatformProtocol->GetPlatformPolicy ( > mPciPlatformProtocol, @@ -197,6 +282,7 > @@ > PciGetPlatformPolicy ( > // > return EFI_NOT_FOUND; > } > + } > return Status; > } > > @@ -223,6 +309,22 @@ GetPlatformPciOptionRom ( > EFI_STATUS Status; > VOID *PlatformOpRomBuffer; > UINTN PlatformOpRomSize; > + > + if (mPciPlatformProtocol2 != NULL) { > + Status = mPciPlatformProtocol2->GetPciRom ( > + mPciPlatformProtocol2, > + PciIoDevice->Handle, > + &PlatformOpRomBuffer, > + &PlatformOpRomSize > + ); } else if > + (mPciOverrideProtocol2 != NULL) { > + Status = mPciOverrideProtocol2->GetPciRom ( > + mPciOverrideProtocol2, > + PciIoDevice->Handle, > + &PlatformOpRomBuffer, > + &PlatformOpRomSize > + ); } else { > if (mPciPlatformProtocol != NULL) { > Status = mPciPlatformProtocol->GetPciRom ( > mPciPlatformProtocol, @@ -243,6 +345,7 > @@ > GetPlatformPciOptionRom ( > // > return EFI_NOT_FOUND; > } > + } > > if (!EFI_ERROR (Status)) { > PciIoDevice->EmbeddedRom = FALSE; > @@ -252,3 +355,104 @@ GetPlatformPciOptionRom ( > } > return Status; > } > + > +/** > + Generic routine to setup the PCI features as per its predetermined > defaults. > +**/ > +VOID > +SetupDefaultsDevicePlatformPolicy ( > + IN PCI_IO_DEVICE *PciDevice > + ) > +{ > +} > + > +/** > + Intermediate routine to either get the PCI device specific platform > +policies > + through the PCI Platform Protocol, or its alias the PCI Override Protocol. > + > + @param PciIoDevice A pointer to PCI_IO_DEVICE > + @param PciPlatformProtocol A pointer to EFI_PCI_PLATFORM_PROTOCOL2 > + > + @retval EFI_STATUS The direct status from the PCI Platform > Protocol > + @retval EFI_SUCCESS if on returning predetermined PCI features > defaults, > + for the case when protocol returns as > EFI_UNSUPPORTED > + to indicate PCI device exist and it has no > platform > + policy defined. > +**/ > +EFI_STATUS > +GetPciDevicePlatformPolicyEx ( > + IN PCI_IO_DEVICE *PciIoDevice, > + IN EFI_PCI_PLATFORM_PROTOCOL2 *PciPlatformProtocol > + ) > +{ > + EFI_PCI_PLATFORM_EXTENDED_POLICY PciPlatformExtendedPolicy; > + EFI_STATUS Status; > + > + ZeroMem (&PciPlatformExtendedPolicy, sizeof > + (EFI_PCI_PLATFORM_EXTENDED_POLICY)); > + Status = PciPlatformProtocol->GetDevicePolicy ( > + PciPlatformProtocol, > + PciIoDevice->Handle, > + &PciPlatformExtendedPolicy > + ); > + switch (Status) { > + case EFI_SUCCESS: > + // > + // platform chipset policies are returned for this PCI device > + // > + > + DEBUG (( > + DEBUG_INFO, "[device policy: platform]" > + )); > + return Status; > + > + case EFI_UNSUPPORTED: > + // > + // platform chipset policies are not provided for this PCI device > + // let the enumeration happen as per the PCI standard way > + // > + SetupDefaultsDevicePlatformPolicy (PciIoDevice); > + DEBUG (( > + DEBUG_INFO, "[device policy: default]" > + )); > + return EFI_SUCCESS; > + > + default: > + DEBUG (( > + DEBUG_ERROR, "[device policy: none (error)]" > + )); > + return Status; > + } > +} > + > +/** > + Gets the PCI device-specific platform policy from the PCI Platform > Protocol. > + If no PCI Platform protocol is published than setup the PCI feature > +to predetermined > + defaults, in order to align all the PCI devices in the PCI hierarchy, as > applicable. > + > + @param PciDevice A pointer to PCI_IO_DEVICE > + > + @retval EFI_STATUS The direct status from the PCI Platform Protocol > + @retval EFI_SUCCESS On return of predetermined PCI features defaults, for > + the case when protocol returns as EFI_UNSUPPORTED to > + indicate PCI device exist and it has no platform > policy > + defined. Also, on returns when no PCI Platform > Protocol > + exist. > +**/ > +EFI_STATUS > +GetPciDevicePlatformPolicy ( > + IN PCI_IO_DEVICE *PciDevice > + ) > +{ > + if (mPciPlatformProtocol2 != NULL) { > + return GetPciDevicePlatformPolicyEx (PciDevice, > +mPciPlatformProtocol2); > + } else if (mPciOverrideProtocol2 != NULL) { > + return GetPciDevicePlatformPolicyEx (PciDevice, > +mPciOverrideProtocol2); > + } else { > + // > + // new PCI Platform Protocol 2 is not installed; let the enumeration > happen > + // as per PCI standard way > + // > + SetupDefaultsDevicePlatformPolicy (PciDevice); > + return EFI_SUCCESS; > + } > +} > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.h > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.h > index c0d3b49..a13131c 100644 > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.h > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciPlatformSupport.h > @@ -106,4 +106,22 @@ GetPlatformPciOptionRom ( > IN PCI_IO_DEVICE *PciIoDevice > ); > > +/** > + Gets the PCI device-specific platform policy from the PCI Platform > Protocol. > + If no PCI Platform protocol is published than setup the PCI feature > +to predetermined > + defaults, in order to align all the PCI devices in the PCI hierarchy, as > applicable. > + > + @param PciDevice A pointer to PCI_IO_DEVICE > + > + @retval EFI_STATUS The direct status from the PCI Platform Protocol > + @retval EFI_SUCCESS On return of predetermined PCI features defaults, for > + the case when protocol returns as EFI_UNSUPPORTED to > + indicate PCI device exist and it has no platform > policy > + defined. Also, on returns when no PCI Platform > Protocol > + exist. > +**/ > +EFI_STATUS > +GetPciDevicePlatformPolicy ( > + IN PCI_IO_DEVICE *PciDevice > + ); > #endif > -- > 2.21.0.windows.1 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#50503): https://edk2.groups.io/g/devel/message/50503 Mute This Topic: https://groups.io/mt/55157306/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-