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