xref: /freebsd/sys/powerpc/include/tlb.h (revision 1d56a2801d526fb3d09974a31b378a137f7bfe1c)
1ffb56695SRafal Jaworowski /*-
2ffb56695SRafal Jaworowski  * Copyright (C) 2006 Semihalf, Marian Balakowicz <m8@semihalf.com>
3ffb56695SRafal Jaworowski  * All rights reserved.
4ffb56695SRafal Jaworowski  *
5ffb56695SRafal Jaworowski  * Redistribution and use in source and binary forms, with or without
6ffb56695SRafal Jaworowski  * modification, are permitted provided that the following conditions
7ffb56695SRafal Jaworowski  * are met:
8ffb56695SRafal Jaworowski  * 1. Redistributions of source code must retain the above copyright
9ffb56695SRafal Jaworowski  *    notice, this list of conditions and the following disclaimer.
10ffb56695SRafal Jaworowski  * 2. Redistributions in binary form must reproduce the above copyright
11ffb56695SRafal Jaworowski  *    notice, this list of conditions and the following disclaimer in the
12ffb56695SRafal Jaworowski  *    documentation and/or other materials provided with the distribution.
13ffb56695SRafal Jaworowski  * 3. The name of the author may not be used to endorse or promote products
14ffb56695SRafal Jaworowski  *    derived from this software without specific prior written permission.
15ffb56695SRafal Jaworowski  *
16ffb56695SRafal Jaworowski  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17ffb56695SRafal Jaworowski  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18ffb56695SRafal Jaworowski  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
19ffb56695SRafal Jaworowski  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20ffb56695SRafal Jaworowski  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21ffb56695SRafal Jaworowski  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22ffb56695SRafal Jaworowski  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23ffb56695SRafal Jaworowski  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24ffb56695SRafal Jaworowski  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25ffb56695SRafal Jaworowski  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26ffb56695SRafal Jaworowski  *
27ffb56695SRafal Jaworowski  * $FreeBSD$
28ffb56695SRafal Jaworowski  */
29ffb56695SRafal Jaworowski 
30ffb56695SRafal Jaworowski #ifndef	_MACHINE_TLB_H_
31ffb56695SRafal Jaworowski #define	_MACHINE_TLB_H_
32ffb56695SRafal Jaworowski 
33ffb56695SRafal Jaworowski /*  PowerPC E500 MAS registers */
34ffb56695SRafal Jaworowski #define MAS0_TLBSEL(x)		((x << 28) & 0x10000000)
35ffb56695SRafal Jaworowski #define MAS0_ESEL(x)		((x << 16) & 0x000F0000)
36ffb56695SRafal Jaworowski 
37ffb56695SRafal Jaworowski #define MAS0_TLBSEL1		0x10000000
38ffb56695SRafal Jaworowski #define MAS0_TLBSEL0		0x00000000
39ffb56695SRafal Jaworowski #define MAS0_ESEL_TLB1MASK	0x000F0000
40ffb56695SRafal Jaworowski #define MAS0_ESEL_TLB0MASK	0x00030000
41ffb56695SRafal Jaworowski #define MAS0_ESEL_SHIFT		16
42ffb56695SRafal Jaworowski #define MAS0_NV_MASK		0x00000003
43ffb56695SRafal Jaworowski #define MAS0_NV_SHIFT		0
44ffb56695SRafal Jaworowski 
45ffb56695SRafal Jaworowski #define MAS1_VALID		0x80000000
46ffb56695SRafal Jaworowski #define MAS1_IPROT		0x40000000
47ffb56695SRafal Jaworowski #define MAS1_TID_MASK		0x00FF0000
48ffb56695SRafal Jaworowski #define MAS1_TID_SHIFT		16
49b2b734e7SRafal Jaworowski #define MAS1_TS_MASK		0x00001000
50b2b734e7SRafal Jaworowski #define MAS1_TS_SHIFT		12
51ffb56695SRafal Jaworowski #define MAS1_TSIZE_MASK		0x00000F00
52ffb56695SRafal Jaworowski #define MAS1_TSIZE_SHIFT	8
53ffb56695SRafal Jaworowski 
54ffb56695SRafal Jaworowski #define	TLB_SIZE_4K		1
55ffb56695SRafal Jaworowski #define	TLB_SIZE_16K		2
56ffb56695SRafal Jaworowski #define	TLB_SIZE_64K		3
57ffb56695SRafal Jaworowski #define	TLB_SIZE_256K		4
58ffb56695SRafal Jaworowski #define	TLB_SIZE_1M		5
59ffb56695SRafal Jaworowski #define	TLB_SIZE_4M		6
60ffb56695SRafal Jaworowski #define	TLB_SIZE_16M		7
61ffb56695SRafal Jaworowski #define	TLB_SIZE_64M		8
62ffb56695SRafal Jaworowski #define	TLB_SIZE_256M		9
63ffb56695SRafal Jaworowski #define	TLB_SIZE_1G		10
64ffb56695SRafal Jaworowski #define	TLB_SIZE_4G		11
65ffb56695SRafal Jaworowski 
66b2b734e7SRafal Jaworowski #define	MAS2_EPN_MASK		0xFFFFF000
67ffb56695SRafal Jaworowski #define	MAS2_EPN_SHIFT		12
68ffb56695SRafal Jaworowski #define	MAS2_X0			0x00000040
69ffb56695SRafal Jaworowski #define	MAS2_X1			0x00000020
70ffb56695SRafal Jaworowski #define	MAS2_W			0x00000010
71ffb56695SRafal Jaworowski #define	MAS2_I			0x00000008
72ffb56695SRafal Jaworowski #define	MAS2_M			0x00000004
73ffb56695SRafal Jaworowski #define	MAS2_G			0x00000002
74ffb56695SRafal Jaworowski #define	MAS2_E			0x00000001
75ffb56695SRafal Jaworowski 
76ffb56695SRafal Jaworowski #define	MAS3_RPN		0xFFFFF000
77ffb56695SRafal Jaworowski #define	MAS3_RPN_SHIFT		12
78ffb56695SRafal Jaworowski #define	MAS3_U0			0x00000200
79ffb56695SRafal Jaworowski #define	MAS3_U1			0x00000100
80ffb56695SRafal Jaworowski #define	MAS3_U2			0x00000080
81ffb56695SRafal Jaworowski #define	MAS3_U3			0x00000040
82ffb56695SRafal Jaworowski #define	MAS3_UX			0x00000020
83ffb56695SRafal Jaworowski #define	MAS3_SX			0x00000010
84ffb56695SRafal Jaworowski #define	MAS3_UW			0x00000008
85ffb56695SRafal Jaworowski #define	MAS3_SW			0x00000004
86ffb56695SRafal Jaworowski #define	MAS3_UR			0x00000002
87ffb56695SRafal Jaworowski #define	MAS3_SR			0x00000001
88ffb56695SRafal Jaworowski 
89ffb56695SRafal Jaworowski #define MAS4_TLBSELD1		0x10000000
90ffb56695SRafal Jaworowski #define MAS4_TLBSELD0		0x00000000
91ffb56695SRafal Jaworowski #define MAS4_TIDSELD_MASK	0x00030000
92ffb56695SRafal Jaworowski #define MAS4_TIDSELD_SHIFT	16
93ffb56695SRafal Jaworowski #define MAS4_TSIZED_MASK	0x00000F00
94ffb56695SRafal Jaworowski #define MAS4_TSIZED_SHIFT	8
95ffb56695SRafal Jaworowski #define MAS4_X0D		0x00000040
96ffb56695SRafal Jaworowski #define MAS4_X1D		0x00000020
97ffb56695SRafal Jaworowski #define MAS4_WD			0x00000010
98ffb56695SRafal Jaworowski #define MAS4_ID			0x00000008
99ffb56695SRafal Jaworowski #define MAS4_MD			0x00000004
100ffb56695SRafal Jaworowski #define MAS4_GD			0x00000002
101ffb56695SRafal Jaworowski #define MAS4_ED			0x00000001
102ffb56695SRafal Jaworowski 
103ffb56695SRafal Jaworowski #define MAS6_SPID0_MASK		0x00FF0000
104ffb56695SRafal Jaworowski #define MAS6_SPID0_SHIFT	16
105ffb56695SRafal Jaworowski #define MAS6_SAS		0x00000001
106ffb56695SRafal Jaworowski 
107ffb56695SRafal Jaworowski #define MAS1_GETTID(mas1)	(((mas1) & MAS1_TID_MASK) >> MAS1_TID_SHIFT)
108ffb56695SRafal Jaworowski 
109ffb56695SRafal Jaworowski #define MAS2_TLB0_ENTRY_IDX_MASK	0x0007f000
110ffb56695SRafal Jaworowski #define MAS2_TLB0_ENTRY_IDX_SHIFT	12
111ffb56695SRafal Jaworowski 
112ffb56695SRafal Jaworowski /*
113b2b734e7SRafal Jaworowski  * Maximum number of TLB1 entries used for a permanent mapping of kernel
114b2b734e7SRafal Jaworowski  * region (kernel image plus statically allocated data).
115ffb56695SRafal Jaworowski  */
116ffb56695SRafal Jaworowski #define KERNEL_REGION_MAX_TLB_ENTRIES   4
117ffb56695SRafal Jaworowski 
118ffb56695SRafal Jaworowski #define _TLB_ENTRY_IO	(MAS2_I | MAS2_G)
119b2b734e7SRafal Jaworowski #ifdef SMP
120b2b734e7SRafal Jaworowski #define _TLB_ENTRY_MEM	(MAS2_M)
121b2b734e7SRafal Jaworowski #else
122ffb56695SRafal Jaworowski #define _TLB_ENTRY_MEM	(0)
123b2b734e7SRafal Jaworowski #endif
124ffb56695SRafal Jaworowski 
125b2b734e7SRafal Jaworowski #define TID_KERNEL	0	/* TLB TID to use for kernel (shared) translations */
126ffb56695SRafal Jaworowski #define TID_KRESERVED	1	/* Number of TIDs reserved for kernel */
127b2b734e7SRafal Jaworowski #define TID_URESERVED	0	/* Number of TIDs reserved for user */
128ffb56695SRafal Jaworowski #define TID_MIN		(TID_KRESERVED + TID_URESERVED)
129ffb56695SRafal Jaworowski #define TID_MAX		255
130b2b734e7SRafal Jaworowski #define TID_NONE	-1
131ffb56695SRafal Jaworowski 
132*1d56a280SRafal Jaworowski #define TLB_UNLOCKED	0
133*1d56a280SRafal Jaworowski 
134ffb56695SRafal Jaworowski #if !defined(LOCORE)
135ffb56695SRafal Jaworowski typedef struct tlb_entry {
136b2b734e7SRafal Jaworowski 	uint32_t mas1;
137b2b734e7SRafal Jaworowski 	uint32_t mas2;
138b2b734e7SRafal Jaworowski 	uint32_t mas3;
139ffb56695SRafal Jaworowski } tlb_entry_t;
140ffb56695SRafal Jaworowski 
141b2b734e7SRafal Jaworowski typedef int tlbtid_t;
142ffb56695SRafal Jaworowski struct pmap;
143ffb56695SRafal Jaworowski 
144b2b734e7SRafal Jaworowski void tlb0_print_tlbentries(void);
145b2b734e7SRafal Jaworowski 
146ffb56695SRafal Jaworowski void tlb1_inval_entry(unsigned int);
147ffb56695SRafal Jaworowski void tlb1_init(vm_offset_t);
148ffb56695SRafal Jaworowski void tlb1_print_entries(void);
149ffb56695SRafal Jaworowski void tlb1_print_tlbentries(void);
150ffb56695SRafal Jaworowski 
151*1d56a280SRafal Jaworowski void tlb_lock(uint32_t *);
152*1d56a280SRafal Jaworowski void tlb_unlock(uint32_t *);
153*1d56a280SRafal Jaworowski 
154ffb56695SRafal Jaworowski #endif /* !LOCORE */
155ffb56695SRafal Jaworowski 
156ffb56695SRafal Jaworowski #endif	/* _MACHINE_TLB_H_ */
157