1 /* 2 * ARM specific SMP header, this contains our implementation 3 * details. 4 */ 5 #ifndef __ASMARM_SMP_PLAT_H 6 #define __ASMARM_SMP_PLAT_H 7 8 #include <linux/cpumask.h> 9 #include <linux/err.h> 10 11 #include <asm/cputype.h> 12 13 /* 14 * Return true if we are running on a SMP platform 15 */ 16 static inline bool is_smp(void) 17 { 18 #ifndef CONFIG_SMP 19 return false; 20 #elif defined(CONFIG_SMP_ON_UP) 21 extern unsigned int smp_on_up; 22 return !!smp_on_up; 23 #else 24 return true; 25 #endif 26 } 27 28 /* all SMP configurations have the extended CPUID registers */ 29 static inline int tlb_ops_need_broadcast(void) 30 { 31 if (!is_smp()) 32 return 0; 33 34 return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 2; 35 } 36 37 #if !defined(CONFIG_SMP) || __LINUX_ARM_ARCH__ >= 7 38 #define cache_ops_need_broadcast() 0 39 #else 40 static inline int cache_ops_need_broadcast(void) 41 { 42 if (!is_smp()) 43 return 0; 44 45 return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 1; 46 } 47 #endif 48 49 /* 50 * Logical CPU mapping. 51 */ 52 extern int __cpu_logical_map[]; 53 #define cpu_logical_map(cpu) __cpu_logical_map[cpu] 54 /* 55 * Retrieve logical cpu index corresponding to a given MPIDR[23:0] 56 * - mpidr: MPIDR[23:0] to be used for the look-up 57 * 58 * Returns the cpu logical index or -EINVAL on look-up error 59 */ 60 static inline int get_logical_index(u32 mpidr) 61 { 62 int cpu; 63 for (cpu = 0; cpu < nr_cpu_ids; cpu++) 64 if (cpu_logical_map(cpu) == mpidr) 65 return cpu; 66 return -EINVAL; 67 } 68 69 #endif 70