1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Arm Firmware Framework for ARMv8-A(FFA) interface driver
4 *
5 * The Arm FFA specification[1] describes a software architecture to
6 * leverages the virtualization extension to isolate software images
7 * provided by an ecosystem of vendors from each other and describes
8 * interfaces that standardize communication between the various software
9 * images including communication between images in the Secure world and
10 * Normal world. Any Hypervisor could use the FFA interfaces to enable
11 * communication between VMs it manages.
12 *
13 * The Hypervisor a.k.a Partition managers in FFA terminology can assign
14 * system resources(Memory regions, Devices, CPU cycles) to the partitions
15 * and manage isolation amongst them.
16 *
17 * [1] https://developer.arm.com/docs/den0077/latest
18 *
19 * Copyright (C) 2021 ARM Ltd.
20 */
21
22 #define DRIVER_NAME "ARM FF-A"
23 #define pr_fmt(fmt) DRIVER_NAME ": " fmt
24
25 #include <linux/acpi.h>
26 #include <linux/arm_ffa.h>
27 #include <linux/bitfield.h>
28 #include <linux/cpuhotplug.h>
29 #include <linux/delay.h>
30 #include <linux/device.h>
31 #include <linux/hashtable.h>
32 #include <linux/interrupt.h>
33 #include <linux/io.h>
34 #include <linux/kernel.h>
35 #include <linux/minmax.h>
36 #include <linux/module.h>
37 #include <linux/mm.h>
38 #include <linux/mutex.h>
39 #include <linux/of_irq.h>
40 #include <linux/platform_device.h>
41 #include <linux/scatterlist.h>
42 #include <linux/slab.h>
43 #include <linux/smp.h>
44 #include <linux/uuid.h>
45 #include <linux/xarray.h>
46
47 #include <asm/virt.h>
48
49 #include "common.h"
50
51 #define FFA_DRIVER_VERSION FFA_VERSION_1_2
52 #define FFA_MIN_VERSION FFA_VERSION_1_0
53 #define FFA_PLATFORM_NAME "arm-ffa"
54
55 #define SENDER_ID_MASK GENMASK(31, 16)
56 #define RECEIVER_ID_MASK GENMASK(15, 0)
57 #define SENDER_ID(x) ((u16)(FIELD_GET(SENDER_ID_MASK, (x))))
58 #define RECEIVER_ID(x) ((u16)(FIELD_GET(RECEIVER_ID_MASK, (x))))
59 #define PACK_TARGET_INFO(s, r) \
60 (FIELD_PREP(SENDER_ID_MASK, (s)) | FIELD_PREP(RECEIVER_ID_MASK, (r)))
61
62 #define RXTX_MAP_MIN_BUFSZ_MASK GENMASK(1, 0)
63 #define RXTX_MAP_MAX_BUFSZ_MASK GENMASK(31, 16)
64 #define RXTX_MAP_MIN_BUFSZ(x) (FIELD_GET(RXTX_MAP_MIN_BUFSZ_MASK, (x)))
65 #define RXTX_MAP_MAX_BUFSZ(x) (FIELD_GET(RXTX_MAP_MAX_BUFSZ_MASK, (x)))
66
67 #define FFA_MAX_NOTIFICATIONS 64
68
69 static ffa_fn *invoke_ffa_fn;
70
71 static const int ffa_linux_errmap[] = {
72 /* better than switch case as long as return value is continuous */
73 0, /* FFA_RET_SUCCESS */
74 -EOPNOTSUPP, /* FFA_RET_NOT_SUPPORTED */
75 -EINVAL, /* FFA_RET_INVALID_PARAMETERS */
76 -ENOMEM, /* FFA_RET_NO_MEMORY */
77 -EBUSY, /* FFA_RET_BUSY */
78 -EINTR, /* FFA_RET_INTERRUPTED */
79 -EACCES, /* FFA_RET_DENIED */
80 -EAGAIN, /* FFA_RET_RETRY */
81 -ECANCELED, /* FFA_RET_ABORTED */
82 -ENODATA, /* FFA_RET_NO_DATA */
83 -EAGAIN, /* FFA_RET_NOT_READY */
84 };
85
ffa_to_linux_errno(int errno)86 static inline int ffa_to_linux_errno(int errno)
87 {
88 int err_idx = -errno;
89
90 if (err_idx >= 0 && err_idx < ARRAY_SIZE(ffa_linux_errmap))
91 return ffa_linux_errmap[err_idx];
92 return -EINVAL;
93 }
94
95 struct ffa_pcpu_irq {
96 struct ffa_drv_info *info;
97 struct work_struct notif_pcpu_work;
98 };
99
100 struct ffa_drv_info {
101 u32 version;
102 u16 vm_id;
103 struct mutex rx_lock; /* lock to protect Rx buffer */
104 struct mutex tx_lock; /* lock to protect Tx buffer */
105 void *rx_buffer;
106 void *tx_buffer;
107 size_t rxtx_bufsz;
108 bool mem_ops_native;
109 bool msg_direct_req2_supp;
110 bool bitmap_created;
111 bool bus_notifier_registered;
112 bool notif_enabled;
113 unsigned int sched_recv_irq;
114 unsigned int notif_pend_irq;
115 unsigned int cpuhp_state;
116 struct ffa_pcpu_irq __percpu *irq_pcpu;
117 struct workqueue_struct *notif_pcpu_wq;
118 struct work_struct sched_recv_irq_work;
119 struct xarray partition_info;
120 DECLARE_HASHTABLE(notifier_hash, ilog2(FFA_MAX_NOTIFICATIONS));
121 rwlock_t notify_lock; /* lock to protect notifier hashtable */
122 };
123
124 static struct ffa_drv_info *drv_info;
125 static struct platform_device *ffa_pdev;
126
127 /*
128 * The driver must be able to support all the versions from the earliest
129 * supported FFA_MIN_VERSION to the latest supported FFA_DRIVER_VERSION.
130 * The specification states that if firmware supports a FFA implementation
131 * that is incompatible with and at a greater version number than specified
132 * by the caller(FFA_DRIVER_VERSION passed as parameter to FFA_VERSION),
133 * it must return the NOT_SUPPORTED error code.
134 */
ffa_compatible_version_find(u32 version)135 static u32 ffa_compatible_version_find(u32 version)
136 {
137 u16 major = FFA_MAJOR_VERSION(version), minor = FFA_MINOR_VERSION(version);
138 u16 drv_major = FFA_MAJOR_VERSION(FFA_DRIVER_VERSION);
139 u16 drv_minor = FFA_MINOR_VERSION(FFA_DRIVER_VERSION);
140
141 if ((major < drv_major) || (major == drv_major && minor <= drv_minor))
142 return version;
143
144 pr_info("Firmware version higher than driver version, downgrading\n");
145 return FFA_DRIVER_VERSION;
146 }
147
ffa_version_check(u32 * version)148 static int ffa_version_check(u32 *version)
149 {
150 ffa_value_t ver;
151
152 invoke_ffa_fn((ffa_value_t){
153 .a0 = FFA_VERSION, .a1 = FFA_DRIVER_VERSION,
154 }, &ver);
155
156 if ((s32)ver.a0 == FFA_RET_NOT_SUPPORTED) {
157 pr_info("FFA_VERSION returned not supported\n");
158 return -EOPNOTSUPP;
159 }
160
161 if (FFA_MAJOR_VERSION(ver.a0) > FFA_MAJOR_VERSION(FFA_DRIVER_VERSION)) {
162 pr_err("Incompatible v%d.%d! Latest supported v%d.%d\n",
163 FFA_MAJOR_VERSION(ver.a0), FFA_MINOR_VERSION(ver.a0),
164 FFA_MAJOR_VERSION(FFA_DRIVER_VERSION),
165 FFA_MINOR_VERSION(FFA_DRIVER_VERSION));
166 return -EINVAL;
167 }
168
169 if (ver.a0 < FFA_MIN_VERSION) {
170 pr_err("Incompatible v%d.%d! Earliest supported v%d.%d\n",
171 FFA_MAJOR_VERSION(ver.a0), FFA_MINOR_VERSION(ver.a0),
172 FFA_MAJOR_VERSION(FFA_MIN_VERSION),
173 FFA_MINOR_VERSION(FFA_MIN_VERSION));
174 return -EINVAL;
175 }
176
177 pr_info("Driver version %d.%d\n", FFA_MAJOR_VERSION(FFA_DRIVER_VERSION),
178 FFA_MINOR_VERSION(FFA_DRIVER_VERSION));
179 pr_info("Firmware version %d.%d found\n", FFA_MAJOR_VERSION(ver.a0),
180 FFA_MINOR_VERSION(ver.a0));
181 *version = ffa_compatible_version_find(ver.a0);
182
183 return 0;
184 }
185
ffa_rx_release(void)186 static int ffa_rx_release(void)
187 {
188 ffa_value_t ret;
189
190 invoke_ffa_fn((ffa_value_t){
191 .a0 = FFA_RX_RELEASE,
192 }, &ret);
193
194 if (ret.a0 == FFA_ERROR)
195 return ffa_to_linux_errno((int)ret.a2);
196
197 /* check for ret.a0 == FFA_RX_RELEASE ? */
198
199 return 0;
200 }
201
ffa_rxtx_map(phys_addr_t tx_buf,phys_addr_t rx_buf,u32 pg_cnt)202 static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt)
203 {
204 ffa_value_t ret;
205
206 invoke_ffa_fn((ffa_value_t){
207 .a0 = FFA_FN_NATIVE(RXTX_MAP),
208 .a1 = tx_buf, .a2 = rx_buf, .a3 = pg_cnt,
209 }, &ret);
210
211 if (ret.a0 == FFA_ERROR)
212 return ffa_to_linux_errno((int)ret.a2);
213
214 return 0;
215 }
216
ffa_rxtx_unmap(void)217 static int ffa_rxtx_unmap(void)
218 {
219 ffa_value_t ret;
220
221 invoke_ffa_fn((ffa_value_t){
222 .a0 = FFA_RXTX_UNMAP,
223 }, &ret);
224
225 if (ret.a0 == FFA_ERROR)
226 return ffa_to_linux_errno((int)ret.a2);
227
228 return 0;
229 }
230
ffa_features(u32 func_feat_id,u32 input_props,u32 * if_props_1,u32 * if_props_2)231 static int ffa_features(u32 func_feat_id, u32 input_props,
232 u32 *if_props_1, u32 *if_props_2)
233 {
234 ffa_value_t id;
235
236 if (!ARM_SMCCC_IS_FAST_CALL(func_feat_id) && input_props) {
237 pr_err("%s: Invalid Parameters: %x, %x", __func__,
238 func_feat_id, input_props);
239 return ffa_to_linux_errno(FFA_RET_INVALID_PARAMETERS);
240 }
241
242 invoke_ffa_fn((ffa_value_t){
243 .a0 = FFA_FEATURES, .a1 = func_feat_id, .a2 = input_props,
244 }, &id);
245
246 if (id.a0 == FFA_ERROR)
247 return ffa_to_linux_errno((int)id.a2);
248
249 if (if_props_1)
250 *if_props_1 = id.a2;
251 if (if_props_2)
252 *if_props_2 = id.a3;
253
254 return 0;
255 }
256
257 #define PARTITION_INFO_GET_RETURN_COUNT_ONLY BIT(0)
258 #define FFA_SUPPORTS_GET_COUNT_ONLY(version) ((version) > FFA_VERSION_1_0)
259 #define FFA_PART_INFO_HAS_SIZE_IN_RESP(version) ((version) > FFA_VERSION_1_0)
260 #define FFA_PART_INFO_HAS_UUID_IN_RESP(version) ((version) > FFA_VERSION_1_0)
261 #define FFA_PART_INFO_HAS_EXEC_STATE_IN_RESP(version) \
262 ((version) > FFA_VERSION_1_0)
263
264 /* buffer must be sizeof(struct ffa_partition_info) * num_partitions */
265 static int
__ffa_partition_info_get(u32 uuid0,u32 uuid1,u32 uuid2,u32 uuid3,struct ffa_partition_info * buffer,int num_partitions)266 __ffa_partition_info_get(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3,
267 struct ffa_partition_info *buffer, int num_partitions)
268 {
269 int idx, count, flags = 0, sz, buf_sz;
270 ffa_value_t partition_info;
271
272 if (FFA_SUPPORTS_GET_COUNT_ONLY(drv_info->version) &&
273 (!buffer || !num_partitions)) /* Just get the count for now */
274 flags = PARTITION_INFO_GET_RETURN_COUNT_ONLY;
275
276 mutex_lock(&drv_info->rx_lock);
277 invoke_ffa_fn((ffa_value_t){
278 .a0 = FFA_PARTITION_INFO_GET,
279 .a1 = uuid0, .a2 = uuid1, .a3 = uuid2, .a4 = uuid3,
280 .a5 = flags,
281 }, &partition_info);
282
283 if (partition_info.a0 == FFA_ERROR) {
284 mutex_unlock(&drv_info->rx_lock);
285 return ffa_to_linux_errno((int)partition_info.a2);
286 }
287
288 count = partition_info.a2;
289
290 if (FFA_PART_INFO_HAS_SIZE_IN_RESP(drv_info->version)) {
291 buf_sz = sz = partition_info.a3;
292 if (sz > sizeof(*buffer))
293 buf_sz = sizeof(*buffer);
294 } else {
295 buf_sz = sz = 8;
296 }
297
298 if (buffer && count <= num_partitions)
299 for (idx = 0; idx < count; idx++) {
300 struct ffa_partition_info_le {
301 __le16 id;
302 __le16 exec_ctxt;
303 __le32 properties;
304 uuid_t uuid;
305 } *rx_buf = drv_info->rx_buffer + idx * sz;
306 struct ffa_partition_info *buf = buffer + idx;
307
308 buf->id = le16_to_cpu(rx_buf->id);
309 buf->exec_ctxt = le16_to_cpu(rx_buf->exec_ctxt);
310 buf->properties = le32_to_cpu(rx_buf->properties);
311 if (buf_sz > 8)
312 import_uuid(&buf->uuid, (u8 *)&rx_buf->uuid);
313 }
314
315 if (!(flags & PARTITION_INFO_GET_RETURN_COUNT_ONLY))
316 ffa_rx_release();
317
318 mutex_unlock(&drv_info->rx_lock);
319
320 return count;
321 }
322
323 #define LAST_INDEX_MASK GENMASK(15, 0)
324 #define CURRENT_INDEX_MASK GENMASK(31, 16)
325 #define UUID_INFO_TAG_MASK GENMASK(47, 32)
326 #define PARTITION_INFO_SZ_MASK GENMASK(63, 48)
327 #define PARTITION_COUNT(x) ((u16)(FIELD_GET(LAST_INDEX_MASK, (x))) + 1)
328 #define CURRENT_INDEX(x) ((u16)(FIELD_GET(CURRENT_INDEX_MASK, (x))))
329 #define UUID_INFO_TAG(x) ((u16)(FIELD_GET(UUID_INFO_TAG_MASK, (x))))
330 #define PARTITION_INFO_SZ(x) ((u16)(FIELD_GET(PARTITION_INFO_SZ_MASK, (x))))
331 #define PART_INFO_ID_MASK GENMASK(15, 0)
332 #define PART_INFO_EXEC_CXT_MASK GENMASK(31, 16)
333 #define PART_INFO_PROPS_MASK GENMASK(63, 32)
334 #define FFA_PART_INFO_GET_REGS_FIRST_REG 3
335 #define FFA_PART_INFO_GET_REGS_MIN_REGS_PER_DESC 3
336 #define FFA_PART_INFO_GET_REGS_NUM_REGS \
337 (sizeof(ffa_value_t) / sizeof_field(ffa_value_t, a0))
338 #define PART_INFO_ID(x) ((u16)(FIELD_GET(PART_INFO_ID_MASK, (x))))
339 #define PART_INFO_EXEC_CXT(x) ((u16)(FIELD_GET(PART_INFO_EXEC_CXT_MASK, (x))))
340 #define PART_INFO_PROPERTIES(x) ((u32)(FIELD_GET(PART_INFO_PROPS_MASK, (x))))
341 static int
__ffa_partition_info_get_regs(u32 uuid0,u32 uuid1,u32 uuid2,u32 uuid3,struct ffa_partition_info * buffer,int num_parts)342 __ffa_partition_info_get_regs(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3,
343 struct ffa_partition_info *buffer, int num_parts)
344 {
345 u16 buf_sz, start_idx = 0, cur_idx, count = 0, tag = 0;
346 struct ffa_partition_info *buf = buffer;
347 ffa_value_t partition_info;
348
349 do {
350 __le64 *regs;
351 int idx, nr_desc, buf_idx, regs_per_desc, max_desc;
352
353 invoke_ffa_fn((ffa_value_t){
354 .a0 = FFA_PARTITION_INFO_GET_REGS,
355 .a1 = (u64)uuid1 << 32 | uuid0,
356 .a2 = (u64)uuid3 << 32 | uuid2,
357 .a3 = start_idx | tag << 16,
358 }, &partition_info);
359
360 if (partition_info.a0 == FFA_ERROR)
361 return ffa_to_linux_errno((int)partition_info.a2);
362
363 if (!count)
364 count = PARTITION_COUNT(partition_info.a2);
365 if (!buffer || !num_parts) /* count only */
366 return count;
367 if (count > num_parts)
368 return -EINVAL;
369
370 cur_idx = CURRENT_INDEX(partition_info.a2);
371 if (cur_idx < start_idx || cur_idx >= count)
372 return -EINVAL;
373
374 buf_sz = PARTITION_INFO_SZ(partition_info.a2);
375 if (buf_sz % sizeof(*regs))
376 return -EINVAL;
377
378 regs_per_desc = buf_sz / sizeof(*regs);
379 if (regs_per_desc < FFA_PART_INFO_GET_REGS_MIN_REGS_PER_DESC)
380 return -EINVAL;
381
382 nr_desc = cur_idx - start_idx + 1;
383 max_desc = (FFA_PART_INFO_GET_REGS_NUM_REGS -
384 FFA_PART_INFO_GET_REGS_FIRST_REG) / regs_per_desc;
385 if (nr_desc > max_desc)
386 return -EINVAL;
387
388 buf_idx = buf - buffer;
389 if (buf_idx + nr_desc > num_parts)
390 return -EINVAL;
391
392 tag = UUID_INFO_TAG(partition_info.a2);
393
394 regs = (void *)&partition_info.a3;
395 for (idx = 0; idx < nr_desc; idx++, buf++) {
396 union {
397 uuid_t uuid;
398 u64 regs[2];
399 } uuid_regs = {
400 .regs = {
401 le64_to_cpu(*(regs + 1)),
402 le64_to_cpu(*(regs + 2)),
403 }
404 };
405 u64 val = *(u64 *)regs;
406
407 buf->id = PART_INFO_ID(val);
408 buf->exec_ctxt = PART_INFO_EXEC_CXT(val);
409 buf->properties = PART_INFO_PROPERTIES(val);
410 uuid_copy(&buf->uuid, &uuid_regs.uuid);
411 regs += regs_per_desc;
412 }
413 start_idx = cur_idx + 1;
414
415 } while (cur_idx < (count - 1));
416
417 return count;
418 }
419
420 /* buffer is allocated and caller must free the same if returned count > 0 */
421 static int
ffa_partition_probe(const uuid_t * uuid,struct ffa_partition_info ** buffer)422 ffa_partition_probe(const uuid_t *uuid, struct ffa_partition_info **buffer)
423 {
424 int count;
425 u32 uuid0_4[4];
426 bool reg_mode = false;
427 struct ffa_partition_info *pbuf;
428
429 if (!ffa_features(FFA_PARTITION_INFO_GET_REGS, 0, NULL, NULL))
430 reg_mode = true;
431
432 export_uuid((u8 *)uuid0_4, uuid);
433 if (reg_mode)
434 count = __ffa_partition_info_get_regs(uuid0_4[0], uuid0_4[1],
435 uuid0_4[2], uuid0_4[3],
436 NULL, 0);
437 else
438 count = __ffa_partition_info_get(uuid0_4[0], uuid0_4[1],
439 uuid0_4[2], uuid0_4[3],
440 NULL, 0);
441 if (count <= 0)
442 return count;
443
444 pbuf = kzalloc_objs(*pbuf, count);
445 if (!pbuf)
446 return -ENOMEM;
447
448 if (reg_mode)
449 count = __ffa_partition_info_get_regs(uuid0_4[0], uuid0_4[1],
450 uuid0_4[2], uuid0_4[3],
451 pbuf, count);
452 else
453 count = __ffa_partition_info_get(uuid0_4[0], uuid0_4[1],
454 uuid0_4[2], uuid0_4[3],
455 pbuf, count);
456 if (count <= 0)
457 kfree(pbuf);
458 else
459 *buffer = pbuf;
460
461 return count;
462 }
463
464 #define VM_ID_MASK GENMASK(15, 0)
ffa_id_get(u16 * vm_id)465 static int ffa_id_get(u16 *vm_id)
466 {
467 ffa_value_t id;
468
469 invoke_ffa_fn((ffa_value_t){
470 .a0 = FFA_ID_GET,
471 }, &id);
472
473 if (id.a0 == FFA_ERROR)
474 return ffa_to_linux_errno((int)id.a2);
475
476 *vm_id = FIELD_GET(VM_ID_MASK, (id.a2));
477
478 return 0;
479 }
480
ffa_msg_send_wait_for_completion(ffa_value_t * ret)481 static inline void ffa_msg_send_wait_for_completion(ffa_value_t *ret)
482 {
483 while (ret->a0 == FFA_INTERRUPT || ret->a0 == FFA_YIELD) {
484 if (ret->a0 == FFA_YIELD)
485 fsleep(1000);
486
487 invoke_ffa_fn((ffa_value_t){
488 .a0 = FFA_RUN, .a1 = ret->a1,
489 }, ret);
490 }
491 }
492
ffa_msg_send_direct_req(u16 src_id,u16 dst_id,bool mode_32bit,struct ffa_send_direct_data * data)493 static int ffa_msg_send_direct_req(u16 src_id, u16 dst_id, bool mode_32bit,
494 struct ffa_send_direct_data *data)
495 {
496 u32 req_id, resp_id, src_dst_ids = PACK_TARGET_INFO(src_id, dst_id);
497 ffa_value_t ret;
498
499 if (mode_32bit) {
500 req_id = FFA_MSG_SEND_DIRECT_REQ;
501 resp_id = FFA_MSG_SEND_DIRECT_RESP;
502 } else {
503 req_id = FFA_FN_NATIVE(MSG_SEND_DIRECT_REQ);
504 resp_id = FFA_FN_NATIVE(MSG_SEND_DIRECT_RESP);
505 }
506
507 invoke_ffa_fn((ffa_value_t){
508 .a0 = req_id, .a1 = src_dst_ids, .a2 = 0,
509 .a3 = data->data0, .a4 = data->data1, .a5 = data->data2,
510 .a6 = data->data3, .a7 = data->data4,
511 }, &ret);
512
513 ffa_msg_send_wait_for_completion(&ret);
514
515 if (ret.a0 == FFA_ERROR)
516 return ffa_to_linux_errno((int)ret.a2);
517
518 if (ret.a0 == resp_id) {
519 data->data0 = ret.a3;
520 data->data1 = ret.a4;
521 data->data2 = ret.a5;
522 data->data3 = ret.a6;
523 data->data4 = ret.a7;
524 return 0;
525 }
526
527 return -EINVAL;
528 }
529
ffa_msg_send2(struct ffa_device * dev,u16 src_id,void * buf,size_t sz)530 static int ffa_msg_send2(struct ffa_device *dev, u16 src_id, void *buf, size_t sz)
531 {
532 u32 src_dst_ids = PACK_TARGET_INFO(src_id, dev->vm_id);
533 struct ffa_indirect_msg_hdr *msg;
534 ffa_value_t ret;
535 int retval = 0;
536
537 if (sz > (drv_info->rxtx_bufsz - sizeof(*msg)))
538 return -ERANGE;
539
540 mutex_lock(&drv_info->tx_lock);
541
542 msg = drv_info->tx_buffer;
543 msg->flags = 0;
544 msg->res0 = 0;
545 msg->offset = sizeof(*msg);
546 msg->send_recv_id = src_dst_ids;
547 msg->size = sz;
548 uuid_copy(&msg->uuid, &dev->uuid);
549 memcpy((u8 *)msg + msg->offset, buf, sz);
550
551 /* flags = 0, sender VMID = 0 works for both physical/virtual NS */
552 invoke_ffa_fn((ffa_value_t){
553 .a0 = FFA_MSG_SEND2, .a1 = 0, .a2 = 0
554 }, &ret);
555
556 if (ret.a0 == FFA_ERROR)
557 retval = ffa_to_linux_errno((int)ret.a2);
558
559 mutex_unlock(&drv_info->tx_lock);
560 return retval;
561 }
562
ffa_msg_send_direct_req2(u16 src_id,u16 dst_id,const uuid_t * uuid,struct ffa_send_direct_data2 * data)563 static int ffa_msg_send_direct_req2(u16 src_id, u16 dst_id, const uuid_t *uuid,
564 struct ffa_send_direct_data2 *data)
565 {
566 u32 src_dst_ids = PACK_TARGET_INFO(src_id, dst_id);
567 union {
568 uuid_t uuid;
569 __le64 regs[2];
570 } uuid_regs = { .uuid = *uuid };
571 ffa_value_t ret, args = {
572 .a0 = FFA_MSG_SEND_DIRECT_REQ2,
573 .a1 = src_dst_ids,
574 .a2 = le64_to_cpu(uuid_regs.regs[0]),
575 .a3 = le64_to_cpu(uuid_regs.regs[1]),
576 };
577 memcpy((void *)&args + offsetof(ffa_value_t, a4), data, sizeof(*data));
578
579 invoke_ffa_fn(args, &ret);
580
581 ffa_msg_send_wait_for_completion(&ret);
582
583 if (ret.a0 == FFA_ERROR)
584 return ffa_to_linux_errno((int)ret.a2);
585
586 if (ret.a0 == FFA_MSG_SEND_DIRECT_RESP2) {
587 memcpy(data, (void *)&ret + offsetof(ffa_value_t, a4), sizeof(*data));
588 return 0;
589 }
590
591 return -EINVAL;
592 }
593
ffa_mem_first_frag(u32 func_id,phys_addr_t buf,u32 buf_sz,u32 frag_len,u32 len,u64 * handle)594 static int ffa_mem_first_frag(u32 func_id, phys_addr_t buf, u32 buf_sz,
595 u32 frag_len, u32 len, u64 *handle)
596 {
597 ffa_value_t ret;
598
599 invoke_ffa_fn((ffa_value_t){
600 .a0 = func_id, .a1 = len, .a2 = frag_len,
601 .a3 = buf, .a4 = buf_sz,
602 }, &ret);
603
604 while (ret.a0 == FFA_MEM_OP_PAUSE)
605 invoke_ffa_fn((ffa_value_t){
606 .a0 = FFA_MEM_OP_RESUME,
607 .a1 = ret.a1, .a2 = ret.a2,
608 }, &ret);
609
610 if (ret.a0 == FFA_ERROR)
611 return ffa_to_linux_errno((int)ret.a2);
612
613 if (ret.a0 == FFA_SUCCESS) {
614 if (handle)
615 *handle = PACK_HANDLE(ret.a2, ret.a3);
616 } else if (ret.a0 == FFA_MEM_FRAG_RX) {
617 if (handle)
618 *handle = PACK_HANDLE(ret.a1, ret.a2);
619 } else {
620 return -EOPNOTSUPP;
621 }
622
623 return frag_len;
624 }
625
ffa_mem_next_frag(u64 handle,u32 frag_len)626 static int ffa_mem_next_frag(u64 handle, u32 frag_len)
627 {
628 ffa_value_t ret;
629
630 invoke_ffa_fn((ffa_value_t){
631 .a0 = FFA_MEM_FRAG_TX,
632 .a1 = HANDLE_LOW(handle), .a2 = HANDLE_HIGH(handle),
633 .a3 = frag_len,
634 }, &ret);
635
636 while (ret.a0 == FFA_MEM_OP_PAUSE)
637 invoke_ffa_fn((ffa_value_t){
638 .a0 = FFA_MEM_OP_RESUME,
639 .a1 = ret.a1, .a2 = ret.a2,
640 }, &ret);
641
642 if (ret.a0 == FFA_ERROR)
643 return ffa_to_linux_errno((int)ret.a2);
644
645 if (ret.a0 == FFA_MEM_FRAG_RX)
646 return ret.a3;
647 else if (ret.a0 == FFA_SUCCESS)
648 return 0;
649
650 return -EOPNOTSUPP;
651 }
652
653 static int
ffa_transmit_fragment(u32 func_id,phys_addr_t buf,u32 buf_sz,u32 frag_len,u32 len,u64 * handle,bool first)654 ffa_transmit_fragment(u32 func_id, phys_addr_t buf, u32 buf_sz, u32 frag_len,
655 u32 len, u64 *handle, bool first)
656 {
657 if (!first)
658 return ffa_mem_next_frag(*handle, frag_len);
659
660 return ffa_mem_first_frag(func_id, buf, buf_sz, frag_len, len, handle);
661 }
662
ffa_get_num_pages_sg(struct scatterlist * sg)663 static u32 ffa_get_num_pages_sg(struct scatterlist *sg)
664 {
665 u32 num_pages = 0;
666
667 do {
668 num_pages += sg->length / FFA_PAGE_SIZE;
669 } while ((sg = sg_next(sg)));
670
671 return num_pages;
672 }
673
ffa_memory_attributes_get(u32 func_id)674 static u16 ffa_memory_attributes_get(u32 func_id)
675 {
676 /*
677 * For the memory lend or donate operation, if the receiver is a PE or
678 * a proxy endpoint, the owner/sender must not specify the attributes
679 */
680 if (func_id == FFA_FN_NATIVE(MEM_LEND) ||
681 func_id == FFA_MEM_LEND)
682 return 0;
683
684 return FFA_MEM_NORMAL | FFA_MEM_WRITE_BACK | FFA_MEM_INNER_SHAREABLE;
685 }
686
ffa_emad_impdef_value_init(u32 version,void * dst,void * src)687 static void ffa_emad_impdef_value_init(u32 version, void *dst, void *src)
688 {
689 struct ffa_mem_region_attributes *ep_mem_access;
690
691 if (FFA_EMAD_HAS_IMPDEF_FIELD(version))
692 memcpy(dst, src, sizeof(ep_mem_access->impdef_val));
693 }
694
695 static void
ffa_mem_region_additional_setup(u32 version,struct ffa_mem_region * mem_region)696 ffa_mem_region_additional_setup(u32 version, struct ffa_mem_region *mem_region)
697 {
698 if (!FFA_MEM_REGION_HAS_EP_MEM_OFFSET(version)) {
699 mem_region->ep_mem_size = 0;
700 } else {
701 mem_region->ep_mem_size = ffa_emad_size_get(version);
702 mem_region->ep_mem_offset = sizeof(*mem_region);
703 memset(mem_region->reserved, 0, 12);
704 }
705 }
706
707 static int
ffa_setup_and_transmit(u32 func_id,void * buffer,u32 max_fragsize,struct ffa_mem_ops_args * args)708 ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize,
709 struct ffa_mem_ops_args *args)
710 {
711 int rc = 0;
712 bool first = true;
713 u32 composite_offset;
714 phys_addr_t addr = 0;
715 struct ffa_mem_region *mem_region = buffer;
716 struct ffa_composite_mem_region *composite;
717 struct ffa_mem_region_addr_range *constituents;
718 struct ffa_mem_region_attributes *ep_mem_access;
719 u32 idx, frag_len, length, buf_sz = 0, num_entries = sg_nents(args->sg), ep_offset;
720 u32 emad_end, emad_size = ffa_emad_size_get(drv_info->version);
721
722 mem_region->tag = args->tag;
723 mem_region->flags = args->flags;
724 mem_region->sender_id = drv_info->vm_id;
725 mem_region->attributes = ffa_memory_attributes_get(func_id);
726
727 ffa_mem_region_additional_setup(drv_info->version, mem_region);
728 composite_offset = ffa_mem_desc_offset(buffer, args->nattrs,
729 drv_info->version);
730 if (composite_offset + sizeof(*composite) > max_fragsize)
731 return -ENXIO;
732
733 for (idx = 0; idx < args->nattrs; idx++) {
734 ep_offset = ffa_mem_desc_offset(buffer, idx, drv_info->version);
735 if (check_add_overflow(ep_offset, emad_size, &emad_end))
736 return -ENXIO;
737
738 if (emad_end > max_fragsize)
739 return -ENXIO;
740
741 ep_mem_access = buffer + ep_offset;
742 memset(ep_mem_access, 0, emad_size);
743 ep_mem_access->receiver = args->attrs[idx].receiver;
744 ep_mem_access->attrs = args->attrs[idx].attrs;
745 ep_mem_access->composite_off = composite_offset;
746 ffa_emad_impdef_value_init(drv_info->version,
747 ep_mem_access->impdef_val,
748 args->attrs[idx].impdef_val);
749 }
750 mem_region->handle = 0;
751 mem_region->ep_count = args->nattrs;
752
753 composite = buffer + composite_offset;
754 composite->total_pg_cnt = ffa_get_num_pages_sg(args->sg);
755 composite->addr_range_cnt = num_entries;
756 composite->reserved = 0;
757
758 length = composite_offset + CONSTITUENTS_OFFSET(num_entries);
759 frag_len = composite_offset + CONSTITUENTS_OFFSET(0);
760 if (frag_len > max_fragsize)
761 return -ENXIO;
762
763 if (!args->use_txbuf) {
764 addr = virt_to_phys(buffer);
765 buf_sz = max_fragsize / FFA_PAGE_SIZE;
766 }
767
768 constituents = buffer + frag_len;
769 idx = 0;
770 do {
771 if (frag_len == max_fragsize) {
772 rc = ffa_transmit_fragment(func_id, addr, buf_sz,
773 frag_len, length,
774 &args->g_handle, first);
775 if (rc < 0)
776 return -ENXIO;
777
778 first = false;
779 idx = 0;
780 frag_len = 0;
781 constituents = buffer;
782 }
783
784 if ((void *)constituents + sizeof(*constituents) - buffer > max_fragsize) {
785 pr_err("Memory Region Fragment > Tx Buffer size\n");
786 return -EFAULT;
787 }
788
789 constituents->address = sg_phys(args->sg);
790 constituents->pg_cnt = args->sg->length / FFA_PAGE_SIZE;
791 constituents->reserved = 0;
792 constituents++;
793 frag_len += sizeof(*constituents);
794 } while ((args->sg = sg_next(args->sg)));
795
796 return ffa_transmit_fragment(func_id, addr, buf_sz, frag_len,
797 length, &args->g_handle, first);
798 }
799
ffa_memory_ops(u32 func_id,struct ffa_mem_ops_args * args)800 static int ffa_memory_ops(u32 func_id, struct ffa_mem_ops_args *args)
801 {
802 int ret;
803 void *buffer;
804 size_t rxtx_bufsz = drv_info->rxtx_bufsz;
805
806 if (!args->use_txbuf) {
807 buffer = alloc_pages_exact(rxtx_bufsz, GFP_KERNEL);
808 if (!buffer)
809 return -ENOMEM;
810 } else {
811 buffer = drv_info->tx_buffer;
812 mutex_lock(&drv_info->tx_lock);
813 }
814
815 ret = ffa_setup_and_transmit(func_id, buffer, rxtx_bufsz, args);
816
817 if (args->use_txbuf)
818 mutex_unlock(&drv_info->tx_lock);
819 else
820 free_pages_exact(buffer, rxtx_bufsz);
821
822 return ret < 0 ? ret : 0;
823 }
824
ffa_memory_reclaim(u64 g_handle,u32 flags)825 static int ffa_memory_reclaim(u64 g_handle, u32 flags)
826 {
827 ffa_value_t ret;
828
829 invoke_ffa_fn((ffa_value_t){
830 .a0 = FFA_MEM_RECLAIM,
831 .a1 = HANDLE_LOW(g_handle), .a2 = HANDLE_HIGH(g_handle),
832 .a3 = flags,
833 }, &ret);
834
835 if (ret.a0 == FFA_ERROR)
836 return ffa_to_linux_errno((int)ret.a2);
837
838 return 0;
839 }
840
ffa_notification_bitmap_create(void)841 static int ffa_notification_bitmap_create(void)
842 {
843 ffa_value_t ret;
844 u16 vcpu_count = nr_cpu_ids;
845
846 invoke_ffa_fn((ffa_value_t){
847 .a0 = FFA_NOTIFICATION_BITMAP_CREATE,
848 .a1 = drv_info->vm_id, .a2 = vcpu_count,
849 }, &ret);
850
851 if (ret.a0 == FFA_ERROR)
852 return ffa_to_linux_errno((int)ret.a2);
853
854 return 0;
855 }
856
ffa_notification_bitmap_destroy(void)857 static int ffa_notification_bitmap_destroy(void)
858 {
859 ffa_value_t ret;
860
861 invoke_ffa_fn((ffa_value_t){
862 .a0 = FFA_NOTIFICATION_BITMAP_DESTROY,
863 .a1 = drv_info->vm_id,
864 }, &ret);
865
866 if (ret.a0 == FFA_ERROR)
867 return ffa_to_linux_errno((int)ret.a2);
868
869 return 0;
870 }
871
872 enum notify_type {
873 SECURE_PARTITION,
874 NON_SECURE_VM,
875 SPM_FRAMEWORK,
876 NS_HYP_FRAMEWORK,
877 };
878
879 #define NOTIFICATION_LOW_MASK GENMASK(31, 0)
880 #define NOTIFICATION_HIGH_MASK GENMASK(63, 32)
881 #define NOTIFICATION_BITMAP_HIGH(x) \
882 ((u32)(FIELD_GET(NOTIFICATION_HIGH_MASK, (x))))
883 #define NOTIFICATION_BITMAP_LOW(x) \
884 ((u32)(FIELD_GET(NOTIFICATION_LOW_MASK, (x))))
885 #define PACK_NOTIFICATION_BITMAP(low, high) \
886 (FIELD_PREP(NOTIFICATION_LOW_MASK, (low)) | \
887 FIELD_PREP(NOTIFICATION_HIGH_MASK, (high)))
888
889 #define RECEIVER_VCPU_MASK GENMASK(31, 16)
890 #define PACK_NOTIFICATION_GET_RECEIVER_INFO(vcpu_r, r) \
891 (FIELD_PREP(RECEIVER_VCPU_MASK, (vcpu_r)) | \
892 FIELD_PREP(RECEIVER_ID_MASK, (r)))
893
894 #define NOTIFICATION_INFO_GET_MORE_PEND_MASK BIT(0)
895 #define NOTIFICATION_INFO_GET_ID_COUNT GENMASK(11, 7)
896 #define ID_LIST_MASK_64 GENMASK(51, 12)
897 #define ID_LIST_MASK_32 GENMASK(31, 12)
898 #define MAX_IDS_64 20
899 #define MAX_IDS_32 10
900
901 #define PER_VCPU_NOTIFICATION_FLAG BIT(0)
902 #define SECURE_PARTITION_BITMAP_ENABLE BIT(SECURE_PARTITION)
903 #define NON_SECURE_VM_BITMAP_ENABLE BIT(NON_SECURE_VM)
904 #define SPM_FRAMEWORK_BITMAP_ENABLE BIT(SPM_FRAMEWORK)
905 #define NS_HYP_FRAMEWORK_BITMAP_ENABLE BIT(NS_HYP_FRAMEWORK)
906 #define FFA_BITMAP_SECURE_ENABLE_MASK \
907 (SECURE_PARTITION_BITMAP_ENABLE | SPM_FRAMEWORK_BITMAP_ENABLE)
908 #define FFA_BITMAP_NS_ENABLE_MASK \
909 (NON_SECURE_VM_BITMAP_ENABLE | NS_HYP_FRAMEWORK_BITMAP_ENABLE)
910 #define FFA_BITMAP_ALL_ENABLE_MASK \
911 (FFA_BITMAP_SECURE_ENABLE_MASK | FFA_BITMAP_NS_ENABLE_MASK)
912
913 #define FFA_SECURE_PARTITION_ID_FLAG BIT(15)
914
915 #define SPM_FRAMEWORK_BITMAP(x) NOTIFICATION_BITMAP_LOW(x)
916 #define NS_HYP_FRAMEWORK_BITMAP(x) NOTIFICATION_BITMAP_HIGH(x)
917 #define FRAMEWORK_NOTIFY_RX_BUFFER_FULL BIT(0)
918
ffa_notification_bind_common(u16 dst_id,u64 bitmap,u32 flags,bool is_bind)919 static int ffa_notification_bind_common(u16 dst_id, u64 bitmap,
920 u32 flags, bool is_bind)
921 {
922 ffa_value_t ret;
923 u32 func, src_dst_ids = PACK_TARGET_INFO(dst_id, drv_info->vm_id);
924
925 func = is_bind ? FFA_NOTIFICATION_BIND : FFA_NOTIFICATION_UNBIND;
926
927 invoke_ffa_fn((ffa_value_t){
928 .a0 = func, .a1 = src_dst_ids, .a2 = flags,
929 .a3 = NOTIFICATION_BITMAP_LOW(bitmap),
930 .a4 = NOTIFICATION_BITMAP_HIGH(bitmap),
931 }, &ret);
932
933 if (ret.a0 == FFA_ERROR)
934 return ffa_to_linux_errno((int)ret.a2);
935 else if (ret.a0 != FFA_SUCCESS)
936 return -EINVAL;
937
938 return 0;
939 }
940
941 static
ffa_notification_set(u16 src_id,u16 dst_id,u32 flags,u64 bitmap)942 int ffa_notification_set(u16 src_id, u16 dst_id, u32 flags, u64 bitmap)
943 {
944 ffa_value_t ret;
945 u32 src_dst_ids = PACK_TARGET_INFO(dst_id, src_id);
946
947 invoke_ffa_fn((ffa_value_t) {
948 .a0 = FFA_NOTIFICATION_SET, .a1 = src_dst_ids, .a2 = flags,
949 .a3 = NOTIFICATION_BITMAP_LOW(bitmap),
950 .a4 = NOTIFICATION_BITMAP_HIGH(bitmap),
951 }, &ret);
952
953 if (ret.a0 == FFA_ERROR)
954 return ffa_to_linux_errno((int)ret.a2);
955 else if (ret.a0 != FFA_SUCCESS)
956 return -EINVAL;
957
958 return 0;
959 }
960
961 struct ffa_notify_bitmaps {
962 u64 sp_map;
963 u64 vm_map;
964 u64 arch_map;
965 };
966
ffa_notification_get(u32 flags,struct ffa_notify_bitmaps * notify)967 static int ffa_notification_get(u32 flags, struct ffa_notify_bitmaps *notify)
968 {
969 ffa_value_t ret;
970 u16 src_id = drv_info->vm_id;
971 u16 cpu_id = smp_processor_id();
972 u32 rec_vcpu_ids = PACK_NOTIFICATION_GET_RECEIVER_INFO(cpu_id, src_id);
973
974 invoke_ffa_fn((ffa_value_t){
975 .a0 = FFA_NOTIFICATION_GET, .a1 = rec_vcpu_ids, .a2 = flags,
976 }, &ret);
977
978 if (ret.a0 == FFA_ERROR)
979 return ffa_to_linux_errno((int)ret.a2);
980 else if (ret.a0 != FFA_SUCCESS)
981 return -EINVAL; /* Something else went wrong. */
982
983 if (flags & SECURE_PARTITION_BITMAP_ENABLE)
984 notify->sp_map = PACK_NOTIFICATION_BITMAP(ret.a2, ret.a3);
985 if (flags & NON_SECURE_VM_BITMAP_ENABLE)
986 notify->vm_map = PACK_NOTIFICATION_BITMAP(ret.a4, ret.a5);
987 if (flags & SPM_FRAMEWORK_BITMAP_ENABLE)
988 notify->arch_map = SPM_FRAMEWORK_BITMAP(ret.a6);
989 if (flags & NS_HYP_FRAMEWORK_BITMAP_ENABLE)
990 notify->arch_map = PACK_NOTIFICATION_BITMAP(notify->arch_map,
991 ret.a7);
992
993 return 0;
994 }
995
996 struct ffa_dev_part_info {
997 ffa_sched_recv_cb callback;
998 void *cb_data;
999 rwlock_t rw_lock;
1000 struct ffa_device *dev;
1001 struct list_head node;
1002 };
1003
__do_sched_recv_cb(u16 part_id,u16 vcpu,bool is_per_vcpu)1004 static void __do_sched_recv_cb(u16 part_id, u16 vcpu, bool is_per_vcpu)
1005 {
1006 struct ffa_dev_part_info *partition = NULL, *tmp;
1007 ffa_sched_recv_cb callback;
1008 struct list_head *phead;
1009 void *cb_data;
1010
1011 phead = xa_load(&drv_info->partition_info, part_id);
1012 if (!phead) {
1013 pr_err("%s: Invalid partition ID 0x%x\n", __func__, part_id);
1014 return;
1015 }
1016
1017 list_for_each_entry_safe(partition, tmp, phead, node) {
1018 read_lock(&partition->rw_lock);
1019 callback = partition->callback;
1020 cb_data = partition->cb_data;
1021 read_unlock(&partition->rw_lock);
1022
1023 if (callback)
1024 callback(vcpu, is_per_vcpu, cb_data);
1025 }
1026 }
1027
1028 /*
1029 * Map logical ID index to the u16 index within the packed ID list.
1030 *
1031 * For native responses (FF-A width == kernel word size), IDs are
1032 * tightly packed: idx -> idx.
1033 *
1034 * For 32-bit responses on a 64-bit kernel, each 64-bit register
1035 * contributes 4 x u16 values but only the lower 2 are defined; the
1036 * upper 2 are garbage. This mapping skips those upper halves:
1037 * 0,1,2,3,4,5,... -> 0,1,4,5,8,9,...
1038 */
list_idx_to_u16_idx(int idx,bool is_native_resp)1039 static int list_idx_to_u16_idx(int idx, bool is_native_resp)
1040 {
1041 return is_native_resp ? idx : idx + 2 * (idx >> 1);
1042 }
1043
ffa_notification_info_get(void)1044 static void ffa_notification_info_get(void)
1045 {
1046 int ids_processed, ids_count[MAX_IDS_64];
1047 int idx, list, max_ids, lists_cnt;
1048 bool is_64b_resp, is_native_resp;
1049 ffa_value_t ret;
1050 u64 id_list;
1051
1052 do {
1053 invoke_ffa_fn((ffa_value_t){
1054 .a0 = FFA_FN_NATIVE(NOTIFICATION_INFO_GET),
1055 }, &ret);
1056
1057 if (ret.a0 != FFA_FN_NATIVE(SUCCESS) && ret.a0 != FFA_SUCCESS) {
1058 if ((s32)ret.a2 != FFA_RET_NO_DATA)
1059 pr_err("Notification Info fetch failed: 0x%lx (0x%lx)",
1060 ret.a0, ret.a2);
1061 return;
1062 }
1063
1064 is_64b_resp = (ret.a0 == FFA_FN64_SUCCESS);
1065 is_native_resp = (ret.a0 == FFA_FN_NATIVE(SUCCESS));
1066
1067 ids_processed = 0;
1068 lists_cnt = FIELD_GET(NOTIFICATION_INFO_GET_ID_COUNT, ret.a2);
1069 if (is_64b_resp) {
1070 max_ids = MAX_IDS_64;
1071 id_list = FIELD_GET(ID_LIST_MASK_64, ret.a2);
1072 } else {
1073 max_ids = MAX_IDS_32;
1074 id_list = FIELD_GET(ID_LIST_MASK_32, ret.a2);
1075 }
1076
1077 for (idx = 0; idx < lists_cnt; idx++, id_list >>= 2)
1078 ids_count[idx] = (id_list & 0x3) + 1;
1079
1080 /* Process IDs */
1081 for (list = 0; list < lists_cnt; list++) {
1082 int u16_idx;
1083 u16 vcpu_id, part_id, *packed_id_list = (u16 *)&ret.a3;
1084
1085 if (ids_processed >= max_ids - 1)
1086 break;
1087
1088 u16_idx = list_idx_to_u16_idx(ids_processed,
1089 is_native_resp);
1090 part_id = packed_id_list[u16_idx];
1091 ids_processed++;
1092
1093 if (ids_count[list] == 1) { /* Global Notification */
1094 __do_sched_recv_cb(part_id, 0, false);
1095 continue;
1096 }
1097
1098 /* Per vCPU Notification */
1099 for (idx = 1; idx < ids_count[list]; idx++) {
1100 if (ids_processed >= max_ids - 1)
1101 break;
1102
1103 u16_idx = list_idx_to_u16_idx(ids_processed,
1104 is_native_resp);
1105 vcpu_id = packed_id_list[u16_idx];
1106 ids_processed++;
1107
1108 __do_sched_recv_cb(part_id, vcpu_id, true);
1109 }
1110 }
1111 } while (ret.a2 & NOTIFICATION_INFO_GET_MORE_PEND_MASK);
1112 }
1113
ffa_run(struct ffa_device * dev,u16 vcpu)1114 static int ffa_run(struct ffa_device *dev, u16 vcpu)
1115 {
1116 ffa_value_t ret;
1117 u32 target = dev->vm_id << 16 | vcpu;
1118
1119 invoke_ffa_fn((ffa_value_t){ .a0 = FFA_RUN, .a1 = target, }, &ret);
1120
1121 while (ret.a0 == FFA_INTERRUPT)
1122 invoke_ffa_fn((ffa_value_t){ .a0 = FFA_RUN, .a1 = ret.a1, },
1123 &ret);
1124
1125 if (ret.a0 == FFA_ERROR)
1126 return ffa_to_linux_errno((int)ret.a2);
1127
1128 return 0;
1129 }
1130
ffa_drvinfo_flags_init(void)1131 static void ffa_drvinfo_flags_init(void)
1132 {
1133 if (!ffa_features(FFA_FN_NATIVE(MEM_LEND), 0, NULL, NULL) ||
1134 !ffa_features(FFA_FN_NATIVE(MEM_SHARE), 0, NULL, NULL))
1135 drv_info->mem_ops_native = true;
1136
1137 if (!ffa_features(FFA_MSG_SEND_DIRECT_REQ2, 0, NULL, NULL) ||
1138 !ffa_features(FFA_MSG_SEND_DIRECT_RESP2, 0, NULL, NULL))
1139 drv_info->msg_direct_req2_supp = true;
1140 }
1141
ffa_api_version_get(void)1142 static u32 ffa_api_version_get(void)
1143 {
1144 return drv_info->version;
1145 }
1146
ffa_partition_info_get(const char * uuid_str,struct ffa_partition_info * buffer)1147 static int ffa_partition_info_get(const char *uuid_str,
1148 struct ffa_partition_info *buffer)
1149 {
1150 int count;
1151 uuid_t uuid;
1152 struct ffa_partition_info *pbuf;
1153
1154 if (!uuid_str || uuid_parse(uuid_str, &uuid)) {
1155 pr_err("invalid uuid (%s)\n", uuid_str);
1156 return -ENODEV;
1157 }
1158
1159 count = ffa_partition_probe(&uuid, &pbuf);
1160 if (count <= 0)
1161 return -ENOENT;
1162
1163 memcpy(buffer, pbuf, sizeof(*pbuf) * count);
1164 kfree(pbuf);
1165 return 0;
1166 }
1167
ffa_mode_32bit_set(struct ffa_device * dev)1168 static void ffa_mode_32bit_set(struct ffa_device *dev)
1169 {
1170 dev->mode_32bit = true;
1171 }
1172
ffa_sync_send_receive(struct ffa_device * dev,struct ffa_send_direct_data * data)1173 static int ffa_sync_send_receive(struct ffa_device *dev,
1174 struct ffa_send_direct_data *data)
1175 {
1176 return ffa_msg_send_direct_req(drv_info->vm_id, dev->vm_id,
1177 dev->mode_32bit, data);
1178 }
1179
ffa_indirect_msg_send(struct ffa_device * dev,void * buf,size_t sz)1180 static int ffa_indirect_msg_send(struct ffa_device *dev, void *buf, size_t sz)
1181 {
1182 return ffa_msg_send2(dev, drv_info->vm_id, buf, sz);
1183 }
1184
ffa_sync_send_receive2(struct ffa_device * dev,struct ffa_send_direct_data2 * data)1185 static int ffa_sync_send_receive2(struct ffa_device *dev,
1186 struct ffa_send_direct_data2 *data)
1187 {
1188 if (!drv_info->msg_direct_req2_supp)
1189 return -EOPNOTSUPP;
1190
1191 return ffa_msg_send_direct_req2(drv_info->vm_id, dev->vm_id,
1192 &dev->uuid, data);
1193 }
1194
ffa_memory_share(struct ffa_mem_ops_args * args)1195 static int ffa_memory_share(struct ffa_mem_ops_args *args)
1196 {
1197 if (drv_info->mem_ops_native)
1198 return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args);
1199
1200 return ffa_memory_ops(FFA_MEM_SHARE, args);
1201 }
1202
ffa_memory_lend(struct ffa_mem_ops_args * args)1203 static int ffa_memory_lend(struct ffa_mem_ops_args *args)
1204 {
1205 /* Note that upon a successful MEM_LEND request the caller
1206 * must ensure that the memory region specified is not accessed
1207 * until a successful MEM_RECALIM call has been made.
1208 * On systems with a hypervisor present this will been enforced,
1209 * however on systems without a hypervisor the responsibility
1210 * falls to the calling kernel driver to prevent access.
1211 */
1212 if (drv_info->mem_ops_native)
1213 return ffa_memory_ops(FFA_FN_NATIVE(MEM_LEND), args);
1214
1215 return ffa_memory_ops(FFA_MEM_LEND, args);
1216 }
1217
1218 #define ffa_notifications_disabled() (!drv_info->notif_enabled)
1219
1220 struct notifier_cb_info {
1221 struct hlist_node hnode;
1222 struct ffa_device *dev;
1223 ffa_fwk_notifier_cb fwk_cb;
1224 ffa_notifier_cb cb;
1225 void *cb_data;
1226 };
1227
1228 static int
ffa_sched_recv_cb_update(struct ffa_device * dev,ffa_sched_recv_cb callback,void * cb_data,bool is_registration)1229 ffa_sched_recv_cb_update(struct ffa_device *dev, ffa_sched_recv_cb callback,
1230 void *cb_data, bool is_registration)
1231 {
1232 struct ffa_dev_part_info *partition = NULL;
1233 struct list_head *phead;
1234 bool cb_valid;
1235
1236 if (ffa_notifications_disabled())
1237 return -EOPNOTSUPP;
1238
1239 phead = xa_load(&drv_info->partition_info, dev->vm_id);
1240 if (!phead) {
1241 pr_err("%s: Invalid partition ID 0x%x\n", __func__, dev->vm_id);
1242 return -EINVAL;
1243 }
1244
1245 list_for_each_entry(partition, phead, node)
1246 if (partition->dev == dev)
1247 break;
1248
1249 if (&partition->node == phead) {
1250 pr_err("%s: No such partition ID 0x%x\n", __func__, dev->vm_id);
1251 return -EINVAL;
1252 }
1253
1254 write_lock(&partition->rw_lock);
1255
1256 cb_valid = !!partition->callback;
1257 if (!(is_registration ^ cb_valid)) {
1258 write_unlock(&partition->rw_lock);
1259 return -EINVAL;
1260 }
1261
1262 partition->callback = callback;
1263 partition->cb_data = cb_data;
1264
1265 write_unlock(&partition->rw_lock);
1266 return 0;
1267 }
1268
ffa_sched_recv_cb_register(struct ffa_device * dev,ffa_sched_recv_cb cb,void * cb_data)1269 static int ffa_sched_recv_cb_register(struct ffa_device *dev,
1270 ffa_sched_recv_cb cb, void *cb_data)
1271 {
1272 return ffa_sched_recv_cb_update(dev, cb, cb_data, true);
1273 }
1274
ffa_sched_recv_cb_unregister(struct ffa_device * dev)1275 static int ffa_sched_recv_cb_unregister(struct ffa_device *dev)
1276 {
1277 return ffa_sched_recv_cb_update(dev, NULL, NULL, false);
1278 }
1279
ffa_notification_bind(u16 dst_id,u64 bitmap,u32 flags)1280 static int ffa_notification_bind(u16 dst_id, u64 bitmap, u32 flags)
1281 {
1282 return ffa_notification_bind_common(dst_id, bitmap, flags, true);
1283 }
1284
ffa_notification_unbind(u16 dst_id,u64 bitmap)1285 static int ffa_notification_unbind(u16 dst_id, u64 bitmap)
1286 {
1287 return ffa_notification_bind_common(dst_id, bitmap, 0, false);
1288 }
1289
ffa_notify_type_get(u16 vm_id)1290 static enum notify_type ffa_notify_type_get(u16 vm_id)
1291 {
1292 if (vm_id & FFA_SECURE_PARTITION_ID_FLAG)
1293 return SECURE_PARTITION;
1294 else
1295 return NON_SECURE_VM;
1296 }
1297
1298 /* notifier_hnode_get* should be called with notify_lock held */
1299 static struct notifier_cb_info *
notifier_hnode_get_by_vmid(u16 notify_id,int vmid)1300 notifier_hnode_get_by_vmid(u16 notify_id, int vmid)
1301 {
1302 struct notifier_cb_info *node;
1303
1304 hash_for_each_possible(drv_info->notifier_hash, node, hnode, notify_id)
1305 if (node->fwk_cb && vmid == node->dev->vm_id)
1306 return node;
1307
1308 return NULL;
1309 }
1310
1311 static struct notifier_cb_info *
notifier_hnode_get_by_vmid_uuid(u16 notify_id,int vmid,const uuid_t * uuid)1312 notifier_hnode_get_by_vmid_uuid(u16 notify_id, int vmid, const uuid_t *uuid)
1313 {
1314 struct notifier_cb_info *node;
1315
1316 if (uuid_is_null(uuid))
1317 return notifier_hnode_get_by_vmid(notify_id, vmid);
1318
1319 hash_for_each_possible(drv_info->notifier_hash, node, hnode, notify_id)
1320 if (node->fwk_cb && vmid == node->dev->vm_id &&
1321 uuid_equal(&node->dev->uuid, uuid))
1322 return node;
1323
1324 return NULL;
1325 }
1326
1327 static struct notifier_cb_info *
notifier_hnode_get_by_type(u16 notify_id,enum notify_type type)1328 notifier_hnode_get_by_type(u16 notify_id, enum notify_type type)
1329 {
1330 struct notifier_cb_info *node;
1331
1332 hash_for_each_possible(drv_info->notifier_hash, node, hnode, notify_id)
1333 if (node->cb && type == ffa_notify_type_get(node->dev->vm_id))
1334 return node;
1335
1336 return NULL;
1337 }
1338
update_notifier_cb(struct ffa_device * dev,int notify_id,struct notifier_cb_info * cb,bool is_framework)1339 static int update_notifier_cb(struct ffa_device *dev, int notify_id,
1340 struct notifier_cb_info *cb, bool is_framework)
1341 {
1342 struct notifier_cb_info *cb_info = NULL;
1343 enum notify_type type = ffa_notify_type_get(dev->vm_id);
1344 bool cb_found, is_registration = !!cb;
1345
1346 if (is_framework)
1347 cb_info = notifier_hnode_get_by_vmid_uuid(notify_id, dev->vm_id,
1348 &dev->uuid);
1349 else
1350 cb_info = notifier_hnode_get_by_type(notify_id, type);
1351
1352 cb_found = !!cb_info;
1353
1354 if (!(is_registration ^ cb_found))
1355 return -EINVAL;
1356
1357 if (is_registration) {
1358 hash_add(drv_info->notifier_hash, &cb->hnode, notify_id);
1359 } else {
1360 hash_del(&cb_info->hnode);
1361 kfree(cb_info);
1362 }
1363
1364 return 0;
1365 }
1366
__ffa_notify_relinquish(struct ffa_device * dev,int notify_id,bool is_framework)1367 static int __ffa_notify_relinquish(struct ffa_device *dev, int notify_id,
1368 bool is_framework)
1369 {
1370 int rc;
1371
1372 if (ffa_notifications_disabled())
1373 return -EOPNOTSUPP;
1374
1375 if (notify_id >= FFA_MAX_NOTIFICATIONS)
1376 return -EINVAL;
1377
1378 write_lock(&drv_info->notify_lock);
1379
1380 rc = update_notifier_cb(dev, notify_id, NULL, is_framework);
1381 if (rc) {
1382 pr_err("Could not unregister notification callback\n");
1383 write_unlock(&drv_info->notify_lock);
1384 return rc;
1385 }
1386
1387 if (!is_framework)
1388 rc = ffa_notification_unbind(dev->vm_id, BIT(notify_id));
1389
1390 write_unlock(&drv_info->notify_lock);
1391
1392 return rc;
1393 }
1394
ffa_notify_relinquish(struct ffa_device * dev,int notify_id)1395 static int ffa_notify_relinquish(struct ffa_device *dev, int notify_id)
1396 {
1397 return __ffa_notify_relinquish(dev, notify_id, false);
1398 }
1399
ffa_fwk_notify_relinquish(struct ffa_device * dev,int notify_id)1400 static int ffa_fwk_notify_relinquish(struct ffa_device *dev, int notify_id)
1401 {
1402 return __ffa_notify_relinquish(dev, notify_id, true);
1403 }
1404
__ffa_notify_request(struct ffa_device * dev,bool is_per_vcpu,void * cb,void * cb_data,int notify_id,bool is_framework)1405 static int __ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu,
1406 void *cb, void *cb_data,
1407 int notify_id, bool is_framework)
1408 {
1409 int rc;
1410 u32 flags = 0;
1411 struct notifier_cb_info *cb_info = NULL;
1412
1413 if (ffa_notifications_disabled())
1414 return -EOPNOTSUPP;
1415
1416 if (notify_id >= FFA_MAX_NOTIFICATIONS)
1417 return -EINVAL;
1418
1419 cb_info = kzalloc_obj(*cb_info);
1420 if (!cb_info)
1421 return -ENOMEM;
1422
1423 cb_info->dev = dev;
1424 cb_info->cb_data = cb_data;
1425 if (is_framework)
1426 cb_info->fwk_cb = cb;
1427 else
1428 cb_info->cb = cb;
1429
1430 write_lock(&drv_info->notify_lock);
1431
1432 if (!is_framework) {
1433 if (is_per_vcpu)
1434 flags = PER_VCPU_NOTIFICATION_FLAG;
1435
1436 rc = ffa_notification_bind(dev->vm_id, BIT(notify_id), flags);
1437 if (rc)
1438 goto out_unlock_free;
1439 }
1440
1441 rc = update_notifier_cb(dev, notify_id, cb_info, is_framework);
1442 if (rc) {
1443 pr_err("Failed to register callback for %d - %d\n",
1444 notify_id, rc);
1445 if (!is_framework)
1446 ffa_notification_unbind(dev->vm_id, BIT(notify_id));
1447 }
1448
1449 out_unlock_free:
1450 write_unlock(&drv_info->notify_lock);
1451 if (rc)
1452 kfree(cb_info);
1453
1454 return rc;
1455 }
1456
ffa_notify_request(struct ffa_device * dev,bool is_per_vcpu,ffa_notifier_cb cb,void * cb_data,int notify_id)1457 static int ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu,
1458 ffa_notifier_cb cb, void *cb_data, int notify_id)
1459 {
1460 return __ffa_notify_request(dev, is_per_vcpu, cb, cb_data, notify_id,
1461 false);
1462 }
1463
1464 static int
ffa_fwk_notify_request(struct ffa_device * dev,ffa_fwk_notifier_cb cb,void * cb_data,int notify_id)1465 ffa_fwk_notify_request(struct ffa_device *dev, ffa_fwk_notifier_cb cb,
1466 void *cb_data, int notify_id)
1467 {
1468 return __ffa_notify_request(dev, false, cb, cb_data, notify_id, true);
1469 }
1470
ffa_notify_send(struct ffa_device * dev,int notify_id,bool is_per_vcpu,u16 vcpu)1471 static int ffa_notify_send(struct ffa_device *dev, int notify_id,
1472 bool is_per_vcpu, u16 vcpu)
1473 {
1474 u32 flags = 0;
1475
1476 if (ffa_notifications_disabled())
1477 return -EOPNOTSUPP;
1478
1479 if (is_per_vcpu)
1480 flags |= (PER_VCPU_NOTIFICATION_FLAG | vcpu << 16);
1481
1482 return ffa_notification_set(dev->vm_id, drv_info->vm_id, flags,
1483 BIT(notify_id));
1484 }
1485
handle_notif_callbacks(u64 bitmap,enum notify_type type)1486 static void handle_notif_callbacks(u64 bitmap, enum notify_type type)
1487 {
1488 ffa_notifier_cb cb;
1489 void *cb_data;
1490 int notify_id;
1491
1492 for (notify_id = 0; notify_id <= FFA_MAX_NOTIFICATIONS && bitmap;
1493 notify_id++, bitmap >>= 1) {
1494 if (!(bitmap & 1))
1495 continue;
1496
1497 scoped_guard(read_lock, &drv_info->notify_lock) {
1498 struct notifier_cb_info *cb_info;
1499
1500 cb_info = notifier_hnode_get_by_type(notify_id, type);
1501 cb = cb_info ? cb_info->cb : NULL;
1502 cb_data = cb_info ? cb_info->cb_data : NULL;
1503 }
1504
1505 if (cb)
1506 cb(notify_id, cb_data);
1507 }
1508 }
1509
handle_fwk_notif_callbacks(u32 bitmap)1510 static void handle_fwk_notif_callbacks(u32 bitmap)
1511 {
1512 void *buf;
1513 uuid_t uuid;
1514 void *fwk_cb_data;
1515 int notify_id = 0, target;
1516 ffa_fwk_notifier_cb fwk_cb;
1517 struct ffa_indirect_msg_hdr *msg;
1518 size_t min_offset = offsetof(struct ffa_indirect_msg_hdr, uuid);
1519
1520 /* Only one framework notification defined and supported for now */
1521 if (!(bitmap & FRAMEWORK_NOTIFY_RX_BUFFER_FULL))
1522 return;
1523
1524 scoped_guard(mutex, &drv_info->rx_lock) {
1525 u32 offset, size;
1526
1527 msg = drv_info->rx_buffer;
1528 offset = msg->offset;
1529 size = msg->size;
1530
1531 if (!size || (offset != min_offset && offset < sizeof(*msg)) ||
1532 offset > drv_info->rxtx_bufsz ||
1533 size > drv_info->rxtx_bufsz - offset) {
1534 pr_err("invalid framework notification message\n");
1535 ffa_rx_release();
1536 return;
1537 }
1538
1539 buf = kmemdup((void *)msg + offset, size, GFP_KERNEL);
1540 if (!buf) {
1541 ffa_rx_release();
1542 return;
1543 }
1544
1545 target = SENDER_ID(msg->send_recv_id);
1546 if (offset >= sizeof(*msg))
1547 uuid_copy(&uuid, &msg->uuid);
1548 else
1549 uuid_copy(&uuid, &uuid_null);
1550 ffa_rx_release();
1551 }
1552
1553 scoped_guard(read_lock, &drv_info->notify_lock) {
1554 struct notifier_cb_info *cb_info;
1555
1556 cb_info = notifier_hnode_get_by_vmid_uuid(notify_id, target,
1557 &uuid);
1558 fwk_cb = cb_info ? cb_info->fwk_cb : NULL;
1559 fwk_cb_data = cb_info ? cb_info->cb_data : NULL;
1560 }
1561
1562 if (fwk_cb)
1563 fwk_cb(notify_id, fwk_cb_data, buf);
1564 kfree(buf);
1565 }
1566
notif_get_and_handle(void * cb_data)1567 static void notif_get_and_handle(void *cb_data)
1568 {
1569 int rc;
1570 u32 flags;
1571 struct ffa_drv_info *info = cb_data;
1572 struct ffa_notify_bitmaps bitmaps = { 0 };
1573
1574 if (info->vm_id == 0) /* Non secure physical instance */
1575 flags = FFA_BITMAP_SECURE_ENABLE_MASK;
1576 else
1577 flags = FFA_BITMAP_ALL_ENABLE_MASK;
1578
1579 rc = ffa_notification_get(flags, &bitmaps);
1580 if (rc) {
1581 pr_err("Failed to retrieve notifications with %d!\n", rc);
1582 return;
1583 }
1584
1585 handle_fwk_notif_callbacks(SPM_FRAMEWORK_BITMAP(bitmaps.arch_map));
1586 handle_fwk_notif_callbacks(NS_HYP_FRAMEWORK_BITMAP(bitmaps.arch_map));
1587 handle_notif_callbacks(bitmaps.vm_map, NON_SECURE_VM);
1588 handle_notif_callbacks(bitmaps.sp_map, SECURE_PARTITION);
1589 }
1590
1591 static void
ffa_self_notif_handle(u16 vcpu,bool is_per_vcpu,void * cb_data)1592 ffa_self_notif_handle(u16 vcpu, bool is_per_vcpu, void *cb_data)
1593 {
1594 struct ffa_drv_info *info = cb_data;
1595
1596 if (!is_per_vcpu)
1597 notif_get_and_handle(info);
1598 else
1599 smp_call_function_single(vcpu, notif_get_and_handle, info, 0);
1600 }
1601
notif_pcpu_irq_work_fn(struct work_struct * work)1602 static void notif_pcpu_irq_work_fn(struct work_struct *work)
1603 {
1604 struct ffa_pcpu_irq *pcpu = container_of(work, struct ffa_pcpu_irq,
1605 notif_pcpu_work);
1606 struct ffa_drv_info *info = pcpu->info;
1607
1608 notif_get_and_handle(info);
1609 }
1610
1611 static const struct ffa_info_ops ffa_drv_info_ops = {
1612 .api_version_get = ffa_api_version_get,
1613 .partition_info_get = ffa_partition_info_get,
1614 };
1615
1616 static const struct ffa_msg_ops ffa_drv_msg_ops = {
1617 .mode_32bit_set = ffa_mode_32bit_set,
1618 .sync_send_receive = ffa_sync_send_receive,
1619 .indirect_send = ffa_indirect_msg_send,
1620 .sync_send_receive2 = ffa_sync_send_receive2,
1621 };
1622
1623 static const struct ffa_mem_ops ffa_drv_mem_ops = {
1624 .memory_reclaim = ffa_memory_reclaim,
1625 .memory_share = ffa_memory_share,
1626 .memory_lend = ffa_memory_lend,
1627 };
1628
1629 static const struct ffa_cpu_ops ffa_drv_cpu_ops = {
1630 .run = ffa_run,
1631 };
1632
1633 static const struct ffa_notifier_ops ffa_drv_notifier_ops = {
1634 .sched_recv_cb_register = ffa_sched_recv_cb_register,
1635 .sched_recv_cb_unregister = ffa_sched_recv_cb_unregister,
1636 .notify_request = ffa_notify_request,
1637 .notify_relinquish = ffa_notify_relinquish,
1638 .fwk_notify_request = ffa_fwk_notify_request,
1639 .fwk_notify_relinquish = ffa_fwk_notify_relinquish,
1640 .notify_send = ffa_notify_send,
1641 };
1642
1643 static const struct ffa_ops ffa_drv_ops = {
1644 .info_ops = &ffa_drv_info_ops,
1645 .msg_ops = &ffa_drv_msg_ops,
1646 .mem_ops = &ffa_drv_mem_ops,
1647 .cpu_ops = &ffa_drv_cpu_ops,
1648 .notifier_ops = &ffa_drv_notifier_ops,
1649 };
1650
ffa_device_match_uuid(struct ffa_device * ffa_dev,const uuid_t * uuid)1651 void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid)
1652 {
1653 int count, idx;
1654 struct ffa_partition_info *pbuf, *tpbuf;
1655
1656 count = ffa_partition_probe(uuid, &pbuf);
1657 if (count <= 0)
1658 return;
1659
1660 for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++)
1661 if (tpbuf->id == ffa_dev->vm_id)
1662 uuid_copy(&ffa_dev->uuid, uuid);
1663 kfree(pbuf);
1664 }
1665
1666 static int
ffa_bus_notifier(struct notifier_block * nb,unsigned long action,void * data)1667 ffa_bus_notifier(struct notifier_block *nb, unsigned long action, void *data)
1668 {
1669 struct device *dev = data;
1670 struct ffa_device *fdev = to_ffa_dev(dev);
1671
1672 if (action == BUS_NOTIFY_BIND_DRIVER) {
1673 struct ffa_driver *ffa_drv = to_ffa_driver(dev->driver);
1674 const struct ffa_device_id *id_table = ffa_drv->id_table;
1675
1676 /*
1677 * FF-A v1.1 provides UUID for each partition as part of the
1678 * discovery API, the discovered UUID must be populated in the
1679 * device's UUID and there is no need to workaround by copying
1680 * the same from the driver table.
1681 */
1682 if (uuid_is_null(&fdev->uuid))
1683 ffa_device_match_uuid(fdev, &id_table->uuid);
1684
1685 return NOTIFY_OK;
1686 }
1687
1688 return NOTIFY_DONE;
1689 }
1690
1691 static struct notifier_block ffa_bus_nb = {
1692 .notifier_call = ffa_bus_notifier,
1693 };
1694
ffa_bus_notifier_unregister(void)1695 static void ffa_bus_notifier_unregister(void)
1696 {
1697 if (!drv_info->bus_notifier_registered)
1698 return;
1699
1700 bus_unregister_notifier(&ffa_bus_type, &ffa_bus_nb);
1701 drv_info->bus_notifier_registered = false;
1702 }
1703
ffa_xa_add_partition_info(struct ffa_device * dev)1704 static int ffa_xa_add_partition_info(struct ffa_device *dev)
1705 {
1706 struct ffa_dev_part_info *info;
1707 struct list_head *head, *phead;
1708 int ret = -ENOMEM;
1709
1710 phead = xa_load(&drv_info->partition_info, dev->vm_id);
1711 if (phead) {
1712 head = phead;
1713 list_for_each_entry(info, head, node) {
1714 if (info->dev == dev) {
1715 pr_err("%s: duplicate dev %p part ID 0x%x\n",
1716 __func__, dev, dev->vm_id);
1717 return -EEXIST;
1718 }
1719 }
1720 }
1721
1722 info = kzalloc_obj(*info);
1723 if (!info)
1724 return ret;
1725
1726 rwlock_init(&info->rw_lock);
1727 info->dev = dev;
1728
1729 if (!phead) {
1730 phead = kzalloc_obj(*phead);
1731 if (!phead)
1732 goto free_out;
1733
1734 INIT_LIST_HEAD(phead);
1735
1736 ret = xa_insert(&drv_info->partition_info, dev->vm_id, phead,
1737 GFP_KERNEL);
1738 if (ret) {
1739 pr_err("%s: failed to save part ID 0x%x Ret:%d\n",
1740 __func__, dev->vm_id, ret);
1741 goto free_out;
1742 }
1743 }
1744 list_add(&info->node, phead);
1745 return 0;
1746
1747 free_out:
1748 kfree(phead);
1749 kfree(info);
1750 return ret;
1751 }
1752
ffa_setup_host_partition(int vm_id)1753 static int ffa_setup_host_partition(int vm_id)
1754 {
1755 struct ffa_partition_info buf = { 0 };
1756 struct ffa_device *ffa_dev;
1757 int ret;
1758
1759 buf.id = vm_id;
1760 ffa_dev = ffa_device_register(&buf, &ffa_drv_ops, &ffa_pdev->dev);
1761 if (!ffa_dev) {
1762 pr_err("%s: failed to register host partition ID 0x%x\n",
1763 __func__, vm_id);
1764 return -EINVAL;
1765 }
1766
1767 ret = ffa_xa_add_partition_info(ffa_dev);
1768 if (ret)
1769 return ret;
1770
1771 if (ffa_notifications_disabled())
1772 return 0;
1773
1774 ret = ffa_sched_recv_cb_update(ffa_dev, ffa_self_notif_handle,
1775 drv_info, true);
1776 if (ret)
1777 pr_info("Failed to register driver sched callback %d\n", ret);
1778
1779 return ret;
1780 }
1781
ffa_partitions_cleanup(void)1782 static void ffa_partitions_cleanup(void)
1783 {
1784 struct list_head *phead;
1785 unsigned long idx;
1786
1787 ffa_bus_notifier_unregister();
1788
1789 /* Clean up/free all registered devices */
1790 ffa_devices_unregister();
1791
1792 xa_for_each(&drv_info->partition_info, idx, phead) {
1793 struct ffa_dev_part_info *info, *tmp;
1794
1795 xa_erase(&drv_info->partition_info, idx);
1796 list_for_each_entry_safe(info, tmp, phead, node) {
1797 list_del(&info->node);
1798 kfree(info);
1799 }
1800 kfree(phead);
1801 }
1802
1803 xa_destroy(&drv_info->partition_info);
1804 }
1805
ffa_setup_partitions(void)1806 static int ffa_setup_partitions(void)
1807 {
1808 int count, idx, ret;
1809 struct ffa_device *ffa_dev;
1810 struct ffa_partition_info *pbuf, *tpbuf;
1811
1812 if (!FFA_PART_INFO_HAS_UUID_IN_RESP(drv_info->version)) {
1813 ret = bus_register_notifier(&ffa_bus_type, &ffa_bus_nb);
1814 if (ret)
1815 pr_err("Failed to register FF-A bus notifiers\n");
1816 else
1817 drv_info->bus_notifier_registered = true;
1818 }
1819
1820 count = ffa_partition_probe(&uuid_null, &pbuf);
1821 if (count <= 0) {
1822 pr_info("%s: No partitions found, error %d\n", __func__, count);
1823 ffa_bus_notifier_unregister();
1824 return -EINVAL;
1825 }
1826
1827 xa_init(&drv_info->partition_info);
1828 for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++) {
1829 /* Note that if the UUID will be uuid_null, that will require
1830 * ffa_bus_notifier() to find the UUID of this partition id
1831 * with help of ffa_device_match_uuid(). FF-A v1.1 and above
1832 * provides UUID here for each partition as part of the
1833 * discovery API and the same is passed.
1834 */
1835 ffa_dev = ffa_device_register(tpbuf, &ffa_drv_ops,
1836 &ffa_pdev->dev);
1837 if (!ffa_dev) {
1838 pr_err("%s: failed to register partition ID 0x%x\n",
1839 __func__, tpbuf->id);
1840 continue;
1841 }
1842
1843 if (FFA_PART_INFO_HAS_EXEC_STATE_IN_RESP(drv_info->version) &&
1844 !(tpbuf->properties & FFA_PARTITION_AARCH64_EXEC))
1845 ffa_mode_32bit_set(ffa_dev);
1846
1847 if (ffa_xa_add_partition_info(ffa_dev)) {
1848 ffa_device_unregister(ffa_dev);
1849 continue;
1850 }
1851 }
1852
1853 kfree(pbuf);
1854
1855 /*
1856 * Check if the host is already added as part of partition info
1857 * No multiple UUID possible for the host, so just checking if
1858 * there is an entry will suffice
1859 */
1860 if (xa_load(&drv_info->partition_info, drv_info->vm_id))
1861 return 0;
1862
1863 /* Allocate for the host */
1864 ret = ffa_setup_host_partition(drv_info->vm_id);
1865 if (ret)
1866 ffa_partitions_cleanup();
1867
1868 return ret;
1869 }
1870
1871 /* FFA FEATURE IDs */
1872 #define FFA_FEAT_NOTIFICATION_PENDING_INT (1)
1873 #define FFA_FEAT_SCHEDULE_RECEIVER_INT (2)
1874 #define FFA_FEAT_MANAGED_EXIT_INT (3)
1875
ffa_sched_recv_irq_handler(int irq,void * irq_data)1876 static irqreturn_t ffa_sched_recv_irq_handler(int irq, void *irq_data)
1877 {
1878 struct ffa_pcpu_irq *pcpu = irq_data;
1879 struct ffa_drv_info *info = pcpu->info;
1880
1881 queue_work(info->notif_pcpu_wq, &info->sched_recv_irq_work);
1882
1883 return IRQ_HANDLED;
1884 }
1885
notif_pend_irq_handler(int irq,void * irq_data)1886 static irqreturn_t notif_pend_irq_handler(int irq, void *irq_data)
1887 {
1888 struct ffa_pcpu_irq *pcpu = irq_data;
1889 struct ffa_drv_info *info = pcpu->info;
1890
1891 queue_work_on(smp_processor_id(), info->notif_pcpu_wq,
1892 &pcpu->notif_pcpu_work);
1893
1894 return IRQ_HANDLED;
1895 }
1896
ffa_sched_recv_irq_work_fn(struct work_struct * work)1897 static void ffa_sched_recv_irq_work_fn(struct work_struct *work)
1898 {
1899 ffa_notification_info_get();
1900 }
1901
ffa_irq_map(u32 id)1902 static int ffa_irq_map(u32 id)
1903 {
1904 char *err_str;
1905 int ret, irq, intid;
1906
1907 if (id == FFA_FEAT_NOTIFICATION_PENDING_INT)
1908 err_str = "Notification Pending Interrupt";
1909 else if (id == FFA_FEAT_SCHEDULE_RECEIVER_INT)
1910 err_str = "Schedule Receiver Interrupt";
1911 else
1912 err_str = "Unknown ID";
1913
1914 /* The returned intid is assumed to be SGI donated to NS world */
1915 ret = ffa_features(id, 0, &intid, NULL);
1916 if (ret < 0) {
1917 if (ret != -EOPNOTSUPP)
1918 pr_err("Failed to retrieve FF-A %s %u\n", err_str, id);
1919 return ret;
1920 }
1921
1922 if (acpi_disabled) {
1923 struct of_phandle_args oirq = {};
1924 struct device_node *gic;
1925
1926 /* Only GICv3 supported currently with the device tree */
1927 gic = of_find_compatible_node(NULL, NULL, "arm,gic-v3");
1928 if (!gic)
1929 return -ENXIO;
1930
1931 oirq.np = gic;
1932 oirq.args_count = 1;
1933 oirq.args[0] = intid;
1934 irq = irq_create_of_mapping(&oirq);
1935 of_node_put(gic);
1936 #ifdef CONFIG_ACPI
1937 } else {
1938 irq = acpi_register_gsi(NULL, intid, ACPI_EDGE_SENSITIVE,
1939 ACPI_ACTIVE_HIGH);
1940 #endif
1941 }
1942
1943 if (irq <= 0) {
1944 pr_err("Failed to create IRQ mapping!\n");
1945 return -ENODATA;
1946 }
1947
1948 return irq;
1949 }
1950
ffa_irq_unmap(unsigned int irq)1951 static void ffa_irq_unmap(unsigned int irq)
1952 {
1953 if (!irq)
1954 return;
1955 irq_dispose_mapping(irq);
1956 }
1957
ffa_cpuhp_pcpu_irq_enable(unsigned int cpu)1958 static int ffa_cpuhp_pcpu_irq_enable(unsigned int cpu)
1959 {
1960 if (drv_info->sched_recv_irq)
1961 enable_percpu_irq(drv_info->sched_recv_irq, IRQ_TYPE_NONE);
1962 if (drv_info->notif_pend_irq)
1963 enable_percpu_irq(drv_info->notif_pend_irq, IRQ_TYPE_NONE);
1964 return 0;
1965 }
1966
ffa_cpuhp_pcpu_irq_disable(unsigned int cpu)1967 static int ffa_cpuhp_pcpu_irq_disable(unsigned int cpu)
1968 {
1969 if (drv_info->sched_recv_irq)
1970 disable_percpu_irq(drv_info->sched_recv_irq);
1971 if (drv_info->notif_pend_irq)
1972 disable_percpu_irq(drv_info->notif_pend_irq);
1973 return 0;
1974 }
1975
ffa_uninit_pcpu_irq(void)1976 static void ffa_uninit_pcpu_irq(void)
1977 {
1978 if (drv_info->cpuhp_state) {
1979 cpuhp_remove_state(drv_info->cpuhp_state);
1980 drv_info->cpuhp_state = 0;
1981 }
1982
1983 if (drv_info->notif_pcpu_wq) {
1984 destroy_workqueue(drv_info->notif_pcpu_wq);
1985 drv_info->notif_pcpu_wq = NULL;
1986 }
1987
1988 if (drv_info->sched_recv_irq)
1989 free_percpu_irq(drv_info->sched_recv_irq, drv_info->irq_pcpu);
1990
1991 if (drv_info->notif_pend_irq)
1992 free_percpu_irq(drv_info->notif_pend_irq, drv_info->irq_pcpu);
1993
1994 if (drv_info->irq_pcpu) {
1995 free_percpu(drv_info->irq_pcpu);
1996 drv_info->irq_pcpu = NULL;
1997 }
1998 }
1999
ffa_init_pcpu_irq(void)2000 static int ffa_init_pcpu_irq(void)
2001 {
2002 struct ffa_pcpu_irq __percpu *irq_pcpu;
2003 int ret, cpu;
2004
2005 irq_pcpu = alloc_percpu(struct ffa_pcpu_irq);
2006 if (!irq_pcpu)
2007 return -ENOMEM;
2008
2009 for_each_present_cpu(cpu) {
2010 per_cpu_ptr(irq_pcpu, cpu)->info = drv_info;
2011 INIT_WORK(&per_cpu_ptr(irq_pcpu, cpu)->notif_pcpu_work,
2012 notif_pcpu_irq_work_fn);
2013 }
2014
2015 drv_info->irq_pcpu = irq_pcpu;
2016
2017 if (drv_info->sched_recv_irq) {
2018 ret = request_percpu_irq(drv_info->sched_recv_irq,
2019 ffa_sched_recv_irq_handler,
2020 "ARM-FFA-SRI", irq_pcpu);
2021 if (ret) {
2022 pr_err("Error registering percpu SRI nIRQ %d : %d\n",
2023 drv_info->sched_recv_irq, ret);
2024 drv_info->sched_recv_irq = 0;
2025 return ret;
2026 }
2027 }
2028
2029 if (drv_info->notif_pend_irq) {
2030 ret = request_percpu_irq(drv_info->notif_pend_irq,
2031 notif_pend_irq_handler,
2032 "ARM-FFA-NPI", irq_pcpu);
2033 if (ret) {
2034 pr_err("Error registering percpu NPI nIRQ %d : %d\n",
2035 drv_info->notif_pend_irq, ret);
2036 drv_info->notif_pend_irq = 0;
2037 return ret;
2038 }
2039 }
2040
2041 INIT_WORK(&drv_info->sched_recv_irq_work, ffa_sched_recv_irq_work_fn);
2042 drv_info->notif_pcpu_wq = create_workqueue("ffa_pcpu_irq_notification");
2043 if (!drv_info->notif_pcpu_wq)
2044 return -EINVAL;
2045
2046 ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "ffa/pcpu-irq:starting",
2047 ffa_cpuhp_pcpu_irq_enable,
2048 ffa_cpuhp_pcpu_irq_disable);
2049
2050 if (ret < 0)
2051 return ret;
2052
2053 drv_info->cpuhp_state = ret;
2054 return 0;
2055 }
2056
ffa_notifications_cleanup(void)2057 static void ffa_notifications_cleanup(void)
2058 {
2059 ffa_uninit_pcpu_irq();
2060 ffa_irq_unmap(drv_info->sched_recv_irq);
2061 drv_info->sched_recv_irq = 0;
2062 ffa_irq_unmap(drv_info->notif_pend_irq);
2063 drv_info->notif_pend_irq = 0;
2064
2065 if (drv_info->bitmap_created) {
2066 ffa_notification_bitmap_destroy();
2067 drv_info->bitmap_created = false;
2068 }
2069 drv_info->notif_enabled = false;
2070 }
2071
ffa_notifications_setup(void)2072 static void ffa_notifications_setup(void)
2073 {
2074 int ret;
2075
2076 ret = ffa_features(FFA_NOTIFICATION_BITMAP_CREATE, 0, NULL, NULL);
2077 if (!ret) {
2078 ret = ffa_notification_bitmap_create();
2079 if (ret) {
2080 pr_err("Notification bitmap create error %d\n", ret);
2081 return;
2082 }
2083
2084 drv_info->bitmap_created = true;
2085 }
2086
2087 ret = ffa_irq_map(FFA_FEAT_SCHEDULE_RECEIVER_INT);
2088 if (ret > 0)
2089 drv_info->sched_recv_irq = ret;
2090
2091 ret = ffa_irq_map(FFA_FEAT_NOTIFICATION_PENDING_INT);
2092 if (ret > 0)
2093 drv_info->notif_pend_irq = ret;
2094
2095 if (!drv_info->sched_recv_irq && !drv_info->notif_pend_irq)
2096 goto cleanup;
2097
2098 ret = ffa_init_pcpu_irq();
2099 if (ret)
2100 goto cleanup;
2101
2102 hash_init(drv_info->notifier_hash);
2103 rwlock_init(&drv_info->notify_lock);
2104
2105 drv_info->notif_enabled = true;
2106 return;
2107 cleanup:
2108 pr_info("Notification setup failed %d, not enabled\n", ret);
2109 ffa_notifications_cleanup();
2110 }
2111
ffa_probe(struct platform_device * pdev)2112 static int ffa_probe(struct platform_device *pdev)
2113 {
2114 int ret;
2115 u32 buf_sz;
2116 size_t rxtx_min_bufsz = SZ_4K, rxtx_max_bufsz = 0, rxtx_bufsz;
2117
2118 if (IS_BUILTIN(CONFIG_ARM_FFA_TRANSPORT) &&
2119 is_protected_kvm_enabled() && !is_pkvm_initialized())
2120 return -EPROBE_DEFER;
2121
2122 ret = ffa_transport_init(&invoke_ffa_fn);
2123 if (ret)
2124 return ret == -EOPNOTSUPP ? -ENODEV : ret;
2125
2126 drv_info = kzalloc_obj(*drv_info);
2127 if (!drv_info)
2128 return -ENOMEM;
2129 platform_set_drvdata(pdev, drv_info);
2130
2131 ret = ffa_version_check(&drv_info->version);
2132 if (ret) {
2133 if (ret == -EOPNOTSUPP)
2134 ret = -ENODEV;
2135 goto free_drv_info;
2136 }
2137
2138 if (ffa_id_get(&drv_info->vm_id)) {
2139 pr_err("failed to obtain VM id for self\n");
2140 ret = -ENODEV;
2141 goto free_drv_info;
2142 }
2143
2144 ret = ffa_features(FFA_FN_NATIVE(RXTX_MAP), 0, &buf_sz, NULL);
2145 if (!ret) {
2146 if (RXTX_MAP_MIN_BUFSZ(buf_sz) == 1)
2147 rxtx_min_bufsz = SZ_64K;
2148 else if (RXTX_MAP_MIN_BUFSZ(buf_sz) == 2)
2149 rxtx_min_bufsz = SZ_16K;
2150 else
2151 rxtx_min_bufsz = SZ_4K;
2152
2153 rxtx_max_bufsz = RXTX_MAP_MAX_BUFSZ(buf_sz) * SZ_4K;
2154 if (rxtx_max_bufsz != 0 && rxtx_max_bufsz < rxtx_min_bufsz)
2155 rxtx_max_bufsz = rxtx_min_bufsz;
2156 }
2157
2158 rxtx_bufsz = min_not_zero(PAGE_ALIGN(rxtx_min_bufsz), rxtx_max_bufsz);
2159 drv_info->rx_buffer = alloc_pages_exact(rxtx_bufsz, GFP_KERNEL);
2160 if (!drv_info->rx_buffer) {
2161 ret = -ENOMEM;
2162 goto free_drv_info;
2163 }
2164
2165 drv_info->tx_buffer = alloc_pages_exact(rxtx_bufsz, GFP_KERNEL);
2166 if (!drv_info->tx_buffer) {
2167 ret = -ENOMEM;
2168 goto free_pages;
2169 }
2170
2171 ret = ffa_rxtx_map(virt_to_phys(drv_info->tx_buffer),
2172 virt_to_phys(drv_info->rx_buffer),
2173 rxtx_bufsz / FFA_PAGE_SIZE);
2174 if (ret == -EINVAL && !rxtx_max_bufsz && rxtx_min_bufsz < rxtx_bufsz) {
2175 rxtx_bufsz = rxtx_min_bufsz;
2176 ret = ffa_rxtx_map(virt_to_phys(drv_info->tx_buffer),
2177 virt_to_phys(drv_info->rx_buffer),
2178 rxtx_bufsz / FFA_PAGE_SIZE);
2179 }
2180 if (ret) {
2181 pr_err("failed to register FFA RxTx buffers\n");
2182 goto free_pages;
2183 }
2184 drv_info->rxtx_bufsz = rxtx_bufsz;
2185
2186 mutex_init(&drv_info->rx_lock);
2187 mutex_init(&drv_info->tx_lock);
2188
2189 ffa_drvinfo_flags_init();
2190
2191 ffa_notifications_setup();
2192
2193 ret = ffa_setup_partitions();
2194 if (!ret)
2195 return ret;
2196
2197 pr_err("failed to setup partitions\n");
2198 ffa_notifications_cleanup();
2199 ffa_rxtx_unmap();
2200 free_pages:
2201 if (drv_info->tx_buffer)
2202 free_pages_exact(drv_info->tx_buffer, rxtx_bufsz);
2203 free_pages_exact(drv_info->rx_buffer, rxtx_bufsz);
2204 free_drv_info:
2205 platform_set_drvdata(pdev, NULL);
2206 kfree(drv_info);
2207 drv_info = NULL;
2208 return ret;
2209 }
2210
ffa_remove(struct platform_device * pdev)2211 static void ffa_remove(struct platform_device *pdev)
2212 {
2213 struct ffa_drv_info *info = platform_get_drvdata(pdev);
2214
2215 ffa_notifications_cleanup();
2216 ffa_partitions_cleanup();
2217 ffa_rxtx_unmap();
2218 free_pages_exact(info->tx_buffer, info->rxtx_bufsz);
2219 free_pages_exact(info->rx_buffer, info->rxtx_bufsz);
2220 kfree(info);
2221 platform_set_drvdata(pdev, NULL);
2222 drv_info = NULL;
2223 }
2224
2225 static struct platform_driver ffa_driver = {
2226 .probe = ffa_probe,
2227 .remove = ffa_remove,
2228 .driver = {
2229 .name = FFA_PLATFORM_NAME,
2230 },
2231 };
2232
ffa_init(void)2233 static int __init ffa_init(void)
2234 {
2235 int ret;
2236
2237 ffa_pdev = platform_device_register_simple(FFA_PLATFORM_NAME,
2238 PLATFORM_DEVID_NONE,
2239 NULL, 0);
2240 if (IS_ERR(ffa_pdev))
2241 return PTR_ERR(ffa_pdev);
2242
2243 ret = platform_driver_register(&ffa_driver);
2244 if (ret)
2245 platform_device_unregister(ffa_pdev);
2246
2247 return ret;
2248 }
2249 module_init(ffa_init);
2250
ffa_exit(void)2251 static void __exit ffa_exit(void)
2252 {
2253 platform_device_unregister(ffa_pdev);
2254 platform_driver_unregister(&ffa_driver);
2255 }
2256 module_exit(ffa_exit);
2257
2258 MODULE_ALIAS("arm-ffa");
2259 MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
2260 MODULE_DESCRIPTION("Arm FF-A interface driver");
2261 MODULE_LICENSE("GPL v2");
2262