Blame view
include/linux/dmar.h
7.82 KB
10e5247f4 Intel IOMMU: DMAR... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* * Copyright (c) 2006, Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope 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. * * Copyright (C) Ashok Raj <ashok.raj@intel.com> * Copyright (C) Shaohua Li <shaohua.li@intel.com> */ #ifndef __DMAR_H__ #define __DMAR_H__ #include <linux/acpi.h> #include <linux/types.h> |
ba3959276 Intel IOMMU: Inte... |
26 |
#include <linux/msi.h> |
1531a6a6b x86, dmar: start ... |
27 |
#include <linux/irqreturn.h> |
3a5670e8a iommu/vt-d: Intro... |
28 |
#include <linux/rwsem.h> |
b2d091031 sched/headers: Pr... |
29 |
#include <linux/rculist.h> |
10e5247f4 Intel IOMMU: DMAR... |
30 |
|
6eea69dd8 include/linux/dma... |
31 |
struct acpi_dmar_header; |
78d8e7046 iommu/vt-d: Dynam... |
32 33 34 35 36 |
#ifdef CONFIG_X86 # define DMAR_UNITS_SUPPORTED MAX_IO_APICS #else # define DMAR_UNITS_SUPPORTED 64 #endif |
41750d31f x86, x2apic: Enab... |
37 38 39 |
/* DMAR Flags */ #define DMAR_INTR_REMAP 0x1 #define DMAR_X2APIC_OPT_OUT 0x2 |
ba3959276 Intel IOMMU: Inte... |
40 |
struct intel_iommu; |
694835dc2 iommu/vt-d: mark ... |
41 |
|
832bd8586 iommu/vt-d: Chang... |
42 43 44 45 46 |
struct dmar_dev_scope { struct device __rcu *dev; u8 bus; u8 devfn; }; |
d3f138106 iommu: Rename the... |
47 |
#ifdef CONFIG_DMAR_TABLE |
41750d31f x86, x2apic: Enab... |
48 |
extern struct acpi_table_header *dmar_tbl; |
2ae210106 x64, x2apic/intr-... |
49 50 51 52 |
struct dmar_drhd_unit { struct list_head list; /* list of drhd units */ struct acpi_dmar_header *hdr; /* ACPI header */ u64 reg_base_addr; /* register base address*/ |
832bd8586 iommu/vt-d: Chang... |
53 |
struct dmar_dev_scope *devices;/* target device array */ |
2ae210106 x64, x2apic/intr-... |
54 |
int devices_cnt; /* target device count */ |
276dbf997 intel-iommu: Hand... |
55 |
u16 segment; /* PCI domain */ |
2ae210106 x64, x2apic/intr-... |
56 57 58 59 |
u8 ignored:1; /* ignore drhd */ u8 include_all:1; struct intel_iommu *iommu; }; |
57384592c iommu/vt-d: Store... |
60 61 62 63 64 |
struct dmar_pci_path { u8 bus; u8 device; u8 function; }; |
59ce0515c iommu/vt-d: Updat... |
65 66 67 68 69 70 |
struct dmar_pci_notify_info { struct pci_dev *dev; unsigned long event; int bus; u16 seg; u16 level; |
57384592c iommu/vt-d: Store... |
71 |
struct dmar_pci_path path[]; |
59ce0515c iommu/vt-d: Updat... |
72 |
} __attribute__((packed)); |
3a5670e8a iommu/vt-d: Intro... |
73 |
extern struct rw_semaphore dmar_global_lock; |
2ae210106 x64, x2apic/intr-... |
74 75 76 |
extern struct list_head dmar_drhd_units; #define for_each_drhd_unit(drhd) \ |
0e242612d iommu/vt-d: Use R... |
77 |
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) |
2ae210106 x64, x2apic/intr-... |
78 |
|
7c9197791 iommu/vt-d, trivi... |
79 |
#define for_each_active_drhd_unit(drhd) \ |
0e242612d iommu/vt-d: Use R... |
80 |
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \ |
7c9197791 iommu/vt-d, trivi... |
81 |
if (drhd->ignored) {} else |
8f912ba4d intel-iommu: Add ... |
82 |
#define for_each_active_iommu(i, drhd) \ |
0e242612d iommu/vt-d: Use R... |
83 |
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \ |
8f912ba4d intel-iommu: Add ... |
84 85 86 |
if (i=drhd->iommu, drhd->ignored) {} else #define for_each_iommu(i, drhd) \ |
0e242612d iommu/vt-d: Use R... |
87 |
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \ |
8f912ba4d intel-iommu: Add ... |
88 |
if (i=drhd->iommu, 0) {} else |
0e242612d iommu/vt-d: Use R... |
89 90 91 92 93 94 95 |
static inline bool dmar_rcu_check(void) { return rwsem_is_locked(&dmar_global_lock) || system_state == SYSTEM_BOOTING; } #define dmar_rcu_dereference(p) rcu_dereference_check((p), dmar_rcu_check()) |
b683b230a iommu/vt-d: Intro... |
96 |
#define for_each_dev_scope(a, c, p, d) \ |
832bd8586 iommu/vt-d: Chang... |
97 |
for ((p) = 0; ((d) = (p) < (c) ? dmar_rcu_dereference((a)[(p)].dev) : \ |
0e242612d iommu/vt-d: Use R... |
98 |
NULL, (p) < (c)); (p)++) |
b683b230a iommu/vt-d: Intro... |
99 100 101 |
#define for_each_active_dev_scope(a, c, p, d) \ for_each_dev_scope((a), (c), (p), (d)) if (!(d)) { continue; } else |
2ae210106 x64, x2apic/intr-... |
102 |
extern int dmar_table_init(void); |
2ae210106 x64, x2apic/intr-... |
103 |
extern int dmar_dev_scope_init(void); |
ada4d4b2a iommu/vt-d: fix P... |
104 |
extern int dmar_parse_dev_scope(void *start, void *end, int *cnt, |
832bd8586 iommu/vt-d: Chang... |
105 |
struct dmar_dev_scope **devices, u16 segment); |
bb3a6b784 iommu/vt-d: Facto... |
106 |
extern void *dmar_alloc_dev_scope(void *start, void *end, int *cnt); |
832bd8586 iommu/vt-d: Chang... |
107 |
extern void dmar_free_dev_scope(struct dmar_dev_scope **devices, int *cnt); |
59ce0515c iommu/vt-d: Updat... |
108 109 |
extern int dmar_insert_dev_scope(struct dmar_pci_notify_info *info, void *start, void*end, u16 segment, |
832bd8586 iommu/vt-d: Chang... |
110 |
struct dmar_dev_scope *devices, |
59ce0515c iommu/vt-d: Updat... |
111 112 |
int devices_cnt); extern int dmar_remove_dev_scope(struct dmar_pci_notify_info *info, |
832bd8586 iommu/vt-d: Chang... |
113 |
u16 segment, struct dmar_dev_scope *devices, |
59ce0515c iommu/vt-d: Updat... |
114 |
int count); |
2ae210106 x64, x2apic/intr-... |
115 |
/* Intel IOMMU detection */ |
480125ba4 x86, iommu: Make ... |
116 |
extern int detect_intel_iommu(void); |
9d783ba04 x86, x2apic: enab... |
117 |
extern int enable_drhd_fault_handling(void); |
6b1972493 iommu/vt-d: Imple... |
118 119 |
extern int dmar_device_add(acpi_handle handle); extern int dmar_device_remove(acpi_handle handle); |
8594d8326 iommu/vt-d: Simpl... |
120 |
|
c2a0b538d iommu/vt-d: Intro... |
121 122 123 124 |
static inline int dmar_res_noop(struct acpi_dmar_header *hdr, void *arg) { return 0; } |
8594d8326 iommu/vt-d: Simpl... |
125 126 127 |
#ifdef CONFIG_INTEL_IOMMU extern int iommu_detected, no_iommu; extern int intel_iommu_init(void); |
c2a0b538d iommu/vt-d: Intro... |
128 129 |
extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg); extern int dmar_parse_one_atsr(struct acpi_dmar_header *header, void *arg); |
6b1972493 iommu/vt-d: Imple... |
130 131 132 |
extern int dmar_check_one_atsr(struct acpi_dmar_header *hdr, void *arg); extern int dmar_release_one_atsr(struct acpi_dmar_header *hdr, void *arg); extern int dmar_iommu_hotplug(struct dmar_drhd_unit *dmaru, bool insert); |
8594d8326 iommu/vt-d: Simpl... |
133 134 135 |
extern int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info); #else /* !CONFIG_INTEL_IOMMU: */ static inline int intel_iommu_init(void) { return -ENODEV; } |
6b1972493 iommu/vt-d: Imple... |
136 |
|
c2a0b538d iommu/vt-d: Intro... |
137 138 |
#define dmar_parse_one_rmrr dmar_res_noop #define dmar_parse_one_atsr dmar_res_noop |
6b1972493 iommu/vt-d: Imple... |
139 140 |
#define dmar_check_one_atsr dmar_res_noop #define dmar_release_one_atsr dmar_res_noop |
8594d8326 iommu/vt-d: Simpl... |
141 |
static inline int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info) |
29b61be65 x86, x2apic: clea... |
142 |
{ |
8594d8326 iommu/vt-d: Simpl... |
143 |
return 0; |
29b61be65 x86, x2apic: clea... |
144 |
} |
6b1972493 iommu/vt-d: Imple... |
145 146 147 148 149 |
static inline int dmar_iommu_hotplug(struct dmar_drhd_unit *dmaru, bool insert) { return 0; } |
8594d8326 iommu/vt-d: Simpl... |
150 |
#endif /* CONFIG_INTEL_IOMMU */ |
6b1972493 iommu/vt-d: Imple... |
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
#ifdef CONFIG_IRQ_REMAP extern int dmar_ir_hotplug(struct dmar_drhd_unit *dmaru, bool insert); #else /* CONFIG_IRQ_REMAP */ static inline int dmar_ir_hotplug(struct dmar_drhd_unit *dmaru, bool insert) { return 0; } #endif /* CONFIG_IRQ_REMAP */ #else /* CONFIG_DMAR_TABLE */ static inline int dmar_device_add(void *handle) { return 0; } static inline int dmar_device_remove(void *handle) { return 0; } |
8594d8326 iommu/vt-d: Simpl... |
169 |
#endif /* CONFIG_DMAR_TABLE */ |
2ae210106 x64, x2apic/intr-... |
170 |
|
2ae210106 x64, x2apic/intr-... |
171 172 |
struct irte { union { |
3bf174722 iommu: dmar: Exte... |
173 |
/* Shared between remapped and posted mode*/ |
2ae210106 x64, x2apic/intr-... |
174 |
struct { |
3bf174722 iommu: dmar: Exte... |
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
__u64 present : 1, /* 0 */ fpd : 1, /* 1 */ __res0 : 6, /* 2 - 6 */ avail : 4, /* 8 - 11 */ __res1 : 3, /* 12 - 14 */ pst : 1, /* 15 */ vector : 8, /* 16 - 23 */ __res2 : 40; /* 24 - 63 */ }; /* Remapped mode */ struct { __u64 r_present : 1, /* 0 */ r_fpd : 1, /* 1 */ dst_mode : 1, /* 2 */ redir_hint : 1, /* 3 */ trigger_mode : 1, /* 4 */ dlvry_mode : 3, /* 5 - 7 */ r_avail : 4, /* 8 - 11 */ r_res0 : 4, /* 12 - 15 */ r_vector : 8, /* 16 - 23 */ r_res1 : 8, /* 24 - 31 */ dest_id : 32; /* 32 - 63 */ }; /* Posted mode */ struct { __u64 p_present : 1, /* 0 */ p_fpd : 1, /* 1 */ p_res0 : 6, /* 2 - 7 */ p_avail : 4, /* 8 - 11 */ p_res1 : 2, /* 12 - 13 */ p_urgent : 1, /* 14 */ p_pst : 1, /* 15 */ p_vector : 8, /* 16 - 23 */ p_res2 : 14, /* 24 - 37 */ pda_l : 26; /* 38 - 63 */ |
2ae210106 x64, x2apic/intr-... |
212 213 214 215 216 |
}; __u64 low; }; union { |
3bf174722 iommu: dmar: Exte... |
217 |
/* Shared between remapped and posted mode*/ |
2ae210106 x64, x2apic/intr-... |
218 |
struct { |
3bf174722 iommu: dmar: Exte... |
219 220 221 222 223 224 225 226 227 228 229 230 231 |
__u64 sid : 16, /* 64 - 79 */ sq : 2, /* 80 - 81 */ svt : 2, /* 82 - 83 */ __res3 : 44; /* 84 - 127 */ }; /* Posted mode*/ struct { __u64 p_sid : 16, /* 64 - 79 */ p_sq : 2, /* 80 - 81 */ p_svt : 2, /* 82 - 83 */ p_res3 : 12, /* 84 - 95 */ pda_h : 32; /* 96 - 127 */ |
2ae210106 x64, x2apic/intr-... |
232 233 234 235 |
}; __u64 high; }; }; |
423f08595 x86: Embedd irq_2... |
236 |
|
bf56027ff iommu: dmar: Prov... |
237 238 239 240 241 242 243 244 245 246 247 |
static inline void dmar_copy_shared_irte(struct irte *dst, struct irte *src) { dst->present = src->present; dst->fpd = src->fpd; dst->avail = src->avail; dst->pst = src->pst; dst->vector = src->vector; dst->sid = src->sid; dst->sq = src->sq; dst->svt = src->svt; } |
3bf174722 iommu: dmar: Exte... |
248 249 |
#define PDA_LOW_BIT 26 #define PDA_HIGH_BIT 32 |
41750d31f x86, x2apic: Enab... |
250 251 252 253 |
enum { IRQ_REMAP_XAPIC_MODE, IRQ_REMAP_X2APIC_MODE, }; |
3460a6d9c Intel IOMMU: DMAR... |
254 255 256 |
/* Can't use the common MSI interrupt functions * since DMAR is not a pci device */ |
5c2837fba dmar: Convert to ... |
257 258 259 |
struct irq_data; extern void dmar_msi_unmask(struct irq_data *data); extern void dmar_msi_mask(struct irq_data *data); |
3460a6d9c Intel IOMMU: DMAR... |
260 261 262 |
extern void dmar_msi_read(int irq, struct msi_msg *msg); extern void dmar_msi_write(int irq, struct msi_msg *msg); extern int dmar_set_interrupt(struct intel_iommu *iommu); |
1531a6a6b x86, dmar: start ... |
263 |
extern irqreturn_t dmar_fault(int irq, void *dev_id); |
34742db8e iommu/vt-d: Refin... |
264 265 |
extern int dmar_alloc_hwirq(int id, int node, void *arg); extern void dmar_free_hwirq(int irq); |
3460a6d9c Intel IOMMU: DMAR... |
266 |
|
10e5247f4 Intel IOMMU: DMAR... |
267 |
#endif /* __DMAR_H__ */ |