| /** |
| * Copyright (c) 2011 Trusted Logic S.A. |
| * All Rights Reserved. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * version 2 as published by the Free Software Foundation. |
| * |
| * 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. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| * MA 02111-1307 USA |
| */ |
| |
| #ifndef __TF_DEFS_H__ |
| #define __TF_DEFS_H__ |
| |
| #include <asm/atomic.h> |
| #include <linux/version.h> |
| #include <linux/fs.h> |
| #include <linux/cdev.h> |
| #include <linux/completion.h> |
| #include <linux/list.h> |
| #include <linux/spinlock.h> |
| #include <linux/sysfs.h> |
| #include <linux/sched.h> |
| #include <linux/semaphore.h> |
| #ifdef CONFIG_HAS_WAKELOCK |
| #include <linux/wakelock.h> |
| #endif |
| |
| #include "tf_protocol.h" |
| |
| #ifdef CONFIG_TF_ION |
| #include <linux/ion.h> |
| #include <linux/omap_ion.h> |
| #endif |
| |
| /*----------------------------------------------------------------------------*/ |
| |
| #define SIZE_1KB 0x400 |
| |
| /* |
| * Maximum number of shared memory blocks that can be reigsters in a connection |
| */ |
| #define TF_SHMEM_MAX_COUNT (64) |
| |
| /* |
| * Describes the possible types of shared memories |
| * |
| * TF_SHMEM_TYPE_PREALLOC_REGISTERED_SHMEM : |
| * The descriptor describes a registered shared memory. |
| * Its coarse pages are preallocated when initializing the |
| * connection |
| * TF_SHMEM_TYPE_REGISTERED_SHMEM : |
| * The descriptor describes a registered shared memory. |
| * Its coarse pages are not preallocated |
| * TF_SHMEM_TYPE_PM_HIBERNATE : |
| * The descriptor describes a power management shared memory. |
| */ |
| enum TF_SHMEM_TYPE { |
| TF_SHMEM_TYPE_PREALLOC_REGISTERED_SHMEM = 0, |
| TF_SHMEM_TYPE_REGISTERED_SHMEM, |
| TF_SHMEM_TYPE_PM_HIBERNATE, |
| }; |
| |
| |
| /* |
| * This structure contains a pointer on a coarse page table |
| */ |
| struct tf_coarse_page_table { |
| /* |
| * Identifies the coarse page table descriptor in |
| * free_coarse_page_tables list |
| */ |
| struct list_head list; |
| |
| /* |
| * The address of the coarse page table |
| */ |
| u32 *descriptors; |
| |
| /* |
| * The address of the array containing this coarse page table |
| */ |
| struct tf_coarse_page_table_array *parent; |
| }; |
| |
| |
| #define TF_PAGE_DESCRIPTOR_TYPE_NORMAL 0 |
| #define TF_PAGE_DESCRIPTOR_TYPE_PREALLOCATED 1 |
| |
| /* |
| * This structure describes an array of up to 4 coarse page tables |
| * allocated within a single 4KB page. |
| */ |
| struct tf_coarse_page_table_array { |
| /* |
| * identifies the element in the coarse_page_table_arrays list |
| */ |
| struct list_head list; |
| |
| /* |
| * Type of page descriptor |
| * can take any of TF_PAGE_DESCRIPTOR_TYPE_XXX value |
| */ |
| u32 type; |
| |
| struct tf_coarse_page_table coarse_page_tables[4]; |
| |
| /* |
| * A counter of the number of coarse pages currently used |
| * the max value should be 4 (one coarse page table is 1KB while one |
| * page is 4KB) |
| */ |
| u8 ref_count; |
| }; |
| |
| |
| /* |
| * This structure describes a list of coarse page table arrays |
| * with some of the coarse page tables free. It is used |
| * when the driver needs to allocate a new coarse page |
| * table. |
| */ |
| struct tf_coarse_page_table_allocation_context { |
| /* |
| * The spin lock protecting concurrent access to the structure. |
| */ |
| spinlock_t lock; |
| |
| /* |
| * The list of allocated coarse page table arrays |
| */ |
| struct list_head coarse_page_table_arrays; |
| |
| /* |
| * The list of free coarse page tables |
| */ |
| struct list_head free_coarse_page_tables; |
| }; |
| |
| |
| /* |
| * Fully describes a shared memory block |
| */ |
| struct tf_shmem_desc { |
| /* |
| * Identifies the shared memory descriptor in the list of free shared |
| * memory descriptors |
| */ |
| struct list_head list; |
| |
| /* |
| * Identifies the type of shared memory descriptor |
| */ |
| enum TF_SHMEM_TYPE type; |
| |
| /* |
| * The identifier of the block of shared memory, as returned by the |
| * Secure World. |
| * This identifier is block field of a REGISTER_SHARED_MEMORY answer |
| */ |
| u32 block_identifier; |
| |
| /* Client buffer */ |
| u8 *pBuffer; |
| |
| /* Up to eight coarse page table context */ |
| struct tf_coarse_page_table *coarse_pg_table[TF_MAX_COARSE_PAGES]; |
| |
| u32 coarse_pg_table_count; |
| |
| /* Reference counter */ |
| atomic_t ref_count; |
| }; |
| |
| |
| /*----------------------------------------------------------------------------*/ |
| |
| /* |
| * This structure describes the communication with the Secure World |
| * |
| * Note that this driver supports only one instance of the Secure World |
| */ |
| struct tf_comm { |
| /* |
| * The spin lock protecting concurrent access to the structure. |
| */ |
| spinlock_t lock; |
| |
| /* |
| * Bit vector with the following possible flags: |
| * - TF_COMM_FLAG_IRQ_REQUESTED: If set, indicates that |
| * the IRQ has been successfuly requested. |
| * - TF_COMM_FLAG_TERMINATING: If set, indicates that the |
| * communication with the Secure World is being terminated. |
| * Transmissions to the Secure World are not permitted |
| * - TF_COMM_FLAG_W3B_ALLOCATED: If set, indicates that the |
| * W3B buffer has been allocated. |
| * |
| * This bit vector must be accessed with the kernel's atomic bitwise |
| * operations. |
| */ |
| unsigned long flags; |
| |
| /* |
| * The virtual address of the L1 shared buffer. |
| */ |
| struct tf_l1_shared_buffer *pBuffer; |
| |
| /* |
| * The wait queue the client threads are waiting on. |
| */ |
| wait_queue_head_t wait_queue; |
| |
| #ifdef CONFIG_TF_TRUSTZONE |
| /* |
| * The interrupt line used by the Secure World. |
| */ |
| int soft_int_irq; |
| |
| /* ----- W3B ----- */ |
| /* shared memory descriptor to identify the W3B */ |
| struct tf_shmem_desc w3b_shmem_desc; |
| |
| /* Virtual address of the kernel allocated shared memory */ |
| u32 w3b; |
| |
| /* offset of data in shared memory coarse pages */ |
| u32 w3b_shmem_offset; |
| |
| u32 w3b_shmem_size; |
| |
| struct tf_coarse_page_table_allocation_context |
| w3b_cpt_alloc_context; |
| #endif |
| #ifdef CONFIG_TF_ZEBRA |
| /* |
| * The SE SDP can only be initialized once... |
| */ |
| int se_initialized; |
| |
| /* Virtual address of the L0 communication buffer */ |
| void *init_shared_buffer; |
| |
| /* |
| * Lock to be held by a client when executing an RPC |
| */ |
| struct mutex rpc_mutex; |
| |
| /* |
| * Lock to protect concurrent accesses to DMA channels |
| */ |
| struct mutex dma_mutex; |
| #endif |
| }; |
| |
| |
| #define TF_COMM_FLAG_IRQ_REQUESTED (0) |
| #define TF_COMM_FLAG_PA_AVAILABLE (1) |
| #define TF_COMM_FLAG_TERMINATING (2) |
| #define TF_COMM_FLAG_W3B_ALLOCATED (3) |
| #define TF_COMM_FLAG_L1_SHARED_ALLOCATED (4) |
| |
| /*----------------------------------------------------------------------------*/ |
| |
| struct tf_device_stats { |
| struct kobject kobj; |
| |
| struct kobj_type kobj_type; |
| |
| struct attribute kobj_stat_attribute; |
| |
| struct attribute *kobj_attribute_list[2]; |
| |
| atomic_t stat_pages_allocated; |
| atomic_t stat_memories_allocated; |
| atomic_t stat_pages_locked; |
| }; |
| |
| /* |
| * This structure describes the information about one device handled by the |
| * driver. Note that the driver supports only a single device. see the global |
| * variable g_tf_dev |
| |
| */ |
| struct tf_device { |
| /* |
| * The device number for the device. |
| */ |
| dev_t dev_number; |
| |
| /* |
| * Interfaces the char device with the kernel. |
| */ |
| struct cdev cdev; |
| |
| #ifdef CONFIG_TF_TEEC |
| struct cdev cdev_teec; |
| #endif |
| |
| #ifdef CONFIG_TF_ZEBRA |
| struct cdev cdev_ctrl; |
| |
| /* |
| * Globals for CUS |
| */ |
| /* Current key handles loaded in HWAs */ |
| u32 aes1_key_context; |
| u32 des_key_context; |
| bool sham1_is_public; |
| |
| /* Object used to serialize HWA accesses */ |
| struct semaphore aes1_sema; |
| struct semaphore des_sema; |
| struct semaphore sha_sema; |
| |
| /* |
| * An aligned and correctly shaped pre-allocated buffer used for DMA |
| * transfers |
| */ |
| u32 dma_buffer_length; |
| u8 *dma_buffer; |
| dma_addr_t dma_buffer_phys; |
| |
| /* Workspace allocated at boot time and reserved to the Secure World */ |
| u32 workspace_addr; |
| u32 workspace_size; |
| |
| /* |
| * A Mutex to provide exclusive locking of the ioctl() |
| */ |
| struct mutex dev_mutex; |
| #endif |
| |
| /* |
| * Communications with the SM. |
| */ |
| struct tf_comm sm; |
| |
| /* |
| * Lists the connections attached to this device. A connection is |
| * created each time a user space application "opens" a file descriptor |
| * on the driver |
| */ |
| struct list_head connection_list; |
| |
| /* |
| * The spin lock used to protect concurrent access to the connection |
| * list. |
| */ |
| spinlock_t connection_list_lock; |
| |
| struct tf_device_stats stats; |
| }; |
| |
| /*----------------------------------------------------------------------------*/ |
| /* |
| * This type describes a connection state. |
| * This is used to determine whether a message is valid or not. |
| * |
| * Messages are only valid in a certain device state. |
| * Messages may be invalidated between the start of the ioctl call and the |
| * moment the message is sent to the Secure World. |
| * |
| * TF_CONN_STATE_NO_DEVICE_CONTEXT : |
| * The connection has no DEVICE_CONTEXT created and no |
| * CREATE_DEVICE_CONTEXT being processed by the Secure World |
| * TF_CONN_STATE_CREATE_DEVICE_CONTEXT_SENT : |
| * The connection has a CREATE_DEVICE_CONTEXT being processed by the Secure |
| * World |
| * TF_CONN_STATE_VALID_DEVICE_CONTEXT : |
| * The connection has a DEVICE_CONTEXT created and no |
| * DESTROY_DEVICE_CONTEXT is being processed by the Secure World |
| * TF_CONN_STATE_DESTROY_DEVICE_CONTEXT_SENT : |
| * The connection has a DESTROY_DEVICE_CONTEXT being processed by the Secure |
| * World |
| */ |
| enum TF_CONN_STATE { |
| TF_CONN_STATE_NO_DEVICE_CONTEXT = 0, |
| TF_CONN_STATE_CREATE_DEVICE_CONTEXT_SENT, |
| TF_CONN_STATE_VALID_DEVICE_CONTEXT, |
| TF_CONN_STATE_DESTROY_DEVICE_CONTEXT_SENT |
| }; |
| |
| |
| /* |
| * This type describes the status of the command. |
| * |
| * PENDING: |
| * The initial state; the command has not been sent yet. |
| * SENT: |
| * The command has been sent, we are waiting for an answer. |
| * ABORTED: |
| * The command cannot be sent because the device context is invalid. |
| * Note that this only covers the case where some other thread |
| * sent a DESTROY_DEVICE_CONTEXT command. |
| */ |
| enum TF_COMMAND_STATE { |
| TF_COMMAND_STATE_PENDING = 0, |
| TF_COMMAND_STATE_SENT, |
| TF_COMMAND_STATE_ABORTED |
| }; |
| |
| /* |
| * The origin of connection parameters such as login data and |
| * memory reference pointers. |
| * |
| * PROCESS: the calling process. All arguments must be validated. |
| * KERNEL: kernel code. All arguments can be trusted by this driver. |
| */ |
| enum TF_CONNECTION_OWNER { |
| TF_CONNECTION_OWNER_PROCESS = 0, |
| TF_CONNECTION_OWNER_KERNEL, |
| }; |
| |
| |
| /* |
| * This structure describes a connection to the driver |
| * A connection is created each time an application opens a file descriptor on |
| * the driver |
| */ |
| struct tf_connection { |
| /* |
| * Identifies the connection in the list of the connections attached to |
| * the same device. |
| */ |
| struct list_head list; |
| |
| /* |
| * State of the connection. |
| */ |
| enum TF_CONN_STATE state; |
| |
| /* |
| * A pointer to the corresponding device structure |
| */ |
| struct tf_device *dev; |
| |
| /* |
| * A spinlock to use to access state |
| */ |
| spinlock_t state_lock; |
| |
| /* |
| * Counts the number of operations currently pending on the connection. |
| * (for debug only) |
| */ |
| atomic_t pending_op_count; |
| |
| /* |
| * A handle for the device context |
| */ |
| u32 device_context; |
| |
| /* |
| * Lists the used shared memory descriptors |
| */ |
| struct list_head used_shmem_list; |
| |
| /* |
| * Lists the free shared memory descriptors |
| */ |
| struct list_head free_shmem_list; |
| |
| /* |
| * A mutex to use to access this structure |
| */ |
| struct mutex shmem_mutex; |
| |
| /* |
| * Counts the number of shared memories registered. |
| */ |
| atomic_t shmem_count; |
| |
| /* |
| * Page to retrieve memory properties when |
| * registering shared memory through REGISTER_SHARED_MEMORY |
| * messages |
| */ |
| struct vm_area_struct **vmas; |
| |
| /* |
| * coarse page table allocation context |
| */ |
| struct tf_coarse_page_table_allocation_context cpt_alloc_context; |
| |
| /* The origin of connection parameters such as login data and |
| memory reference pointers. */ |
| enum TF_CONNECTION_OWNER owner; |
| |
| #ifdef CONFIG_TF_ZEBRA |
| /* Lists all the Cryptoki Update Shortcuts */ |
| struct list_head shortcut_list; |
| |
| /* Lock to protect concurrent accesses to shortcut_list */ |
| spinlock_t shortcut_list_lock; |
| #endif |
| |
| #ifdef CONFIG_TF_ION |
| struct ion_client *ion_client; |
| #endif |
| }; |
| |
| /*----------------------------------------------------------------------------*/ |
| |
| /* |
| * The operation_id field of a message points to this structure. |
| * It is used to identify the thread that triggered the message transmission |
| * Whoever reads an answer can wake up that thread using the completion event |
| */ |
| struct tf_answer_struct { |
| bool answer_copied; |
| union tf_answer *answer; |
| }; |
| |
| /*----------------------------------------------------------------------------*/ |
| |
| /** |
| * The ASCII-C string representation of the base name of the devices managed by |
| * this driver. |
| */ |
| #define TF_DEVICE_BASE_NAME "tf_driver" |
| |
| |
| /** |
| * The major and minor numbers of the registered character device driver. |
| * Only 1 instance of the driver is supported. |
| */ |
| #define TF_DEVICE_MINOR_NUMBER (0) |
| |
| struct tf_device *tf_get_device(void); |
| |
| #define CLEAN_CACHE_CFG_MASK (~0xC) /* 1111 0011 */ |
| |
| /*----------------------------------------------------------------------------*/ |
| /* |
| * Kernel Differences |
| */ |
| |
| #ifdef CONFIG_ANDROID |
| #define GROUP_INFO get_current_groups() |
| #else |
| #define GROUP_INFO (current->group_info) |
| #endif |
| |
| #endif /* !defined(__TF_DEFS_H__) */ |