aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/asm-x86/amd_iommu.h32
-rw-r--r--include/asm-x86/amd_iommu_types.h244
-rw-r--r--include/asm-x86/cpufeature.h1
-rw-r--r--include/asm-x86/gart.h5
-rw-r--r--include/asm-x86/io.h56
-rw-r--r--include/asm-x86/io_32.h49
-rw-r--r--include/asm-x86/io_64.h71
-rw-r--r--include/linux/delay.h1
8 files changed, 337 insertions, 122 deletions
diff --git a/include/asm-x86/amd_iommu.h b/include/asm-x86/amd_iommu.h
new file mode 100644
index 000000000000..30a12049353b
--- /dev/null
+++ b/include/asm-x86/amd_iommu.h
@@ -0,0 +1,32 @@
1/*
2 * Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
3 * Author: Joerg Roedel <joerg.roedel@amd.com>
4 * Leo Duran <leo.duran@amd.com>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20#ifndef _ASM_X86_AMD_IOMMU_H
21#define _ASM_X86_AMD_IOMMU_H
22
23#ifdef CONFIG_AMD_IOMMU
24extern int amd_iommu_init(void);
25extern int amd_iommu_init_dma_ops(void);
26extern void amd_iommu_detect(void);
27#else
28static inline int amd_iommu_init(void) { return -ENODEV; }
29static inline void amd_iommu_detect(void) { }
30#endif
31
32#endif
diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h
new file mode 100644
index 000000000000..7bfcb47cc452
--- /dev/null
+++ b/include/asm-x86/amd_iommu_types.h
@@ -0,0 +1,244 @@
1/*
2 * Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
3 * Author: Joerg Roedel <joerg.roedel@amd.com>
4 * Leo Duran <leo.duran@amd.com>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20#ifndef __AMD_IOMMU_TYPES_H__
21#define __AMD_IOMMU_TYPES_H__
22
23#include <linux/types.h>
24#include <linux/list.h>
25#include <linux/spinlock.h>
26
27/*
28 * some size calculation constants
29 */
30#define DEV_TABLE_ENTRY_SIZE 256
31#define ALIAS_TABLE_ENTRY_SIZE 2
32#define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *))
33
34/* helper macros */
35#define LOW_U32(x) ((x) & ((1ULL << 32)-1))
36#define HIGH_U32(x) (LOW_U32((x) >> 32))
37
38/* Length of the MMIO region for the AMD IOMMU */
39#define MMIO_REGION_LENGTH 0x4000
40
41/* Capability offsets used by the driver */
42#define MMIO_CAP_HDR_OFFSET 0x00
43#define MMIO_RANGE_OFFSET 0x0c
44
45/* Masks, shifts and macros to parse the device range capability */
46#define MMIO_RANGE_LD_MASK 0xff000000
47#define MMIO_RANGE_FD_MASK 0x00ff0000
48#define MMIO_RANGE_BUS_MASK 0x0000ff00
49#define MMIO_RANGE_LD_SHIFT 24
50#define MMIO_RANGE_FD_SHIFT 16
51#define MMIO_RANGE_BUS_SHIFT 8
52#define MMIO_GET_LD(x) (((x) & MMIO_RANGE_LD_MASK) >> MMIO_RANGE_LD_SHIFT)
53#define MMIO_GET_FD(x) (((x) & MMIO_RANGE_FD_MASK) >> MMIO_RANGE_FD_SHIFT)
54#define MMIO_GET_BUS(x) (((x) & MMIO_RANGE_BUS_MASK) >> MMIO_RANGE_BUS_SHIFT)
55
56/* Flag masks for the AMD IOMMU exclusion range */
57#define MMIO_EXCL_ENABLE_MASK 0x01ULL
58#define MMIO_EXCL_ALLOW_MASK 0x02ULL
59
60/* Used offsets into the MMIO space */
61#define MMIO_DEV_TABLE_OFFSET 0x0000
62#define MMIO_CMD_BUF_OFFSET 0x0008
63#define MMIO_EVT_BUF_OFFSET 0x0010
64#define MMIO_CONTROL_OFFSET 0x0018
65#define MMIO_EXCL_BASE_OFFSET 0x0020
66#define MMIO_EXCL_LIMIT_OFFSET 0x0028
67#define MMIO_CMD_HEAD_OFFSET 0x2000
68#define MMIO_CMD_TAIL_OFFSET 0x2008
69#define MMIO_EVT_HEAD_OFFSET 0x2010
70#define MMIO_EVT_TAIL_OFFSET 0x2018
71#define MMIO_STATUS_OFFSET 0x2020
72
73/* feature control bits */
74#define CONTROL_IOMMU_EN 0x00ULL
75#define CONTROL_HT_TUN_EN 0x01ULL
76#define CONTROL_EVT_LOG_EN 0x02ULL
77#define CONTROL_EVT_INT_EN 0x03ULL
78#define CONTROL_COMWAIT_EN 0x04ULL
79#define CONTROL_PASSPW_EN 0x08ULL
80#define CONTROL_RESPASSPW_EN 0x09ULL
81#define CONTROL_COHERENT_EN 0x0aULL
82#define CONTROL_ISOC_EN 0x0bULL
83#define CONTROL_CMDBUF_EN 0x0cULL
84#define CONTROL_PPFLOG_EN 0x0dULL
85#define CONTROL_PPFINT_EN 0x0eULL
86
87/* command specific defines */
88#define CMD_COMPL_WAIT 0x01
89#define CMD_INV_DEV_ENTRY 0x02
90#define CMD_INV_IOMMU_PAGES 0x03
91
92#define CMD_COMPL_WAIT_STORE_MASK 0x01
93#define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01
94#define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02
95
96#define CMD_INV_IOMMU_ALL_PAGES_ADDRESS 0x7fffffffffffffffULL
97
98/* macros and definitions for device table entries */
99#define DEV_ENTRY_VALID 0x00
100#define DEV_ENTRY_TRANSLATION 0x01
101#define DEV_ENTRY_IR 0x3d
102#define DEV_ENTRY_IW 0x3e
103#define DEV_ENTRY_EX 0x67
104#define DEV_ENTRY_SYSMGT1 0x68
105#define DEV_ENTRY_SYSMGT2 0x69
106#define DEV_ENTRY_INIT_PASS 0xb8
107#define DEV_ENTRY_EINT_PASS 0xb9
108#define DEV_ENTRY_NMI_PASS 0xba
109#define DEV_ENTRY_LINT0_PASS 0xbe
110#define DEV_ENTRY_LINT1_PASS 0xbf
111
112/* constants to configure the command buffer */
113#define CMD_BUFFER_SIZE 8192
114#define CMD_BUFFER_ENTRIES 512
115#define MMIO_CMD_SIZE_SHIFT 56
116#define MMIO_CMD_SIZE_512 (0x9ULL << MMIO_CMD_SIZE_SHIFT)
117
118#define PAGE_MODE_1_LEVEL 0x01
119#define PAGE_MODE_2_LEVEL 0x02
120#define PAGE_MODE_3_LEVEL 0x03
121
122#define IOMMU_PDE_NL_0 0x000ULL
123#define IOMMU_PDE_NL_1 0x200ULL
124#define IOMMU_PDE_NL_2 0x400ULL
125#define IOMMU_PDE_NL_3 0x600ULL
126
127#define IOMMU_PTE_L2_INDEX(address) (((address) >> 30) & 0x1ffULL)
128#define IOMMU_PTE_L1_INDEX(address) (((address) >> 21) & 0x1ffULL)
129#define IOMMU_PTE_L0_INDEX(address) (((address) >> 12) & 0x1ffULL)
130
131#define IOMMU_MAP_SIZE_L1 (1ULL << 21)
132#define IOMMU_MAP_SIZE_L2 (1ULL << 30)
133#define IOMMU_MAP_SIZE_L3 (1ULL << 39)
134
135#define IOMMU_PTE_P (1ULL << 0)
136#define IOMMU_PTE_U (1ULL << 59)
137#define IOMMU_PTE_FC (1ULL << 60)
138#define IOMMU_PTE_IR (1ULL << 61)
139#define IOMMU_PTE_IW (1ULL << 62)
140
141#define IOMMU_L1_PDE(address) \
142 ((address) | IOMMU_PDE_NL_1 | IOMMU_PTE_P | IOMMU_PTE_IR | IOMMU_PTE_IW)
143#define IOMMU_L2_PDE(address) \
144 ((address) | IOMMU_PDE_NL_2 | IOMMU_PTE_P | IOMMU_PTE_IR | IOMMU_PTE_IW)
145
146#define IOMMU_PAGE_MASK (((1ULL << 52) - 1) & ~0xfffULL)
147#define IOMMU_PTE_PRESENT(pte) ((pte) & IOMMU_PTE_P)
148#define IOMMU_PTE_PAGE(pte) (phys_to_virt((pte) & IOMMU_PAGE_MASK))
149#define IOMMU_PTE_MODE(pte) (((pte) >> 9) & 0x07)
150
151#define IOMMU_PROT_MASK 0x03
152#define IOMMU_PROT_IR 0x01
153#define IOMMU_PROT_IW 0x02
154
155/* IOMMU capabilities */
156#define IOMMU_CAP_IOTLB 24
157#define IOMMU_CAP_NPCACHE 26
158
159#define MAX_DOMAIN_ID 65536
160
161struct protection_domain {
162 spinlock_t lock;
163 u16 id;
164 int mode;
165 u64 *pt_root;
166 void *priv;
167};
168
169struct dma_ops_domain {
170 struct list_head list;
171 struct protection_domain domain;
172 unsigned long aperture_size;
173 unsigned long next_bit;
174 unsigned long *bitmap;
175 u64 **pte_pages;
176};
177
178struct amd_iommu {
179 struct list_head list;
180 spinlock_t lock;
181
182 u16 devid;
183 u16 cap_ptr;
184
185 u64 mmio_phys;
186 u8 *mmio_base;
187 u32 cap;
188 u16 first_device;
189 u16 last_device;
190 u64 exclusion_start;
191 u64 exclusion_length;
192
193 u8 *cmd_buf;
194 u32 cmd_buf_size;
195
196 int need_sync;
197
198 struct dma_ops_domain *default_dom;
199};
200
201extern struct list_head amd_iommu_list;
202
203struct dev_table_entry {
204 u32 data[8];
205};
206
207struct unity_map_entry {
208 struct list_head list;
209 u16 devid_start;
210 u16 devid_end;
211 u64 address_start;
212 u64 address_end;
213 int prot;
214};
215
216extern struct list_head amd_iommu_unity_map;
217
218/* data structures for device handling */
219extern struct dev_table_entry *amd_iommu_dev_table;
220extern u16 *amd_iommu_alias_table;
221extern struct amd_iommu **amd_iommu_rlookup_table;
222
223extern unsigned amd_iommu_aperture_order;
224
225extern u16 amd_iommu_last_bdf;
226
227/* data structures for protection domain handling */
228extern struct protection_domain **amd_iommu_pd_table;
229extern unsigned long *amd_iommu_pd_alloc_bitmap;
230
231extern int amd_iommu_isolate;
232
233static inline void print_devid(u16 devid, int nl)
234{
235 int bus = devid >> 8;
236 int dev = devid >> 3 & 0x1f;
237 int fn = devid & 0x07;
238
239 printk("%02x:%02x.%x", bus, dev, fn);
240 if (nl)
241 printk("\n");
242}
243
244#endif
diff --git a/include/asm-x86/cpufeature.h b/include/asm-x86/cpufeature.h
index 78b47e7404eb..84a56da397b1 100644
--- a/include/asm-x86/cpufeature.h
+++ b/include/asm-x86/cpufeature.h
@@ -106,6 +106,7 @@
106/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ 106/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */
107#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */ 107#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */
108#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */ 108#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */
109#define X86_FEATURE_IBS (6*32+ 10) /* Instruction Based Sampling */
109 110
110/* 111/*
111 * Auxiliary flags: Linux defined - For features scattered in various 112 * Auxiliary flags: Linux defined - For features scattered in various
diff --git a/include/asm-x86/gart.h b/include/asm-x86/gart.h
index eeca2f51fd8f..417f76ea677b 100644
--- a/include/asm-x86/gart.h
+++ b/include/asm-x86/gart.h
@@ -22,8 +22,9 @@ extern int gart_iommu_aperture_allowed;
22extern int gart_iommu_aperture_disabled; 22extern int gart_iommu_aperture_disabled;
23extern int fix_aperture; 23extern int fix_aperture;
24#else 24#else
25#define gart_iommu_aperture 0 25#define gart_iommu_aperture 0
26#define gart_iommu_aperture_allowed 0 26#define gart_iommu_aperture_allowed 0
27#define gart_iommu_aperture_disabled 1
27 28
28static inline void early_gart_iommu_check(void) 29static inline void early_gart_iommu_check(void)
29{ 30{
diff --git a/include/asm-x86/io.h b/include/asm-x86/io.h
index d5b11f60dbd0..8e9eca93f9b9 100644
--- a/include/asm-x86/io.h
+++ b/include/asm-x86/io.h
@@ -3,6 +3,62 @@
3 3
4#define ARCH_HAS_IOREMAP_WC 4#define ARCH_HAS_IOREMAP_WC
5 5
6#include <linux/compiler.h>
7
8#define build_mmio_read(name, size, type, reg, barrier) \
9static inline type name(const volatile void __iomem *addr) \
10{ type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \
11:"m" (*(volatile type __force *)addr) barrier); return ret; }
12
13#define build_mmio_write(name, size, type, reg, barrier) \
14static inline void name(type val, volatile void __iomem *addr) \
15{ asm volatile("mov" size " %0,%1": :reg (val), \
16"m" (*(volatile type __force *)addr) barrier); }
17
18build_mmio_read(readb, "b", unsigned char, "q", :"memory")
19build_mmio_read(readw, "w", unsigned short, "r", :"memory")
20build_mmio_read(readl, "l", unsigned int, "r", :"memory")
21
22build_mmio_read(__readb, "b", unsigned char, "q", )
23build_mmio_read(__readw, "w", unsigned short, "r", )
24build_mmio_read(__readl, "l", unsigned int, "r", )
25
26build_mmio_write(writeb, "b", unsigned char, "q", :"memory")
27build_mmio_write(writew, "w", unsigned short, "r", :"memory")
28build_mmio_write(writel, "l", unsigned int, "r", :"memory")
29
30build_mmio_write(__writeb, "b", unsigned char, "q", )
31build_mmio_write(__writew, "w", unsigned short, "r", )
32build_mmio_write(__writel, "l", unsigned int, "r", )
33
34#define readb_relaxed(a) __readb(a)
35#define readw_relaxed(a) __readw(a)
36#define readl_relaxed(a) __readl(a)
37#define __raw_readb __readb
38#define __raw_readw __readw
39#define __raw_readl __readl
40
41#define __raw_writeb __writeb
42#define __raw_writew __writew
43#define __raw_writel __writel
44
45#define mmiowb() barrier()
46
47#ifdef CONFIG_X86_64
48build_mmio_read(readq, "q", unsigned long, "r", :"memory")
49build_mmio_read(__readq, "q", unsigned long, "r", )
50build_mmio_write(writeq, "q", unsigned long, "r", :"memory")
51build_mmio_write(__writeq, "q", unsigned long, "r", )
52
53#define readq_relaxed(a) __readq(a)
54#define __raw_readq __readq
55#define __raw_writeq writeq
56
57/* Let people know we have them */
58#define readq readq
59#define writeq writeq
60#endif
61
6#ifdef CONFIG_X86_32 62#ifdef CONFIG_X86_32
7# include "io_32.h" 63# include "io_32.h"
8#else 64#else
diff --git a/include/asm-x86/io_32.h b/include/asm-x86/io_32.h
index 049e81e797a0..d71be8df9797 100644
--- a/include/asm-x86/io_32.h
+++ b/include/asm-x86/io_32.h
@@ -149,55 +149,6 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
149#define virt_to_bus virt_to_phys 149#define virt_to_bus virt_to_phys
150#define bus_to_virt phys_to_virt 150#define bus_to_virt phys_to_virt
151 151
152/*
153 * readX/writeX() are used to access memory mapped devices. On some
154 * architectures the memory mapped IO stuff needs to be accessed
155 * differently. On the x86 architecture, we just read/write the
156 * memory location directly.
157 */
158
159static inline unsigned char readb(const volatile void __iomem *addr)
160{
161 return *(volatile unsigned char __force *)addr;
162}
163
164static inline unsigned short readw(const volatile void __iomem *addr)
165{
166 return *(volatile unsigned short __force *)addr;
167}
168
169static inline unsigned int readl(const volatile void __iomem *addr)
170{
171 return *(volatile unsigned int __force *) addr;
172}
173
174#define readb_relaxed(addr) readb(addr)
175#define readw_relaxed(addr) readw(addr)
176#define readl_relaxed(addr) readl(addr)
177#define __raw_readb readb
178#define __raw_readw readw
179#define __raw_readl readl
180
181static inline void writeb(unsigned char b, volatile void __iomem *addr)
182{
183 *(volatile unsigned char __force *)addr = b;
184}
185
186static inline void writew(unsigned short b, volatile void __iomem *addr)
187{
188 *(volatile unsigned short __force *)addr = b;
189}
190
191static inline void writel(unsigned int b, volatile void __iomem *addr)
192{
193 *(volatile unsigned int __force *)addr = b;
194}
195#define __raw_writeb writeb
196#define __raw_writew writew
197#define __raw_writel writel
198
199#define mmiowb()
200
201static inline void 152static inline void
202memset_io(volatile void __iomem *addr, unsigned char val, int count) 153memset_io(volatile void __iomem *addr, unsigned char val, int count)
203{ 154{
diff --git a/include/asm-x86/io_64.h b/include/asm-x86/io_64.h
index 0930bedf9e4d..ddd8058a5026 100644
--- a/include/asm-x86/io_64.h
+++ b/include/asm-x86/io_64.h
@@ -204,77 +204,6 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
204#define virt_to_bus virt_to_phys 204#define virt_to_bus virt_to_phys
205#define bus_to_virt phys_to_virt 205#define bus_to_virt phys_to_virt
206 206
207/*
208 * readX/writeX() are used to access memory mapped devices. On some
209 * architectures the memory mapped IO stuff needs to be accessed
210 * differently. On the x86 architecture, we just read/write the
211 * memory location directly.
212 */
213
214static inline __u8 __readb(const volatile void __iomem *addr)
215{
216 return *(__force volatile __u8 *)addr;
217}
218
219static inline __u16 __readw(const volatile void __iomem *addr)
220{
221 return *(__force volatile __u16 *)addr;
222}
223
224static __always_inline __u32 __readl(const volatile void __iomem *addr)
225{
226 return *(__force volatile __u32 *)addr;
227}
228
229static inline __u64 __readq(const volatile void __iomem *addr)
230{
231 return *(__force volatile __u64 *)addr;
232}
233
234#define readb(x) __readb(x)
235#define readw(x) __readw(x)
236#define readl(x) __readl(x)
237#define readq(x) __readq(x)
238#define readb_relaxed(a) readb(a)
239#define readw_relaxed(a) readw(a)
240#define readl_relaxed(a) readl(a)
241#define readq_relaxed(a) readq(a)
242#define __raw_readb readb
243#define __raw_readw readw
244#define __raw_readl readl
245#define __raw_readq readq
246
247#define mmiowb()
248
249static inline void __writel(__u32 b, volatile void __iomem *addr)
250{
251 *(__force volatile __u32 *)addr = b;
252}
253
254static inline void __writeq(__u64 b, volatile void __iomem *addr)
255{
256 *(__force volatile __u64 *)addr = b;
257}
258
259static inline void __writeb(__u8 b, volatile void __iomem *addr)
260{
261 *(__force volatile __u8 *)addr = b;
262}
263
264static inline void __writew(__u16 b, volatile void __iomem *addr)
265{
266 *(__force volatile __u16 *)addr = b;
267}
268
269#define writeq(val, addr) __writeq((val), (addr))
270#define writel(val, addr) __writel((val), (addr))
271#define writew(val, addr) __writew((val), (addr))
272#define writeb(val, addr) __writeb((val), (addr))
273#define __raw_writeb writeb
274#define __raw_writew writew
275#define __raw_writel writel
276#define __raw_writeq writeq
277
278void __memcpy_fromio(void *, unsigned long, unsigned); 207void __memcpy_fromio(void *, unsigned long, unsigned);
279void __memcpy_toio(unsigned long, const void *, unsigned); 208void __memcpy_toio(unsigned long, const void *, unsigned);
280 209
diff --git a/include/linux/delay.h b/include/linux/delay.h
index 54552d21296e..fd832c6d419e 100644
--- a/include/linux/delay.h
+++ b/include/linux/delay.h
@@ -41,6 +41,7 @@ static inline void ndelay(unsigned long x)
41#define ndelay(x) ndelay(x) 41#define ndelay(x) ndelay(x)
42#endif 42#endif
43 43
44extern unsigned long lpj_fine;
44void calibrate_delay(void); 45void calibrate_delay(void);
45void msleep(unsigned int msecs); 46void msleep(unsigned int msecs);
46unsigned long msleep_interruptible(unsigned int msecs); 47unsigned long msleep_interruptible(unsigned int msecs);