Merge branch 'thinkpad-2.6.32-part2' into release
[pandora-kernel.git] / drivers / staging / sep / sep_dev.h
1 #ifndef __SEP_DEV_H__
2 #define __SEP_DEV_H__
3
4 /*
5  *
6  *  sep_dev.h - Security Processor Device Structures
7  *
8  *  Copyright(c) 2009 Intel Corporation. All rights reserved.
9  *  Copyright(c) 2009 Discretix. All rights reserved.
10  *
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; either version 2 of the License, or (at your option)
14  *  any later version.
15  *
16  *  This program is distributed in the hope that it will be useful, but WITHOUT
17  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
19  *  more details.
20  *
21  *  You should have received a copy of the GNU General Public License along with
22  *  this program; if not, write to the Free Software Foundation, Inc., 59
23  *  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  *
25  *  CONTACTS:
26  *
27  *  Alan Cox            alan@linux.intel.com
28  *
29  */
30
31 struct sep_device {
32         /* pointer to pci dev */
33         struct pci_dev *pdev;
34
35         unsigned long in_use;
36
37         /* address of the shared memory allocated during init for SEP driver
38            (coherent alloc) */
39         void *shared_addr;
40         /* the physical address of the shared area */
41         dma_addr_t shared_bus;
42
43         /* restricted access region (coherent alloc) */
44         dma_addr_t rar_bus;
45         void *rar_addr;
46         /* firmware regions: cache is at rar_addr */
47         unsigned long cache_size;
48
49         /* follows the cache */
50         dma_addr_t resident_bus;
51         unsigned long resident_size;
52         void *resident_addr;
53
54         /* start address of the access to the SEP registers from driver */
55         void __iomem *reg_addr;
56         /* transaction counter that coordinates the transactions between SEP and HOST */
57         unsigned long send_ct;
58         /* counter for the messages from sep */
59         unsigned long reply_ct;
60         /* counter for the number of bytes allocated in the pool for the current
61            transaction */
62         unsigned long data_pool_bytes_allocated;
63
64         /* array of pointers to the pages that represent input data for the synchronic
65            DMA action */
66         struct page **in_page_array;
67
68         /* array of pointers to the pages that represent out data for the synchronic
69            DMA action */
70         struct page **out_page_array;
71
72         /* number of pages in the sep_in_page_array */
73         unsigned long in_num_pages;
74
75         /* number of pages in the sep_out_page_array */
76         unsigned long out_num_pages;
77
78         /* global data for every flow */
79         struct sep_flow_context_t flows[SEP_DRIVER_NUM_FLOWS];
80
81         /* pointer to the workqueue that handles the flow done interrupts */
82         struct workqueue_struct *flow_wq;
83
84 };
85
86 static struct sep_device *sep_dev;
87
88 static inline void sep_write_reg(struct sep_device *dev, int reg, u32 value)
89 {
90         void __iomem *addr = dev->reg_addr + reg;
91         writel(value, addr);
92 }
93
94 static inline u32 sep_read_reg(struct sep_device *dev, int reg)
95 {
96         void __iomem *addr = dev->reg_addr + reg;
97         return readl(addr);
98 }
99
100 /* wait for SRAM write complete(indirect write */
101 static inline void sep_wait_sram_write(struct sep_device *dev)
102 {
103         u32 reg_val;
104         do
105                 reg_val = sep_read_reg(dev, HW_SRAM_DATA_READY_REG_ADDR);
106         while (!(reg_val & 1));
107 }
108
109
110 #endif