xref: /openbsd/sys/arch/m88k/include/mmu.h (revision 2df76cc2)
1 /*	$OpenBSD: mmu.h,v 1.16 2014/03/29 18:09:29 guenther Exp $ */
2 
3 /*
4  * This file bears almost no resemblance to the original m68k file,
5  * so the following copyright notice is questionable, but we are
6  * nice people.
7  */
8 
9 /*
10  * Copyright (c) 1988 University of Utah.
11  * Copyright (c) 1982, 1986, 1990, 1993
12  *	The Regents of the University of California.  All rights reserved.
13  *
14  * This code is derived from software contributed to Berkeley by
15  * the Systems Programming Group of the University of Utah Computer
16  * Science Department.
17  *
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions
20  * are met:
21  * 1. Redistributions of source code must retain the above copyright
22  *    notice, this list of conditions and the following disclaimer.
23  * 2. Redistributions in binary form must reproduce the above copyright
24  *    notice, this list of conditions and the following disclaimer in the
25  *    documentation and/or other materials provided with the distribution.
26  * 3. Neither the name of the University nor the names of its contributors
27  *    may be used to endorse or promote products derived from this software
28  *    without specific prior written permission.
29  *
30  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40  * SUCH DAMAGE.
41  *
42  * from: Utah $Hdr: pte.h 1.13 92/01/20$
43  *
44  *	@(#)pte.h	8.1 (Berkeley) 6/10/93
45  */
46 
47 #ifndef	_M88K_MMU_H_
48 #define	_M88K_MMU_H_
49 
50 /*
51  * Parameters which determine the 'geometry' of the m88K page tables in memory.
52  */
53 
54 #define SDT_BITS	10		/* M88K segment table size bits */
55 #define PDT_BITS	10		/* M88K page table size bits */
56 #define PG_BITS		PAGE_SHIFT	/* M88K hardware page size bits */
57 
58 /*
59  * Common fields for APR, SDT and PTE
60  */
61 
62 /* address frame */
63 #define	PG_FRAME	0xfffff000
64 #define	PG_SHIFT	PG_BITS
65 #define	PG_PFNUM(x)	(((x) & PG_FRAME) >> PG_SHIFT)
66 
67 /* cache control bits */
68 #define	CACHE_DFL	0x00000000
69 #define	CACHE_INH	0x00000040	/* cache inhibit */
70 #define	CACHE_GLOBAL	0x00000080	/* global scope */
71 #define	CACHE_WT	0x00000200	/* write through */
72 
73 #define	CACHE_MASK	(CACHE_INH | CACHE_GLOBAL | CACHE_WT)
74 
75 /*
76  * Area descriptors
77  */
78 
79 typedef	uint32_t	apr_t;
80 
81 #define	APR_V		0x00000001	/* valid bit */
82 
83 /*
84  * 88200 PATC (TLB)
85  */
86 
87 #define PATC_ENTRIES	56
88 
89 /*
90  * Segment table entries
91  */
92 
93 typedef uint32_t	sdt_entry_t;
94 
95 #define	SG_V		0x00000001
96 #define	SG_NV		0x00000000
97 #define	SG_PROT		0x00000004
98 #define	SG_RO		0x00000004
99 #define	SG_RW		0x00000000
100 #define	SG_SO		0x00000100
101 
102 #define	SDT_VALID(sdt)	(*(sdt) & SG_V)
103 #define	SDT_SUP(sdt)	(*(sdt) & SG_SO)
104 #define	SDT_WP(sdt)	(*(sdt) & SG_PROT)
105 
106 /*
107  * Page table entries
108  */
109 
110 typedef uint32_t	pt_entry_t;
111 
112 #define	PG_V		0x00000001
113 #define	PG_NV		0x00000000
114 #define	PG_PROT		0x00000004
115 #define	PG_U		0x00000008
116 #define	PG_M		0x00000010
117 #define	PG_M_U		0x00000018
118 #define	PG_RO		0x00000004
119 #define	PG_RW		0x00000000
120 #define	PG_SO		0x00000100
121 #define	PG_W		0x00000020	/* XXX unused but reserved field */
122 #define	PG_U0		0x00000400	/* U0 bit for M88110 */
123 #define	PG_U1		0x00000800	/* U1 bit for M88110 */
124 
125 #define	PDT_VALID(pte)	(*(pte) & PG_V)
126 #define	PDT_SUP(pte)	(*(pte) & PG_SO)
127 #define	PDT_WP(pte)	(*(pte) & PG_PROT)
128 
129 /*
130  * Number of entries in a page table.
131  */
132 
133 #define	SDT_ENTRIES	(1<<(SDT_BITS))
134 #define PDT_ENTRIES	(1<<(PDT_BITS))
135 
136 /*
137  * Size in bytes of a single page table.
138  */
139 
140 #define SDT_SIZE	(sizeof(sdt_entry_t) * SDT_ENTRIES)
141 #define PDT_SIZE	(sizeof(pt_entry_t) * PDT_ENTRIES)
142 
143 /*
144  * Shifts and masks
145  */
146 
147 #define SDT_SHIFT	(PDT_BITS + PG_BITS)
148 #define PDT_SHIFT	(PG_BITS)
149 
150 #define SDT_MASK	(((1 << SDT_BITS) - 1) << SDT_SHIFT)
151 #define PDT_MASK	(((1 << PDT_BITS) - 1) << PDT_SHIFT)
152 
153 #define	SDTIDX(va)	(((va) & SDT_MASK) >> SDT_SHIFT)
154 #define	PDTIDX(va)	(((va) & PDT_MASK) >> PDT_SHIFT)
155 
156 /*
157  * BATC entries
158  */
159 
160 #define	BATC_V		0x00000001
161 #define	BATC_PROT	0x00000002
162 #define	BATC_INH	0x00000004
163 #define	BATC_GLOBAL	0x00000008
164 #define	BATC_WT		0x00000010
165 #define	BATC_SO		0x00000020
166 
167 typedef uint32_t	batc_t;
168 
169 /* 8820x fixed size BATC */
170 #define	BATC_BLKSHIFT	19
171 #define	BATC_BLKBYTES	(1 << BATC_BLKSHIFT)
172 #define	BATC_BLKMASK	(BATC_BLKBYTES-1)
173 /* number of programmable BATC entries */
174 #define	BATC_MAX	8
175 
176 /* physical and logical block address */
177 #define	BATC_PSHIFT	6
178 #define	BATC_VSHIFT	19
179 
180 #define	trunc_batc(a)	((a) & ~BATC_BLKMASK)
181 #define	round_batc(a)	trunc_batc((a) + BATC_BLKBYTES - 1)
182 
183 static pt_entry_t invalidate_pte(pt_entry_t *);
184 static __inline__ pt_entry_t
invalidate_pte(pt_entry_t * pte)185 invalidate_pte(pt_entry_t *pte)
186 {
187 	pt_entry_t oldpte;
188 
189 	oldpte = PG_NV;
190 	__asm__ volatile
191 	    ("xmem %0, %2, %%r0" : "+r"(oldpte), "+m"(*pte) : "r"(pte));
192 	return oldpte;
193 }
194 
195 #endif /* __M88K_MMU_H__ */
196