Skip to content

Commit

Permalink
Platform/RPi4: Add switch to select between PL011 and miniUART
Browse files Browse the repository at this point in the history
The PL011 can be a better choice for the serial console on the RPi4,
given that its baud clock is not derived from the CPU clock (which
may change under our feet unless we keep it fixed at a low rate), and
given the fact that the SBSA/SBBR specs that describe ARM specific
architectural requirements for ACPI only permit PL011 based UARTs to
begin with.

Therefore we add a new PL011_ENABLE build switch to tell the firmware
to use PL011 for all console serial I/O, including for TF-A, SPCR and
DBG2, as well as toggle the BlueTooth module to use the mini UART.

For the time being, the option is disabled by default because it
requires an overlay to be enabled in config.txt that pinmuxes the
PL011 TX/RX lines to the UART pins on the connector block.

Signed-off-by: Pete Batard <pete@akeo.ie>
  • Loading branch information
pbatard committed Dec 17, 2019
1 parent 0db2597 commit 62956e3
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 11 deletions.
10 changes: 10 additions & 0 deletions Platform/RaspberryPi/RPi4/AcpiTables/Dbg2.aslc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
#define RPI_DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS 1
#define RPI_DBG2_NAMESPACESTRING_FIELD_SIZE 10

#ifdef PL011_ENABLE
#define RPI_UART_BASE_ADDRESS FixedPcdGet64 (PcdSerialRegisterBase)
#define RPI_UART_LENGTH 0x1000
#define RPI_UART_STR { '\\', '_', 'S', 'B', '.', 'U', 'R', 'T', '0', 0x00 }
#else
//
// When using the miniUART, PcdSerialRegisterBase points to the 8250 base address,
// which is offset by 0x40 from the actual Bcm2835 base address
Expand All @@ -32,6 +37,7 @@
// RPI_UART_STR should match the value used Uart.asl
//
#define RPI_UART_STR { '\\', '_', 'S', 'B', '.', 'U', 'R', 'T', 'M', 0x00 }
#endif

