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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to