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