1*e17997dfSBiju Das /* 2*e17997dfSBiju Das * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. 3*e17997dfSBiju Das * 4*e17997dfSBiju Das * SPDX-License-Identifier: BSD-3-Clause 5*e17997dfSBiju Das */ 6*e17997dfSBiju Das 7*e17997dfSBiju Das #include <stdint.h> 8*e17997dfSBiju Das 9*e17997dfSBiju Das #include <lib/mmio.h> 10*e17997dfSBiju Das 11*e17997dfSBiju Das #include "rcar_def.h" 12*e17997dfSBiju Das #include "rom_api.h" 13*e17997dfSBiju Das 14*e17997dfSBiju Das typedef uint32_t(*rom_secure_boot_api_f) (uint32_t *key, uint32_t *cert, 15*e17997dfSBiju Das rom_read_flash_f pFuncReadFlash); 16*e17997dfSBiju Das 17*e17997dfSBiju Das typedef uint32_t(*rom_get_lcs_api_f) (uint32_t *lcs); 18*e17997dfSBiju Das 19*e17997dfSBiju Das #define OLD_API_TABLE1 (0U) /* H3 Ver.1.0/Ver.1.1 */ 20*e17997dfSBiju Das #define OLD_API_TABLE2 (1U) /* H3 Ver.2.0 */ 21*e17997dfSBiju Das #define OLD_API_TABLE3 (2U) /* M3 Ver.1.0 */ 22*e17997dfSBiju Das #define NEW_API_TABLE (3U) /* H3 Ver.3.0, M3 Ver.1.1 or later, M3N, E3, D3, V3M WS2.0 */ 23*e17997dfSBiju Das #define NEW_API_TABLE2 (4U) /* V3M WS1.0 */ 24*e17997dfSBiju Das #define API_TABLE_MAX (5U) /* table max */ 25*e17997dfSBiju Das /* Later than H3 Ver.2.0 */ 26*e17997dfSBiju Das 27*e17997dfSBiju Das static uint32_t get_table_index(void) 28*e17997dfSBiju Das { 29*e17997dfSBiju Das uint32_t product; 30*e17997dfSBiju Das uint32_t cut_ver; 31*e17997dfSBiju Das uint32_t index; 32*e17997dfSBiju Das 33*e17997dfSBiju Das product = mmio_read_32(RCAR_PRR) & PRR_PRODUCT_MASK; 34*e17997dfSBiju Das cut_ver = mmio_read_32(RCAR_PRR) & PRR_CUT_MASK; 35*e17997dfSBiju Das 36*e17997dfSBiju Das switch (product) { 37*e17997dfSBiju Das case PRR_PRODUCT_H3: 38*e17997dfSBiju Das if (cut_ver == PRR_PRODUCT_10) 39*e17997dfSBiju Das index = OLD_API_TABLE1; 40*e17997dfSBiju Das else if (cut_ver == PRR_PRODUCT_11) 41*e17997dfSBiju Das index = OLD_API_TABLE1; 42*e17997dfSBiju Das else if (cut_ver == PRR_PRODUCT_20) 43*e17997dfSBiju Das index = OLD_API_TABLE2; 44*e17997dfSBiju Das else 45*e17997dfSBiju Das /* Later than H3 Ver.2.0 */ 46*e17997dfSBiju Das index = NEW_API_TABLE; 47*e17997dfSBiju Das break; 48*e17997dfSBiju Das case PRR_PRODUCT_M3: 49*e17997dfSBiju Das if (cut_ver == PRR_PRODUCT_10) 50*e17997dfSBiju Das index = OLD_API_TABLE3; 51*e17997dfSBiju Das else 52*e17997dfSBiju Das /* M3 Ver.1.1 or later */ 53*e17997dfSBiju Das index = NEW_API_TABLE; 54*e17997dfSBiju Das break; 55*e17997dfSBiju Das case PRR_PRODUCT_V3M: 56*e17997dfSBiju Das if (cut_ver == PRR_PRODUCT_10) 57*e17997dfSBiju Das /* V3M WS1.0 */ 58*e17997dfSBiju Das index = NEW_API_TABLE2; 59*e17997dfSBiju Das else 60*e17997dfSBiju Das /* V3M WS2.0 or later */ 61*e17997dfSBiju Das index = NEW_API_TABLE; 62*e17997dfSBiju Das break; 63*e17997dfSBiju Das default: 64*e17997dfSBiju Das index = NEW_API_TABLE; 65*e17997dfSBiju Das break; 66*e17997dfSBiju Das } 67*e17997dfSBiju Das 68*e17997dfSBiju Das return index; 69*e17997dfSBiju Das } 70*e17997dfSBiju Das 71*e17997dfSBiju Das uint32_t rcar_rom_secure_boot_api(uint32_t *key, uint32_t *cert, 72*e17997dfSBiju Das rom_read_flash_f read_flash) 73*e17997dfSBiju Das { 74*e17997dfSBiju Das static const uintptr_t rom_api_table[API_TABLE_MAX] = { 75*e17997dfSBiju Das 0xEB10DD64U, /* H3 Ver.1.0/Ver.1.1 */ 76*e17997dfSBiju Das 0xEB116ED4U, /* H3 Ver.2.0 */ 77*e17997dfSBiju Das 0xEB1102FCU, /* M3 Ver.1.0 */ 78*e17997dfSBiju Das 0xEB100180U, /* H3 Ver.3.0, M3 Ver.1.1 or later, M3N, E3, D3, V3M WS2.0 */ 79*e17997dfSBiju Das 0xEB110128U, /* V3M WS1.0 */ 80*e17997dfSBiju Das }; 81*e17997dfSBiju Das rom_secure_boot_api_f secure_boot; 82*e17997dfSBiju Das uint32_t index; 83*e17997dfSBiju Das 84*e17997dfSBiju Das index = get_table_index(); 85*e17997dfSBiju Das secure_boot = (rom_secure_boot_api_f) rom_api_table[index]; 86*e17997dfSBiju Das 87*e17997dfSBiju Das return secure_boot(key, cert, read_flash); 88*e17997dfSBiju Das } 89*e17997dfSBiju Das 90*e17997dfSBiju Das uint32_t rcar_rom_get_lcs(uint32_t *lcs) 91*e17997dfSBiju Das { 92*e17997dfSBiju Das static const uintptr_t rom_get_lcs_table[API_TABLE_MAX] = { 93*e17997dfSBiju Das 0xEB10DFE0U, /* H3 Ver.1.0/Ver.1.1 */ 94*e17997dfSBiju Das 0xEB117150U, /* H3 Ver.2.0 */ 95*e17997dfSBiju Das 0xEB110578U, /* M3 Ver.1.0 */ 96*e17997dfSBiju Das 0xEB10018CU, /* H3 Ver.3.0, M3 Ver.1.1 or later, M3N, E3, D3, V3M WS2.0 */ 97*e17997dfSBiju Das 0xEB1103A4U, /* V3M WS1.0 */ 98*e17997dfSBiju Das }; 99*e17997dfSBiju Das rom_get_lcs_api_f get_lcs; 100*e17997dfSBiju Das uint32_t index; 101*e17997dfSBiju Das 102*e17997dfSBiju Das index = get_table_index(); 103*e17997dfSBiju Das get_lcs = (rom_get_lcs_api_f) rom_get_lcs_table[index]; 104*e17997dfSBiju Das 105*e17997dfSBiju Das return get_lcs(lcs); 106*e17997dfSBiju Das } 107