aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
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/kernel
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/kernel')
-rw-r--r--arch/x86/kernel/genapic_flat_64.c26
-rw-r--r--arch/x86/kernel/genx2apic_cluster.c16
-rw-r--r--arch/x86/kernel/genx2apic_phys.c16
-rw-r--r--arch/x86/kernel/genx2apic_uv_x.c16
4 files changed, 74 insertions, 0 deletions
diff --git a/arch/x86/kernel/genapic_flat_64.c b/arch/x86/kernel/genapic_flat_64.c
index 50eebd0328f..1efecd206a7 100644
--- a/arch/x86/kernel/genapic_flat_64.c
+++ b/arch/x86/kernel/genapic_flat_64.c
@@ -158,6 +158,15 @@ static unsigned int flat_cpu_mask_to_apicid(const cpumask_t *cpumask)
158 return cpus_addr(*cpumask)[0] & APIC_ALL_CPUS; 158 return cpus_addr(*cpumask)[0] & APIC_ALL_CPUS;
159} 159}
160 160
161static unsigned int flat_cpu_mask_to_apicid_and(const cpumask_t *cpumask,
162 const cpumask_t *andmask)
163{
164 unsigned long mask1 = cpus_addr(*cpumask)[0] & APIC_ALL_CPUS;
165 unsigned long mask2 = cpus_addr(*andmask)[0] & APIC_ALL_CPUS;
166
167 return (int)(mask1 & mask2);
168}
169
161static unsigned int phys_pkg_id(int index_msb) 170static unsigned int phys_pkg_id(int index_msb)
162{ 171{
163 return hard_smp_processor_id() >> index_msb; 172 return hard_smp_processor_id() >> index_msb;
@@ -178,6 +187,7 @@ struct genapic apic_flat = {
178 .send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself, 187 .send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself,
179 .send_IPI_self = apic_send_IPI_self, 188 .send_IPI_self = apic_send_IPI_self,
180 .cpu_mask_to_apicid = flat_cpu_mask_to_apicid, 189 .cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
190 .cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and,
181 .phys_pkg_id = phys_pkg_id, 191 .phys_pkg_id = phys_pkg_id,
182 .get_apic_id = get_apic_id, 192 .get_apic_id = get_apic_id,
183 .set_apic_id = set_apic_id, 193 .set_apic_id = set_apic_id,
@@ -254,6 +264,21 @@ static unsigned int physflat_cpu_mask_to_apicid(const cpumask_t *cpumask)
254 return BAD_APICID; 264 return BAD_APICID;
255} 265}
256 266
267static unsigned int physflat_cpu_mask_to_apicid_and(const cpumask_t *cpumask,
268 const cpumask_t *andmask)
269{
270 int cpu;
271
272 /*
273 * We're using fixed IRQ delivery, can only return one phys APIC ID.
274 * May as well be the first.
275 */
276 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
277 if (cpu_isset(cpu, *andmask))
278 return per_cpu(x86_cpu_to_apicid, cpu);
279 return BAD_APICID;
280}
281
257struct genapic apic_physflat = { 282struct genapic apic_physflat = {
258 .name = "physical flat", 283 .name = "physical flat",
259 .acpi_madt_oem_check = physflat_acpi_madt_oem_check, 284 .acpi_madt_oem_check = physflat_acpi_madt_oem_check,
@@ -269,6 +294,7 @@ struct genapic apic_physflat = {
269 .send_IPI_mask_allbutself = physflat_send_IPI_mask_allbutself, 294 .send_IPI_mask_allbutself = physflat_send_IPI_mask_allbutself,
270 .send_IPI_self = apic_send_IPI_self, 295 .send_IPI_self = apic_send_IPI_self,
271 .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid, 296 .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid,
297 .cpu_mask_to_apicid_and = physflat_cpu_mask_to_apicid_and,
272 .phys_pkg_id = phys_pkg_id, 298 .phys_pkg_id = phys_pkg_id,
273 .get_apic_id = get_apic_id, 299 .get_apic_id = get_apic_id,
274 .set_apic_id = set_apic_id, 300 .set_apic_id = set_apic_id,
diff --git a/arch/x86/kernel/genx2apic_cluster.c b/arch/x86/kernel/genx2apic_cluster.c
index f5fa9a91ad3..fd8047f4e45 100644
--- a/arch/x86/kernel/genx2apic_cluster.c
+++ b/arch/x86/kernel/genx2apic_cluster.c
@@ -123,6 +123,21 @@ static unsigned int x2apic_cpu_mask_to_apicid(const cpumask_t *cpumask)
123 return BAD_APICID; 123 return BAD_APICID;
124} 124}
125 125
126static unsigned int x2apic_cpu_mask_to_apicid_and(const cpumask_t *cpumask,
127 const cpumask_t *andmask)
128{
129 int cpu;
130
131 /*
132 * We're using fixed IRQ delivery, can only return one phys APIC ID.
133 * May as well be the first.
134 */
135 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
136 if (cpu_isset(cpu, *andmask))
137 return per_cpu(x86_cpu_to_apicid, cpu);
138 return BAD_APICID;
139}
140
126static unsigned int get_apic_id(unsigned long x) 141static unsigned int get_apic_id(unsigned long x)
127{ 142{
128 unsigned int id; 143 unsigned int id;
@@ -172,6 +187,7 @@ struct genapic apic_x2apic_cluster = {
172 .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, 187 .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself,
173 .send_IPI_self = x2apic_send_IPI_self, 188 .send_IPI_self = x2apic_send_IPI_self,
174 .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid, 189 .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
190 .cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and,
175 .phys_pkg_id = phys_pkg_id, 191 .phys_pkg_id = phys_pkg_id,
176 .get_apic_id = get_apic_id, 192 .get_apic_id = get_apic_id,
177 .set_apic_id = set_apic_id, 193 .set_apic_id = set_apic_id,
diff --git a/arch/x86/kernel/genx2apic_phys.c b/arch/x86/kernel/genx2apic_phys.c
index 41c27b2f3d0..d5578bb8f16 100644
--- a/arch/x86/kernel/genx2apic_phys.c
+++ b/arch/x86/kernel/genx2apic_phys.c
@@ -122,6 +122,21 @@ static unsigned int x2apic_cpu_mask_to_apicid(const cpumask_t *cpumask)
122 return BAD_APICID; 122 return BAD_APICID;
123} 123}
124 124
125static unsigned int x2apic_cpu_mask_to_apicid_and(const cpumask_t *cpumask,
126 const cpumask_t *andmask)
127{
128 int cpu;
129
130 /*
131 * We're using fixed IRQ delivery, can only return one phys APIC ID.
132 * May as well be the first.
133 */
134 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
135 if (cpu_isset(cpu, *andmask))
136 return per_cpu(x86_cpu_to_apicid, cpu);
137 return BAD_APICID;
138}
139
125static unsigned int get_apic_id(unsigned long x) 140static unsigned int get_apic_id(unsigned long x)
126{ 141{
127 unsigned int id; 142 unsigned int id;
@@ -168,6 +183,7 @@ struct genapic apic_x2apic_phys = {
168 .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, 183 .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself,
169 .send_IPI_self = x2apic_send_IPI_self, 184 .send_IPI_self = x2apic_send_IPI_self,
170 .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid, 185 .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
186 .cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and,
171 .phys_pkg_id = phys_pkg_id, 187 .phys_pkg_id = phys_pkg_id,
172 .get_apic_id = get_apic_id, 188 .get_apic_id = get_apic_id,
173 .set_apic_id = set_apic_id, 189 .set_apic_id = set_apic_id,
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c
index 010659415ae..53bd2570272 100644
--- a/arch/x86/kernel/genx2apic_uv_x.c
+++ b/arch/x86/kernel/genx2apic_uv_x.c
@@ -179,6 +179,21 @@ static unsigned int uv_cpu_mask_to_apicid(const cpumask_t *cpumask)
179 return BAD_APICID; 179 return BAD_APICID;
180} 180}
181 181
182static unsigned int uv_cpu_mask_to_apicid_and(const cpumask_t *cpumask,
183 const cpumask_t *andmask)
184{
185 int cpu;
186
187 /*
188 * We're using fixed IRQ delivery, can only return one phys APIC ID.
189 * May as well be the first.
190 */
191 while ((cpu = next_cpu(-1, *cpumask)) < nr_cpu_ids)
192 if (cpu_isset(cpu, *andmask))
193 return per_cpu(x86_cpu_to_apicid, cpu);
194 return BAD_APICID;
195}
196
182static unsigned int get_apic_id(unsigned long x) 197static unsigned int get_apic_id(unsigned long x)
183{ 198{
184 unsigned int id; 199 unsigned int id;
@@ -229,6 +244,7 @@ struct genapic apic_x2apic_uv_x = {
229 .send_IPI_mask_allbutself = uv_send_IPI_mask_allbutself, 244 .send_IPI_mask_allbutself = uv_send_IPI_mask_allbutself,
230 .send_IPI_self = uv_send_IPI_self, 245 .send_IPI_self = uv_send_IPI_self,
231 .cpu_mask_to_apicid = uv_cpu_mask_to_apicid, 246 .cpu_mask_to_apicid = uv_cpu_mask_to_apicid,
247 .cpu_mask_to_apicid_and = uv_cpu_mask_to_apicid_and,
232 .phys_pkg_id = phys_pkg_id, 248 .phys_pkg_id = phys_pkg_id,
233 .get_apic_id = get_apic_id, 249 .get_apic_id = get_apic_id,
234 .set_apic_id = set_apic_id, 250 .set_apic_id = set_apic_id,