2 * Copyright (c) 2015, Linaro Limited
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 #include <linux/arm-smccc.h>
18 #include <linux/errno.h>
20 #include <linux/module.h>
22 #include <linux/of_platform.h>
23 #include <linux/platform_device.h>
24 #include <linux/slab.h>
25 #include <linux/string.h>
26 #include <linux/tee_drv.h>
27 #include <linux/types.h>
28 #include <linux/uaccess.h>
29 #include "optee_private.h"
30 #include "optee_smc.h"
33 #define DRIVER_NAME "optee"
35 #define OPTEE_SHM_NUM_PRIV_PAGES CONFIG_OPTEE_SHM_NUM_PRIV_PAGES
38 * optee_from_msg_param() - convert from OPTEE_MSG parameters to
40 * @params: subsystem internal parameter representation
41 * @num_params: number of elements in the parameter arrays
42 * @msg_params: OPTEE_MSG parameters
43 * Returns 0 on success or <0 on failure
45 int optee_from_msg_param(struct tee_param
*params
, size_t num_params
,
46 const struct optee_msg_param
*msg_params
)
53 for (n
= 0; n
< num_params
; n
++) {
54 struct tee_param
*p
= params
+ n
;
55 const struct optee_msg_param
*mp
= msg_params
+ n
;
56 u32 attr
= mp
->attr
& OPTEE_MSG_ATTR_TYPE_MASK
;
59 case OPTEE_MSG_ATTR_TYPE_NONE
:
60 p
->attr
= TEE_IOCTL_PARAM_ATTR_TYPE_NONE
;
61 memset(&p
->u
, 0, sizeof(p
->u
));
63 case OPTEE_MSG_ATTR_TYPE_VALUE_INPUT
:
64 case OPTEE_MSG_ATTR_TYPE_VALUE_OUTPUT
:
65 case OPTEE_MSG_ATTR_TYPE_VALUE_INOUT
:
66 p
->attr
= TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT
+
67 attr
- OPTEE_MSG_ATTR_TYPE_VALUE_INPUT
;
68 p
->u
.value
.a
= mp
->u
.value
.a
;
69 p
->u
.value
.b
= mp
->u
.value
.b
;
70 p
->u
.value
.c
= mp
->u
.value
.c
;
72 case OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
:
73 case OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT
:
74 case OPTEE_MSG_ATTR_TYPE_TMEM_INOUT
:
75 p
->attr
= TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT
+
76 attr
- OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
;
77 p
->u
.memref
.size
= mp
->u
.tmem
.size
;
78 shm
= (struct tee_shm
*)(unsigned long)
81 p
->u
.memref
.shm_offs
= 0;
82 p
->u
.memref
.shm
= NULL
;
85 rc
= tee_shm_get_pa(shm
, 0, &pa
);
88 p
->u
.memref
.shm_offs
= mp
->u
.tmem
.buf_ptr
- pa
;
89 p
->u
.memref
.shm
= shm
;
91 /* Check that the memref is covered by the shm object */
92 if (p
->u
.memref
.size
) {
93 size_t o
= p
->u
.memref
.shm_offs
+
96 rc
= tee_shm_get_pa(shm
, o
, NULL
);
101 case OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
:
102 case OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT
:
103 case OPTEE_MSG_ATTR_TYPE_RMEM_INOUT
:
104 p
->attr
= TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT
+
105 attr
- OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
;
106 p
->u
.memref
.size
= mp
->u
.rmem
.size
;
107 shm
= (struct tee_shm
*)(unsigned long)
111 p
->u
.memref
.shm_offs
= 0;
112 p
->u
.memref
.shm
= NULL
;
115 p
->u
.memref
.shm_offs
= mp
->u
.rmem
.offs
;
116 p
->u
.memref
.shm
= shm
;
127 static int to_msg_param_tmp_mem(struct optee_msg_param
*mp
,
128 const struct tee_param
*p
)
133 mp
->attr
= OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
+ p
->attr
-
134 TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT
;
136 mp
->u
.tmem
.shm_ref
= (unsigned long)p
->u
.memref
.shm
;
137 mp
->u
.tmem
.size
= p
->u
.memref
.size
;
139 if (!p
->u
.memref
.shm
) {
140 mp
->u
.tmem
.buf_ptr
= 0;
144 rc
= tee_shm_get_pa(p
->u
.memref
.shm
, p
->u
.memref
.shm_offs
, &pa
);
148 mp
->u
.tmem
.buf_ptr
= pa
;
149 mp
->attr
|= OPTEE_MSG_ATTR_CACHE_PREDEFINED
<<
150 OPTEE_MSG_ATTR_CACHE_SHIFT
;
155 static int to_msg_param_reg_mem(struct optee_msg_param
*mp
,
156 const struct tee_param
*p
)
158 mp
->attr
= OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
+ p
->attr
-
159 TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT
;
161 mp
->u
.rmem
.shm_ref
= (unsigned long)p
->u
.memref
.shm
;
162 mp
->u
.rmem
.size
= p
->u
.memref
.size
;
163 mp
->u
.rmem
.offs
= p
->u
.memref
.shm_offs
;
168 * optee_to_msg_param() - convert from struct tee_params to OPTEE_MSG parameters
169 * @msg_params: OPTEE_MSG parameters
170 * @num_params: number of elements in the parameter arrays
171 * @params: subsystem itnernal parameter representation
172 * Returns 0 on success or <0 on failure
174 int optee_to_msg_param(struct optee_msg_param
*msg_params
, size_t num_params
,
175 const struct tee_param
*params
)
180 for (n
= 0; n
< num_params
; n
++) {
181 const struct tee_param
*p
= params
+ n
;
182 struct optee_msg_param
*mp
= msg_params
+ n
;
185 case TEE_IOCTL_PARAM_ATTR_TYPE_NONE
:
186 mp
->attr
= TEE_IOCTL_PARAM_ATTR_TYPE_NONE
;
187 memset(&mp
->u
, 0, sizeof(mp
->u
));
189 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT
:
190 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_OUTPUT
:
191 case TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT
:
192 mp
->attr
= OPTEE_MSG_ATTR_TYPE_VALUE_INPUT
+ p
->attr
-
193 TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INPUT
;
194 mp
->u
.value
.a
= p
->u
.value
.a
;
195 mp
->u
.value
.b
= p
->u
.value
.b
;
196 mp
->u
.value
.c
= p
->u
.value
.c
;
198 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT
:
199 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT
:
200 case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT
:
201 if (tee_shm_is_registered(p
->u
.memref
.shm
))
202 rc
= to_msg_param_reg_mem(mp
, p
);
204 rc
= to_msg_param_tmp_mem(mp
, p
);
215 static void optee_get_version(struct tee_device
*teedev
,
216 struct tee_ioctl_version_data
*vers
)
218 struct tee_ioctl_version_data v
= {
219 .impl_id
= TEE_IMPL_ID_OPTEE
,
220 .impl_caps
= TEE_OPTEE_CAP_TZ
,
221 .gen_caps
= TEE_GEN_CAP_GP
,
223 struct optee
*optee
= tee_get_drvdata(teedev
);
225 if (optee
->sec_caps
& OPTEE_SMC_SEC_CAP_DYNAMIC_SHM
)
226 v
.gen_caps
|= TEE_GEN_CAP_REG_MEM
;
230 static int optee_open(struct tee_context
*ctx
)
232 struct optee_context_data
*ctxdata
;
233 struct tee_device
*teedev
= ctx
->teedev
;
234 struct optee
*optee
= tee_get_drvdata(teedev
);
236 ctxdata
= kzalloc(sizeof(*ctxdata
), GFP_KERNEL
);
240 if (teedev
== optee
->supp_teedev
) {
243 mutex_lock(&optee
->supp
.mutex
);
244 if (!optee
->supp
.ctx
) {
246 optee
->supp
.ctx
= ctx
;
248 mutex_unlock(&optee
->supp
.mutex
);
255 mutex_init(&ctxdata
->mutex
);
256 INIT_LIST_HEAD(&ctxdata
->sess_list
);
262 static void optee_release(struct tee_context
*ctx
)
264 struct optee_context_data
*ctxdata
= ctx
->data
;
265 struct tee_device
*teedev
= ctx
->teedev
;
266 struct optee
*optee
= tee_get_drvdata(teedev
);
268 struct optee_msg_arg
*arg
= NULL
;
270 struct optee_session
*sess
;
271 struct optee_session
*sess_tmp
;
276 shm
= tee_shm_alloc(ctx
, sizeof(struct optee_msg_arg
), TEE_SHM_MAPPED
);
278 arg
= tee_shm_get_va(shm
, 0);
280 * If va2pa fails for some reason, we can't call into
281 * secure world, only free the memory. Secure OS will leak
282 * sessions and finally refuse more sessions, but we will
283 * at least let normal world reclaim its memory.
286 if (tee_shm_va2pa(shm
, arg
, &parg
))
287 arg
= NULL
; /* prevent usage of parg below */
290 list_for_each_entry_safe(sess
, sess_tmp
, &ctxdata
->sess_list
,
292 list_del(&sess
->list_node
);
293 if (!IS_ERR_OR_NULL(arg
)) {
294 memset(arg
, 0, sizeof(*arg
));
295 arg
->cmd
= OPTEE_MSG_CMD_CLOSE_SESSION
;
296 arg
->session
= sess
->session_id
;
297 optee_do_call_with_arg(ctx
, parg
);
308 if (teedev
== optee
->supp_teedev
)
309 optee_supp_release(&optee
->supp
);
312 static const struct tee_driver_ops optee_ops
= {
313 .get_version
= optee_get_version
,
315 .release
= optee_release
,
316 .open_session
= optee_open_session
,
317 .close_session
= optee_close_session
,
318 .invoke_func
= optee_invoke_func
,
319 .cancel_req
= optee_cancel_req
,
320 .shm_register
= optee_shm_register
,
321 .shm_unregister
= optee_shm_unregister
,
324 static const struct tee_desc optee_desc
= {
325 .name
= DRIVER_NAME
"-clnt",
327 .owner
= THIS_MODULE
,
330 static const struct tee_driver_ops optee_supp_ops
= {
331 .get_version
= optee_get_version
,
333 .release
= optee_release
,
334 .supp_recv
= optee_supp_recv
,
335 .supp_send
= optee_supp_send
,
336 .shm_register
= optee_shm_register_supp
,
337 .shm_unregister
= optee_shm_unregister_supp
,
340 static const struct tee_desc optee_supp_desc
= {
341 .name
= DRIVER_NAME
"-supp",
342 .ops
= &optee_supp_ops
,
343 .owner
= THIS_MODULE
,
344 .flags
= TEE_DESC_PRIVILEGED
,
347 static bool optee_msg_api_uid_is_optee_api(optee_invoke_fn
*invoke_fn
)
349 struct arm_smccc_res res
;
351 invoke_fn(OPTEE_SMC_CALLS_UID
, 0, 0, 0, 0, 0, 0, 0, &res
);
353 if (res
.a0
== OPTEE_MSG_UID_0
&& res
.a1
== OPTEE_MSG_UID_1
&&
354 res
.a2
== OPTEE_MSG_UID_2
&& res
.a3
== OPTEE_MSG_UID_3
)
359 static void optee_msg_get_os_revision(optee_invoke_fn
*invoke_fn
)
362 struct arm_smccc_res smccc
;
363 struct optee_smc_call_get_os_revision_result result
;
370 invoke_fn(OPTEE_SMC_CALL_GET_OS_REVISION
, 0, 0, 0, 0, 0, 0, 0,
373 if (res
.result
.build_id
)
374 pr_info("revision %lu.%lu (%08lx)", res
.result
.major
,
375 res
.result
.minor
, res
.result
.build_id
);
377 pr_info("revision %lu.%lu", res
.result
.major
, res
.result
.minor
);
380 static bool optee_msg_api_revision_is_compatible(optee_invoke_fn
*invoke_fn
)
383 struct arm_smccc_res smccc
;
384 struct optee_smc_calls_revision_result result
;
387 invoke_fn(OPTEE_SMC_CALLS_REVISION
, 0, 0, 0, 0, 0, 0, 0, &res
.smccc
);
389 if (res
.result
.major
== OPTEE_MSG_REVISION_MAJOR
&&
390 (int)res
.result
.minor
>= OPTEE_MSG_REVISION_MINOR
)
395 static bool optee_msg_exchange_capabilities(optee_invoke_fn
*invoke_fn
,
399 struct arm_smccc_res smccc
;
400 struct optee_smc_exchange_capabilities_result result
;
405 * TODO This isn't enough to tell if it's UP system (from kernel
406 * point of view) or not, is_smp() returns the the information
407 * needed, but can't be called directly from here.
409 if (!IS_ENABLED(CONFIG_SMP
) || nr_cpu_ids
== 1)
410 a1
|= OPTEE_SMC_NSEC_CAP_UNIPROCESSOR
;
412 invoke_fn(OPTEE_SMC_EXCHANGE_CAPABILITIES
, a1
, 0, 0, 0, 0, 0, 0,
415 if (res
.result
.status
!= OPTEE_SMC_RETURN_OK
)
418 *sec_caps
= res
.result
.capabilities
;
422 static struct tee_shm_pool
*
423 optee_config_shm_memremap(optee_invoke_fn
*invoke_fn
, void **memremaped_shm
,
427 struct arm_smccc_res smccc
;
428 struct optee_smc_get_shm_config_result result
;
436 struct tee_shm_pool_mgr
*priv_mgr
;
437 struct tee_shm_pool_mgr
*dmabuf_mgr
;
440 invoke_fn(OPTEE_SMC_GET_SHM_CONFIG
, 0, 0, 0, 0, 0, 0, 0, &res
.smccc
);
441 if (res
.result
.status
!= OPTEE_SMC_RETURN_OK
) {
442 pr_info("shm service not available\n");
443 return ERR_PTR(-ENOENT
);
446 if (res
.result
.settings
!= OPTEE_SMC_SHM_CACHED
) {
447 pr_err("only normal cached shared memory supported\n");
448 return ERR_PTR(-EINVAL
);
451 begin
= roundup(res
.result
.start
, PAGE_SIZE
);
452 end
= rounddown(res
.result
.start
+ res
.result
.size
, PAGE_SIZE
);
456 if (size
< 2 * OPTEE_SHM_NUM_PRIV_PAGES
* PAGE_SIZE
) {
457 pr_err("too small shared memory area\n");
458 return ERR_PTR(-EINVAL
);
461 va
= memremap(paddr
, size
, MEMREMAP_WB
);
463 pr_err("shared memory ioremap failed\n");
464 return ERR_PTR(-EINVAL
);
466 vaddr
= (unsigned long)va
;
469 * If OP-TEE can work with unregistered SHM, we will use own pool
472 if (sec_caps
& OPTEE_SMC_SEC_CAP_DYNAMIC_SHM
) {
473 rc
= optee_shm_pool_alloc_pages();
478 const size_t sz
= OPTEE_SHM_NUM_PRIV_PAGES
* PAGE_SIZE
;
480 rc
= tee_shm_pool_mgr_alloc_res_mem(vaddr
, paddr
, sz
,
481 3 /* 8 bytes aligned */);
491 rc
= tee_shm_pool_mgr_alloc_res_mem(vaddr
, paddr
, size
, PAGE_SHIFT
);
493 goto err_free_priv_mgr
;
496 rc
= tee_shm_pool_alloc(priv_mgr
, dmabuf_mgr
);
498 goto err_free_dmabuf_mgr
;
500 *memremaped_shm
= va
;
505 tee_shm_pool_mgr_destroy(dmabuf_mgr
);
507 tee_shm_pool_mgr_destroy(priv_mgr
);
513 /* Simple wrapper functions to be able to use a function pointer */
514 static void optee_smccc_smc(unsigned long a0
, unsigned long a1
,
515 unsigned long a2
, unsigned long a3
,
516 unsigned long a4
, unsigned long a5
,
517 unsigned long a6
, unsigned long a7
,
518 struct arm_smccc_res
*res
)
520 arm_smccc_smc(a0
, a1
, a2
, a3
, a4
, a5
, a6
, a7
, res
);
523 static void optee_smccc_hvc(unsigned long a0
, unsigned long a1
,
524 unsigned long a2
, unsigned long a3
,
525 unsigned long a4
, unsigned long a5
,
526 unsigned long a6
, unsigned long a7
,
527 struct arm_smccc_res
*res
)
529 arm_smccc_hvc(a0
, a1
, a2
, a3
, a4
, a5
, a6
, a7
, res
);
532 static optee_invoke_fn
*get_invoke_func(struct device_node
*np
)
536 pr_info("probing for conduit method from DT.\n");
538 if (of_property_read_string(np
, "method", &method
)) {
539 pr_warn("missing \"method\" property\n");
540 return ERR_PTR(-ENXIO
);
543 if (!strcmp("hvc", method
))
544 return optee_smccc_hvc
;
545 else if (!strcmp("smc", method
))
546 return optee_smccc_smc
;
548 pr_warn("invalid \"method\" property: %s\n", method
);
549 return ERR_PTR(-EINVAL
);
552 static struct optee
*optee_probe(struct device_node
*np
)
554 optee_invoke_fn
*invoke_fn
;
555 struct tee_shm_pool
*pool
;
556 struct optee
*optee
= NULL
;
557 void *memremaped_shm
= NULL
;
558 struct tee_device
*teedev
;
562 invoke_fn
= get_invoke_func(np
);
563 if (IS_ERR(invoke_fn
))
564 return (void *)invoke_fn
;
566 if (!optee_msg_api_uid_is_optee_api(invoke_fn
)) {
567 pr_warn("api uid mismatch\n");
568 return ERR_PTR(-EINVAL
);
571 optee_msg_get_os_revision(invoke_fn
);
573 if (!optee_msg_api_revision_is_compatible(invoke_fn
)) {
574 pr_warn("api revision mismatch\n");
575 return ERR_PTR(-EINVAL
);
578 if (!optee_msg_exchange_capabilities(invoke_fn
, &sec_caps
)) {
579 pr_warn("capabilities mismatch\n");
580 return ERR_PTR(-EINVAL
);
584 * We have no other option for shared memory, if secure world
585 * doesn't have any reserved memory we can use we can't continue.
587 if (!(sec_caps
& OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM
))
588 return ERR_PTR(-EINVAL
);
590 pool
= optee_config_shm_memremap(invoke_fn
, &memremaped_shm
, sec_caps
);
594 optee
= kzalloc(sizeof(*optee
), GFP_KERNEL
);
600 optee
->invoke_fn
= invoke_fn
;
601 optee
->sec_caps
= sec_caps
;
603 teedev
= tee_device_alloc(&optee_desc
, NULL
, pool
, optee
);
604 if (IS_ERR(teedev
)) {
605 rc
= PTR_ERR(teedev
);
608 optee
->teedev
= teedev
;
610 teedev
= tee_device_alloc(&optee_supp_desc
, NULL
, pool
, optee
);
611 if (IS_ERR(teedev
)) {
612 rc
= PTR_ERR(teedev
);
615 optee
->supp_teedev
= teedev
;
617 rc
= tee_device_register(optee
->teedev
);
621 rc
= tee_device_register(optee
->supp_teedev
);
625 mutex_init(&optee
->call_queue
.mutex
);
626 INIT_LIST_HEAD(&optee
->call_queue
.waiters
);
627 optee_wait_queue_init(&optee
->wait_queue
);
628 optee_supp_init(&optee
->supp
);
629 optee
->memremaped_shm
= memremaped_shm
;
632 optee_enable_shm_cache(optee
);
634 if (optee
->sec_caps
& OPTEE_SMC_SEC_CAP_DYNAMIC_SHM
)
635 pr_info("dynamic shared memory is enabled\n");
637 rc
= optee_enumerate_devices();
641 pr_info("initialized driver\n");
646 * tee_device_unregister() is safe to call even if the
647 * devices hasn't been registered with
648 * tee_device_register() yet.
650 tee_device_unregister(optee
->supp_teedev
);
651 tee_device_unregister(optee
->teedev
);
655 tee_shm_pool_free(pool
);
657 memunmap(memremaped_shm
);
661 static void optee_remove(struct optee
*optee
)
664 * Ask OP-TEE to free all cached shared memory objects to decrease
665 * reference counters and also avoid wild pointers in secure world
666 * into the old shared memory range.
668 optee_disable_shm_cache(optee
);
671 * The two devices has to be unregistered before we can free the
674 tee_device_unregister(optee
->supp_teedev
);
675 tee_device_unregister(optee
->teedev
);
677 tee_shm_pool_free(optee
->pool
);
678 if (optee
->memremaped_shm
)
679 memunmap(optee
->memremaped_shm
);
680 optee_wait_queue_exit(&optee
->wait_queue
);
681 optee_supp_uninit(&optee
->supp
);
682 mutex_destroy(&optee
->call_queue
.mutex
);
687 static const struct of_device_id optee_match
[] = {
688 { .compatible
= "linaro,optee-tz" },
692 static struct optee
*optee_svc
;
694 static int __init
optee_driver_init(void)
696 struct device_node
*fw_np
;
697 struct device_node
*np
;
700 /* Node is supposed to be below /firmware */
701 fw_np
= of_find_node_by_name(NULL
, "firmware");
705 np
= of_find_matching_node(fw_np
, optee_match
);
706 if (!np
|| !of_device_is_available(np
)) {
711 optee
= optee_probe(np
);
715 return PTR_ERR(optee
);
721 module_init(optee_driver_init
);
723 static void __exit
optee_driver_exit(void)
725 struct optee
*optee
= optee_svc
;
731 module_exit(optee_driver_exit
);
733 MODULE_AUTHOR("Linaro");
734 MODULE_DESCRIPTION("OP-TEE driver");
735 MODULE_SUPPORTED_DEVICE("");
736 MODULE_VERSION("1.0");
737 MODULE_LICENSE("GPL v2");