[PATCH v2] riscv: Add support for AMD/Xilinx MicroBlaze V
Padmarao.Begari at microchip.com
Padmarao.Begari at microchip.com
Tue Dec 5 06:17:15 CET 2023
On Mon, 2023-11-06 at 12:56 +0100, Michal Simek wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
>
> MicroBlaze V is new AMD/Xilinx soft-core 32bit RISC-V processor IP.
> It is hardware compatible with classic MicroBlaze processor.
>
> The patch contains initial wiring and configuration for initial HW
> design
> with memory, cpu, interrupt controller, timers and uartlite console
> (interrupt controller is listed but U-Boot is not using it).
>
> Provided DT is just describing one configuration and should be taken
> only
> as example.
>
> Signed-off-by: Michal Simek <michal.simek at amd.com>
> ---
>
> Changes in v2:
> - Extend commit message
> - DT changes, add interrupt controller, check agains dt schema
> - The patch for amd,mbv32 compatible string is here
> https://lore.kernel.org/r/d442d916204d26f82c1c3a924a4cdfb117960e1b.1699270661.git.michal.simek@amd.com
> - The patch for board compatibility is here
> https://lore.kernel.org/r/50c277c92c41a582ef171fb75efc6a6a4f860be2.1699271616.git.michal.simek@amd.com
>
> xlnx,xps-intc-1.00.a driver exists in the Linux kernel but DT binding
> is
> missing. That's something what we need to work on.
> arch/arm64/boot/dts/xilinx/xilinx-mbv32.dtb:
> /axi/interrupt-controller at 41200000: failed to match any schema with
> compatible: ['xlnx,xps-intc-1.00.a']
>
> Public annoucement is available here if someone is interested.
> https://www.xilinx.com/products/design-tools/microblaze-v.html?utm_source=marketo&utm_medium=email&utm_campaign=EN-EM-2023-11-02-New-MicroBlaze-V-Processor&utm_term=btn&mkt_tok=NDA5LVdZWC03MjQAAAGPMMJYuPPscCags7WdvOeUSWy-_mC9aOwrobFaZRf5ok_eHoQUvTLBzJdHrkcBId9tQ4a-odfnU91WjUkIxx-iSG4OKGofjK5iZcAiK_VN8_xK
>
> ---
> arch/riscv/Kconfig | 4 +
> arch/riscv/dts/Makefile | 2 +
> arch/riscv/dts/xilinx-mbv32.dts | 106
> +++++++++++++++++++++++++++
> board/xilinx/Kconfig | 3 +-
> board/xilinx/common/board.c | 5 ++
> board/xilinx/mbv/Kconfig | 28 +++++++
> board/xilinx/mbv/MAINTAINERS | 7 ++
> board/xilinx/mbv/Makefile | 5 ++
> board/xilinx/mbv/board.c | 11 +++
> configs/xilinx_mbv32_defconfig | 30 ++++++++
> configs/xilinx_mbv32_smode_defconfig | 32 ++++++++
> include/configs/xilinx_mbv.h | 6 ++
> 12 files changed, 238 insertions(+), 1 deletion(-)
> create mode 100644 arch/riscv/dts/xilinx-mbv32.dts
> create mode 100644 board/xilinx/mbv/Kconfig
> create mode 100644 board/xilinx/mbv/MAINTAINERS
> create mode 100644 board/xilinx/mbv/Makefile
> create mode 100644 board/xilinx/mbv/board.c
> create mode 100644 configs/xilinx_mbv32_defconfig
> create mode 100644 configs/xilinx_mbv32_smode_defconfig
> create mode 100644 include/configs/xilinx_mbv.h
>
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 6d0d812ddb55..67126d96af89 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -39,6 +39,9 @@ config TARGET_TH1520_LPI4A
> bool "Support Sipeed's TH1520 Lichee PI 4A Board"
> select SYS_CACHE_SHIFT_6
>
> +config TARGET_XILINX_MBV
> + bool "Support AMD/Xilinx MicroBlaze V"
> +
> endchoice
>
> config SYS_ICACHE_OFF
> @@ -82,6 +85,7 @@ source "board/sifive/unmatched/Kconfig"
> source "board/sipeed/maix/Kconfig"
> source "board/starfive/visionfive2/Kconfig"
> source "board/thead/th1520_lpi4a/Kconfig"
> +source "board/xilinx/mbv/Kconfig"
>
> # platform-specific options below
> source "arch/riscv/cpu/andesv5/Kconfig"
> diff --git a/arch/riscv/dts/Makefile b/arch/riscv/dts/Makefile
> index be6c8a422729..b05bb5607f06 100644
> --- a/arch/riscv/dts/Makefile
> +++ b/arch/riscv/dts/Makefile
> @@ -9,6 +9,8 @@ dtb-$(CONFIG_TARGET_SIFIVE_UNMATCHED) += hifive-
> unmatched-a00.dtb
> dtb-$(CONFIG_TARGET_SIPEED_MAIX) += k210-maix-bit.dtb
> dtb-$(CONFIG_TARGET_STARFIVE_VISIONFIVE2) += jh7110-starfive-
> visionfive-2.dtb
> dtb-$(CONFIG_TARGET_TH1520_LPI4A) += th1520-lichee-pi-4a.dtb
> +dtb-$(CONFIG_TARGET_XILINX_MBV) += xilinx-mbv32.dtb
> +
> include $(srctree)/scripts/Makefile.dts
>
> targets += $(dtb-y)
> diff --git a/arch/riscv/dts/xilinx-mbv32.dts b/arch/riscv/dts/xilinx-
> mbv32.dts
> new file mode 100644
> index 000000000000..6a6b8b694bd1
> --- /dev/null
> +++ b/arch/riscv/dts/xilinx-mbv32.dts
> @@ -0,0 +1,106 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * dts file for AMD MicroBlaze V
> + *
> + * (C) Copyright 2023, Advanced Micro Devices, Inc.
> + *
> + * Michal Simek <michal.simek at amd.com>
> + */
> +
> +/dts-v1/;
> +/ {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + model = "AMD MicroBlaze V 32bit";
> + compatible = "amd,mbv";
> +
> + cpus: cpus {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + timebase-frequency = <102000000>;
> + cpu_0: cpu at 0 {
> + compatible = "amd,mbv32", "riscv";
> + device_type = "cpu";
> + reg = <0>;
> + riscv,isa = "rv32imafdc";
> + i-cache-size = <32768>;
> + d-cache-size = <32768>;
> + clock-frequency = <102000000>;
> + cpu0_intc: interrupt-controller {
> + compatible = "riscv,cpu-intc";
> + interrupt-controller;
> + #interrupt-cells = <1>;
> + };
> + };
> + };
> +
> + aliases {
> + serial0 = &uart0;
> + };
> +
> + chosen {
> + bootargs = "earlycon";
> + stdout-path = "serial0:115200n8";
> + };
> +
> + memory at 20000000 {
> + device_type = "memory";
> + reg = <0x20000000 0x20000000>;
> + };
> +
> + clk102: clock {
> + compatible = "fixed-clock";
> + #clock-cells = <0>;
> + clock-frequency = <102000000>;
> + };
> +
> + axi: axi {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "simple-bus";
> + ranges;
> + bootph-all;
> +
> + axi_intc: interrupt-controller at 41200000 {
> + compatible = "xlnx,xps-intc-1.00.a";
> + reg = <0x41200000 0x1000>;
> + interrupt-controller;
> + interrupt-parent = <&cpu0_intc>;
> + #interrupt-cells = <2>;
> + kind-of-intr = <0>;
> + };
> +
> + xlnx_timer0: timer at 41c00000 {
> + compatible = "xlnx,xps-timer-1.00.a";
> + reg = <0x41c00000 0x1000>;
> + interrupt-parent = <&axi_intc>;
> + interrupts = <1 2>;
> + bootph-all;
> + xlnx,one-timer-only = <0>;
> + clock-names = "s_axi_aclk";
> + clocks = <&clk102>;
> + };
> +
> + xlnx_timer1: timer at 41c20000 {
> + compatible = "xlnx,xps-timer-1.00.a";
> + reg = <0x41c20000 0x1000>;
> + interrupt-parent = <&axi_intc>;
> + interrupts = <0 2>;
> + xlnx,one-timer-only = <0>;
> + clock-names = "s_axi_aclk";
> + clocks = <&clk102>;
> + };
> +
> + uart0: serial at 40600000 {
> + compatible = "xlnx,xps-uartlite-1.00.a";
> + reg = <0x40600000 0x1000>;
> + interrupt-parent = <&axi_intc>;
> + interrupts = <2 2>;
> + bootph-all;
> + clocks = <&clk102>;
> + current-speed = <115200>;
> + xlnx,data-bits = <8>;
> + xlnx,use-parity = <0>;
> + };
> + };
> +};
> diff --git a/board/xilinx/Kconfig b/board/xilinx/Kconfig
> index 4f0776e8bd95..843198fa0da8 100644
> --- a/board/xilinx/Kconfig
> +++ b/board/xilinx/Kconfig
> @@ -51,10 +51,11 @@ config XILINX_OF_BOARD_DTB_ADDR
>
> config BOOT_SCRIPT_OFFSET
> hex "Boot script offset"
> - depends on ARCH_ZYNQ || ARCH_ZYNQMP || ARCH_VERSAL ||
> ARCH_VERSAL_NET || MICROBLAZE
> + depends on ARCH_ZYNQ || ARCH_ZYNQMP || ARCH_VERSAL ||
> ARCH_VERSAL_NET || MICROBLAZE || TARGET_XILINX_MBV
> default 0xFC0000 if ARCH_ZYNQ || MICROBLAZE
> default 0x3E80000 if ARCH_ZYNQMP
> default 0x7F80000 if ARCH_VERSAL || ARCH_VERSAL_NET
> + default 0 if TARGET_XILINX_MBV
> help
> Specifies distro boot script offset in NAND/QSPI/NOR
> flash.
>
> diff --git a/board/xilinx/common/board.c
> b/board/xilinx/common/board.c
> index 9309b071269f..12a877c71549 100644
> --- a/board/xilinx/common/board.c
> +++ b/board/xilinx/common/board.c
> @@ -652,6 +652,11 @@ int embedded_dtb_select(void)
> #endif
>
> #if defined(CONFIG_LMB)
> +
> +#ifndef MMU_SECTION_SIZE
> +#define MMU_SECTION_SIZE (1 * 1024 * 1024)
> +#endif
> +
> phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
> {
> phys_size_t size;
> diff --git a/board/xilinx/mbv/Kconfig b/board/xilinx/mbv/Kconfig
> new file mode 100644
> index 000000000000..4bc9f72c541b
> --- /dev/null
> +++ b/board/xilinx/mbv/Kconfig
> @@ -0,0 +1,28 @@
> +if TARGET_XILINX_MBV
> +
> +config SYS_BOARD
> + default "mbv"
> +
> +config SYS_VENDOR
> + default "xilinx"
> +
> +config SYS_CPU
> + default "generic"
> +
> +config SYS_CONFIG_NAME
> + default "xilinx_mbv"
> +
> +config TEXT_BASE
> + default 0x80000000 if !RISCV_SMODE
> + default 0x80400000 if RISCV_SMODE && ARCH_RV32I
> +
The memory location of this board is at 0x20000000 but using 0x80000000
here and "CONFIG_SYS_LOAD_ADDR=0x80200000" in deconfig.
Is the 0x80000000 memory location used for this board?
Other than that:
Reviewed-by: Padmarao Begari <padmarao.begari at microchip.com>
> +config BOARD_SPECIFIC_OPTIONS
> + def_bool y
> + select GENERIC_RISCV
> + imply BOARD_LATE_INIT
> + imply CMD_SBI
> + imply CMD_PING
> +
> +source "board/xilinx/Kconfig"
> +
> +endif
> diff --git a/board/xilinx/mbv/MAINTAINERS
> b/board/xilinx/mbv/MAINTAINERS
> new file mode 100644
> index 000000000000..445654fe740e
> --- /dev/null
> +++ b/board/xilinx/mbv/MAINTAINERS
> @@ -0,0 +1,7 @@
> +XILINX MicroBlaze V BOARD
> +M: Michal Simek <michal.simek at amd.com>
> +S: Maintained
> +F: arch/riscv/dts/xilinx-mbv*
> +F: board/xilinx/mbv/
> +F: configs/xilinx_mbv*
> +F: include/configs/xilinx_mbv.h
> diff --git a/board/xilinx/mbv/Makefile b/board/xilinx/mbv/Makefile
> new file mode 100644
> index 000000000000..e2fc0c69715f
> --- /dev/null
> +++ b/board/xilinx/mbv/Makefile
> @@ -0,0 +1,5 @@
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# (C) Copyright 2023, Advanced Micro Devices, Inc.
> +
> +obj-y += board.o
> diff --git a/board/xilinx/mbv/board.c b/board/xilinx/mbv/board.c
> new file mode 100644
> index 000000000000..ccf4395d6ace
> --- /dev/null
> +++ b/board/xilinx/mbv/board.c
> @@ -0,0 +1,11 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2023, Advanced Micro Devices, Inc.
> + *
> + * Michal Simek <michal.simek at amd.com>
> + */
> +
> +int board_init(void)
> +{
> + return 0;
> +}
> diff --git a/configs/xilinx_mbv32_defconfig
> b/configs/xilinx_mbv32_defconfig
> new file mode 100644
> index 000000000000..2689495057b0
> --- /dev/null
> +++ b/configs/xilinx_mbv32_defconfig
> @@ -0,0 +1,30 @@
> +CONFIG_RISCV=y
> +CONFIG_TEXT_BASE=0x21200000
> +CONFIG_SYS_MALLOC_LEN=0x800000
> +CONFIG_NR_DRAM_BANKS=1
> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20200000
> +CONFIG_ENV_SIZE=0x20000
> +CONFIG_DEFAULT_DEVICE_TREE="xilinx-mbv32"
> +CONFIG_DEBUG_UART_BASE=0x40600000
> +CONFIG_DEBUG_UART_CLOCK=1000000
> +CONFIG_SYS_CLK_FREQ=100000000
> +CONFIG_BOOT_SCRIPT_OFFSET=0x0
> +CONFIG_SYS_LOAD_ADDR=0x80200000
> +CONFIG_DEBUG_UART=y
> +CONFIG_TARGET_XILINX_MBV=y
> +CONFIG_FIT=y
> +CONFIG_DISTRO_DEFAULTS=y
> +CONFIG_DISPLAY_CPUINFO=y
> +CONFIG_DISPLAY_BOARDINFO=y
> +# CONFIG_BOARD_LATE_INIT is not set
> +# CONFIG_CMD_MII is not set
> +CONFIG_CMD_TIMER=y
> +CONFIG_OF_EMBED=y
> +CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_DM_MTD=y
> +CONFIG_DEBUG_UART_ANNOUNCE=y
> +CONFIG_DEBUG_UART_SKIP_INIT=y
> +CONFIG_XILINX_UARTLITE=y
> +CONFIG_XILINX_TIMER=y
> +CONFIG_PANIC_HANG=y
> diff --git a/configs/xilinx_mbv32_smode_defconfig
> b/configs/xilinx_mbv32_smode_defconfig
> new file mode 100644
> index 000000000000..c724d1bad742
> --- /dev/null
> +++ b/configs/xilinx_mbv32_smode_defconfig
> @@ -0,0 +1,32 @@
> +CONFIG_RISCV=y
> +CONFIG_TEXT_BASE=0x21200000
> +CONFIG_SYS_MALLOC_LEN=0x800000
> +CONFIG_NR_DRAM_BANKS=1
> +CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
> +CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20200000
> +CONFIG_ENV_SIZE=0x20000
> +CONFIG_DEFAULT_DEVICE_TREE="xilinx-mbv32"
> +CONFIG_DEBUG_UART_BASE=0x40600000
> +CONFIG_DEBUG_UART_CLOCK=1000000
> +CONFIG_SYS_CLK_FREQ=100000000
> +CONFIG_BOOT_SCRIPT_OFFSET=0x0
> +CONFIG_SYS_LOAD_ADDR=0x80200000
> +CONFIG_TARGET_XILINX_MBV=y
> +CONFIG_RISCV_SMODE=y
> +CONFIG_FIT=y
> +CONFIG_DISTRO_DEFAULTS=y
> +CONFIG_DISPLAY_CPUINFO=y
> +CONFIG_DISPLAY_BOARDINFO=y
> +# CONFIG_BOARD_LATE_INIT is not set
> +# CONFIG_CMD_MII is not set
> +CONFIG_CMD_TIMER=y
> +CONFIG_OF_EMBED=y
> +CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_DM_MTD=y
> +CONFIG_DEBUG_UART_UARTLITE=y
> +CONFIG_DEBUG_UART_ANNOUNCE=y
> +CONFIG_DEBUG_UART_SKIP_INIT=y
> +CONFIG_XILINX_UARTLITE=y
> +# CONFIG_RISCV_TIMER is not set
> +CONFIG_XILINX_TIMER=y
> +CONFIG_PANIC_HANG=y
> diff --git a/include/configs/xilinx_mbv.h
> b/include/configs/xilinx_mbv.h
> new file mode 100644
> index 000000000000..dba398aeec49
> --- /dev/null
> +++ b/include/configs/xilinx_mbv.h
> @@ -0,0 +1,6 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * (C) Copyright 2023, Advanced Micro Devices, Inc.
> + *
> + * Michal Simek <michal.simek at amd.com>
> + */
> --
> 2.36.1
>
More information about the U-Boot
mailing list