From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=pass header.i=@akeo-ie.20150623.gappssmtp.com header.s=20150623 header.b=s9bcc/yh; spf=none, err=permanent DNS error (domain: akeo.ie, ip: 209.85.221.67, mailfrom: pete@akeo.ie) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by groups.io with SMTP; Mon, 12 Aug 2019 06:06:49 -0700 Received: by mail-wr1-f67.google.com with SMTP id z1so104498356wru.13 for ; Mon, 12 Aug 2019 06:06:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=MBTlFHJDPM/Lr/pc4jj+u3LUZVVgMyinSS7F68q4NDE=; b=s9bcc/yhBCrKG53CX3W9cUObnQog0G5zCdQwHD6xzPhKC31wrK4LZRWP2GZcGucLnc o3+bsSi7scRcpqndlpcOEvJQ1grEwbS+z4f218zZaM6egHvwHsAJsJJo9IKrhAgECwHp 3IcliiULB6Ge185U6/U5xe4ra85Rf70Sh91nHEZon9iVQKiANuAfP0oJxZn56YNJ9D/2 jUihWYi411uyjL0fhmrjNAhBfq+1mBo+y0UhxNAtidsySJ1QUmFqnGPvyd31qLchDU7w S/Z1+yDflVqJavyMipUJNwPithmCas08elAIWo5SnuaDaIbp2DKOdTyAibre4LQ8qtcz Nmsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MBTlFHJDPM/Lr/pc4jj+u3LUZVVgMyinSS7F68q4NDE=; b=CFXXuYKwpDyy8A1o1A5tE4yX9aZcavF7ZcfFmU9REep0HdmO+Y3A8+fbS1feAEwXvg aCEIeKqU4KC4kJ6H/9inJN0v1CssUOgjO0CTMA5/G4KcrtviSWJR2aV9A0b0p7YALxSM NBxklCTDJP2Inx1ATMNwRIA87kZfvGwrLC27x9kySsjV+/qFsSEk6s4ELpY3AF2zUcUn w57BFGco1//dFv/OUrd8D8tQwfg/eN55GClqDzp641UkoqLO9QGyEy4aWwY5AZNUBMsr +Dt3R2nOE6s1aSO++3DPzYbv/aCIb1tDwKsVsLIqkNwfcx6G40zr7G5ox1lseZpx1JDa 2QRQ== X-Gm-Message-State: APjAAAUrD/EPpP+URiqb4H69p6YiLaAtOk0T4ZyQoGslXbzkAY112gey Bzz06xWmG9re9Ll8da3f9YIX07nc1sc= X-Google-Smtp-Source: APXvYqwuUhHFm5GYu/SJM8A1mWjRcBNmFNPO5jYdNIGBf/moAoED8JJj63lOsCBXYpFI8XbTf4BUvQ== X-Received: by 2002:adf:f646:: with SMTP id x6mr43120432wrp.18.1565615207200; Mon, 12 Aug 2019 06:06:47 -0700 (PDT) Return-Path: Received: from localhost.localdomain ([84.203.61.230]) by smtp.gmail.com with ESMTPSA id n2sm11330167wmi.38.2019.08.12.06.06.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Aug 2019 06:06:46 -0700 (PDT) From: "Pete Batard" 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 Message-Id: <20190812130634.7224-2-pete@akeo.ie> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20190812130634.7224-1-pete@akeo.ie> References: <20190812130634.7224-1-pete@akeo.ie> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 --- 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 +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