<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);">
<span style="background-color:rgb(255, 255, 255);display:inline !important">Reviewed-by: Andrei Warkentin <awarkentin@vmware.com></span><br>
</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> Jeremy Linton <jeremy.linton@arm.com><br>
<b>Sent:</b> Thursday, August 19, 2021 11:16 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> [PATCH v3 1/7] Platform/RaspberryPi: Add XHCI/PCI selection menu</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Arm has standardized a PCI SMC conduit that can be used<br>
to access the PCI config space in a standardized way. This<br>
functionality doesn't yet exist in many OS/Distro's. Lets<br>
add another advanced config item that allows the user<br>
to toggle between presenting the XHCI on the base RPi4<br>
as a platform device, or presenting this newer PCIe<br>
conduit. The CM4 doesn't have an attached XHCI controller<br>
soldered to the PCIe, so PCIe mode is the default.<br>
<br>
Signed-off-by: Jeremy Linton <jeremy.linton@arm.com><br>
---<br>
 Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c | 42 ++++++++++++++++++++++<br>
 .../RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf    |  1 +<br>
 .../RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.uni |  5 +++<br>
 .../RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.vfr | 17 +++++++++<br>
 Platform/RaspberryPi/Include/ConfigVars.h          |  4 +++<br>
 Platform/RaspberryPi/RPi3/RPi3.dsc                 |  6 ++++<br>
 Platform/RaspberryPi/RPi4/RPi4.dsc                 |  8 +++++<br>
 Platform/RaspberryPi/RaspberryPi.dec               |  1 +<br>
 8 files changed, 84 insertions(+)<br>
<br>
diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c<br>
index 9e78cb47ad..87f6b4e7bb 100644<br>
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c<br>
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c<br>
@@ -43,6 +43,7 @@ extern UINT8 ConfigDxeStrings[];<br>
 STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;<br>
 STATIC UINT32 mModelFamily = 0;<br>
 STATIC UINT32 mModelInstalledMB = 0;<br>
+STATIC UINT32 mModelRevision = 0;<br>
 <br>
 STATIC EFI_MAC_ADDRESS  mMacAddress;<br>
 <br>
@@ -271,6 +272,40 @@ SetupVariables (<br>
     ASSERT_EFI_ERROR (Status);<br>
   }<br>
 <br>
