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