aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include
diff options
context:
space:
mode:
authorMike Travis <travis@sgi.com>2008-12-16 20:33:54 -0500
committerMike Travis <travis@sgi.com>2008-12-16 20:40:56 -0500
commit95d313cf1c1ecedc8bec5727b09bdacbf67dfc45 (patch)
treeee4aa8aff232bb30bb725c5670bb67d73484022d /arch/x86/include
parenta1681965011916c2f1f0f1f87e70784f5d5d5be5 (diff)
x86: Add cpu_mask_to_apicid_and
Impact: new API Add a helper function that takes two cpumask's, and's them and then returns the apicid of the result. This removes a need in io_apic.c that uses a temporary cpumask to hold (mask & cfg->domain). Signed-off-by: Mike Travis <travis@sgi.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'arch/x86/include')
-rw-r--r--arch/x86/include/asm/bigsmp/apic.h16
-rw-r--r--arch/x86/include/asm/es7000/apic.h47
-rw-r--r--arch/x86/include/asm/genapic_32.h3
-rw-r--r--arch/x86/include/asm/genapic_64.h2
-rw-r--r--arch/x86/include/asm/mach-default/mach_apic.h10
-rw-r--r--arch/x86/include/asm/mach-generic/mach_apic.h1
-rw-r--r--arch/x86/include/asm/numaq/apic.h6
-rw-r--r--arch/x86/include/asm/summit/apic.h39
8 files changed, 124 insertions, 0 deletions
diff --git a/arch/x86/include/asm/bigsmp/apic.h b/arch/x86/include/asm/bigsmp/apic.h
index dc6225ca48ad..99f9abacf6a2 100644
--- a/arch/x86/include/asm/bigsmp/apic.h
+++ b/arch/x86/include/asm/bigsmp/apic.h
@@ -129,6 +129,22 @@ static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
129 return apicid; 129 return apicid;
130} 130}
131 131
132static inline unsigned int cpu_mask_to_apicid_and(const cpumask_t *cpumask,
133 const cpumask_t *andmask)
134{
135 int cpu;
136
137 /*
138 * We're using fixed IRQ delivery, can only return one phys APIC ID.
139 * May as well be the first.
140 */
141 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
142 if (cpu_isset(cpu, *andmask))
143 return cpu_to_logical_apicid(cpu);
144
145 return BAD_APICID;
146}
147
132static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) 148static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
133{ 149{
134 return cpuid_apic >> index_msb; 150 return cpuid_apic >> index_msb;
diff --git a/arch/x86/include/asm/es7000/apic.h b/arch/x86/include/asm/es7000/apic.h
index 4cac0837bb40..c2bed772af88 100644
--- a/arch/x86/include/asm/es7000/apic.h
+++ b/arch/x86/include/asm/es7000/apic.h
@@ -214,6 +214,53 @@ static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
214 return apicid; 214 return apicid;
215} 215}
216 216
217static inline unsigned int cpu_mask_to_apicid_and(const cpumask_t *cpumask,
218 const cpumask_t *andmask)
219{
220 int num_bits_set;
221 int num_bits_set2;
222 int cpus_found = 0;
223 int cpu;
224 int apicid = 0;
225
226 num_bits_set = cpus_weight(*cpumask);
227 num_bits_set2 = cpus_weight(*andmask);
228 num_bits_set = min_t(int, num_bits_set, num_bits_set2);
229 /* Return id to all */
230 if (num_bits_set >= nr_cpu_ids)
231#if defined CONFIG_ES7000_CLUSTERED_APIC
232 return 0xFF;
233#else
234 return cpu_to_logical_apicid(0);
235#endif
236 /*
237 * The cpus in the mask must all be on the apic cluster. If are not
238 * on the same apicid cluster return default value of TARGET_CPUS.
239 */
240 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
241 if (cpu_isset(cpu, *andmask)
242 apicid = cpu_to_logical_apicid(cpu);
243 while (cpus_found < num_bits_set) {
244 if (cpu_isset(cpu, *cpumask) && cpu_isset(cpu, *andmask)) {
245 int new_apicid = cpu_to_logical_apicid(cpu);
246 if (apicid_cluster(apicid) !=
247 apicid_cluster(new_apicid)) {
248 printk(KERN_WARNING
249 "%s: Not a valid mask!\n", __func__);
250#if defined CONFIG_ES7000_CLUSTERED_APIC
251 return 0xFF;
252#else
253 return cpu_to_logical_apicid(0);
254#endif
255 }
256 apicid = new_apicid;
257 cpus_found++;
258 }
259 cpu++;
260 }
261 return apicid;
262}
263
217static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) 264static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
218{ 265{
219 return cpuid_apic >> index_msb; 266 return cpuid_apic >> index_msb;
diff --git a/arch/x86/include/asm/genapic_32.h b/arch/x86/include/asm/genapic_32.h
index b21ed21c574d..325298a82237 100644
--- a/arch/x86/include/asm/genapic_32.h
+++ b/arch/x86/include/asm/genapic_32.h
@@ -58,6 +58,8 @@ struct genapic {
58 unsigned (*get_apic_id)(unsigned long x); 58 unsigned (*get_apic_id)(unsigned long x);
59 unsigned long apic_id_mask; 59 unsigned long apic_id_mask;
60 unsigned int (*cpu_mask_to_apicid)(const cpumask_t *cpumask); 60 unsigned int (*cpu_mask_to_apicid)(const cpumask_t *cpumask);
61 unsigned int (*cpu_mask_to_apicid_and)(const cpumask_t *cpumask,
62 const cpumask_t *andmask);
61 void (*vector_allocation_domain)(int cpu, cpumask_t *retmask); 63 void (*vector_allocation_domain)(int cpu, cpumask_t *retmask);
62 64
63#ifdef CONFIG_SMP 65#ifdef CONFIG_SMP
@@ -115,6 +117,7 @@ struct genapic {
115 APICFUNC(get_apic_id) \ 117 APICFUNC(get_apic_id) \
116 .apic_id_mask = APIC_ID_MASK, \ 118 .apic_id_mask = APIC_ID_MASK, \
117 APICFUNC(cpu_mask_to_apicid) \ 119 APICFUNC(cpu_mask_to_apicid) \
120 APICFUNC(cpu_mask_to_apicid_and) \
118 APICFUNC(vector_allocation_domain) \ 121 APICFUNC(vector_allocation_domain) \
119 APICFUNC(acpi_madt_oem_check) \ 122 APICFUNC(acpi_madt_oem_check) \
120 IPIFUNC(send_IPI_mask) \ 123 IPIFUNC(send_IPI_mask) \
diff --git a/arch/x86/include/asm/genapic_64.h b/arch/x86/include/asm/genapic_64.h
index a020e7d35a40..301c7f41125d 100644
--- a/arch/x86/include/asm/genapic_64.h
+++ b/arch/x86/include/asm/genapic_64.h
@@ -31,6 +31,8 @@ struct genapic {
31 void (*send_IPI_self)(int vector); 31 void (*send_IPI_self)(int vector);
32 /* */ 32 /* */
33 unsigned int (*cpu_mask_to_apicid)(const cpumask_t *cpumask); 33 unsigned int (*cpu_mask_to_apicid)(const cpumask_t *cpumask);
34 unsigned int (*cpu_mask_to_apicid_and)(const cpumask_t *cpumask,
35 const cpumask_t *andmask);
34 unsigned int (*phys_pkg_id)(int index_msb); 36 unsigned int (*phys_pkg_id)(int index_msb);
35 unsigned int (*get_apic_id)(unsigned long x); 37 unsigned int (*get_apic_id)(unsigned long x);
36 unsigned long (*set_apic_id)(unsigned int id); 38 unsigned long (*set_apic_id)(unsigned int id);
diff --git a/arch/x86/include/asm/mach-default/mach_apic.h b/arch/x86/include/asm/mach-default/mach_apic.h
index c18896b0508c..229b605d104e 100644
--- a/arch/x86/include/asm/mach-default/mach_apic.h
+++ b/arch/x86/include/asm/mach-default/mach_apic.h
@@ -28,6 +28,7 @@ static inline const cpumask_t *target_cpus(void)
28#define apic_id_registered (genapic->apic_id_registered) 28#define apic_id_registered (genapic->apic_id_registered)
29#define init_apic_ldr (genapic->init_apic_ldr) 29#define init_apic_ldr (genapic->init_apic_ldr)
30#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid) 30#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
31#define cpu_mask_to_apicid_and (genapic->cpu_mask_to_apicid_and)
31#define phys_pkg_id (genapic->phys_pkg_id) 32#define phys_pkg_id (genapic->phys_pkg_id)
32#define vector_allocation_domain (genapic->vector_allocation_domain) 33#define vector_allocation_domain (genapic->vector_allocation_domain)
33#define read_apic_id() (GET_APIC_ID(apic_read(APIC_ID))) 34#define read_apic_id() (GET_APIC_ID(apic_read(APIC_ID)))
@@ -66,6 +67,15 @@ static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
66 return cpus_addr(*cpumask)[0]; 67 return cpus_addr(*cpumask)[0];
67} 68}
68 69
70static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask,
71 const cpumask_t *andmask)
72{
73 unsigned long mask1 = cpus_addr(*cpumask)[0];
74 unsigned long mask2 = cpus_addr(*andmask)[0];
75
76 return (unsigned int)(mask1 & mask2);
77}
78
69static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) 79static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
70{ 80{
71 return cpuid_apic >> index_msb; 81 return cpuid_apic >> index_msb;
diff --git a/arch/x86/include/asm/mach-generic/mach_apic.h b/arch/x86/include/asm/mach-generic/mach_apic.h
index e430f47df667..48553e958ad5 100644
--- a/arch/x86/include/asm/mach-generic/mach_apic.h
+++ b/arch/x86/include/asm/mach-generic/mach_apic.h
@@ -24,6 +24,7 @@
24#define check_phys_apicid_present (genapic->check_phys_apicid_present) 24#define check_phys_apicid_present (genapic->check_phys_apicid_present)
25#define check_apicid_used (genapic->check_apicid_used) 25#define check_apicid_used (genapic->check_apicid_used)
26#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid) 26#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
27#define cpu_mask_to_apicid_and (genapic->cpu_mask_to_apicid_and)
27#define vector_allocation_domain (genapic->vector_allocation_domain) 28#define vector_allocation_domain (genapic->vector_allocation_domain)
28#define enable_apic_mode (genapic->enable_apic_mode) 29#define enable_apic_mode (genapic->enable_apic_mode)
29#define phys_pkg_id (genapic->phys_pkg_id) 30#define phys_pkg_id (genapic->phys_pkg_id)
diff --git a/arch/x86/include/asm/numaq/apic.h b/arch/x86/include/asm/numaq/apic.h
index 1df7ebe738e5..abf668ced503 100644
--- a/arch/x86/include/asm/numaq/apic.h
+++ b/arch/x86/include/asm/numaq/apic.h
@@ -127,6 +127,12 @@ static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
127 return (int) 0xF; 127 return (int) 0xF;
128} 128}
129 129
130static inline unsigned int cpu_mask_to_apicid_and(const cpumask_t *cpumask,
131 const cpumask_t *andmask)
132{
133 return (int) 0xF;
134}
135
130/* No NUMA-Q box has a HT CPU, but it can't hurt to use the default code. */ 136/* No NUMA-Q box has a HT CPU, but it can't hurt to use the default code. */
131static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) 137static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
132{ 138{
diff --git a/arch/x86/include/asm/summit/apic.h b/arch/x86/include/asm/summit/apic.h
index 437dc83725ca..cbcc2c7eb1d5 100644
--- a/arch/x86/include/asm/summit/apic.h
+++ b/arch/x86/include/asm/summit/apic.h
@@ -170,6 +170,45 @@ static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
170 return apicid; 170 return apicid;
171} 171}
172 172
173static inline unsigned int cpu_mask_to_apicid_and(const cpumask_t *cpumask,
174 const cpumask_t *andmask)
175{
176 int num_bits_set;
177 int num_bits_set2;
178 int cpus_found = 0;
179 int cpu;
180 int apicid = 0;
181
182 num_bits_set = cpus_weight(*cpumask);
183 num_bits_set2 = cpus_weight(*andmask);
184 num_bits_set = min_t(int, num_bits_set, num_bits_set2);
185 /* Return id to all */
186 if (num_bits_set >= nr_cpu_ids)
187 return 0xFF;
188 /*
189 * The cpus in the mask must all be on the apic cluster. If are not
190 * on the same apicid cluster return default value of TARGET_CPUS.
191 */
192 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
193 if (cpu_isset(cpu, *andmask)
194 apicid = cpu_to_logical_apicid(cpu);
195 while (cpus_found < num_bits_set) {
196 if (cpu_isset(cpu, *cpumask) && cpu_isset(cpu, *andmask)) {
197 int new_apicid = cpu_to_logical_apicid(cpu);
198 if (apicid_cluster(apicid) !=
199 apicid_cluster(new_apicid)) {
200 printk(KERN_WARNING
201 "%s: Not a valid mask!\n", __func__);
202 return 0xFF;
203 }
204 apicid = apicid | new_apicid;
205 cpus_found++;
206 }
207 cpu++;
208 }
209 return apicid;
210}
211
173/* cpuid returns the value latched in the HW at reset, not the APIC ID 212/* cpuid returns the value latched in the HW at reset, not the APIC ID
174 * register's value. For any box whose BIOS changes APIC IDs, like 213 * register's value. For any box whose BIOS changes APIC IDs, like
175 * clustered APIC systems, we must use hard_smp_processor_id. 214 * clustered APIC systems, we must use hard_smp_processor_id.