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

Message ID 20180228192421.17684-8-ard.biesheuvel@linaro.org
State New
Headers show
Series
  • SynQuacer ACPI support
Related show

Commit Message

Ard Biesheuvel Feb. 28, 2018, 7:24 p.m.
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(+)

-- 
2.11.0

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

Patch

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