1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 * Copyright (c) 2024, Telechips Inc.
4 */
5
6 #include <console.h>
7 #include <crypto/crypto.h>
8 #include <drivers/gic.h>
9 #include <drivers/pl011.h>
10 #include <drivers/tcc_otp.h>
11 #include <kernel/boot.h>
12 #include <kernel/tee_common_otp.h>
13 #include <otprom.h>
14 #include <platform_config.h>
15
16 register_phys_mem(MEM_AREA_IO_SEC, TCC_IO_BASE, TCC_IO_SIZE);
17 #if defined(TZC_BASE)
18 register_phys_mem(MEM_AREA_IO_SEC, TZC_BASE, TZC_SIZE);
19 #endif
20
21 register_ddr(DRAM0_BASE, DRAM0_SIZE);
22 #if defined(DRAM1_BASE)
23 register_ddr(DRAM1_BASE, DRAM1_SIZE);
24 #endif
25
26 static bool huk_is_ready;
27 static uint32_t plat_huk[OTP_DATA_TEE_HUK_SIZE / sizeof(uint32_t)];
28
boot_primary_init_intc(void)29 void boot_primary_init_intc(void)
30 {
31 gic_init(GICC_BASE, GICD_BASE);
32 }
33
boot_secondary_init_intc(void)34 void boot_secondary_init_intc(void)
35 {
36 gic_init_per_cpu();
37 }
38
plat_console_init(void)39 void plat_console_init(void)
40 {
41 #if defined(CFG_PL011)
42 static struct pl011_data console_data;
43
44 pl011_init(&console_data, CONSOLE_UART_BASE, CONSOLE_UART_CLK_IN_HZ,
45 CONSOLE_BAUDRATE);
46 register_serial_console(&console_data.chip);
47 #endif
48 }
49
tee_otp_get_hw_unique_key(struct tee_hw_unique_key * hwkey)50 TEE_Result tee_otp_get_hw_unique_key(struct tee_hw_unique_key *hwkey)
51 {
52 static_assert(sizeof(plat_huk) == sizeof(hwkey->data));
53
54 if (!huk_is_ready)
55 return TEE_ERROR_GENERIC;
56
57 memcpy(hwkey->data, plat_huk, OTP_DATA_TEE_HUK_SIZE);
58 return TEE_SUCCESS;
59 }
60
init_huk(void)61 static TEE_Result init_huk(void)
62 {
63 TEE_Result res = TEE_ERROR_GENERIC;
64
65 res = tcc_otp_read_128(OTP_DATA_TEE_HUK_OFFSET, plat_huk);
66 if (res == TEE_ERROR_NO_DATA) {
67 IMSG("There is no HUK in OTP. Starting HUK Provisioning");
68 if (!crypto_rng_read(plat_huk, OTP_DATA_TEE_HUK_SIZE)) {
69 tcc_otp_write_128(OTP_DATA_TEE_HUK_OFFSET, plat_huk);
70 res = tcc_otp_read_128(OTP_DATA_TEE_HUK_OFFSET,
71 plat_huk);
72 if (res != TEE_SUCCESS)
73 EMSG("Failed to store HUK to OTP");
74 } else {
75 EMSG("Failed to generate random number for HUK");
76 }
77 }
78
79 if (res == TEE_SUCCESS)
80 huk_is_ready = true;
81 else
82 EMSG("Failed to get HUK from OTP");
83
84 return res;
85 }
86 service_init(init_huk);
87