diff options
-rw-r--r-- | drivers/pci/msi.c | 20 | ||||
-rw-r--r-- | include/asm-i386/msi.h | 9 | ||||
-rw-r--r-- | include/asm-i386/smp.h | 6 | ||||
-rw-r--r-- | include/asm-ia64/msi.h | 3 | ||||
-rw-r--r-- | include/asm-x86_64/msi.h | 4 | ||||
-rw-r--r-- | include/asm-x86_64/smp.h | 6 |
6 files changed, 26 insertions, 22 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index a2033552423c..202b7507a357 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include "pci.h" | 23 | #include "pci.h" |
24 | #include "msi.h" | 24 | #include "msi.h" |
25 | 25 | ||
26 | #define MSI_TARGET_CPU first_cpu(cpu_online_map) | ||
27 | |||
26 | static DEFINE_SPINLOCK(msi_lock); | 28 | static DEFINE_SPINLOCK(msi_lock); |
27 | static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; | 29 | static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; |
28 | static kmem_cache_t* msi_cachep; | 30 | static kmem_cache_t* msi_cachep; |
@@ -92,6 +94,7 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) | |||
92 | struct msi_desc *entry; | 94 | struct msi_desc *entry; |
93 | struct msg_address address; | 95 | struct msg_address address; |
94 | unsigned int irq = vector; | 96 | unsigned int irq = vector; |
97 | unsigned int dest_cpu = first_cpu(cpu_mask); | ||
95 | 98 | ||
96 | entry = (struct msi_desc *)msi_desc[vector]; | 99 | entry = (struct msi_desc *)msi_desc[vector]; |
97 | if (!entry || !entry->dev) | 100 | if (!entry || !entry->dev) |
@@ -108,9 +111,9 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) | |||
108 | pci_read_config_dword(entry->dev, msi_lower_address_reg(pos), | 111 | pci_read_config_dword(entry->dev, msi_lower_address_reg(pos), |
109 | &address.lo_address.value); | 112 | &address.lo_address.value); |
110 | address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; | 113 | address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; |
111 | address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) << | 114 | address.lo_address.value |= (cpu_physical_id(dest_cpu) << |
112 | MSI_TARGET_CPU_SHIFT); | 115 | MSI_TARGET_CPU_SHIFT); |
113 | entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask); | 116 | entry->msi_attrib.current_cpu = cpu_physical_id(dest_cpu); |
114 | pci_write_config_dword(entry->dev, msi_lower_address_reg(pos), | 117 | pci_write_config_dword(entry->dev, msi_lower_address_reg(pos), |
115 | address.lo_address.value); | 118 | address.lo_address.value); |
116 | set_native_irq_info(irq, cpu_mask); | 119 | set_native_irq_info(irq, cpu_mask); |
@@ -123,9 +126,9 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) | |||
123 | 126 | ||
124 | address.lo_address.value = readl(entry->mask_base + offset); | 127 | address.lo_address.value = readl(entry->mask_base + offset); |
125 | address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; | 128 | address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; |
126 | address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) << | 129 | address.lo_address.value |= (cpu_physical_id(dest_cpu) << |
127 | MSI_TARGET_CPU_SHIFT); | 130 | MSI_TARGET_CPU_SHIFT); |
128 | entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask); | 131 | entry->msi_attrib.current_cpu = cpu_physical_id(dest_cpu); |
129 | writel(address.lo_address.value, entry->mask_base + offset); | 132 | writel(address.lo_address.value, entry->mask_base + offset); |
130 | set_native_irq_info(irq, cpu_mask); | 133 | set_native_irq_info(irq, cpu_mask); |
131 | break; | 134 | break; |
@@ -259,14 +262,15 @@ static void msi_data_init(struct msg_data *msi_data, | |||
259 | static void msi_address_init(struct msg_address *msi_address) | 262 | static void msi_address_init(struct msg_address *msi_address) |
260 | { | 263 | { |
261 | unsigned int dest_id; | 264 | unsigned int dest_id; |
265 | unsigned long dest_phys_id = cpu_physical_id(MSI_TARGET_CPU); | ||
262 | 266 | ||
263 | memset(msi_address, 0, sizeof(struct msg_address)); | 267 | memset(msi_address, 0, sizeof(struct msg_address)); |
264 | msi_address->hi_address = (u32)0; | 268 | msi_address->hi_address = (u32)0; |
265 | dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT); | 269 | dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT); |
266 | msi_address->lo_address.u.dest_mode = MSI_DEST_MODE; | 270 | msi_address->lo_address.u.dest_mode = MSI_PHYSICAL_MODE; |
267 | msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE; | 271 | msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE; |
268 | msi_address->lo_address.u.dest_id = dest_id; | 272 | msi_address->lo_address.u.dest_id = dest_id; |
269 | msi_address->lo_address.value |= (MSI_TARGET_CPU << MSI_TARGET_CPU_SHIFT); | 273 | msi_address->lo_address.value |= (dest_phys_id << MSI_TARGET_CPU_SHIFT); |
270 | } | 274 | } |
271 | 275 | ||
272 | static int msi_free_vector(struct pci_dev* dev, int vector, int reassign); | 276 | static int msi_free_vector(struct pci_dev* dev, int vector, int reassign); |
diff --git a/include/asm-i386/msi.h b/include/asm-i386/msi.h index b85393094c83..f041d4495faf 100644 --- a/include/asm-i386/msi.h +++ b/include/asm-i386/msi.h | |||
@@ -10,13 +10,6 @@ | |||
10 | #include <mach_apic.h> | 10 | #include <mach_apic.h> |
11 | 11 | ||
12 | #define LAST_DEVICE_VECTOR 232 | 12 | #define LAST_DEVICE_VECTOR 232 |
13 | #define MSI_DEST_MODE MSI_LOGICAL_MODE | 13 | #define MSI_TARGET_CPU_SHIFT 12 |
14 | #define MSI_TARGET_CPU_SHIFT 12 | ||
15 | |||
16 | #ifdef CONFIG_SMP | ||
17 | #define MSI_TARGET_CPU logical_smp_processor_id() | ||
18 | #else | ||
19 | #define MSI_TARGET_CPU cpu_to_logical_apicid(first_cpu(cpu_online_map)) | ||
20 | #endif | ||
21 | 14 | ||
22 | #endif /* ASM_MSI_H */ | 15 | #endif /* ASM_MSI_H */ |
diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h index 13250199976d..61d3ab9db70c 100644 --- a/include/asm-i386/smp.h +++ b/include/asm-i386/smp.h | |||
@@ -45,6 +45,8 @@ extern void unlock_ipi_call_lock(void); | |||
45 | #define MAX_APICID 256 | 45 | #define MAX_APICID 256 |
46 | extern u8 x86_cpu_to_apicid[]; | 46 | extern u8 x86_cpu_to_apicid[]; |
47 | 47 | ||
48 | #define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] | ||
49 | |||
48 | #ifdef CONFIG_HOTPLUG_CPU | 50 | #ifdef CONFIG_HOTPLUG_CPU |
49 | extern void cpu_exit_clear(void); | 51 | extern void cpu_exit_clear(void); |
50 | extern void cpu_uninit(void); | 52 | extern void cpu_uninit(void); |
@@ -92,6 +94,10 @@ extern int __cpu_disable(void); | |||
92 | extern void __cpu_die(unsigned int cpu); | 94 | extern void __cpu_die(unsigned int cpu); |
93 | #endif /* !__ASSEMBLY__ */ | 95 | #endif /* !__ASSEMBLY__ */ |
94 | 96 | ||
97 | #else /* CONFIG_SMP */ | ||
98 | |||
99 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | ||
100 | |||
95 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | 101 | #define NO_PROC_ID 0xFF /* No processor magic marker */ |
96 | 102 | ||
97 | #endif | 103 | #endif |
diff --git a/include/asm-ia64/msi.h b/include/asm-ia64/msi.h index 60f2137f9278..97890f7762b3 100644 --- a/include/asm-ia64/msi.h +++ b/include/asm-ia64/msi.h | |||
@@ -12,9 +12,6 @@ | |||
12 | static inline void set_intr_gate (int nr, void *func) {} | 12 | static inline void set_intr_gate (int nr, void *func) {} |
13 | #define IO_APIC_VECTOR(irq) (irq) | 13 | #define IO_APIC_VECTOR(irq) (irq) |
14 | #define ack_APIC_irq ia64_eoi | 14 | #define ack_APIC_irq ia64_eoi |
15 | #define cpu_mask_to_apicid(mask) cpu_physical_id(first_cpu(mask)) | ||
16 | #define MSI_DEST_MODE MSI_PHYSICAL_MODE | ||
17 | #define MSI_TARGET_CPU ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff) | ||
18 | #define MSI_TARGET_CPU_SHIFT 4 | 15 | #define MSI_TARGET_CPU_SHIFT 4 |
19 | 16 | ||
20 | #endif /* ASM_MSI_H */ | 17 | #endif /* ASM_MSI_H */ |
diff --git a/include/asm-x86_64/msi.h b/include/asm-x86_64/msi.h index 85c427e472bf..356e0e82f50b 100644 --- a/include/asm-x86_64/msi.h +++ b/include/asm-x86_64/msi.h | |||
@@ -11,8 +11,6 @@ | |||
11 | #include <asm/smp.h> | 11 | #include <asm/smp.h> |
12 | 12 | ||
13 | #define LAST_DEVICE_VECTOR 232 | 13 | #define LAST_DEVICE_VECTOR 232 |
14 | #define MSI_DEST_MODE MSI_LOGICAL_MODE | 14 | #define MSI_TARGET_CPU_SHIFT 12 |
15 | #define MSI_TARGET_CPU_SHIFT 12 | ||
16 | #define MSI_TARGET_CPU logical_smp_processor_id() | ||
17 | 15 | ||
18 | #endif /* ASM_MSI_H */ | 16 | #endif /* ASM_MSI_H */ |
diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h index c57ce4071342..b9fb2173ef99 100644 --- a/include/asm-x86_64/smp.h +++ b/include/asm-x86_64/smp.h | |||
@@ -135,5 +135,11 @@ static __inline int logical_smp_processor_id(void) | |||
135 | } | 135 | } |
136 | #endif | 136 | #endif |
137 | 137 | ||
138 | #ifdef CONFIG_SMP | ||
139 | #define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] | ||
140 | #else | ||
141 | #define cpu_physical_id(cpu) boot_cpu_id | ||
142 | #endif | ||
143 | |||
138 | #endif | 144 | #endif |
139 | 145 | ||