xref: /optee_os/core/arch/arm/plat-sunxi/main.c (revision 55ab8f06a831946a49717446cd2e4495a2b5d659)
17f592182SYing-Chun Liu (PaulLiu) // SPDX-License-Identifier: BSD-2-Clause
27f592182SYing-Chun Liu (PaulLiu) /*
37f592182SYing-Chun Liu (PaulLiu)  * Copyright (c) 2014, Allwinner Technology Co., Ltd.
47f592182SYing-Chun Liu (PaulLiu)  * Copyright (c) 2018, Linaro Limited
5e59d8fd7SAmit Singh Tomar  * Copyright (c) 2018, Amit Singh Tomar <amittomer25@gmail.com>
67f592182SYing-Chun Liu (PaulLiu)  * All rights reserved.
77f592182SYing-Chun Liu (PaulLiu)  *
87f592182SYing-Chun Liu (PaulLiu)  * Redistribution and use in source and binary forms, with or without
97f592182SYing-Chun Liu (PaulLiu)  * modification, are permitted provided that the following conditions are met:
107f592182SYing-Chun Liu (PaulLiu)  *
117f592182SYing-Chun Liu (PaulLiu)  * 1. Redistributions of source code must retain the above copyright notice,
127f592182SYing-Chun Liu (PaulLiu)  * this list of conditions and the following disclaimer.
137f592182SYing-Chun Liu (PaulLiu)  *
147f592182SYing-Chun Liu (PaulLiu)  * 2. Redistributions in binary form must reproduce the above copyright notice,
157f592182SYing-Chun Liu (PaulLiu)  * this list of conditions and the following disclaimer in the documentation
167f592182SYing-Chun Liu (PaulLiu)  * and/or other materials provided with the distribution.
177f592182SYing-Chun Liu (PaulLiu)  *
187f592182SYing-Chun Liu (PaulLiu)  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
197f592182SYing-Chun Liu (PaulLiu)  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
207f592182SYing-Chun Liu (PaulLiu)  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
217f592182SYing-Chun Liu (PaulLiu)  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
227f592182SYing-Chun Liu (PaulLiu)  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
237f592182SYing-Chun Liu (PaulLiu)  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
247f592182SYing-Chun Liu (PaulLiu)  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
257f592182SYing-Chun Liu (PaulLiu)  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
267f592182SYing-Chun Liu (PaulLiu)  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
277f592182SYing-Chun Liu (PaulLiu)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
287f592182SYing-Chun Liu (PaulLiu)  * POSSIBILITY OF SUCH DAMAGE.
297f592182SYing-Chun Liu (PaulLiu)  */
307f592182SYing-Chun Liu (PaulLiu) 
317f592182SYing-Chun Liu (PaulLiu) #include <console.h>
327f592182SYing-Chun Liu (PaulLiu) #include <io.h>
337f592182SYing-Chun Liu (PaulLiu) #include <stdint.h>
347f592182SYing-Chun Liu (PaulLiu) #include <drivers/gic.h>
357f592182SYing-Chun Liu (PaulLiu) #include <drivers/serial8250_uart.h>
36e59d8fd7SAmit Singh Tomar #include <drivers/tzc380.h>
3765401337SJens Wiklander #include <kernel/boot.h>
387f592182SYing-Chun Liu (PaulLiu) #include <kernel/misc.h>
397f592182SYing-Chun Liu (PaulLiu) #include <kernel/panic.h>
407f592182SYing-Chun Liu (PaulLiu) #include <kernel/tz_ssvce_def.h>
417f592182SYing-Chun Liu (PaulLiu) #include <mm/core_mmu.h>
427f592182SYing-Chun Liu (PaulLiu) #include <mm/core_memprot.h>
437f592182SYing-Chun Liu (PaulLiu) #include <mm/tee_pager.h>
447f592182SYing-Chun Liu (PaulLiu) #include <platform_config.h>
457f592182SYing-Chun Liu (PaulLiu) #include <sm/optee_smc.h>
467f592182SYing-Chun Liu (PaulLiu) 
477f592182SYing-Chun Liu (PaulLiu) #ifdef GIC_BASE
48a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, GIC_BASE, CORE_MMU_PGDIR_SIZE);
497f592182SYing-Chun Liu (PaulLiu) #endif
507f592182SYing-Chun Liu (PaulLiu) 
517f592182SYing-Chun Liu (PaulLiu) #ifdef CONSOLE_UART_BASE
52a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_NSEC,
537f592182SYing-Chun Liu (PaulLiu) 			CONSOLE_UART_BASE, SUNXI_UART_REG_SIZE);
547f592182SYing-Chun Liu (PaulLiu) #endif
557f592182SYing-Chun Liu (PaulLiu) 
567f592182SYing-Chun Liu (PaulLiu) #ifdef SUNXI_TZPC_BASE
57a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, SUNXI_TZPC_BASE, SUNXI_TZPC_REG_SIZE);
587f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT0_STA_REG      (0x0004)
597f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT0_SET_REG      (0x0008)
607f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT0_CLR_REG      (0x000C)
617f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT1_STA_REG      (0x0010)
627f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT1_SET_REG      (0x0014)
637f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT1_CLR_REG      (0x0018)
647f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT2_STA_REG      (0x001c)
657f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT2_SET_REG      (0x0020)
667f592182SYing-Chun Liu (PaulLiu) #define REG_TZPC_SMTA_DECPORT2_CLR_REG      (0x0024)
677f592182SYing-Chun Liu (PaulLiu) #endif
687f592182SYing-Chun Liu (PaulLiu) 
697f592182SYing-Chun Liu (PaulLiu) #ifdef SUNXI_CPUCFG_BASE
70a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, SUNXI_CPUCFG_BASE,
71a5e82dc7SJerome Forissier 			SUNXI_CPUCFG_REG_SIZE);
727f592182SYing-Chun Liu (PaulLiu) #endif
737f592182SYing-Chun Liu (PaulLiu) 
747f592182SYing-Chun Liu (PaulLiu) #ifdef SUNXI_PRCM_BASE
75a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, SUNXI_PRCM_BASE, SUNXI_PRCM_REG_SIZE);
767f592182SYing-Chun Liu (PaulLiu) #endif
777f592182SYing-Chun Liu (PaulLiu) 
78e59d8fd7SAmit Singh Tomar #ifdef CFG_TZC380
79e59d8fd7SAmit Singh Tomar vaddr_t smc_base(void);
80a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, SUNXI_SMC_BASE, TZC400_REG_SIZE);
81e59d8fd7SAmit Singh Tomar #define SMC_MASTER_BYPASS 0x18
82e59d8fd7SAmit Singh Tomar #define SMC_MASTER_BYPASS_EN_MASK 0x1
83e59d8fd7SAmit Singh Tomar #endif
84e59d8fd7SAmit Singh Tomar 
85e59d8fd7SAmit Singh Tomar #ifdef SUNXI_TZPC_BASE
867f592182SYing-Chun Liu (PaulLiu) static void tzpc_init(void);
87e59d8fd7SAmit Singh Tomar #endif
887f592182SYing-Chun Liu (PaulLiu) 
897f592182SYing-Chun Liu (PaulLiu) static struct serial8250_uart_data console_data;
907f592182SYing-Chun Liu (PaulLiu) 
plat_console_init(void)91*55ab8f06SAlvin Chang void plat_console_init(void)
927f592182SYing-Chun Liu (PaulLiu) {
937f592182SYing-Chun Liu (PaulLiu) 	serial8250_uart_init(&console_data,
947f592182SYing-Chun Liu (PaulLiu) 			     CONSOLE_UART_BASE,
957f592182SYing-Chun Liu (PaulLiu) 			     CONSOLE_UART_CLK_IN_HZ,
967f592182SYing-Chun Liu (PaulLiu) 			     CONSOLE_BAUDRATE);
977f592182SYing-Chun Liu (PaulLiu) 	register_serial_console(&console_data.chip);
987f592182SYing-Chun Liu (PaulLiu) }
997f592182SYing-Chun Liu (PaulLiu) 
1007f592182SYing-Chun Liu (PaulLiu) #ifdef SUNXI_TZPC_BASE
tzpc_init(void)1017f592182SYing-Chun Liu (PaulLiu) static void tzpc_init(void)
1027f592182SYing-Chun Liu (PaulLiu) {
103c2e4eb43SAnton Rybakov 	vaddr_t v = (vaddr_t)phys_to_virt(SUNXI_TZPC_BASE, MEM_AREA_IO_SEC,
104c2e4eb43SAnton Rybakov 					  SUNXI_TZPC_REG_SIZE);
1057f592182SYing-Chun Liu (PaulLiu) 
106b34bcab2SEtienne Carriere 	DMSG("SMTA_DECPORT0=%x", io_read32(v + REG_TZPC_SMTA_DECPORT0_STA_REG));
107b34bcab2SEtienne Carriere 	DMSG("SMTA_DECPORT1=%x", io_read32(v + REG_TZPC_SMTA_DECPORT1_STA_REG));
108b34bcab2SEtienne Carriere 	DMSG("SMTA_DECPORT2=%x", io_read32(v + REG_TZPC_SMTA_DECPORT2_STA_REG));
1097f592182SYing-Chun Liu (PaulLiu) 
1107f592182SYing-Chun Liu (PaulLiu) 	/* Allow all peripherals for normal world */
111b34bcab2SEtienne Carriere 	io_write32(v + REG_TZPC_SMTA_DECPORT0_SET_REG, 0xbe);
112b34bcab2SEtienne Carriere 	io_write32(v + REG_TZPC_SMTA_DECPORT1_SET_REG, 0xff);
113b34bcab2SEtienne Carriere 	io_write32(v + REG_TZPC_SMTA_DECPORT2_SET_REG, 0x7f);
1147f592182SYing-Chun Liu (PaulLiu) 
115b34bcab2SEtienne Carriere 	DMSG("SMTA_DECPORT0=%x", io_read32(v + REG_TZPC_SMTA_DECPORT0_STA_REG));
116b34bcab2SEtienne Carriere 	DMSG("SMTA_DECPORT1=%x", io_read32(v + REG_TZPC_SMTA_DECPORT1_STA_REG));
117b34bcab2SEtienne Carriere 	DMSG("SMTA_DECPORT2=%x", io_read32(v + REG_TZPC_SMTA_DECPORT2_STA_REG));
1187f592182SYing-Chun Liu (PaulLiu) }
1197f592182SYing-Chun Liu (PaulLiu) #else
tzpc_init(void)1207f592182SYing-Chun Liu (PaulLiu) static inline void tzpc_init(void)
1217f592182SYing-Chun Liu (PaulLiu) {
1227f592182SYing-Chun Liu (PaulLiu) }
1237f592182SYing-Chun Liu (PaulLiu) #endif /* SUNXI_TZPC_BASE */
1247f592182SYing-Chun Liu (PaulLiu) 
125e59d8fd7SAmit Singh Tomar #ifndef CFG_WITH_ARM_TRUSTED_FW
boot_primary_init_intc(void)126df913c6dSAlvin Chang void boot_primary_init_intc(void)
1277f592182SYing-Chun Liu (PaulLiu) {
12867e55c51SEtienne Carriere 	gic_init(GIC_BASE + GICC_OFFSET, GIC_BASE + GICD_OFFSET);
1297f592182SYing-Chun Liu (PaulLiu) }
1307f592182SYing-Chun Liu (PaulLiu) 
boot_secondary_init_intc(void)1318aae4669SAlvin Chang void boot_secondary_init_intc(void)
1327f592182SYing-Chun Liu (PaulLiu) {
1331df471b5SJens Wiklander 	gic_init_per_cpu();
1347f592182SYing-Chun Liu (PaulLiu) }
135e59d8fd7SAmit Singh Tomar #endif
1367f592182SYing-Chun Liu (PaulLiu) 
137e59d8fd7SAmit Singh Tomar #ifdef ARM32
plat_primary_init_early(void)138665fa256SJens Wiklander void plat_primary_init_early(void)
1397f592182SYing-Chun Liu (PaulLiu) {
1407f592182SYing-Chun Liu (PaulLiu) 	assert(!cpu_mmu_enabled());
1417f592182SYing-Chun Liu (PaulLiu) 
1427f592182SYing-Chun Liu (PaulLiu) 	tzpc_init();
1437f592182SYing-Chun Liu (PaulLiu) }
144e59d8fd7SAmit Singh Tomar #endif
145e59d8fd7SAmit Singh Tomar 
146e59d8fd7SAmit Singh Tomar /*
147e59d8fd7SAmit Singh Tomar  * Allwinner's A64 has TZC380 like controller called SMC that can
148e59d8fd7SAmit Singh Tomar  * be programmed to protect parts of DRAM from non-secure world.
149e59d8fd7SAmit Singh Tomar  */
150e59d8fd7SAmit Singh Tomar #ifdef CFG_TZC380
smc_base(void)151e59d8fd7SAmit Singh Tomar vaddr_t smc_base(void)
152e59d8fd7SAmit Singh Tomar {
153c2e4eb43SAnton Rybakov 	return (vaddr_t)phys_to_virt(SUNXI_SMC_BASE, MEM_AREA_IO_SEC,
154c2e4eb43SAnton Rybakov 				     TZC400_REG_SIZE);
155e59d8fd7SAmit Singh Tomar }
156e59d8fd7SAmit Singh Tomar 
smc_init(void)157e59d8fd7SAmit Singh Tomar static TEE_Result smc_init(void)
158e59d8fd7SAmit Singh Tomar {
159e59d8fd7SAmit Singh Tomar 	vaddr_t base = smc_base();
160e59d8fd7SAmit Singh Tomar 
161e59d8fd7SAmit Singh Tomar 	if (!base) {
162e59d8fd7SAmit Singh Tomar 		EMSG("smc not mapped");
163e59d8fd7SAmit Singh Tomar 		panic();
164e59d8fd7SAmit Singh Tomar 	}
165e59d8fd7SAmit Singh Tomar 
166e59d8fd7SAmit Singh Tomar 	tzc_init(base);
167e59d8fd7SAmit Singh Tomar 	tzc_configure_region(0, 0x0, TZC_ATTR_REGION_SIZE(TZC_REGION_SIZE_1G) |
168e59d8fd7SAmit Singh Tomar 			     TZC_ATTR_REGION_EN_MASK | TZC_ATTR_SP_ALL);
169e59d8fd7SAmit Singh Tomar 	tzc_configure_region(1, 0x0, TZC_ATTR_REGION_SIZE(TZC_REGION_SIZE_32M) |
170e59d8fd7SAmit Singh Tomar 			     TZC_ATTR_REGION_EN_MASK | TZC_ATTR_SP_S_RW);
171e59d8fd7SAmit Singh Tomar 
172e59d8fd7SAmit Singh Tomar 	/* SoC specific bits */
173b34bcab2SEtienne Carriere 	io_clrbits32(base + SMC_MASTER_BYPASS, SMC_MASTER_BYPASS_EN_MASK);
174e59d8fd7SAmit Singh Tomar 
175e59d8fd7SAmit Singh Tomar 	return TEE_SUCCESS;
176e59d8fd7SAmit Singh Tomar }
177e59d8fd7SAmit Singh Tomar 
178e59d8fd7SAmit Singh Tomar driver_init(smc_init);
179e59d8fd7SAmit Singh Tomar #endif /* CFG_TZC380 */
180