diff options
author | Mike Travis <travis@sgi.com> | 2008-12-16 20:33:54 -0500 |
---|---|---|
committer | Mike Travis <travis@sgi.com> | 2008-12-16 20:40:56 -0500 |
commit | 95d313cf1c1ecedc8bec5727b09bdacbf67dfc45 (patch) | |
tree | ee4aa8aff232bb30bb725c5670bb67d73484022d /arch/x86/kernel | |
parent | a1681965011916c2f1f0f1f87e70784f5d5d5be5 (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.c | 26 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_cluster.c | 16 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_phys.c | 16 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 16 |
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 50eebd0328fe..1efecd206a74 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 | ||
161 | static 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 | |||
161 | static unsigned int phys_pkg_id(int index_msb) | 170 | static 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 | ||
267 | static 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 | |||
257 | struct genapic apic_physflat = { | 282 | struct 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 f5fa9a91ad38..fd8047f4e455 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 | ||
126 | static 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 | |||
126 | static unsigned int get_apic_id(unsigned long x) | 141 | static 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 41c27b2f3d01..d5578bb8f165 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 | ||
125 | static 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 | |||
125 | static unsigned int get_apic_id(unsigned long x) | 140 | static 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 010659415ae4..53bd2570272c 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 | ||
182 | static 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 | |||
182 | static unsigned int get_apic_id(unsigned long x) | 197 | static 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, |