diff options
Diffstat (limited to 'arch/x86/include/asm/apic.h')
-rw-r--r-- | arch/x86/include/asm/apic.h | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index e3fecd50d5c..ae91f9c7e36 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -331,9 +331,11 @@ struct apic { | |||
331 | unsigned long (*set_apic_id)(unsigned int id); | 331 | unsigned long (*set_apic_id)(unsigned int id); |
332 | unsigned long apic_id_mask; | 332 | unsigned long apic_id_mask; |
333 | 333 | ||
334 | unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask); | 334 | int (*cpu_mask_to_apicid)(const struct cpumask *cpumask, |
335 | unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask, | 335 | unsigned int *apicid); |
336 | const struct cpumask *andmask); | 336 | int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask, |
337 | const struct cpumask *andmask, | ||
338 | unsigned int *apicid); | ||
337 | 339 | ||
338 | /* ipi */ | 340 | /* ipi */ |
339 | void (*send_IPI_mask)(const struct cpumask *mask, int vector); | 341 | void (*send_IPI_mask)(const struct cpumask *mask, int vector); |
@@ -591,29 +593,45 @@ static inline int default_phys_pkg_id(int cpuid_apic, int index_msb) | |||
591 | 593 | ||
592 | #endif | 594 | #endif |
593 | 595 | ||
594 | static inline unsigned int | 596 | static inline int |
595 | flat_cpu_mask_to_apicid(const struct cpumask *cpumask) | 597 | __flat_cpu_mask_to_apicid(unsigned long cpu_mask, unsigned int *apicid) |
596 | { | 598 | { |
597 | return cpumask_bits(cpumask)[0] & APIC_ALL_CPUS; | 599 | cpu_mask &= APIC_ALL_CPUS; |
600 | if (likely(cpu_mask)) { | ||
601 | *apicid = (unsigned int)cpu_mask; | ||
602 | return 0; | ||
603 | } else { | ||
604 | return -EINVAL; | ||
605 | } | ||
598 | } | 606 | } |
599 | 607 | ||
600 | static inline unsigned int | 608 | static inline int |
609 | flat_cpu_mask_to_apicid(const struct cpumask *cpumask, | ||
610 | unsigned int *apicid) | ||
611 | { | ||
612 | return __flat_cpu_mask_to_apicid(cpumask_bits(cpumask)[0], apicid); | ||
613 | } | ||
614 | |||
615 | static inline int | ||
601 | flat_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 616 | flat_cpu_mask_to_apicid_and(const struct cpumask *cpumask, |
602 | const struct cpumask *andmask) | 617 | const struct cpumask *andmask, |
618 | unsigned int *apicid) | ||
603 | { | 619 | { |
604 | unsigned long mask1 = cpumask_bits(cpumask)[0]; | 620 | unsigned long mask1 = cpumask_bits(cpumask)[0]; |
605 | unsigned long mask2 = cpumask_bits(andmask)[0]; | 621 | unsigned long mask2 = cpumask_bits(andmask)[0]; |
606 | unsigned long mask3 = cpumask_bits(cpu_online_mask)[0]; | 622 | unsigned long mask3 = cpumask_bits(cpu_online_mask)[0]; |
607 | 623 | ||
608 | return (unsigned int)(mask1 & mask2 & mask3); | 624 | return __flat_cpu_mask_to_apicid(mask1 & mask2 & mask3, apicid); |
609 | } | 625 | } |
610 | 626 | ||
611 | extern unsigned int | 627 | extern int |
612 | default_cpu_mask_to_apicid(const struct cpumask *cpumask); | 628 | default_cpu_mask_to_apicid(const struct cpumask *cpumask, |
629 | unsigned int *apicid); | ||
613 | 630 | ||
614 | extern unsigned int | 631 | extern int |
615 | default_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 632 | default_cpu_mask_to_apicid_and(const struct cpumask *cpumask, |
616 | const struct cpumask *andmask); | 633 | const struct cpumask *andmask, |
634 | unsigned int *apicid); | ||
617 | 635 | ||
618 | static inline bool | 636 | static inline bool |
619 | flat_vector_allocation_domain(int cpu, struct cpumask *retmask) | 637 | flat_vector_allocation_domain(int cpu, struct cpumask *retmask) |