xref: /openbsd-src/sys/arch/mips64/include/cache.h (revision abbc172345bef93ecfbbd3bdfe82c6baa3e1be4c)
1*abbc1723Svisa /*	$OpenBSD: cache.h,v 1.9 2016/12/21 13:59:57 visa Exp $	*/
2737df64eSmiod 
3737df64eSmiod /*
4737df64eSmiod  * Copyright (c) 2012 Miodrag Vallat.
5737df64eSmiod  *
6737df64eSmiod  * Permission to use, copy, modify, and distribute this software for any
7737df64eSmiod  * purpose with or without fee is hereby granted, provided that the above
8737df64eSmiod  * copyright notice and this permission notice appear in all copies.
9737df64eSmiod  *
10737df64eSmiod  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11737df64eSmiod  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12737df64eSmiod  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13737df64eSmiod  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14737df64eSmiod  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15737df64eSmiod  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16737df64eSmiod  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17737df64eSmiod  */
18737df64eSmiod 
19737df64eSmiod #ifndef	_MIPS64_CACHE_H_
20737df64eSmiod #define	_MIPS64_CACHE_H_
21737df64eSmiod 
22737df64eSmiod /*
23737df64eSmiod  * Declare canonical cache functions for a given processor.
24737df64eSmiod  *
25b94f5bc5Smiod  * The following assumptions are made:
26b94f5bc5Smiod  * - only L1 has split instruction and data caches.
27b94f5bc5Smiod  * - L1 I$ is virtually indexed.
28737df64eSmiod  *
29b94f5bc5Smiod  * Processor-specific routines will make extra assumptions.
30737df64eSmiod  */
31737df64eSmiod 
32737df64eSmiod #define CACHE_PROTOS(chip) \
33737df64eSmiod /* Figure out cache configuration */ \
34737df64eSmiod void	chip##_ConfigCache(struct cpu_info *); \
35737df64eSmiod /* Writeback and invalidate all caches */ \
36737df64eSmiod void  	chip##_SyncCache(struct cpu_info *); \
37737df64eSmiod /* Invalidate all I$ for the given range */ \
38b94f5bc5Smiod void	chip##_InvalidateICache(struct cpu_info *, vaddr_t, size_t); \
3980941abeSmiod /* Register a given page for I$ invalidation */ \
4080941abeSmiod void	chip##_InvalidateICachePage(struct cpu_info *, vaddr_t); \
4180941abeSmiod /* Perform postponed I$ invalidation */ \
4280941abeSmiod void	chip##_SyncICache(struct cpu_info *); \
43737df64eSmiod /* Writeback all D$ for the given page */ \
44b94f5bc5Smiod void	chip##_SyncDCachePage(struct cpu_info *, vaddr_t, paddr_t); \
451a4be959Svisa /* Writeback all D$ for the (currently mapped) given page */ \
461a4be959Svisa void	chip##_HitSyncDCachePage(struct cpu_info *, vaddr_t, paddr_t); \
47737df64eSmiod /* Writeback all D$ for the given range */ \
48b94f5bc5Smiod void	chip##_HitSyncDCache(struct cpu_info *, vaddr_t, size_t); \
49737df64eSmiod /* Invalidate all D$ for the given range */ \
50b94f5bc5Smiod void	chip##_HitInvalidateDCache(struct cpu_info *, vaddr_t, size_t); \
51737df64eSmiod /* Enforce coherency of the given range */ \
52b94f5bc5Smiod void	chip##_IOSyncDCache(struct cpu_info *, vaddr_t, size_t, int);
53737df64eSmiod 
54737df64eSmiod /*
55737df64eSmiod  * Cavium Octeon.
56737df64eSmiod  */
5732426916Smiod CACHE_PROTOS(Octeon)
58737df64eSmiod 
59*abbc1723Svisa void	Octeon_lock_secondary_cache(struct cpu_info *, paddr_t, size_t);
60*abbc1723Svisa void	Octeon_unlock_secondary_cache(struct cpu_info *, paddr_t, size_t);
61*abbc1723Svisa 
62737df64eSmiod /*
63b94f5bc5Smiod  * STC Loongson 2E and 2F.
64737df64eSmiod  */
6532426916Smiod CACHE_PROTOS(Loongson2)
66737df64eSmiod 
67737df64eSmiod /*
68f8fa4920Smiod  * Loongson 3A and 2Gq.
69f8fa4920Smiod  */
70f8fa4920Smiod CACHE_PROTOS(Loongson3)
71f8fa4920Smiod 
72f8fa4920Smiod /*
73737df64eSmiod  * MIPS R4000 and R4400.
74737df64eSmiod  */
7532426916Smiod CACHE_PROTOS(Mips4k)
76737df64eSmiod 
77737df64eSmiod /*
78b94f5bc5Smiod  * IDT/QED/PMC-Sierra R4600, R4700, R5000, RM52xx, RM7xxx, RM9xxx.
79737df64eSmiod  */
8032426916Smiod CACHE_PROTOS(Mips5k)
81737df64eSmiod 
82737df64eSmiod /*
83a4a4ed5cSmiod  * MIPS (SGI, really) R8000.
84a4a4ed5cSmiod  */
85a4a4ed5cSmiod CACHE_PROTOS(tfp)
86a4a4ed5cSmiod 
87a4a4ed5cSmiod /*
88b94f5bc5Smiod  * MIPS/NEC R10000/R120000/R140000/R16000.
89737df64eSmiod  */
9032426916Smiod CACHE_PROTOS(Mips10k)
91737df64eSmiod 
92737df64eSmiod /*
93f8fa4920Smiod  * mips64r2-compliant processors.
94f8fa4920Smiod  */
95f8fa4920Smiod CACHE_PROTOS(mips64r2)
96f8fa4920Smiod 
97f8fa4920Smiod /*
98737df64eSmiod  * Values used by the IOSyncDCache routine [which acts as the backend of
99737df64eSmiod  * bus_dmamap_sync()].
100737df64eSmiod  */
101737df64eSmiod #define	CACHE_SYNC_R	0	/* WB invalidate, WT invalidate */
102a4a4ed5cSmiod #define	CACHE_SYNC_W	1	/* WB writeback, WT unaffected */
103737df64eSmiod #define	CACHE_SYNC_X	2	/* WB writeback + invalidate, WT invalidate */
104737df64eSmiod 
10525b86d72Smiod extern vaddr_t cache_valias_mask;
10625b86d72Smiod 
107737df64eSmiod #endif	/* _MIPS64_CACHE_H_ */
108