| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * Copyright (C) 2021 ARM Ltd. |
| 4 | */ |
| 5 | |
| 6 | #ifndef _LINUX_ARM_FFA_H |
| 7 | #define _LINUX_ARM_FFA_H |
| 8 | |
| 9 | #include <linux/bitfield.h> |
| 10 | #include <linux/device.h> |
| 11 | #include <linux/module.h> |
| 12 | #include <linux/types.h> |
| 13 | #include <linux/uuid.h> |
| 14 | |
| 15 | #define FFA_SMC(calling_convention, func_num) \ |
| 16 | ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, (calling_convention), \ |
| 17 | ARM_SMCCC_OWNER_STANDARD, (func_num)) |
| 18 | |
| 19 | #define FFA_SMC_32(func_num) FFA_SMC(ARM_SMCCC_SMC_32, (func_num)) |
| 20 | #define FFA_SMC_64(func_num) FFA_SMC(ARM_SMCCC_SMC_64, (func_num)) |
| 21 | |
| 22 | #define FFA_ERROR FFA_SMC_32(0x60) |
| 23 | #define FFA_SUCCESS FFA_SMC_32(0x61) |
| 24 | #define FFA_FN64_SUCCESS FFA_SMC_64(0x61) |
| 25 | #define FFA_INTERRUPT FFA_SMC_32(0x62) |
| 26 | #define FFA_VERSION FFA_SMC_32(0x63) |
| 27 | #define FFA_FEATURES FFA_SMC_32(0x64) |
| 28 | #define FFA_RX_RELEASE FFA_SMC_32(0x65) |
| 29 | #define FFA_RXTX_MAP FFA_SMC_32(0x66) |
| 30 | #define FFA_FN64_RXTX_MAP FFA_SMC_64(0x66) |
| 31 | #define FFA_RXTX_UNMAP FFA_SMC_32(0x67) |
| 32 | #define FFA_PARTITION_INFO_GET FFA_SMC_32(0x68) |
| 33 | #define FFA_ID_GET FFA_SMC_32(0x69) |
| 34 | #define FFA_MSG_POLL FFA_SMC_32(0x6A) |
| 35 | #define FFA_MSG_WAIT FFA_SMC_32(0x6B) |
| 36 | #define FFA_YIELD FFA_SMC_32(0x6C) |
| 37 | #define FFA_RUN FFA_SMC_32(0x6D) |
| 38 | #define FFA_MSG_SEND FFA_SMC_32(0x6E) |
| 39 | #define FFA_MSG_SEND_DIRECT_REQ FFA_SMC_32(0x6F) |
| 40 | #define FFA_FN64_MSG_SEND_DIRECT_REQ FFA_SMC_64(0x6F) |
| 41 | #define FFA_MSG_SEND_DIRECT_RESP FFA_SMC_32(0x70) |
| 42 | #define FFA_FN64_MSG_SEND_DIRECT_RESP FFA_SMC_64(0x70) |
| 43 | #define FFA_MEM_DONATE FFA_SMC_32(0x71) |
| 44 | #define FFA_FN64_MEM_DONATE FFA_SMC_64(0x71) |
| 45 | #define FFA_MEM_LEND FFA_SMC_32(0x72) |
| 46 | #define FFA_FN64_MEM_LEND FFA_SMC_64(0x72) |
| 47 | #define FFA_MEM_SHARE FFA_SMC_32(0x73) |
| 48 | #define FFA_FN64_MEM_SHARE FFA_SMC_64(0x73) |
| 49 | #define FFA_MEM_RETRIEVE_REQ FFA_SMC_32(0x74) |
| 50 | #define FFA_FN64_MEM_RETRIEVE_REQ FFA_SMC_64(0x74) |
| 51 | #define FFA_MEM_RETRIEVE_RESP FFA_SMC_32(0x75) |
| 52 | #define FFA_MEM_RELINQUISH FFA_SMC_32(0x76) |
| 53 | #define FFA_MEM_RECLAIM FFA_SMC_32(0x77) |
| 54 | #define FFA_MEM_OP_PAUSE FFA_SMC_32(0x78) |
| 55 | #define FFA_MEM_OP_RESUME FFA_SMC_32(0x79) |
| 56 | #define FFA_MEM_FRAG_RX FFA_SMC_32(0x7A) |
| 57 | #define FFA_MEM_FRAG_TX FFA_SMC_32(0x7B) |
| 58 | #define FFA_NORMAL_WORLD_RESUME FFA_SMC_32(0x7C) |
| 59 | #define FFA_NOTIFICATION_BITMAP_CREATE FFA_SMC_32(0x7D) |
| 60 | #define FFA_NOTIFICATION_BITMAP_DESTROY FFA_SMC_32(0x7E) |
| 61 | #define FFA_NOTIFICATION_BIND FFA_SMC_32(0x7F) |
| 62 | #define FFA_NOTIFICATION_UNBIND FFA_SMC_32(0x80) |
| 63 | #define FFA_NOTIFICATION_SET FFA_SMC_32(0x81) |
| 64 | #define FFA_NOTIFICATION_GET FFA_SMC_32(0x82) |
| 65 | #define FFA_NOTIFICATION_INFO_GET FFA_SMC_32(0x83) |
| 66 | #define FFA_FN64_NOTIFICATION_INFO_GET FFA_SMC_64(0x83) |
| 67 | #define FFA_RX_ACQUIRE FFA_SMC_32(0x84) |
| 68 | #define FFA_SPM_ID_GET FFA_SMC_32(0x85) |
| 69 | #define FFA_MSG_SEND2 FFA_SMC_32(0x86) |
| 70 | #define FFA_SECONDARY_EP_REGISTER FFA_SMC_32(0x87) |
| 71 | #define FFA_FN64_SECONDARY_EP_REGISTER FFA_SMC_64(0x87) |
| 72 | #define FFA_MEM_PERM_GET FFA_SMC_32(0x88) |
| 73 | #define FFA_FN64_MEM_PERM_GET FFA_SMC_64(0x88) |
| 74 | #define FFA_MEM_PERM_SET FFA_SMC_32(0x89) |
| 75 | #define FFA_FN64_MEM_PERM_SET FFA_SMC_64(0x89) |
| 76 | #define FFA_CONSOLE_LOG FFA_SMC_32(0x8A) |
| 77 | #define FFA_PARTITION_INFO_GET_REGS FFA_SMC_64(0x8B) |
| 78 | #define FFA_EL3_INTR_HANDLE FFA_SMC_32(0x8C) |
| 79 | #define FFA_MSG_SEND_DIRECT_REQ2 FFA_SMC_64(0x8D) |
| 80 | #define FFA_MSG_SEND_DIRECT_RESP2 FFA_SMC_64(0x8E) |
| 81 | |
| 82 | /* |
| 83 | * For some calls it is necessary to use SMC64 to pass or return 64-bit values. |
| 84 | * For such calls FFA_FN_NATIVE(name) will choose the appropriate |
| 85 | * (native-width) function ID. |
| 86 | */ |
| 87 | #ifdef CONFIG_64BIT |
| 88 | #define FFA_FN_NATIVE(name) FFA_FN64_##name |
| 89 | #else |
| 90 | #define FFA_FN_NATIVE(name) FFA_##name |
| 91 | #endif |
| 92 | |
| 93 | /* FFA error codes. */ |
| 94 | #define FFA_RET_SUCCESS (0) |
| 95 | #define FFA_RET_NOT_SUPPORTED (-1) |
| 96 | #define FFA_RET_INVALID_PARAMETERS (-2) |
| 97 | #define FFA_RET_NO_MEMORY (-3) |
| 98 | #define FFA_RET_BUSY (-4) |
| 99 | #define FFA_RET_INTERRUPTED (-5) |
| 100 | #define FFA_RET_DENIED (-6) |
| 101 | #define FFA_RET_RETRY (-7) |
| 102 | #define FFA_RET_ABORTED (-8) |
| 103 | #define FFA_RET_NO_DATA (-9) |
| 104 | |
| 105 | /* FFA version encoding */ |
| 106 | #define FFA_MAJOR_VERSION_MASK GENMASK(30, 16) |
| 107 | #define FFA_MINOR_VERSION_MASK GENMASK(15, 0) |
| 108 | #define FFA_MAJOR_VERSION(x) ((u16)(FIELD_GET(FFA_MAJOR_VERSION_MASK, (x)))) |
| 109 | #define FFA_MINOR_VERSION(x) ((u16)(FIELD_GET(FFA_MINOR_VERSION_MASK, (x)))) |
| 110 | #define FFA_PACK_VERSION_INFO(major, minor) \ |
| 111 | (FIELD_PREP(FFA_MAJOR_VERSION_MASK, (major)) | \ |
| 112 | FIELD_PREP(FFA_MINOR_VERSION_MASK, (minor))) |
| 113 | #define FFA_VERSION_1_0 FFA_PACK_VERSION_INFO(1, 0) |
| 114 | #define FFA_VERSION_1_1 FFA_PACK_VERSION_INFO(1, 1) |
| 115 | #define FFA_VERSION_1_2 FFA_PACK_VERSION_INFO(1, 2) |
| 116 | |
| 117 | /** |
| 118 | * FF-A specification mentions explicitly about '4K pages'. This should |
| 119 | * not be confused with the kernel PAGE_SIZE, which is the translation |
| 120 | * granule kernel is configured and may be one among 4K, 16K and 64K. |
| 121 | */ |
| 122 | #define FFA_PAGE_SIZE SZ_4K |
| 123 | |
| 124 | /* |
| 125 | * Minimum buffer size/alignment encodings returned by an FFA_FEATURES |
| 126 | * query for FFA_RXTX_MAP. |
| 127 | */ |
| 128 | #define FFA_FEAT_RXTX_MIN_SZ_4K 0 |
| 129 | #define FFA_FEAT_RXTX_MIN_SZ_64K 1 |
| 130 | #define FFA_FEAT_RXTX_MIN_SZ_16K 2 |
| 131 | |
| 132 | /* FFA Bus/Device/Driver related */ |
| 133 | struct ffa_device { |
| 134 | u32 id; |
| 135 | u32 properties; |
| 136 | int vm_id; |
| 137 | bool mode_32bit; |
| 138 | uuid_t uuid; |
| 139 | struct device dev; |
| 140 | const struct ffa_ops *ops; |
| 141 | }; |
| 142 | |
| 143 | #define to_ffa_dev(d) container_of(d, struct ffa_device, dev) |
| 144 | |
| 145 | struct ffa_device_id { |
| 146 | uuid_t uuid; |
| 147 | }; |
| 148 | |
| 149 | struct ffa_driver { |
| 150 | const char *name; |
| 151 | int (*probe)(struct ffa_device *sdev); |
| 152 | void (*remove)(struct ffa_device *sdev); |
| 153 | const struct ffa_device_id *id_table; |
| 154 | |
| 155 | struct device_driver driver; |
| 156 | }; |
| 157 | |
| 158 | #define to_ffa_driver(d) container_of_const(d, struct ffa_driver, driver) |
| 159 | |
| 160 | static inline void ffa_dev_set_drvdata(struct ffa_device *fdev, void *data) |
| 161 | { |
| 162 | dev_set_drvdata(dev: &fdev->dev, data); |
| 163 | } |
| 164 | |
| 165 | static inline void *ffa_dev_get_drvdata(struct ffa_device *fdev) |
| 166 | { |
| 167 | return dev_get_drvdata(dev: &fdev->dev); |
| 168 | } |
| 169 | |
| 170 | struct ffa_partition_info; |
| 171 | |
| 172 | #if IS_REACHABLE(CONFIG_ARM_FFA_TRANSPORT) |
| 173 | struct ffa_device * |
| 174 | ffa_device_register(const struct ffa_partition_info *part_info, |
| 175 | const struct ffa_ops *ops); |
| 176 | void ffa_device_unregister(struct ffa_device *ffa_dev); |
| 177 | int ffa_driver_register(struct ffa_driver *driver, struct module *owner, |
| 178 | const char *mod_name); |
| 179 | void ffa_driver_unregister(struct ffa_driver *driver); |
| 180 | void ffa_devices_unregister(void); |
| 181 | bool ffa_device_is_valid(struct ffa_device *ffa_dev); |
| 182 | |
| 183 | #else |
| 184 | static inline struct ffa_device * |
| 185 | ffa_device_register(const struct ffa_partition_info *part_info, |
| 186 | const struct ffa_ops *ops) |
| 187 | { |
| 188 | return NULL; |
| 189 | } |
| 190 | |
| 191 | static inline void ffa_device_unregister(struct ffa_device *dev) {} |
| 192 | |
| 193 | static inline void ffa_devices_unregister(void) {} |
| 194 | |
| 195 | static inline int |
| 196 | ffa_driver_register(struct ffa_driver *driver, struct module *owner, |
| 197 | const char *mod_name) |
| 198 | { |
| 199 | return -EINVAL; |
| 200 | } |
| 201 | |
| 202 | static inline void ffa_driver_unregister(struct ffa_driver *driver) {} |
| 203 | |
| 204 | static inline |
| 205 | bool ffa_device_is_valid(struct ffa_device *ffa_dev) { return false; } |
| 206 | |
| 207 | #endif /* CONFIG_ARM_FFA_TRANSPORT */ |
| 208 | |
| 209 | #define ffa_register(driver) \ |
| 210 | ffa_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) |
| 211 | #define ffa_unregister(driver) \ |
| 212 | ffa_driver_unregister(driver) |
| 213 | |
| 214 | /** |
| 215 | * module_ffa_driver() - Helper macro for registering a psa_ffa driver |
| 216 | * @__ffa_driver: ffa_driver structure |
| 217 | * |
| 218 | * Helper macro for psa_ffa drivers to set up proper module init / exit |
| 219 | * functions. Replaces module_init() and module_exit() and keeps people from |
| 220 | * printing pointless things to the kernel log when their driver is loaded. |
| 221 | */ |
| 222 | #define module_ffa_driver(__ffa_driver) \ |
| 223 | module_driver(__ffa_driver, ffa_register, ffa_unregister) |
| 224 | |
| 225 | extern const struct bus_type ffa_bus_type; |
| 226 | |
| 227 | /* The FF-A 1.0 partition structure lacks the uuid[4] */ |
| 228 | #define FFA_1_0_PARTITON_INFO_SZ (8) |
| 229 | |
| 230 | /* FFA transport related */ |
| 231 | struct ffa_partition_info { |
| 232 | u16 id; |
| 233 | u16 exec_ctxt; |
| 234 | /* partition supports receipt of direct requests */ |
| 235 | #define FFA_PARTITION_DIRECT_RECV BIT(0) |
| 236 | /* partition can send direct requests. */ |
| 237 | #define FFA_PARTITION_DIRECT_SEND BIT(1) |
| 238 | /* partition can send and receive indirect messages. */ |
| 239 | #define FFA_PARTITION_INDIRECT_MSG BIT(2) |
| 240 | /* partition can receive notifications */ |
| 241 | #define FFA_PARTITION_NOTIFICATION_RECV BIT(3) |
| 242 | /* partition runs in the AArch64 execution state. */ |
| 243 | #define FFA_PARTITION_AARCH64_EXEC BIT(8) |
| 244 | /* partition supports receipt of direct request2 */ |
| 245 | #define FFA_PARTITION_DIRECT_REQ2_RECV BIT(9) |
| 246 | /* partition can send direct request2. */ |
| 247 | #define FFA_PARTITION_DIRECT_REQ2_SEND BIT(10) |
| 248 | u32 properties; |
| 249 | uuid_t uuid; |
| 250 | }; |
| 251 | |
| 252 | static inline |
| 253 | bool ffa_partition_check_property(struct ffa_device *dev, u32 property) |
| 254 | { |
| 255 | return dev->properties & property; |
| 256 | } |
| 257 | |
| 258 | #define ffa_partition_supports_notify_recv(dev) \ |
| 259 | ffa_partition_check_property(dev, FFA_PARTITION_NOTIFICATION_RECV) |
| 260 | |
| 261 | #define ffa_partition_supports_indirect_msg(dev) \ |
| 262 | ffa_partition_check_property(dev, FFA_PARTITION_INDIRECT_MSG) |
| 263 | |
| 264 | #define ffa_partition_supports_direct_recv(dev) \ |
| 265 | ffa_partition_check_property(dev, FFA_PARTITION_DIRECT_RECV) |
| 266 | |
| 267 | #define ffa_partition_supports_direct_req2_recv(dev) \ |
| 268 | (ffa_partition_check_property(dev, FFA_PARTITION_DIRECT_REQ2_RECV) && \ |
| 269 | !dev->mode_32bit) |
| 270 | |
| 271 | /* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */ |
| 272 | struct ffa_send_direct_data { |
| 273 | unsigned long data0; /* w3/x3 */ |
| 274 | unsigned long data1; /* w4/x4 */ |
| 275 | unsigned long data2; /* w5/x5 */ |
| 276 | unsigned long data3; /* w6/x6 */ |
| 277 | unsigned long data4; /* w7/x7 */ |
| 278 | }; |
| 279 | |
| 280 | struct ffa_indirect_msg_hdr { |
| 281 | u32 flags; |
| 282 | u32 res0; |
| 283 | u32 offset; |
| 284 | u32 send_recv_id; |
| 285 | u32 size; |
| 286 | uuid_t uuid; |
| 287 | }; |
| 288 | |
| 289 | /* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP}2 which pass data via registers */ |
| 290 | struct ffa_send_direct_data2 { |
| 291 | unsigned long data[14]; /* x4-x17 */ |
| 292 | }; |
| 293 | |
| 294 | struct ffa_mem_region_addr_range { |
| 295 | /* The base IPA of the constituent memory region, aligned to 4 kiB */ |
| 296 | u64 address; |
| 297 | /* The number of 4 kiB pages in the constituent memory region. */ |
| 298 | u32 pg_cnt; |
| 299 | u32 reserved; |
| 300 | }; |
| 301 | |
| 302 | struct ffa_composite_mem_region { |
| 303 | /* |
| 304 | * The total number of 4 kiB pages included in this memory region. This |
| 305 | * must be equal to the sum of page counts specified in each |
| 306 | * `struct ffa_mem_region_addr_range`. |
| 307 | */ |
| 308 | u32 total_pg_cnt; |
| 309 | /* The number of constituents included in this memory region range */ |
| 310 | u32 addr_range_cnt; |
| 311 | u64 reserved; |
| 312 | /** An array of `addr_range_cnt` memory region constituents. */ |
| 313 | struct ffa_mem_region_addr_range constituents[]; |
| 314 | }; |
| 315 | |
| 316 | struct ffa_mem_region_attributes { |
| 317 | /* The ID of the VM to which the memory is being given or shared. */ |
| 318 | u16 receiver; |
| 319 | /* |
| 320 | * The permissions with which the memory region should be mapped in the |
| 321 | * receiver's page table. |
| 322 | */ |
| 323 | #define FFA_MEM_EXEC BIT(3) |
| 324 | #define FFA_MEM_NO_EXEC BIT(2) |
| 325 | #define FFA_MEM_RW BIT(1) |
| 326 | #define FFA_MEM_RO BIT(0) |
| 327 | u8 attrs; |
| 328 | /* |
| 329 | * Flags used during FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP |
| 330 | * for memory regions with multiple borrowers. |
| 331 | */ |
| 332 | #define FFA_MEM_RETRIEVE_SELF_BORROWER BIT(0) |
| 333 | u8 flag; |
| 334 | /* |
| 335 | * Offset in bytes from the start of the outer `ffa_memory_region` to |
| 336 | * an `struct ffa_mem_region_addr_range`. |
| 337 | */ |
| 338 | u32 composite_off; |
| 339 | u64 reserved; |
| 340 | }; |
| 341 | |
| 342 | struct ffa_mem_region { |
| 343 | /* The ID of the VM/owner which originally sent the memory region */ |
| 344 | u16 sender_id; |
| 345 | #define FFA_MEM_NORMAL BIT(5) |
| 346 | #define FFA_MEM_DEVICE BIT(4) |
| 347 | |
| 348 | #define FFA_MEM_WRITE_BACK (3 << 2) |
| 349 | #define FFA_MEM_NON_CACHEABLE (1 << 2) |
| 350 | |
| 351 | #define FFA_DEV_nGnRnE (0 << 2) |
| 352 | #define FFA_DEV_nGnRE (1 << 2) |
| 353 | #define FFA_DEV_nGRE (2 << 2) |
| 354 | #define FFA_DEV_GRE (3 << 2) |
| 355 | |
| 356 | #define FFA_MEM_NON_SHAREABLE (0) |
| 357 | #define FFA_MEM_OUTER_SHAREABLE (2) |
| 358 | #define FFA_MEM_INNER_SHAREABLE (3) |
| 359 | /* Memory region attributes, upper byte MBZ pre v1.1 */ |
| 360 | u16 attributes; |
| 361 | /* |
| 362 | * Clear memory region contents after unmapping it from the sender and |
| 363 | * before mapping it for any receiver. |
| 364 | */ |
| 365 | #define FFA_MEM_CLEAR BIT(0) |
| 366 | /* |
| 367 | * Whether the hypervisor may time slice the memory sharing or retrieval |
| 368 | * operation. |
| 369 | */ |
| 370 | #define FFA_TIME_SLICE_ENABLE BIT(1) |
| 371 | |
| 372 | #define FFA_MEM_RETRIEVE_TYPE_IN_RESP (0 << 3) |
| 373 | #define FFA_MEM_RETRIEVE_TYPE_SHARE (1 << 3) |
| 374 | #define FFA_MEM_RETRIEVE_TYPE_LEND (2 << 3) |
| 375 | #define FFA_MEM_RETRIEVE_TYPE_DONATE (3 << 3) |
| 376 | |
| 377 | #define FFA_MEM_RETRIEVE_ADDR_ALIGN_HINT BIT(9) |
| 378 | #define FFA_MEM_RETRIEVE_ADDR_ALIGN(x) ((x) << 5) |
| 379 | /* Flags to control behaviour of the transaction. */ |
| 380 | u32 flags; |
| 381 | #define HANDLE_LOW_MASK GENMASK_ULL(31, 0) |
| 382 | #define HANDLE_HIGH_MASK GENMASK_ULL(63, 32) |
| 383 | #define HANDLE_LOW(x) ((u32)(FIELD_GET(HANDLE_LOW_MASK, (x)))) |
| 384 | #define HANDLE_HIGH(x) ((u32)(FIELD_GET(HANDLE_HIGH_MASK, (x)))) |
| 385 | |
| 386 | #define PACK_HANDLE(l, h) \ |
| 387 | (FIELD_PREP(HANDLE_LOW_MASK, (l)) | FIELD_PREP(HANDLE_HIGH_MASK, (h))) |
| 388 | /* |
| 389 | * A globally-unique ID assigned by the hypervisor for a region |
| 390 | * of memory being sent between VMs. |
| 391 | */ |
| 392 | u64 handle; |
| 393 | /* |
| 394 | * An implementation defined value associated with the receiver and the |
| 395 | * memory region. |
| 396 | */ |
| 397 | u64 tag; |
| 398 | /* Size of each endpoint memory access descriptor, MBZ pre v1.1 */ |
| 399 | u32 ep_mem_size; |
| 400 | /* |
| 401 | * The number of `ffa_mem_region_attributes` entries included in this |
| 402 | * transaction. |
| 403 | */ |
| 404 | u32 ep_count; |
| 405 | /* |
| 406 | * 16-byte aligned offset from the base address of this descriptor |
| 407 | * to the first element of the endpoint memory access descriptor array |
| 408 | * Valid only from v1.1 |
| 409 | */ |
| 410 | u32 ep_mem_offset; |
| 411 | /* MBZ, valid only from v1.1 */ |
| 412 | u32 reserved[3]; |
| 413 | }; |
| 414 | |
| 415 | #define CONSTITUENTS_OFFSET(x) \ |
| 416 | (offsetof(struct ffa_composite_mem_region, constituents[x])) |
| 417 | |
| 418 | static inline u32 |
| 419 | ffa_mem_desc_offset(struct ffa_mem_region *buf, int count, u32 ffa_version) |
| 420 | { |
| 421 | u32 offset = count * sizeof(struct ffa_mem_region_attributes); |
| 422 | /* |
| 423 | * Earlier to v1.1, the endpoint memory descriptor array started at |
| 424 | * offset 32(i.e. offset of ep_mem_offset in the current structure) |
| 425 | */ |
| 426 | if (ffa_version <= FFA_VERSION_1_0) |
| 427 | offset += offsetof(struct ffa_mem_region, ep_mem_offset); |
| 428 | else |
| 429 | offset += sizeof(struct ffa_mem_region); |
| 430 | |
| 431 | return offset; |
| 432 | } |
| 433 | |
| 434 | struct ffa_mem_ops_args { |
| 435 | bool use_txbuf; |
| 436 | u32 nattrs; |
| 437 | u32 flags; |
| 438 | u64 tag; |
| 439 | u64 g_handle; |
| 440 | struct scatterlist *sg; |
| 441 | struct ffa_mem_region_attributes *attrs; |
| 442 | }; |
| 443 | |
| 444 | struct ffa_info_ops { |
| 445 | u32 (*api_version_get)(void); |
| 446 | int (*partition_info_get)(const char *uuid_str, |
| 447 | struct ffa_partition_info *buffer); |
| 448 | }; |
| 449 | |
| 450 | struct ffa_msg_ops { |
| 451 | void (*mode_32bit_set)(struct ffa_device *dev); |
| 452 | int (*sync_send_receive)(struct ffa_device *dev, |
| 453 | struct ffa_send_direct_data *data); |
| 454 | int (*indirect_send)(struct ffa_device *dev, void *buf, size_t sz); |
| 455 | int (*sync_send_receive2)(struct ffa_device *dev, |
| 456 | struct ffa_send_direct_data2 *data); |
| 457 | }; |
| 458 | |
| 459 | struct ffa_mem_ops { |
| 460 | int (*memory_reclaim)(u64 g_handle, u32 flags); |
| 461 | int (*memory_share)(struct ffa_mem_ops_args *args); |
| 462 | int (*memory_lend)(struct ffa_mem_ops_args *args); |
| 463 | }; |
| 464 | |
| 465 | struct ffa_cpu_ops { |
| 466 | int (*run)(struct ffa_device *dev, u16 vcpu); |
| 467 | }; |
| 468 | |
| 469 | typedef void (*ffa_sched_recv_cb)(u16 vcpu, bool is_per_vcpu, void *cb_data); |
| 470 | typedef void (*ffa_notifier_cb)(int notify_id, void *cb_data); |
| 471 | typedef void (*ffa_fwk_notifier_cb)(int notify_id, void *cb_data, void *buf); |
| 472 | |
| 473 | struct ffa_notifier_ops { |
| 474 | int (*sched_recv_cb_register)(struct ffa_device *dev, |
| 475 | ffa_sched_recv_cb cb, void *cb_data); |
| 476 | int (*sched_recv_cb_unregister)(struct ffa_device *dev); |
| 477 | int (*notify_request)(struct ffa_device *dev, bool per_vcpu, |
| 478 | ffa_notifier_cb cb, void *cb_data, int notify_id); |
| 479 | int (*notify_relinquish)(struct ffa_device *dev, int notify_id); |
| 480 | int (*fwk_notify_request)(struct ffa_device *dev, |
| 481 | ffa_fwk_notifier_cb cb, void *cb_data, |
| 482 | int notify_id); |
| 483 | int (*fwk_notify_relinquish)(struct ffa_device *dev, int notify_id); |
| 484 | int (*notify_send)(struct ffa_device *dev, int notify_id, bool per_vcpu, |
| 485 | u16 vcpu); |
| 486 | }; |
| 487 | |
| 488 | struct ffa_ops { |
| 489 | const struct ffa_info_ops *info_ops; |
| 490 | const struct ffa_msg_ops *msg_ops; |
| 491 | const struct ffa_mem_ops *mem_ops; |
| 492 | const struct ffa_cpu_ops *cpu_ops; |
| 493 | const struct ffa_notifier_ops *notifier_ops; |
| 494 | }; |
| 495 | |
| 496 | #endif /* _LINUX_ARM_FFA_H */ |
| 497 | |