162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * include/asm-xtensa/cacheasm.h
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
562306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
662306a36Sopenharmony_ci * for more details.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (C) 2006 Tensilica Inc.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <asm/cache.h>
1262306a36Sopenharmony_ci#include <asm/asmmacro.h>
1362306a36Sopenharmony_ci#include <linux/stringify.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*
1662306a36Sopenharmony_ci * Define cache functions as macros here so that they can be used
1762306a36Sopenharmony_ci * by the kernel and boot loader. We should consider moving them to a
1862306a36Sopenharmony_ci * library that can be linked by both.
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci * Locking
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci *   ___unlock_dcache_all
2362306a36Sopenharmony_ci *   ___unlock_icache_all
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * Flush and invaldating
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci *   ___flush_invalidate_dcache_{all|range|page}
2862306a36Sopenharmony_ci *   ___flush_dcache_{all|range|page}
2962306a36Sopenharmony_ci *   ___invalidate_dcache_{all|range|page}
3062306a36Sopenharmony_ci *   ___invalidate_icache_{all|range|page}
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci */
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	.macro	__loop_cache_unroll ar at insn size line_width max_immed
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	.if	(1 << (\line_width)) > (\max_immed)
3862306a36Sopenharmony_ci	.set	_reps, 1
3962306a36Sopenharmony_ci	.elseif	(2 << (\line_width)) > (\max_immed)
4062306a36Sopenharmony_ci	.set	_reps, 2
4162306a36Sopenharmony_ci	.else
4262306a36Sopenharmony_ci	.set	_reps, 4
4362306a36Sopenharmony_ci	.endif
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	__loopi	\ar, \at, \size, (_reps << (\line_width))
4662306a36Sopenharmony_ci	.set	_index, 0
4762306a36Sopenharmony_ci	.rep	_reps
4862306a36Sopenharmony_ci	\insn	\ar, _index << (\line_width)
4962306a36Sopenharmony_ci	.set	_index, _index + 1
5062306a36Sopenharmony_ci	.endr
5162306a36Sopenharmony_ci	__endla	\ar, \at, _reps << (\line_width)
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	.endm
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	.macro	__loop_cache_all ar at insn size line_width max_immed
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	movi	\ar, 0
5962306a36Sopenharmony_ci	__loop_cache_unroll \ar, \at, \insn, \size, \line_width, \max_immed
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	.endm
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	.macro	__loop_cache_range ar as at insn line_width
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	extui	\at, \ar, 0, \line_width
6762306a36Sopenharmony_ci	add	\as, \as, \at
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	__loops	\ar, \as, \at, \line_width
7062306a36Sopenharmony_ci	\insn	\ar, 0
7162306a36Sopenharmony_ci	__endla	\ar, \at, (1 << (\line_width))
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	.endm
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	.macro	__loop_cache_page ar at insn line_width max_immed
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	__loop_cache_unroll \ar, \at, \insn, PAGE_SIZE, \line_width, \max_immed
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	.endm
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	.macro	___unlock_dcache_all ar at
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#if XCHAL_DCACHE_LINE_LOCKABLE && XCHAL_DCACHE_SIZE
8662306a36Sopenharmony_ci	__loop_cache_all \ar \at diu XCHAL_DCACHE_SIZE \
8762306a36Sopenharmony_ci		XCHAL_DCACHE_LINEWIDTH 240
8862306a36Sopenharmony_ci#endif
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	.endm
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	.macro	___unlock_icache_all ar at
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#if XCHAL_ICACHE_LINE_LOCKABLE && XCHAL_ICACHE_SIZE
9662306a36Sopenharmony_ci	__loop_cache_all \ar \at iiu XCHAL_ICACHE_SIZE \
9762306a36Sopenharmony_ci		XCHAL_ICACHE_LINEWIDTH 240
9862306a36Sopenharmony_ci#endif
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	.endm
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	.macro	___flush_invalidate_dcache_all ar at
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
10662306a36Sopenharmony_ci	__loop_cache_all \ar \at diwbi XCHAL_DCACHE_SIZE \
10762306a36Sopenharmony_ci		XCHAL_DCACHE_LINEWIDTH 240
10862306a36Sopenharmony_ci#endif
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	.endm
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	.macro	___flush_dcache_all ar at
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
11662306a36Sopenharmony_ci	__loop_cache_all \ar \at diwb XCHAL_DCACHE_SIZE \
11762306a36Sopenharmony_ci		XCHAL_DCACHE_LINEWIDTH 240
11862306a36Sopenharmony_ci#endif
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	.endm
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	.macro	___invalidate_dcache_all ar at
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
12662306a36Sopenharmony_ci	__loop_cache_all \ar \at dii XCHAL_DCACHE_SIZE \
12762306a36Sopenharmony_ci			 XCHAL_DCACHE_LINEWIDTH 1020
12862306a36Sopenharmony_ci#endif
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	.endm
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	.macro	___invalidate_icache_all ar at
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#if XCHAL_ICACHE_SIZE
13662306a36Sopenharmony_ci	__loop_cache_all \ar \at iii XCHAL_ICACHE_SIZE \
13762306a36Sopenharmony_ci			 XCHAL_ICACHE_LINEWIDTH 1020
13862306a36Sopenharmony_ci#endif
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	.endm
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	.macro	___flush_invalidate_dcache_range ar as at
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
14762306a36Sopenharmony_ci	__loop_cache_range \ar \as \at dhwbi XCHAL_DCACHE_LINEWIDTH
14862306a36Sopenharmony_ci#endif
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	.endm
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	.macro	___flush_dcache_range ar as at
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
15662306a36Sopenharmony_ci	__loop_cache_range \ar \as \at dhwb XCHAL_DCACHE_LINEWIDTH
15762306a36Sopenharmony_ci#endif
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	.endm
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	.macro	___invalidate_dcache_range ar as at
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
16562306a36Sopenharmony_ci	__loop_cache_range \ar \as \at dhi XCHAL_DCACHE_LINEWIDTH
16662306a36Sopenharmony_ci#endif
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	.endm
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	.macro	___invalidate_icache_range ar as at
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci#if XCHAL_ICACHE_SIZE
17462306a36Sopenharmony_ci	__loop_cache_range \ar \as \at ihi XCHAL_ICACHE_LINEWIDTH
17562306a36Sopenharmony_ci#endif
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci	.endm
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	.macro	___flush_invalidate_dcache_page ar as
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
18462306a36Sopenharmony_ci	__loop_cache_page \ar \as dhwbi XCHAL_DCACHE_LINEWIDTH 1020
18562306a36Sopenharmony_ci#endif
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	.endm
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	.macro ___flush_dcache_page ar as
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
19362306a36Sopenharmony_ci	__loop_cache_page \ar \as dhwb XCHAL_DCACHE_LINEWIDTH 1020
19462306a36Sopenharmony_ci#endif
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	.endm
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	.macro	___invalidate_dcache_page ar as
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci#if XCHAL_DCACHE_SIZE
20262306a36Sopenharmony_ci	__loop_cache_page \ar \as dhi XCHAL_DCACHE_LINEWIDTH 1020
20362306a36Sopenharmony_ci#endif
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	.endm
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	.macro	___invalidate_icache_page ar as
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci#if XCHAL_ICACHE_SIZE
21162306a36Sopenharmony_ci	__loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH 1020
21262306a36Sopenharmony_ci#endif
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	.endm
215