xref: /optee_os/core/drivers/versal_pmc.c (revision 03d6625f3e28dac6361138575ab7090c2c6853d4)
1387006b0SJoachim Foerster // SPDX-License-Identifier: BSD-2-Clause
2387006b0SJoachim Foerster /*
3387006b0SJoachim Foerster  * Copyright (C) 2022 Foundries.io Ltd
4387006b0SJoachim Foerster  * Jorge Ramirez-Ortiz <jorge@foundries.io>
5387006b0SJoachim Foerster  *
6387006b0SJoachim Foerster  * Copyright (C) 2023 ProvenRun S.A.S
7387006b0SJoachim Foerster  */
8387006b0SJoachim Foerster 
9387006b0SJoachim Foerster #include <config.h>
10387006b0SJoachim Foerster #include <drivers/versal_pmc.h>
11387006b0SJoachim Foerster #include <initcall.h>
12387006b0SJoachim Foerster 
13387006b0SJoachim Foerster #ifdef CFG_VERSAL_TRACE_PMC
14387006b0SJoachim Foerster static const char *const nvm_id[] = {
15387006b0SJoachim Foerster 	[0] = "API_FEATURES",
16387006b0SJoachim Foerster 	[1] = "BBRAM_WRITE_AES_KEY",
17387006b0SJoachim Foerster 	[2] = "BBRAM_ZEROIZE",
18387006b0SJoachim Foerster 	[3] = "BBRAM_WRITE_USER_DATA",
19387006b0SJoachim Foerster 	[4] = "BBRAM_READ_USER_DATA",
20387006b0SJoachim Foerster 	[5] = "BBRAM_LOCK_WRITE_USER_DATA",
21748d43beSJoachim Foerster #if defined(PLATFORM_FLAVOR_net)
22748d43beSJoachim Foerster 	[6] = "BBRAM_WRITE_AES_KEY_FROM_PLOAD",
23748d43beSJoachim Foerster 	[7] = "EFUSE_WRITE_AES_KEY",
24748d43beSJoachim Foerster 	[8] = "EFUSE_WRITE_AES_KEY_FROM_PLOAD",
25748d43beSJoachim Foerster 	[9] = "EFUSE_WRITE_PPK_HASH",
26748d43beSJoachim Foerster 	[10] = "EFUSE_WRITE_PPK_HASH_FROM_PLOAD",
27748d43beSJoachim Foerster 	[11] = "EFUSE_WRITE_IV",
28748d43beSJoachim Foerster 	[12] = "EFUSE_WRITE_IV_FROM_PLOAD",
29748d43beSJoachim Foerster 	[13] = "EFUSE_WRITE_GLITCH_CONFIG",
30748d43beSJoachim Foerster 	[14] = "EFUSE_WRITE_DEC_ONLY",
31748d43beSJoachim Foerster 	[15] = "EFUSE_WRITE_REVOCATION_ID",
32748d43beSJoachim Foerster 	[16] = "EFUSE_WRITE_OFFCHIP_REVOKE_ID",
33748d43beSJoachim Foerster 	[17] = "EFUSE_WRITE_MISC_CTRL_BITS",
34748d43beSJoachim Foerster 	[18] = "EFUSE_WRITE_SEC_CTRL_BITS",
35748d43beSJoachim Foerster 	[19] = "EFUSE_WRITE_MISC1_CTRL_BITS",
36748d43beSJoachim Foerster 	[20] = "EFUSE_WRITE_BOOT_ENV_CTRL_BITS",
37748d43beSJoachim Foerster 	[21] = "EFUSE_WRITE_FIPS_INFO",
38748d43beSJoachim Foerster 	[22] = "EFUSE_WRITE_UDS_FROM_PLOAD",
39748d43beSJoachim Foerster 	[23] = "EFUSE_WRITE_DME_KEY_FROM_PLOAD",
40748d43beSJoachim Foerster 	[24] = "EFUSE_WRITE_DME_REVOKE",
41748d43beSJoachim Foerster 	[25] = "EFUSE_WRITE_PLM_UPDATE",
42748d43beSJoachim Foerster 	[26] = "EFUSE_WRITE_BOOT_MODE_DISABLE",
43748d43beSJoachim Foerster 	[27] = "EFUSE_WRITE_CRC",
44748d43beSJoachim Foerster 	[28] = "EFUSE_WRITE_DME_MODE",
45748d43beSJoachim Foerster 	[29] = "EFUSE_WRITE_PUF_HD_FROM_PLOAD",
46748d43beSJoachim Foerster 	[30] = "EFUSE_WRITE_PUF",
47748d43beSJoachim Foerster 	[31] = "EFUSE_WRITE_ROM_RSVD",
48748d43beSJoachim Foerster 	[32] = "EFUSE_WRITE_PUF_CTRL_BITS",
49748d43beSJoachim Foerster 	[33] = "EFUSE_READ_CACHE",
50748d43beSJoachim Foerster 	[34] = "EFUSE_RELOAD_N_PRGM_PROT_BITS",
51748d43beSJoachim Foerster 	[35] = "EFUSE_INVALID",
52748d43beSJoachim Foerster #else
53387006b0SJoachim Foerster 	[6] = "EFUSE_WRITE",
54387006b0SJoachim Foerster 	[7] = "EFUSE_WRITE_PUF",
55387006b0SJoachim Foerster 	[8] = "EFUSE_PUF_USER_FUSE_WRITE",
56387006b0SJoachim Foerster 	[9] = "EFUSE_READ_IV",
57387006b0SJoachim Foerster 	[10] = "EFUSE_READ_REVOCATION_ID",
58387006b0SJoachim Foerster 	[11] = "EFUSE_READ_OFFCHIP_REVOCATION_ID",
59387006b0SJoachim Foerster 	[12] = "EFUSE_READ_USER_FUSES",
60387006b0SJoachim Foerster 	[13] = "EFUSE_READ_MISC_CTRL",
61387006b0SJoachim Foerster 	[14] = "EFUSE_READ_SEC_CTRL",
62387006b0SJoachim Foerster 	[15] = "EFUSE_READ_SEC_MISC1",
63387006b0SJoachim Foerster 	[16] = "EFUSE_READ_BOOT_ENV_CTRL",
64387006b0SJoachim Foerster 	[17] = "EFUSE_READ_PUF_SEC_CTRL",
65387006b0SJoachim Foerster 	[18] = "EFUSE_READ_PPK_HASH",
66387006b0SJoachim Foerster 	[19] = "EFUSE_READ_DEC_EFUSE_ONLY",
67387006b0SJoachim Foerster 	[20] = "EFUSE_READ_DNA",
68387006b0SJoachim Foerster 	[21] = "EFUSE_READ_PUF_USER_FUSES",
69387006b0SJoachim Foerster 	[22] = "EFUSE_READ_PUF",
70387006b0SJoachim Foerster 	[23] = "EFUSE_INVALID",
71748d43beSJoachim Foerster #endif
72387006b0SJoachim Foerster };
73387006b0SJoachim Foerster 
74387006b0SJoachim Foerster static const char *const crypto_id[] = {
75387006b0SJoachim Foerster 	[0] = "FEATURES",
76387006b0SJoachim Foerster 	[1] = "RSA_SIGN_VERIFY",
77387006b0SJoachim Foerster 	[2] = "RSA_PUBLIC_ENCRYPT",
78387006b0SJoachim Foerster 	[3] = "RSA_PRIVATE_DECRYPT",
79387006b0SJoachim Foerster 	[4] = "SHA3_UPDATE",
80387006b0SJoachim Foerster 	[5] = "ELLIPTIC_GENERATE_PUBLIC_KEY",
81387006b0SJoachim Foerster 	[6] = "ELLIPTIC_GENERATE_SIGN",
82387006b0SJoachim Foerster 	[7] = "ELLIPTIC_VALIDATE_PUBLIC_KEY",
83387006b0SJoachim Foerster 	[8] = "ELLIPTIC_VERIFY_SIGN",
84387006b0SJoachim Foerster 	[9] = "AES_INIT",
85387006b0SJoachim Foerster 	[10] = "AES_OP_INIT",
86387006b0SJoachim Foerster 	[11] = "AES_UPDATE_AAD",
87387006b0SJoachim Foerster 	[12] = "AES_ENCRYPT_UPDATE",
88387006b0SJoachim Foerster 	[13] = "AES_ENCRYPT_FINAL",
89387006b0SJoachim Foerster 	[14] = "AES_DECRYPT_UPDATE",
90387006b0SJoachim Foerster 	[15] = "AES_DECRYPT_FINAL",
91387006b0SJoachim Foerster 	[16] = "AES_KEY_ZERO",
92387006b0SJoachim Foerster 	[17] = "AES_WRITE_KEY",
93387006b0SJoachim Foerster 	[18] = "AES_LOCK_USER_KEY",
94387006b0SJoachim Foerster 	[19] = "AES_KEK_DECRYPT",
95387006b0SJoachim Foerster 	[20] = "AES_SET_DPA_CM",
96387006b0SJoachim Foerster 	[21] = "KAT",
97387006b0SJoachim Foerster 	[22] = "TRNG_GENERATE",
98387006b0SJoachim Foerster 	[23] = "AES_PERFORM_OPERATION",
99387006b0SJoachim Foerster 	[24] = "MAX",
100387006b0SJoachim Foerster };
101387006b0SJoachim Foerster 
102387006b0SJoachim Foerster static const char *const puf_id[] = {
103387006b0SJoachim Foerster 	[0] = "PUF_API_FEATURES",
104387006b0SJoachim Foerster 	[1] = "PUF_REGISTRATION",
105387006b0SJoachim Foerster 	[2] = "PUF_REGENERATION",
106387006b0SJoachim Foerster 	[3] = "PUF_CLEAR_PUF_ID",
107387006b0SJoachim Foerster };
108387006b0SJoachim Foerster 
109387006b0SJoachim Foerster static const char *const module[] = {
110387006b0SJoachim Foerster 	[5] = "CRYPTO",
111387006b0SJoachim Foerster 	[7] = "FPGA",
112387006b0SJoachim Foerster 	[11] = "NVM",
113387006b0SJoachim Foerster 	[12] = "PUF",
114*03d6625fSDennis Ries 	[13] = "OCP",
115387006b0SJoachim Foerster };
116387006b0SJoachim Foerster 
117387006b0SJoachim Foerster static const char *const fpga_id[] = {
118387006b0SJoachim Foerster 	[1] = "LOAD",
119387006b0SJoachim Foerster };
120387006b0SJoachim Foerster 
121*03d6625fSDennis Ries static const char *const ocp_id[] = {
122*03d6625fSDennis Ries 	[0] = "API_FEATURES",
123*03d6625fSDennis Ries 	[1] = "EXTEND_HWPCR",
124*03d6625fSDennis Ries 	[2] = "GET_HWPCR",
125*03d6625fSDennis Ries 	[3] = "GET_HWPCRLOG",
126*03d6625fSDennis Ries 	[4] = "GENDMERESP",
127*03d6625fSDennis Ries 	[5] = "DEVAKINPUT",
128*03d6625fSDennis Ries 	[6] = "GETCERTUSERCFG",
129*03d6625fSDennis Ries 	[7] = "GETX509CERT",
130*03d6625fSDennis Ries 	[8] = "ATTESTWITHDEVAK",
131*03d6625fSDennis Ries 	[9] = "SET_SWPCRCONFIG",
132*03d6625fSDennis Ries 	[10] = "EXTEND_SWPCR",
133*03d6625fSDennis Ries 	[11] = "GET_SWPCR",
134*03d6625fSDennis Ries 	[12] = "GET_SWPCRLOG",
135*03d6625fSDennis Ries 	[13] = "GET_SWPCRDATA",
136*03d6625fSDennis Ries 	[14] = "GEN_SHARED_SECRET",
137*03d6625fSDennis Ries 	[15] = "ATTEST_WITH_KEYWRAP_DEVAK",
138*03d6625fSDennis Ries 	[16] = "API_MAX",
139*03d6625fSDennis Ries };
140*03d6625fSDennis Ries 
versal_pmc_call_trace(uint32_t call)141387006b0SJoachim Foerster static void versal_pmc_call_trace(uint32_t call)
142387006b0SJoachim Foerster {
143387006b0SJoachim Foerster 	uint32_t mid = call >>  8 & 0xff;
144387006b0SJoachim Foerster 	uint32_t api = call & 0xff;
145387006b0SJoachim Foerster 	const char *val = NULL;
146387006b0SJoachim Foerster 
147387006b0SJoachim Foerster 	switch (mid) {
148387006b0SJoachim Foerster 	case 5:
149387006b0SJoachim Foerster 		if (api < ARRAY_SIZE(crypto_id))
150387006b0SJoachim Foerster 			val = crypto_id[api];
151387006b0SJoachim Foerster 
152387006b0SJoachim Foerster 		break;
153387006b0SJoachim Foerster 	case 7:
154387006b0SJoachim Foerster 		if (api < ARRAY_SIZE(fpga_id))
155387006b0SJoachim Foerster 			val = fpga_id[api];
156387006b0SJoachim Foerster 
157387006b0SJoachim Foerster 		break;
158387006b0SJoachim Foerster 	case 11:
159387006b0SJoachim Foerster 		if (api < ARRAY_SIZE(nvm_id))
160387006b0SJoachim Foerster 			val = nvm_id[api];
161387006b0SJoachim Foerster 
162387006b0SJoachim Foerster 		break;
163387006b0SJoachim Foerster 	case 12:
164387006b0SJoachim Foerster 		if (api < ARRAY_SIZE(puf_id))
165387006b0SJoachim Foerster 			val = puf_id[api];
166387006b0SJoachim Foerster 
167387006b0SJoachim Foerster 		break;
168*03d6625fSDennis Ries 	case 13:
169*03d6625fSDennis Ries 		if (api < ARRAY_SIZE(ocp_id))
170*03d6625fSDennis Ries 			val = ocp_id[api];
171*03d6625fSDennis Ries 
172*03d6625fSDennis Ries 		break;
173387006b0SJoachim Foerster 	default:
174387006b0SJoachim Foerster 		break;
175387006b0SJoachim Foerster 	}
176387006b0SJoachim Foerster 
177387006b0SJoachim Foerster 	IMSG("--- pmc: service: %s\t call: %s", module[mid],
178387006b0SJoachim Foerster 	     val ? val : "Invalid");
179387006b0SJoachim Foerster };
180387006b0SJoachim Foerster #else
versal_pmc_call_trace(uint32_t call __unused)181387006b0SJoachim Foerster static void versal_pmc_call_trace(uint32_t call __unused)
182387006b0SJoachim Foerster {}
183387006b0SJoachim Foerster #endif
184387006b0SJoachim Foerster 
185387006b0SJoachim Foerster static struct versal_ipi ipi_pmc;
186387006b0SJoachim Foerster 
versal_pmc_notify(struct versal_ipi_cmd * cmd,struct versal_ipi_cmd * rsp,uint32_t * err)187387006b0SJoachim Foerster TEE_Result versal_pmc_notify(struct versal_ipi_cmd *cmd,
188387006b0SJoachim Foerster 			     struct versal_ipi_cmd *rsp, uint32_t *err)
189387006b0SJoachim Foerster {
190387006b0SJoachim Foerster 	TEE_Result ret = TEE_SUCCESS;
191387006b0SJoachim Foerster 
192387006b0SJoachim Foerster 	if (IS_ENABLED(CFG_VERSAL_TRACE_PMC))
193387006b0SJoachim Foerster 		versal_pmc_call_trace(cmd->data[0]);
194387006b0SJoachim Foerster 
195387006b0SJoachim Foerster 	ret = versal_mbox_notify(&ipi_pmc, cmd, rsp, err);
196387006b0SJoachim Foerster 	if (ret && err) {
197387006b0SJoachim Foerster 		/*
198387006b0SJoachim Foerster 		 * Check the remote code (FSBL repository) in xplmi_status.h
199387006b0SJoachim Foerster 		 * and the relevant service error (ie, xsecure_error.h) for
200387006b0SJoachim Foerster 		 * detailed information.
201387006b0SJoachim Foerster 		 */
202387006b0SJoachim Foerster 		DMSG("PLM: plm status = 0x%" PRIx32 ", lib_status = 0x%" PRIx32,
203387006b0SJoachim Foerster 		     (*err & 0xFFFF0000) >> 16,
204387006b0SJoachim Foerster 		     (*err & 0x0000FFFF));
205387006b0SJoachim Foerster 
206387006b0SJoachim Foerster 		ret = TEE_ERROR_GENERIC;
207387006b0SJoachim Foerster 	}
208387006b0SJoachim Foerster 
209387006b0SJoachim Foerster 	return ret;
210387006b0SJoachim Foerster }
211387006b0SJoachim Foerster 
versal_pmc_init(void)212387006b0SJoachim Foerster static TEE_Result versal_pmc_init(void)
213387006b0SJoachim Foerster {
214387006b0SJoachim Foerster 	uint32_t lcl = 0;
215387006b0SJoachim Foerster 
216387006b0SJoachim Foerster 	switch (CFG_VERSAL_PMC_IPI_ID) {
217387006b0SJoachim Foerster 	case 0:
218387006b0SJoachim Foerster 		lcl = VERSAL_IPI_ID_0;
219387006b0SJoachim Foerster 		break;
220387006b0SJoachim Foerster 	case 1:
221387006b0SJoachim Foerster 		lcl = VERSAL_IPI_ID_1;
222387006b0SJoachim Foerster 		break;
223387006b0SJoachim Foerster 	case 2:
224387006b0SJoachim Foerster 		lcl = VERSAL_IPI_ID_2;
225387006b0SJoachim Foerster 		break;
226387006b0SJoachim Foerster 	case 3:
227387006b0SJoachim Foerster 		lcl = VERSAL_IPI_ID_3;
228387006b0SJoachim Foerster 		break;
229387006b0SJoachim Foerster 	case 4:
230387006b0SJoachim Foerster 		lcl = VERSAL_IPI_ID_4;
231387006b0SJoachim Foerster 		break;
232387006b0SJoachim Foerster 	case 5:
233387006b0SJoachim Foerster 		lcl = VERSAL_IPI_ID_5;
234387006b0SJoachim Foerster 		break;
235387006b0SJoachim Foerster 	default:
236387006b0SJoachim Foerster 		EMSG("Invalid IPI requested");
237387006b0SJoachim Foerster 		return TEE_ERROR_GENERIC;
238387006b0SJoachim Foerster 	}
239387006b0SJoachim Foerster 
240387006b0SJoachim Foerster 	return versal_mbox_open(lcl, VERSAL_IPI_ID_PMC, &ipi_pmc);
241387006b0SJoachim Foerster }
242387006b0SJoachim Foerster early_init(versal_pmc_init);
243