arm: zynqmp: Add ZynqMP minimal R5 support
authorMichal Simek <michal.simek@xilinx.com>
Thu, 12 Apr 2018 15:39:46 +0000 (17:39 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 11 May 2018 07:38:23 +0000 (09:38 +0200)
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.simek@xilinx.com>
14 files changed:
MAINTAINERS
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/dts/Makefile
arch/arm/dts/zynqmp-r5.dts [new file with mode: 0644]
arch/arm/mach-zynqmp-r5/Kconfig [new file with mode: 0644]
arch/arm/mach-zynqmp-r5/Makefile [new file with mode: 0644]
arch/arm/mach-zynqmp-r5/cpu.c [new file with mode: 0644]
board/xilinx/zynqmp_r5/MAINTAINERS [new file with mode: 0644]
board/xilinx/zynqmp_r5/Makefile [new file with mode: 0644]
board/xilinx/zynqmp_r5/board.c [new file with mode: 0644]
configs/xilinx_zynqmp_r5_defconfig [new file with mode: 0644]
drivers/serial/Kconfig
include/configs/xilinx_zynqmp_r5.h [new file with mode: 0644]

index c2ae68c9993e48ffa5fbdd1ea8f85c42b18f9bec..5670917b41b9299a77d3c2ac7c800a1b46e5be55 100644 (file)
@@ -295,6 +295,12 @@ F: include/zynqmppl.h
 F:     tools/zynqmp*
 N:     zynqmp
 
+ARM ZYNQMP R5
+M:     Michal Simek <michal.simek@xilinx.com>
+S:     Maintained
+T:     git git://git.denx.de/u-boot-microblaze.git
+F:     arch/arm/mach-zynqmp-r5/
+
 BUILDMAN
 M:     Simon Glass <sjg@chromium.org>
 S:     Maintained
index a7618f9ff226c1f9987314097e2ff9178cbd7899..c9d6e0a4241868a9933e9e5b4ba59389e4e29dab 100644 (file)
@@ -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"
index 3b1dd85716dee13a985bc38ab59adcb6636b67ac..4d6d27613771edeec0899e70ac881b002401f1c7 100644 (file)
@@ -76,6 +76,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))
 
index f7f24365bb7e21eadd64f97625daab85c7c43601..f94940a7dddba29a83835048c1ad72c622a8c4ab 100644 (file)
@@ -163,6 +163,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 (file)
index 0000000..a72172e
--- /dev/null
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * dts file for Xilinx ZynqMP R5
+ *
+ * (C) Copyright 2018, Xilinx, Inc.
+ *
+ * Michal Simek <michal.simek@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 (file)
index 0000000..5e01754
--- /dev/null
@@ -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 (file)
index 0000000..0d39e97
--- /dev/null
@@ -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 (file)
index 0000000..98f63e3
--- /dev/null
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Xilinx, Inc. (Michal Simek)
+ */
+
+#include <common.h>
+#include <asm/armv7_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 (file)
index 0000000..ac26764
--- /dev/null
@@ -0,0 +1,7 @@
+XILINX_ZYNQMP_R5 BOARDS
+M:     Michal Simek <michal.simek@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 (file)
index 0000000..c5a3e3d
--- /dev/null
@@ -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 (file)
index 0000000..70fb202
--- /dev/null
@@ -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 (file)
index 0000000..4671524
--- /dev/null
@@ -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
index 4be8868536d863690e5f036dff46b6e383f9fd00..5937910e5bf96a8b251a8355c589058f27246aae 100644 (file)
@@ -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 (file)
index 0000000..05105e5
--- /dev/null
@@ -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
+
+#define CONFIG_SYS_MALLOC_LEN          0x1400000
+
+#define CONFIG_SYS_INIT_RAM_ADDR       0xFFFF0000
+#define CONFIG_SYS_INIT_RAM_SIZE       0x1000
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR + \
+                                       CONFIG_SYS_INIT_RAM_SIZE - \
+                                       GENERATED_GBL_DATA_SIZE)
+
+/* Extend size of kernel image for uncompression */
+#define CONFIG_SYS_BOOTM_LEN   (60 * 1024 * 1024)
+
+#define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+/* 0x0 - 0x40 is used for placing exception vectors */
+#define CONFIG_SYS_MEMTEST_START       0x40
+#define CONFIG_SYS_MEMTEST_END         0x100
+#define CONFIG_SYS_MEMTEST_SCRATCH     0
+
+#endif /* __CONFIG_ZYNQ_ZYNQMP_R5_H */