aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.shippable.yml1
-rw-r--r--MAINTAINERS6
-rw-r--r--core/arch/arm/plat-hisilicon/conf.mk64
-rw-r--r--core/arch/arm/plat-hisilicon/hi3519av100.h28
-rw-r--r--core/arch/arm/plat-hisilicon/hi3519av100_plat_init.S87
-rw-r--r--core/arch/arm/plat-hisilicon/main.c60
-rw-r--r--core/arch/arm/plat-hisilicon/platform_config.h19
-rw-r--r--core/arch/arm/plat-hisilicon/psci.c88
-rw-r--r--core/arch/arm/plat-hisilicon/sub.mk4
9 files changed, 357 insertions, 0 deletions
diff --git a/.shippable.yml b/.shippable.yml
index 7095d3f3..5164ff9e 100644
--- a/.shippable.yml
+++ b/.shippable.yml
@@ -104,3 +104,4 @@ build:
- _make PLATFORM=sunxi-bpi_zero
- _make PLATFORM=sunxi-sun50i_a64
- _make PLATFORM=bcm-ns3 CFG_ARM64_core=y
+ - _make PLATFORM=hisilicon-hi3519av100_demo
diff --git a/MAINTAINERS b/MAINTAINERS
index b233f9f7..4d3edeb8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -76,6 +76,12 @@ R: Linaro <op-tee@linaro.org>
S: Maintained
F: core/arch/arm/plat-poplar/
+Hisilicon Hi3519AV100 family
+R: Tao Zeng <prime.zeng@hisilicon.com>
+R: Jerome FORISSIER <jerome.forissier@huawei.com>
+S: Maintained
+F: core/arch/arm/plat-hisilicon
+
Marvell Armada 70x0, Armada 80x0, Armada 3700
R: Tao Lu <taolu@marvell.com> [@taovcu]
S: Maintained
diff --git a/core/arch/arm/plat-hisilicon/conf.mk b/core/arch/arm/plat-hisilicon/conf.mk
new file mode 100644
index 00000000..b91c189f
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/conf.mk
@@ -0,0 +1,64 @@
+PLATFORM_FLAVOR ?= hi3519av100_demo
+
+hi3519av100-flavorlist = hi3519av100_demo hi3519av100_tst
+
+ifneq (,$(filter $(PLATFORM_FLAVOR),$(hi3519av100-flavorlist)))
+include core/arch/arm/cpu/cortex-armv8-0.mk
+$(call force,CFG_HI3519AV100,y)
+$(call force,CFG_TEE_CORE_NB_CORE,2)
+# Hi3519av100 has got two clusters, one core per cluster
+$(call force,CFG_CORE_CLUSTER_SHIFT,0)
+
+$(call force,CFG_GENERIC_BOOT,y)
+$(call force,CFG_PL011,y)
+$(call force,CFG_PM_STUBS,y)
+$(call force,CFG_SECURE_TIME_SOURCE_CNTPCT,y)
+$(call force,CFG_ARM32_core,y)
+$(call force,CFG_PSCI_ARM32,y)
+
+CFG_BOOT_SECONDARY_REQUEST ?= y
+CFG_NUM_THREADS ?= 4
+CFG_CRYPTO_WITH_CE ?= y
+CFG_WITH_STACK_CANARIES ?= y
+CFG_NS_ENTRY_ADDR ?= 0x22008000
+CFG_CORE_HEAP_SIZE ?= 131072
+
+#
+# Hi3519av100 memory map
+#
+# This is a general memory map for demo board, and for your own board,
+# you have to define your own memory map.
+#
+# 0x4000_0000 [DRAM_LIMIT]
+# other (media memory zone/uboot and other)
+#
+# 0x3360_0000 -
+# TA RAM: 12 MiB | TZDRAM
+# 0x32a0_0000 -
+#
+# CFG_WITH_PAGER=n -
+# TEE RAM: 4 MiB (TEE_RAM_VA_SIZE) | TZDRAM
+# 0x3260_0000 [TZDRAM_BASE, TEE_LOAD_ADDR] -
+#
+# CFG_WITH_PAGER=y
+# Unused
+# 0x32607_0000 -
+# TEE RAM: 448 KiB (TZSRAM_SIZE) | TZSRAM
+# 0x3260_0000 [TZDRAM_BASE, TZSRAM_BASE, TEE_LOAD_ADDR]
+# OP-TEE Future Use: 2 MiB
+# 0x3240_0000
+# Shared memory: 4 MB
+# 0x3200_0000
+# Linux memory: 256MB
+# 0x2200_0000
+# DSP reserved memory: 32MB
+# 0x2000_0000 [DRAM_BASE]
+#
+CFG_TZDRAM_START ?= 0x32600000
+CFG_TZDRAM_SIZE ?= 0x01000000
+CFG_TEE_RAM_VA_SIZE ?= 0x00400000
+CFG_SHMEM_START ?= 0x32000000
+CFG_SHMEM_SIZE ?= 0x00400000
+else
+$(error Error: Not supported PLATFORM_FLAVOR or NULL PLATFORM_FLAVOR)
+endif
diff --git a/core/arch/arm/plat-hisilicon/hi3519av100.h b/core/arch/arm/plat-hisilicon/hi3519av100.h
new file mode 100644
index 00000000..1d4b7ea9
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/hi3519av100.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (c) 2019, HiSilicon Technologies Co., Ltd.
+ */
+
+#ifndef __HI3519AV100_H__
+#define __HI3519AV100_H__
+
+#include <mm/generic_ram_layout.h>
+
+/* PL011 */
+#define PL011_UART0_BASE 0x04540000
+#define PL011_BAUDRATE 115200
+#define PL011_UART0_CLK_IN_HZ 24000000
+
+/* BootSRAM */
+#define BOOTSRAM_BASE 0x04200000
+#define BOOTSRAM_SIZE 0x1000
+
+/* CPU Reset Control */
+#define CPU_CRG_BASE 0x04510000
+#define CPU_CRG_SIZE 0x1000
+
+/* Sysctrl Register */
+#define SYS_CTRL_BASE 0x04520000
+#define SYS_CTRL_SIZE 0x1000
+
+#endif /* __HI3519AV100_H__ */
diff --git a/core/arch/arm/plat-hisilicon/hi3519av100_plat_init.S b/core/arch/arm/plat-hisilicon/hi3519av100_plat_init.S
new file mode 100644
index 00000000..950c5615
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/hi3519av100_plat_init.S
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (c) 2019, HiSilicon Technologies Co., Ltd.
+ */
+
+/*
+ * Entry points for the Hi3519AV100 a53 aarch32 mode init.
+ * It is assumed no stack is available when these routines are called.
+ * It is assumed each routine is called with return address in LR
+ * and with ARM registers R0, R1, R2, R3 being scratched.
+ */
+
+#include <arm.h>
+#include <arm32_macros.S>
+#include <asm.S>
+#include <kernel/unwind.h>
+#include <platform_config.h>
+
+#define CCI_BASE 0x04528000
+#define CPUECTLR_A53_SMPEN BIT(6)
+#define ACTRL_CPUECTLR BIT(1)
+#define HACTRL_CPUECTLR BIT(1)
+
+.section .text
+.balign 4
+.code 32
+
+/*
+ * Hi3519AV100 a53 aarch32 configuration early configuration
+ *
+ * Use scratch registers R0-R3.
+ * No stack usage.
+ * LR store return address.
+ * Trap CPU in case of error.
+ */
+FUNC plat_cpu_reset_early , :
+UNWIND( .fnstart)
+ /*
+ * Write the CPU Extended Control Register
+ * Set the SMPEN bit, this Cortex-A53 core's register
+ */
+ mrrc p15, 1, r0, r1, c15
+ orr r0, r0, #CPUECTLR_A53_SMPEN
+ mcrr p15, 1, r0, r1, c15
+
+ /*
+ * Enable Non-Secure EL1 write access to CPUECTLR
+ */
+ mrs r1, cpsr
+ cps #CPSR_MODE_MON
+
+ read_scr r0
+ orr r0, r0, #SCR_NS /* Set NS bit in SCR */
+ write_scr r0
+ isb
+
+ /* Write HACTLR register */
+ mrc p15, 4, r2, c1, c0, 1
+ orr r2, r2, #HACTRL_CPUECTLR
+ mcr p15, 4, r2, c1, c0, 1
+
+ bic r0, r0, #SCR_NS /* Clr NS bit in SCR */
+ write_scr r0
+ isb
+
+ /* Write ACTLR register */
+ mrc p15, 0, r2, c1, c0, 1
+ orr r2, r2, #ACTRL_CPUECTLR
+ mcr p15, 0, r2, c1, c0, 1
+
+ msr cpsr, r1
+ /*
+ * Enable cci for secondary core
+ */
+ mov r3, lr
+ bl __get_core_pos
+ mov lr, r3
+ cmp r0, #0
+ beq out
+ ldr r0, =CCI_BASE
+ ldr r1, [r0]
+ orr r1, r1, #BIT(9) /* bit 9 set to 1 */
+ str r1, [r0]
+out:
+ bx lr
+UNWIND( .fnend)
+END_FUNC plat_cpu_reset_early
diff --git a/core/arch/arm/plat-hisilicon/main.c b/core/arch/arm/plat-hisilicon/main.c
new file mode 100644
index 00000000..da9b0e48
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/main.c
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2019, HiSilicon Technologies Co., Ltd.
+ */
+
+#include <console.h>
+#include <drivers/gic.h>
+#include <drivers/pl011.h>
+#include <kernel/generic_boot.h>
+#include <kernel/panic.h>
+#include <kernel/pm_stubs.h>
+#include <mm/tee_pager.h>
+#include <mm/core_memprot.h>
+#include <platform_config.h>
+#include <stdint.h>
+#include <tee/entry_std.h>
+#include <tee/entry_fast.h>
+
+static void main_fiq(void);
+
+static const struct thread_handlers handlers = {
+ .std_smc = tee_entry_std,
+ .fast_smc = tee_entry_fast,
+ .nintr = main_fiq,
+ .cpu_on = pm_panic,
+ .cpu_off = pm_panic,
+ .cpu_suspend = pm_panic,
+ .cpu_resume = pm_panic,
+ .system_off = pm_panic,
+ .system_reset = pm_panic,
+};
+
+static struct pl011_data console_data;
+register_phys_mem(MEM_AREA_IO_NSEC, CONSOLE_UART_BASE, PL011_REG_SIZE);
+#ifdef BOOTSRAM_BASE
+register_phys_mem(MEM_AREA_IO_SEC, BOOTSRAM_BASE, BOOTSRAM_SIZE);
+#endif
+#ifdef CPU_CRG_BASE
+register_phys_mem(MEM_AREA_IO_SEC, CPU_CRG_BASE, CPU_CRG_SIZE);
+#endif
+#ifdef SYS_CTRL_BASE
+register_phys_mem(MEM_AREA_IO_SEC, SYS_CTRL_BASE, SYS_CTRL_SIZE);
+#endif
+
+const struct thread_handlers *generic_boot_get_handlers(void)
+{
+ return &handlers;
+}
+
+static void main_fiq(void)
+{
+ panic();
+}
+
+void console_init(void)
+{
+ pl011_init(&console_data, CONSOLE_UART_BASE,
+ CONSOLE_UART_CLK_IN_HZ, CONSOLE_BAUDRATE);
+ register_serial_console(&console_data.chip);
+}
diff --git a/core/arch/arm/plat-hisilicon/platform_config.h b/core/arch/arm/plat-hisilicon/platform_config.h
new file mode 100644
index 00000000..c5dc82ba
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/platform_config.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (c) 2019, HiSilicon Technologies Co., Ltd.
+ */
+
+#ifndef PLATFORM_CONFIG_H
+#define PLATFORM_CONFIG_H
+
+#include <hi3519av100.h>
+
+/* Make stacks aligned to data cache line length */
+#define STACK_ALIGNMENT 64
+
+/* PL011 UART */
+#define CONSOLE_UART_BASE PL011_UART0_BASE
+#define CONSOLE_BAUDRATE PL011_BAUDRATE
+#define CONSOLE_UART_CLK_IN_HZ PL011_UART0_CLK_IN_HZ
+
+#endif /* PLATFORM_CONFIG_H */
diff --git a/core/arch/arm/plat-hisilicon/psci.c b/core/arch/arm/plat-hisilicon/psci.c
new file mode 100644
index 00000000..dad87030
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/psci.c
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2019, HiSilicon Technologies Co., Ltd.
+ */
+
+#include <console.h>
+#include <io.h>
+#include <kernel/generic_boot.h>
+#include <kernel/misc.h>
+#include <kernel/panic.h>
+#include <kernel/pm_stubs.h>
+#include <mm/core_mmu.h>
+#include <mm/core_memprot.h>
+#include <platform_config.h>
+#include <stdint.h>
+#include <sm/optee_smc.h>
+#include <sm/psci.h>
+#include <tee/entry_std.h>
+#include <tee/entry_fast.h>
+
+#define REG_CPU_SUSSYS_RESET 0xcc
+#define REG_CPU_START_COMMAND 0x0
+#define REG_CPU_START_ADDR 0x4
+#define REG_SYSCTRL_RESET 0x4
+#define RELEASE_CORE_MASK (BIT32(25) | BIT32(1))
+
+int psci_features(uint32_t psci_fid)
+{
+ switch (psci_fid) {
+ case PSCI_PSCI_FEATURES:
+ case PSCI_VERSION:
+ case PSCI_SYSTEM_RESET:
+#ifdef CFG_BOOT_SECONDARY_REQUEST
+ case PSCI_CPU_ON:
+#endif
+ return PSCI_RET_SUCCESS;
+ default:
+ return PSCI_RET_NOT_SUPPORTED;
+ }
+}
+
+uint32_t psci_version(void)
+{
+ return PSCI_VERSION_1_0;
+}
+
+void psci_system_reset(void)
+{
+ vaddr_t sysctrl = core_mmu_get_va(SYS_CTRL_BASE, MEM_AREA_IO_SEC);
+
+ if (!sysctrl) {
+ EMSG("no sysctrl mapping, hang here");
+ panic();
+ }
+
+ io_write32(sysctrl + REG_SYSCTRL_RESET, 0xdeadbeef);
+}
+
+#ifdef CFG_BOOT_SECONDARY_REQUEST
+int psci_cpu_on(uint32_t core_idx, uint32_t entry,
+ uint32_t context_id)
+{
+ uint32_t val = 0;
+ size_t pos = get_core_pos_mpidr(core_idx);
+ vaddr_t bootsram = core_mmu_get_va(BOOTSRAM_BASE, MEM_AREA_IO_SEC);
+ vaddr_t crg = core_mmu_get_va(CPU_CRG_BASE, MEM_AREA_IO_SEC);
+
+ if (!bootsram || !crg) {
+ EMSG("No bootsram or crg mapping");
+ return PSCI_RET_INVALID_PARAMETERS;
+ }
+
+ if ((pos == 0) || (pos >= CFG_TEE_CORE_NB_CORE))
+ return PSCI_RET_INVALID_PARAMETERS;
+
+ /* set secondary core's NS entry addresses */
+ generic_boot_set_core_ns_entry(pos, entry, context_id);
+
+ val = virt_to_phys((void *)TEE_TEXT_VA_START);
+ io_write32(bootsram + REG_CPU_START_ADDR, val);
+ io_write32(bootsram + REG_CPU_START_COMMAND, 0xe51ff004);
+
+ /* release secondary core */
+ io_clrbits32(crg + REG_CPU_SUSSYS_RESET, RELEASE_CORE_MASK);
+
+ return PSCI_RET_SUCCESS;
+}
+#endif
diff --git a/core/arch/arm/plat-hisilicon/sub.mk b/core/arch/arm/plat-hisilicon/sub.mk
new file mode 100644
index 00000000..ed69d4c1
--- /dev/null
+++ b/core/arch/arm/plat-hisilicon/sub.mk
@@ -0,0 +1,4 @@
+global-incdirs-y += .
+srcs-y += main.c
+srcs-$(CFG_HI3519AV100) += hi3519av100_plat_init.S
+srcs-$(CFG_PSCI_ARM32) += psci.c