linux/arch/powerpc/include/asm/cputhreads.h
<<
>>
Prefs
   1#ifndef _ASM_POWERPC_CPUTHREADS_H
   2#define _ASM_POWERPC_CPUTHREADS_H
   3
   4#include <linux/cpumask.h>
   5
   6/*
   7 * Mapping of threads to cores
   8 *
   9 * Note: This implementation is limited to a power of 2 number of
  10 * threads per core and the same number for each core in the system
  11 * (though it would work if some processors had less threads as long
  12 * as the CPU numbers are still allocated, just not brought online).
  13 *
  14 * However, the API allows for a different implementation in the future
  15 * if needed, as long as you only use the functions and not the variables
  16 * directly.
  17 */
  18
  19#ifdef CONFIG_SMP
  20extern int threads_per_core;
  21extern int threads_per_subcore;
  22extern int threads_shift;
  23extern cpumask_t threads_core_mask;
  24#else
  25#define threads_per_core        1
  26#define threads_per_subcore     1
  27#define threads_shift           0
  28#define threads_core_mask       (CPU_MASK_CPU0)
  29#endif
  30
  31/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
  32 *                            hit by the argument
  33 *
  34 * @threads:    a cpumask of threads
  35 *
  36 * This function returns a cpumask which will have one "cpu" (or thread)
  37 * bit set for each core that has at least one thread set in the argument.
  38 *
  39 * This can typically be used for things like IPI for tlb invalidations
  40 * since those need to be done only once per core/TLB
  41 */
  42static inline cpumask_t cpu_thread_mask_to_cores(const struct cpumask *threads)
  43{
  44        cpumask_t       tmp, res;
  45        int             i;
  46
  47        cpumask_clear(&res);
  48        for (i = 0; i < NR_CPUS; i += threads_per_core) {
  49                cpumask_shift_left(&tmp, &threads_core_mask, i);
  50                if (cpumask_intersects(threads, &tmp))
  51                        cpumask_set_cpu(i, &res);
  52        }
  53        return res;
  54}
  55
  56static inline int cpu_nr_cores(void)
  57{
  58        return nr_cpu_ids >> threads_shift;
  59}
  60
  61static inline cpumask_t cpu_online_cores_map(void)
  62{
  63        return cpu_thread_mask_to_cores(cpu_online_mask);
  64}
  65
  66#ifdef CONFIG_SMP
  67int cpu_core_index_of_thread(int cpu);
  68int cpu_first_thread_of_core(int core);
  69#else
  70static inline int cpu_core_index_of_thread(int cpu) { return cpu; }
  71static inline int cpu_first_thread_of_core(int core) { return core; }
  72#endif
  73
  74static inline int cpu_thread_in_core(int cpu)
  75{
  76        return cpu & (threads_per_core - 1);
  77}
  78
  79static inline int cpu_thread_in_subcore(int cpu)
  80{
  81        return cpu & (threads_per_subcore - 1);
  82}
  83
  84static inline int cpu_first_thread_sibling(int cpu)
  85{
  86        return cpu & ~(threads_per_core - 1);
  87}
  88
  89static inline int cpu_last_thread_sibling(int cpu)
  90{
  91        return cpu | (threads_per_core - 1);
  92}
  93
  94
  95
  96#endif /* _ASM_POWERPC_CPUTHREADS_H */
  97
  98