x86/apic: Factor out default cpu_mask_to_apicid() operations
Signed-off-by: Alexander Gordeev <agordeev@redhat.com> Cc: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Yinghai Lu <yinghai@kernel.org> Link: http://lkml.kernel.org/r/20120605112340.GA11454@dhcp-26-207.brq.redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
bf721d3a3b
commit
6398268d2b
@ -592,14 +592,14 @@ static inline int default_phys_pkg_id(int cpuid_apic, int index_msb)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
default_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
flat_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
||||||
{
|
{
|
||||||
return cpumask_bits(cpumask)[0] & APIC_ALL_CPUS;
|
return cpumask_bits(cpumask)[0] & APIC_ALL_CPUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
flat_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
||||||
const struct cpumask *andmask)
|
const struct cpumask *andmask)
|
||||||
{
|
{
|
||||||
unsigned long mask1 = cpumask_bits(cpumask)[0];
|
unsigned long mask1 = cpumask_bits(cpumask)[0];
|
||||||
unsigned long mask2 = cpumask_bits(andmask)[0];
|
unsigned long mask2 = cpumask_bits(andmask)[0];
|
||||||
@ -608,6 +608,13 @@ default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
|||||||
return (unsigned int)(mask1 & mask2 & mask3);
|
return (unsigned int)(mask1 & mask2 & mask3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern unsigned int
|
||||||
|
default_cpu_mask_to_apicid(const struct cpumask *cpumask);
|
||||||
|
|
||||||
|
extern unsigned int
|
||||||
|
default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
||||||
|
const struct cpumask *andmask);
|
||||||
|
|
||||||
static inline unsigned long default_check_apicid_used(physid_mask_t *map, int apicid)
|
static inline unsigned long default_check_apicid_used(physid_mask_t *map, int apicid)
|
||||||
{
|
{
|
||||||
return physid_isset(apicid, *map);
|
return physid_isset(apicid, *map);
|
||||||
|
@ -2123,6 +2123,34 @@ void default_init_apic_ldr(void)
|
|||||||
apic_write(APIC_LDR, val);
|
apic_write(APIC_LDR, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int default_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
||||||
|
* May as well be the first.
|
||||||
|
*/
|
||||||
|
cpu = cpumask_first(cpumask);
|
||||||
|
if (likely((unsigned)cpu < nr_cpu_ids))
|
||||||
|
return per_cpu(x86_cpu_to_apicid, cpu);
|
||||||
|
|
||||||
|
return BAD_APICID;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
||||||
|
const struct cpumask *andmask)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
for_each_cpu_and(cpu, cpumask, andmask) {
|
||||||
|
if (cpumask_test_cpu(cpu, cpu_online_mask))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return per_cpu(x86_cpu_to_apicid, cpu);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Power management
|
* Power management
|
||||||
*/
|
*/
|
||||||
|
@ -205,8 +205,8 @@ static struct apic apic_flat = {
|
|||||||
.set_apic_id = set_apic_id,
|
.set_apic_id = set_apic_id,
|
||||||
.apic_id_mask = 0xFFu << 24,
|
.apic_id_mask = 0xFFu << 24,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = flat_send_IPI_mask,
|
.send_IPI_mask = flat_send_IPI_mask,
|
||||||
.send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself,
|
.send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself,
|
||||||
@ -284,38 +284,6 @@ static void physflat_send_IPI_all(int vector)
|
|||||||
physflat_send_IPI_mask(cpu_online_mask, vector);
|
physflat_send_IPI_mask(cpu_online_mask, vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int physflat_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
cpu = cpumask_first(cpumask);
|
|
||||||
if ((unsigned)cpu < nr_cpu_ids)
|
|
||||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
|
||||||
else
|
|
||||||
return BAD_APICID;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int
|
|
||||||
physflat_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
|
||||||
const struct cpumask *andmask)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
for_each_cpu_and(cpu, cpumask, andmask) {
|
|
||||||
if (cpumask_test_cpu(cpu, cpu_online_mask))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int physflat_probe(void)
|
static int physflat_probe(void)
|
||||||
{
|
{
|
||||||
if (apic == &apic_physflat || num_possible_cpus() > 8)
|
if (apic == &apic_physflat || num_possible_cpus() > 8)
|
||||||
@ -360,8 +328,8 @@ static struct apic apic_physflat = {
|
|||||||
.set_apic_id = set_apic_id,
|
.set_apic_id = set_apic_id,
|
||||||
.apic_id_mask = 0xFFu << 24,
|
.apic_id_mask = 0xFFu << 24,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = physflat_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = physflat_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = physflat_send_IPI_mask,
|
.send_IPI_mask = physflat_send_IPI_mask,
|
||||||
.send_IPI_mask_allbutself = physflat_send_IPI_mask_allbutself,
|
.send_IPI_mask_allbutself = physflat_send_IPI_mask_allbutself,
|
||||||
|
@ -159,8 +159,8 @@ struct apic apic_noop = {
|
|||||||
.set_apic_id = NULL,
|
.set_apic_id = NULL,
|
||||||
.apic_id_mask = 0x0F << 24,
|
.apic_id_mask = 0x0F << 24,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = noop_send_IPI_mask,
|
.send_IPI_mask = noop_send_IPI_mask,
|
||||||
.send_IPI_mask_allbutself = noop_send_IPI_mask_allbutself,
|
.send_IPI_mask_allbutself = noop_send_IPI_mask_allbutself,
|
||||||
|
@ -152,38 +152,6 @@ static void numachip_send_IPI_self(int vector)
|
|||||||
__default_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
|
__default_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int numachip_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
cpu = cpumask_first(cpumask);
|
|
||||||
if (likely((unsigned)cpu < nr_cpu_ids))
|
|
||||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
|
||||||
|
|
||||||
return BAD_APICID;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int
|
|
||||||
numachip_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
|
||||||
const struct cpumask *andmask)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
for_each_cpu_and(cpu, cpumask, andmask) {
|
|
||||||
if (cpumask_test_cpu(cpu, cpu_online_mask))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init numachip_probe(void)
|
static int __init numachip_probe(void)
|
||||||
{
|
{
|
||||||
return apic == &apic_numachip;
|
return apic == &apic_numachip;
|
||||||
@ -272,8 +240,8 @@ static struct apic apic_numachip __refconst = {
|
|||||||
.set_apic_id = set_apic_id,
|
.set_apic_id = set_apic_id,
|
||||||
.apic_id_mask = 0xffU << 24,
|
.apic_id_mask = 0xffU << 24,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = numachip_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = numachip_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = numachip_send_IPI_mask,
|
.send_IPI_mask = numachip_send_IPI_mask,
|
||||||
.send_IPI_mask_allbutself = numachip_send_IPI_mask_allbutself,
|
.send_IPI_mask_allbutself = numachip_send_IPI_mask_allbutself,
|
||||||
|
@ -96,32 +96,6 @@ static int bigsmp_check_phys_apicid_present(int phys_apicid)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* As we are using single CPU as destination, pick only one CPU here */
|
|
||||||
static unsigned int bigsmp_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
|
||||||
{
|
|
||||||
int cpu = cpumask_first(cpumask);
|
|
||||||
|
|
||||||
if (cpu < nr_cpu_ids)
|
|
||||||
return cpu_physical_id(cpu);
|
|
||||||
return BAD_APICID;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int bigsmp_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
|
||||||
const struct cpumask *andmask)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
for_each_cpu_and(cpu, cpumask, andmask) {
|
|
||||||
if (cpumask_test_cpu(cpu, cpu_online_mask))
|
|
||||||
return cpu_physical_id(cpu);
|
|
||||||
}
|
|
||||||
return BAD_APICID;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bigsmp_phys_pkg_id(int cpuid_apic, int index_msb)
|
static int bigsmp_phys_pkg_id(int cpuid_apic, int index_msb)
|
||||||
{
|
{
|
||||||
return cpuid_apic >> index_msb;
|
return cpuid_apic >> index_msb;
|
||||||
@ -220,8 +194,8 @@ static struct apic apic_bigsmp = {
|
|||||||
.set_apic_id = NULL,
|
.set_apic_id = NULL,
|
||||||
.apic_id_mask = 0xFF << 24,
|
.apic_id_mask = 0xFF << 24,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = bigsmp_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = bigsmp_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = bigsmp_send_IPI_mask,
|
.send_IPI_mask = bigsmp_send_IPI_mask,
|
||||||
.send_IPI_mask_allbutself = NULL,
|
.send_IPI_mask_allbutself = NULL,
|
||||||
|
@ -123,8 +123,8 @@ static struct apic apic_default = {
|
|||||||
.set_apic_id = NULL,
|
.set_apic_id = NULL,
|
||||||
.apic_id_mask = 0x0F << 24,
|
.apic_id_mask = 0x0F << 24,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = default_send_IPI_mask_logical,
|
.send_IPI_mask = default_send_IPI_mask_logical,
|
||||||
.send_IPI_mask_allbutself = default_send_IPI_mask_allbutself_logical,
|
.send_IPI_mask_allbutself = default_send_IPI_mask_allbutself_logical,
|
||||||
|
@ -76,38 +76,6 @@ static void x2apic_send_IPI_all(int vector)
|
|||||||
__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC);
|
__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
int cpu = cpumask_first(cpumask);
|
|
||||||
|
|
||||||
if ((unsigned)cpu < nr_cpu_ids)
|
|
||||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
|
||||||
else
|
|
||||||
return BAD_APICID;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int
|
|
||||||
x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
|
|
||||||
const struct cpumask *andmask)
|
|
||||||
{
|
|
||||||
int cpu;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
|
||||||
* May as well be the first.
|
|
||||||
*/
|
|
||||||
for_each_cpu_and(cpu, cpumask, andmask) {
|
|
||||||
if (cpumask_test_cpu(cpu, cpu_online_mask))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return per_cpu(x86_cpu_to_apicid, cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_x2apic_ldr(void)
|
static void init_x2apic_ldr(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -164,8 +132,8 @@ static struct apic apic_x2apic_phys = {
|
|||||||
.set_apic_id = x2apic_set_apic_id,
|
.set_apic_id = x2apic_set_apic_id,
|
||||||
.apic_id_mask = 0xFFFFFFFFu,
|
.apic_id_mask = 0xFFFFFFFFu,
|
||||||
|
|
||||||
.cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
|
.cpu_mask_to_apicid = default_cpu_mask_to_apicid,
|
||||||
.cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and,
|
.cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and,
|
||||||
|
|
||||||
.send_IPI_mask = x2apic_send_IPI_mask,
|
.send_IPI_mask = x2apic_send_IPI_mask,
|
||||||
.send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself,
|
.send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user