linux/arch/powerpc/include/asm/cache.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_POWERPC_CACHE_H
   3#define _ASM_POWERPC_CACHE_H
   4
   5#ifdef __KERNEL__
   6
   7
   8/* bytes per L1 cache line */
   9#if defined(CONFIG_PPC_8xx) || defined(CONFIG_403GCX)
  10#define L1_CACHE_SHIFT          4
  11#define MAX_COPY_PREFETCH       1
  12#define IFETCH_ALIGN_SHIFT      2
  13#elif defined(CONFIG_PPC_E500MC)
  14#define L1_CACHE_SHIFT          6
  15#define MAX_COPY_PREFETCH       4
  16#define IFETCH_ALIGN_SHIFT      3
  17#elif defined(CONFIG_PPC32)
  18#define MAX_COPY_PREFETCH       4
  19#define IFETCH_ALIGN_SHIFT      3       /* 603 fetches 2 insn at a time */
  20#if defined(CONFIG_PPC_47x)
  21#define L1_CACHE_SHIFT          7
  22#else
  23#define L1_CACHE_SHIFT          5
  24#endif
  25#else /* CONFIG_PPC64 */
  26#define L1_CACHE_SHIFT          7
  27#define IFETCH_ALIGN_SHIFT      4 /* POWER8,9 */
  28#endif
  29
  30#define L1_CACHE_BYTES          (1 << L1_CACHE_SHIFT)
  31
  32#define SMP_CACHE_BYTES         L1_CACHE_BYTES
  33
  34#define IFETCH_ALIGN_BYTES      (1 << IFETCH_ALIGN_SHIFT)
  35
  36#if defined(__powerpc64__) && !defined(__ASSEMBLY__)
  37
  38struct ppc_cache_info {
  39        u32 size;
  40        u32 line_size;
  41        u32 block_size; /* L1 only */
  42        u32 log_block_size;
  43        u32 blocks_per_page;
  44        u32 sets;
  45        u32 assoc;
  46};
  47
  48struct ppc64_caches {
  49        struct ppc_cache_info l1d;
  50        struct ppc_cache_info l1i;
  51        struct ppc_cache_info l2;
  52        struct ppc_cache_info l3;
  53};
  54
  55extern struct ppc64_caches ppc64_caches;
  56#endif /* __powerpc64__ && ! __ASSEMBLY__ */
  57
  58#if defined(__ASSEMBLY__)
  59/*
  60 * For a snooping icache, we still need a dummy icbi to purge all the
  61 * prefetched instructions from the ifetch buffers. We also need a sync
  62 * before the icbi to order the the actual stores to memory that might
  63 * have modified instructions with the icbi.
  64 */
  65#define PURGE_PREFETCHED_INS    \
  66        sync;                   \
  67        icbi    0,r3;           \
  68        sync;                   \
  69        isync
  70
  71#else
  72#define __read_mostly __attribute__((__section__(".data..read_mostly")))
  73
  74#ifdef CONFIG_PPC_BOOK3S_32
  75extern long _get_L2CR(void);
  76extern long _get_L3CR(void);
  77extern void _set_L2CR(unsigned long);
  78extern void _set_L3CR(unsigned long);
  79#else
  80#define _get_L2CR()     0L
  81#define _get_L3CR()     0L
  82#define _set_L2CR(val)  do { } while(0)
  83#define _set_L3CR(val)  do { } while(0)
  84#endif
  85
  86static inline void dcbz(void *addr)
  87{
  88        __asm__ __volatile__ ("dcbz 0, %0" : : "r"(addr) : "memory");
  89}
  90
  91static inline void dcbi(void *addr)
  92{
  93        __asm__ __volatile__ ("dcbi 0, %0" : : "r"(addr) : "memory");
  94}
  95
  96static inline void dcbf(void *addr)
  97{
  98        __asm__ __volatile__ ("dcbf 0, %0" : : "r"(addr) : "memory");
  99}
 100
 101static inline void dcbst(void *addr)
 102{
 103        __asm__ __volatile__ ("dcbst 0, %0" : : "r"(addr) : "memory");
 104}
 105#endif /* !__ASSEMBLY__ */
 106#endif /* __KERNEL__ */
 107#endif /* _ASM_POWERPC_CACHE_H */
 108