On 30.04.18 09:37, Michal Simek wrote:
> Xilinx ZynqMP also contains dual Cortex R5 which can run U-Boot.
> This patch is adding minimal support to get U-Boot boot.
> U-Boot on R5 runs out of DDR with default configuration that's why
> DDR needs to be partitioned if there is something else running on arm64.
> Console is done via Cadence uart driver and the first Cadence Triple
> Timer Counter is used for time.
> 
> This configuration with uart1 was tested on zcu100-revC.
> 
> U-Boot 2018.05-rc2-00021-gd058a08d907d (Apr 18 2018 - 14:11:27 +0200)
> 
> Model: Xilinx ZynqMP R5
> DRAM:  512 MiB
> WARNING: Caches not enabled
> MMC:
> In:    serial@ff010000
> Out:   serial@ff010000
> Err:   serial@ff010000
> Net:   Net Initialization Skipped
> No ethernet found.
> ZynqMP r5>
> 
> There are two ways how to run this on ZynqMP.
> 1. Run from ZynqMP arm64
> tftpb 20000000 u-boot-r5.elf
> setenv autostart no && bootelf -p 20000000
> cpu 4 disable && cpu 4 release 10000000 lockstep
> or
> cpu 4 disable && cpu 4 release 10000000 split
> 
> 2. Load via jtag when directly to R5
> 
> Signed-off-by: Michal Simek <michal.si...@xilinx.com>
> ---
> 
> Changes in v2:
> - Make this a single patch because core support was handled by Lokesh
>   Vulta R5 series. Rebase on the top of this series
> - Add reset_cpu which is not handle by core
> - Add MPU support to enable only 0-512MB and RO for 512MB-2GB
> - Enable cache support
> - Wire MTEST macros but not enable mtest command
> 
> Changes compare to RFC
> - Use 500MHz instead of 600MHz
> - Remove fpu compilation flags
> - Split arm-r5 code and platform
> 
> ---
>  MAINTAINERS                        |  6 +++
>  arch/arm/Kconfig                   | 10 ++++
>  arch/arm/Makefile                  |  1 +
>  arch/arm/dts/Makefile              |  2 +
>  arch/arm/dts/zynqmp-r5.dts         | 73 ++++++++++++++++++++++++++++++
>  arch/arm/mach-zynqmp-r5/Kconfig    | 27 +++++++++++
>  arch/arm/mach-zynqmp-r5/Makefile   |  3 ++
>  arch/arm/mach-zynqmp-r5/cpu.c      | 37 +++++++++++++++
>  board/xilinx/zynqmp_r5/MAINTAINERS |  7 +++
>  board/xilinx/zynqmp_r5/Makefile    |  6 +++
>  board/xilinx/zynqmp_r5/board.c     | 25 ++++++++++
>  configs/xilinx_zynqmp_r5_defconfig | 16 +++++++
>  drivers/serial/Kconfig             |  2 +-
>  include/configs/xilinx_zynqmp_r5.h | 51 +++++++++++++++++++++
>  14 files changed, 265 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/dts/zynqmp-r5.dts
>  create mode 100644 arch/arm/mach-zynqmp-r5/Kconfig
>  create mode 100644 arch/arm/mach-zynqmp-r5/Makefile
>  create mode 100644 arch/arm/mach-zynqmp-r5/cpu.c
>  create mode 100644 board/xilinx/zynqmp_r5/MAINTAINERS
>  create mode 100644 board/xilinx/zynqmp_r5/Makefile
>  create mode 100644 board/xilinx/zynqmp_r5/board.c
>  create mode 100644 configs/xilinx_zynqmp_r5_defconfig
>  create mode 100644 include/configs/xilinx_zynqmp_r5.h
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 147551f66fd3..e60d76dbad8a 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -295,6 +295,12 @@ F:       include/zynqmppl.h
>  F:   tools/zynqimage.c
>  N:   zynqmp
>  
> +ARM ZYNQMP R5
> +M:   Michal Simek <michal.si...@xilinx.com>
> +S:   Maintained
> +T:   git git://git.denx.de/u-boot-microblaze.git
> +F:   arch/arm/mach-zynqmp-r5/
> +
>  BUILDMAN
>  M:   Simon Glass <s...@chromium.org>
>  S:   Maintained
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index f07f17f053ff..13e06ff763d0 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -823,6 +823,14 @@ config ARCH_ZYNQ
>       imply CMD_SPL
>       imply ARCH_EARLY_INIT_R
>  
> +config ARCH_ZYNQMP_R5
> +     bool "Xilinx ZynqMP R5 based platform"
> +     select CPU_V7R
> +     select OF_CONTROL
> +     select DM
> +     select DM_SERIAL
> +     select CLK
> +
>  config ARCH_ZYNQMP
>       bool "Xilinx ZynqMP based platform"
>       select ARM64
> @@ -1345,6 +1353,8 @@ source "arch/arm/cpu/armv7/vf610/Kconfig"
>  
>  source "arch/arm/mach-zynq/Kconfig"
>  
> +source "arch/arm/mach-zynqmp-r5/Kconfig"
> +
>  source "arch/arm/cpu/armv7/Kconfig"
>  
>  source "arch/arm/cpu/armv8/zynqmp/Kconfig"
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index 3f5343bc017b..63e2b89ee7ef 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -78,6 +78,7 @@ machine-$(CONFIG_ARCH_STM32MP)              += stm32mp
>  machine-$(CONFIG_TEGRA)                      += tegra
>  machine-$(CONFIG_ARCH_UNIPHIER)              += uniphier
>  machine-$(CONFIG_ARCH_ZYNQ)          += zynq
> +machine-$(CONFIG_ARCH_ZYNQMP_R5)     += zynqmp-r5
>  
>  machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
>  
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 1fb36b3ecdb3..d44a4310081e 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -165,6 +165,8 @@ dtb-$(CONFIG_ARCH_ZYNQMP) += \
>       zynqmp-zc1751-xm017-dc3.dtb             \
>       zynqmp-zc1751-xm018-dc4.dtb             \
>       zynqmp-zc1751-xm019-dc5.dtb
> +dtb-$(CONFIG_ARCH_ZYNQMP_R5) += \
> +     zynqmp-r5.dtb
>  dtb-$(CONFIG_AM33XX) += am335x-boneblack.dtb am335x-bone.dtb \
>       am335x-draco.dtb \
>       am335x-evm.dtb \
> diff --git a/arch/arm/dts/zynqmp-r5.dts b/arch/arm/dts/zynqmp-r5.dts
> new file mode 100644
> index 000000000000..a72172ef2ea4
> --- /dev/null
> +++ b/arch/arm/dts/zynqmp-r5.dts
> @@ -0,0 +1,73 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * dts file for Xilinx ZynqMP R5
> + *
> + * (C) Copyright 2018, Xilinx, Inc.
> + *
> + * Michal Simek <michal.si...@xilinx.com>
> + */
> +
> +/dts-v1/;
> +
> +/ {
> +     #address-cells = <1>;
> +     #size-cells = <1>;
> +     compatible = "xlnx,zynqmp-r5";
> +     model = "Xilinx ZynqMP R5";
> +
> +     cpus {
> +             #address-cells = <0x1>;
> +             #size-cells = <0x0>;
> +
> +             cpu@0 {
> +                     compatible = "arm,cortex-r5";
> +                     device_type = "cpu";
> +                     reg = <0>;
> +             };
> +     };
> +
> +     aliases {
> +             serial0 = &uart1;
> +     };
> +
> +     memory@0 {
> +             device_type = "memory";
> +             reg = <0x00000000 0x20000000>;
> +     };
> +
> +     chosen {
> +             bootargs = "";
> +             stdout-path = "serial0:115200n8";
> +     };
> +
> +     clk100: clk100 {
> +             compatible = "fixed-clock";
> +             #clock-cells = <0>;
> +             clock-frequency = <100000000>;
> +             u-boot,dm-pre-reloc;
> +     };
> +
> +     amba {
> +             u-boot,dm-pre-reloc;
> +             compatible = "simple-bus";
> +             #address-cells = <1>;
> +             #size-cells = <1>;
> +             ranges;
> +
> +             ttc0: timer@ff110000 {
> +                     compatible = "cdns,ttc";
> +                     status = "okay";
> +                     reg = <0xff110000 0x1000>;
> +                     timer-width = <32>;
> +                     clocks = <&clk100>;
> +             };
> +
> +             uart1: serial@ff010000 {
> +                     u-boot,dm-pre-reloc;
> +                     compatible = "cdns,uart-r1p12", "xlnx,xuartps";
> +                     reg = <0xff010000 0x1000>;
> +                     clock-names = "uart_clk", "pclk";
> +                     clocks = <&clk100 &clk100>;
> +             };
> +     };
> +};
> diff --git a/arch/arm/mach-zynqmp-r5/Kconfig b/arch/arm/mach-zynqmp-r5/Kconfig
> new file mode 100644
> index 000000000000..5e0175413395
> --- /dev/null
> +++ b/arch/arm/mach-zynqmp-r5/Kconfig
> @@ -0,0 +1,27 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +if ARCH_ZYNQMP_R5
> +
> +config SYS_BOARD
> +     string "Board name"
> +     default "zynqmp_r5"
> +
> +config SYS_VENDOR
> +     string "Vendor name"
> +     default "xilinx"
> +
> +config SYS_SOC
> +     default "zynqmp-r5"
> +
> +config SYS_CONFIG_NAME
> +     string "Board configuration name"
> +     default "xilinx_zynqmp_r5"
> +     help
> +       This option contains information about board configuration name.
> +       Based on this option include/configs/<CONFIG_SYS_CONFIG_NAME>.h header
> +       will be used for board configuration.
> +
> +config SYS_MALLOC_F_LEN
> +     default 0x600
> +
> +endif
> diff --git a/arch/arm/mach-zynqmp-r5/Makefile 
> b/arch/arm/mach-zynqmp-r5/Makefile
> new file mode 100644
> index 000000000000..0d39e97dd371
> --- /dev/null
> +++ b/arch/arm/mach-zynqmp-r5/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +obj-y        += cpu.o
> diff --git a/arch/arm/mach-zynqmp-r5/cpu.c b/arch/arm/mach-zynqmp-r5/cpu.c
> new file mode 100644
> index 000000000000..4e855616b319
> --- /dev/null
> +++ b/arch/arm/mach-zynqmp-r5/cpu.c
> @@ -0,0 +1,37 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2018 Xilinx, Inc. (Michal Simek)
> + */
> +
> +#include <common.h>
> +#include <asm/armv7m_mpu.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +struct mpu_region_config region_config[] = {
> +     { 0x00000000, REGION_0, XN_DIS, PRIV_RW_USR_RW,
> +       O_I_WB_RD_WR_ALLOC, REGION_1GB },
> +     { 0x20000000, REGION_1, XN_EN, PRIV_RO_USR_RO,
> +       O_I_WB_RD_WR_ALLOC, REGION_512MB },
> +     { 0x40000000, REGION_2, XN_EN, PRIV_RO_USR_RO,
> +       O_I_WB_RD_WR_ALLOC, REGION_1GB },
> +};
> +
> +int arch_cpu_init(void)
> +{
> +     gd->cpu_clk = CONFIG_CPU_FREQ_HZ;
> +
> +     setup_mpu_regions(region_config, sizeof(region_config) /
> +                       sizeof(struct mpu_region_config));
> +
> +     return 0;
> +}
> +
> +/*
> + * Perform the low-level reset.
> + */
> +void reset_cpu(ulong addr)
> +{
> +     while (1)
> +             ;
> +}
> diff --git a/board/xilinx/zynqmp_r5/MAINTAINERS 
> b/board/xilinx/zynqmp_r5/MAINTAINERS
> new file mode 100644
> index 000000000000..ac267649781a
> --- /dev/null
> +++ b/board/xilinx/zynqmp_r5/MAINTAINERS
> @@ -0,0 +1,7 @@
> +XILINX_ZYNQMP_R5 BOARDS
> +M:   Michal Simek <michal.si...@xilinx.com>
> +S:   Maintained
> +F:   arch/arm/dts/zynqmp-r5*
> +F:   board/xilinx/zynqmp_r5/
> +F:   include/configs/xilinx_zynqmp_r5_*
> +F:   configs/xilinx_zynqmp_r5_*
> diff --git a/board/xilinx/zynqmp_r5/Makefile b/board/xilinx/zynqmp_r5/Makefile
> new file mode 100644
> index 000000000000..c5a3e3d328bd
> --- /dev/null
> +++ b/board/xilinx/zynqmp_r5/Makefile
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# (C) Copyright 2018 Xilinx, Inc. (Michal Simek)
> +#
> +
> +obj-y        := board.o
> diff --git a/board/xilinx/zynqmp_r5/board.c b/board/xilinx/zynqmp_r5/board.c
> new file mode 100644
> index 000000000000..70fb20235498
> --- /dev/null
> +++ b/board/xilinx/zynqmp_r5/board.c
> @@ -0,0 +1,25 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * (C) Copyright 2018 Xilinx, Inc. (Michal Simek)
> + */
> +
> +#include <common.h>
> +#include <fdtdec.h>
> +
> +int board_init(void)
> +{
> +     return 0;
> +}
> +
> +int dram_init_banksize(void)
> +{
> +     return fdtdec_setup_memory_banksize();
> +}
> +
> +int dram_init(void)
> +{
> +     if (fdtdec_setup_memory_size() != 0)
> +             return -EINVAL;
> +
> +     return 0;
> +}
> diff --git a/configs/xilinx_zynqmp_r5_defconfig 
> b/configs/xilinx_zynqmp_r5_defconfig
> new file mode 100644
> index 000000000000..46715242e703
> --- /dev/null
> +++ b/configs/xilinx_zynqmp_r5_defconfig
> @@ -0,0 +1,16 @@
> +CONFIG_ARM=y
> +CONFIG_ARCH_ZYNQMP_R5=y
> +CONFIG_SYS_TEXT_BASE=0x10000000
> +CONFIG_DEFAULT_DEVICE_TREE="zynqmp-r5"
> +CONFIG_DEBUG_UART=y
> +# CONFIG_DISPLAY_CPUINFO is not set
> +CONFIG_SYS_PROMPT="ZynqMP r5> "
> +# CONFIG_CMD_FLASH is not set
> +# CONFIG_CMD_SETEXPR is not set
> +CONFIG_OF_EMBED=y
> +CONFIG_DEBUG_UART_ZYNQ=y
> +CONFIG_DEBUG_UART_BASE=0xff010000
> +CONFIG_DEBUG_UART_CLOCK=100000000
> +CONFIG_ZYNQ_SERIAL=y
> +CONFIG_TIMER=y
> +CONFIG_CADENCE_TTC_TIMER=y
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index 4be8868536d8..5937910e5bf9 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -624,7 +624,7 @@ config STM32_SERIAL
>  
>  config ZYNQ_SERIAL
>       bool "Cadence (Xilinx Zynq) UART support"
> -     depends on DM_SERIAL && (MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP)
> +     depends on DM_SERIAL && (MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP || 
> ARCH_ZYNQMP_R5)
>       help
>         This driver supports the Cadence UART. It is found e.g. in Xilinx
>         Zynq/ZynqMP.
> diff --git a/include/configs/xilinx_zynqmp_r5.h 
> b/include/configs/xilinx_zynqmp_r5.h
> new file mode 100644
> index 000000000000..05105e5d44e8
> --- /dev/null
> +++ b/include/configs/xilinx_zynqmp_r5.h
> @@ -0,0 +1,51 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * (C) Copyright 2018 Xilinx, Inc. (Michal Simek)
> + */
> +
> +#ifndef __CONFIG_ZYNQMP_R5_H
> +#define __CONFIG_ZYNQMP_R5_H
> +
> +#define CONFIG_EXTRA_ENV_SETTINGS
> +
> +/* CPU clock */
> +#define CONFIG_CPU_FREQ_HZ   500000000
> +
> +/* Serial drivers */
> +/* The following table includes the supported baudrates */
> +#define CONFIG_SYS_BAUDRATE_TABLE  \
> +     {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400}
> +
> +# define CONFIG_ENV_SIZE     (128 << 10)
> +
> +/* Allow to overwrite serial and ethaddr */
> +#define CONFIG_ENV_OVERWRITE
> +
> +/* Boot configuration */
> +#define CONFIG_SYS_LOAD_ADDR         0 /* default? */
> +
> +#define CONFIG_SYS_MAXARGS           32 /* max number of command args */
> +
> +#define CONFIG_NR_DRAM_BANKS         1

Is this enough? I would assume people will want to at least cover TCM
and DDR from within U-Boot.

The rest looks great to me :).


Alex
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to