162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_CACHE_H
362306a36Sopenharmony_ci#define _ASM_POWERPC_CACHE_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifdef __KERNEL__
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/* bytes per L1 cache line */
962306a36Sopenharmony_ci#if defined(CONFIG_PPC_8xx)
1062306a36Sopenharmony_ci#define L1_CACHE_SHIFT		4
1162306a36Sopenharmony_ci#define MAX_COPY_PREFETCH	1
1262306a36Sopenharmony_ci#define IFETCH_ALIGN_SHIFT	2
1362306a36Sopenharmony_ci#elif defined(CONFIG_PPC_E500MC)
1462306a36Sopenharmony_ci#define L1_CACHE_SHIFT		6
1562306a36Sopenharmony_ci#define MAX_COPY_PREFETCH	4
1662306a36Sopenharmony_ci#define IFETCH_ALIGN_SHIFT	3
1762306a36Sopenharmony_ci#elif defined(CONFIG_PPC32)
1862306a36Sopenharmony_ci#define MAX_COPY_PREFETCH	4
1962306a36Sopenharmony_ci#define IFETCH_ALIGN_SHIFT	3	/* 603 fetches 2 insn at a time */
2062306a36Sopenharmony_ci#if defined(CONFIG_PPC_47x)
2162306a36Sopenharmony_ci#define L1_CACHE_SHIFT		7
2262306a36Sopenharmony_ci#else
2362306a36Sopenharmony_ci#define L1_CACHE_SHIFT		5
2462306a36Sopenharmony_ci#endif
2562306a36Sopenharmony_ci#else /* CONFIG_PPC64 */
2662306a36Sopenharmony_ci#define L1_CACHE_SHIFT		7
2762306a36Sopenharmony_ci#define IFETCH_ALIGN_SHIFT	4 /* POWER8,9 */
2862306a36Sopenharmony_ci#endif
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define	L1_CACHE_BYTES		(1 << L1_CACHE_SHIFT)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define	SMP_CACHE_BYTES		L1_CACHE_BYTES
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define IFETCH_ALIGN_BYTES	(1 << IFETCH_ALIGN_SHIFT)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#ifdef CONFIG_NOT_COHERENT_CACHE
3762306a36Sopenharmony_ci#define ARCH_DMA_MINALIGN	L1_CACHE_BYTES
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#if !defined(__ASSEMBLY__)
4162306a36Sopenharmony_ci#ifdef CONFIG_PPC64
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct ppc_cache_info {
4462306a36Sopenharmony_ci	u32 size;
4562306a36Sopenharmony_ci	u32 line_size;
4662306a36Sopenharmony_ci	u32 block_size;	/* L1 only */
4762306a36Sopenharmony_ci	u32 log_block_size;
4862306a36Sopenharmony_ci	u32 blocks_per_page;
4962306a36Sopenharmony_ci	u32 sets;
5062306a36Sopenharmony_ci	u32 assoc;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct ppc64_caches {
5462306a36Sopenharmony_ci	struct ppc_cache_info l1d;
5562306a36Sopenharmony_ci	struct ppc_cache_info l1i;
5662306a36Sopenharmony_ci	struct ppc_cache_info l2;
5762306a36Sopenharmony_ci	struct ppc_cache_info l3;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciextern struct ppc64_caches ppc64_caches;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline u32 l1_dcache_shift(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return ppc64_caches.l1d.log_block_size;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline u32 l1_dcache_bytes(void)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	return ppc64_caches.l1d.block_size;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline u32 l1_icache_shift(void)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	return ppc64_caches.l1i.log_block_size;
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistatic inline u32 l1_icache_bytes(void)
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	return ppc64_caches.l1i.block_size;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci#else
8262306a36Sopenharmony_cistatic inline u32 l1_dcache_shift(void)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	return L1_CACHE_SHIFT;
8562306a36Sopenharmony_ci}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic inline u32 l1_dcache_bytes(void)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	return L1_CACHE_BYTES;
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic inline u32 l1_icache_shift(void)
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	return L1_CACHE_SHIFT;
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic inline u32 l1_icache_bytes(void)
9862306a36Sopenharmony_ci{
9962306a36Sopenharmony_ci	return L1_CACHE_BYTES;
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#endif
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define __read_mostly __section(".data..read_mostly")
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_32
10762306a36Sopenharmony_ciextern long _get_L2CR(void);
10862306a36Sopenharmony_ciextern long _get_L3CR(void);
10962306a36Sopenharmony_ciextern void _set_L2CR(unsigned long);
11062306a36Sopenharmony_ciextern void _set_L3CR(unsigned long);
11162306a36Sopenharmony_ci#else
11262306a36Sopenharmony_ci#define _get_L2CR()	0L
11362306a36Sopenharmony_ci#define _get_L3CR()	0L
11462306a36Sopenharmony_ci#define _set_L2CR(val)	do { } while(0)
11562306a36Sopenharmony_ci#define _set_L3CR(val)	do { } while(0)
11662306a36Sopenharmony_ci#endif
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cistatic inline void dcbz(void *addr)
11962306a36Sopenharmony_ci{
12062306a36Sopenharmony_ci	__asm__ __volatile__ ("dcbz 0, %0" : : "r"(addr) : "memory");
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic inline void dcbi(void *addr)
12462306a36Sopenharmony_ci{
12562306a36Sopenharmony_ci	__asm__ __volatile__ ("dcbi 0, %0" : : "r"(addr) : "memory");
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistatic inline void dcbf(void *addr)
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci	__asm__ __volatile__ ("dcbf 0, %0" : : "r"(addr) : "memory");
13162306a36Sopenharmony_ci}
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cistatic inline void dcbst(void *addr)
13462306a36Sopenharmony_ci{
13562306a36Sopenharmony_ci	__asm__ __volatile__ ("dcbst 0, %0" : : "r"(addr) : "memory");
13662306a36Sopenharmony_ci}
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cistatic inline void icbi(void *addr)
13962306a36Sopenharmony_ci{
14062306a36Sopenharmony_ci	asm volatile ("icbi 0, %0" : : "r"(addr) : "memory");
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistatic inline void iccci(void *addr)
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	asm volatile ("iccci 0, %0" : : "r"(addr) : "memory");
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */
14962306a36Sopenharmony_ci#endif /* __KERNEL__ */
15062306a36Sopenharmony_ci#endif /* _ASM_POWERPC_CACHE_H */
151