Files
nix-config/packages/edk2/patches/platforms/0013-Platform-RPi5-Add-FDT-system-table-support.patch
2026-01-07 21:28:20 -06:00

390 lines
16 KiB
Diff

From cc780563b58b849e002358eaccf4afabcc6065da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mario=20B=C4=83l=C4=83nic=C4=83?=
<mariobalanica02@gmail.com>
Date: Fri, 5 Jan 2024 19:30:54 +0200
Subject: [PATCH 13/16] =?UTF-8?q?=EF=BB=BFPlatform/RPi5:=20Add=20FDT=20sys?=
=?UTF-8?q?tem=20table=20support?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Mario Bălănică <mariobalanica02@gmail.com>
---
Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c | 62 +++++++++-------
.../RaspberryPi/Drivers/FdtDxe/FdtDxe.inf | 4 +-
.../RPi5/Drivers/RpiPlatformDxe/ConfigTable.c | 17 +++++
.../Drivers/RpiPlatformDxe/RpiPlatformDxe.inf | 3 +
.../RpiPlatformDxe/RpiPlatformDxeHii.uni | 12 +++-
.../RpiPlatformDxe/RpiPlatformDxeHii.vfr | 71 ++++++++++++-------
Platform/RaspberryPi/RPi5/RPi5.dsc | 11 ++-
Platform/RaspberryPi/RPi5/RPi5.fdf | 2 +-
8 files changed, 125 insertions(+), 57 deletions(-)
diff --git a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c
index fadf262f..5ad3c708 100644
--- a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c
+++ b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.c
@@ -9,8 +9,11 @@
#include <PiDxe.h>
#include <Library/BaseLib.h>
+#include <Library/BoardInfoLib.h>
+#include <Library/BoardRevisionHelperLib.h>
#include <Library/DebugLib.h>
#include <Library/DxeServicesLib.h>
+#include <Library/FdtPlatformLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
@@ -22,6 +25,7 @@
STATIC VOID *mFdtImage;
STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
+STATIC UINT32 mBoardRevision;
STATIC
EFI_STATUS
@@ -461,9 +465,15 @@ FdtDxeInitialize (
(VOID**)&mFwProtocol);
ASSERT_EFI_ERROR (Status);
- FdtImage = (VOID*)(UINTN)PcdGet32 (PcdFdtBaseAddress);
- Retval = fdt_check_header (FdtImage);
- if (Retval != 0) {
+ Status = BoardInfoGetRevisionCode (&mBoardRevision);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR,
+ "%a: Failed to get board revision code. Status=%r\n",
+ __func__, Status));
+ }
+
+ FdtImage = FdtPlatformGetBase ();
+ if (FdtImage == NULL) {
/*
* Any one of:
* - Invalid config.txt device_tree_address (not PcdFdtBaseAddress)
@@ -497,39 +507,41 @@ FdtDxeInitialize (
* These are all best-effort.
*/
- Status = SanitizePSCI ();
- if (EFI_ERROR (Status)) {
- Print (L"Failed to sanitize PSCI: %r\n", Status);
- }
-
Status = CleanMemoryNodes ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to clean memory nodes: %r\n", Status);
+ DEBUG ((DEBUG_ERROR, "Failed to clean memory nodes: %r\n", Status));
}
Status = CleanSimpleFramebuffer ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to clean frame buffer: %r\n", Status);
+ DEBUG ((DEBUG_ERROR, "Failed to clean frame buffer: %r\n", Status));
}
- Status = FixEthernetAliases ();
- if (EFI_ERROR (Status)) {
- Print (L"Failed to fix ethernet aliases: %r\n", Status);
- }
+ if (BoardRevisionGetModelFamily (mBoardRevision) < 5) {
+ Status = SanitizePSCI ();
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to sanitize PSCI: %r\n", Status));
+ }
- Status = UpdateMacAddress ();
- if (EFI_ERROR (Status)) {
- Print (L"Failed to update MAC address: %r\n", Status);
- }
+ Status = FixEthernetAliases ();
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to fix ethernet aliases: %r\n", Status));
+ }
- Status = AddUsbCompatibleProperty ();
- if (EFI_ERROR (Status)) {
- Print (L"Failed to update USB compatible properties: %r\n", Status);
- }
+ Status = UpdateMacAddress ();
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to update MAC address: %r\n", Status));
+ }
- SyncPcie ();
- if (EFI_ERROR (Status)) {
- Print (L"Failed to update PCIe address ranges: %r\n", Status);
+ Status = AddUsbCompatibleProperty ();
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to update USB compatible properties: %r\n", Status));
+ }
+
+ Status = SyncPcie ();
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Failed to update PCIe address ranges: %r\n", Status));
+ }
}
DEBUG ((DEBUG_INFO, "Installed devicetree at address %p\n", mFdtImage));
diff --git a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
index 90e138af..1ea2fe40 100644
--- a/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
+++ b/Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
@@ -27,9 +27,12 @@
[LibraryClasses]
BaseLib
+ BoardInfoLib
+ BoardRevisionHelperLib
DebugLib
DxeServicesLib
FdtLib
+ FdtPlatformLib
MemoryAllocationLib
UefiBootServicesTableLib
UefiDriverEntryPoint
@@ -50,7 +53,6 @@
gBcm27xxTokenSpaceGuid.PcdBcm27xxPciBusMmioLen
gBcm27xxTokenSpaceGuid.PcdBcm27xxPciCpuMmioAdr
-
[Pcd]
gRaspberryPiTokenSpaceGuid.PcdSystemTableMode
gRaspberryPiTokenSpaceGuid.PcdXhciReload
diff --git a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/ConfigTable.c b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/ConfigTable.c
index da86e2e0..9aadb325 100644
--- a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/ConfigTable.c
+++ b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/ConfigTable.c
@@ -14,6 +14,7 @@
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Protocol/AcpiSystemDescriptionTable.h>
#include <RpiPlatformVarStoreData.h>
+#include <ConfigVars.h>
#include "ConfigTable.h"
@@ -108,6 +109,12 @@ ApplyConfigTableVariables (
{
EFI_STATUS Status;
+ if (PcdGet32 (PcdSystemTableMode) != SYSTEM_TABLE_MODE_ACPI
+ && PcdGet32 (PcdSystemTableMode) != SYSTEM_TABLE_MODE_BOTH) {
+ // FDT is taken care of by FdtDxe.
+ return;
+ }
+
Status = LocateAndInstallAcpiFromFvConditional (&mAcpiTableFile, NULL);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to install ACPI tables!\n"));
@@ -128,6 +135,7 @@ SetupConfigTableVariables (
{
EFI_STATUS Status;
UINTN Size;
+ UINT32 Var32;
AcpiSdCompatMode.Value = ACPI_SD_COMPAT_MODE_DEFAULT;
AcpiSdLimitUhs.Value = ACPI_SD_LIMIT_UHS_DEFAULT;
@@ -159,4 +167,13 @@ SetupConfigTableVariables (
&AcpiSdLimitUhs);
ASSERT_EFI_ERROR (Status);
}
+
+ Size = sizeof (UINT32);
+ Status = gRT->GetVariable (L"SystemTableMode",
+ &gRpiPlatformFormSetGuid,
+ NULL, &Size, &Var32);
+ if (EFI_ERROR (Status)) {
+ Status = PcdSet32S (PcdSystemTableMode, PcdGet32 (PcdSystemTableMode));
+ ASSERT_EFI_ERROR (Status);
+ }
}
diff --git a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxe.inf b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxe.inf
index b1cb4303..6bb48c3f 100644
--- a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxe.inf
+++ b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxe.inf
@@ -48,6 +48,9 @@
gEfiAcpiSdtProtocolGuid ## CONSUMES
gBrcmStbSdhciDeviceProtocolGuid ## PRODUCES
+[Pcd]
+ gRaspberryPiTokenSpaceGuid.PcdSystemTableMode
+
[Depex]
gEfiVariableArchProtocolGuid
AND gEfiVariableWriteArchProtocolGuid
diff --git a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.uni b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.uni
index 7f362922..5cb460f6 100644
--- a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.uni
+++ b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.uni
@@ -17,10 +17,16 @@
/*
* ACPI / Device Tree configuration
*/
-#string STR_CONFIG_TABLE_FORM_TITLE #language en-US "ACPI / Device Tree"
-#string STR_CONFIG_TABLE_FORM_HELP #language en-US "Configure the ACPI and Device Tree system tables support."
+#string STR_SYSTEM_TABLE_FORM_TITLE #language en-US "ACPI / Device Tree"
+#string STR_SYSTEM_TABLE_FORM_HELP #language en-US "Configure the ACPI and Device Tree system tables support."
-#string STR_CONFIG_TABLE_ACPI_SUBTITLE #language en-US "ACPI Configuration"
+#string STR_SYSTEM_TABLE_MODE_PROMPT #language en-US "System Table Mode"
+#string STR_SYSTEM_TABLE_MODE_HELP #language en-US "Choose what system tables to expose to the OS.\n\nACPI - provides basic hardware support (USB, SD) for most OS/kernel versions.\n\nDevice Tree - provides extensive hardware support specific to a kernel version.\nUEFI hands over the DTB and overlays passed by the VPU firmware, which reside in the boot partition.\n\nIf both are exposed, the OS will decide which one to use."
+#string STR_SYSTEM_TABLE_MODE_ACPI #language en-US "ACPI"
+#string STR_SYSTEM_TABLE_MODE_FDT #language en-US "Device Tree"
+#string STR_SYSTEM_TABLE_MODE_ACPI_FDT #language en-US "Both"
+
+#string STR_SYSTEM_TABLE_ACPI_SUBTITLE #language en-US "ACPI Configuration"
#string STR_ACPI_SD_SUBTITLE #language en-US "Broadcom SD Host Controller"
diff --git a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.vfr b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.vfr
index 65163f10..e5ee4b3e 100644
--- a/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.vfr
+++ b/Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxeHii.vfr
@@ -10,6 +10,7 @@
#include <Guid/HiiPlatformSetupFormset.h>
#include <Guid/RpiPlatformFormSetGuid.h>
#include <RpiPlatformVarStoreData.h>
+#include <ConfigVars.h>
#include "ConfigTable.h"
@@ -19,15 +20,20 @@ formset
help = STRING_TOKEN(STR_FORM_SET_TITLE_HELP),
classguid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID,
+ efivarstore SYSTEM_TABLE_MODE_VARSTORE_DATA,
+ attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ name = SystemTableMode,
+ guid = RPI_PLATFORM_FORMSET_GUID;
+
efivarstore ACPI_SD_COMPAT_MODE_VARSTORE_DATA,
- attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
- name = AcpiSdCompatMode,
- guid = RPI_PLATFORM_FORMSET_GUID;
+ attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ name = AcpiSdCompatMode,
+ guid = RPI_PLATFORM_FORMSET_GUID;
efivarstore ACPI_SD_LIMIT_UHS_VARSTORE_DATA,
- attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
- name = AcpiSdLimitUhs,
- guid = RPI_PLATFORM_FORMSET_GUID;
+ attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ name = AcpiSdLimitUhs,
+ guid = RPI_PLATFORM_FORMSET_GUID;
form formid = 1,
title = STRING_TOKEN(STR_FORM_SET_TITLE);
@@ -36,32 +42,45 @@ formset
subtitle text = STRING_TOKEN(STR_NULL_STRING);
goto 0x1000,
- prompt = STRING_TOKEN(STR_CONFIG_TABLE_FORM_TITLE),
- help = STRING_TOKEN(STR_CONFIG_TABLE_FORM_HELP);
+ prompt = STRING_TOKEN(STR_SYSTEM_TABLE_FORM_TITLE),
+ help = STRING_TOKEN(STR_SYSTEM_TABLE_FORM_HELP);
endform;
form formid = 0x1000,
- title = STRING_TOKEN(STR_CONFIG_TABLE_FORM_TITLE);
+ title = STRING_TOKEN(STR_SYSTEM_TABLE_FORM_TITLE);
+
+ oneof varid = SystemTableMode.Mode,
+ prompt = STRING_TOKEN(STR_SYSTEM_TABLE_MODE_PROMPT),
+ help = STRING_TOKEN(STR_SYSTEM_TABLE_MODE_HELP),
+ flags = NUMERIC_SIZE_4 | INTERACTIVE | RESET_REQUIRED,
+ default = SYSTEM_TABLE_MODE_ACPI,
+ option text = STRING_TOKEN(STR_SYSTEM_TABLE_MODE_ACPI), value = SYSTEM_TABLE_MODE_ACPI, flags = 0;
+ option text = STRING_TOKEN(STR_SYSTEM_TABLE_MODE_FDT), value = SYSTEM_TABLE_MODE_DT, flags = 0;
+ option text = STRING_TOKEN(STR_SYSTEM_TABLE_MODE_ACPI_FDT), value = SYSTEM_TABLE_MODE_BOTH, flags = 0;
+ endoneof;
- subtitle text = STRING_TOKEN(STR_CONFIG_TABLE_ACPI_SUBTITLE);
+ suppressif (get(SystemTableMode.Mode) != SYSTEM_TABLE_MODE_ACPI AND get(SystemTableMode.Mode) != SYSTEM_TABLE_MODE_BOTH);
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);
+ subtitle text = STRING_TOKEN(STR_SYSTEM_TABLE_ACPI_SUBTITLE);
- subtitle text = STRING_TOKEN(STR_NULL_STRING);
- subtitle text = STRING_TOKEN(STR_ACPI_SD_SUBTITLE);
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);
+ subtitle text = STRING_TOKEN(STR_ACPI_SD_SUBTITLE);
- oneof varid = AcpiSdCompatMode.Value,
- prompt = STRING_TOKEN(STR_ACPI_SD_COMPAT_MODE_PROMPT),
- help = STRING_TOKEN(STR_ACPI_SD_COMPAT_MODE_HELP),
- flags = NUMERIC_SIZE_1 | INTERACTIVE | RESET_REQUIRED,
- default = ACPI_SD_COMPAT_MODE_DEFAULT,
- option text = STRING_TOKEN(STR_ACPI_SD_COMPAT_BRCMSTB_BAYTRAIL), value = ACPI_SD_COMPAT_MODE_BRCMSTB_BAYTRAIL, flags = 0;
- option text = STRING_TOKEN(STR_ACPI_SD_COMPAT_FULL_BAYTRAIL), value = ACPI_SD_COMPAT_MODE_FULL_BAYTRAIL, flags = 0;
- endoneof;
+ oneof varid = AcpiSdCompatMode.Value,
+ prompt = STRING_TOKEN(STR_ACPI_SD_COMPAT_MODE_PROMPT),
+ help = STRING_TOKEN(STR_ACPI_SD_COMPAT_MODE_HELP),
+ flags = NUMERIC_SIZE_1 | INTERACTIVE | RESET_REQUIRED,
+ default = ACPI_SD_COMPAT_MODE_DEFAULT,
+ option text = STRING_TOKEN(STR_ACPI_SD_COMPAT_BRCMSTB_BAYTRAIL), value = ACPI_SD_COMPAT_MODE_BRCMSTB_BAYTRAIL, flags = 0;
+ option text = STRING_TOKEN(STR_ACPI_SD_COMPAT_FULL_BAYTRAIL), value = ACPI_SD_COMPAT_MODE_FULL_BAYTRAIL, flags = 0;
+ endoneof;
- checkbox varid = AcpiSdLimitUhs.Value,
- prompt = STRING_TOKEN(STR_ACPI_SD_LIMIT_UHS_PROMPT),
- help = STRING_TOKEN(STR_ACPI_SD_LIMIT_UHS_HELP),
- flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
- default = ACPI_SD_LIMIT_UHS_DEFAULT,
- endcheckbox;
+ checkbox varid = AcpiSdLimitUhs.Value,
+ prompt = STRING_TOKEN(STR_ACPI_SD_LIMIT_UHS_PROMPT),
+ help = STRING_TOKEN(STR_ACPI_SD_LIMIT_UHS_HELP),
+ flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
+ default = ACPI_SD_LIMIT_UHS_DEFAULT,
+ endcheckbox;
+ endif;
endform;
endformset;
diff --git a/Platform/RaspberryPi/RPi5/RPi5.dsc b/Platform/RaspberryPi/RPi5/RPi5.dsc
index 4f128fe0..63e86be3 100644
--- a/Platform/RaspberryPi/RPi5/RPi5.dsc
+++ b/Platform/RaspberryPi/RPi5/RPi5.dsc
@@ -474,6 +474,15 @@
#
gRaspberryPiTokenSpaceGuid.PcdPlatformResetDelay|L"ResetDelay"|gRaspberryPiTokenSpaceGuid|0x0|0
+ #
+ # Device Tree and ACPI selection.
+ #
+ # 0 - SYSTEM_TABLE_MODE_ACPI (default)
+ # 1 - SYSTEM_TABLE_MODE_BOTH
+ # 2 - SYSTEM_TABLE_MODE_DT
+ #
+ gRaspberryPiTokenSpaceGuid.PcdSystemTableMode|L"SystemTableMode"|gRpiPlatformFormSetGuid|0x0|0
+
#
# Common UEFI ones.
#
@@ -569,7 +578,7 @@
ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf
Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxe.inf
- # Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
+ Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
ArmPkg/Drivers/TimerDxe/TimerDxe.inf
MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
diff --git a/Platform/RaspberryPi/RPi5/RPi5.fdf b/Platform/RaspberryPi/RPi5/RPi5.fdf
index 4a5a05f6..a00b3d98 100644
--- a/Platform/RaspberryPi/RPi5/RPi5.fdf
+++ b/Platform/RaspberryPi/RPi5/RPi5.fdf
@@ -215,7 +215,7 @@ READ_LOCK_STATUS = TRUE
INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
INF Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf
INF Platform/RaspberryPi/RPi5/Drivers/RpiPlatformDxe/RpiPlatformDxe.inf
- # INF Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
+ INF Platform/RaspberryPi/Drivers/FdtDxe/FdtDxe.inf
INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf
INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
--
2.51.2