xref: /optee_os/core/arch/arm/plat-ti/main.c (revision 122114b25d7d4592bb9d5b6933e1c148073d4f0f)
11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
29b5060cdSHarinarayan Bhatta /*
39b5060cdSHarinarayan Bhatta  * Copyright (c) 2015, Linaro Limited
49b5060cdSHarinarayan Bhatta  */
59b5060cdSHarinarayan Bhatta 
6e9f46c74SJens Wiklander #include <arm.h>
79b5060cdSHarinarayan Bhatta #include <assert.h>
8e9f46c74SJens Wiklander #include <console.h>
99b5060cdSHarinarayan Bhatta #include <drivers/gic.h>
1062c0a2c3SJerome Forissier #include <drivers/serial8250_uart.h>
1165401337SJens Wiklander #include <kernel/boot.h>
129b5060cdSHarinarayan Bhatta #include <kernel/misc.h>
139b5060cdSHarinarayan Bhatta #include <kernel/mutex.h>
14e9f46c74SJens Wiklander #include <kernel/panic.h>
1575c6da9dSAndrew F. Davis #include <kernel/tee_common_otp.h>
16e9f46c74SJens Wiklander #include <kernel/tee_time.h>
17dc6daad5SJens Wiklander #include <mm/core_memprot.h>
18e9f46c74SJens Wiklander #include <mm/core_mmu.h>
19e9f46c74SJens Wiklander #include <platform_config.h>
209b5060cdSHarinarayan Bhatta #include <sm/sm.h>
21e9f46c74SJens Wiklander #include <stdint.h>
22e9f46c74SJens Wiklander #include <string.h>
23e9f46c74SJens Wiklander #include <trace.h>
249b5060cdSHarinarayan Bhatta 
25d5e5a05bSAndrew F. Davis #define PLAT_HW_UNIQUE_KEY_LENGTH 32
26d5e5a05bSAndrew F. Davis 
2723660121SJerome Forissier static struct serial8250_uart_data console_data;
28d5e5a05bSAndrew F. Davis static uint8_t plat_huk[PLAT_HW_UNIQUE_KEY_LENGTH];
29c640d6efSAndrew F. Davis 
30446cc62aSEtienne Carriere register_phys_mem(MEM_AREA_RAM_SEC, TZDRAM_BASE, TEE_RAM_VA_SIZE);
31a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, SECRAM_BASE, SECRAM_SIZE);
32a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICC_BASE, GICC_SIZE);
33a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_SEC, GICD_BASE, GICD_SIZE);
34a5e82dc7SJerome Forissier register_phys_mem_pgdir(MEM_AREA_IO_NSEC, CONSOLE_UART_BASE,
3562c0a2c3SJerome Forissier 		  SERIAL8250_UART_REG_SIZE);
36c640d6efSAndrew F. Davis 
boot_primary_init_intc(void)37df913c6dSAlvin Chang void boot_primary_init_intc(void)
38c640d6efSAndrew F. Davis {
3967e55c51SEtienne Carriere 	gic_init(GICC_BASE, GICD_BASE);
40c640d6efSAndrew F. Davis }
41c640d6efSAndrew F. Davis 
boot_secondary_init_intc(void)428aae4669SAlvin Chang void boot_secondary_init_intc(void)
43c640d6efSAndrew F. Davis {
443aa51b28SJens Wiklander 	gic_init_per_cpu();
45993a1d54SAndrew F. Davis }
469b5060cdSHarinarayan Bhatta 
479b5060cdSHarinarayan Bhatta struct plat_nsec_ctx {
489b5060cdSHarinarayan Bhatta 	uint32_t usr_sp;
499b5060cdSHarinarayan Bhatta 	uint32_t usr_lr;
509b5060cdSHarinarayan Bhatta 	uint32_t svc_sp;
519b5060cdSHarinarayan Bhatta 	uint32_t svc_lr;
529b5060cdSHarinarayan Bhatta 	uint32_t svc_spsr;
539b5060cdSHarinarayan Bhatta 	uint32_t abt_sp;
549b5060cdSHarinarayan Bhatta 	uint32_t abt_lr;
559b5060cdSHarinarayan Bhatta 	uint32_t abt_spsr;
569b5060cdSHarinarayan Bhatta 	uint32_t und_sp;
579b5060cdSHarinarayan Bhatta 	uint32_t und_lr;
589b5060cdSHarinarayan Bhatta 	uint32_t und_spsr;
599b5060cdSHarinarayan Bhatta 	uint32_t irq_sp;
609b5060cdSHarinarayan Bhatta 	uint32_t irq_lr;
619b5060cdSHarinarayan Bhatta 	uint32_t irq_spsr;
629b5060cdSHarinarayan Bhatta 	uint32_t fiq_sp;
639b5060cdSHarinarayan Bhatta 	uint32_t fiq_lr;
649b5060cdSHarinarayan Bhatta 	uint32_t fiq_spsr;
659b5060cdSHarinarayan Bhatta 	uint32_t fiq_rx[5];
669b5060cdSHarinarayan Bhatta 	uint32_t mon_lr;
679b5060cdSHarinarayan Bhatta 	uint32_t mon_spsr;
689b5060cdSHarinarayan Bhatta };
699b5060cdSHarinarayan Bhatta 
709a8dd03dSAndrew F. Davis struct plat_boot_args {
719a8dd03dSAndrew F. Davis 	struct plat_nsec_ctx nsec_ctx;
72d5e5a05bSAndrew F. Davis 	uint8_t huk[PLAT_HW_UNIQUE_KEY_LENGTH];
739a8dd03dSAndrew F. Davis };
749a8dd03dSAndrew F. Davis 
init_sec_mon(unsigned long nsec_entry __unused)75*122114b2SAlistair Higgins void init_sec_mon(unsigned long nsec_entry __unused)
769b5060cdSHarinarayan Bhatta {
779a8dd03dSAndrew F. Davis 	struct plat_boot_args *plat_boot_args;
789b5060cdSHarinarayan Bhatta 	struct sm_nsec_ctx *nsec_ctx;
799b5060cdSHarinarayan Bhatta 
80*122114b2SAlistair Higgins 	plat_boot_args = phys_to_virt(boot_arg_nsec_entry, MEM_AREA_IO_SEC, 1);
819a8dd03dSAndrew F. Davis 	if (!plat_boot_args)
82c8d1d420SHarinarayan Bhatta 		panic();
83c8d1d420SHarinarayan Bhatta 
849b5060cdSHarinarayan Bhatta 	/* Invalidate cache to fetch data from external memory */
85cba1d39bSEtienne Carriere 	cache_op_inner(DCACHE_AREA_INVALIDATE,
869a8dd03dSAndrew F. Davis 			plat_boot_args, sizeof(*plat_boot_args));
879b5060cdSHarinarayan Bhatta 
889b5060cdSHarinarayan Bhatta 	/* Initialize secure monitor */
899b5060cdSHarinarayan Bhatta 	nsec_ctx = sm_get_nsec_ctx();
909b5060cdSHarinarayan Bhatta 
910160fec3SJerome Forissier 	nsec_ctx->ub_regs.usr_sp = plat_boot_args->nsec_ctx.usr_sp;
920160fec3SJerome Forissier 	nsec_ctx->ub_regs.usr_lr = plat_boot_args->nsec_ctx.usr_lr;
930160fec3SJerome Forissier 	nsec_ctx->ub_regs.irq_spsr = plat_boot_args->nsec_ctx.irq_spsr;
940160fec3SJerome Forissier 	nsec_ctx->ub_regs.irq_sp = plat_boot_args->nsec_ctx.irq_sp;
950160fec3SJerome Forissier 	nsec_ctx->ub_regs.irq_lr = plat_boot_args->nsec_ctx.irq_lr;
960160fec3SJerome Forissier 	nsec_ctx->ub_regs.svc_spsr = plat_boot_args->nsec_ctx.svc_spsr;
970160fec3SJerome Forissier 	nsec_ctx->ub_regs.svc_sp = plat_boot_args->nsec_ctx.svc_sp;
980160fec3SJerome Forissier 	nsec_ctx->ub_regs.svc_lr = plat_boot_args->nsec_ctx.svc_lr;
990160fec3SJerome Forissier 	nsec_ctx->ub_regs.abt_spsr = plat_boot_args->nsec_ctx.abt_spsr;
1000160fec3SJerome Forissier 	nsec_ctx->ub_regs.abt_sp = plat_boot_args->nsec_ctx.abt_sp;
1010160fec3SJerome Forissier 	nsec_ctx->ub_regs.abt_lr = plat_boot_args->nsec_ctx.abt_lr;
1020160fec3SJerome Forissier 	nsec_ctx->ub_regs.und_spsr = plat_boot_args->nsec_ctx.und_spsr;
1030160fec3SJerome Forissier 	nsec_ctx->ub_regs.und_sp = plat_boot_args->nsec_ctx.und_sp;
1040160fec3SJerome Forissier 	nsec_ctx->ub_regs.und_lr = plat_boot_args->nsec_ctx.und_lr;
1059a8dd03dSAndrew F. Davis 	nsec_ctx->mon_lr = plat_boot_args->nsec_ctx.mon_lr;
1069a8dd03dSAndrew F. Davis 	nsec_ctx->mon_spsr = plat_boot_args->nsec_ctx.mon_spsr;
107*122114b2SAlistair Higgins }
108*122114b2SAlistair Higgins 
109*122114b2SAlistair Higgins /* Early init HUK before SSK is derived by tee_fs_init_key_manager */
early_init_huk(void)110*122114b2SAlistair Higgins static TEE_Result early_init_huk(void)
111*122114b2SAlistair Higgins {
112*122114b2SAlistair Higgins 	struct plat_boot_args *plat_boot_args;
113*122114b2SAlistair Higgins 
114*122114b2SAlistair Higgins 	plat_boot_args = phys_to_virt(boot_arg_nsec_entry, MEM_AREA_IO_SEC, 1);
115*122114b2SAlistair Higgins 	if (!plat_boot_args)
116*122114b2SAlistair Higgins 		panic();
117*122114b2SAlistair Higgins 
118*122114b2SAlistair Higgins 	/* Invalidate cache to fetch data from external memory */
119*122114b2SAlistair Higgins 	cache_op_inner(DCACHE_AREA_INVALIDATE,
120*122114b2SAlistair Higgins 		       plat_boot_args, sizeof(*plat_boot_args));
121d5e5a05bSAndrew F. Davis 
122d5e5a05bSAndrew F. Davis 	memcpy(plat_huk, plat_boot_args->huk, sizeof(plat_boot_args->huk));
123*122114b2SAlistair Higgins 	return TEE_SUCCESS;
1249b5060cdSHarinarayan Bhatta }
125*122114b2SAlistair Higgins early_init(early_init_huk);
12662c0a2c3SJerome Forissier 
plat_console_init(void)12755ab8f06SAlvin Chang void plat_console_init(void)
12862c0a2c3SJerome Forissier {
12962c0a2c3SJerome Forissier 	serial8250_uart_init(&console_data, CONSOLE_UART_BASE,
13062c0a2c3SJerome Forissier 			     CONSOLE_UART_CLK_IN_HZ, CONSOLE_BAUDRATE);
13162c0a2c3SJerome Forissier 	register_serial_console(&console_data.chip);
13262c0a2c3SJerome Forissier }
13375c6da9dSAndrew F. Davis 
13475c6da9dSAndrew F. Davis #if defined(CFG_OTP_SUPPORT)
13575c6da9dSAndrew F. Davis 
tee_otp_get_hw_unique_key(struct tee_hw_unique_key * hwkey)136daaf4f11SDaniel McIlvaney TEE_Result tee_otp_get_hw_unique_key(struct tee_hw_unique_key *hwkey)
13775c6da9dSAndrew F. Davis {
13875c6da9dSAndrew F. Davis 	memcpy(&hwkey->data[0], &plat_huk[0], sizeof(hwkey->data));
139daaf4f11SDaniel McIlvaney 	return TEE_SUCCESS;
14075c6da9dSAndrew F. Davis }
14175c6da9dSAndrew F. Davis 
14275c6da9dSAndrew F. Davis #endif
143