From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga18.intel.com (mga18.intel.com []) by mx.groups.io with SMTP id smtpd.web12.5161.1572621011267459384 for ; Fri, 01 Nov 2019 08:10:12 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: ashraf.javeed@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Nov 2019 08:10:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,256,1569308400"; d="scan'208";a="194687061" Received: from pidsbabios005.gar.corp.intel.com ([10.223.9.183]) by orsmga008.jf.intel.com with ESMTP; 01 Nov 2019 08:10:10 -0700 From: "Javeed, Ashraf" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Ray Ni Subject: [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 04/12] PciBusDxe: Inclusion of new PCI Platform Protocol 2 Date: Fri, 1 Nov 2019 20:39:44 +0530 Message-Id: <20191101150952.3340-5-ashraf.javeed@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20191101150952.3340-1-ashraf.javeed@intel.com> References: <20191101150952.3340-1-ashraf.javeed@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Cc: Jian J Wang Cc: Hao A Wu Cc: Ray Ni --- 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 #include #include +#include +#include #include #include 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