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