162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _ASM_CACHEFLUSH_H
662306a36Sopenharmony_ci#define _ASM_CACHEFLUSH_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/mm.h>
962306a36Sopenharmony_ci#include <asm/cpu-info.h>
1062306a36Sopenharmony_ci#include <asm/cacheops.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistatic inline bool cache_present(struct cache_desc *cdesc)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	return cdesc->flags & CACHE_PRESENT;
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic inline bool cache_private(struct cache_desc *cdesc)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	return cdesc->flags & CACHE_PRIVATE;
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic inline bool cache_inclusive(struct cache_desc *cdesc)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	return cdesc->flags & CACHE_INCLUSIVE;
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic inline unsigned int cpu_last_level_cache_line_size(void)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	int cache_present = boot_cpu_data.cache_leaves_present;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	return boot_cpu_data.cache_leaves[cache_present - 1].linesz;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciasmlinkage void __flush_cache_all(void);
3562306a36Sopenharmony_civoid local_flush_icache_range(unsigned long start, unsigned long end);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define flush_icache_range	local_flush_icache_range
3862306a36Sopenharmony_ci#define flush_icache_user_range	local_flush_icache_range
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define flush_cache_all()				do { } while (0)
4362306a36Sopenharmony_ci#define flush_cache_mm(mm)				do { } while (0)
4462306a36Sopenharmony_ci#define flush_cache_dup_mm(mm)				do { } while (0)
4562306a36Sopenharmony_ci#define flush_cache_range(vma, start, end)		do { } while (0)
4662306a36Sopenharmony_ci#define flush_cache_page(vma, vmaddr, pfn)		do { } while (0)
4762306a36Sopenharmony_ci#define flush_cache_vmap(start, end)			do { } while (0)
4862306a36Sopenharmony_ci#define flush_cache_vunmap(start, end)			do { } while (0)
4962306a36Sopenharmony_ci#define flush_icache_user_page(vma, page, addr, len)	do { } while (0)
5062306a36Sopenharmony_ci#define flush_dcache_page(page)				do { } while (0)
5162306a36Sopenharmony_ci#define flush_dcache_mmap_lock(mapping)			do { } while (0)
5262306a36Sopenharmony_ci#define flush_dcache_mmap_unlock(mapping)		do { } while (0)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define cache_op(op, addr)						\
5562306a36Sopenharmony_ci	__asm__ __volatile__(						\
5662306a36Sopenharmony_ci	"	cacop	%0, %1					\n"	\
5762306a36Sopenharmony_ci	:								\
5862306a36Sopenharmony_ci	: "i" (op), "ZC" (*(unsigned char *)(addr)))
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic inline void flush_cache_line(int leaf, unsigned long addr)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	switch (leaf) {
6362306a36Sopenharmony_ci	case Cache_LEAF0:
6462306a36Sopenharmony_ci		cache_op(Index_Writeback_Inv_LEAF0, addr);
6562306a36Sopenharmony_ci		break;
6662306a36Sopenharmony_ci	case Cache_LEAF1:
6762306a36Sopenharmony_ci		cache_op(Index_Writeback_Inv_LEAF1, addr);
6862306a36Sopenharmony_ci		break;
6962306a36Sopenharmony_ci	case Cache_LEAF2:
7062306a36Sopenharmony_ci		cache_op(Index_Writeback_Inv_LEAF2, addr);
7162306a36Sopenharmony_ci		break;
7262306a36Sopenharmony_ci	case Cache_LEAF3:
7362306a36Sopenharmony_ci		cache_op(Index_Writeback_Inv_LEAF3, addr);
7462306a36Sopenharmony_ci		break;
7562306a36Sopenharmony_ci	case Cache_LEAF4:
7662306a36Sopenharmony_ci		cache_op(Index_Writeback_Inv_LEAF4, addr);
7762306a36Sopenharmony_ci		break;
7862306a36Sopenharmony_ci	case Cache_LEAF5:
7962306a36Sopenharmony_ci		cache_op(Index_Writeback_Inv_LEAF5, addr);
8062306a36Sopenharmony_ci		break;
8162306a36Sopenharmony_ci	default:
8262306a36Sopenharmony_ci		break;
8362306a36Sopenharmony_ci	}
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#include <asm-generic/cacheflush.h>
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#endif /* _ASM_CACHEFLUSH_H */
89