[PATCH v2] lib: utils/serial: support 'reg-offset' property

Anup Patel anup at brainfault.org
Sun Apr 17 01:56:48 PDT 2022


On Fri, Apr 15, 2022 at 7:54 AM Zong Li <zong.li at sifive.com> wrote:
>
> reg-offset property is used for offset to apply to the mapbase
> from the start of the registers in 8250 UART. In Linux kernel,
> it has been handled in 8250 UART driver.
>
> dt-bindings:
> <linux>/Documentation/devicetree/bindings/serial/8250.yaml
>
> Signed-off-by: Zong Li <zong.li at sifive.com>
> Reviewed-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo

Thanks,
Anup

> ---
>
> Changed in v2:
>  - Fix the typo
>  - Rebased on the latest master
>
>  include/sbi_utils/fdt/fdt_helper.h     | 1 +
>  include/sbi_utils/serial/uart8250.h    | 2 +-
>  lib/utils/fdt/fdt_helper.c             | 7 +++++++
>  lib/utils/serial/fdt_serial_uart8250.c | 3 ++-
>  lib/utils/serial/uart8250.c            | 4 ++--
>  platform/andes/ae350/platform.c        | 3 ++-
>  platform/andes/ae350/platform.h        | 1 +
>  platform/fpga/ariane/platform.c        | 4 +++-
>  platform/fpga/openpiton/platform.c     | 4 +++-
>  platform/template/platform.c           | 2 +-
>  10 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h
> index 41ee826..2279f96 100644
> --- a/include/sbi_utils/fdt/fdt_helper.h
> +++ b/include/sbi_utils/fdt/fdt_helper.h
> @@ -31,6 +31,7 @@ struct platform_uart_data {
>         unsigned long baud;
>         unsigned long reg_shift;
>         unsigned long reg_io_width;
> +       unsigned long reg_offset;
>  };
>
>  const struct fdt_match *fdt_match_node(void *fdt, int nodeoff,
> diff --git a/include/sbi_utils/serial/uart8250.h b/include/sbi_utils/serial/uart8250.h
> index 6b9b48b..d4a8c13 100644
> --- a/include/sbi_utils/serial/uart8250.h
> +++ b/include/sbi_utils/serial/uart8250.h
> @@ -13,6 +13,6 @@
>  #include <sbi/sbi_types.h>
>
>  int uart8250_init(unsigned long base, u32 in_freq, u32 baudrate, u32 reg_shift,
> -                 u32 reg_width);
> +                 u32 reg_width, u32 reg_offset);
>
>  #endif
> diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c
> index 4dd0602..9a35969 100644
> --- a/lib/utils/fdt/fdt_helper.c
> +++ b/lib/utils/fdt/fdt_helper.c
> @@ -21,6 +21,7 @@
>  #define DEFAULT_UART_BAUD              115200
>  #define DEFAULT_UART_REG_SHIFT         0
>  #define DEFAULT_UART_REG_IO_WIDTH      1
> +#define DEFAULT_UART_REG_OFFSET                0
>
>  #define DEFAULT_SIFIVE_UART_FREQ               0
>  #define DEFAULT_SIFIVE_UART_BAUD               115200
> @@ -449,6 +450,12 @@ int fdt_parse_uart8250_node(void *fdt, int nodeoffset,
>         else
>                 uart->reg_io_width = DEFAULT_UART_REG_IO_WIDTH;
>
> +       val = (fdt32_t *)fdt_getprop(fdt, nodeoffset, "reg-offset", &len);
> +       if (len > 0 && val)
> +               uart->reg_offset = fdt32_to_cpu(*val);
> +       else
> +               uart->reg_offset = DEFAULT_UART_REG_OFFSET;
> +
>         return 0;
>  }
>
> diff --git a/lib/utils/serial/fdt_serial_uart8250.c b/lib/utils/serial/fdt_serial_uart8250.c
> index 36f364c..544b741 100644
> --- a/lib/utils/serial/fdt_serial_uart8250.c
> +++ b/lib/utils/serial/fdt_serial_uart8250.c
> @@ -22,7 +22,8 @@ static int serial_uart8250_init(void *fdt, int nodeoff,
>                 return rc;
>
>         return uart8250_init(uart.addr, uart.freq, uart.baud,
> -                            uart.reg_shift, uart.reg_io_width);
> +                            uart.reg_shift, uart.reg_io_width,
> +                            uart.reg_offset);
>  }
>
>  static const struct fdt_match serial_uart8250_match[] = {
> diff --git a/lib/utils/serial/uart8250.c b/lib/utils/serial/uart8250.c
> index 141bd45..38ea11a 100644
> --- a/lib/utils/serial/uart8250.c
> +++ b/lib/utils/serial/uart8250.c
> @@ -91,11 +91,11 @@ static struct sbi_console_device uart8250_console = {
>  };
>
>  int uart8250_init(unsigned long base, u32 in_freq, u32 baudrate, u32 reg_shift,
> -                 u32 reg_width)
> +                 u32 reg_width, u32 reg_offset)
>  {
>         u16 bdiv;
>
> -       uart8250_base      = (volatile char *)base;
> +       uart8250_base      = (volatile char *)base + reg_offset;
>         uart8250_reg_shift = reg_shift;
>         uart8250_reg_width = reg_width;
>         uart8250_in_freq   = in_freq;
> diff --git a/platform/andes/ae350/platform.c b/platform/andes/ae350/platform.c
> index 01232d0..6bd0a69 100644
> --- a/platform/andes/ae350/platform.c
> +++ b/platform/andes/ae350/platform.c
> @@ -69,7 +69,8 @@ static int ae350_console_init(void)
>                              AE350_UART_FREQUENCY,
>                              AE350_UART_BAUDRATE,
>                              AE350_UART_REG_SHIFT,
> -                            AE350_UART_REG_WIDTH);
> +                            AE350_UART_REG_WIDTH,
> +                            AE350_UART_REG_OFFSET);
>  }
>
>  /* Initialize the platform interrupt controller for current HART. */
> diff --git a/platform/andes/ae350/platform.h b/platform/andes/ae350/platform.h
> index f34ca0f..9b54816 100644
> --- a/platform/andes/ae350/platform.h
> +++ b/platform/andes/ae350/platform.h
> @@ -28,6 +28,7 @@
>  #define AE350_UART_BAUDRATE            38400
>  #define AE350_UART_REG_SHIFT           2
>  #define AE350_UART_REG_WIDTH           0
> +#define AE350_UART_REG_OFFSET          0
>
>  /*Memory and Miscellaneous Registers*/
>  #define CSR_MILMB              0x7c0
> diff --git a/platform/fpga/ariane/platform.c b/platform/fpga/ariane/platform.c
> index c6f0ffd..3fdc03b 100644
> --- a/platform/fpga/ariane/platform.c
> +++ b/platform/fpga/ariane/platform.c
> @@ -23,6 +23,7 @@
>  #define ARIANE_UART_BAUDRATE                   115200
>  #define ARIANE_UART_REG_SHIFT                  2
>  #define ARIANE_UART_REG_WIDTH                  4
> +#define ARIANE_UART_REG_OFFSET                 0
>  #define ARIANE_PLIC_ADDR                       0xc000000
>  #define ARIANE_PLIC_NUM_SOURCES                        3
>  #define ARIANE_HART_COUNT                      1
> @@ -92,7 +93,8 @@ static int ariane_console_init(void)
>                              ARIANE_UART_FREQ,
>                              ARIANE_UART_BAUDRATE,
>                              ARIANE_UART_REG_SHIFT,
> -                            ARIANE_UART_REG_WIDTH);
> +                            ARIANE_UART_REG_WIDTH,
> +                            ARIANE_UART_REG_OFFSET);
>  }
>
>  static int plic_ariane_warm_irqchip_init(int m_cntx_id, int s_cntx_id)
> diff --git a/platform/fpga/openpiton/platform.c b/platform/fpga/openpiton/platform.c
> index 59c6702..15e289a 100644
> --- a/platform/fpga/openpiton/platform.c
> +++ b/platform/fpga/openpiton/platform.c
> @@ -22,6 +22,7 @@
>  #define OPENPITON_DEFAULT_UART_BAUDRATE                115200
>  #define OPENPITON_DEFAULT_UART_REG_SHIFT       0
>  #define OPENPITON_DEFAULT_UART_REG_WIDTH       1
> +#define OPENPITON_DEFAULT_UART_REG_OFFSET      0
>  #define OPENPITON_DEFAULT_PLIC_ADDR            0xfff1100000
>  #define OPENPITON_DEFAULT_PLIC_NUM_SOURCES     2
>  #define OPENPITON_DEFAULT_HART_COUNT           3
> @@ -127,7 +128,8 @@ static int openpiton_console_init(void)
>                              uart.freq,
>                              uart.baud,
>                              OPENPITON_DEFAULT_UART_REG_SHIFT,
> -                            OPENPITON_DEFAULT_UART_REG_WIDTH);
> +                            OPENPITON_DEFAULT_UART_REG_WIDTH,
> +                            OPENPITON_DEFAULT_UART_REG_OFFSET);
>  }
>
>  static int plic_openpiton_warm_irqchip_init(int m_cntx_id, int s_cntx_id)
> diff --git a/platform/template/platform.c b/platform/template/platform.c
> index d6806e6..5524847 100644
> --- a/platform/template/platform.c
> +++ b/platform/template/platform.c
> @@ -79,7 +79,7 @@ static int platform_console_init(void)
>  {
>         /* Example if the generic UART8250 driver is used */
>         return uart8250_init(PLATFORM_UART_ADDR, PLATFORM_UART_INPUT_FREQ,
> -                            PLATFORM_UART_BAUDRATE, 0, 1);
> +                            PLATFORM_UART_BAUDRATE, 0, 1, 0);
>  }
>
>  /*
> --
> 2.17.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list