From: "Pete Batard" <pete@akeo.ie>
To: devel@edk2.groups.io
Cc: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org
Subject: [edk2-platforms: PATCH 1/1] Platforms/RPi3: Add multiple embedded Device Tree selection
Date: Mon, 12 Aug 2019 14:06:34 +0100 [thread overview]
Message-ID: <20190812130634.7224-2-pete@akeo.ie> (raw)
In-Reply-To: <20190812130634.7224-1-pete@akeo.ie>
The Raspberry Pi 3 platform currently has 2 different models, each with a
different Device Tree. Rather than embedding a single one, and requiring
users to manually provide the other, this patch ensures that we now embed
both and and serve the relevant one at runtime.
Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c | 57 ++++++++++++++++----
Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.inf | 3 +-
Platform/RaspberryPi/RPi3/RPi3.dec | 3 +-
Platform/RaspberryPi/RPi3/RPi3.fdf | 6 ++-
4 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c b/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c
index c84e5b2767e2..7c0ab75e7cb1 100644
--- a/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c
+++ b/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c
@@ -20,6 +20,11 @@
#include <Guid/Fdt.h>
+CONST EFI_GUID *mFdtGuid[] = {
+ &gRaspberryPiFdtGuid1,
+ &gRaspberryPiFdtGuid2,
+ };
+
STATIC VOID *mFdtImage;
STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
@@ -368,7 +373,9 @@ FdtDxeInitialize (
EFI_STATUS Status;
VOID *FdtImage;
UINTN FdtSize;
+ UINTN FdtIndex;
INT32 Retval;
+ UINT32 BoardRevision;
BOOLEAN Internal;
Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid, NULL,
@@ -383,13 +390,41 @@ FdtDxeInitialize (
* Have FDT passed via config.txt.
*/
FdtSize = fdt_totalsize (FdtImage);
- DEBUG ((DEBUG_INFO, "DTB passed via config.txt of 0x%lx bytes\n", FdtSize));
+ DEBUG ((DEBUG_INFO, "Device Tree passed via config.txt (0x%lx bytes)\n", FdtSize));
Status = EFI_SUCCESS;
} else {
+ /*
+ * Use one of the embedded FDT's.
+ */
Internal = TRUE;
- DEBUG ((DEBUG_INFO, "No/bad FDT at %p (%a), trying internal DTB...\n",
- FdtImage, fdt_strerror (Retval)));
- Status = GetSectionFromAnyFv (&gRaspberryPiFdtFileGuid, EFI_SECTION_RAW, 0,
+ DEBUG ((DEBUG_INFO, "No/Bad Device Tree found at address 0x%p (%a), "
+ "looking up internal one...\n", FdtImage, fdt_strerror (Retval)));
+ /*
+ * Query the board revision to differentiate between models.
+ */
+ Status = mFwProtocol->GetModelRevision (&BoardRevision);
+ if (EFI_ERROR (Status)) {
+ FdtIndex = 0;
+ DEBUG ((DEBUG_ERROR, "Failed to get board type: %r\n", Status));
+ } else {
+ // www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
+ switch ((BoardRevision >> 4) & 0xFF) {
+ case 0x08: // Raspberry 3 Model B
+ DEBUG ((DEBUG_INFO, "Using RPi3 Model B internal Device Tree\n"));
+ FdtIndex = 0;
+ break;
+ case 0x0D: // Raspberry 3 Model B+
+ DEBUG ((DEBUG_INFO, "Using RPi3 Model B+ internal Device Tree\n"));
+ FdtIndex = 1;
+ break;
+ default:
+ DEBUG ((DEBUG_INFO, "Using default internal Device Tree\n"));
+ FdtIndex = 0;
+ break;
+ }
+ }
+ ASSERT (FdtIndex < ARRAY_SIZE (mFdtGuid));
+ Status = GetSectionFromAnyFv (mFdtGuid[FdtIndex], EFI_SECTION_RAW, 0,
&FdtImage, &FdtSize);
if (Status == EFI_SUCCESS) {
if (fdt_check_header (FdtImage) != 0) {
@@ -419,27 +454,27 @@ FdtDxeInitialize (
Status = SanitizePSCI ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to sanitize PSCI (error %d)\n", Status);
+ Print (L"Failed to sanitize PSCI: %r\n", Status);
}
Status = CleanMemoryNodes ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to clean memory nodes (error %d)\n", Status);
+ Print (L"Failed to clean memory nodes: %r\n", Status);
}
Status = CleanSimpleFramebuffer ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to clean frame buffer (error %d)\n", Status);
+ Print (L"Failed to clean frame buffer: %r\n", Status);
}
Status = FixEthernetAliases ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to fix ethernet aliases (error %d)\n", Status);
+ Print (L"Failed to fix ethernet aliases: %r\n", Status);
}
Status = UpdateMacAddress ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to update MAC address (error %d)\n", Status);
+ Print (L"Failed to update MAC address: %r\n", Status);
}
if (Internal) {
@@ -448,11 +483,11 @@ FdtDxeInitialize (
*/
Status = UpdateBootArgs ();
if (EFI_ERROR (Status)) {
- Print (L"Failed to update boot arguments (error %d)\n", Status);
+ Print (L"Failed to update boot arguments: %r\n", Status);
}
}
- DEBUG ((DEBUG_INFO, "Installed FDT is at %p\n", mFdtImage));
+ DEBUG ((DEBUG_INFO, "Installed Device Tree at address 0x%p\n", mFdtImage));
Status = gBS->InstallConfigurationTable (&gFdtTableGuid, mFdtImage);
ASSERT_EFI_ERROR (Status);
diff --git a/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.inf b/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.inf
index 5b0b1a09f374..c994a2b69d78 100644
--- a/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.inf
+++ b/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.inf
@@ -35,7 +35,8 @@ [LibraryClasses]
[Guids]
gFdtTableGuid
- gRaspberryPiFdtFileGuid
+ gRaspberryPiFdtGuid1
+ gRaspberryPiFdtGuid2
[Protocols]
gRaspberryPiFirmwareProtocolGuid ## CONSUMES
diff --git a/Platform/RaspberryPi/RPi3/RPi3.dec b/Platform/RaspberryPi/RPi3/RPi3.dec
index 22de439fde8f..d90ea8329818 100644
--- a/Platform/RaspberryPi/RPi3/RPi3.dec
+++ b/Platform/RaspberryPi/RPi3/RPi3.dec
@@ -24,7 +24,8 @@ [Protocols]
[Guids]
gRaspberryPiTokenSpaceGuid = {0xCD7CC258, 0x31DB, 0x11E6, {0x9F, 0xD3, 0x63, 0xB0, 0xB8, 0xEE, 0xD6, 0xB5}}
- gRaspberryPiFdtFileGuid = {0xDF5DA223, 0x1D27, 0x47C3, { 0x8D, 0x1B, 0x9A, 0x41, 0xB5, 0x5A, 0x18, 0xBC}}
+ gRaspberryPiFdtGuid1 = {0xDF5DA223, 0x1D27, 0x47C3, { 0x8D, 0x1B, 0x9A, 0x41, 0xB5, 0x5A, 0x18, 0xBC}}
+ gRaspberryPiFdtGuid2 = {0x3D523012, 0x73FE, 0x40E5, { 0x89, 0x2E, 0x1A, 0x4D, 0xF6, 0x0F, 0x3C, 0x0C}}
gRaspberryPiEventResetGuid = {0xCD7CC258, 0x31DB, 0x11E6, {0x9F, 0xD3, 0x63, 0xB4, 0xB4, 0xE4, 0xD4, 0xB4}}
gConfigDxeFormSetGuid = {0xCD7CC258, 0x31DB, 0x22E6, {0x9F, 0x22, 0x63, 0xB0, 0xB8, 0xEE, 0xD6, 0xB5}}
diff --git a/Platform/RaspberryPi/RPi3/RPi3.fdf b/Platform/RaspberryPi/RPi3/RPi3.fdf
index c62d649834c7..83753d84badc 100644
--- a/Platform/RaspberryPi/RPi3/RPi3.fdf
+++ b/Platform/RaspberryPi/RPi3/RPi3.fdf
@@ -300,11 +300,15 @@ [FV.FvMain]
INF Platform/RaspberryPi/$(PLATFORM_NAME)/Drivers/LogoDxe/LogoDxe.inf
#
- # FDT (GUID matches gRaspberryPiFdtFileGuid in FdtDxe)
+ # Device Tree support
+ # GUIDs match gRaspberryPiFdtGuid# from FdtDxe.
#
FILE FREEFORM = DF5DA223-1D27-47C3-8D1B-9A41B55A18BC {
SECTION RAW = Platform/RaspberryPi/$(PLATFORM_NAME)/DeviceTree/bcm2710-rpi-3-b.dtb
}
+ FILE FREEFORM = 3D523012-73FE-40E5-892E-1A4DF60F3C0C {
+ SECTION RAW = Platform/RaspberryPi/$(PLATFORM_NAME)/DeviceTree/bcm2710-rpi-3-b-plus.dtb
+ }
[FV.FVMAIN_COMPACT]
FvAlignment = 16
--
2.21.0.windows.1
next prev parent reply other threads:[~2019-08-12 13:06 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-12 13:06 [edk2-platforms: PATCH 0/1] Platforms/RPi3: Add multiple embedded Device Tree selection Pete Batard
2019-08-12 13:06 ` Pete Batard [this message]
2019-08-15 12:13 ` [edk2-platforms: PATCH 1/1] " Leif Lindholm
2019-08-15 13:11 ` Pete Batard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190812130634.7224-2-pete@akeo.ie \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox