| /* | |
| * Copyright (c) 2015-2016, Linaro Limited | |
| * | |
| * This software is licensed under the terms of the GNU General Public | |
| * License version 2, as published by the Free Software Foundation, and | |
| * may be copied, distributed, and modified under those terms. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| */ | |
| #ifndef TEE_PRIVATE_H | |
| #define TEE_PRIVATE_H | |
| #include <linux/cdev.h> | |
| #include <linux/completion.h> | |
| #include <linux/device.h> | |
| #include <linux/kref.h> | |
| #include <linux/mutex.h> | |
| #include <linux/types.h> | |
| struct tee_device; | |
| /** | |
| * struct tee_shm - shared memory object | |
| * @teedev: device used to allocate the object | |
| * @ctx: context using the object, if NULL the context is gone | |
| * @link link element | |
| * @paddr: physical address of the shared memory | |
| * @kaddr: virtual address of the shared memory | |
| * @size: size of shared memory | |
| * @dmabuf: dmabuf used to for exporting to user space | |
| * @flags: defined by TEE_SHM_* in tee_drv.h | |
| * @id: unique id of a shared memory object on this device | |
| */ | |
| struct tee_shm { | |
| struct tee_device *teedev; | |
| struct tee_context *ctx; | |
| struct list_head link; | |
| phys_addr_t paddr; | |
| void *kaddr; | |
| size_t size; | |
| struct dma_buf *dmabuf; | |
| u32 flags; | |
| int id; | |
| }; | |
| struct tee_shm_pool_mgr; | |
| /** | |
| * struct tee_shm_pool_mgr_ops - shared memory pool manager operations | |
| * @alloc: called when allocating shared memory | |
| * @free: called when freeing shared memory | |
| */ | |
| struct tee_shm_pool_mgr_ops { | |
| int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm, | |
| size_t size); | |
| void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm); | |
| }; | |
| /** | |
| * struct tee_shm_pool_mgr - shared memory manager | |
| * @ops: operations | |
| * @private_data: private data for the shared memory manager | |
| */ | |
| struct tee_shm_pool_mgr { | |
| const struct tee_shm_pool_mgr_ops *ops; | |
| void *private_data; | |
| }; | |
| /** | |
| * struct tee_shm_pool - shared memory pool | |
| * @private_mgr: pool manager for shared memory only between kernel | |
| * and secure world | |
| * @dma_buf_mgr: pool manager for shared memory exported to user space | |
| * @destroy: called when destroying the pool | |
| * @private_data: private data for the pool | |
| */ | |
| struct tee_shm_pool { | |
| struct tee_shm_pool_mgr private_mgr; | |
| struct tee_shm_pool_mgr dma_buf_mgr; | |
| void (*destroy)(struct tee_shm_pool *pool); | |
| void *private_data; | |
| }; | |
| #define TEE_DEVICE_FLAG_REGISTERED 0x1 | |
| #define TEE_MAX_DEV_NAME_LEN 32 | |
| /** | |
| * struct tee_device - TEE Device representation | |
| * @name: name of device | |
| * @desc: description of device | |
| * @id: unique id of device | |
| * @flags: represented by TEE_DEVICE_FLAG_REGISTERED above | |
| * @dev: embedded basic device structure | |
| * @cdev: embedded cdev | |
| * @num_users: number of active users of this device | |
| * @c_no_user: completion used when unregistering the device | |
| * @mutex: mutex protecting @num_users and @idr | |
| * @idr: register of shared memory object allocated on this device | |
| * @pool: shared memory pool | |
| */ | |
| struct tee_device { | |
| char name[TEE_MAX_DEV_NAME_LEN]; | |
| const struct tee_desc *desc; | |
| int id; | |
| unsigned int flags; | |
| struct device dev; | |
| struct cdev cdev; | |
| size_t num_users; | |
| struct completion c_no_users; | |
| struct mutex mutex; /* protects num_users and idr */ | |
| struct idr idr; | |
| struct tee_shm_pool *pool; | |
| }; | |
| int tee_shm_init(void); | |
| int tee_shm_get_fd(struct tee_shm *shm); | |
| bool tee_device_get(struct tee_device *teedev); | |
| void tee_device_put(struct tee_device *teedev); | |
| #endif /*TEE_PRIVATE_H*/ |