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 */ 16static 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 32static 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 44static 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 */ 56extern 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 */ 64static 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 */ 79struct mpidr_hash { 80 u32 mask; /* used by sleep.S */ 81 u32 shift_aff[3]; /* used by sleep.S */ 82 u32 bits; 83}; 84 85extern struct mpidr_hash mpidr_hash; 86 87static inline u32 mpidr_hash_size(void) 88{ 89 return 1 << mpidr_hash.bits; 90} 91 92extern int platform_can_cpu_hotplug(void); 93 94#endif 95