board: presidio-asic: Add basic G3 engr. development board support
authorAlex Nemirovsky <alex.nemirovsky@cortina-access.com>
Thu, 30 Jan 2020 20:34:59 +0000 (12:34 -0800)
committerTom Rini <trini@konsulko.com>
Fri, 7 Feb 2020 21:16:01 +0000 (16:16 -0500)
Add basic Presidio G3 engineering board support

Signed-off-by: Alex Nemirovsky <alex.nemirovsky@cortina-access.com>
arch/arm/Kconfig
arch/arm/dts/Makefile
arch/arm/dts/ca-presidio-engboard.dts [new file with mode: 0644]
arch/arm/mach-cortina/Makefile [new file with mode: 0644]
board/cortina/presidio-asic/Kconfig [new file with mode: 0644]
board/cortina/presidio-asic/MAINTAINERS [new file with mode: 0644]
board/cortina/presidio-asic/Makefile [new file with mode: 0644]
board/cortina/presidio-asic/lowlevel_init.S [new file with mode: 0644]
board/cortina/presidio-asic/presidio.c [new file with mode: 0644]
configs/cortina_presidio-asic-base_defconfig [new file with mode: 0644]
include/configs/presidio_asic.h [new file with mode: 0644]

index ada164d4bd884b73e8af723ddd6ab2fd500528c9..8d9f7fcce78dcb934f44598252b98355dd5a9ee7 100644 (file)
@@ -1675,6 +1675,10 @@ config TARGET_DURIAN
          Support for durian platform.
          It has 2GB Sdram, uart and pcie.
 
+config TARGET_PRESIDIO_ASIC
+       bool "Support Cortina Presidio ASIC Platform"
+       select ARM64
+
 endchoice
 
 config ARCH_SUPPORT_TFABOOT
@@ -1823,6 +1827,7 @@ source "board/Marvell/gplugd/Kconfig"
 source "board/armadeus/apf27/Kconfig"
 source "board/armltd/vexpress/Kconfig"
 source "board/armltd/vexpress64/Kconfig"
+source "board/cortina/presidio-asic/Kconfig"
 source "board/broadcom/bcm23550_w1d/Kconfig"
 source "board/broadcom/bcm28155_ap/Kconfig"
 source "board/broadcom/bcm963158/Kconfig"
index 9303beb2f568fdeddcafb69531b5276f3b986ad4..6915783d9c81b3bc46979045b987521aa16f3b92 100644 (file)
@@ -909,6 +909,8 @@ dtb-$(CONFIG_TARGET_VEXPRESS_CA15_TC2) += vexpress-v2p-ca15_a7.dtb
 
 dtb-$(CONFIG_TARGET_DURIAN) += phytium-durian.dtb
 
+dtb-$(CONFIG_TARGET_PRESIDIO_ASIC) += ca-presidio-engboard.dtb
+
 targets += $(dtb-y)
 
 # Add any required device tree compiler flags here
diff --git a/arch/arm/dts/ca-presidio-engboard.dts b/arch/arm/dts/ca-presidio-engboard.dts
new file mode 100644 (file)
index 0000000..c03dacc
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020, Cortina Access Inc.
+ */
+
+/dts-v1/;
+
+/ {
+   #address-cells = <2>;
+   #size-cells = <1>;
+
+       mmc0: mmc@f4400000 {
+               compatible = "snps,dw-cortina";
+               reg = <0x0 0xf4400000 0x1000>;
+               bus-width = <4>;
+               io_ds = <0x77>;
+               fifo-mode;
+               sd_dll_ctrl = <0xf43200e8>;
+               io_drv_ctrl = <0xf432004c>;
+       };
+
+       gpio0: gpio-controller@0xf4329280  {
+               compatible = "cortina,ca-gpio";
+               reg = <0x0 0xf4329280 0x24>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               status = "okay";
+       };
+       gpio1: gpio-controller@0xf43292a4  {
+               compatible = "cortina,ca-gpio";
+               reg = <0x0 0xf43292a4 0x24>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               status = "disabled";
+       };
+
+       watchdog: watchdog@0xf432901c {
+               compatible = "cortina,ca-wdt";
+               reg = <0x0 0xf432901c 0x34>,
+                     <0x0 0xf4320020 0x04>;
+               status = "okay";
+       };
+
+       uart0: serial@0xf4329148  {
+               u-boot,dm-pre-reloc;
+               compatible = "cortina,ca-uart";
+               reg = <0x0 0xf4329148 0x30>;
+               status = "okay";
+       };
+
+       i2c: i2c@f4329120 {
+               compatible = "cortina,ca-i2c";
+               reg = <0x0 0xf4329120 0x28>;
+               clock-frequency = <400000>;
+       };
+
+       sflash: sflash-controller@f4324000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "cortina,ca-sflash";
+               reg = <0x0 0xf4324000 0x50>;
+               reg-names = "sflash-regs";
+               flash@0 {
+                       compatible = "jedec,spi-nor";
+                       spi-rx-bus-width = <1>;
+                       spi-max-frequency = <108000000>;
+               };
+       };
+};
diff --git a/arch/arm/mach-cortina/Makefile b/arch/arm/mach-cortina/Makefile
new file mode 100644 (file)
index 0000000..ffb8692
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2020 Cortina Access Inc.
+#
+obj-y += lowlevel_init.o
diff --git a/board/cortina/presidio-asic/Kconfig b/board/cortina/presidio-asic/Kconfig
new file mode 100644 (file)
index 0000000..8e6f6cf
--- /dev/null
@@ -0,0 +1,18 @@
+if TARGET_PRESIDIO_ASIC
+config BIT64
+       bool
+       default y
+
+select SOC_CA7774
+
+config SYS_BOARD
+       default "presidio-asic"
+
+config SYS_VENDOR
+       default "cortina"
+
+config SYS_CONFIG_NAME
+       default "presidio_asic"
+
+source "board/cortina/common/Kconfig"
+endif
diff --git a/board/cortina/presidio-asic/MAINTAINERS b/board/cortina/presidio-asic/MAINTAINERS
new file mode 100644 (file)
index 0000000..9db17bd
--- /dev/null
@@ -0,0 +1,6 @@
+Cortina Presidio ASIC G3 Engineering BOARD
+M:     Alex Nemirovsky <alex.nemirovsky@cortina-access.com>
+S:     Supported
+F:     board/cortina/presidio-asic/
+F:     include/configs/presidio_asic.h
+F:     configs/cortina_presidio-asic*defconfig
diff --git a/board/cortina/presidio-asic/Makefile b/board/cortina/presidio-asic/Makefile
new file mode 100644 (file)
index 0000000..d167a15
--- /dev/null
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier:     GPL-2.0+
+#
+# (C) Copyright 2020 Cortina-Access.Inc.
+#
+#
+
+obj-y  := presidio.o
+obj-y  += lowlevel_init.o
diff --git a/board/cortina/presidio-asic/lowlevel_init.S b/board/cortina/presidio-asic/lowlevel_init.S
new file mode 100644 (file)
index 0000000..4450a5d
--- /dev/null
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2020 Cortina-Access
+ *
+ */
+
+
+#include <asm-offsets.h>
+#include <config.h>
+#include <linux/linkage.h>
+#include <asm/macro.h>
+#include <asm/armv8/mmu.h>
+
+       .globl lowlevel_init
+lowlevel_init:
+       mov     x29, lr                 /* Save LR */
+
+#if defined(CONFIG_SOC_CA7774)
+       /* Enable SMPEN in CPUECTLR */
+       mrs     x0, s3_1_c15_c2_1
+       tst     x0, #0x40
+        b.ne    skip_smp_setup
+       orr     x0, x0, #0x40
+       msr     s3_1_c15_c2_1, x0
+skip_smp_setup:
+#endif
+
+#if defined(CONFIG_SOC_CA8277B)
+       /* Enable CPU Timer */
+       ldr x0, =CONFIG_SYS_TIMER_BASE
+       mov x1, #1
+       str w1, [x0]
+#endif
+
+#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
+       branch_if_slave x0, 1f
+#ifndef CONFIG_TARGET_VENUS
+       ldr     x0, =GICD_BASE
+       bl      gic_init_secure
+#endif
+1:
+#if defined(CONFIG_GICV3)
+       ldr     x0, =GICR_BASE
+       bl      gic_init_secure_percpu
+#elif defined(CONFIG_GICV2)
+       ldr     x0, =GICD_BASE
+       ldr     x1, =GICC_BASE
+       bl      gic_init_secure_percpu
+#endif
+#endif
+
+#ifdef CONFIG_ARMV8_MULTIENTRY
+       branch_if_master x0, x1, 2f
+
+       /*
+        * Slave should wait for master clearing spin table.
+        * This sync prevent salves observing incorrect
+        * value of spin table and jumping to wrong place.
+        */
+#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
+#ifdef CONFIG_GICV2
+       ldr     x0, =GICC_BASE
+#endif
+       bl      gic_wait_for_interrupt
+#endif
+
+       /*
+        * All slaves will enter EL2 and optionally EL1.
+        */
+       adr     x4, lowlevel_in_el2
+       ldr     x5, =ES_TO_AARCH64
+       bl      armv8_switch_to_el2
+
+lowlevel_in_el2:
+#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
+       adr     x4, lowlevel_in_el1
+       ldr     x5, =ES_TO_AARCH64
+       bl      armv8_switch_to_el1
+
+lowlevel_in_el1:
+#endif
+
+#endif /* CONFIG_ARMV8_MULTIENTRY */
+
+2:
+       mov     lr, x29                 /* Restore LR */
+       ret
diff --git a/board/cortina/presidio-asic/presidio.c b/board/cortina/presidio-asic/presidio.c
new file mode 100644 (file)
index 0000000..b4fa01f
--- /dev/null
@@ -0,0 +1,134 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2020 - Cortina Access Inc.
+ *
+ */
+#include <common.h>
+#include <malloc.h>
+#include <errno.h>
+#include <netdev.h>
+#include <asm/io.h>
+#include <linux/compiler.h>
+#include <configs/presidio_asic.h>
+#include <linux/psci.h>
+#include <asm/psci.h>
+#include <cpu_func.h>
+#include <asm/armv8/mmu.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define CA_PERIPH_BASE                  0xE0000000UL
+#define CA_PERIPH_SIZE                  0x20000000UL
+#define CA_GLOBAL_BASE                  0xf4320000
+#define CA_GLOBAL_JTAG_ID               0xf4320000
+#define CA_GLOBAL_BLOCK_RESET           0xf4320004
+#define CA_GLOBAL_BLOCK_RESET_RESET_DMA BIT(16)
+#define CA_DMA_SEC_SSP_BAUDRATE_CTRL    0xf7001b94
+#define CA_DMA_SEC_SSP_ID               0xf7001b80
+
+int print_cpuinfo(void)
+{
+       printf("CPU:   Cortina Presidio G3\n");
+       return 0;
+}
+
+static struct mm_region presidio_mem_map[] = {
+       {
+       .virt = DDR_BASE,
+       .phys = DDR_BASE,
+       .size = PHYS_SDRAM_1_SIZE,
+       .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                PTE_BLOCK_OUTER_SHARE
+       },
+       {
+       .virt = CA_PERIPH_BASE,
+       .phys = CA_PERIPH_BASE,
+       .size = CA_PERIPH_SIZE,
+       .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                PTE_BLOCK_NON_SHARE
+       },
+       {
+       /* List terminator */
+       0,
+       }
+};
+
+struct mm_region *mem_map = presidio_mem_map;
+
+static noinline int invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1,
+                                      u64 arg2)
+{
+       asm volatile("mov x0, %0\n"
+                   "mov x1, %1\n"
+                   "mov x2, %2\n"
+                   "mov x3, %3\n"
+                   "smc        #0\n"
+                   : "+r" (function_id)
+                   : "r" (arg0), "r" (arg1), "r" (arg2)
+                   );
+
+       return function_id;
+}
+
+int board_early_init_r(void)
+{
+       dcache_disable();
+       return 0;
+}
+
+int board_init(void)
+{
+       unsigned int reg_data, jtag_id;
+
+       /* Enable timer */
+       writel(1, CONFIG_SYS_TIMER_BASE);
+
+       /* Enable snoop in CCI400 slave port#4 */
+       writel(3, 0xF5595000);
+
+       jtag_id = readl(CA_GLOBAL_JTAG_ID);
+
+       /* If this is HGU variant then do not use
+        * the Saturn daughter card ref. clk
+        */
+       if (jtag_id == 0x1010D8F3) {
+               reg_data = readl(0xF3100064);
+               /* change multifunc. REF CLK pin to
+                * a simple GPIO pin
+                */
+               reg_data |= (1 << 1);
+               writel(reg_data, 0xf3100064);
+       }
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       unsigned int ddr_size;
+
+       ddr_size = readl(0x111100c);
+       gd->ram_size = ddr_size * 0x100000;
+       return 0;
+}
+
+void reset_cpu(ulong addr)
+{
+       invoke_psci_fn_smc(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
+}
+
+#ifdef CONFIG_LAST_STAGE_INIT
+int last_stage_init(void)
+{
+       u32 val;
+
+       val = readl(CA_GLOBAL_BLOCK_RESET);
+       val &= ~CA_GLOBAL_BLOCK_RESET_RESET_DMA;
+       writel(val, CA_GLOBAL_BLOCK_RESET);
+
+       /* reduce output pclk ~3.7Hz to save power consumption */
+       writel(0x000000FF, CA_DMA_SEC_SSP_BAUDRATE_CTRL);
+
+       return 0;
+}
+#endif
diff --git a/configs/cortina_presidio-asic-base_defconfig b/configs/cortina_presidio-asic-base_defconfig
new file mode 100644 (file)
index 0000000..ec64bd2
--- /dev/null
@@ -0,0 +1,29 @@
+CONFIG_ARM=y
+# CONFIG_SYS_ARCH_TIMER is not set
+CONFIG_TARGET_PRESIDIO_ASIC=y
+CONFIG_SYS_TEXT_BASE=0x04000000
+CONFIG_DM_GPIO=y
+CONFIG_ENV_SIZE=0x20000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_IDENT_STRING="Presidio-SoC"
+CONFIG_SHOW_BOOT_PROGRESS=y
+CONFIG_BOOTDELAY=3
+CONFIG_USE_BOOTARGS=y
+CONFIG_BOOTARGS="earlycon=serial,0xf4329148 console=ttyS0,115200 root=/dev/ram0"
+CONFIG_BOARD_EARLY_INIT_R=y
+CONFIG_SYS_PROMPT="G3#"
+CONFIG_CMD_WDT=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIMER=y
+CONFIG_CMD_SMC=y
+CONFIG_OF_CONTROL=y
+CONFIG_OF_LIVE=y
+CONFIG_DEFAULT_DEVICE_TREE="ca-presidio-engboard"
+# CONFIG_NET is not set
+CONFIG_DM=y
+CONFIG_CORTINA_GPIO=y
+# CONFIG_MMC is not set
+CONFIG_DM_SERIAL=y
+CONFIG_CORTINA_UART=y
+CONFIG_WDT=y
+CONFIG_WDT_CORTINA=y
diff --git a/include/configs/presidio_asic.h b/include/configs/presidio_asic.h
new file mode 100644 (file)
index 0000000..023092e
--- /dev/null
@@ -0,0 +1,75 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2020 Cortina Access Inc.
+ *
+ * Configuration for Cortina-Access Presidio board.
+ */
+
+#ifndef __PRESIDIO_ASIC_H
+#define __PRESIDIO_ASIC_H
+
+#define CONFIG_REMAKE_ELF
+
+#define CONFIG_SUPPORT_RAW_INITRD
+
+#define CONFIG_SYS_INIT_SP_ADDR                0x00100000
+#define CONFIG_SYS_BOOTM_LEN           0x00c00000
+
+/* Generic Timer Definitions */
+#define COUNTER_FREQUENCY              25000000
+#define CONFIG_SYS_TIMER_RATE          COUNTER_FREQUENCY
+#define CONFIG_SYS_TIMER_COUNTER       0xf4321008
+
+/* note: arch/arm/cpu/armv8/start.S which references GICD_BASE/GICC_BASE
+ * does not yet support DT. Thus define it here.
+ */
+#define CONFIG_GICV2
+#define GICD_BASE                      0xf7011000
+#define GICC_BASE                      0xf7012000
+
+#define CONFIG_SYS_MEMTEST_SCRATCH     0x00100000
+#define CONFIG_SYS_MEMTEST_START       0x05000000
+#define CONFIG_SYS_MEMTEST_END         0x0D000000
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + (8 << 20))
+
+#define CONFIG_SYS_TIMER_BASE          0xf4321000
+
+/* Use external clock source */
+#define PRESIDIO_APB_CLK               125000000
+#define CORTINA_PER_IO_FREQ            PRESIDIO_APB_CLK
+
+/* Cortina Serial Configuration */
+#define CORTINA_UART_CLOCK             (PRESIDIO_APB_CLK)
+#define CORTINA_SERIAL_PORTS           {(void *)CONFIG_SYS_SERIAL0, \
+                                        (void *)CONFIG_SYS_SERIAL1}
+
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_SERIAL0             PER_UART0_CFG
+#define CONFIG_SYS_SERIAL1             PER_UART1_CFG
+
+/* BOOTP options */
+#define CONFIG_BOOTP_BOOTFILESIZE
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LOAD_ADDR           (DDR_BASE + 0x10000000)
+#define CONFIG_LAST_STAGE_INIT
+
+/* SDRAM Bank #1 */
+#define DDR_BASE                       0x00000000
+#define PHYS_SDRAM_1                   DDR_BASE
+#define PHYS_SDRAM_1_SIZE              0x80000000 /* 2GB */
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
+
+/* Console I/O Buffer Size */
+#define CONFIG_SYS_CBSIZE              256
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+
+/* max command args */
+#define CONFIG_SYS_MAXARGS             64
+#define CONFIG_EXTRA_ENV_SETTINGS      "silent=y\0"
+
+#endif /* __PRESIDIO_ASIC_H */