<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
Hi Jeremy,</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
MADT -> MCFG (and in other patches as well, where you refer to MADT)</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
The other feedback that Ard provided makes sense to me as well.</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
A</div>
<div>
<div style="font-family: Consolas, Courier, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="Signature">
<div>
<div></div>
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
--</div>
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
Andrei Warkentin,</div>
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
Arm Enablement Architect,</div>
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
Cloud Platform Business Unit, VMware</div>
</div>
</div>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> devel@edk2.groups.io <devel@edk2.groups.io> on behalf of Jeremy Linton via groups.io <jeremy.linton=arm.com@groups.io><br>
<b>Sent:</b> Thursday, August 5, 2021 7:35 PM<br>
<b>To:</b> devel@edk2.groups.io <devel@edk2.groups.io><br>
<b>Cc:</b> pete@akeo.ie <pete@akeo.ie>; ardb+tianocore@kernel.org <ardb+tianocore@kernel.org>; Andrei Warkentin <awarkentin@vmware.com>; Sunny.Wang@arm.com <Sunny.Wang@arm.com>; samer.el-haj-mahmoud@arm.com <samer.el-haj-mahmoud@arm.com>; Jeremy Linton <jeremy.linton@arm.com><br>
<b>Subject:</b> [edk2-devel] [PATCH 3/5] Platform/RaspberryPi: Add PCIe SSDT</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Since we plan on toggling between XHCI and PCI the PCI<br>
root needs to be in its own SSDT. This is all thats needed<br>
of UEFI. The SMC conduit is provided directly to the running<br>
OS. When the OS detects this PCIe port, on a machine without<br>
a MADT it attempts to connect to the SMC conduit. The RPi<br>
definition doesn't have any power mgmt, and only provides<br>
a description of the root port.<br>
<br>
Signed-off-by: Jeremy Linton <jeremy.linton@arm.com><br>
---<br>
 Platform/RaspberryPi/AcpiTables/AcpiTables.inf     |   3 +<br>
 Platform/RaspberryPi/AcpiTables/Pci.asl            | 237 +++++++++++++++++++++<br>
 Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c |   6 +<br>
 3 files changed, 246 insertions(+)<br>
 create mode 100644 Platform/RaspberryPi/AcpiTables/Pci.asl<br>
<br>
diff --git a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf<br>
index f3e8d950c1..da2a6db85f 100644<br>
--- a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf<br>
+++ b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf<br>
@@ -39,6 +39,7 @@<br>
   Pptt.aslc<br>
   SsdtThermal.asl<br>
   Xhci.asl<br>
+  Pci.asl<br>
 <br>
 [Packages]<br>
   ArmPkg/ArmPkg.dec<br>
@@ -59,6 +60,8 @@<br>
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase<br>
   gArmTokenSpaceGuid.PcdGicDistributorBase<br>
   gBcm27xxTokenSpaceGuid.PcdBcm27xxPciCpuMmioAdr<br>
+  gBcm27xxTokenSpaceGuid.PcdBcm27xxPciBusMmioAdr<br>
+  gBcm27xxTokenSpaceGuid.PcdBcm27xxPciBusMmioLen<br>
   gBcm27xxTokenSpaceGuid.PcdBcm27xxPciRegBase<br>
   gBcm27xxTokenSpaceGuid.PcdBcmGenetRegistersAddress<br>
   gBcm283xTokenSpaceGuid.PcdBcm283xRegistersAddress<br>
diff --git a/Platform/RaspberryPi/AcpiTables/Pci.asl b/Platform/RaspberryPi/AcpiTables/Pci.asl<br>
new file mode 100644<br>
index 0000000000..34474f13ef<br>
--- /dev/null<br>
+++ b/Platform/RaspberryPi/AcpiTables/Pci.asl<br>
@@ -0,0 +1,237 @@<br>
+/** @file<br>
+ *<br>
+ *  Copyright (c) 2019 Linaro, Limited. All rights reserved.<br>
+ *  Copyright (c) 2021 Arm<br>
+ *<br>
+ *  SPDX-License-Identifier: BSD-2-Clause-Patent<br>
+ *<br>
+ **/<br>
+<br>
+#include <IndustryStandard/Bcm2711.h><br>
+<br>
+#include "AcpiTables.h"<br>
+<br>
+/*<br>
+ * The following can be used to remove parenthesis from<br>
+ * defined macros that the compiler complains about.<br>
+ */<br>
+#define ISOLATE_ARGS(...)               __VA_ARGS__<br>
+#define REMOVE_PARENTHESES(x)           ISOLATE_ARGS x<br>
+<br>
+#define SANITIZED_PCIE_CPU_MMIO_WINDOW  REMOVE_PARENTHESES(PCIE_CPU_MMIO_WINDOW)<br>
+#define SANITIZED_PCIE_MMIO_LEN         REMOVE_PARENTHESES(PCIE_BRIDGE_MMIO_LEN)<br>
+#define SANITIZED_PCIE_PCI_MMIO_BEGIN   REMOVE_PARENTHESES(PCIE_TOP_OF_MEM_WIN)<br>
+<br>
+/*<br>
+ * According to UEFI boot log for the VLI device on Pi 4.<br>
+ */<br>
+#define RT_REG_LENGTH                 0x1000<br>
+<br>
+// copy paste job from juno<br>
+#define LNK_DEVICE(Unique_Id, Link_Name, irq)                                 \<br>
+  Device(Link_Name) {                                                         \<br>
+      Name(_HID, EISAID("PNP0C0F"))                                           \<br>
+      Name(_UID, Unique_Id)                                                   \<br>
+      Name(_PRS, ResourceTemplate() {                                         \<br>
+          Interrupt(ResourceProducer, Level, ActiveHigh, Exclusive) { irq }   \<br>
+      })                                                                      \<br>
+      Method (_CRS, 0) { Return (_PRS) }                                      \<br>
+      Method (_SRS, 1) { }                                                    \<br>
+      Method (_DIS) { }                                                       \<br>
+  }<br>
+<br>
+#define PRT_ENTRY(Address, Pin, Link)                                                            \<br>
+        Package (4) {                                                                            \<br>
+            Address,    /* uses the same format as _ADR */                                       \<br>
+            Pin,        /* The PCI pin number of the device (0-INTA, 1-INTB, 2-INTC, 3-INTD). */ \<br>
+            Link,       /* Interrupt allocated via Link device. */                               \<br>
+            Zero        /* global system interrupt number (no used) */                           \<br>
+          }<br>
+#define ROOT_PRT_ENTRY(Pin, Link)   PRT_ENTRY(0x0000FFFF, Pin, Link)<br>
+<br>
+DefinitionBlock (__FILE__, "SSDT", 5, "RPIFDN", "RPI4PCIE", 2)<br>
+{<br>
+  Scope (\_SB_)<br>
+  {<br>
+<br>
+    Device (SCB0) {<br>
+      Name (_HID, "ACPI0004")<br>
+      Name (_UID, 0x0)<br>
+      Name (_CCA, 0x0)<br>
+<br>
+      Method (_CRS, 0, Serialized) {<br>
+        // Container devices with _DMA must have _CRS, <br>
+        // meaning SCB0 to provide all resources that<br>
+        // PCI0 consumes (except interrupts).<br>
+        Name (RBUF, ResourceTemplate () {<br>
+            QWordMemory (ResourceProducer,<br>
+                ,<br>
+                MinFixed,<br>
+                MaxFixed,<br>
+                NonCacheable,<br>
+                ReadWrite,<br>
+                0x0,<br>
+                SANITIZED_PCIE_CPU_MMIO_WINDOW, // MIN<br>
+                SANITIZED_PCIE_CPU_MMIO_WINDOW, // MAX<br>
+                0x0,<br>
+                0x1,                            // LEN<br>
+                ,<br>
+                ,<br>
+                MMIO<br>
+                )<br>
+        })<br>
+        CreateQwordField (RBUF, MMIO._MAX, MMBE)<br>
+        CreateQwordField (RBUF, MMIO._LEN, MMLE)<br>
+        Add (MMBE, RT_REG_LENGTH - 1, MMBE)<br>
+        Add (MMLE, RT_REG_LENGTH - 1, MMLE)<br>
+        Return (RBUF)<br>
+      }<br>
+<br>
+      Name (_DMA, ResourceTemplate() {<br>
+        // PCIe can only DMA to first 3GB with early SOC's<br>
+        // But we keep the restriction on the later ones<br>
+        // To avoid DMA translation problems.<br>
+        QWordMemory (ResourceProducer,<br>
+            ,<br>
+            MinFixed,<br>
+            MaxFixed,<br>
+            NonCacheable,<br>
+            ReadWrite,<br>
+            0x0,<br>
+            0x0,        // MIN<br>
+            0xbfffffff, // MAX<br>
+            0x0,        // TRA<br>
+            0xc0000000, // LEN<br>
+            ,<br>
+            ,<br>
+            )<br>
+      })<br>
+<br>
+      //<br>
+      // PCI Root Complex<br>
+      //<br>
+      LNK_DEVICE(1, LNKA, 175)<br>
+      LNK_DEVICE(2, LNKB, 176)<br>
+      LNK_DEVICE(3, LNKC, 177)<br>
+      LNK_DEVICE(4, LNKD, 178)<br>
+<br>
+      Device(PCI0)<br>
+      {<br>
+        Name(_HID, EISAID("PNP0A08")) // PCI Express Root Bridge<br>
+        Name(_CID, EISAID("PNP0A03")) // Compatible PCI Root Bridge<br>
+        Name(_SEG, Zero) // PCI Segment Group number<br>
+        Name(_BBN, Zero) // PCI Base Bus Number<br>
+        Name(_CCA, 0)    // Mark the PCI noncoherent<br>
+<br>
+        // Root Complex 0<br>
+        Device (RP0) {<br>
+         Name(_ADR, 0xF0000000)    // Dev 0, Func 0<br>
+        }<br>
+<br>
+        Name (_DMA, ResourceTemplate() {<br>
+          QWordMemory (ResourceConsumer,<br>
+            ,<br>
+            MinFixed,<br>
+            MaxFixed,<br>
+            NonCacheable,<br>
+            ReadWrite,<br>
+            0x0,<br>
+            0x0,        // MIN<br>
+            0xbfffffff, // MAX<br>
+            0x0,        // TRA<br>
+            0xc0000000, // LEN<br>
+            ,<br>
+            ,<br>
+            )<br>
+        })<br>
+<br>
+        // PCI Routing Table<br>
+        Name(_PRT, Package() {<br>
+          ROOT_PRT_ENTRY(0, LNKA),   // INTA<br>
+          ROOT_PRT_ENTRY(1, LNKB),   // INTB<br>
+          ROOT_PRT_ENTRY(2, LNKC),   // INTC<br>
+          ROOT_PRT_ENTRY(3, LNKD),   // INTD<br>
+        })<br>
+        // Root complex resources<br>
+        Method (_CRS, 0, Serialized) {<br>
+          Name (RBUF, ResourceTemplate () {<br>
+            WordBusNumber ( // Bus numbers assigned to this root<br>
+              ResourceProducer,<br>
+              MinFixed, MaxFixed, PosDecode,<br>
+              0,   // AddressGranularity<br>
+              0,   // AddressMinimum - Minimum Bus Number<br>
+              255, // AddressMaximum - Maximum Bus Number<br>
+              0,   // AddressTranslation - Set to 0<br>
+              256  // RangeLength - Number of Busses<br>
+            )<br>
+<br>
+            QWordMemory ( // 32-bit BAR Windows in 64-bit addr<br>
+              ResourceProducer, PosDecode,<br>
+              MinFixed, MaxFixed,<br>
+              NonCacheable, ReadWrite,        //cacheable? is that right?<br>
+              0x00000000,                     // Granularity<br>
+              0,                              // SANITIZED_PCIE_PCI_MMIO_BEGIN<br>
+              1,                              // SANITIZED_PCIE_MMIO_LEN + SANITIZED_PCIE_PCI_MMIO_BEGIN<br>
+              SANITIZED_PCIE_CPU_MMIO_WINDOW, // SANITIZED_PCIE_PCI_MMIO_BEGIN - SANITIZED_PCIE_CPU_MMIO_WINDOW<br>
+              2                               // SANITIZED_PCIE_MMIO_LEN + 1<br>
+              ,,,MMI1,,TypeTranslation<br>
+            )<br>
+          }) // end Name(RBUF)<br>
+<br>
+          // Work around ASL's inability to add in a resource definition<br>
+          // or for that matter compute the min,max,len properly<br>
+          CreateQwordField (RBUF, MMI1._MIN, MMIB)<br>
+          CreateQwordField (RBUF, MMI1._MAX, MMIE)<br>
+          CreateQwordField (RBUF, MMI1._TRA, MMIT)<br>
+          CreateQwordField (RBUF, MMI1._LEN, MMIL)<br>
+          Add (MMIB, SANITIZED_PCIE_PCI_MMIO_BEGIN, MMIB)<br>
+          Add (SANITIZED_PCIE_MMIO_LEN, SANITIZED_PCIE_PCI_MMIO_BEGIN, MMIE)<br>
+          Subtract (MMIT, SANITIZED_PCIE_PCI_MMIO_BEGIN, MMIT)<br>
+          Add (SANITIZED_PCIE_MMIO_LEN, 1 , MMIL)<br>
+<br>
+          Return (RBUF)<br>
+        } // end Method(_CRS)<br>
+        //<br>
+        // OS Control Handoff<br>
+        //<br>
+        Name(SUPP, Zero) // PCI _OSC Support Field value<br>
+        Name(CTRL, Zero) // PCI _OSC Control Field value<br>
+<br>
+        // See [1] 6.2.10, [2] 4.5<br>
+        Method(_OSC,4) {<br>
+          // Note, This code is very similar to the code in the PCIe firmware<br>
+          // specification which can be used as a reference<br>
+          // Check for proper UUID<br>
+          If(LEqual(Arg0,ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {<br>
+            // Create DWord-adressable fields from the Capabilities Buffer<br>
+            CreateDWordField(Arg3,0,CDW1)<br>
+            CreateDWordField(Arg3,4,CDW2)<br>
+            CreateDWordField(Arg3,8,CDW3)<br>
+            // Save Capabilities DWord2 & 3<br>
+            Store(CDW2,SUPP)<br>
+            Store(CDW3,CTRL)<br>
+            // Mask out Native HotPlug<br>
+            And(CTRL,0x1E,CTRL)<br>
+            // Always allow native PME, AER (no dependencies)<br>
+            // Never allow SHPC (no SHPC controller in this system)<br>
+            And(CTRL,0x1D,CTRL)<br>
+<br>
+            If(LNotEqual(Arg1,One)) { // Unknown revision<br>
+              Or(CDW1,0x08,CDW1)<br>
+            }<br>
+<br>
+            If(LNotEqual(CDW3,CTRL)) {  // Capabilities bits were masked<br>
+              Or(CDW1,0x10,CDW1)<br>
+            }<br>
+            // Update DWORD3 in the buffer<br>
+            Store(CTRL,CDW3)<br>
+            Return(Arg3)<br>
+          } Else {<br>
+            Or(CDW1,4,CDW1) // Unrecognized UUID<br>
+            Return(Arg3)<br>
+          }<br>
+        } // End _OSC<br>
+      } // PCI0<br>
+    } //end SCB0<br>
+  } //end scope sb<br>
+} //end definition block<br>
diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c<br>
index 7c5786303d..4c40820858 100644<br>
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c<br>
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c<br>
@@ -821,6 +821,12 @@ STATIC CONST NAMESPACE_TABLES SdtTables[] = {<br>
     PcdToken(PcdXhciPci),<br>
     NULL<br>
   },<br>
+  {<br>
+    SIGNATURE_64 ('R', 'P', 'I', '4', 'P', 'C', 'I', 'E'),<br>
+    PcdToken(PcdXhciPci),<br>
+    0,<br>
+    NULL<br>
+  },<br>
 #endif<br>
   { // DSDT<br>
     SIGNATURE_64 ('R', 'P', 'I', 0, 0, 0, 0, 0),<br>
-- <br>
2.13.7<br>
<br>
<br>
<br>
-=-=-=-=-=-=<br>
Groups.io Links: You receive all messages sent to this group.<br>
View/Reply Online (#78737): <a href="https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fedk2.groups.io%2Fg%2Fdevel%2Fmessage%2F78737&amp;data=04%7C01%7Cawarkentin%40vmware.com%7C991285544b1540eaa12908d9582f2169%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C637637781724835660%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=OE2b%2FCjUQIDZcMX%2BrrijX30WNaNI5GyS6h2O9gfPs94%3D&amp;reserved=0">
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fedk2.groups.io%2Fg%2Fdevel%2Fmessage%2F78737&amp;data=04%7C01%7Cawarkentin%40vmware.com%7C991285544b1540eaa12908d9582f2169%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C637637781724835660%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=OE2b%2FCjUQIDZcMX%2BrrijX30WNaNI5GyS6h2O9gfPs94%3D&amp;reserved=0</a><br>
Mute This Topic: <a href="https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgroups.io%2Fmt%2F84688699%2F4387333&amp;data=04%7C01%7Cawarkentin%40vmware.com%7C991285544b1540eaa12908d9582f2169%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C637637781724835660%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=Sg96lV58XqE6pN%2BeL8QXmQnX%2Bc%2BN02lLNHkMVXZpfi4%3D&amp;reserved=0">
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgroups.io%2Fmt%2F84688699%2F4387333&amp;data=04%7C01%7Cawarkentin%40vmware.com%7C991285544b1540eaa12908d9582f2169%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C637637781724835660%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=Sg96lV58XqE6pN%2BeL8QXmQnX%2Bc%2BN02lLNHkMVXZpfi4%3D&amp;reserved=0</a><br>
Group Owner: devel+owner@edk2.groups.io<br>
Unsubscribe: <a href="https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fedk2.groups.io%2Fg%2Fdevel%2Funsub&amp;data=04%7C01%7Cawarkentin%40vmware.com%7C991285544b1540eaa12908d9582f2169%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C637637781724835660%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=yRoA%2FnUZ1u8Q1Xryo2r1%2BjWLhYJFk76nvx0aGR36VG8%3D&amp;reserved=0">
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fedk2.groups.io%2Fg%2Fdevel%2Funsub&amp;data=04%7C01%7Cawarkentin%40vmware.com%7C991285544b1540eaa12908d9582f2169%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C637637781724835660%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=yRoA%2FnUZ1u8Q1Xryo2r1%2BjWLhYJFk76nvx0aGR36VG8%3D&amp;reserved=0</a>
 [awarkentin@vmware.com]<br>
-=-=-=-=-=-=<br>
<br>
<br>
</div>
</span></font></div>
</body>
</html>


 <div width="1" style="color:white;clear:both">_._,_._,_</div> <hr>   Groups.io Links:<p>   You receive all messages sent to this group.    <p> <a target="_blank" href="https://edk2.groups.io/g/devel/message/78811">View/Reply Online (#78811)</a> |    |  <a target="_blank" href="https://groups.io/mt/84688699/1813853">Mute This Topic</a>  | <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>    <a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> | <a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |  <a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>  [edk2-devel-archive@redhat.com]<br> <div width="1" style="color:white;clear:both">_._,_._,_</div>