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 #ifndef CONFIG_MMU 30 #define tlb_ops_need_broadcast() 0 31 #else 32 static inline int tlb_ops_need_broadcast(void) 33 { 34 if (!is_smp()) 35 return 0; 36 37 return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 2; 38 } 39 #endif 40 41 #if !defined(CONFIG_SMP) || __LINUX_ARM_ARCH__ >= 7 42 #define cache_ops_need_broadcast() 0 43 #else 44 static inline int cache_ops_need_broadcast(void) 45 { 46 if (!is_smp()) 47 return 0; 48 49 return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 1; 50 } 51 #endif 52 53 /* 54 * Logical CPU mapping. 55 */ 56 extern u32 __cpu_logical_map[]; 57 #define cpu_logical_map(cpu) __cpu_logical_map[cpu] 58 /* 59 * Retrieve logical cpu index corresponding to a given MPIDR[23:0] 60 * - mpidr: MPIDR[23:0] to be used for the look-up 61 * 62 * Returns the cpu logical index or -EINVAL on look-up error 63 */ 64 static inline int get_logical_index(u32 mpidr) 65 { 66 int cpu; 67 for (cpu = 0; cpu < nr_cpu_ids; cpu++) 68 if (cpu_logical_map(cpu) == mpidr) 69 return cpu; 70 return -EINVAL; 71 } 72 73 /* 74 * NOTE ! Assembly code relies on the following 75 * structure memory layout in order to carry out load 76 * multiple from its base address. For more 77 * information check arch/arm/kernel/sleep.S 78 */ 79 struct mpidr_hash { 80 u32 mask; /* used by sleep.S */ 81 u32 shift_aff[3]; /* used by sleep.S */ 82 u32 bits; 83 }; 84 85 extern struct mpidr_hash mpidr_hash; 86 87 static inline u32 mpidr_hash_size(void) 88 { 89 return 1 << mpidr_hash.bits; 90 } 91 92 extern int platform_can_cpu_hotplug(void); 93 94 #endif 95