linux/arch/arm/include/asm/cachetype.h
<<
>>
Prefs
   1#ifndef __ASM_ARM_CACHETYPE_H
   2#define __ASM_ARM_CACHETYPE_H
   3
   4#define CACHEID_VIVT                    (1 << 0)
   5#define CACHEID_VIPT_NONALIASING        (1 << 1)
   6#define CACHEID_VIPT_ALIASING           (1 << 2)
   7#define CACHEID_VIPT                    (CACHEID_VIPT_ALIASING|CACHEID_VIPT_NONALIASING)
   8#define CACHEID_ASID_TAGGED             (1 << 3)
   9#define CACHEID_VIPT_I_ALIASING         (1 << 4)
  10#define CACHEID_PIPT                    (1 << 5)
  11
  12extern unsigned int cacheid;
  13
  14#define cache_is_vivt()                 cacheid_is(CACHEID_VIVT)
  15#define cache_is_vipt()                 cacheid_is(CACHEID_VIPT)
  16#define cache_is_vipt_nonaliasing()     cacheid_is(CACHEID_VIPT_NONALIASING)
  17#define cache_is_vipt_aliasing()        cacheid_is(CACHEID_VIPT_ALIASING)
  18#define icache_is_vivt_asid_tagged()    cacheid_is(CACHEID_ASID_TAGGED)
  19#define icache_is_vipt_aliasing()       cacheid_is(CACHEID_VIPT_I_ALIASING)
  20#define icache_is_pipt()                cacheid_is(CACHEID_PIPT)
  21
  22/*
  23 * __LINUX_ARM_ARCH__ is the minimum supported CPU architecture
  24 * Mask out support which will never be present on newer CPUs.
  25 * - v6+ is never VIVT
  26 * - v7+ VIPT never aliases on D-side
  27 */
  28#if __LINUX_ARM_ARCH__ >= 7
  29#define __CACHEID_ARCH_MIN      (CACHEID_VIPT_NONALIASING |\
  30                                 CACHEID_ASID_TAGGED |\
  31                                 CACHEID_VIPT_I_ALIASING |\
  32                                 CACHEID_PIPT)
  33#elif __LINUX_ARM_ARCH__ >= 6
  34#define __CACHEID_ARCH_MIN      (~CACHEID_VIVT)
  35#else
  36#define __CACHEID_ARCH_MIN      (~0)
  37#endif
  38
  39/*
  40 * Mask out support which isn't configured
  41 */
  42#if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
  43#define __CACHEID_ALWAYS        (CACHEID_VIVT)
  44#define __CACHEID_NEVER         (~CACHEID_VIVT)
  45#elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
  46#define __CACHEID_ALWAYS        (0)
  47#define __CACHEID_NEVER         (CACHEID_VIVT)
  48#else
  49#define __CACHEID_ALWAYS        (0)
  50#define __CACHEID_NEVER         (0)
  51#endif
  52
  53static inline unsigned int __attribute__((pure)) cacheid_is(unsigned int mask)
  54{
  55        return (__CACHEID_ALWAYS & mask) |
  56               (~__CACHEID_NEVER & __CACHEID_ARCH_MIN & mask & cacheid);
  57}
  58
  59#endif
  60