Hi,

Sorry for the formatting.

On Thu, 1 Jun 2023 at 12:31, Michal Orzel <michal.or...@amd.com> wrote:

> Hi Bertrand,
>
> On 01/06/2023 12:19, Bertrand Marquis wrote:
> >
> >
> > Hi Michal,
> >
> >> On 1 Jun 2023, at 10:50, Michal Orzel <michal.or...@amd.com> wrote:
> >>
> >> There are implementations of the PL011 that can only handle 32-bit
> >> accesses (i.e. no 16-bit or 8-bit), usually advertised by 'reg-io-width'
> >> dt property set to 4. On such UARTs, the current early printk code for
> >> arm64 does not work. To fix this issue, make all the accesses to be
> 32-bit
> >> by using ldr, str without a size field. This makes it possible to use
> >> early printk on such platforms, while all the other implementations
> should
> >> generally cope with 32-bit accesses. In case they do not, they would
> >> already fail as we explicitly use writel/readl in the runtime driver to
> >> maintain broader compatibility and to be SBSAv2 compliant. Therefore,
> this
> >> change makes the runtime/early handling consistent (also it matches the
> >> arm32 debug-pl011 code).
> >>
> >> Signed-off-by: Michal Orzel <michal.or...@amd.com>
> >> ---
> >> xen/arch/arm/arm64/debug-pl011.inc | 8 ++++----
> >> 1 file changed, 4 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/xen/arch/arm/arm64/debug-pl011.inc
> b/xen/arch/arm/arm64/debug-pl011.inc
> >> index 6d60e78c8ba3..80eb8fdc1ec7 100644
> >> --- a/xen/arch/arm/arm64/debug-pl011.inc
> >> +++ b/xen/arch/arm/arm64/debug-pl011.inc
> >> @@ -25,9 +25,9 @@
> >>  */
> >> .macro early_uart_init xb, c
> >>         mov   x\c, #(7372800 / CONFIG_EARLY_UART_PL011_BAUD_RATE % 16)
> >> -        strh  w\c, [\xb, #FBRD]      /* -> UARTFBRD (Baud divisor
> fraction) */
> >> +        str   w\c, [\xb, #FBRD]      /* -> UARTFBRD (Baud divisor
> fraction) */
> >>         mov   x\c, #(7372800 / CONFIG_EARLY_UART_PL011_BAUD_RATE / 16)
> >> -        strh  w\c, [\xb, #IBRD]      /* -> UARTIBRD (Baud divisor
> integer) */
> >> +        str   w\c, [\xb, #IBRD]      /* -> UARTIBRD (Baud divisor
> integer) */
> >>         mov   x\c, #WLEN_8           /* 8n1 */
> >>         str   w\c, [\xb, #LCR_H]     /* -> UARTLCR_H (Line control) */
> >>         ldr   x\c, =(RXE | TXE | UARTEN)
> >> @@ -41,7 +41,7 @@
> >>  */
> >> .macro early_uart_ready xb, c
> >> 1:
> >> -        ldrh  w\c, [\xb, #FR]        /* <- UARTFR (Flag register) */
> >> +        ldr   w\c, [\xb, #FR]        /* <- UARTFR (Flag register) */
> >>         tst   w\c, #BUSY             /* Check BUSY bit */
> >>         b.ne  1b                     /* Wait for the UART to be ready
> */
> >> .endm
> >> @@ -52,7 +52,7 @@
> >>  * wt: register which contains the character to transmit
> >>  */
> >> .macro early_uart_transmit xb, wt
> >> -        strb  \wt, [\xb, #DR]        /* -> UARTDR (Data Register) */
> >> +        str   \wt, [\xb, #DR]        /* -> UARTDR (Data Register) */
> >
> > Is it really ok to drop the 8bit access here ?
> It is not only ok, it is necessary. Otherwise it won't work on the above
> mentioned UARTs (they can only perform 32-bit access).


IIRC some compilers will complain because you use wN with “str”.


> And following to what I wrote in commit msg:
> - we use str already in arm32 which results in 32-bit access


> - we use reald/writel that end up as str/ldr in runtime driver


> - we are down to SBSAv2 spec that runtime driver follows (meaning we can
> use early printk for SBSA too)


The runtime driver is meant to follow the PL011 spec first and may have
some adaptation for SBSA.


> - this way we support broader list of PL011s consistently (i.e. both early
> and runtime driver works as oppose to only runtime)


 I am not sure I agree here. You are focussing on HW that only support
32-bit access. And, AFAICT this shouldn’t be the norm.

I think it would be best if we have an option to select the width supported
and modify the code accordingly.

And yes, I know that there might be some issues in the runtime driver. But
they can be handled separately. With that we don’t promote a behaviour that
AFAICT is not meant to be normal.


>
> Also, before every early_uart_transmit we use ldrb (to convert to char)
> which means that the rest of the \wt register (8:31) is zero extended.
>
> ~Michal
>

Reply via email to