From 46b642a3280d98a5db55226295c4e0371dc9dd4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20B=C4=83l=C4=83nic=C4=83?= Date: Mon, 11 Dec 2023 06:39:02 +0200 Subject: [PATCH 01/16] Platform/RaspberryPi: Use PCDs for base addresses in RpiFirmwareDxe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All peripheral offsets defined in Bcm2836.h have changed with BCM2712. Therefore, start moving drivers that we plan on reusing for Pi 5 to plain PCDs, but keep the old definitions in place as they're still being used by Pi3/4 ACPI code. Signed-off-by: Mario Bălănică --- .../Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c | 16 +++++++------ .../Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf | 3 ++- .../PlatformLib/AArch64/RaspberryPiHelper.S | 1 + Platform/RaspberryPi/RPi3/RPi3.dsc | 5 ++++ Platform/RaspberryPi/RPi4/RPi4.dsc | 5 ++++ Platform/RaspberryPi/RaspberryPi.dec | 1 + .../Include/IndustryStandard/Bcm2836.h | 9 ------- .../Include/IndustryStandard/Bcm2836Mbox.h | 24 +++++++++++++++++++ 8 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Mbox.h diff --git a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c index 4edec0ad..6fe76e1d 100644 --- a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c +++ b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c @@ -21,11 +21,13 @@ #include #include -#include +#include #include #include +#define MBOX_BASE_ADDRESS PcdGet64 (PcdFwMailboxBaseAddress) + // // The number of statically allocated buffer pages // @@ -51,12 +53,12 @@ DrainMailbox ( // Tries = 0; do { - Val = MmioRead32 (BCM2836_MBOX_BASE_ADDRESS + BCM2836_MBOX_STATUS_OFFSET); + Val = MmioRead32 (MBOX_BASE_ADDRESS + BCM2836_MBOX_STATUS_OFFSET); if (Val & (1U << BCM2836_MBOX_STATUS_EMPTY)) { return TRUE; } ArmDataSynchronizationBarrier (); - MmioRead32 (BCM2836_MBOX_BASE_ADDRESS + BCM2836_MBOX_READ_OFFSET); + MmioRead32 (MBOX_BASE_ADDRESS + BCM2836_MBOX_READ_OFFSET); } while (++Tries < RPI_MBOX_MAX_TRIES); return FALSE; @@ -76,7 +78,7 @@ MailboxWaitForStatusCleared ( // Tries = 0; do { - Val = MmioRead32 (BCM2836_MBOX_BASE_ADDRESS + BCM2836_MBOX_STATUS_OFFSET); + Val = MmioRead32 (MBOX_BASE_ADDRESS + BCM2836_MBOX_STATUS_OFFSET); if ((Val & StatusMask) == 0) { return TRUE; } @@ -121,7 +123,7 @@ MailboxTransaction ( // // Start the mailbox transaction // - MmioWrite32 (BCM2836_MBOX_BASE_ADDRESS + BCM2836_MBOX_WRITE_OFFSET, + MmioWrite32 (MBOX_BASE_ADDRESS + BCM2836_MBOX_WRITE_OFFSET, (UINT32)((UINTN)mDmaBufferBusAddress | Channel)); ArmDataSynchronizationBarrier (); @@ -139,7 +141,7 @@ MailboxTransaction ( // Read back the result // ArmDataSynchronizationBarrier (); - *Result = MmioRead32 (BCM2836_MBOX_BASE_ADDRESS + BCM2836_MBOX_READ_OFFSET); + *Result = MmioRead32 (MBOX_BASE_ADDRESS + BCM2836_MBOX_READ_OFFSET); ArmDataSynchronizationBarrier (); return EFI_SUCCESS; @@ -954,7 +956,7 @@ RpiFirmwareAllocFb ( } *Pitch = Cmd->Pitch.Pitch; - *FbBase = Cmd->AllocFb.AlignmentBase - BCM2836_DMA_DEVICE_OFFSET; + *FbBase = Cmd->AllocFb.AlignmentBase - PcdGet64 (PcdDmaDeviceOffset); *FbSize = Cmd->AllocFb.Size; ReleaseSpinLock (&mMailboxLock); diff --git a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf index a3fc0fa4..08acc4b3 100644 --- a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf +++ b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.inf @@ -41,7 +41,8 @@ gRaspberryPiFirmwareProtocolGuid ## PRODUCES [FixedPcd] - gBcm283xTokenSpaceGuid.PcdBcm283xRegistersAddress + gRaspberryPiTokenSpaceGuid.PcdFwMailboxBaseAddress + gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset [Depex] TRUE diff --git a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S index 7008aaf8..d3c77be2 100644 --- a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S +++ b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S @@ -12,6 +12,7 @@ #include #include #include +#include #include .macro drain diff --git a/Platform/RaspberryPi/RPi3/RPi3.dsc b/Platform/RaspberryPi/RPi3/RPi3.dsc index f5361ab9..5e90f421 100644 --- a/Platform/RaspberryPi/RPi3/RPi3.dsc +++ b/Platform/RaspberryPi/RPi3/RPi3.dsc @@ -446,6 +446,11 @@ gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq2|0x09 gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq3|0x09 + # + # Mailbox + # + gRaspberryPiTokenSpaceGuid.PcdFwMailboxBaseAddress|0x3f00b880 + ## Default Terminal Type ## 0-PCANSI, 1-VT100, 2-VT00+, 3-UTF8, 4-TTYTERM gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4 diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc index 4e91eb9a..4ab6a819 100644 --- a/Platform/RaspberryPi/RPi4/RPi4.dsc +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc @@ -452,6 +452,11 @@ gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq2|0x32 gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq3|0x33 + # + # Mailbox + # + gRaspberryPiTokenSpaceGuid.PcdFwMailboxBaseAddress|0xfe00b880 + # # Fixed CPU settings. # diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec index 6bd16a5a..d0025cf6 100644 --- a/Platform/RaspberryPi/RaspberryPi.dec +++ b/Platform/RaspberryPi/RaspberryPi.dec @@ -50,6 +50,7 @@ gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq1|0x0|UINT32|0x00000034 gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq2|0x0|UINT32|0x00000035 gRaspberryPiTokenSpaceGuid.PcdGicPmuIrq3|0x0|UINT32|0x00000036 + gRaspberryPiTokenSpaceGuid.PcdFwMailboxBaseAddress|0x0|UINT64|0x00000037 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] gRaspberryPiTokenSpaceGuid.PcdCpuClock|0|UINT32|0x0000000d diff --git a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h index a930c64a..93d5eee9 100644 --- a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h +++ b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h @@ -57,15 +57,6 @@ #define BCM2836_MBOX_OFFSET 0x0000b880 #define BCM2836_MBOX_BASE_ADDRESS (BCM2836_SOC_REGISTERS + BCM2836_MBOX_OFFSET) #define BCM2836_MBOX_LENGTH 0x00000024 -#define BCM2836_MBOX_READ_OFFSET 0x00000000 -#define BCM2836_MBOX_STATUS_OFFSET 0x00000018 -#define BCM2836_MBOX_CONFIG_OFFSET 0x0000001c -#define BCM2836_MBOX_WRITE_OFFSET 0x00000020 - -#define BCM2836_MBOX_STATUS_FULL 0x1f -#define BCM2836_MBOX_STATUS_EMPTY 0x1e - -#define BCM2836_MBOX_NUM_CHANNELS 16 /* interrupt controller constants */ #define BCM2836_INTC_TIMER_CONTROL_OFFSET 0x00000040 diff --git a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Mbox.h b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Mbox.h new file mode 100644 index 00000000..f9096548 --- /dev/null +++ b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Mbox.h @@ -0,0 +1,24 @@ +/** @file + * + * Copyright (c) 2020, Pete Batard + * Copyright (c) 2023, Mario Bălănică + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#ifndef __BCM2836_MBOX_H__ +#define __BCM2836_MBOX_H__ + +/* Mailbox registers */ +#define BCM2836_MBOX_READ_OFFSET 0x00000000 +#define BCM2836_MBOX_STATUS_OFFSET 0x00000018 +#define BCM2836_MBOX_CONFIG_OFFSET 0x0000001c +#define BCM2836_MBOX_WRITE_OFFSET 0x00000020 + +#define BCM2836_MBOX_STATUS_FULL 0x1f +#define BCM2836_MBOX_STATUS_EMPTY 0x1e + +#define BCM2836_MBOX_NUM_CHANNELS 16 + +#endif /* __BCM2836_MBOX_H__ */ -- 2.51.2