aboutsummaryrefslogtreecommitdiffstats
path: root/security/tf_driver/tf_defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'security/tf_driver/tf_defs.h')
-rw-r--r--security/tf_driver/tf_defs.h538
1 files changed, 538 insertions, 0 deletions
diff --git a/security/tf_driver/tf_defs.h b/security/tf_driver/tf_defs.h
new file mode 100644
index 00000000000..ac209370c55
--- /dev/null
+++ b/security/tf_driver/tf_defs.h
@@ -0,0 +1,538 @@
1/**
2 * Copyright (c) 2011 Trusted Logic S.A.
3 * All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
17 * MA 02111-1307 USA
18 */
19
20#ifndef __TF_DEFS_H__
21#define __TF_DEFS_H__
22
23#include <linux/atomic.h>
24#include <linux/version.h>
25#include <linux/fs.h>
26#include <linux/cdev.h>
27#include <linux/completion.h>
28#include <linux/list.h>
29#include <linux/spinlock.h>
30#include <linux/sysfs.h>
31#include <linux/sched.h>
32#include <linux/semaphore.h>
33#ifdef CONFIG_HAS_WAKELOCK
34#include <linux/wakelock.h>
35#endif
36
37#include "tf_protocol.h"
38
39/*----------------------------------------------------------------------------*/
40
41#define SIZE_1KB 0x400
42
43/*
44 * Maximum number of shared memory blocks that can be reigsters in a connection
45 */
46#define TF_SHMEM_MAX_COUNT (64)
47
48/*
49 * Describes the possible types of shared memories
50 *
51 * TF_SHMEM_TYPE_PREALLOC_REGISTERED_SHMEM :
52 * The descriptor describes a registered shared memory.
53 * Its coarse pages are preallocated when initializing the
54 * connection
55 * TF_SHMEM_TYPE_REGISTERED_SHMEM :
56 * The descriptor describes a registered shared memory.
57 * Its coarse pages are not preallocated
58 * TF_SHMEM_TYPE_PM_HIBERNATE :
59 * The descriptor describes a power management shared memory.
60 */
61enum TF_SHMEM_TYPE {
62 TF_SHMEM_TYPE_PREALLOC_REGISTERED_SHMEM = 0,
63 TF_SHMEM_TYPE_REGISTERED_SHMEM,
64 TF_SHMEM_TYPE_PM_HIBERNATE,
65};
66
67
68/*
69 * This structure contains a pointer on a coarse page table
70 */
71struct tf_coarse_page_table {
72 /*
73 * Identifies the coarse page table descriptor in
74 * free_coarse_page_tables list
75 */
76 struct list_head list;
77
78 /*
79 * The address of the coarse page table
80 */
81 u32 *descriptors;
82
83 /*
84 * The address of the array containing this coarse page table
85 */
86 struct tf_coarse_page_table_array *parent;
87};
88
89
90#define TF_PAGE_DESCRIPTOR_TYPE_NORMAL 0
91#define TF_PAGE_DESCRIPTOR_TYPE_PREALLOCATED 1
92
93/*
94 * This structure describes an array of up to 4 coarse page tables
95 * allocated within a single 4KB page.
96 */
97struct tf_coarse_page_table_array {
98 /*
99 * identifies the element in the coarse_page_table_arrays list
100 */
101 struct list_head list;
102
103 /*
104 * Type of page descriptor
105 * can take any of TF_PAGE_DESCRIPTOR_TYPE_XXX value
106 */
107 u32 type;
108
109 struct tf_coarse_page_table coarse_page_tables[4];
110
111 /*
112 * A counter of the number of coarse pages currently used
113 * the max value should be 4 (one coarse page table is 1KB while one
114 * page is 4KB)
115 */
116 u8 ref_count;
117};
118
119
120/*
121 * This structure describes a list of coarse page table arrays
122 * with some of the coarse page tables free. It is used
123 * when the driver needs to allocate a new coarse page
124 * table.
125 */
126struct tf_coarse_page_table_allocation_context {
127 /*
128 * The spin lock protecting concurrent access to the structure.
129 */
130 spinlock_t lock;
131
132 /*
133 * The list of allocated coarse page table arrays
134 */
135 struct list_head coarse_page_table_arrays;
136
137 /*
138 * The list of free coarse page tables
139 */
140 struct list_head free_coarse_page_tables;
141};
142
143
144/*
145 * Fully describes a shared memory block
146 */
147struct tf_shmem_desc {
148 /*
149 * Identifies the shared memory descriptor in the list of free shared
150 * memory descriptors
151 */
152 struct list_head list;
153
154 /*
155 * Identifies the type of shared memory descriptor
156 */
157 enum TF_SHMEM_TYPE type;
158
159 /*
160 * The identifier of the block of shared memory, as returned by the
161 * Secure World.
162 * This identifier is block field of a REGISTER_SHARED_MEMORY answer
163 */
164 u32 block_identifier;
165
166 /* Client buffer */
167 u8 *client_buffer;
168
169 /* Up to eight coarse page table context */
170 struct tf_coarse_page_table *coarse_pg_table[TF_MAX_COARSE_PAGES];
171
172 u32 coarse_pg_table_count;
173
174 /* Reference counter */
175 atomic_t ref_count;
176};
177
178
179/*----------------------------------------------------------------------------*/
180
181/*
182 * This structure describes the communication with the Secure World
183 *
184 * Note that this driver supports only one instance of the Secure World
185 */
186struct tf_comm {
187 /*
188 * The spin lock protecting concurrent access to the structure.
189 */
190 spinlock_t lock;
191
192 /*
193 * Bit vector with the following possible flags:
194 * - TF_COMM_FLAG_IRQ_REQUESTED: If set, indicates that
195 * the IRQ has been successfuly requested.
196 * - TF_COMM_FLAG_TERMINATING: If set, indicates that the
197 * communication with the Secure World is being terminated.
198 * Transmissions to the Secure World are not permitted
199 * - TF_COMM_FLAG_W3B_ALLOCATED: If set, indicates that the
200 * W3B buffer has been allocated.
201 *
202 * This bit vector must be accessed with the kernel's atomic bitwise
203 * operations.
204 */
205 unsigned long flags;
206
207 /*
208 * The virtual address of the L1 shared buffer.
209 */
210 struct tf_l1_shared_buffer *l1_buffer;
211
212 /*
213 * The wait queue the client threads are waiting on.
214 */
215 wait_queue_head_t wait_queue;
216
217#ifdef CONFIG_TF_TRUSTZONE
218 /*
219 * The interrupt line used by the Secure World.
220 */
221 int soft_int_irq;
222
223 /* ----- W3B ----- */
224 /* shared memory descriptor to identify the W3B */
225 struct tf_shmem_desc w3b_shmem_desc;
226
227 /* Virtual address of the kernel allocated shared memory */
228 u32 w3b;
229
230 /* offset of data in shared memory coarse pages */
231 u32 w3b_shmem_offset;
232
233 u32 w3b_shmem_size;
234
235 struct tf_coarse_page_table_allocation_context
236 w3b_cpt_alloc_context;
237#endif
238#ifdef CONFIG_TF_ZEBRA
239 /*
240 * The SE SDP can only be initialized once...
241 */
242 int se_initialized;
243
244 /*
245 * Lock to be held by a client when executing an RPC
246 */
247 struct mutex rpc_mutex;
248
249 /*
250 * Lock to protect concurrent accesses to DMA channels
251 */
252 struct mutex dma_mutex;
253#endif
254};
255
256
257#define TF_COMM_FLAG_IRQ_REQUESTED (0)
258#define TF_COMM_FLAG_PA_AVAILABLE (1)
259#define TF_COMM_FLAG_TERMINATING (2)
260#define TF_COMM_FLAG_W3B_ALLOCATED (3)
261#define TF_COMM_FLAG_L1_SHARED_ALLOCATED (4)
262
263/*----------------------------------------------------------------------------*/
264
265struct tf_device_stats {
266 atomic_t stat_pages_allocated;
267 atomic_t stat_memories_allocated;
268 atomic_t stat_pages_locked;
269};
270
271/*
272 * This structure describes the information about one device handled by the
273 * driver. Note that the driver supports only a single device. see the global
274 * variable g_tf_dev
275
276 */
277struct tf_device {
278 /*
279 * The kernel object for the device
280 */
281 struct kobject kobj;
282
283 /*
284 * The device number for the device.
285 */
286 dev_t dev_number;
287
288 /*
289 * Interfaces the char device with the kernel.
290 */
291 struct cdev cdev;
292
293#ifdef CONFIG_TF_TEEC
294 struct cdev cdev_teec;
295#endif
296
297#ifdef CONFIG_TF_ZEBRA
298 struct cdev cdev_ctrl;
299
300 /*
301 * Globals for CUS
302 */
303 /* Current key handles loaded in HWAs */
304 u32 aes1_key_context;
305 u32 des_key_context;
306 bool sham1_is_public;
307
308 /* Object used to serialize HWA accesses */
309 struct semaphore aes1_sema;
310 struct semaphore des_sema;
311 struct semaphore sha_sema;
312
313 /*
314 * An aligned and correctly shaped pre-allocated buffer used for DMA
315 * transfers
316 */
317 u32 dma_buffer_length;
318 u8 *dma_buffer;
319 dma_addr_t dma_buffer_phys;
320
321 /* Workspace allocated at boot time and reserved to the Secure World */
322 u32 workspace_addr;
323 u32 workspace_size;
324
325 /*
326 * A Mutex to provide exclusive locking of the ioctl()
327 */
328 struct mutex dev_mutex;
329#endif
330
331 /*
332 * Communications with the SM.
333 */
334 struct tf_comm sm;
335
336 /*
337 * Lists the connections attached to this device. A connection is
338 * created each time a user space application "opens" a file descriptor
339 * on the driver
340 */
341 struct list_head connection_list;
342
343 /*
344 * The spin lock used to protect concurrent access to the connection
345 * list.
346 */
347 spinlock_t connection_list_lock;
348
349 struct tf_device_stats stats;
350};
351
352/*----------------------------------------------------------------------------*/
353/*
354 * This type describes a connection state.
355 * This is used to determine whether a message is valid or not.
356 *
357 * Messages are only valid in a certain device state.
358 * Messages may be invalidated between the start of the ioctl call and the
359 * moment the message is sent to the Secure World.
360 *
361 * TF_CONN_STATE_NO_DEVICE_CONTEXT :
362 * The connection has no DEVICE_CONTEXT created and no
363 * CREATE_DEVICE_CONTEXT being processed by the Secure World
364 * TF_CONN_STATE_CREATE_DEVICE_CONTEXT_SENT :
365 * The connection has a CREATE_DEVICE_CONTEXT being processed by the Secure
366 * World
367 * TF_CONN_STATE_VALID_DEVICE_CONTEXT :
368 * The connection has a DEVICE_CONTEXT created and no
369 * DESTROY_DEVICE_CONTEXT is being processed by the Secure World
370 * TF_CONN_STATE_DESTROY_DEVICE_CONTEXT_SENT :
371 * The connection has a DESTROY_DEVICE_CONTEXT being processed by the Secure
372 * World
373 */
374enum TF_CONN_STATE {
375 TF_CONN_STATE_NO_DEVICE_CONTEXT = 0,
376 TF_CONN_STATE_CREATE_DEVICE_CONTEXT_SENT,
377 TF_CONN_STATE_VALID_DEVICE_CONTEXT,
378 TF_CONN_STATE_DESTROY_DEVICE_CONTEXT_SENT
379};
380
381
382/*
383 * This type describes the status of the command.
384 *
385 * PENDING:
386 * The initial state; the command has not been sent yet.
387 * SENT:
388 * The command has been sent, we are waiting for an answer.
389 * ABORTED:
390 * The command cannot be sent because the device context is invalid.
391 * Note that this only covers the case where some other thread
392 * sent a DESTROY_DEVICE_CONTEXT command.
393 */
394enum TF_COMMAND_STATE {
395 TF_COMMAND_STATE_PENDING = 0,
396 TF_COMMAND_STATE_SENT,
397 TF_COMMAND_STATE_ABORTED
398};
399
400/*
401 * The origin of connection parameters such as login data and
402 * memory reference pointers.
403 *
404 * PROCESS: the calling process. All arguments must be validated.
405 * KERNEL: kernel code. All arguments can be trusted by this driver.
406 */
407enum TF_CONNECTION_OWNER {
408 TF_CONNECTION_OWNER_PROCESS = 0,
409 TF_CONNECTION_OWNER_KERNEL,
410};
411
412
413/*
414 * This structure describes a connection to the driver
415 * A connection is created each time an application opens a file descriptor on
416 * the driver
417 */
418struct tf_connection {
419 /*
420 * Identifies the connection in the list of the connections attached to
421 * the same device.
422 */
423 struct list_head list;
424
425 /*
426 * State of the connection.
427 */
428 enum TF_CONN_STATE state;
429
430 /*
431 * A pointer to the corresponding device structure
432 */
433 struct tf_device *dev;
434
435 /*
436 * A spinlock to use to access state
437 */
438 spinlock_t state_lock;
439
440 /*
441 * Counts the number of operations currently pending on the connection.
442 * (for debug only)
443 */
444 atomic_t pending_op_count;
445
446 /*
447 * A handle for the device context
448 */
449 u32 device_context;
450
451 /*
452 * Lists the used shared memory descriptors
453 */
454 struct list_head used_shmem_list;
455
456 /*
457 * Lists the free shared memory descriptors
458 */
459 struct list_head free_shmem_list;
460
461 /*
462 * A mutex to use to access this structure
463 */
464 struct mutex shmem_mutex;
465
466 /*
467 * Counts the number of shared memories registered.
468 */
469 atomic_t shmem_count;
470
471 /*
472 * Page to retrieve memory properties when
473 * registering shared memory through REGISTER_SHARED_MEMORY
474 * messages
475 */
476 struct vm_area_struct **vmas;
477
478 /*
479 * coarse page table allocation context
480 */
481 struct tf_coarse_page_table_allocation_context cpt_alloc_context;
482
483 /* The origin of connection parameters such as login data and
484 memory reference pointers. */
485 enum TF_CONNECTION_OWNER owner;
486
487#ifdef CONFIG_TF_ZEBRA
488 /* Lists all the Cryptoki Update Shortcuts */
489 struct list_head shortcut_list;
490
491 /* Lock to protect concurrent accesses to shortcut_list */
492 spinlock_t shortcut_list_lock;
493#endif
494};
495
496/*----------------------------------------------------------------------------*/
497
498/*
499 * The operation_id field of a message points to this structure.
500 * It is used to identify the thread that triggered the message transmission
501 * Whoever reads an answer can wake up that thread using the completion event
502 */
503struct tf_answer_struct {
504 bool answer_copied;
505 union tf_answer *answer;
506};
507
508/*----------------------------------------------------------------------------*/
509
510/**
511 * The ASCII-C string representation of the base name of the devices managed by
512 * this driver.
513 */
514#define TF_DEVICE_BASE_NAME "tf_driver"
515
516
517/**
518 * The major and minor numbers of the registered character device driver.
519 * Only 1 instance of the driver is supported.
520 */
521#define TF_DEVICE_MINOR_NUMBER (0)
522
523struct tf_device *tf_get_device(void);
524
525#define CLEAN_CACHE_CFG_MASK (~0xC) /* 1111 0011 */
526
527/*----------------------------------------------------------------------------*/
528/*
529 * Kernel Differences
530 */
531
532#ifdef CONFIG_ANDROID
533#define GROUP_INFO get_current_groups()
534#else
535#define GROUP_INFO (current->group_info)
536#endif
537
538#endif /* !defined(__TF_DEFS_H__) */