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