diff options
Diffstat (limited to 'arch/ia64/kernel/msi_ia64.c')
-rw-r--r-- | arch/ia64/kernel/msi_ia64.c | 59 |
1 files changed, 11 insertions, 48 deletions
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 890339339035..2b15e233f7fe 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -7,44 +7,7 @@ | |||
7 | #include <linux/msi.h> | 7 | #include <linux/msi.h> |
8 | #include <linux/dmar.h> | 8 | #include <linux/dmar.h> |
9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
10 | 10 | #include <asm/msidef.h> | |
11 | /* | ||
12 | * Shifts for APIC-based data | ||
13 | */ | ||
14 | |||
15 | #define MSI_DATA_VECTOR_SHIFT 0 | ||
16 | #define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) | ||
17 | #define MSI_DATA_VECTOR_MASK 0xffffff00 | ||
18 | |||
19 | #define MSI_DATA_DELIVERY_SHIFT 8 | ||
20 | #define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT) | ||
21 | #define MSI_DATA_DELIVERY_LOWPRI (1 << MSI_DATA_DELIVERY_SHIFT) | ||
22 | |||
23 | #define MSI_DATA_LEVEL_SHIFT 14 | ||
24 | #define MSI_DATA_LEVEL_DEASSERT (0 << MSI_DATA_LEVEL_SHIFT) | ||
25 | #define MSI_DATA_LEVEL_ASSERT (1 << MSI_DATA_LEVEL_SHIFT) | ||
26 | |||
27 | #define MSI_DATA_TRIGGER_SHIFT 15 | ||
28 | #define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT) | ||
29 | #define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT) | ||
30 | |||
31 | /* | ||
32 | * Shift/mask fields for APIC-based bus address | ||
33 | */ | ||
34 | |||
35 | #define MSI_TARGET_CPU_SHIFT 4 | ||
36 | #define MSI_ADDR_HEADER 0xfee00000 | ||
37 | |||
38 | #define MSI_ADDR_DESTID_MASK 0xfff0000f | ||
39 | #define MSI_ADDR_DESTID_CPU(cpu) ((cpu) << MSI_TARGET_CPU_SHIFT) | ||
40 | |||
41 | #define MSI_ADDR_DESTMODE_SHIFT 2 | ||
42 | #define MSI_ADDR_DESTMODE_PHYS (0 << MSI_ADDR_DESTMODE_SHIFT) | ||
43 | #define MSI_ADDR_DESTMODE_LOGIC (1 << MSI_ADDR_DESTMODE_SHIFT) | ||
44 | |||
45 | #define MSI_ADDR_REDIRECTION_SHIFT 3 | ||
46 | #define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT) | ||
47 | #define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) | ||
48 | 11 | ||
49 | static struct irq_chip ia64_msi_chip; | 12 | static struct irq_chip ia64_msi_chip; |
50 | 13 | ||
@@ -65,8 +28,8 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
65 | read_msi_msg(irq, &msg); | 28 | read_msi_msg(irq, &msg); |
66 | 29 | ||
67 | addr = msg.address_lo; | 30 | addr = msg.address_lo; |
68 | addr &= MSI_ADDR_DESTID_MASK; | 31 | addr &= MSI_ADDR_DEST_ID_MASK; |
69 | addr |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 32 | addr |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu)); |
70 | msg.address_lo = addr; | 33 | msg.address_lo = addr; |
71 | 34 | ||
72 | data = msg.data; | 35 | data = msg.data; |
@@ -75,7 +38,7 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
75 | msg.data = data; | 38 | msg.data = data; |
76 | 39 | ||
77 | write_msi_msg(irq, &msg); | 40 | write_msi_msg(irq, &msg); |
78 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 41 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
79 | } | 42 | } |
80 | #endif /* CONFIG_SMP */ | 43 | #endif /* CONFIG_SMP */ |
81 | 44 | ||
@@ -98,9 +61,9 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc) | |||
98 | msg.address_hi = 0; | 61 | msg.address_hi = 0; |
99 | msg.address_lo = | 62 | msg.address_lo = |
100 | MSI_ADDR_HEADER | | 63 | MSI_ADDR_HEADER | |
101 | MSI_ADDR_DESTMODE_PHYS | | 64 | MSI_ADDR_DEST_MODE_PHYS | |
102 | MSI_ADDR_REDIRECTION_CPU | | 65 | MSI_ADDR_REDIRECTION_CPU | |
103 | MSI_ADDR_DESTID_CPU(dest_phys_id); | 66 | MSI_ADDR_DEST_ID_CPU(dest_phys_id); |
104 | 67 | ||
105 | msg.data = | 68 | msg.data = |
106 | MSI_DATA_TRIGGER_EDGE | | 69 | MSI_DATA_TRIGGER_EDGE | |
@@ -183,11 +146,11 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
183 | 146 | ||
184 | msg.data &= ~MSI_DATA_VECTOR_MASK; | 147 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
185 | msg.data |= MSI_DATA_VECTOR(cfg->vector); | 148 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
186 | msg.address_lo &= ~MSI_ADDR_DESTID_MASK; | 149 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; |
187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 150 | msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu)); |
188 | 151 | ||
189 | dmar_msi_write(irq, &msg); | 152 | dmar_msi_write(irq, &msg); |
190 | irq_desc[irq].affinity = *mask; | 153 | cpumask_copy(irq_desc[irq].affinity, mask); |
191 | } | 154 | } |
192 | #endif /* CONFIG_SMP */ | 155 | #endif /* CONFIG_SMP */ |
193 | 156 | ||
@@ -215,9 +178,9 @@ msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg) | |||
215 | msg->address_hi = 0; | 178 | msg->address_hi = 0; |
216 | msg->address_lo = | 179 | msg->address_lo = |
217 | MSI_ADDR_HEADER | | 180 | MSI_ADDR_HEADER | |
218 | MSI_ADDR_DESTMODE_PHYS | | 181 | MSI_ADDR_DEST_MODE_PHYS | |
219 | MSI_ADDR_REDIRECTION_CPU | | 182 | MSI_ADDR_REDIRECTION_CPU | |
220 | MSI_ADDR_DESTID_CPU(dest); | 183 | MSI_ADDR_DEST_ID_CPU(dest); |
221 | 184 | ||
222 | msg->data = | 185 | msg->data = |
223 | MSI_DATA_TRIGGER_EDGE | | 186 | MSI_DATA_TRIGGER_EDGE | |