linux/drivers/tee/amdtee/amdtee_private.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: MIT */
   2
   3/*
   4 * Copyright 2019 Advanced Micro Devices, Inc.
   5 */
   6
   7#ifndef AMDTEE_PRIVATE_H
   8#define AMDTEE_PRIVATE_H
   9
  10#include <linux/mutex.h>
  11#include <linux/spinlock.h>
  12#include <linux/tee_drv.h>
  13#include <linux/kref.h>
  14#include <linux/types.h>
  15#include "amdtee_if.h"
  16
  17#define DRIVER_NAME     "amdtee"
  18#define DRIVER_AUTHOR   "AMD-TEE Linux driver team"
  19
  20/* Some GlobalPlatform error codes used in this driver */
  21#define TEEC_SUCCESS                    0x00000000
  22#define TEEC_ERROR_GENERIC              0xFFFF0000
  23#define TEEC_ERROR_BAD_PARAMETERS       0xFFFF0006
  24#define TEEC_ERROR_OUT_OF_MEMORY        0xFFFF000C
  25#define TEEC_ERROR_COMMUNICATION        0xFFFF000E
  26
  27#define TEEC_ORIGIN_COMMS               0x00000002
  28
  29/* Maximum number of sessions which can be opened with a Trusted Application */
  30#define TEE_NUM_SESSIONS                        32
  31
  32#define TA_LOAD_PATH                            "/amdtee"
  33#define TA_PATH_MAX                             60
  34
  35/**
  36 * struct amdtee - main service struct
  37 * @teedev:             client device
  38 * @pool:               shared memory pool
  39 */
  40struct amdtee {
  41        struct tee_device *teedev;
  42        struct tee_shm_pool *pool;
  43};
  44
  45/**
  46 * struct amdtee_session - Trusted Application (TA) session related information.
  47 * @ta_handle:     handle to Trusted Application (TA) loaded in TEE environment
  48 * @refcount:      counter to keep track of sessions opened for the TA instance
  49 * @session_info:  an array pointing to TA allocated session data.
  50 * @sess_mask:     session usage bit-mask. If a particular bit is set, then the
  51 *                 corresponding @session_info entry is in use or valid.
  52 *
  53 * Session structure is updated on open_session and this information is used for
  54 * subsequent operations with the Trusted Application.
  55 */
  56struct amdtee_session {
  57        struct list_head list_node;
  58        u32 ta_handle;
  59        struct kref refcount;
  60        u32 session_info[TEE_NUM_SESSIONS];
  61        DECLARE_BITMAP(sess_mask, TEE_NUM_SESSIONS);
  62        spinlock_t lock;        /* synchronizes access to @sess_mask */
  63};
  64
  65/**
  66 * struct amdtee_context_data - AMD-TEE driver context data
  67 * @sess_list:    Keeps track of sessions opened in current TEE context
  68 * @shm_list:     Keeps track of buffers allocated and mapped in current TEE
  69 *                context
  70 */
  71struct amdtee_context_data {
  72        struct list_head sess_list;
  73        struct list_head shm_list;
  74        struct mutex shm_mutex;   /* synchronizes access to @shm_list */
  75};
  76
  77struct amdtee_driver_data {
  78        struct amdtee *amdtee;
  79};
  80
  81struct shmem_desc {
  82        void *kaddr;
  83        u64 size;
  84};
  85
  86/**
  87 * struct amdtee_shm_data - Shared memory data
  88 * @kaddr:      Kernel virtual address of shared memory
  89 * @buf_id:     Buffer id of memory mapped by TEE_CMD_ID_MAP_SHARED_MEM
  90 */
  91struct amdtee_shm_data {
  92        struct  list_head shm_node;
  93        void    *kaddr;
  94        u32     buf_id;
  95};
  96
  97/**
  98 * struct amdtee_ta_data - Keeps track of all TAs loaded in AMD Secure
  99 *                         Processor
 100 * @ta_handle:  Handle to TA loaded in TEE
 101 * @refcount:   Reference count for the loaded TA
 102 */
 103struct amdtee_ta_data {
 104        struct list_head list_node;
 105        u32 ta_handle;
 106        u32 refcount;
 107};
 108
 109#define LOWER_TWO_BYTE_MASK     0x0000FFFF
 110
 111/**
 112 * set_session_id() - Sets the session identifier.
 113 * @ta_handle:      [in] handle of the loaded Trusted Application (TA)
 114 * @session_index:  [in] Session index. Range: 0 to (TEE_NUM_SESSIONS - 1).
 115 * @session:        [out] Pointer to session id
 116 *
 117 * Lower two bytes of the session identifier represents the TA handle and the
 118 * upper two bytes is session index.
 119 */
 120static inline void set_session_id(u32 ta_handle, u32 session_index,
 121                                  u32 *session)
 122{
 123        *session = (session_index << 16) | (LOWER_TWO_BYTE_MASK & ta_handle);
 124}
 125
 126static inline u32 get_ta_handle(u32 session)
 127{
 128        return session & LOWER_TWO_BYTE_MASK;
 129}
 130
 131static inline u32 get_session_index(u32 session)
 132{
 133        return (session >> 16) & LOWER_TWO_BYTE_MASK;
 134}
 135
 136int amdtee_open_session(struct tee_context *ctx,
 137                        struct tee_ioctl_open_session_arg *arg,
 138                        struct tee_param *param);
 139
 140int amdtee_close_session(struct tee_context *ctx, u32 session);
 141
 142int amdtee_invoke_func(struct tee_context *ctx,
 143                       struct tee_ioctl_invoke_arg *arg,
 144                       struct tee_param *param);
 145
 146int amdtee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session);
 147
 148int amdtee_map_shmem(struct tee_shm *shm);
 149
 150void amdtee_unmap_shmem(struct tee_shm *shm);
 151
 152int handle_load_ta(void *data, u32 size,
 153                   struct tee_ioctl_open_session_arg *arg);
 154
 155int handle_unload_ta(u32 ta_handle);
 156
 157int handle_open_session(struct tee_ioctl_open_session_arg *arg, u32 *info,
 158                        struct tee_param *p);
 159
 160int handle_close_session(u32 ta_handle, u32 info);
 161
 162int handle_map_shmem(u32 count, struct shmem_desc *start, u32 *buf_id);
 163
 164void handle_unmap_shmem(u32 buf_id);
 165
 166int handle_invoke_cmd(struct tee_ioctl_invoke_arg *arg, u32 sinfo,
 167                      struct tee_param *p);
 168
 169struct tee_shm_pool *amdtee_config_shm(void);
 170
 171u32 get_buffer_id(struct tee_shm *shm);
 172#endif /*AMDTEE_PRIVATE_H*/
 173