Hi Daniel,

On Tue, Aug 25, 2026 at 4:24 PM Daniel Henrique Barboza
<[email protected]> wrote:
>
> Add a common uart FDT helper to be used by 'virt' and 'tt-atlantis'.
>
> To accomodate both boards the helper is doing the following:
> - an 'additional_reg_props' flag is used to control whether we want
>   'reg-shift' and 'reg-io-width' elements added.  OpenSBI won't boot
>   with the tt-atlantis board without them, but 'virt' can't deal with
>   them being added unconditionally either.
> - an 'is_serial0' flag is added to control whether we need to set
>   additional properties related to the first serial.  This is required
>   because the 'virt' board adds two uarts in the FDT.
>
> No FDT changes intended.
>
> Signed-off-by: Daniel Henrique Barboza <[email protected]>
> ---
>  hw/riscv/fdt-common.c         | 39 +++++++++++++++++++++++++++++++
>  hw/riscv/tt_atlantis.c        | 21 +----------------
>  hw/riscv/virt.c               | 44 +++++++----------------------------
>  include/hw/riscv/fdt-common.h |  4 ++++
>  4 files changed, 52 insertions(+), 56 deletions(-)
>
> diff --git a/hw/riscv/fdt-common.c b/hw/riscv/fdt-common.c
> index f31cc9d3cc..b3f3af3762 100644
> --- a/hw/riscv/fdt-common.c
> +++ b/hw/riscv/fdt-common.c
> @@ -791,3 +791,42 @@ void create_fdt_socket_aclint(void *fdt, ACLINTFdtProps 
> *props,
>          g_free(name);
>      }
>  }
> +
> +void create_fdt_uart(void *fdt, const MemMapEntry *uart_mem,
> +                     int uart_irq, int aia_type,
> +                     bool additional_reg_props, bool is_serial0,
> +                     uint32_t irq_mmio_phandle)
> +{
> +    g_autofree char *name = NULL;
> +
> +    name = g_strdup_printf("/soc/serial@%"HWADDR_PRIx, uart_mem->base);
> +    qemu_fdt_add_subnode(fdt, name);
> +    qemu_fdt_setprop_string(fdt, name, "compatible", "ns16550a");
> +    qemu_fdt_setprop_sized_cells(fdt, name, "reg",
> +                                 2, uart_mem->base,
> +                                 2, uart_mem->size);
> +
> +    /*
> +     * The tt-atlantis board requires these extra props in the
> +     * DT, but adding them unconditionally will break OpenSBI
> +     * for 'virt'.
> +     */
> +    if (additional_reg_props) {
> +        qemu_fdt_setprop_cell(fdt, name, "reg-shift", 2);
> +        qemu_fdt_setprop_cell(fdt, name, "reg-io-width", 4);
> +    }

I think the issue is that atlantis uses a uart that has 32 bit
register spacing (0x0, 0x4, 0x8, 0xc....) rather than 8 bit spacing
(0x0, 0x1, 0x2...). So rather than "additional_reg_props", would a
name like "word_addressing" or "32_bit_spacing" make sense?

Regards
Anirudh Srinivasan

Reply via email to