| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
- */
- #ifndef QCOMTEE_H
- #define QCOMTEE_H
- #include <linux/kobject.h>
- #include <linux/tee_core.h>
- #include "qcomtee_msg.h"
- #include "qcomtee_object.h"
- /* Flags relating to object reference. */
- #define QCOMTEE_OBJREF_FLAG_TEE BIT(0)
- #define QCOMTEE_OBJREF_FLAG_USER BIT(1)
- #define QCOMTEE_OBJREF_FLAG_MEM BIT(2)
- /**
- * struct qcomtee - Main service struct.
- * @teedev: client device.
- * @pool: shared memory pool.
- * @ctx: driver private context.
- * @oic: context to use for the current driver invocation.
- * @wq: workqueue for QTEE async operations.
- * @xa_local_objects: array of objects exported to QTEE.
- * @xa_last_id: next ID to allocate.
- * @qtee_version: QTEE version.
- */
- struct qcomtee {
- struct tee_device *teedev;
- struct tee_shm_pool *pool;
- struct tee_context *ctx;
- struct qcomtee_object_invoke_ctx oic;
- struct workqueue_struct *wq;
- struct xarray xa_local_objects;
- u32 xa_last_id;
- u32 qtee_version;
- };
- void qcomtee_fetch_async_reqs(struct qcomtee_object_invoke_ctx *oic);
- struct qcomtee_object *qcomtee_idx_erase(struct qcomtee_object_invoke_ctx *oic,
- u32 idx);
- struct tee_shm_pool *qcomtee_shm_pool_alloc(void);
- void qcomtee_msg_buffers_free(struct qcomtee_object_invoke_ctx *oic);
- int qcomtee_msg_buffers_alloc(struct qcomtee_object_invoke_ctx *oic,
- struct qcomtee_arg *u);
- /**
- * qcomtee_object_do_invoke_internal() - Submit an invocation for an object.
- * @oic: context to use for the current invocation.
- * @object: object being invoked.
- * @op: requested operation on the object.
- * @u: array of arguments for the current invocation.
- * @result: result returned from QTEE.
- *
- * The caller is responsible for keeping track of the refcount for each
- * object, including @object. On return, the caller loses ownership of all
- * input objects of type %QCOMTEE_OBJECT_TYPE_CB.
- *
- * Return: On success, returns 0; on failure, returns < 0.
- */
- int qcomtee_object_do_invoke_internal(struct qcomtee_object_invoke_ctx *oic,
- struct qcomtee_object *object, u32 op,
- struct qcomtee_arg *u, int *result);
- /**
- * struct qcomtee_context_data - Clients' or supplicants' context.
- * @qtee_objects_idr: QTEE objects in this context.
- * @qtee_lock: mutex for @qtee_objects_idr.
- * @reqs_idr: requests in this context that hold ID.
- * @reqs_list: FIFO for requests in PROCESSING or QUEUED state.
- * @reqs_lock: mutex for @reqs_idr, @reqs_list and request states.
- * @req_c: completion used when the supplicant is waiting for requests.
- * @released: state of this context.
- */
- struct qcomtee_context_data {
- struct idr qtee_objects_idr;
- /* Synchronize access to @qtee_objects_idr. */
- struct mutex qtee_lock;
- struct idr reqs_idr;
- struct list_head reqs_list;
- /* Synchronize access to @reqs_idr, @reqs_list and updating requests states. */
- struct mutex reqs_lock;
- struct completion req_c;
- bool released;
- };
- int qcomtee_context_add_qtee_object(struct tee_param *param,
- struct qcomtee_object *object,
- struct tee_context *ctx);
- int qcomtee_context_find_qtee_object(struct qcomtee_object **object,
- struct tee_param *param,
- struct tee_context *ctx);
- void qcomtee_context_del_qtee_object(struct tee_param *param,
- struct tee_context *ctx);
- int qcomtee_objref_to_arg(struct qcomtee_arg *arg, struct tee_param *param,
- struct tee_context *ctx);
- int qcomtee_objref_from_arg(struct tee_param *param, struct qcomtee_arg *arg,
- struct tee_context *ctx);
- /* OBJECTS: */
- /* (1) User Object API. */
- int is_qcomtee_user_object(struct qcomtee_object *object);
- void qcomtee_user_object_set_notify(struct qcomtee_object *object, bool notify);
- void qcomtee_requests_destroy(struct qcomtee_context_data *ctxdata);
- int qcomtee_user_param_to_object(struct qcomtee_object **object,
- struct tee_param *param,
- struct tee_context *ctx);
- int qcomtee_user_param_from_object(struct tee_param *param,
- struct qcomtee_object *object,
- struct tee_context *ctx);
- /**
- * struct qcomtee_user_object_request_data - Data for user object request.
- * @id: ID assigned to the request.
- * @object_id: Object ID being invoked by QTEE.
- * @op: Requested operation on object.
- * @np: Number of parameters in the request.
- */
- struct qcomtee_user_object_request_data {
- int id;
- u64 object_id;
- u32 op;
- int np;
- };
- int qcomtee_user_object_select(struct tee_context *ctx,
- struct tee_param *params, int num_params,
- void __user *uaddr, size_t size,
- struct qcomtee_user_object_request_data *data);
- int qcomtee_user_object_submit(struct tee_context *ctx,
- struct tee_param *params, int num_params,
- int req_id, int errno);
- /* (2) Primordial Object. */
- extern struct qcomtee_object qcomtee_primordial_object;
- /* (3) Memory Object API. */
- /* Is it a memory object using tee_shm? */
- int is_qcomtee_memobj_object(struct qcomtee_object *object);
- /**
- * qcomtee_memobj_param_to_object() - OBJREF parameter to &struct qcomtee_object.
- * @object: object returned.
- * @param: TEE parameter.
- * @ctx: context in which the conversion should happen.
- *
- * @param is an OBJREF with %QCOMTEE_OBJREF_FLAG_MEM flags.
- *
- * Return: On success return 0 or <0 on failure.
- */
- int qcomtee_memobj_param_to_object(struct qcomtee_object **object,
- struct tee_param *param,
- struct tee_context *ctx);
- /* Reverse what qcomtee_memobj_param_to_object() does. */
- int qcomtee_memobj_param_from_object(struct tee_param *param,
- struct qcomtee_object *object,
- struct tee_context *ctx);
- /**
- * qcomtee_mem_object_map() - Map a memory object.
- * @object: memory object.
- * @map_object: created mapping object.
- * @mem_paddr: physical address of the memory.
- * @mem_size: size of the memory.
- * @perms: QTEE access permissions.
- *
- * Return: On success return 0 or <0 on failure.
- */
- int qcomtee_mem_object_map(struct qcomtee_object *object,
- struct qcomtee_object **map_object, u64 *mem_paddr,
- u64 *mem_size, u32 *perms);
- #endif /* QCOMTEE_H */
|