[edk2] [PATCH edk2-platforms v2 7/7] Silicon/SynQuacer/AcpiTables: take presence detect of PCI0 into account

Ard Biesheuvel posted 7 patches 6 years, 9 months ago
[edk2] [PATCH edk2-platforms v2 7/7] Silicon/SynQuacer/AcpiTables: take presence detect of PCI0 into account
Posted by Ard Biesheuvel 6 years, 9 months ago
On the SynQuacer Evalution Board, PCIe RC #0 is not clocked if no card
is inserted into the PCIe slot, and so any attempt to access the device
registers will lock up the system.

So let's check the presence detect pin directly in the _STA implementation
of PCI0. This needs to be done before the config space check, because that
access itself will lock the system if no card is inserted.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl | 15 +++++++++++++++
 Silicon/Socionext/SynQuacer/AcpiTables/AcpiTables.inf      |  1 +
 2 files changed, 16 insertions(+)

diff --git a/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl b/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl
index 5ffed663e17d..db529aa95220 100644
--- a/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl
+++ b/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl
@@ -14,6 +14,7 @@
 
 **/
 
+#include <Platform/MemoryMap.h>
 #include <Platform/Pcie.h>
 
 #include "AcpiTables.h"
@@ -37,7 +38,21 @@ DefinitionBlock ("SsdtPci.aml", "SSDT", 1, "SNI", "SYNQUACR",
             VPID, 16,
         }
 
+        OperationRegion (GPIO, SystemMemory, SYNQUACER_GPIO_BASE, 8)
+        Field (GPIO, DWordAcc, NoLock, Preserve) {
+          , 39,
+          PRDT, 1,
+          , 24,
+        }
+
         Method (_STA, 0x0, Serialized) {
+            If (!LEqual (FixedPcdGet8 (PcdPcie0PresenceDetectGpioPin), 0xff)) {
+                Store (PRDT, local0)
+                If (!LEqual (local0, 0x0)) {
+                    Return (0x0)
+                }
+            }
+
             //
             // Check whether the VID/PID of device #1 on bus #0 equals 0xffff.
             // If this is not the case, we are dealing with a ghost device,
diff --git a/Silicon/Socionext/SynQuacer/AcpiTables/AcpiTables.inf b/Silicon/Socionext/SynQuacer/AcpiTables/AcpiTables.inf
index b1b6bbaa481d..bca8354d1184 100644
--- a/Silicon/Socionext/SynQuacer/AcpiTables/AcpiTables.inf
+++ b/Silicon/Socionext/SynQuacer/AcpiTables/AcpiTables.inf
@@ -62,3 +62,4 @@ [FixedPcd]
 
   gSynQuacerTokenSpaceGuid.PcdNetsecEepromBase
   gSynQuacerTokenSpaceGuid.PcdNetsecPhyAddress
+  gSynQuacerTokenSpaceGuid.PcdPcie0PresenceDetectGpioPin
-- 
2.11.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel