Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | /* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com> * * Authors: * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> */ #ifndef __ARM_FFA_H #define __ARM_FFA_H #include <linux/types.h> /* * This header is public. It can be used by clients to access * data structures and definitions they need */ /* * struct ffa_partition_info - Partition information descriptor * @id: Partition ID * @exec_ctxt: Execution context count * @properties: Partition properties * * Data structure containing information about partitions instantiated in the system * This structure is filled with the data queried by FFA_PARTITION_INFO_GET */ struct ffa_partition_info { u16 id; u16 exec_ctxt; /* partition supports receipt of direct requests */ #define FFA_PARTITION_DIRECT_RECV BIT(0) /* partition can send direct requests. */ #define FFA_PARTITION_DIRECT_SEND BIT(1) /* partition can send and receive indirect messages. */ #define FFA_PARTITION_INDIRECT_MSG BIT(2) u32 properties; }; /* * struct ffa_partition_uuid - 16 bytes UUID transmitted by FFA_PARTITION_INFO_GET * @a1-4: 32-bit words access to the UUID data * */ struct ffa_partition_uuid { u32 a1; /* w1 */ u32 a2; /* w2 */ u32 a3; /* w3 */ u32 a4; /* w4 */ }; /** * struct ffa_partition_desc - the secure partition descriptor * @info: partition information * @sp_uuid: the secure partition UUID * * Each partition has its descriptor containing the partitions information and the UUID */ struct ffa_partition_desc { struct ffa_partition_info info; struct ffa_partition_uuid sp_uuid; }; /* * struct ffa_send_direct_data - Data structure hosting the data * used by FFA_MSG_SEND_DIRECT_{REQ,RESP} * @data0-4: Data read/written from/to x3-x7 registers * * Data structure containing the data to be sent by FFA_MSG_SEND_DIRECT_REQ * or read from FFA_MSG_SEND_DIRECT_RESP */ /* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */ struct ffa_send_direct_data { ulong data0; /* w3/x3 */ ulong data1; /* w4/x4 */ ulong data2; /* w5/x5 */ ulong data3; /* w6/x6 */ ulong data4; /* w7/x7 */ }; struct udevice; /** * struct ffa_bus_ops - Operations for FF-A * @partition_info_get: callback for the FFA_PARTITION_INFO_GET * @sync_send_receive: callback for the FFA_MSG_SEND_DIRECT_REQ * @rxtx_unmap: callback for the FFA_RXTX_UNMAP * * The data structure providing all the operations supported by the driver. * This structure is EFI runtime resident. */ struct ffa_bus_ops { int (*partition_info_get)(struct udevice *dev, const char *uuid_str, u32 *sp_count, struct ffa_partition_desc **sp_descs); int (*sync_send_receive)(struct udevice *dev, u16 dst_part_id, struct ffa_send_direct_data *msg, bool is_smc64); int (*rxtx_unmap)(struct udevice *dev); }; #define ffa_get_ops(dev) ((struct ffa_bus_ops *)(dev)->driver->ops) /** * ffa_rxtx_unmap() - FFA_RXTX_UNMAP driver operation * Please see ffa_unmap_rxtx_buffers_hdlr() description for more details. */ int ffa_rxtx_unmap(struct udevice *dev); /** * ffa_unmap_rxtx_buffers_hdlr() - FFA_RXTX_UNMAP handler function * @dev: The arm_ffa bus device * * This function implements FFA_RXTX_UNMAP FF-A function * to unmap the RX/TX buffers * * Return: * * 0 on success. Otherwise, failure */ int ffa_unmap_rxtx_buffers_hdlr(struct udevice *dev); /** * ffa_sync_send_receive() - FFA_MSG_SEND_DIRECT_{REQ,RESP} driver operation * Please see ffa_msg_send_direct_req_hdlr() description for more details. */ int ffa_sync_send_receive(struct udevice *dev, u16 dst_part_id, struct ffa_send_direct_data *msg, bool is_smc64); /** * ffa_msg_send_direct_req_hdlr() - FFA_MSG_SEND_DIRECT_{REQ,RESP} handler function * @dev: The arm_ffa bus device * @dst_part_id: destination partition ID * @msg: pointer to the message data preallocated by the client (in/out) * @is_smc64: select 64-bit or 32-bit FF-A ABI * * This function implements FFA_MSG_SEND_DIRECT_{REQ,RESP} * FF-A functions. * * FFA_MSG_SEND_DIRECT_REQ is used to send the data to the secure partition. * The response from the secure partition is handled by reading the * FFA_MSG_SEND_DIRECT_RESP arguments. * * The maximum size of the data that can be exchanged is 40 bytes which is * sizeof(struct ffa_send_direct_data) as defined by the FF-A specification 1.0 * in the section relevant to FFA_MSG_SEND_DIRECT_{REQ,RESP} * * Return: * * 0 on success. Otherwise, failure */ int ffa_msg_send_direct_req_hdlr(struct udevice *dev, u16 dst_part_id, struct ffa_send_direct_data *msg, bool is_smc64); /** * ffa_partition_info_get() - FFA_PARTITION_INFO_GET driver operation * Please see ffa_get_partitions_info_hdlr() description for more details. */ int ffa_partition_info_get(struct udevice *dev, const char *uuid_str, u32 *sp_count, struct ffa_partition_desc **sp_descs); /** * ffa_get_partitions_info_hdlr() - FFA_PARTITION_INFO_GET handler function * @uuid_str: pointer to the UUID string * @sp_count: address of the variable containing the number of partitions matching the UUID * The variable is set by the driver * @sp_descs: address of the descriptors of the partitions matching the UUID * The address is set by the driver * * Return the number of partitions and their descriptors matching the UUID * * Query the secure partition data from uc_priv. * If not found, invoke FFA_PARTITION_INFO_GET * FF-A function to query the partition information from secure world. * * A client of the FF-A driver should know the UUID of the service it wants to * access. It should use the UUID to request the FF-A driver to provide the * partition(s) information of the service. The FF-A driver uses * PARTITION_INFO_GET to obtain this information. This is implemented through * ffa_get_partitions_info_hdlr() function. * A new FFA_PARTITION_INFO_GET call is issued (first one performed through * ffa_cache_partitions_info) allowing to retrieve the partition(s) information. * They are not saved (already done). We only update the UUID in the cached area. * This assumes that partitions data does not change in the secure world. * Otherwise u-boot will have an outdated partition data. The benefit of caching * the information in the FF-A driver is to accommodate discovery after * ExitBootServices(). * * Return: * * @sp_count: the number of partitions * @sp_descs: address of the partitions descriptors * * On success 0 is returned. Otherwise, failure */ int ffa_get_partitions_info_hdlr(struct udevice *dev, const char *uuid_str, u32 *sp_count, struct ffa_partition_desc **sp_descs); struct ffa_priv; /** * ffa_set_smc_conduit() - Set the SMC conduit * @dev: The FF-A bus device * * Selects the SMC conduit by setting the FF-A ABI invoke function. * * Return: * * 0 on success. Otherwise, failure */ int ffa_set_smc_conduit(struct udevice *dev); #endif |