typedef struct {
EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT Dbg2Device;
Expand Down Expand Up @@ -83,7 +89,11 @@ STATIC DBG2_TABLE Dbg2 = {
*/
DBG2_DEBUG_PORT_DDI (
RPI_DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS,
#ifdef PL011_ENABLE
EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART,
#else
EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_BCM2835_UART,
#endif
RPI_UART_BASE_ADDRESS,
RPI_UART_LENGTH,
RPI_UART_STR
Expand Down
9 changes: 8 additions & 1 deletion Platform/RaspberryPi/RPi4/AcpiTables/Spcr.aslc
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,19 @@

#define RPI_UART_FLOW_CONTROL_NONE 0

#ifdef PL011_ENABLE
#define RPI_UART_INTERFACE_TYPE EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART
#define RPI_UART_BASE_ADDRESS FixedPcdGet64 (PcdSerialRegisterBase)
#define RPI_UART_INTERRUPT 0x99
#else
#define RPI_UART_INTERFACE_TYPE EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART
//
// When using the miniUART, PcdSerialRegisterBase points to the 8250 base address,
// which is offset by 0x40 from the actual Bcm2835 base address
//
#define RPI_UART_BASE_ADDRESS (FixedPcdGet64 (PcdSerialRegisterBase) - 0x40)
#define RPI_UART_INTERRUPT 0x7D
#endif

STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr = {
ACPI_HEADER (
Expand All @@ -32,7 +39,7 @@ STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr = {
EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION
),
// UINT8 InterfaceType;
EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_BCM2835_UART,
RPI_UART_INTERFACE_TYPE,
// UINT8 Reserved1[3];
{
EFI_ACPI_RESERVED_BYTE,
Expand Down
6 changes: 5 additions & 1 deletion Platform/RaspberryPi/RPi4/AcpiTables/Uart.asl
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ Device(BTH0)
{
Name (RBUF, ResourceTemplate ()
{
// BT UART: UART0 (PL011)
// BT UART: URT0 (PL011) or URTM (miniUART)
UARTSerialBus(
115200, // InitialBaudRate: in BPS
, // BitsPerByte: default to 8 bits
Expand All @@ -133,7 +133,11 @@ Device(BTH0)
// no flow control.
16, // ReceiveBufferSize
16, // TransmitBufferSize
#ifdef PL011_ENABLE
"\\_SB.URTM", // ResourceSource:
#else
"\\_SB.URT0", // ResourceSource:
#endif
// UART bus controller name
, // ResourceSourceIndex: assumed to be 0
, // ResourceUsage: assumed to be
Expand Down
23 changes: 23 additions & 0 deletions Platform/RaspberryPi/RPi4/RPi4.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
DEFINE SECURE_BOOT_ENABLE = FALSE
DEFINE INCLUDE_TFTP_COMMAND = FALSE
DEFINE DEBUG_PRINT_ERROR_LEVEL = 0x8000004F
DEFINE PL011_ENABLE = FALSE

################################################################################
#
Expand Down Expand Up @@ -116,10 +117,16 @@
ArmHvcLib|ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf

!if $(PL011_ENABLE) == TRUE
PL011UartClockLib|ArmPlatformPkg/Library/PL011UartClockLib/PL011UartClockLib.inf
PL011UartLib|ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.inf
SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
!else
PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf
PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
!endif

# Cryptographic libraries
IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
Expand Down Expand Up @@ -229,6 +236,12 @@
GCC:*_*_AARCH64_DLINK_FLAGS = -Wl,--fix-cortex-a53-843419
GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG -DNDEBUG

!if $(PL011_ENABLE) == TRUE
GCC:*_*_*_CC_FLAGS = -DPL011_ENABLE
GCC:*_*_*_ASLPP_FLAGS = -DPL011_ENABLE
GCC:*_*_*_ASLCC_FLAGS = -DPL011_ENABLE
!endif

[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER]
GCC:*_*_AARCH64_DLINK_FLAGS = -z common-page-size=0x10000

Expand Down Expand Up @@ -391,14 +404,24 @@
gBcm27xxTokenSpaceGuid.PcdBcm27xxPciBusMmioLen|0x3ffffff
gBcm27xxTokenSpaceGuid.PcdBcm27xxPciCpuMmioAdr|0x600000000

!if $(PL011_ENABLE) == TRUE
## PL011 UART
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0xfe201000
gArmPlatformTokenSpaceGuid.PL011UartInteger|0
gArmPlatformTokenSpaceGuid.PL011UartFractional|0
gArmPlatformTokenSpaceGuid.PL011UartClkInHz|48000000
!else
## NS16550 compatible UART
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0xfe215040
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|4
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl|0x27
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize|8
!endif

gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultReceiveFifoDepth|0

#
# ARM General Interrupt Controller
Expand Down
4 changes: 4 additions & 0 deletions Platform/RaspberryPi/RPi4/RPi4.fdf
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ NumBlocks = 0x200
# ATF primary boot image
#
0x00000000|0x00020000
!if $(PL011_ENABLE) == TRUE
FILE = Platform/RaspberryPi/$(PLATFORM_NAME)/TrustedFirmware/bl31_pl011.bin
!else
FILE = Platform/RaspberryPi/$(PLATFORM_NAME)/TrustedFirmware/bl31_miniuart.bin
!endif

#
# DTB.
Expand Down
43 changes: 34 additions & 9 deletions Platform/RaspberryPi/RPi4/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,21 @@ following __major__ limitations:

- USB is likely to work only in pre-OS phase at this stage (nonstandard ECAM,
missing ACPI tables).
- Serial I/O from the OS may not work at all due to CPU throttling affecting
the miniUART baudrate.
- Serial I/O from the OS may not work due to CPU throttling affecting the
miniUART baudrate. This can be worked around by using the `PL011_ENABLE`
compilation option.

# Building

Build instructions from the top level edk2-platforms Readme.md apply.

The following additional build options are also available:
- `-D PL011_ENABLE=1`: Selects PL011 for the serial console instead of the
miniUART (default). This doesn't change the GPIO pinout for the UART but
can be useful if you find that the miniUART baud rate changes when the
OS throttles the CPU. Note that this requires one of `disable-bt.dtbo` or
`miniuart-bt.dtbo` overlays to have been applied (see below).

# Booting the firmware

1. Format a uSD card as FAT16 or FAT32
Expand All @@ -33,14 +41,31 @@ Build instructions from the top level edk2-platforms Readme.md apply.
- `bcm2711-rpi-4-b.dtb`
- `fixup4.dat`
- `start4.elf`
- `overlays/miniuart-bt.dbto` or `overlays/disable-bt.dtbo` (Optional)
4. Create a `config.txt` with the following content:
```
arm_64bit=1
enable_uart=1
core_freq=250
enable_gic=1
armstub=RPI_EFI.fd
```
- For a firmware **without** the `PL011_ENABLE` build option:
```
arm_64bit=1
enable_uart=1
core_freq=250
enable_gic=1
armstub=RPI_EFI.fd
disable_commandline_tags=1
```
- For a firmware **with** the `PL011_ENABLE` build option:
```
arm_64bit=1
enable_gic=1
armstub=RPI_EFI.fd
disable_commandline_tags=1
device_tree_address=0x20000
device_tree_end=0x30000
device_tree=bcm2711-rpi-4-b.dtb
dtoverlay=miniuart-bt
```
The abobe also requires `miniuart-bt.dbto` to have been copied into an `overlays/`

This comment has been minimized.

Copy link
@Googulator

Googulator Dec 18, 2019

  • Typo: "abobe"
  • Is a DeviceTree overlay (or anything DeviceTree-related) required also for ACPI boot? That sounds wrong to me.

This comment has been minimized.

Copy link
@pbatard

pbatard Dec 18, 2019

Author Member

Thanks for pointing out the typo. We'll fix that for integration.

And yeah, the current VideoCore firmware apparently requires a Device Tree to exist to initialize things like baudrate (for instance, you won't get proper miniUART baudrate unless you also have the .dtb). So, unlike what was the case with the Pi3, you must have a bcm2711-rpi-4-b.dtb available, regardless of whether you effectively use it or not, to keep VideoCore happy.

directory on the uSD card. Alternatively, you may use `disable-bt` instead of
`miniuart-bt` if you don't require BlueTooth.
5. Insert the uSD card and power up the Pi.

# Notes
Expand Down

0 comments on commit 62956e3

Please sign in to comment.