1 /*	$NetBSD: cache_ls2.h,v 1.3 2016/07/11 16:15:35 matt Exp $	*/
2 
3 /*-
4  * Copyright (c) 2009 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Matt Thomas <matt@3am-software.com>.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _MIPS_CACHE_LS2_H_
33 #define _MIPS_CACHE_LS2_H_
34 
35 /*
36  * Cache definitions/operations for Loongson-style caches.
37  */
38 #define	CACHEOP_LS2_I_INDEX_INV		0
39 #define	CACHEOP_LS2_D_INDEX_WB_INV	1
40 #define	CACHEOP_LS2_S_INDEX_WB_INV	3
41 #define	CACHEOP_LS2_D_HIT_INV		17
42 #define	CACHEOP_LS2_S_HIT_INV		19
43 #define	CACHEOP_LS2_D_HIT_WB_INV	21
44 #define	CACHEOP_LS2_S_HIT_WB_INV	23
45 
46 #if !defined(_LOCORE)
47 /*
48  * The way is encoded in the bottom 2 bits of VA.
49  */
50 
51 #define cache_op_ls2_8line_4way(va, op)					\
52 	__asm volatile(							\
53                 ".set noreorder					\n\t"	\
54                 "cache %1, 0x00(%0); cache %1, 0x20(%0)		\n\t"	\
55                 "cache %1, 0x40(%0); cache %1, 0x60(%0)		\n\t"	\
56                 "cache %1, 0x80(%0); cache %1, 0xa0(%0)		\n\t"	\
57                 "cache %1, 0xc0(%0); cache %1, 0xe0(%0)		\n\t"	\
58                 "cache %1, 0x01(%0); cache %1, 0x21(%0)		\n\t"	\
59                 "cache %1, 0x41(%0); cache %1, 0x61(%0)		\n\t"	\
60                 "cache %1, 0x81(%0); cache %1, 0xa1(%0)		\n\t"	\
61                 "cache %1, 0xc1(%0); cache %1, 0xe1(%0)		\n\t"	\
62                 "cache %1, 0x02(%0); cache %1, 0x22(%0)		\n\t"	\
63                 "cache %1, 0x42(%0); cache %1, 0x62(%0)		\n\t"	\
64                 "cache %1, 0x82(%0); cache %1, 0xa2(%0)		\n\t"	\
65                 "cache %1, 0xc2(%0); cache %1, 0xe2(%0)		\n\t"	\
66                 "cache %1, 0x03(%0); cache %1, 0x23(%0)		\n\t"	\
67                 "cache %1, 0x43(%0); cache %1, 0x63(%0)		\n\t"	\
68                 "cache %1, 0x83(%0); cache %1, 0xa3(%0)		\n\t"	\
69                 "cache %1, 0xc3(%0); cache %1, 0xe3(%0)		\n\t"	\
70                 ".set reorder"						\
71             :								\
72             : "r" (va), "i" (op)					\
73             : "memory");
74 
75 #define cache_op_ls2_line_4way(va, op)					\
76 	__asm volatile(							\
77                 ".set noreorder					\n\t"	\
78                 "cache %1, 0(%0); cache %1, 1(%0)		\n\t"	\
79                 "cache %1, 2(%0); cache %1, 3(%0)		\n\t"	\
80                 ".set reorder"						\
81             :								\
82             : "r" (va), "i" (op)					\
83             : "memory");
84 
85 #define cache_op_ls2_8line(va, op)					\
86 	__asm volatile(							\
87                 ".set noreorder					\n\t"	\
88                 "cache %1, 0x00(%0); cache %1, 0x20(%0)		\n\t"	\
89                 "cache %1, 0x40(%0); cache %1, 0x60(%0)		\n\t"	\
90                 "cache %1, 0x80(%0); cache %1, 0xa0(%0)		\n\t"	\
91                 "cache %1, 0xc0(%0); cache %1, 0xe0(%0)		\n\t"	\
92                 ".set reorder"						\
93             :								\
94             : "r" (va), "i" (op)					\
95             : "memory");
96 
97 #define cache_op_ls2_line(va, op)					\
98 	__asm volatile(							\
99                 ".set noreorder					\n\t"	\
100                 "cache %1, 0(%0)				\n\t"	\
101                 ".set reorder"						\
102             :								\
103             : "r" (va), "i" (op)					\
104             : "memory");
105 
106 void	ls2_icache_sync_all(void);
107 void	ls2_icache_sync_range(register_t, vsize_t);
108 void	ls2_icache_sync_range_index(vaddr_t, vsize_t);
109 
110 void	ls2_pdcache_wbinv_all(void);
111 void	ls2_pdcache_wbinv_range(register_t, vsize_t);
112 void	ls2_pdcache_wbinv_range_index(vaddr_t, vsize_t);
113 
114 void	ls2_pdcache_inv_range(register_t, vsize_t);
115 void	ls2_pdcache_wb_range(register_t, vsize_t);
116 
117 void	ls2_sdcache_wbinv_all(void);
118 void	ls2_sdcache_wbinv_range(register_t, vsize_t);
119 void	ls2_sdcache_wbinv_range_index(vaddr_t, vsize_t);
120 
121 void	ls2_sdcache_inv_range(register_t, vsize_t);
122 void	ls2_sdcache_wb_range(register_t, vsize_t);
123 
124 #endif /* !_LOCORE */
125 #endif /* !_MIPS_CACHE_LS2_H_ */
126