xref: /rk3399_ARM-atf/drivers/renesas/common/auth/auth_mod.c (revision 9a0c8b7c579032817d0159a9c4474d18a3fd9ed9)
1*9a0c8b7cSBiju Das /*
2*9a0c8b7cSBiju Das  * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights
3*9a0c8b7cSBiju Das  * reserved.
4*9a0c8b7cSBiju Das  *
5*9a0c8b7cSBiju Das  * SPDX-License-Identifier: BSD-3-Clause
6*9a0c8b7cSBiju Das  */
7*9a0c8b7cSBiju Das 
8*9a0c8b7cSBiju Das #include <stddef.h>
9*9a0c8b7cSBiju Das 
10*9a0c8b7cSBiju Das #include <arch_helpers.h>
11*9a0c8b7cSBiju Das #include <common/debug.h>
12*9a0c8b7cSBiju Das #include <lib/mmio.h>
13*9a0c8b7cSBiju Das #include <plat/common/platform.h>
14*9a0c8b7cSBiju Das 
15*9a0c8b7cSBiju Das #include <platform_def.h>
16*9a0c8b7cSBiju Das #include "rom_api.h"
17*9a0c8b7cSBiju Das 
18*9a0c8b7cSBiju Das typedef int32_t(*secure_boot_api_f) (uint32_t a, uint32_t b, void *c);
19*9a0c8b7cSBiju Das extern int32_t rcar_get_certificate(const int32_t name, uint32_t *cert_addr);
20*9a0c8b7cSBiju Das 
21*9a0c8b7cSBiju Das #define RCAR_IMAGE_ID_MAX	(10)
22*9a0c8b7cSBiju Das #define RCAR_CERT_MAGIC_NUM	(0xE291F358U)
23*9a0c8b7cSBiju Das #define RCAR_BOOT_KEY_CERT	(0xE6300C00U)
24*9a0c8b7cSBiju Das #define RCAR_BOOT_KEY_CERT_NEW	(0xE6300F00U)
25*9a0c8b7cSBiju Das #define RST_BASE		(0xE6160000U)
26*9a0c8b7cSBiju Das #define RST_MODEMR		(RST_BASE + 0x0060U)
27*9a0c8b7cSBiju Das #define MFISOFTMDR		(0xE6260600U)
28*9a0c8b7cSBiju Das #define MODEMR_MD5_MASK		(0x00000020U)
29*9a0c8b7cSBiju Das #define MODEMR_MD5_SHIFT	(5U)
30*9a0c8b7cSBiju Das #define SOFTMD_BOOTMODE_MASK	(0x00000001U)
31*9a0c8b7cSBiju Das #define SOFTMD_NORMALBOOT	(0x1U)
32*9a0c8b7cSBiju Das 
33*9a0c8b7cSBiju Das static secure_boot_api_f secure_boot_api;
34*9a0c8b7cSBiju Das 
35*9a0c8b7cSBiju Das int auth_mod_get_parent_id(unsigned int img_id, unsigned int *parent_id)
36*9a0c8b7cSBiju Das {
37*9a0c8b7cSBiju Das 	return 1;
38*9a0c8b7cSBiju Das }
39*9a0c8b7cSBiju Das 
40*9a0c8b7cSBiju Das int auth_mod_verify_img(unsigned int img_id, void *ptr, unsigned int len)
41*9a0c8b7cSBiju Das {
42*9a0c8b7cSBiju Das 	int32_t ret = 0, index = 0;
43*9a0c8b7cSBiju Das 	uint32_t cert_addr = 0U;
44*9a0c8b7cSBiju Das 	static const struct img_to_cert_t {
45*9a0c8b7cSBiju Das 		uint32_t id;
46*9a0c8b7cSBiju Das 		int32_t cert;
47*9a0c8b7cSBiju Das 		const char *name;
48*9a0c8b7cSBiju Das 	} image[RCAR_IMAGE_ID_MAX] = {
49*9a0c8b7cSBiju Das 		{ BL31_IMAGE_ID, SOC_FW_CONTENT_CERT_ID, "BL31" },
50*9a0c8b7cSBiju Das 		{ BL32_IMAGE_ID, TRUSTED_OS_FW_CONTENT_CERT_ID, "BL32" },
51*9a0c8b7cSBiju Das 		{ BL33_IMAGE_ID, NON_TRUSTED_FW_CONTENT_CERT_ID, "BL33" },
52*9a0c8b7cSBiju Das 		{ BL332_IMAGE_ID, BL332_CERT_ID, "BL332" },
53*9a0c8b7cSBiju Das 		{ BL333_IMAGE_ID, BL333_CERT_ID, "BL333" },
54*9a0c8b7cSBiju Das 		{ BL334_IMAGE_ID, BL334_CERT_ID, "BL334" },
55*9a0c8b7cSBiju Das 		{ BL335_IMAGE_ID, BL335_CERT_ID, "BL335" },
56*9a0c8b7cSBiju Das 		{ BL336_IMAGE_ID, BL336_CERT_ID, "BL336" },
57*9a0c8b7cSBiju Das 		{ BL337_IMAGE_ID, BL337_CERT_ID, "BL337" },
58*9a0c8b7cSBiju Das 		{ BL338_IMAGE_ID, BL338_CERT_ID, "BL338" },
59*9a0c8b7cSBiju Das 	};
60*9a0c8b7cSBiju Das 
61*9a0c8b7cSBiju Das #if IMAGE_BL2
62*9a0c8b7cSBiju Das 	switch (img_id) {
63*9a0c8b7cSBiju Das 	case TRUSTED_KEY_CERT_ID:
64*9a0c8b7cSBiju Das 	case SOC_FW_KEY_CERT_ID:
65*9a0c8b7cSBiju Das 	case TRUSTED_OS_FW_KEY_CERT_ID:
66*9a0c8b7cSBiju Das 	case NON_TRUSTED_FW_KEY_CERT_ID:
67*9a0c8b7cSBiju Das 	case BL332_KEY_CERT_ID:
68*9a0c8b7cSBiju Das 	case BL333_KEY_CERT_ID:
69*9a0c8b7cSBiju Das 	case BL334_KEY_CERT_ID:
70*9a0c8b7cSBiju Das 	case BL335_KEY_CERT_ID:
71*9a0c8b7cSBiju Das 	case BL336_KEY_CERT_ID:
72*9a0c8b7cSBiju Das 	case BL337_KEY_CERT_ID:
73*9a0c8b7cSBiju Das 	case BL338_KEY_CERT_ID:
74*9a0c8b7cSBiju Das 	case SOC_FW_CONTENT_CERT_ID:
75*9a0c8b7cSBiju Das 	case TRUSTED_OS_FW_CONTENT_CERT_ID:
76*9a0c8b7cSBiju Das 	case NON_TRUSTED_FW_CONTENT_CERT_ID:
77*9a0c8b7cSBiju Das 	case BL332_CERT_ID:
78*9a0c8b7cSBiju Das 	case BL333_CERT_ID:
79*9a0c8b7cSBiju Das 	case BL334_CERT_ID:
80*9a0c8b7cSBiju Das 	case BL335_CERT_ID:
81*9a0c8b7cSBiju Das 	case BL336_CERT_ID:
82*9a0c8b7cSBiju Das 	case BL337_CERT_ID:
83*9a0c8b7cSBiju Das 	case BL338_CERT_ID:
84*9a0c8b7cSBiju Das 		return ret;
85*9a0c8b7cSBiju Das 	case BL31_IMAGE_ID:
86*9a0c8b7cSBiju Das 	case BL32_IMAGE_ID:
87*9a0c8b7cSBiju Das 	case BL33_IMAGE_ID:
88*9a0c8b7cSBiju Das 	case BL332_IMAGE_ID:
89*9a0c8b7cSBiju Das 	case BL333_IMAGE_ID:
90*9a0c8b7cSBiju Das 	case BL334_IMAGE_ID:
91*9a0c8b7cSBiju Das 	case BL335_IMAGE_ID:
92*9a0c8b7cSBiju Das 	case BL336_IMAGE_ID:
93*9a0c8b7cSBiju Das 	case BL337_IMAGE_ID:
94*9a0c8b7cSBiju Das 	case BL338_IMAGE_ID:
95*9a0c8b7cSBiju Das 		goto verify_image;
96*9a0c8b7cSBiju Das 	default:
97*9a0c8b7cSBiju Das 		return -1;
98*9a0c8b7cSBiju Das 	}
99*9a0c8b7cSBiju Das 
100*9a0c8b7cSBiju Das verify_image:
101*9a0c8b7cSBiju Das 	for (index = 0; index < RCAR_IMAGE_ID_MAX; index++) {
102*9a0c8b7cSBiju Das 		if (img_id != image[index].id)
103*9a0c8b7cSBiju Das 			continue;
104*9a0c8b7cSBiju Das 
105*9a0c8b7cSBiju Das 		ret = rcar_get_certificate(image[index].cert, &cert_addr);
106*9a0c8b7cSBiju Das 		break;
107*9a0c8b7cSBiju Das 	}
108*9a0c8b7cSBiju Das 
109*9a0c8b7cSBiju Das 	if (ret || (index == RCAR_IMAGE_ID_MAX)) {
110*9a0c8b7cSBiju Das 		ERROR("Verification Failed for image id = %d\n", img_id);
111*9a0c8b7cSBiju Das 		return ret;
112*9a0c8b7cSBiju Das 	}
113*9a0c8b7cSBiju Das #if RCAR_BL2_DCACHE == 1
114*9a0c8b7cSBiju Das 	/* clean and disable */
115*9a0c8b7cSBiju Das 	write_sctlr_el3(read_sctlr_el3() & ~SCTLR_C_BIT);
116*9a0c8b7cSBiju Das 	dcsw_op_all(DCCISW);
117*9a0c8b7cSBiju Das #endif
118*9a0c8b7cSBiju Das 	ret = (mmio_read_32(RCAR_BOOT_KEY_CERT_NEW) == RCAR_CERT_MAGIC_NUM) ?
119*9a0c8b7cSBiju Das 	    secure_boot_api(RCAR_BOOT_KEY_CERT_NEW, cert_addr, NULL) :
120*9a0c8b7cSBiju Das 	    secure_boot_api(RCAR_BOOT_KEY_CERT, cert_addr, NULL);
121*9a0c8b7cSBiju Das 	if (ret)
122*9a0c8b7cSBiju Das 		ERROR("Verification Failed 0x%x, %s\n", ret, image[index].name);
123*9a0c8b7cSBiju Das 
124*9a0c8b7cSBiju Das #if RCAR_BL2_DCACHE == 1
125*9a0c8b7cSBiju Das 	/* enable */
126*9a0c8b7cSBiju Das 	write_sctlr_el3(read_sctlr_el3() | SCTLR_C_BIT);
127*9a0c8b7cSBiju Das #endif /* RCAR_BL2_DCACHE */
128*9a0c8b7cSBiju Das 
129*9a0c8b7cSBiju Das #endif /* IMAGE_BL2 */
130*9a0c8b7cSBiju Das 	return ret;
131*9a0c8b7cSBiju Das }
132*9a0c8b7cSBiju Das 
133*9a0c8b7cSBiju Das static int32_t normal_boot_verify(uint32_t a, uint32_t b, void *c)
134*9a0c8b7cSBiju Das {
135*9a0c8b7cSBiju Das 	return 0;
136*9a0c8b7cSBiju Das }
137*9a0c8b7cSBiju Das 
138*9a0c8b7cSBiju Das void auth_mod_init(void)
139*9a0c8b7cSBiju Das {
140*9a0c8b7cSBiju Das #if RCAR_SECURE_BOOT
141*9a0c8b7cSBiju Das 	uint32_t soft_md = mmio_read_32(MFISOFTMDR) & SOFTMD_BOOTMODE_MASK;
142*9a0c8b7cSBiju Das 	uint32_t md = mmio_read_32(RST_MODEMR) & MODEMR_MD5_MASK;
143*9a0c8b7cSBiju Das 	uint32_t lcs, ret;
144*9a0c8b7cSBiju Das 
145*9a0c8b7cSBiju Das 	secure_boot_api = (secure_boot_api_f) &rcar_rom_secure_boot_api;
146*9a0c8b7cSBiju Das 
147*9a0c8b7cSBiju Das 	ret = rcar_rom_get_lcs(&lcs);
148*9a0c8b7cSBiju Das 	if (ret) {
149*9a0c8b7cSBiju Das 		ERROR("BL2: Failed to get the LCS. (%d)\n", ret);
150*9a0c8b7cSBiju Das 		panic();
151*9a0c8b7cSBiju Das 	}
152*9a0c8b7cSBiju Das 
153*9a0c8b7cSBiju Das 	switch (lcs) {
154*9a0c8b7cSBiju Das 	case LCS_SE:
155*9a0c8b7cSBiju Das 		if (soft_md == SOFTMD_NORMALBOOT)
156*9a0c8b7cSBiju Das 			secure_boot_api = &normal_boot_verify;
157*9a0c8b7cSBiju Das 		break;
158*9a0c8b7cSBiju Das 	case LCS_SD:
159*9a0c8b7cSBiju Das 		secure_boot_api = &normal_boot_verify;
160*9a0c8b7cSBiju Das 		break;
161*9a0c8b7cSBiju Das 	default:
162*9a0c8b7cSBiju Das 		if (md >> MODEMR_MD5_SHIFT)
163*9a0c8b7cSBiju Das 			secure_boot_api = &normal_boot_verify;
164*9a0c8b7cSBiju Das 	}
165*9a0c8b7cSBiju Das 
166*9a0c8b7cSBiju Das 	NOTICE("BL2: %s boot\n",
167*9a0c8b7cSBiju Das 	       secure_boot_api == &normal_boot_verify ? "Normal" : "Secure");
168*9a0c8b7cSBiju Das #else
169*9a0c8b7cSBiju Das 	NOTICE("BL2: Normal boot\n");
170*9a0c8b7cSBiju Das 	secure_boot_api = &normal_boot_verify;
171*9a0c8b7cSBiju Das #endif
172*9a0c8b7cSBiju Das }
173