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 (#49808): https://edk2.groups.io/g/devel/message/49808
Mute This Topic: https://groups.io/mt/40419685/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to