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