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