public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Pete Batard" <pete@akeo.ie>
To: "Mario Bălănică" <mariobalanica02@gmail.com>,
	"Ard Biesheuvel" <ardb@kernel.org>
Cc: devel@edk2.groups.io, Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Leif Lindholm <leif@nuviainc.com>
Subject: Re: [edk2-platforms][PATCH 1/1] Platform/RaspberryPi: Fix mini UART baud divisor calculation
Date: Sat, 3 Apr 2021 15:35:36 +0100	[thread overview]
Message-ID: <6ebf4605-b011-a430-968b-d0f85cf91769@akeo.ie> (raw)
In-Reply-To: <CAA3kFM9wY+f4VcSv6hu860Zwz9eGy+Xm7B-yVnY5eoiwqRSvDw@mail.gmail.com>

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
>      >
> 


  reply	other threads:[~2021-04-03 14:35 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

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=6ebf4605-b011-a430-968b-d0f85cf91769@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