+  if (mModelFamily >= 4) {<br>
+    if (((mModelRevision >> 4) & 0xFF) == 0x14) {<br>
+      /*<br>
+       * Enable PCIe by default on CM4<br>
+       */<br>
+      Status = PcdSet32S (PcdXhciPci, 2);<br>
+      ASSERT_EFI_ERROR (Status);<br>
+    } else {<br>
+      Size = sizeof (UINT32);<br>
+      Status = gRT->GetVariable (L"XhciPci",<br>
+                                 &gConfigDxeFormSetGuid,<br>
+                                 NULL, &Size, &Var32);<br>
+      if (EFI_ERROR (Status) || (Var32 == 0)) {<br>
+        /*<br>
+         * Enable XHCI by default<br>
+         */<br>
+        Status = PcdSet32S (PcdXhciPci, 0);<br>
+        ASSERT_EFI_ERROR (Status);<br>
+      } else {<br>
+        /* <br>
+         * Enable PCIe<br>
+         */<br>
+        Status = PcdSet32S (PcdXhciPci, 1);<br>
+        ASSERT_EFI_ERROR (Status);<br>
+      }<br>
+    }<br>
+  } else {<br>
+    /* <br>
+     * Disable PCIe and XHCI<br>
+     */<br>
+    Status = PcdSet32S (PcdXhciPci, 0);<br>
+    ASSERT_EFI_ERROR (Status);<br>
+  }<br>
+<br>
   Size = sizeof (AssetTagVar);<br>
   Status = gRT->GetVariable (L"AssetTag",<br>
                   &gConfigDxeFormSetGuid,<br>
@@ -888,6 +923,13 @@ ConfigInitialize (<br>
     DEBUG ((DEBUG_INFO, "Current Raspberry Pi installed RAM size is %d MB\n", mModelInstalledMB));<br>
   }<br>
 <br>
+  Status = mFwProtocol->GetModelRevision (&mModelRevision);<br>
+  if (Status != EFI_SUCCESS) {<br>
+    DEBUG ((DEBUG_ERROR, "Couldn't get the Raspberry Pi revision: %r\n", Status));<br>
+  } else {<br>
+    DEBUG ((DEBUG_INFO, "Current Raspberry Pi revision %x\n", mModelRevision));<br>
+  }<br>
+<br>
   Status = SetupVariables ();<br>
   if (Status != EFI_SUCCESS) {<br>
     DEBUG ((DEBUG_ERROR, "Couldn't not setup NV vars: %r\n", Status));<br>
diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf<br>
index 4bb2d08550..e6e22ad82e 100644<br>
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf<br>
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf<br>
@@ -94,6 +94,7 @@<br>
   gRaspberryPiTokenSpaceGuid.PcdFanOnGpio<br>
   gRaspberryPiTokenSpaceGuid.PcdFanTemp<br>
   gRaspberryPiTokenSpaceGuid.PcdUartInUse<br>
+  gRaspberryPiTokenSpaceGuid.PcdXhciPci<br>
 <br>
 [Depex]<br>
   gPcdProtocolGuid AND gRaspberryPiFirmwareProtocolGuid<br>
diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.uni b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.uni<br>
index 466fa852cb..5ec17072c3 100644<br>
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.uni<br>
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.uni<br>
@@ -57,6 +57,11 @@<br>
 #string STR_ADVANCED_FANTEMP_PROMPT   #language en-US "ACPI fan temperature"<br>
 #string STR_ADVANCED_FANTEMP_HELP     #language en-US "Cycle a fan at C"<br>
 <br>
+#string STR_ADVANCED_XHCIPCI_PROMPT   #language en-US "ACPI XHCI/PCIe"<br>
+#string STR_ADVANCED_XHCIPCI_HELP     #language en-US "OS sees XHCI USB platform device or PCIe bridge"<br>
+#string STR_ADVANCED_XHCIPCI_XHCI     #language en-US "XHCI"<br>
+#string STR_ADVANCED_XHCIPCI_PCIE     #language en-US "PCIe"<br>
+<br>
 #string STR_ADVANCED_ASSET_TAG_PROMPT #language en-US "Asset Tag"<br>
 #string STR_ADVANCED_ASSET_TAG_HELP   #language en-US "Set the system Asset Tag"<br>
 <br>
diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.vfr b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.vfr<br>
index fa34eab809..18b3ec726e 100644<br>
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.vfr<br>
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxeHii.vfr<br>
@@ -56,6 +56,11 @@ formset<br>
       name  = FanTemp,<br>
       guid  = CONFIGDXE_FORM_SET_GUID;<br>
 <br>
+    efivarstore ADVANCED_XHCIPCI_VARSTORE_DATA,<br>
+      attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,<br>
+      name  = XhciPci,<br>
+      guid  = CONFIGDXE_FORM_SET_GUID;<br>
+<br>
     efivarstore SYSTEM_TABLE_MODE_VARSTORE_DATA,<br>
       attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,<br>
       name  = SystemTableMode,<br>
@@ -212,6 +217,18 @@ formset<br>
               default = 60,<br>
           endnumeric;<br>
         endif;<br>
+<br>
+        suppressif ideqval XhciPci.Value == 2;<br>
+          grayoutif NOT ideqval SystemTableMode.Mode == SYSTEM_TABLE_MODE_ACPI;<br>
+            oneof varid = XhciPci.Value,<br>
+              prompt      = STRING_TOKEN(STR_ADVANCED_XHCIPCI_PROMPT),<br>
+              help        = STRING_TOKEN(STR_ADVANCED_XHCIPCI_HELP),<br>
+              flags       = NUMERIC_SIZE_4 | INTERACTIVE | RESET_REQUIRED,<br>
+              option text = STRING_TOKEN(STR_ADVANCED_XHCIPCI_XHCI), value = 0, flags = DEFAULT;<br>
+              option text = STRING_TOKEN(STR_ADVANCED_XHCIPCI_PCIE), value = 1, flags = 0;<br>
+            endoneof;<br>
+          endif;<br>
+        endif;<br>
 #endif<br>
         string varid = AssetTag.AssetTag,<br>
             prompt  = STRING_TOKEN(STR_ADVANCED_ASSET_TAG_PROMPT),<br>
diff --git a/Platform/RaspberryPi/Include/ConfigVars.h b/Platform/RaspberryPi/Include/ConfigVars.h<br>
index 142317985a..a5b32b5284 100644<br>
--- a/Platform/RaspberryPi/Include/ConfigVars.h<br>
+++ b/Platform/RaspberryPi/Include/ConfigVars.h<br>
@@ -77,6 +77,10 @@ typedef struct {<br>
 } ADVANCED_FANTEMP_VARSTORE_DATA;<br>
 <br>
 typedef struct {<br>
+  UINT32 Value;<br>
+} ADVANCED_XHCIPCI_VARSTORE_DATA;<br>
+<br>
+typedef struct {<br>
 #define SYSTEM_TABLE_MODE_ACPI 0<br>
 #define SYSTEM_TABLE_MODE_BOTH 1<br>
 #define SYSTEM_TABLE_MODE_DT   2<br>
diff --git a/Platform/RaspberryPi/RPi3/RPi3.dsc b/Platform/RaspberryPi/RPi3/RPi3.dsc<br>
index 1c8a5408e7..6ab5d1ae6d 100644<br>
--- a/Platform/RaspberryPi/RPi3/RPi3.dsc<br>
+++ b/Platform/RaspberryPi/RPi3/RPi3.dsc<br>
@@ -520,6 +520,12 @@<br>
 <br>
   gRaspberryPiTokenSpaceGuid.PcdPlatformResetDelay|L"ResetDelay"|gRaspberryPiTokenSpaceGuid|0x0|0<br>
 <br>
+  # Select XHCI/PCIe mode (not valid on rpi3)<br>
+  #<br>
+  # 0  - DISABLED<br>
+  #<br>
+  gRaspberryPiTokenSpaceGuid.PcdXhciPci|L"XhciPci"|gConfigDxeFormSetGuid|0x0|0<br>
+<br>
   #<br>
   # Common UEFI ones.<br>
   #<br>
diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc<br>
index dcf9bb5f11..babcbb2f41 100644<br>
--- a/Platform/RaspberryPi/RPi4/RPi4.dsc<br>
+++ b/Platform/RaspberryPi/RPi4/RPi4.dsc<br>
@@ -536,6 +536,14 @@<br>
 <br>
   gRaspberryPiTokenSpaceGuid.PcdPlatformResetDelay|L"ResetDelay"|gRaspberryPiTokenSpaceGuid|0x0|0<br>
 <br>
+  # Select XHCI/PCIe mode<br>
+  #<br>
+  # 0  - XHCI Enabled (default on !cm4)<br>
+  # 1  - PCIe Enabled<br>
+  # 2  - PCIe Enabled (default on cm4)<br>
+  #<br>
+  gRaspberryPiTokenSpaceGuid.PcdXhciPci|L"XhciPci"|gConfigDxeFormSetGuid|0x0|0<br>
+<br>
   #<br>
   # Common UEFI ones.<br>
   #<br>
diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec<br>
index 2ca25ff9e6..797be59274 100644<br>
--- a/Platform/RaspberryPi/RaspberryPi.dec<br>
+++ b/Platform/RaspberryPi/RaspberryPi.dec<br>
@@ -71,3 +71,4 @@<br>
   gRaspberryPiTokenSpaceGuid.PcdPlatformResetDelay|0|UINT32|0x0000001E<br>
   gRaspberryPiTokenSpaceGuid.PcdMmcEnableDma|0|UINT32|0x0000001F<br>
   gRaspberryPiTokenSpaceGuid.PcdUartInUse|1|UINT32|0x00000021<br>
+  gRaspberryPiTokenSpaceGuid.PcdXhciPci|0|UINT32|0x00000022<br>
-- <br>
2.13.7<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/79646">View/Reply Online (#79646)</a> |    |  <a target="_blank" href="https://groups.io/mt/85014309/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>