aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm/apic.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/include/asm/apic.h')
-rw-r--r--arch/x86/include/asm/apic.h44
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
594static inline unsigned int 596static inline int
595flat_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
600static inline unsigned int 608static inline int
609flat_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
615static inline int
601flat_cpu_mask_to_apicid_and(const struct cpumask *cpumask, 616flat_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
611extern unsigned int 627extern int
612default_cpu_mask_to_apicid(const struct cpumask *cpumask); 628default_cpu_mask_to_apicid(const struct cpumask *cpumask,
629 unsigned int *apicid);
613 630
614extern unsigned int 631extern int
615default_cpu_mask_to_apicid_and(const struct cpumask *cpumask, 632default_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
618static inline bool 636static inline bool
619flat_vector_allocation_domain(int cpu, struct cpumask *retmask) 637flat_vector_allocation_domain(int cpu, struct cpumask *retmask)