Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.12-rc3 183 lines 5.5 kB view raw
1/* 2 * Copyright (c) 2015, Linaro Limited 3 * 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. 7 * 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. 12 * 13 */ 14 15#ifndef OPTEE_PRIVATE_H 16#define OPTEE_PRIVATE_H 17 18#include <linux/arm-smccc.h> 19#include <linux/semaphore.h> 20#include <linux/tee_drv.h> 21#include <linux/types.h> 22#include "optee_msg.h" 23 24#define OPTEE_MAX_ARG_SIZE 1024 25 26/* Some Global Platform error codes used in this driver */ 27#define TEEC_SUCCESS 0x00000000 28#define TEEC_ERROR_BAD_PARAMETERS 0xFFFF0006 29#define TEEC_ERROR_COMMUNICATION 0xFFFF000E 30#define TEEC_ERROR_OUT_OF_MEMORY 0xFFFF000C 31 32#define TEEC_ORIGIN_COMMS 0x00000002 33 34typedef void (optee_invoke_fn)(unsigned long, unsigned long, unsigned long, 35 unsigned long, unsigned long, unsigned long, 36 unsigned long, unsigned long, 37 struct arm_smccc_res *); 38 39struct optee_call_queue { 40 /* Serializes access to this struct */ 41 struct mutex mutex; 42 struct list_head waiters; 43}; 44 45struct optee_wait_queue { 46 /* Serializes access to this struct */ 47 struct mutex mu; 48 struct list_head db; 49}; 50 51/** 52 * struct optee_supp - supplicant synchronization struct 53 * @ctx the context of current connected supplicant. 54 * if !NULL the supplicant device is available for use, 55 * else busy 56 * @ctx_mutex: held while accessing @ctx 57 * @func: supplicant function id to call 58 * @ret: call return value 59 * @num_params: number of elements in @param 60 * @param: parameters for @func 61 * @req_posted: if true, a request has been posted to the supplicant 62 * @supp_next_send: if true, next step is for supplicant to send response 63 * @thrd_mutex: held by the thread doing a request to supplicant 64 * @supp_mutex: held by supplicant while operating on this struct 65 * @data_to_supp: supplicant is waiting on this for next request 66 * @data_from_supp: requesting thread is waiting on this to get the result 67 */ 68struct optee_supp { 69 struct tee_context *ctx; 70 /* Serializes access of ctx */ 71 struct mutex ctx_mutex; 72 73 u32 func; 74 u32 ret; 75 size_t num_params; 76 struct tee_param *param; 77 78 bool req_posted; 79 bool supp_next_send; 80 /* Serializes access to this struct for requesting thread */ 81 struct mutex thrd_mutex; 82 /* Serializes access to this struct for supplicant threads */ 83 struct mutex supp_mutex; 84 struct completion data_to_supp; 85 struct completion data_from_supp; 86}; 87 88/** 89 * struct optee - main service struct 90 * @supp_teedev: supplicant device 91 * @teedev: client device 92 * @invoke_fn: function to issue smc or hvc 93 * @call_queue: queue of threads waiting to call @invoke_fn 94 * @wait_queue: queue of threads from secure world waiting for a 95 * secure world sync object 96 * @supp: supplicant synchronization struct for RPC to supplicant 97 * @pool: shared memory pool 98 * @memremaped_shm virtual address of memory in shared memory pool 99 */ 100struct optee { 101 struct tee_device *supp_teedev; 102 struct tee_device *teedev; 103 optee_invoke_fn *invoke_fn; 104 struct optee_call_queue call_queue; 105 struct optee_wait_queue wait_queue; 106 struct optee_supp supp; 107 struct tee_shm_pool *pool; 108 void *memremaped_shm; 109}; 110 111struct optee_session { 112 struct list_head list_node; 113 u32 session_id; 114}; 115 116struct optee_context_data { 117 /* Serializes access to this struct */ 118 struct mutex mutex; 119 struct list_head sess_list; 120}; 121 122struct optee_rpc_param { 123 u32 a0; 124 u32 a1; 125 u32 a2; 126 u32 a3; 127 u32 a4; 128 u32 a5; 129 u32 a6; 130 u32 a7; 131}; 132 133void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param); 134 135void optee_wait_queue_init(struct optee_wait_queue *wq); 136void optee_wait_queue_exit(struct optee_wait_queue *wq); 137 138u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params, 139 struct tee_param *param); 140 141int optee_supp_read(struct tee_context *ctx, void __user *buf, size_t len); 142int optee_supp_write(struct tee_context *ctx, void __user *buf, size_t len); 143void optee_supp_init(struct optee_supp *supp); 144void optee_supp_uninit(struct optee_supp *supp); 145 146int optee_supp_recv(struct tee_context *ctx, u32 *func, u32 *num_params, 147 struct tee_param *param); 148int optee_supp_send(struct tee_context *ctx, u32 ret, u32 num_params, 149 struct tee_param *param); 150 151u32 optee_do_call_with_arg(struct tee_context *ctx, phys_addr_t parg); 152int optee_open_session(struct tee_context *ctx, 153 struct tee_ioctl_open_session_arg *arg, 154 struct tee_param *param); 155int optee_close_session(struct tee_context *ctx, u32 session); 156int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg, 157 struct tee_param *param); 158int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session); 159 160void optee_enable_shm_cache(struct optee *optee); 161void optee_disable_shm_cache(struct optee *optee); 162 163int optee_from_msg_param(struct tee_param *params, size_t num_params, 164 const struct optee_msg_param *msg_params); 165int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params, 166 const struct tee_param *params); 167 168/* 169 * Small helpers 170 */ 171 172static inline void *reg_pair_to_ptr(u32 reg0, u32 reg1) 173{ 174 return (void *)(unsigned long)(((u64)reg0 << 32) | reg1); 175} 176 177static inline void reg_pair_from_64(u32 *reg0, u32 *reg1, u64 val) 178{ 179 *reg0 = val >> 32; 180 *reg1 = val; 181} 182 183#endif /*OPTEE_PRIVATE_H*/