xref: /optee_os/lib/libutee/include/remoteproc_pta.h (revision 3ebb03495a1867462824f59ab4981125075f1351)
1dab8b5c5SArnaud Pouliquen /* SPDX-License-Identifier: BSD-2-Clause */
2dab8b5c5SArnaud Pouliquen /*
3dab8b5c5SArnaud Pouliquen  * Copyright (C) 2023, STMicroelectronics
4dab8b5c5SArnaud Pouliquen  */
5dab8b5c5SArnaud Pouliquen 
6dab8b5c5SArnaud Pouliquen #ifndef __REMOTEPROC_PTA_H
7dab8b5c5SArnaud Pouliquen #define __REMOTEPROC_PTA_H
8dab8b5c5SArnaud Pouliquen 
9dab8b5c5SArnaud Pouliquen #include <stdint.h>
10dab8b5c5SArnaud Pouliquen #include <util.h>
11dab8b5c5SArnaud Pouliquen 
12dab8b5c5SArnaud Pouliquen /*
13dab8b5c5SArnaud Pouliquen  * Interface to the pseudo TA which provides platform implementation
14dab8b5c5SArnaud Pouliquen  * of the remote processor management
15dab8b5c5SArnaud Pouliquen  */
16dab8b5c5SArnaud Pouliquen 
17dab8b5c5SArnaud Pouliquen #define PTA_RPROC_UUID { 0x54af4a68, 0x19be, 0x40d7, \
18dab8b5c5SArnaud Pouliquen 		{ 0xbb, 0xe6, 0x89, 0x50, 0x35, 0x0a, 0x87, 0x44 } }
19dab8b5c5SArnaud Pouliquen 
20dab8b5c5SArnaud Pouliquen /* Hardware capability: firmware format */
21dab8b5c5SArnaud Pouliquen #define PTA_RPROC_HWCAP_FMT_ELF	BIT32(0)
22dab8b5c5SArnaud Pouliquen 
23dab8b5c5SArnaud Pouliquen /* Hardware capability: image protection method */
24dab8b5c5SArnaud Pouliquen /* The platform supports load of segment with hash protection */
25dab8b5c5SArnaud Pouliquen #define PTA_RPROC_HWCAP_PROT_HASH_TABLE	BIT32(0)
26dab8b5c5SArnaud Pouliquen 
27dab8b5c5SArnaud Pouliquen /**
28dab8b5c5SArnaud Pouliquen  * struct rproc_pta_key_info - public key information
29dab8b5c5SArnaud Pouliquen  * @algo:	Algorithm, defined by public key algorithms TEE_ALG_*
30dab8b5c5SArnaud Pouliquen  * @info_size:	Byte size of @info
31dab8b5c5SArnaud Pouliquen  * @info:	Append key information data
32dab8b5c5SArnaud Pouliquen  */
33dab8b5c5SArnaud Pouliquen struct rproc_pta_key_info {
34dab8b5c5SArnaud Pouliquen 	uint32_t algo;
35dab8b5c5SArnaud Pouliquen 	uint32_t info_size;
36dab8b5c5SArnaud Pouliquen 	uint8_t info[];
37dab8b5c5SArnaud Pouliquen };
38dab8b5c5SArnaud Pouliquen 
rproc_pta_keyinfo_size(struct rproc_pta_key_info * keyinf)39dab8b5c5SArnaud Pouliquen static inline size_t rproc_pta_keyinfo_size(struct rproc_pta_key_info *keyinf)
40dab8b5c5SArnaud Pouliquen {
41dab8b5c5SArnaud Pouliquen 	size_t s = 0;
42dab8b5c5SArnaud Pouliquen 
43dab8b5c5SArnaud Pouliquen 	if (!keyinf || ADD_OVERFLOW(sizeof(*keyinf), keyinf->info_size, &s))
44dab8b5c5SArnaud Pouliquen 		return 0;
45dab8b5c5SArnaud Pouliquen 
46dab8b5c5SArnaud Pouliquen 	return s;
47dab8b5c5SArnaud Pouliquen }
48dab8b5c5SArnaud Pouliquen 
49dab8b5c5SArnaud Pouliquen /*
50dab8b5c5SArnaud Pouliquen  * Platform capabilities.
51dab8b5c5SArnaud Pouliquen  *
52dab8b5c5SArnaud Pouliquen  * Get Platform firmware loader service capabilities.
53dab8b5c5SArnaud Pouliquen  *
54dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
55dab8b5c5SArnaud Pouliquen  * [out] params[1].value.a:	Firmware format (PTA_RPROC_HWCAP_FMT_*)
56dab8b5c5SArnaud Pouliquen  * [out] params[2].value.a:	Image protection method (PTA_RPROC_HWCAP_PROT_*)
57dab8b5c5SArnaud Pouliquen  */
58dab8b5c5SArnaud Pouliquen #define PTA_RPROC_HW_CAPABILITIES	1
59dab8b5c5SArnaud Pouliquen 
60dab8b5c5SArnaud Pouliquen /*
61dab8b5c5SArnaud Pouliquen  * Firmware loading.
62dab8b5c5SArnaud Pouliquen  *
63dab8b5c5SArnaud Pouliquen  * Optional service to implement only in case of proprietary format.
64dab8b5c5SArnaud Pouliquen  *
65dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
66dab8b5c5SArnaud Pouliquen  * [in]  params[1].memref:	Loadable firmware image
67dab8b5c5SArnaud Pouliquen  */
68dab8b5c5SArnaud Pouliquen #define PTA_RPROC_FIRMWARE_LOAD		2
69dab8b5c5SArnaud Pouliquen 
70dab8b5c5SArnaud Pouliquen /*
71dab8b5c5SArnaud Pouliquen  * Load a segment with a SHA256 hash.
72dab8b5c5SArnaud Pouliquen  *
73dab8b5c5SArnaud Pouliquen  * This command is used when the platform secure memory is too constrained to
74dab8b5c5SArnaud Pouliquen  * save the whole firmware image. Upon segment load, a successful completion
75dab8b5c5SArnaud Pouliquen  * ensures the loaded image complies with the provided hash.
76dab8b5c5SArnaud Pouliquen  *
77dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
78dab8b5c5SArnaud Pouliquen  * [in]  params[1].memref:	Section data to load
79dab8b5c5SArnaud Pouliquen  * [in]  params[2].value.a:	32bit LSB load device segment address
80dab8b5c5SArnaud Pouliquen  * [in]  params[2].value.b:	32bit MSB load device segment address
81dab8b5c5SArnaud Pouliquen  * [in]  params[3].memref:	Expected hash (SHA256) of the payload
82dab8b5c5SArnaud Pouliquen  */
83dab8b5c5SArnaud Pouliquen #define PTA_RPROC_LOAD_SEGMENT_SHA256	3
84dab8b5c5SArnaud Pouliquen 
85dab8b5c5SArnaud Pouliquen /*
86dab8b5c5SArnaud Pouliquen  * Memory set.
87dab8b5c5SArnaud Pouliquen  *
88dab8b5c5SArnaud Pouliquen  * Fill a remote device memory with requested value. this is used for instance
89dab8b5c5SArnaud Pouliquen  * to clear a memory on the remote firmware load.
90dab8b5c5SArnaud Pouliquen  *
91dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
92dab8b5c5SArnaud Pouliquen  * [in]  params[1].value.a:	32bit LSB device memory address
93dab8b5c5SArnaud Pouliquen  * [in]  params[1].value.b:	32bit MSB device memory address
94dab8b5c5SArnaud Pouliquen  * [in]  params[2].value.a:	32bit LSB device memory size
95dab8b5c5SArnaud Pouliquen  * [in]  params[2].value.b:	32bit MSB device memory size
96dab8b5c5SArnaud Pouliquen  * [in]  params[3].value.a:	Byte value to be set
97dab8b5c5SArnaud Pouliquen  */
98dab8b5c5SArnaud Pouliquen #define PTA_RPROC_SET_MEMORY		4
99dab8b5c5SArnaud Pouliquen 
100dab8b5c5SArnaud Pouliquen /*
101dab8b5c5SArnaud Pouliquen  * Firmware start.
102dab8b5c5SArnaud Pouliquen  *
103dab8b5c5SArnaud Pouliquen  * Start up a successfully loaded remote processor firmware.
104dab8b5c5SArnaud Pouliquen  *
105dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
106dab8b5c5SArnaud Pouliquen  */
107dab8b5c5SArnaud Pouliquen #define PTA_RPROC_FIRMWARE_START	5
108dab8b5c5SArnaud Pouliquen 
109dab8b5c5SArnaud Pouliquen /*
110dab8b5c5SArnaud Pouliquen  * Firmware stop.
111dab8b5c5SArnaud Pouliquen  *
112dab8b5c5SArnaud Pouliquen  * Stop of the remote processor firmware and release/clean resources.
113dab8b5c5SArnaud Pouliquen  * After the command successful completion, remote processor firmware must be
114dab8b5c5SArnaud Pouliquen  * reloaded prior being started again.
115dab8b5c5SArnaud Pouliquen  *
116dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
117dab8b5c5SArnaud Pouliquen  */
118dab8b5c5SArnaud Pouliquen #define PTA_RPROC_FIRMWARE_STOP		6
119dab8b5c5SArnaud Pouliquen 
120dab8b5c5SArnaud Pouliquen /*
121dab8b5c5SArnaud Pouliquen  * Firmware device to physical address conversion.
122dab8b5c5SArnaud Pouliquen  *
123dab8b5c5SArnaud Pouliquen  * Convert the physical address corresponding to an address got from the
124dab8b5c5SArnaud Pouliquen  * firmware address layout.
125dab8b5c5SArnaud Pouliquen  *
126dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
127dab8b5c5SArnaud Pouliquen  * [in]  params[1].value.a:	32bit LSB Device memory address
128dab8b5c5SArnaud Pouliquen  * [in]  params[1].value.b:	32bit MSB Device memory address
129dab8b5c5SArnaud Pouliquen  * [in]  params[2].value.a:	32bit LSB Device memory size
130dab8b5c5SArnaud Pouliquen  * [in]  params[2].value.b:	32bit MSB Device memory size
131dab8b5c5SArnaud Pouliquen  * [out] params[3].value.a:	32bit LSB converted physical address
132dab8b5c5SArnaud Pouliquen  * [out] params[3].value.b:	32bit MSB converted physical address
133dab8b5c5SArnaud Pouliquen  */
134dab8b5c5SArnaud Pouliquen #define PTA_RPROC_FIRMWARE_DA_TO_PA	7
135dab8b5c5SArnaud Pouliquen 
136dab8b5c5SArnaud Pouliquen /*
137dab8b5c5SArnaud Pouliquen  * Verify the firmware digest against a signature
138dab8b5c5SArnaud Pouliquen  *
139dab8b5c5SArnaud Pouliquen  * Return TEE_SUCCESS if the signature is verified,
140dab8b5c5SArnaud Pouliquen  *        TEE_ERROR_SIGNATURE_INVALID when signature is not valid,
141dab8b5c5SArnaud Pouliquen  *        another error code for other error cases.
142dab8b5c5SArnaud Pouliquen  *
143dab8b5c5SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
144dab8b5c5SArnaud Pouliquen  * [in]  params[1].memref:	Key information (refer to @rproc_pta_key_info)
145dab8b5c5SArnaud Pouliquen  * [in]  params[2].memref:	Digest of the firmware authenticated data
146dab8b5c5SArnaud Pouliquen  * [in]  params[3].memref:	Signature of the firmware authenticated data
147dab8b5c5SArnaud Pouliquen  */
148dab8b5c5SArnaud Pouliquen #define PTA_RPROC_VERIFY_DIGEST		8
149dab8b5c5SArnaud Pouliquen 
150*3ebb0349SArnaud Pouliquen /*
151*3ebb0349SArnaud Pouliquen  * Remote processor resources release.
152*3ebb0349SArnaud Pouliquen  *
153*3ebb0349SArnaud Pouliquen  * Release the resources associated to the remote processor.
154*3ebb0349SArnaud Pouliquen  *
155*3ebb0349SArnaud Pouliquen  * [in]  params[0].value.a:	Unique 32bit remote processor identifier
156*3ebb0349SArnaud Pouliquen  */
157*3ebb0349SArnaud Pouliquen #define PTA_REMOTEPROC_RELEASE		9
158*3ebb0349SArnaud Pouliquen 
159dab8b5c5SArnaud Pouliquen #endif /* __REMOTEPROC_PTA_H */
160