<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>