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