* [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
@ 2021-04-02 17:51 Mario Bălănică
2021-04-03 7:36 ` Ard Biesheuvel
0 siblings, 1 reply; 13+ messages in thread
From: Mario Bălănică @ 2021-04-02 17:51 UTC (permalink / raw)
To: devel; +Cc: ardb+tianocore, leif, pete
The baud rate divisor calculation for mini UART on BCM2711 is the same
as on older models since this commit:
https://github.com/raspberrypi/firmware/commit/1e5456a
Signed-off-by: Mario Bălănică <mariobalanica02@gmail.com>
---
Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c | 15 +++------------
Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S | 4 ----
Platform/RaspberryPi/RPi4/RPi4.dsc | 6 ++++--
3 files changed, 7 insertions(+), 18 deletions(-)
diff --git a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
index 5e83bbf022eb..d2f983bf0a9f 100644
--- a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
+++ b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
@@ -34,25 +34,16 @@ SerialPortGetDivisor (
UINT32 SerialBaudRate
)
{
- UINT64 BaseClockRate;
+ UINT32 BaseClockRate;
UINT32 Divisor;
- //
- // On the Raspberry Pi, the clock to use for the 16650-compatible UART
- // is the base clock divided by the 12.12 fixed point VPU clock divisor.
- //
- BaseClockRate = (UINT64)PcdGet32 (PcdSerialClockRate);
-#if (RPI_MODEL == 4)
- Divisor = MmioRead32(BCM2836_CM_BASE + BCM2836_CM_VPU_CLOCK_DIVISOR) & 0xFFFFFF;
- if (Divisor != 0)
- BaseClockRate = (BaseClockRate << 12) / Divisor;
-#endif
+ BaseClockRate = PcdGet32 (PcdSerialClockRate);
//
// As per the BCM2xxx datasheets:
// baudrate = system_clock_freq / (8 * (divisor + 1)).
//
- Divisor = (UINT32)BaseClockRate / (SerialBaudRate * 8);
+ Divisor = BaseClockRate / (SerialBaudRate * 8);
if (Divisor != 0) {
Divisor--;
}
diff --git a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
index 58351e4fb8cc..7008aaf8aa4c 100644
--- a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
+++ b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
@@ -85,13 +85,11 @@ ASM_FUNC (ArmPlatformPeiBootAction)
adr x2, mBoardRevision
str w0, [x2]
-#if (RPI_MODEL == 3)
run .Lclkinfo_buffer
ldr w0, .Lfrequency
adr x2, _gPcd_BinaryPatch_PcdSerialClockRate
str w0, [x2]
-#endif
ret
@@ -135,7 +133,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
.long 0 // end tag
.set .Lrevinfo_size, . - .Lrevinfo_buffer
-#if (RPI_MODEL == 3)
.align 4
.Lclkinfo_buffer:
.long .Lclkinfo_size
@@ -148,7 +145,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
.long 0 // frequency
.long 0 // end tag
.set .Lclkinfo_size, . - .Lclkinfo_buffer
-#endif
//UINTN
//ArmPlatformGetPrimaryCoreMpId (
diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc
index 2c05c31118d2..ff802d8347ea 100644
--- a/Platform/RaspberryPi/RPi4/RPi4.dsc
+++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
@@ -429,7 +429,6 @@ [PcdsFixedAtBuild.common]
gArmPlatformTokenSpaceGuid.PL011UartClkInHz|48000000
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|4
- gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|1000000000
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl|0x27
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize|8
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
@@ -465,6 +464,9 @@ [PcdsFixedAtBuild.common]
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2"
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE
+[PcdsPatchableInModule]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
+
[PcdsDynamicHii.common.DEFAULT]
#
@@ -621,7 +623,7 @@ [Components.common]
MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
MdeModulePkg/Universal/SerialDxe/SerialDxe.inf {
<LibraryClasses>
- SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.inf
+ SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortDxeLib.inf
}
Platform/RaspberryPi/Drivers/DisplayDxe/DisplayDxe.inf
EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf
--
2.29.2.windows.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-02 17:51 [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation Mario Bălănică
@ 2021-04-03 7:36 ` Ard Biesheuvel
2021-04-03 12:47 ` Mario Bălănică
0 siblings, 1 reply; 13+ messages in thread
From: Ard Biesheuvel @ 2021-04-03 7:36 UTC (permalink / raw)
To: Mario Bălănică
Cc: devel, Ard Biesheuvel, Leif Lindholm, Peter Batard
On Fri, 2 Apr 2021 at 19:52, Mario Bălănică <mariobalanica02@gmail.com> wrote:
>
> The baud rate divisor calculation for mini UART on BCM2711 is the same
> as on older models since this commit:
> https://github.com/raspberrypi/firmware/commit/1e5456a
>
> Signed-off-by: Mario Bălănică <mariobalanica02@gmail.com>
Doesn't this make the new build incompatible with the old firmware? Is
there a way to support both?
> ---
> Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c | 15 +++------------
> Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S | 4 ----
> Platform/RaspberryPi/RPi4/RPi4.dsc | 6 ++++--
> 3 files changed, 7 insertions(+), 18 deletions(-)
>
> diff --git a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> index 5e83bbf022eb..d2f983bf0a9f 100644
> --- a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> +++ b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> @@ -34,25 +34,16 @@ SerialPortGetDivisor (
> UINT32 SerialBaudRate
> )
> {
> - UINT64 BaseClockRate;
> + UINT32 BaseClockRate;
> UINT32 Divisor;
>
> - //
> - // On the Raspberry Pi, the clock to use for the 16650-compatible UART
> - // is the base clock divided by the 12.12 fixed point VPU clock divisor.
> - //
> - BaseClockRate = (UINT64)PcdGet32 (PcdSerialClockRate);
> -#if (RPI_MODEL == 4)
> - Divisor = MmioRead32(BCM2836_CM_BASE + BCM2836_CM_VPU_CLOCK_DIVISOR) & 0xFFFFFF;
> - if (Divisor != 0)
> - BaseClockRate = (BaseClockRate << 12) / Divisor;
> -#endif
> + BaseClockRate = PcdGet32 (PcdSerialClockRate);
>
> //
> // As per the BCM2xxx datasheets:
> // baudrate = system_clock_freq / (8 * (divisor + 1)).
> //
> - Divisor = (UINT32)BaseClockRate / (SerialBaudRate * 8);
> + Divisor = BaseClockRate / (SerialBaudRate * 8);
> if (Divisor != 0) {
> Divisor--;
> }
> diff --git a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> index 58351e4fb8cc..7008aaf8aa4c 100644
> --- a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> +++ b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> @@ -85,13 +85,11 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> adr x2, mBoardRevision
> str w0, [x2]
>
> -#if (RPI_MODEL == 3)
> run .Lclkinfo_buffer
>
> ldr w0, .Lfrequency
> adr x2, _gPcd_BinaryPatch_PcdSerialClockRate
> str w0, [x2]
> -#endif
>
> ret
>
> @@ -135,7 +133,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> .long 0 // end tag
> .set .Lrevinfo_size, . - .Lrevinfo_buffer
>
> -#if (RPI_MODEL == 3)
> .align 4
> .Lclkinfo_buffer:
> .long .Lclkinfo_size
> @@ -148,7 +145,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> .long 0 // frequency
> .long 0 // end tag
> .set .Lclkinfo_size, . - .Lclkinfo_buffer
> -#endif
>
> //UINTN
> //ArmPlatformGetPrimaryCoreMpId (
> diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc b/Platform/RaspberryPi/RPi4/RPi4.dsc
> index 2c05c31118d2..ff802d8347ea 100644
> --- a/Platform/RaspberryPi/RPi4/RPi4.dsc
> +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
> @@ -429,7 +429,6 @@ [PcdsFixedAtBuild.common]
> gArmPlatformTokenSpaceGuid.PL011UartClkInHz|48000000
> gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE
> gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|4
> - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|1000000000
> gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl|0x27
> gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize|8
> gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
> @@ -465,6 +464,9 @@ [PcdsFixedAtBuild.common]
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2"
> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE
>
> +[PcdsPatchableInModule]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
> +
> [PcdsDynamicHii.common.DEFAULT]
>
> #
> @@ -621,7 +623,7 @@ [Components.common]
> MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
> MdeModulePkg/Universal/SerialDxe/SerialDxe.inf {
> <LibraryClasses>
> - SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.inf
> + SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortDxeLib.inf
> }
> Platform/RaspberryPi/Drivers/DisplayDxe/DisplayDxe.inf
> EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf
> --
> 2.29.2.windows.2
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 7:36 ` Ard Biesheuvel
@ 2021-04-03 12:47 ` Mario Bălănică
2021-04-03 14:35 ` Pete Batard
0 siblings, 1 reply; 13+ messages in thread
From: Mario Bălănică @ 2021-04-03 12:47 UTC (permalink / raw)
To: Ard Biesheuvel; +Cc: devel, Ard Biesheuvel, Leif Lindholm, Peter Batard
[-- Attachment #1: Type: text/plain, Size: 5279 bytes --]
It works with the old firmware as well.
sâm., 3 apr. 2021, 10:36 Ard Biesheuvel <ardb@kernel.org> a scris:
> On Fri, 2 Apr 2021 at 19:52, Mario Bălănică <mariobalanica02@gmail.com>
> wrote:
> >
> > The baud rate divisor calculation for mini UART on BCM2711 is the same
> > as on older models since this commit:
> > https://github.com/raspberrypi/firmware/commit/1e5456a
> >
> > Signed-off-by: Mario Bălănică <mariobalanica02@gmail.com>
>
> Doesn't this make the new build incompatible with the old firmware? Is
> there a way to support both?
>
>
> > ---
> > Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c |
> 15 +++------------
> > Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S |
> 4 ----
> > Platform/RaspberryPi/RPi4/RPi4.dsc |
> 6 ++++--
> > 3 files changed, 7 insertions(+), 18 deletions(-)
> >
> > diff --git
> a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> > index 5e83bbf022eb..d2f983bf0a9f 100644
> > --- a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> > +++ b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> > @@ -34,25 +34,16 @@ SerialPortGetDivisor (
> > UINT32 SerialBaudRate
> > )
> > {
> > - UINT64 BaseClockRate;
> > + UINT32 BaseClockRate;
> > UINT32 Divisor;
> >
> > - //
> > - // On the Raspberry Pi, the clock to use for the 16650-compatible UART
> > - // is the base clock divided by the 12.12 fixed point VPU clock
> divisor.
> > - //
> > - BaseClockRate = (UINT64)PcdGet32 (PcdSerialClockRate);
> > -#if (RPI_MODEL == 4)
> > - Divisor = MmioRead32(BCM2836_CM_BASE + BCM2836_CM_VPU_CLOCK_DIVISOR)
> & 0xFFFFFF;
> > - if (Divisor != 0)
> > - BaseClockRate = (BaseClockRate << 12) / Divisor;
> > -#endif
> > + BaseClockRate = PcdGet32 (PcdSerialClockRate);
> >
> > //
> > // As per the BCM2xxx datasheets:
> > // baudrate = system_clock_freq / (8 * (divisor + 1)).
> > //
> > - Divisor = (UINT32)BaseClockRate / (SerialBaudRate * 8);
> > + Divisor = BaseClockRate / (SerialBaudRate * 8);
> > if (Divisor != 0) {
> > Divisor--;
> > }
> > diff --git
> a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> > index 58351e4fb8cc..7008aaf8aa4c 100644
> > ---
> a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> > +++
> b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> > @@ -85,13 +85,11 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> > adr x2, mBoardRevision
> > str w0, [x2]
> >
> > -#if (RPI_MODEL == 3)
> > run .Lclkinfo_buffer
> >
> > ldr w0, .Lfrequency
> > adr x2, _gPcd_BinaryPatch_PcdSerialClockRate
> > str w0, [x2]
> > -#endif
> >
> > ret
> >
> > @@ -135,7 +133,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> > .long 0 // end tag
> > .set .Lrevinfo_size, . - .Lrevinfo_buffer
> >
> > -#if (RPI_MODEL == 3)
> > .align 4
> > .Lclkinfo_buffer:
> > .long .Lclkinfo_size
> > @@ -148,7 +145,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> > .long 0 // frequency
> > .long 0 // end tag
> > .set .Lclkinfo_size, . - .Lclkinfo_buffer
> > -#endif
> >
> > //UINTN
> > //ArmPlatformGetPrimaryCoreMpId (
> > diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc
> b/Platform/RaspberryPi/RPi4/RPi4.dsc
> > index 2c05c31118d2..ff802d8347ea 100644
> > --- a/Platform/RaspberryPi/RPi4/RPi4.dsc
> > +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
> > @@ -429,7 +429,6 @@ [PcdsFixedAtBuild.common]
> > gArmPlatformTokenSpaceGuid.PL011UartClkInHz|48000000
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|4
> > - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|1000000000
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl|0x27
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize|8
> > gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
> > @@ -465,6 +464,9 @@ [PcdsFixedAtBuild.common]
> > gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2"
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE
> >
> > +[PcdsPatchableInModule]
> > + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
> > +
> > [PcdsDynamicHii.common.DEFAULT]
> >
> > #
> > @@ -621,7 +623,7 @@ [Components.common]
> > MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
> > MdeModulePkg/Universal/SerialDxe/SerialDxe.inf {
> > <LibraryClasses>
> > -
> SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.inf
> > +
> SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortDxeLib.inf
> > }
> > Platform/RaspberryPi/Drivers/DisplayDxe/DisplayDxe.inf
> > EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf
> > --
> > 2.29.2.windows.2
> >
>
[-- Attachment #2: Type: text/html, Size: 6632 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 12:47 ` Mario Bălănică
@ 2021-04-03 14:35 ` Pete Batard
2021-04-03 15:17 ` [edk2-devel] " Mario Bălănică
0 siblings, 1 reply; 13+ messages in thread
From: Pete Batard @ 2021-04-03 14:35 UTC (permalink / raw)
To: Mario Bălănică, Ard Biesheuvel
Cc: devel, Ard Biesheuvel, Leif Lindholm
Hi Mario,
On 2021.04.03 13:47, Mario Bălănică wrote:
> It works with the old firmware as well.
Are you sure of this? You may have to go quite far back to find
start4.elf versions where this might not work...
The whole reason behind reading the base clock and divisor from MMIO,
rather than use a fixed base clock, is actually because we got stung
with the Raspberry Pi Foundation changing start4.elf on a whim, and
thereby breaking the serial divisor computation.
So we moved away from using the approach proposed in this patch (i.e.
assuming a fixed PcdSerialClockRate) as we found that it didn't work for
all cases.
I'm also wondering why there are no mentions of clock rates in the
firmware commit message you linked to. Do you have other information,
from the Raspberry Pi Foundation developers, where they indicate that
they plan to keep the base clock for miniUART fixed to 500 MHz from now on?
But more importantly, I'd like to understand the issue we are trying to
solve with this patch. Does the current serial computation create
issues? Because, if that is not the case, I think I'd rather keep the
dynamic approach of reading the base clock and VPU divisor, since it
might be more future-proof than relying on a fixed value provided in the
.dsc.
Especially, we don't know if the Raspberry Pi Foundation may not
introduce a new Rapsberry Pi 4 revision tomorrow (like they did with the
Pi400), where the fixed 500 MHz base clock rate would not apply...
So I'd like to understand better how this patch came about, and what it
is we are trying to achieve with it.
Regards,
/Pete
>
> sâm., 3 apr. 2021, 10:36 Ard Biesheuvel <ardb@kernel.org
> <mailto:ardb@kernel.org>> a scris:
>
> On Fri, 2 Apr 2021 at 19:52, Mario Bălănică
> <mariobalanica02@gmail.com <mailto:mariobalanica02@gmail.com>> wrote:
> >
> > The baud rate divisor calculation for mini UART on BCM2711 is the
> same
> > as on older models since this commit:
> > https://github.com/raspberrypi/firmware/commit/1e5456a
> <https://github.com/raspberrypi/firmware/commit/1e5456a>
> >
> > Signed-off-by: Mario Bălănică <mariobalanica02@gmail.com
> <mailto:mariobalanica02@gmail.com>>
>
> Doesn't this make the new build incompatible with the old firmware? Is
> there a way to support both?
>
>
> > ---
> >
> Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> | 15 +++------------
> >
> Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> | 4 ----
> > Platform/RaspberryPi/RPi4/RPi4.dsc
> | 6 ++++--
> > 3 files changed, 7 insertions(+), 18 deletions(-)
> >
> > diff --git
> a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> > index 5e83bbf022eb..d2f983bf0a9f 100644
> > ---
> a/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> > +++
> b/Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.c
> > @@ -34,25 +34,16 @@ SerialPortGetDivisor (
> > UINT32 SerialBaudRate
> > )
> > {
> > - UINT64 BaseClockRate;
> > + UINT32 BaseClockRate;
> > UINT32 Divisor;
> >
> > - //
> > - // On the Raspberry Pi, the clock to use for the
> 16650-compatible UART
> > - // is the base clock divided by the 12.12 fixed point VPU
> clock divisor.
> > - //
> > - BaseClockRate = (UINT64)PcdGet32 (PcdSerialClockRate);
> > -#if (RPI_MODEL == 4)
> > - Divisor = MmioRead32(BCM2836_CM_BASE +
> BCM2836_CM_VPU_CLOCK_DIVISOR) & 0xFFFFFF;
> > - if (Divisor != 0)
> > - BaseClockRate = (BaseClockRate << 12) / Divisor;
> > -#endif
> > + BaseClockRate = PcdGet32 (PcdSerialClockRate);
> >
> > //
> > // As per the BCM2xxx datasheets:
> > // baudrate = system_clock_freq / (8 * (divisor + 1)).
> > //
> > - Divisor = (UINT32)BaseClockRate / (SerialBaudRate * 8);
> > + Divisor = BaseClockRate / (SerialBaudRate * 8);
> > if (Divisor != 0) {
> > Divisor--;
> > }
> > diff --git
> a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> > index 58351e4fb8cc..7008aaf8aa4c 100644
> > ---
> a/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> > +++
> b/Platform/RaspberryPi/Library/PlatformLib/AArch64/RaspberryPiHelper.S
> > @@ -85,13 +85,11 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> > adr x2, mBoardRevision
> > str w0, [x2]
> >
> > -#if (RPI_MODEL == 3)
> > run .Lclkinfo_buffer
> >
> > ldr w0, .Lfrequency
> > adr x2, _gPcd_BinaryPatch_PcdSerialClockRate
> > str w0, [x2]
> > -#endif
> >
> > ret
> >
> > @@ -135,7 +133,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> > .long 0 // end tag
> > .set .Lrevinfo_size, . - .Lrevinfo_buffer
> >
> > -#if (RPI_MODEL == 3)
> > .align 4
> > .Lclkinfo_buffer:
> > .long .Lclkinfo_size
> > @@ -148,7 +145,6 @@ ASM_FUNC (ArmPlatformPeiBootAction)
> > .long 0 // frequency
> > .long 0 // end tag
> > .set .Lclkinfo_size, . - .Lclkinfo_buffer
> > -#endif
> >
> > //UINTN
> > //ArmPlatformGetPrimaryCoreMpId (
> > diff --git a/Platform/RaspberryPi/RPi4/RPi4.dsc
> b/Platform/RaspberryPi/RPi4/RPi4.dsc
> > index 2c05c31118d2..ff802d8347ea 100644
> > --- a/Platform/RaspberryPi/RPi4/RPi4.dsc
> > +++ b/Platform/RaspberryPi/RPi4/RPi4.dsc
> > @@ -429,7 +429,6 @@ [PcdsFixedAtBuild.common]
> > gArmPlatformTokenSpaceGuid.PL011UartClkInHz|48000000
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|4
> > - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|1000000000
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl|0x27
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize|8
> > gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
> > @@ -465,6 +464,9 @@ [PcdsFixedAtBuild.common]
> > gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2"
> > gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE
> >
> > +[PcdsPatchableInModule]
> > + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
> > +
> > [PcdsDynamicHii.common.DEFAULT]
> >
> > #
> > @@ -621,7 +623,7 @@ [Components.common]
> > MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
> > MdeModulePkg/Universal/SerialDxe/SerialDxe.inf {
> > <LibraryClasses>
> > -
> SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortLib.inf
> > +
> SerialPortLib|Platform/RaspberryPi/Library/DualSerialPortLib/DualSerialPortDxeLib.inf
> > }
> > Platform/RaspberryPi/Drivers/DisplayDxe/DisplayDxe.inf
> > EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf
> > --
> > 2.29.2.windows.2
> >
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 14:35 ` Pete Batard
@ 2021-04-03 15:17 ` Mario Bălănică
2021-04-03 16:01 ` Pete Batard
0 siblings, 1 reply; 13+ messages in thread
From: Mario Bălănică @ 2021-04-03 15:17 UTC (permalink / raw)
To: Pete Batard, devel
[-- Attachment #1: Type: text/plain, Size: 807 bytes --]
Hi Pete,
I've submitted this patch because the mini UART serial console produces garbage since UEFI v1.25 (due to the wrong baud rate).
It has been tested on the firmware shipped with UEFI v1.24 and it works fine. I don't see any reason to test it on older versions than this.
The core clock is not fixed. I've made PcdSerialClockRate patchable here:
>
> @@ -465,6 +464,9 @@ [PcdsFixedAtBuild.common]
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2"
> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE
>
> +[PcdsPatchableInModule]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
> +
>
500 MHz is the default clock rate (assuming it hasn't been changed in config.txt).
The PCD gets patched in both the PEI and DXE phases to the value read from mailbox.
[-- Attachment #2: Type: text/html, Size: 1331 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 15:17 ` [edk2-devel] " Mario Bălănică
@ 2021-04-03 16:01 ` Pete Batard
2021-04-03 16:15 ` Mario Bălănică
0 siblings, 1 reply; 13+ messages in thread
From: Pete Batard @ 2021-04-03 16:01 UTC (permalink / raw)
To: Mario Bălănică, devel
On 2021.04.03 16:17, Mario Bălănică wrote:
> I've submitted this patch because the mini UART serial console produces
> garbage since UEFI v1.25 (due to the wrong baud rate).
OK.
When you fix something like this, please mention that there was a
regression that requires fixing, in the commit message.
> It has been tested on the firmware shipped with UEFI v1.24 and it works
> fine. I don't see any reason to test it on older versions than this.
Well, my worry is that you are removing this part:
> -#if (RPI_MODEL == 4)
> - Divisor = MmioRead32(BCM2836_CM_BASE +
BCM2836_CM_VPU_CLOCK_DIVISOR) & 0xFFFFFF;
> - if (Divisor != 0)
> - BaseClockRate = (BaseClockRate << 12) / Divisor;
> -#endif
which was added due to serial issues with older versions of the firmware
(much older than the one included in 1.24), to make it compatible with
versions of start4.elf where the Pi Foundation had suffled the serial
clock rates yet again.
I guess if we can't make both newer versions and these older versions
work with the same code, we have to stick with what works for newer
ones. But I'm still wondering what changed in the Pi firmware to make
applying this divisor computation fail, especially as this was supposed
to alleviate the precise serial baudrate issue you are trying to fix.
> The core clock is not fixed. I've made PcdSerialClockRate patchable here:
>
> @@ -465,6 +464,9 @@ [PcdsFixedAtBuild.common]
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor|L"EDK2"
> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|TRUE
>
> +[PcdsPatchableInModule]
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|500000000
> +
>
> 500 MHz is the default clock rate (assuming it hasn't been changed in
> config.txt).
> The PCD gets patched in both the PEI and DXE phases to the value read
> from mailbox.
Yeah, I had missed that.
I suppose we can go with what you suggest. But I'm still worried that
the Pi Foundation are going to shuffle their clocks again in a future
firmware, and that we'll be modifying this code yet again, as your patch
is pretty much reverting the code to what we used to have... until we
found it got broken by a newly introduced Pi Foundation firmware.
Regards,
/Pete
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 16:01 ` Pete Batard
@ 2021-04-03 16:15 ` Mario Bălănică
2021-04-03 16:48 ` Pete Batard
0 siblings, 1 reply; 13+ messages in thread
From: Mario Bălănică @ 2021-04-03 16:15 UTC (permalink / raw)
To: Pete Batard, devel
[-- Attachment #1: Type: text/plain, Size: 357 bytes --]
>
> > -#if (RPI_MODEL == 4)
> > - Divisor = MmioRead32(BCM2836_CM_BASE +
> BCM2836_CM_VPU_CLOCK_DIVISOR) & 0xFFFFFF;
> > - if (Divisor != 0)
> > - BaseClockRate = (BaseClockRate << 12) / Divisor;
> > -#endif
>
Keeping this doesn't interfere with the rest of the patch. I've removed it only because it's useless on the latest firmware.
[-- Attachment #2: Type: text/html, Size: 896 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 16:15 ` Mario Bălănică
@ 2021-04-03 16:48 ` Pete Batard
2021-04-03 16:55 ` Mario Bălănică
0 siblings, 1 reply; 13+ messages in thread
From: Pete Batard @ 2021-04-03 16:48 UTC (permalink / raw)
To: devel, mariobalanica02
On 2021.04.03 17:15, Mario Bălănică wrote:
> > -#if (RPI_MODEL == 4)
> > - Divisor = MmioRead32(BCM2836_CM_BASE +
> BCM2836_CM_VPU_CLOCK_DIVISOR) & 0xFFFFFF;
> > - if (Divisor != 0)
> > - BaseClockRate = (BaseClockRate << 12) / Divisor;
> > -#endif
>
> Keeping this doesn't interfere with the rest of the patch. I've removed
> it only because it's useless on the latest firmware.
Okay, then can you please send a v2 of your patch that leaves this in? I
believe this divisor arithmetic is still needed with older versions of
start4.elf, and we may have people using choosing to use an older
start4.elf for whatever reason.
In general, if it doesn't interfere with your proposal, it's better to
leave existing code in, as overzealous code removal may have unintended
consequences, unless you are confident that the code is superfluous.
Also make sure you update the commit message to mention what issue you
are fixing.
Thanks,
/Pete
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 16:48 ` Pete Batard
@ 2021-04-03 16:55 ` Mario Bălănică
2021-04-03 17:32 ` Mario Bălănică
2021-04-03 18:11 ` Pete Batard
0 siblings, 2 replies; 13+ messages in thread
From: Mario Bălănică @ 2021-04-03 16:55 UTC (permalink / raw)
To: Pete Batard, devel
[-- Attachment #1: Type: text/plain, Size: 146 bytes --]
Can you tell me which commit in the firmware repo breaks the mini UART divisor calculation, so that I can test the final changes against it too?
[-- Attachment #2: Type: text/html, Size: 146 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 16:55 ` Mario Bălănică
@ 2021-04-03 17:32 ` Mario Bălănică
2021-04-03 18:11 ` Pete Batard
1 sibling, 0 replies; 13+ messages in thread
From: Mario Bălănică @ 2021-04-03 17:32 UTC (permalink / raw)
To: Mario Bălănică, devel
[-- Attachment #1: Type: text/plain, Size: 200 bytes --]
I assume this is the commit: https://github.com/raspberrypi/firmware/commit/11e3c314bc2b64f7d862bac00ff3d9f42f3c5a50 as per https://github.com/raspberrypi/firmware/issues/1445#issuecomment-708460807
[-- Attachment #2: Type: text/html, Size: 463 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 16:55 ` Mario Bălănică
2021-04-03 17:32 ` Mario Bălănică
@ 2021-04-03 18:11 ` Pete Batard
2021-04-03 22:45 ` Mario Bălănică
1 sibling, 1 reply; 13+ messages in thread
From: Pete Batard @ 2021-04-03 18:11 UTC (permalink / raw)
To: Mario Bălănică, devel
On 2021.04.03 17:55, Mario Bălănică wrote:
> Can you tell me which commit in the firmware repo breaks the mini UART
> divisor calculation, so that I can test the final changes against it too?
That would be one of the start4.elf/fixup4.dat combination around the
time when the commit that added the divisor was introduced. You should
be able to find that commit through git blame and then work your way down.
If you need more information than that, I can try to dig it up, but it
won't happen until at least Tuesday.
Regards,
/Pete
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 18:11 ` Pete Batard
@ 2021-04-03 22:45 ` Mario Bălănică
2021-04-06 11:48 ` Pete Batard
0 siblings, 1 reply; 13+ messages in thread
From: Mario Bălănică @ 2021-04-03 22:45 UTC (permalink / raw)
To: Pete Batard, devel
[-- Attachment #1: Type: text/plain, Size: 689 bytes --]
Okay, I've tested the patch with the firmware from the commit mentioned above and it doesn't work. The VPU clock divisor bit needs PcdSerialClockRate to be set to 1 GHz (so that the quotient becomes equal to the core clock).
The mailbox on the other hand always returns 200 MHz for the core clock. This is definitely a bug, which got fixed it in a later commit.
There isn't any reliable way to support the firmwares with a broken mailbox interface as well in this case, and I really doubt anyone would want to use them with the UEFI in the first place. Your build scripts always include the latest version.
I can resend the patch with a more detailed commit message if you wish.
[-- Attachment #2: Type: text/html, Size: 719 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
2021-04-03 22:45 ` Mario Bălănică
@ 2021-04-06 11:48 ` Pete Batard
0 siblings, 0 replies; 13+ messages in thread
From: Pete Batard @ 2021-04-06 11:48 UTC (permalink / raw)
To: Mario Bălănică, devel
Hi Mario,
Please re-send a v2 with a commit message that explains the issue that
is being fixed. Thanks.
For the record, I ran some tests that show that the divisor was changed
from 1 to 2 with the latest Pi Foundation firmware (which is confirmed
by the fact that if you switch your baudrate from 115200 to 57600,
you'll get the expected output).
I'm not sure what game the Pi Foundation are playing at this stage, coz
they sure don't seem to be following any official logic with how they
actually set the serial clock, and our attempts at second guessing that
logic are no longer working. So I guess the best we can do is go with
whatever gets us output for the latest firmware, and hope they're not
going to break that anytime soon (which is still better than the TF-A
approach, where they got so fed up with this cat and mouse game that
they dropped UART initialization altogether [1])
Regards,
/Pete
[1]
https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/plat/rpi?h=v2.3&id=0eda713b9bd65222155900aacf3a67805351f88f
On 2021.04.03 23:45, Mario Bălănică wrote:
> Okay, I've tested the patch with the firmware from the commit mentioned
> above and it doesn't work. The VPU clock divisor bit needs
> PcdSerialClockRate to be set to 1 GHz (so that the quotient becomes
> equal to the core clock).
>
> The mailbox on the other hand always returns 200 MHz for the core clock.
> This is definitely a bug, which got fixed it in a later commit.
>
> There isn't any reliable way to support the firmwares with a broken
> mailbox interface as well in this case, and I really doubt anyone would
> want to use them with the UEFI in the first place. Your build scripts
> always include the latest version.
>
> I can resend the patch with a more detailed commit message if you wish.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2021-04-06 11:48 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-02 17:51 [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation Mario Bălănică
2021-04-03 7:36 ` Ard Biesheuvel
2021-04-03 12:47 ` Mario Bălănică
2021-04-03 14:35 ` Pete Batard
2021-04-03 15:17 ` [edk2-devel] " Mario Bălănică
2021-04-03 16:01 ` Pete Batard
2021-04-03 16:15 ` Mario Bălănică
2021-04-03 16:48 ` Pete Batard
2021-04-03 16:55 ` Mario Bălănică
2021-04-03 17:32 ` Mario Bălănică
2021-04-03 18:11 ` Pete Batard
2021-04-03 22:45 ` Mario Bălănică
2021-04-06 11:48 ` Pete Batard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox