Hello Tom and Daniel,

This v4 of patch 6/6 in the series is the only one which yield feedback in the 
prior v3. All other are in “Reviewed-By” state. 
We hope that v4 sent out a week ago has addressed those issues.

Let us know if there is anything else holding up the series acceptance. 

BR
-AN

> On Jan 30, 2020, at 12:34 PM, Alex Nemirovsky 
> <alex.nemirov...@cortina-access.com> wrote:
> 
> Add basic Presidio G3 engineering board support
> 
> Signed-off-by: Alex Nemirovsky <alex.nemirov...@cortina-access.com>
> 
> ---
> 
> Changes in v4:
> - clean up presidio_asic.h per trini recommendations
> - use autogen savedefconfig instead of manual maintained file
> 
> Changes in v3:
> - fixed dts closing bracket indentation
> - presidio.h: remove deadcode from presidio.h
> - presidio.h: remove CA_REG_READ/CA_REG_WRITE wrapper macros
> - presidio.h: remove CA77xx define replace use CA common Kconfig
>  SoC selection instead
> - select SOC_CA7774 via board's Kconfig
> - select BIT64 via board's Kconfig instead of presidio.h
> 
> Changes in v2: None
> 
> arch/arm/Kconfig                             |   5 +
> arch/arm/dts/Makefile                        |   2 +
> arch/arm/dts/ca-presidio-engboard.dts        |  69 ++++++++++++++
> arch/arm/mach-cortina/Makefile               |   5 +
> board/cortina/presidio-asic/Kconfig          |  18 ++++
> board/cortina/presidio-asic/MAINTAINERS      |   6 ++
> board/cortina/presidio-asic/Makefile         |   8 ++
> board/cortina/presidio-asic/lowlevel_init.S  |  87 +++++++++++++++++
> board/cortina/presidio-asic/presidio.c       | 134 +++++++++++++++++++++++++++
> configs/cortina_presidio-asic-base_defconfig |  29 ++++++
> include/configs/presidio_asic.h              |  75 +++++++++++++++
> 11 files changed, 438 insertions(+)
> create mode 100644 arch/arm/dts/ca-presidio-engboard.dts
> create mode 100644 arch/arm/mach-cortina/Makefile
> create mode 100644 board/cortina/presidio-asic/Kconfig
> create mode 100644 board/cortina/presidio-asic/MAINTAINERS
> create mode 100644 board/cortina/presidio-asic/Makefile
> create mode 100644 board/cortina/presidio-asic/lowlevel_init.S
> create mode 100644 board/cortina/presidio-asic/presidio.c
> create mode 100644 configs/cortina_presidio-asic-base_defconfig
> create mode 100644 include/configs/presidio_asic.h
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 36c9c2f..6d95cde 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1638,6 +1638,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
> @@ -1782,6 +1786,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"
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 0127a91..81db1e6 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -849,6 +849,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
> index 0000000..c03dacc
> --- /dev/null
> +++ b/arch/arm/dts/ca-presidio-engboard.dts
> @@ -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
> index 0000000..ffb8692
> --- /dev/null
> +++ b/arch/arm/mach-cortina/Makefile
> @@ -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
> index 0000000..8e6f6cf
> --- /dev/null
> +++ b/board/cortina/presidio-asic/Kconfig
> @@ -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
> index 0000000..9db17bd
> --- /dev/null
> +++ b/board/cortina/presidio-asic/MAINTAINERS
> @@ -0,0 +1,6 @@
> +Cortina Presidio ASIC G3 Engineering BOARD
> +M:   Alex Nemirovsky <alex.nemirov...@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
> index 0000000..d167a15
> --- /dev/null
> +++ b/board/cortina/presidio-asic/Makefile
> @@ -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
> index 0000000..4450a5d
> --- /dev/null
> +++ b/board/cortina/presidio-asic/lowlevel_init.S
> @@ -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
> index 0000000..b4fa01f
> --- /dev/null
> +++ b/board/cortina/presidio-asic/presidio.c
> @@ -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
> index 0000000..ec64bd2
> --- /dev/null
> +++ b/configs/cortina_presidio-asic-base_defconfig
> @@ -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
> index 0000000..023092e
> --- /dev/null
> +++ b/include/configs/presidio_asic.h
> @@ -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 */
> -- 
> 2.7.4
> 

Reply via email to