blob: 66d8e95523bdf28fbfc3e3a2fee47206fe2a32ef [file] [log] [blame]
Mark Allyn4856ab32010-11-17 15:45:36 -08001#ifndef __SEP_DEV_H__
2#define __SEP_DEV_H__
3
4/*
5 *
6 * sep_dev.h - Security Processor Device Structures
7 *
Mark Allynff3d9c32011-12-28 17:37:59 +00008 * Copyright(c) 2009-2011 Intel Corporation. All rights reserved.
9 * Contributions(c) 2009-2011 Discretix. All rights reserved.
Mark Allyn4856ab32010-11-17 15:45:36 -080010 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
13 * Software Foundation; version 2 of the License.
14 *
15 * This program is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18 * more details.
19 *
20 * You should have received a copy of the GNU General Public License along with
21 * this program; if not, write to the Free Software Foundation, Inc., 59
22 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 *
24 * CONTACTS:
25 *
26 * Mark Allyn mark.a.allyn@intel.com
27 * Jayant Mangalampalli jayant.mangalampalli@intel.com
28 *
29 * CHANGES
30 * 2010.09.14 upgrade to Medfield
Mark Allynff3d9c32011-12-28 17:37:59 +000031 * 2011.02.22 enable kernel crypto
Mark Allyn4856ab32010-11-17 15:45:36 -080032 */
33
34struct sep_device {
35 /* pointer to pci dev */
36 struct pci_dev *pdev;
37
38 /* character device file */
39 struct cdev sep_cdev;
Mark Allyn4856ab32010-11-17 15:45:36 -080040
41 /* devices (using misc dev) */
42 struct miscdevice miscdev_sep;
Mark Allyn4856ab32010-11-17 15:45:36 -080043
44 /* major / minor numbers of device */
45 dev_t sep_devno;
Mark Allynff3d9c32011-12-28 17:37:59 +000046 /* guards command sent counter */
Mark Allyn4856ab32010-11-17 15:45:36 -080047 spinlock_t snd_rply_lck;
Mark Allynff3d9c32011-12-28 17:37:59 +000048 /* guards driver memory usage in fastcall if */
49 struct semaphore sep_doublebuf;
Mark Allyn4856ab32010-11-17 15:45:36 -080050
51 /* flags to indicate use and lock status of sep */
52 u32 pid_doing_transaction;
53 unsigned long in_use_flags;
54
Mark Allyn4856ab32010-11-17 15:45:36 -080055 /* address of the shared memory allocated during init for SEP driver
56 (coherent alloc) */
57 dma_addr_t shared_bus;
58 size_t shared_size;
59 void *shared_addr;
60
Mark Allyn4856ab32010-11-17 15:45:36 -080061 /* start address of the access to the SEP registers from driver */
62 dma_addr_t reg_physical_addr;
63 dma_addr_t reg_physical_end;
64 void __iomem *reg_addr;
65
Mark Allynff3d9c32011-12-28 17:37:59 +000066 /* wait queue heads of the driver */
67 wait_queue_head_t event_interrupt;
68 wait_queue_head_t event_transactions;
Mark Allyn4856ab32010-11-17 15:45:36 -080069
Mark Allynff3d9c32011-12-28 17:37:59 +000070 struct list_head sep_queue_status;
71 u32 sep_queue_num;
72 spinlock_t sep_queue_lock;
Mark Allyn4856ab32010-11-17 15:45:36 -080073
Mark Allynff3d9c32011-12-28 17:37:59 +000074 /* Is this in use? */
75 u32 in_use;
76
77 /* indicates whether power save is set up */
78 u32 power_save_setup;
79
80 /* Power state */
81 u32 power_state;
Mark Allyn4856ab32010-11-17 15:45:36 -080082
83 /* transaction counter that coordinates the
84 transactions between SEP and HOST */
85 unsigned long send_ct;
86 /* counter for the messages from sep */
87 unsigned long reply_ct;
Mark Allyn4856ab32010-11-17 15:45:36 -080088
Mark Allynff3d9c32011-12-28 17:37:59 +000089 /* The following are used for kernel crypto client requests */
90 u32 in_kernel; /* Set for kernel client request */
91 struct tasklet_struct finish_tasklet;
92 enum type_of_request current_request;
93 enum hash_stage current_hash_stage;
94 struct ahash_request *current_hash_req;
95 struct ablkcipher_request *current_cypher_req;
96 struct sep_system_ctx *sctx;
97 spinlock_t busy_lock;
98 struct workqueue_struct *workqueue;
99};
Mark Allyn4856ab32010-11-17 15:45:36 -0800100
Mark Allynff3d9c32011-12-28 17:37:59 +0000101extern struct sep_device *sep_dev;
Mark Allyn4856ab32010-11-17 15:45:36 -0800102
Mark Allynff3d9c32011-12-28 17:37:59 +0000103/**
104 * SEP message header for a transaction
105 * @reserved: reserved memory (two words)
106 * @token: SEP message token
107 * @msg_len: message length
108 * @opcpde: message opcode
109 */
110struct sep_msgarea_hdr {
111 u32 reserved[2];
112 u32 token;
113 u32 msg_len;
114 u32 opcode;
115};
Mark Allyn4856ab32010-11-17 15:45:36 -0800116
Mark Allynff3d9c32011-12-28 17:37:59 +0000117/**
118 * sep_queue_data - data to be maintained in status queue for a transaction
119 * @opcode : transaction opcode
120 * @size : message size
121 * @pid: owner process
122 * @name: owner process name
123 */
124struct sep_queue_data {
125 u32 opcode;
126 u32 size;
127 s32 pid;
128 u8 name[TASK_COMM_LEN];
129};
Mark Allyn4856ab32010-11-17 15:45:36 -0800130
Mark Allynff3d9c32011-12-28 17:37:59 +0000131/** sep_queue_info - maintains status info of all transactions
132 * @list: head of list
133 * @sep_queue_data : data for transaction
134 */
135struct sep_queue_info {
136 struct list_head list;
137 struct sep_queue_data data;
Mark Allyn4856ab32010-11-17 15:45:36 -0800138};
139
140static inline void sep_write_reg(struct sep_device *dev, int reg, u32 value)
141{
142 void __iomem *addr = dev->reg_addr + reg;
143 writel(value, addr);
144}
145
146static inline u32 sep_read_reg(struct sep_device *dev, int reg)
147{
148 void __iomem *addr = dev->reg_addr + reg;
149 return readl(addr);
150}
151
152/* wait for SRAM write complete(indirect write */
153static inline void sep_wait_sram_write(struct sep_device *dev)
154{
155 u32 reg_val;
Peter Hueweeb6b4202010-12-02 00:43:32 +0100156 do {
Mark Allyn4856ab32010-11-17 15:45:36 -0800157 reg_val = sep_read_reg(dev, HW_SRAM_DATA_READY_REG_ADDR);
Peter Hueweeb6b4202010-12-02 00:43:32 +0100158 } while (!(reg_val & 1));
Mark Allyn4856ab32010-11-17 15:45:36 -0800159}
160
161
162#endif