GNU Linux-libre 5.4.241-gnu1
[releases.git] / drivers / tee / tee_core.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2015-2016, Linaro Limited
4  */
5
6 #define pr_fmt(fmt) "%s: " fmt, __func__
7
8 #include <linux/cdev.h>
9 #include <linux/fs.h>
10 #include <linux/idr.h>
11 #include <linux/module.h>
12 #include <linux/slab.h>
13 #include <linux/tee_drv.h>
14 #include <linux/uaccess.h>
15 #include "tee_private.h"
16
17 #define TEE_NUM_DEVICES 32
18
19 #define TEE_IOCTL_PARAM_SIZE(x) (sizeof(struct tee_param) * (x))
20
21 /*
22  * Unprivileged devices in the lower half range and privileged devices in
23  * the upper half range.
24  */
25 static DECLARE_BITMAP(dev_mask, TEE_NUM_DEVICES);
26 static DEFINE_SPINLOCK(driver_lock);
27
28 static struct class *tee_class;
29 static dev_t tee_devt;
30
31 struct tee_context *teedev_open(struct tee_device *teedev)
32 {
33         int rc;
34         struct tee_context *ctx;
35
36         if (!tee_device_get(teedev))
37                 return ERR_PTR(-EINVAL);
38
39         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
40         if (!ctx) {
41                 rc = -ENOMEM;
42                 goto err;
43         }
44
45         kref_init(&ctx->refcount);
46         ctx->teedev = teedev;
47         INIT_LIST_HEAD(&ctx->list_shm);
48         rc = teedev->desc->ops->open(ctx);
49         if (rc)
50                 goto err;
51
52         return ctx;
53 err:
54         kfree(ctx);
55         tee_device_put(teedev);
56         return ERR_PTR(rc);
57
58 }
59 EXPORT_SYMBOL_GPL(teedev_open);
60
61 void teedev_ctx_get(struct tee_context *ctx)
62 {
63         if (ctx->releasing)
64                 return;
65
66         kref_get(&ctx->refcount);
67 }
68
69 static void teedev_ctx_release(struct kref *ref)
70 {
71         struct tee_context *ctx = container_of(ref, struct tee_context,
72                                                refcount);
73         ctx->releasing = true;
74         ctx->teedev->desc->ops->release(ctx);
75         kfree(ctx);
76 }
77
78 void teedev_ctx_put(struct tee_context *ctx)
79 {
80         if (ctx->releasing)
81                 return;
82
83         kref_put(&ctx->refcount, teedev_ctx_release);
84 }
85
86 void teedev_close_context(struct tee_context *ctx)
87 {
88         struct tee_device *teedev = ctx->teedev;
89
90         teedev_ctx_put(ctx);
91         tee_device_put(teedev);
92 }
93 EXPORT_SYMBOL_GPL(teedev_close_context);
94
95 static int tee_open(struct inode *inode, struct file *filp)
96 {
97         struct tee_context *ctx;
98
99         ctx = teedev_open(container_of(inode->i_cdev, struct tee_device, cdev));
100         if (IS_ERR(ctx))
101                 return PTR_ERR(ctx);
102
103         /*
104          * Default user-space behaviour is to wait for tee-supplicant
105          * if not present for any requests in this context.
106          */
107         ctx->supp_nowait = false;
108         filp->private_data = ctx;
109         return 0;
110 }
111
112 static int tee_release(struct inode *inode, struct file *filp)
113 {
114         teedev_close_context(filp->private_data);
115         return 0;
116 }
117
118 static int tee_ioctl_version(struct tee_context *ctx,
119                              struct tee_ioctl_version_data __user *uvers)
120 {
121         struct tee_ioctl_version_data vers;
122
123         ctx->teedev->desc->ops->get_version(ctx->teedev, &vers);
124
125         if (ctx->teedev->desc->flags & TEE_DESC_PRIVILEGED)
126                 vers.gen_caps |= TEE_GEN_CAP_PRIVILEGED;
127
128         if (copy_to_user(uvers, &vers, sizeof(vers)))
129                 return -EFAULT;
130
131         return 0;
132 }
133
134 static int tee_ioctl_shm_alloc(struct tee_context *ctx,
135                                struct tee_ioctl_shm_alloc_data __user *udata)
136 {
137         long ret;
138         struct tee_ioctl_shm_alloc_data data;
139         struct tee_shm *shm;
140
141         if (copy_from_user(&data, udata, sizeof(data)))
142                 return -EFAULT;
143
144         /* Currently no input flags are supported */
145         if (data.flags)
146                 return -EINVAL;
147
148         shm = tee_shm_alloc(ctx, data.size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF);
149         if (IS_ERR(shm))
150                 return PTR_ERR(shm);
151
152         data.id = shm->id;
153         data.flags = shm->flags;
154         data.size = shm->size;
155
156         if (copy_to_user(udata, &data, sizeof(data)))
157                 ret = -EFAULT;
158         else
159                 ret = tee_shm_get_fd(shm);
160
161         /*
162          * When user space closes the file descriptor the shared memory
163          * should be freed or if tee_shm_get_fd() failed then it will
164          * be freed immediately.
165          */
166         tee_shm_put(shm);
167         return ret;
168 }
169
170 static int
171 tee_ioctl_shm_register(struct tee_context *ctx,
172                        struct tee_ioctl_shm_register_data __user *udata)
173 {
174         long ret;
175         struct tee_ioctl_shm_register_data data;
176         struct tee_shm *shm;
177
178         if (copy_from_user(&data, udata, sizeof(data)))
179                 return -EFAULT;
180
181         /* Currently no input flags are supported */
182         if (data.flags)
183                 return -EINVAL;
184
185         if (!access_ok((void __user *)(unsigned long)data.addr, data.length))
186                 return -EFAULT;
187
188         shm = tee_shm_register(ctx, data.addr, data.length,
189                                TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED);
190         if (IS_ERR(shm))
191                 return PTR_ERR(shm);
192
193         data.id = shm->id;
194         data.flags = shm->flags;
195         data.length = shm->size;
196
197         if (copy_to_user(udata, &data, sizeof(data)))
198                 ret = -EFAULT;
199         else
200                 ret = tee_shm_get_fd(shm);
201         /*
202          * When user space closes the file descriptor the shared memory
203          * should be freed or if tee_shm_get_fd() failed then it will
204          * be freed immediately.
205          */
206         tee_shm_put(shm);
207         return ret;
208 }
209
210 static int params_from_user(struct tee_context *ctx, struct tee_param *params,
211                             size_t num_params,
212                             struct tee_ioctl_param __user *uparams)
213 {
214         size_t n;
215
216         for (n = 0; n < num_params; n++) {
217                 struct tee_shm *shm;
218                 struct tee_ioctl_param ip;
219
220                 if (copy_from_user(&ip, uparams + n, sizeof(ip)))
221                         return -EFAULT;
222
223                 /* All unused attribute bits has to be zero */
224                 if (ip.attr & ~TEE_IOCTL_PARAM_ATTR_MASK)
225                         return -EINVAL;
226
227                 params[n].attr = ip.attr;
228                 switch (ip.attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) {
229                 case TEE_IOCTL_PARAM_ATTR_TYPE_NONE:
230                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
231                         break;
232                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT:
233                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
234                         params[n].u.value.a = ip.a;
235                         params[n].u.value.b = ip.b;
236                         params[n].u.value.c = ip.c;
237                         break;
238                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT:
239                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
240                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
241                         /*
242                          * If we fail to get a pointer to a shared memory
243                          * object (and increase the ref count) from an
244                          * identifier we return an error. All pointers that
245                          * has been added in params have an increased ref
246                          * count. It's the callers responibility to do
247                          * tee_shm_put() on all resolved pointers.
248                          */
249                         shm = tee_shm_get_from_id(ctx, ip.c);
250                         if (IS_ERR(shm))
251                                 return PTR_ERR(shm);
252
253                         /*
254                          * Ensure offset + size does not overflow offset
255                          * and does not overflow the size of the referred
256                          * shared memory object.
257                          */
258                         if ((ip.a + ip.b) < ip.a ||
259                             (ip.a + ip.b) > shm->size) {
260                                 tee_shm_put(shm);
261                                 return -EINVAL;
262                         }
263
264                         params[n].u.memref.shm_offs = ip.a;
265                         params[n].u.memref.size = ip.b;
266                         params[n].u.memref.shm = shm;
267                         break;
268                 default:
269                         /* Unknown attribute */
270                         return -EINVAL;
271                 }
272         }
273         return 0;
274 }
275
276 static int params_to_user(struct tee_ioctl_param __user *uparams,
277                           size_t num_params, struct tee_param *params)
278 {
279         size_t n;
280
281         for (n = 0; n < num_params; n++) {
282                 struct tee_ioctl_param __user *up = uparams + n;
283                 struct tee_param *p = params + n;
284
285                 switch (p->attr) {
286                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
287                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
288                         if (put_user(p->u.value.a, &up->a) ||
289                             put_user(p->u.value.b, &up->b) ||
290                             put_user(p->u.value.c, &up->c))
291                                 return -EFAULT;
292                         break;
293                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
294                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
295                         if (put_user((u64)p->u.memref.size, &up->b))
296                                 return -EFAULT;
297                 default:
298                         break;
299                 }
300         }
301         return 0;
302 }
303
304 static int tee_ioctl_open_session(struct tee_context *ctx,
305                                   struct tee_ioctl_buf_data __user *ubuf)
306 {
307         int rc;
308         size_t n;
309         struct tee_ioctl_buf_data buf;
310         struct tee_ioctl_open_session_arg __user *uarg;
311         struct tee_ioctl_open_session_arg arg;
312         struct tee_ioctl_param __user *uparams = NULL;
313         struct tee_param *params = NULL;
314         bool have_session = false;
315
316         if (!ctx->teedev->desc->ops->open_session)
317                 return -EINVAL;
318
319         if (copy_from_user(&buf, ubuf, sizeof(buf)))
320                 return -EFAULT;
321
322         if (buf.buf_len > TEE_MAX_ARG_SIZE ||
323             buf.buf_len < sizeof(struct tee_ioctl_open_session_arg))
324                 return -EINVAL;
325
326         uarg = u64_to_user_ptr(buf.buf_ptr);
327         if (copy_from_user(&arg, uarg, sizeof(arg)))
328                 return -EFAULT;
329
330         if (sizeof(arg) + TEE_IOCTL_PARAM_SIZE(arg.num_params) != buf.buf_len)
331                 return -EINVAL;
332
333         if (arg.num_params) {
334                 params = kcalloc(arg.num_params, sizeof(struct tee_param),
335                                  GFP_KERNEL);
336                 if (!params)
337                         return -ENOMEM;
338                 uparams = uarg->params;
339                 rc = params_from_user(ctx, params, arg.num_params, uparams);
340                 if (rc)
341                         goto out;
342         }
343
344         rc = ctx->teedev->desc->ops->open_session(ctx, &arg, params);
345         if (rc)
346                 goto out;
347         have_session = true;
348
349         if (put_user(arg.session, &uarg->session) ||
350             put_user(arg.ret, &uarg->ret) ||
351             put_user(arg.ret_origin, &uarg->ret_origin)) {
352                 rc = -EFAULT;
353                 goto out;
354         }
355         rc = params_to_user(uparams, arg.num_params, params);
356 out:
357         /*
358          * If we've succeeded to open the session but failed to communicate
359          * it back to user space, close the session again to avoid leakage.
360          */
361         if (rc && have_session && ctx->teedev->desc->ops->close_session)
362                 ctx->teedev->desc->ops->close_session(ctx, arg.session);
363
364         if (params) {
365                 /* Decrease ref count for all valid shared memory pointers */
366                 for (n = 0; n < arg.num_params; n++)
367                         if (tee_param_is_memref(params + n) &&
368                             params[n].u.memref.shm)
369                                 tee_shm_put(params[n].u.memref.shm);
370                 kfree(params);
371         }
372
373         return rc;
374 }
375
376 static int tee_ioctl_invoke(struct tee_context *ctx,
377                             struct tee_ioctl_buf_data __user *ubuf)
378 {
379         int rc;
380         size_t n;
381         struct tee_ioctl_buf_data buf;
382         struct tee_ioctl_invoke_arg __user *uarg;
383         struct tee_ioctl_invoke_arg arg;
384         struct tee_ioctl_param __user *uparams = NULL;
385         struct tee_param *params = NULL;
386
387         if (!ctx->teedev->desc->ops->invoke_func)
388                 return -EINVAL;
389
390         if (copy_from_user(&buf, ubuf, sizeof(buf)))
391                 return -EFAULT;
392
393         if (buf.buf_len > TEE_MAX_ARG_SIZE ||
394             buf.buf_len < sizeof(struct tee_ioctl_invoke_arg))
395                 return -EINVAL;
396
397         uarg = u64_to_user_ptr(buf.buf_ptr);
398         if (copy_from_user(&arg, uarg, sizeof(arg)))
399                 return -EFAULT;
400
401         if (sizeof(arg) + TEE_IOCTL_PARAM_SIZE(arg.num_params) != buf.buf_len)
402                 return -EINVAL;
403
404         if (arg.num_params) {
405                 params = kcalloc(arg.num_params, sizeof(struct tee_param),
406                                  GFP_KERNEL);
407                 if (!params)
408                         return -ENOMEM;
409                 uparams = uarg->params;
410                 rc = params_from_user(ctx, params, arg.num_params, uparams);
411                 if (rc)
412                         goto out;
413         }
414
415         rc = ctx->teedev->desc->ops->invoke_func(ctx, &arg, params);
416         if (rc)
417                 goto out;
418
419         if (put_user(arg.ret, &uarg->ret) ||
420             put_user(arg.ret_origin, &uarg->ret_origin)) {
421                 rc = -EFAULT;
422                 goto out;
423         }
424         rc = params_to_user(uparams, arg.num_params, params);
425 out:
426         if (params) {
427                 /* Decrease ref count for all valid shared memory pointers */
428                 for (n = 0; n < arg.num_params; n++)
429                         if (tee_param_is_memref(params + n) &&
430                             params[n].u.memref.shm)
431                                 tee_shm_put(params[n].u.memref.shm);
432                 kfree(params);
433         }
434         return rc;
435 }
436
437 static int tee_ioctl_cancel(struct tee_context *ctx,
438                             struct tee_ioctl_cancel_arg __user *uarg)
439 {
440         struct tee_ioctl_cancel_arg arg;
441
442         if (!ctx->teedev->desc->ops->cancel_req)
443                 return -EINVAL;
444
445         if (copy_from_user(&arg, uarg, sizeof(arg)))
446                 return -EFAULT;
447
448         return ctx->teedev->desc->ops->cancel_req(ctx, arg.cancel_id,
449                                                   arg.session);
450 }
451
452 static int
453 tee_ioctl_close_session(struct tee_context *ctx,
454                         struct tee_ioctl_close_session_arg __user *uarg)
455 {
456         struct tee_ioctl_close_session_arg arg;
457
458         if (!ctx->teedev->desc->ops->close_session)
459                 return -EINVAL;
460
461         if (copy_from_user(&arg, uarg, sizeof(arg)))
462                 return -EFAULT;
463
464         return ctx->teedev->desc->ops->close_session(ctx, arg.session);
465 }
466
467 static int params_to_supp(struct tee_context *ctx,
468                           struct tee_ioctl_param __user *uparams,
469                           size_t num_params, struct tee_param *params)
470 {
471         size_t n;
472
473         for (n = 0; n < num_params; n++) {
474                 struct tee_ioctl_param ip;
475                 struct tee_param *p = params + n;
476
477                 ip.attr = p->attr;
478                 switch (p->attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) {
479                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT:
480                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
481                         ip.a = p->u.value.a;
482                         ip.b = p->u.value.b;
483                         ip.c = p->u.value.c;
484                         break;
485                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT:
486                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
487                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
488                         ip.b = p->u.memref.size;
489                         if (!p->u.memref.shm) {
490                                 ip.a = 0;
491                                 ip.c = (u64)-1; /* invalid shm id */
492                                 break;
493                         }
494                         ip.a = p->u.memref.shm_offs;
495                         ip.c = p->u.memref.shm->id;
496                         break;
497                 default:
498                         ip.a = 0;
499                         ip.b = 0;
500                         ip.c = 0;
501                         break;
502                 }
503
504                 if (copy_to_user(uparams + n, &ip, sizeof(ip)))
505                         return -EFAULT;
506         }
507
508         return 0;
509 }
510
511 static int tee_ioctl_supp_recv(struct tee_context *ctx,
512                                struct tee_ioctl_buf_data __user *ubuf)
513 {
514         int rc;
515         struct tee_ioctl_buf_data buf;
516         struct tee_iocl_supp_recv_arg __user *uarg;
517         struct tee_param *params;
518         u32 num_params;
519         u32 func;
520
521         if (!ctx->teedev->desc->ops->supp_recv)
522                 return -EINVAL;
523
524         if (copy_from_user(&buf, ubuf, sizeof(buf)))
525                 return -EFAULT;
526
527         if (buf.buf_len > TEE_MAX_ARG_SIZE ||
528             buf.buf_len < sizeof(struct tee_iocl_supp_recv_arg))
529                 return -EINVAL;
530
531         uarg = u64_to_user_ptr(buf.buf_ptr);
532         if (get_user(num_params, &uarg->num_params))
533                 return -EFAULT;
534
535         if (sizeof(*uarg) + TEE_IOCTL_PARAM_SIZE(num_params) != buf.buf_len)
536                 return -EINVAL;
537
538         params = kcalloc(num_params, sizeof(struct tee_param), GFP_KERNEL);
539         if (!params)
540                 return -ENOMEM;
541
542         rc = params_from_user(ctx, params, num_params, uarg->params);
543         if (rc)
544                 goto out;
545
546         rc = ctx->teedev->desc->ops->supp_recv(ctx, &func, &num_params, params);
547         if (rc)
548                 goto out;
549
550         if (put_user(func, &uarg->func) ||
551             put_user(num_params, &uarg->num_params)) {
552                 rc = -EFAULT;
553                 goto out;
554         }
555
556         rc = params_to_supp(ctx, uarg->params, num_params, params);
557 out:
558         kfree(params);
559         return rc;
560 }
561
562 static int params_from_supp(struct tee_param *params, size_t num_params,
563                             struct tee_ioctl_param __user *uparams)
564 {
565         size_t n;
566
567         for (n = 0; n < num_params; n++) {
568                 struct tee_param *p = params + n;
569                 struct tee_ioctl_param ip;
570
571                 if (copy_from_user(&ip, uparams + n, sizeof(ip)))
572                         return -EFAULT;
573
574                 /* All unused attribute bits has to be zero */
575                 if (ip.attr & ~TEE_IOCTL_PARAM_ATTR_MASK)
576                         return -EINVAL;
577
578                 p->attr = ip.attr;
579                 switch (ip.attr & TEE_IOCTL_PARAM_ATTR_TYPE_MASK) {
580                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT:
581                 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT:
582                         /* Only out and in/out values can be updated */
583                         p->u.value.a = ip.a;
584                         p->u.value.b = ip.b;
585                         p->u.value.c = ip.c;
586                         break;
587                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT:
588                 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT:
589                         /*
590                          * Only the size of the memref can be updated.
591                          * Since we don't have access to the original
592                          * parameters here, only store the supplied size.
593                          * The driver will copy the updated size into the
594                          * original parameters.
595                          */
596                         p->u.memref.shm = NULL;
597                         p->u.memref.shm_offs = 0;
598                         p->u.memref.size = ip.b;
599                         break;
600                 default:
601                         memset(&p->u, 0, sizeof(p->u));
602                         break;
603                 }
604         }
605         return 0;
606 }
607
608 static int tee_ioctl_supp_send(struct tee_context *ctx,
609                                struct tee_ioctl_buf_data __user *ubuf)
610 {
611         long rc;
612         struct tee_ioctl_buf_data buf;
613         struct tee_iocl_supp_send_arg __user *uarg;
614         struct tee_param *params;
615         u32 num_params;
616         u32 ret;
617
618         /* Not valid for this driver */
619         if (!ctx->teedev->desc->ops->supp_send)
620                 return -EINVAL;
621
622         if (copy_from_user(&buf, ubuf, sizeof(buf)))
623                 return -EFAULT;
624
625         if (buf.buf_len > TEE_MAX_ARG_SIZE ||
626             buf.buf_len < sizeof(struct tee_iocl_supp_send_arg))
627                 return -EINVAL;
628
629         uarg = u64_to_user_ptr(buf.buf_ptr);
630         if (get_user(ret, &uarg->ret) ||
631             get_user(num_params, &uarg->num_params))
632                 return -EFAULT;
633
634         if (sizeof(*uarg) + TEE_IOCTL_PARAM_SIZE(num_params) > buf.buf_len)
635                 return -EINVAL;
636
637         params = kcalloc(num_params, sizeof(struct tee_param), GFP_KERNEL);
638         if (!params)
639                 return -ENOMEM;
640
641         rc = params_from_supp(params, num_params, uarg->params);
642         if (rc)
643                 goto out;
644
645         rc = ctx->teedev->desc->ops->supp_send(ctx, ret, num_params, params);
646 out:
647         kfree(params);
648         return rc;
649 }
650
651 static long tee_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
652 {
653         struct tee_context *ctx = filp->private_data;
654         void __user *uarg = (void __user *)arg;
655
656         switch (cmd) {
657         case TEE_IOC_VERSION:
658                 return tee_ioctl_version(ctx, uarg);
659         case TEE_IOC_SHM_ALLOC:
660                 return tee_ioctl_shm_alloc(ctx, uarg);
661         case TEE_IOC_SHM_REGISTER:
662                 return tee_ioctl_shm_register(ctx, uarg);
663         case TEE_IOC_OPEN_SESSION:
664                 return tee_ioctl_open_session(ctx, uarg);
665         case TEE_IOC_INVOKE:
666                 return tee_ioctl_invoke(ctx, uarg);
667         case TEE_IOC_CANCEL:
668                 return tee_ioctl_cancel(ctx, uarg);
669         case TEE_IOC_CLOSE_SESSION:
670                 return tee_ioctl_close_session(ctx, uarg);
671         case TEE_IOC_SUPPL_RECV:
672                 return tee_ioctl_supp_recv(ctx, uarg);
673         case TEE_IOC_SUPPL_SEND:
674                 return tee_ioctl_supp_send(ctx, uarg);
675         default:
676                 return -EINVAL;
677         }
678 }
679
680 static const struct file_operations tee_fops = {
681         .owner = THIS_MODULE,
682         .open = tee_open,
683         .release = tee_release,
684         .unlocked_ioctl = tee_ioctl,
685         .compat_ioctl = tee_ioctl,
686 };
687
688 static void tee_release_device(struct device *dev)
689 {
690         struct tee_device *teedev = container_of(dev, struct tee_device, dev);
691
692         spin_lock(&driver_lock);
693         clear_bit(teedev->id, dev_mask);
694         spin_unlock(&driver_lock);
695         mutex_destroy(&teedev->mutex);
696         idr_destroy(&teedev->idr);
697         kfree(teedev);
698 }
699
700 /**
701  * tee_device_alloc() - Allocate a new struct tee_device instance
702  * @teedesc:    Descriptor for this driver
703  * @dev:        Parent device for this device
704  * @pool:       Shared memory pool, NULL if not used
705  * @driver_data: Private driver data for this device
706  *
707  * Allocates a new struct tee_device instance. The device is
708  * removed by tee_device_unregister().
709  *
710  * @returns a pointer to a 'struct tee_device' or an ERR_PTR on failure
711  */
712 struct tee_device *tee_device_alloc(const struct tee_desc *teedesc,
713                                     struct device *dev,
714                                     struct tee_shm_pool *pool,
715                                     void *driver_data)
716 {
717         struct tee_device *teedev;
718         void *ret;
719         int rc, max_id;
720         int offs = 0;
721
722         if (!teedesc || !teedesc->name || !teedesc->ops ||
723             !teedesc->ops->get_version || !teedesc->ops->open ||
724             !teedesc->ops->release || !pool)
725                 return ERR_PTR(-EINVAL);
726
727         teedev = kzalloc(sizeof(*teedev), GFP_KERNEL);
728         if (!teedev) {
729                 ret = ERR_PTR(-ENOMEM);
730                 goto err;
731         }
732
733         max_id = TEE_NUM_DEVICES / 2;
734
735         if (teedesc->flags & TEE_DESC_PRIVILEGED) {
736                 offs = TEE_NUM_DEVICES / 2;
737                 max_id = TEE_NUM_DEVICES;
738         }
739
740         spin_lock(&driver_lock);
741         teedev->id = find_next_zero_bit(dev_mask, max_id, offs);
742         if (teedev->id < max_id)
743                 set_bit(teedev->id, dev_mask);
744         spin_unlock(&driver_lock);
745
746         if (teedev->id >= max_id) {
747                 ret = ERR_PTR(-ENOMEM);
748                 goto err;
749         }
750
751         snprintf(teedev->name, sizeof(teedev->name), "tee%s%d",
752                  teedesc->flags & TEE_DESC_PRIVILEGED ? "priv" : "",
753                  teedev->id - offs);
754
755         teedev->dev.class = tee_class;
756         teedev->dev.release = tee_release_device;
757         teedev->dev.parent = dev;
758
759         teedev->dev.devt = MKDEV(MAJOR(tee_devt), teedev->id);
760
761         rc = dev_set_name(&teedev->dev, "%s", teedev->name);
762         if (rc) {
763                 ret = ERR_PTR(rc);
764                 goto err_devt;
765         }
766
767         cdev_init(&teedev->cdev, &tee_fops);
768         teedev->cdev.owner = teedesc->owner;
769         teedev->cdev.kobj.parent = &teedev->dev.kobj;
770
771         dev_set_drvdata(&teedev->dev, driver_data);
772         device_initialize(&teedev->dev);
773
774         /* 1 as tee_device_unregister() does one final tee_device_put() */
775         teedev->num_users = 1;
776         init_completion(&teedev->c_no_users);
777         mutex_init(&teedev->mutex);
778         idr_init(&teedev->idr);
779
780         teedev->desc = teedesc;
781         teedev->pool = pool;
782
783         return teedev;
784 err_devt:
785         unregister_chrdev_region(teedev->dev.devt, 1);
786 err:
787         pr_err("could not register %s driver\n",
788                teedesc->flags & TEE_DESC_PRIVILEGED ? "privileged" : "client");
789         if (teedev && teedev->id < TEE_NUM_DEVICES) {
790                 spin_lock(&driver_lock);
791                 clear_bit(teedev->id, dev_mask);
792                 spin_unlock(&driver_lock);
793         }
794         kfree(teedev);
795         return ret;
796 }
797 EXPORT_SYMBOL_GPL(tee_device_alloc);
798
799 static ssize_t implementation_id_show(struct device *dev,
800                                       struct device_attribute *attr, char *buf)
801 {
802         struct tee_device *teedev = container_of(dev, struct tee_device, dev);
803         struct tee_ioctl_version_data vers;
804
805         teedev->desc->ops->get_version(teedev, &vers);
806         return scnprintf(buf, PAGE_SIZE, "%d\n", vers.impl_id);
807 }
808 static DEVICE_ATTR_RO(implementation_id);
809
810 static struct attribute *tee_dev_attrs[] = {
811         &dev_attr_implementation_id.attr,
812         NULL
813 };
814
815 static const struct attribute_group tee_dev_group = {
816         .attrs = tee_dev_attrs,
817 };
818
819 /**
820  * tee_device_register() - Registers a TEE device
821  * @teedev:     Device to register
822  *
823  * tee_device_unregister() need to be called to remove the @teedev if
824  * this function fails.
825  *
826  * @returns < 0 on failure
827  */
828 int tee_device_register(struct tee_device *teedev)
829 {
830         int rc;
831
832         if (teedev->flags & TEE_DEVICE_FLAG_REGISTERED) {
833                 dev_err(&teedev->dev, "attempt to register twice\n");
834                 return -EINVAL;
835         }
836
837         rc = cdev_add(&teedev->cdev, teedev->dev.devt, 1);
838         if (rc) {
839                 dev_err(&teedev->dev,
840                         "unable to cdev_add() %s, major %d, minor %d, err=%d\n",
841                         teedev->name, MAJOR(teedev->dev.devt),
842                         MINOR(teedev->dev.devt), rc);
843                 return rc;
844         }
845
846         rc = device_add(&teedev->dev);
847         if (rc) {
848                 dev_err(&teedev->dev,
849                         "unable to device_add() %s, major %d, minor %d, err=%d\n",
850                         teedev->name, MAJOR(teedev->dev.devt),
851                         MINOR(teedev->dev.devt), rc);
852                 goto err_device_add;
853         }
854
855         rc = sysfs_create_group(&teedev->dev.kobj, &tee_dev_group);
856         if (rc) {
857                 dev_err(&teedev->dev,
858                         "failed to create sysfs attributes, err=%d\n", rc);
859                 goto err_sysfs_create_group;
860         }
861
862         teedev->flags |= TEE_DEVICE_FLAG_REGISTERED;
863         return 0;
864
865 err_sysfs_create_group:
866         device_del(&teedev->dev);
867 err_device_add:
868         cdev_del(&teedev->cdev);
869         return rc;
870 }
871 EXPORT_SYMBOL_GPL(tee_device_register);
872
873 void tee_device_put(struct tee_device *teedev)
874 {
875         mutex_lock(&teedev->mutex);
876         /* Shouldn't put in this state */
877         if (!WARN_ON(!teedev->desc)) {
878                 teedev->num_users--;
879                 if (!teedev->num_users) {
880                         teedev->desc = NULL;
881                         complete(&teedev->c_no_users);
882                 }
883         }
884         mutex_unlock(&teedev->mutex);
885 }
886
887 bool tee_device_get(struct tee_device *teedev)
888 {
889         mutex_lock(&teedev->mutex);
890         if (!teedev->desc) {
891                 mutex_unlock(&teedev->mutex);
892                 return false;
893         }
894         teedev->num_users++;
895         mutex_unlock(&teedev->mutex);
896         return true;
897 }
898
899 /**
900  * tee_device_unregister() - Removes a TEE device
901  * @teedev:     Device to unregister
902  *
903  * This function should be called to remove the @teedev even if
904  * tee_device_register() hasn't been called yet. Does nothing if
905  * @teedev is NULL.
906  */
907 void tee_device_unregister(struct tee_device *teedev)
908 {
909         if (!teedev)
910                 return;
911
912         if (teedev->flags & TEE_DEVICE_FLAG_REGISTERED) {
913                 sysfs_remove_group(&teedev->dev.kobj, &tee_dev_group);
914                 cdev_del(&teedev->cdev);
915                 device_del(&teedev->dev);
916         }
917
918         tee_device_put(teedev);
919         wait_for_completion(&teedev->c_no_users);
920
921         /*
922          * No need to take a mutex any longer now since teedev->desc was
923          * set to NULL before teedev->c_no_users was completed.
924          */
925
926         teedev->pool = NULL;
927
928         put_device(&teedev->dev);
929 }
930 EXPORT_SYMBOL_GPL(tee_device_unregister);
931
932 /**
933  * tee_get_drvdata() - Return driver_data pointer
934  * @teedev:     Device containing the driver_data pointer
935  * @returns the driver_data pointer supplied to tee_register().
936  */
937 void *tee_get_drvdata(struct tee_device *teedev)
938 {
939         return dev_get_drvdata(&teedev->dev);
940 }
941 EXPORT_SYMBOL_GPL(tee_get_drvdata);
942
943 struct match_dev_data {
944         struct tee_ioctl_version_data *vers;
945         const void *data;
946         int (*match)(struct tee_ioctl_version_data *, const void *);
947 };
948
949 static int match_dev(struct device *dev, const void *data)
950 {
951         const struct match_dev_data *match_data = data;
952         struct tee_device *teedev = container_of(dev, struct tee_device, dev);
953
954         teedev->desc->ops->get_version(teedev, match_data->vers);
955         return match_data->match(match_data->vers, match_data->data);
956 }
957
958 struct tee_context *
959 tee_client_open_context(struct tee_context *start,
960                         int (*match)(struct tee_ioctl_version_data *,
961                                      const void *),
962                         const void *data, struct tee_ioctl_version_data *vers)
963 {
964         struct device *dev = NULL;
965         struct device *put_dev = NULL;
966         struct tee_context *ctx = NULL;
967         struct tee_ioctl_version_data v;
968         struct match_dev_data match_data = { vers ? vers : &v, data, match };
969
970         if (start)
971                 dev = &start->teedev->dev;
972
973         do {
974                 dev = class_find_device(tee_class, dev, &match_data, match_dev);
975                 if (!dev) {
976                         ctx = ERR_PTR(-ENOENT);
977                         break;
978                 }
979
980                 put_device(put_dev);
981                 put_dev = dev;
982
983                 ctx = teedev_open(container_of(dev, struct tee_device, dev));
984         } while (IS_ERR(ctx) && PTR_ERR(ctx) != -ENOMEM);
985
986         put_device(put_dev);
987         /*
988          * Default behaviour for in kernel client is to not wait for
989          * tee-supplicant if not present for any requests in this context.
990          * Also this flag could be configured again before call to
991          * tee_client_open_session() if any in kernel client requires
992          * different behaviour.
993          */
994         if (!IS_ERR(ctx))
995                 ctx->supp_nowait = true;
996
997         return ctx;
998 }
999 EXPORT_SYMBOL_GPL(tee_client_open_context);
1000
1001 void tee_client_close_context(struct tee_context *ctx)
1002 {
1003         teedev_close_context(ctx);
1004 }
1005 EXPORT_SYMBOL_GPL(tee_client_close_context);
1006
1007 void tee_client_get_version(struct tee_context *ctx,
1008                             struct tee_ioctl_version_data *vers)
1009 {
1010         ctx->teedev->desc->ops->get_version(ctx->teedev, vers);
1011 }
1012 EXPORT_SYMBOL_GPL(tee_client_get_version);
1013
1014 int tee_client_open_session(struct tee_context *ctx,
1015                             struct tee_ioctl_open_session_arg *arg,
1016                             struct tee_param *param)
1017 {
1018         if (!ctx->teedev->desc->ops->open_session)
1019                 return -EINVAL;
1020         return ctx->teedev->desc->ops->open_session(ctx, arg, param);
1021 }
1022 EXPORT_SYMBOL_GPL(tee_client_open_session);
1023
1024 int tee_client_close_session(struct tee_context *ctx, u32 session)
1025 {
1026         if (!ctx->teedev->desc->ops->close_session)
1027                 return -EINVAL;
1028         return ctx->teedev->desc->ops->close_session(ctx, session);
1029 }
1030 EXPORT_SYMBOL_GPL(tee_client_close_session);
1031
1032 int tee_client_invoke_func(struct tee_context *ctx,
1033                            struct tee_ioctl_invoke_arg *arg,
1034                            struct tee_param *param)
1035 {
1036         if (!ctx->teedev->desc->ops->invoke_func)
1037                 return -EINVAL;
1038         return ctx->teedev->desc->ops->invoke_func(ctx, arg, param);
1039 }
1040 EXPORT_SYMBOL_GPL(tee_client_invoke_func);
1041
1042 int tee_client_cancel_req(struct tee_context *ctx,
1043                           struct tee_ioctl_cancel_arg *arg)
1044 {
1045         if (!ctx->teedev->desc->ops->cancel_req)
1046                 return -EINVAL;
1047         return ctx->teedev->desc->ops->cancel_req(ctx, arg->cancel_id,
1048                                                   arg->session);
1049 }
1050
1051 static int tee_client_device_match(struct device *dev,
1052                                    struct device_driver *drv)
1053 {
1054         const struct tee_client_device_id *id_table;
1055         struct tee_client_device *tee_device;
1056
1057         id_table = to_tee_client_driver(drv)->id_table;
1058         tee_device = to_tee_client_device(dev);
1059
1060         while (!uuid_is_null(&id_table->uuid)) {
1061                 if (uuid_equal(&tee_device->id.uuid, &id_table->uuid))
1062                         return 1;
1063                 id_table++;
1064         }
1065
1066         return 0;
1067 }
1068
1069 static int tee_client_device_uevent(struct device *dev,
1070                                     struct kobj_uevent_env *env)
1071 {
1072         uuid_t *dev_id = &to_tee_client_device(dev)->id.uuid;
1073
1074         return add_uevent_var(env, "MODALIAS=tee:%pUb", dev_id);
1075 }
1076
1077 struct bus_type tee_bus_type = {
1078         .name           = "tee",
1079         .match          = tee_client_device_match,
1080         .uevent         = tee_client_device_uevent,
1081 };
1082 EXPORT_SYMBOL_GPL(tee_bus_type);
1083
1084 static int __init tee_init(void)
1085 {
1086         int rc;
1087
1088         tee_class = class_create(THIS_MODULE, "tee");
1089         if (IS_ERR(tee_class)) {
1090                 pr_err("couldn't create class\n");
1091                 return PTR_ERR(tee_class);
1092         }
1093
1094         rc = alloc_chrdev_region(&tee_devt, 0, TEE_NUM_DEVICES, "tee");
1095         if (rc) {
1096                 pr_err("failed to allocate char dev region\n");
1097                 goto out_unreg_class;
1098         }
1099
1100         rc = bus_register(&tee_bus_type);
1101         if (rc) {
1102                 pr_err("failed to register tee bus\n");
1103                 goto out_unreg_chrdev;
1104         }
1105
1106         return 0;
1107
1108 out_unreg_chrdev:
1109         unregister_chrdev_region(tee_devt, TEE_NUM_DEVICES);
1110 out_unreg_class:
1111         class_destroy(tee_class);
1112         tee_class = NULL;
1113
1114         return rc;
1115 }
1116
1117 static void __exit tee_exit(void)
1118 {
1119         bus_unregister(&tee_bus_type);
1120         unregister_chrdev_region(tee_devt, TEE_NUM_DEVICES);
1121         class_destroy(tee_class);
1122         tee_class = NULL;
1123 }
1124
1125 subsys_initcall(tee_init);
1126 module_exit(tee_exit);
1127
1128 MODULE_AUTHOR("Linaro");
1129 MODULE_DESCRIPTION("TEE Driver");
1130 MODULE_VERSION("1.0");
1131 MODULE_LICENSE("GPL v2");