1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (C) 2022 Foundries.io Ltd 4 * Jorge Ramirez-Ortiz <jorge@foundries.io> 5 * 6 * Copyright (C) 2023 ProvenRun S.A.S 7 */ 8 9 #include <config.h> 10 #include <drivers/versal_pmc.h> 11 #include <initcall.h> 12 13 #ifdef CFG_VERSAL_TRACE_PMC 14 static const char *const nvm_id[] = { 15 [0] = "API_FEATURES", 16 [1] = "BBRAM_WRITE_AES_KEY", 17 [2] = "BBRAM_ZEROIZE", 18 [3] = "BBRAM_WRITE_USER_DATA", 19 [4] = "BBRAM_READ_USER_DATA", 20 [5] = "BBRAM_LOCK_WRITE_USER_DATA", 21 #if defined(PLATFORM_FLAVOR_net) 22 [6] = "BBRAM_WRITE_AES_KEY_FROM_PLOAD", 23 [7] = "EFUSE_WRITE_AES_KEY", 24 [8] = "EFUSE_WRITE_AES_KEY_FROM_PLOAD", 25 [9] = "EFUSE_WRITE_PPK_HASH", 26 [10] = "EFUSE_WRITE_PPK_HASH_FROM_PLOAD", 27 [11] = "EFUSE_WRITE_IV", 28 [12] = "EFUSE_WRITE_IV_FROM_PLOAD", 29 [13] = "EFUSE_WRITE_GLITCH_CONFIG", 30 [14] = "EFUSE_WRITE_DEC_ONLY", 31 [15] = "EFUSE_WRITE_REVOCATION_ID", 32 [16] = "EFUSE_WRITE_OFFCHIP_REVOKE_ID", 33 [17] = "EFUSE_WRITE_MISC_CTRL_BITS", 34 [18] = "EFUSE_WRITE_SEC_CTRL_BITS", 35 [19] = "EFUSE_WRITE_MISC1_CTRL_BITS", 36 [20] = "EFUSE_WRITE_BOOT_ENV_CTRL_BITS", 37 [21] = "EFUSE_WRITE_FIPS_INFO", 38 [22] = "EFUSE_WRITE_UDS_FROM_PLOAD", 39 [23] = "EFUSE_WRITE_DME_KEY_FROM_PLOAD", 40 [24] = "EFUSE_WRITE_DME_REVOKE", 41 [25] = "EFUSE_WRITE_PLM_UPDATE", 42 [26] = "EFUSE_WRITE_BOOT_MODE_DISABLE", 43 [27] = "EFUSE_WRITE_CRC", 44 [28] = "EFUSE_WRITE_DME_MODE", 45 [29] = "EFUSE_WRITE_PUF_HD_FROM_PLOAD", 46 [30] = "EFUSE_WRITE_PUF", 47 [31] = "EFUSE_WRITE_ROM_RSVD", 48 [32] = "EFUSE_WRITE_PUF_CTRL_BITS", 49 [33] = "EFUSE_READ_CACHE", 50 [34] = "EFUSE_RELOAD_N_PRGM_PROT_BITS", 51 [35] = "EFUSE_INVALID", 52 #else 53 [6] = "EFUSE_WRITE", 54 [7] = "EFUSE_WRITE_PUF", 55 [8] = "EFUSE_PUF_USER_FUSE_WRITE", 56 [9] = "EFUSE_READ_IV", 57 [10] = "EFUSE_READ_REVOCATION_ID", 58 [11] = "EFUSE_READ_OFFCHIP_REVOCATION_ID", 59 [12] = "EFUSE_READ_USER_FUSES", 60 [13] = "EFUSE_READ_MISC_CTRL", 61 [14] = "EFUSE_READ_SEC_CTRL", 62 [15] = "EFUSE_READ_SEC_MISC1", 63 [16] = "EFUSE_READ_BOOT_ENV_CTRL", 64 [17] = "EFUSE_READ_PUF_SEC_CTRL", 65 [18] = "EFUSE_READ_PPK_HASH", 66 [19] = "EFUSE_READ_DEC_EFUSE_ONLY", 67 [20] = "EFUSE_READ_DNA", 68 [21] = "EFUSE_READ_PUF_USER_FUSES", 69 [22] = "EFUSE_READ_PUF", 70 [23] = "EFUSE_INVALID", 71 #endif 72 }; 73 74 static const char *const crypto_id[] = { 75 [0] = "FEATURES", 76 [1] = "RSA_SIGN_VERIFY", 77 [2] = "RSA_PUBLIC_ENCRYPT", 78 [3] = "RSA_PRIVATE_DECRYPT", 79 [4] = "SHA3_UPDATE", 80 [5] = "ELLIPTIC_GENERATE_PUBLIC_KEY", 81 [6] = "ELLIPTIC_GENERATE_SIGN", 82 [7] = "ELLIPTIC_VALIDATE_PUBLIC_KEY", 83 [8] = "ELLIPTIC_VERIFY_SIGN", 84 [9] = "AES_INIT", 85 [10] = "AES_OP_INIT", 86 [11] = "AES_UPDATE_AAD", 87 [12] = "AES_ENCRYPT_UPDATE", 88 [13] = "AES_ENCRYPT_FINAL", 89 [14] = "AES_DECRYPT_UPDATE", 90 [15] = "AES_DECRYPT_FINAL", 91 [16] = "AES_KEY_ZERO", 92 [17] = "AES_WRITE_KEY", 93 [18] = "AES_LOCK_USER_KEY", 94 [19] = "AES_KEK_DECRYPT", 95 [20] = "AES_SET_DPA_CM", 96 [21] = "KAT", 97 [22] = "TRNG_GENERATE", 98 [23] = "AES_PERFORM_OPERATION", 99 [24] = "MAX", 100 }; 101 102 static const char *const puf_id[] = { 103 [0] = "PUF_API_FEATURES", 104 [1] = "PUF_REGISTRATION", 105 [2] = "PUF_REGENERATION", 106 [3] = "PUF_CLEAR_PUF_ID", 107 }; 108 109 static const char *const module[] = { 110 [5] = "CRYPTO", 111 [7] = "FPGA", 112 [11] = "NVM", 113 [12] = "PUF", 114 [13] = "OCP", 115 }; 116 117 static const char *const fpga_id[] = { 118 [1] = "LOAD", 119 }; 120 121 static const char *const ocp_id[] = { 122 [0] = "API_FEATURES", 123 [1] = "EXTEND_HWPCR", 124 [2] = "GET_HWPCR", 125 [3] = "GET_HWPCRLOG", 126 [4] = "GENDMERESP", 127 [5] = "DEVAKINPUT", 128 [6] = "GETCERTUSERCFG", 129 [7] = "GETX509CERT", 130 [8] = "ATTESTWITHDEVAK", 131 [9] = "SET_SWPCRCONFIG", 132 [10] = "EXTEND_SWPCR", 133 [11] = "GET_SWPCR", 134 [12] = "GET_SWPCRLOG", 135 [13] = "GET_SWPCRDATA", 136 [14] = "GEN_SHARED_SECRET", 137 [15] = "ATTEST_WITH_KEYWRAP_DEVAK", 138 [16] = "API_MAX", 139 }; 140 141 static void versal_pmc_call_trace(uint32_t call) 142 { 143 uint32_t mid = call >> 8 & 0xff; 144 uint32_t api = call & 0xff; 145 const char *val = NULL; 146 147 switch (mid) { 148 case 5: 149 if (api < ARRAY_SIZE(crypto_id)) 150 val = crypto_id[api]; 151 152 break; 153 case 7: 154 if (api < ARRAY_SIZE(fpga_id)) 155 val = fpga_id[api]; 156 157 break; 158 case 11: 159 if (api < ARRAY_SIZE(nvm_id)) 160 val = nvm_id[api]; 161 162 break; 163 case 12: 164 if (api < ARRAY_SIZE(puf_id)) 165 val = puf_id[api]; 166 167 break; 168 case 13: 169 if (api < ARRAY_SIZE(ocp_id)) 170 val = ocp_id[api]; 171 172 break; 173 default: 174 break; 175 } 176 177 IMSG("--- pmc: service: %s\t call: %s", module[mid], 178 val ? val : "Invalid"); 179 }; 180 #else 181 static void versal_pmc_call_trace(uint32_t call __unused) 182 {} 183 #endif 184 185 static struct versal_ipi ipi_pmc; 186 187 TEE_Result versal_pmc_notify(struct versal_ipi_cmd *cmd, 188 struct versal_ipi_cmd *rsp, uint32_t *err) 189 { 190 TEE_Result ret = TEE_SUCCESS; 191 192 if (IS_ENABLED(CFG_VERSAL_TRACE_PMC)) 193 versal_pmc_call_trace(cmd->data[0]); 194 195 ret = versal_mbox_notify(&ipi_pmc, cmd, rsp, err); 196 if (ret && err) { 197 /* 198 * Check the remote code (FSBL repository) in xplmi_status.h 199 * and the relevant service error (ie, xsecure_error.h) for 200 * detailed information. 201 */ 202 DMSG("PLM: plm status = 0x%" PRIx32 ", lib_status = 0x%" PRIx32, 203 (*err & 0xFFFF0000) >> 16, 204 (*err & 0x0000FFFF)); 205 206 ret = TEE_ERROR_GENERIC; 207 } 208 209 return ret; 210 } 211 212 static TEE_Result versal_pmc_init(void) 213 { 214 uint32_t lcl = 0; 215 216 switch (CFG_VERSAL_PMC_IPI_ID) { 217 case 0: 218 lcl = VERSAL_IPI_ID_0; 219 break; 220 case 1: 221 lcl = VERSAL_IPI_ID_1; 222 break; 223 case 2: 224 lcl = VERSAL_IPI_ID_2; 225 break; 226 case 3: 227 lcl = VERSAL_IPI_ID_3; 228 break; 229 case 4: 230 lcl = VERSAL_IPI_ID_4; 231 break; 232 case 5: 233 lcl = VERSAL_IPI_ID_5; 234 break; 235 default: 236 EMSG("Invalid IPI requested"); 237 return TEE_ERROR_GENERIC; 238 } 239 240 return versal_mbox_open(lcl, VERSAL_IPI_ID_PMC, &ipi_pmc); 241 } 242 early_init(versal_pmc_init); 243