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