xref: /openbsd/sys/arch/sparc64/include/pte.h (revision 92e5c4ff)
1*92e5c4ffSkettenis /*	$OpenBSD: pte.h,v 1.8 2007/10/17 19:25:22 kettenis Exp $	*/
2f842aaf8Sart /*	$NetBSD: pte.h,v 1.7 2001/07/31 06:55:46 eeh Exp $ */
3f842aaf8Sart 
4f842aaf8Sart /*
5f842aaf8Sart  * Copyright (c) 1996-1999 Eduardo Horvath
6f842aaf8Sart  *
7f842aaf8Sart  * Redistribution and use in source and binary forms, with or without
8f842aaf8Sart  * modification, are permitted provided that the following conditions
9f842aaf8Sart  * are met:
10f842aaf8Sart  * 1. Redistributions of source code must retain the above copyright
11f842aaf8Sart  *    notice, this list of conditions and the following disclaimer.
12f842aaf8Sart  *
13f842aaf8Sart  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
14f842aaf8Sart  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f842aaf8Sart  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16f842aaf8Sart  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
17f842aaf8Sart  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18f842aaf8Sart  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19f842aaf8Sart  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20f842aaf8Sart  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21f842aaf8Sart  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22f842aaf8Sart  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23f842aaf8Sart  * SUCH DAMAGE.
24f842aaf8Sart  *
25f842aaf8Sart  */
26f842aaf8Sart 
27f842aaf8Sart /*
28f842aaf8Sart  * Address translation works as follows:
29f842aaf8Sart  *
30f842aaf8Sart  **
31f842aaf8Sart  * For sun4u:
32f842aaf8Sart  *
33f842aaf8Sart  *	Take your pick; it's all S/W anyway.  We'll start by emulating a sun4.
34f842aaf8Sart  *	Oh, here's the sun4u TTE for reference:
35f842aaf8Sart  *
36f842aaf8Sart  *	struct sun4u_tte {
37f842aaf8Sart  *		u_int64	tag_g:1,	(global flag)
38f842aaf8Sart  *			tag_ctxt:15,	(context for mapping)
39f842aaf8Sart  *			tag_unassigned:6,
40f842aaf8Sart  *			tag_va:42;	(virtual address bits<64:22>)
41f842aaf8Sart  *		u_int64	data_v:1,	(valid bit)
42f842aaf8Sart  *			data_size:2,	(page size [8K*8**<SIZE>])
43f842aaf8Sart  *			data_nfo:1,	(no-fault only)
44f842aaf8Sart  *			data_ie:1,	(invert endianness [inefficient])
45f842aaf8Sart  *			data_soft2:2,	(reserved for S/W)
46f842aaf8Sart  *			data_pa:36,	(physical address)
47f842aaf8Sart  *			data_soft:6,	(reserved for S/W)
48f842aaf8Sart  *			data_lock:1,	(lock into TLB)
49f842aaf8Sart  *			data_cacheable:2,	(cacheability control)
50f842aaf8Sart  *			data_e:1,	(explicit accesses only)
51f842aaf8Sart  *			data_priv:1,	(privileged page)
52f842aaf8Sart  *			data_w:1,	(writeable)
53f842aaf8Sart  *			data_g:1;	(same as tag_g)
54f842aaf8Sart  *	};
55f842aaf8Sart  */
56f842aaf8Sart 
57f842aaf8Sart /* virtual address to virtual page number */
58f842aaf8Sart #define	VA_SUN4U_VPG(va)	(((int)(va) >> 13) & 31)
59f842aaf8Sart 
60f842aaf8Sart /* virtual address to offset within page */
61f842aaf8Sart #define VA_SUN4U_OFF(va)       	(((int)(va)) & 0x1FFF)
62f842aaf8Sart 
63f842aaf8Sart /* When we go to 64-bit VAs we need to handle the hole */
64f842aaf8Sart #define VA_VPG(va)	VA_SUN4U_VPG(va)
65f842aaf8Sart #define VA_OFF(va)	VA_SUN4U_OFF(va)
66f842aaf8Sart 
67f842aaf8Sart #define PG_SHIFT4U	13
68f842aaf8Sart #define MMU_PAGE_ALIGN	8192
69f842aaf8Sart 
70f842aaf8Sart /* If you know where a tte is in the tsb, how do you find its va? */
71f842aaf8Sart #define TSBVA(i)	((tsb[(i)].tag.f.tag_va<<22)|(((i)<<13)&0x3ff000))
72f842aaf8Sart 
73f842aaf8Sart #ifndef _LOCORE
74f842aaf8Sart /*
75f842aaf8Sart  *  This is the spitfire TTE.
76f842aaf8Sart  *
77f842aaf8Sart  *  We could use bitmasks and shifts to construct this if
78f842aaf8Sart  *  we had a 64-bit compiler w/64-bit longs.  Otherwise it's
79f842aaf8Sart  *  a real pain to do this in C.
80f842aaf8Sart  */
81f842aaf8Sart #if 0
82aa56b97eSmiod /* We don't use bitfields anyway. */
83f842aaf8Sart struct sun4u_tag_fields {
84f842aaf8Sart 	u_int64_t	tag_g:1,	/* global flag */
85f842aaf8Sart 		tag_ctxt:15,	/* context for mapping */
86f842aaf8Sart 		tag_unassigned:6,
87f842aaf8Sart 		tag_va:42;	/* virtual address bits<64:22> */
88f842aaf8Sart };
89f842aaf8Sart union sun4u_tag { struct sun4u_tag_fields f; int64_t tag; };
90f842aaf8Sart struct sun4u_data_fields {
91f842aaf8Sart 	u_int64_t	data_v:1,	/* valid bit */
92f842aaf8Sart 		data_size:2,	/* page size [8K*8**<SIZE>] */
93f842aaf8Sart 		data_nfo:1,	/* no-fault only */
94f842aaf8Sart 		data_ie:1,	/* invert endianness [inefficient] */
95f842aaf8Sart 		data_soft2:2,	/* reserved for S/W */
96f842aaf8Sart 		data_pa:36,	/* physical address */
97f842aaf8Sart 		data_accessed:1,/* S/W accessed bit */
98f842aaf8Sart 		data_modified:1,/* S/W modified bit */
99f842aaf8Sart 		data_realw:1,	/* S/W real writable bit (to manage modified) */
100f842aaf8Sart 		data_tsblock:1,	/* S/W TSB locked entry */
101f842aaf8Sart 		data_exec:1,	/* S/W Executable */
102f842aaf8Sart 		data_onlyexec:1,/* S/W Executable only */
103f842aaf8Sart 		data_lock:1,	/* lock into TLB */
104f842aaf8Sart 		data_cacheable:2,	/* cacheability control */
105f842aaf8Sart 		data_e:1,	/* explicit accesses only */
106f842aaf8Sart 		data_priv:1,	/* privileged page */
107f842aaf8Sart 		data_w:1,	/* writeable */
108f842aaf8Sart 		data_g:1;	/* same as tag_g */
109f842aaf8Sart };
110f842aaf8Sart union sun4u_data { struct sun4u_data_fields f; int64_t data; };
111f842aaf8Sart struct sun4u_tte {
112f842aaf8Sart 	union sun4u_tag tag;
113f842aaf8Sart 	union sun4u_data data;
114f842aaf8Sart };
115f842aaf8Sart #else
116f842aaf8Sart struct sun4u_tte {
117f842aaf8Sart 	int64_t tag;
118f842aaf8Sart 	int64_t data;
119f842aaf8Sart };
120f842aaf8Sart #endif
121f842aaf8Sart typedef struct sun4u_tte pte_t;
122f842aaf8Sart 
123f842aaf8Sart /* Assembly routine to flush a mapping */
124*92e5c4ffSkettenis extern void sp_tlb_flush_pte(vaddr_t addr, int ctx);
125*92e5c4ffSkettenis extern void sp_tlb_flush_ctx(int ctx);
126*92e5c4ffSkettenis 
127*92e5c4ffSkettenis #if defined(MULTIPROCESSOR)
128*92e5c4ffSkettenis void smp_tlb_flush_pte(vaddr_t, int);
129*92e5c4ffSkettenis void smp_tlb_flush_ctx(int);
130*92e5c4ffSkettenis #define tlb_flush_pte(va,ctx)	smp_tlb_flush_pte(va, ctx)
131*92e5c4ffSkettenis #define tlb_flush_ctx(ctx)	smp_tlb_flush_ctx(ctx)
132*92e5c4ffSkettenis #else
133*92e5c4ffSkettenis #define tlb_flush_pte(va,ctx)	sp_tlb_flush_pte(va, ctx)
134*92e5c4ffSkettenis #define tlb_flush_ctx(ctx)	sp_tlb_flush_ctx(ctx)
135*92e5c4ffSkettenis #endif
136f842aaf8Sart 
137f842aaf8Sart #endif /* _LOCORE */
138f842aaf8Sart 
139f842aaf8Sart /* TSB tag masks */
140f842aaf8Sart #define CTX_MASK		((1<<13)-1)
141f842aaf8Sart #define TSB_TAG_CTX_SHIFT	48
142f842aaf8Sart #define TSB_TAG_VA_SHIFT	22
143f842aaf8Sart #define TSB_TAG_G		0x8000000000000000LL
144f842aaf8Sart 
145f842aaf8Sart #define TSB_TAG_CTX(t)		((((int64_t)(t))>>TSB_TAG_CTX_SHIFT)&CTX_MASK)
146f842aaf8Sart #define TSB_TAG_VA(t)		((((int64_t)(t))<<TSB_TAG_VA_SHIFT))
147f842aaf8Sart #define TSB_TAG(g,ctx,va)	((((u_int64_t)((g)!=0))<<63)|(((u_int64_t)(ctx)&CTX_MASK)<<TSB_TAG_CTX_SHIFT)|(((u_int64_t)va)>>TSB_TAG_VA_SHIFT))
148f842aaf8Sart 
149f842aaf8Sart /* Page sizes */
150f842aaf8Sart #define	PGSZ_8K			0
151f842aaf8Sart #define	PGSZ_64K		1
152f842aaf8Sart #define	PGSZ_512K		2
153f842aaf8Sart #define	PGSZ_4M			3
154f842aaf8Sart 
155f842aaf8Sart #define	PGSZ_SHIFT		61
156f842aaf8Sart #define	TLB_SZ(s)		(((uint64_t)(s))<<PGSZ_SHIFT)
157f842aaf8Sart 
158f842aaf8Sart /* TLB data masks */
159f842aaf8Sart #define TLB_V			0x8000000000000000LL
160f842aaf8Sart #define TLB_8K			TLB_SZ(PGSZ_8K)
161f842aaf8Sart #define TLB_64K			TLB_SZ(PGSZ_64K)
162f842aaf8Sart #define TLB_512K		TLB_SZ(PGSZ_512K)
163f842aaf8Sart #define TLB_4M			TLB_SZ(PGSZ_4M)
164f842aaf8Sart #define TLB_SZ_MASK		0x6000000000000000LL
165f842aaf8Sart #define TLB_NFO			0x1000000000000000LL
166f842aaf8Sart #define TLB_IE			0x0800000000000000LL
1674d2b7625Sderaadt #define TLB_SOFT2_MASK		0x07fc000000000000LL
1684d2b7625Sderaadt #define TLB_RESERVED_MASK	0x0003f80000000000LL
1694d2b7625Sderaadt #define TLB_PA_MASK		0x000007ffffffe000LL
170f842aaf8Sart #define TLB_SOFT_MASK		0x0000000000001f80LL
171f842aaf8Sart /* S/W bits */
172f842aaf8Sart /* Access & TSB locked bits are swapped so I can set access w/one insn */
173f842aaf8Sart /* #define TLB_ACCESS		0x0000000000001000LL */
174f842aaf8Sart #define TLB_ACCESS		0x0000000000000200LL
175f842aaf8Sart #define TLB_MODIFY		0x0000000000000800LL
176f842aaf8Sart #define TLB_REAL_W		0x0000000000000400LL
177f842aaf8Sart /* #define TLB_TSB_LOCK		0x0000000000000200LL */
178f842aaf8Sart #define TLB_TSB_LOCK		0x0000000000001000LL
179f842aaf8Sart #define TLB_EXEC		0x0000000000000100LL
180f842aaf8Sart #define TLB_EXEC_ONLY		0x0000000000000080LL
181f842aaf8Sart /* H/W bits */
182f842aaf8Sart #define TLB_L			0x0000000000000040LL
183f842aaf8Sart #define TLB_CACHE_MASK		0x0000000000000030LL
184f842aaf8Sart #define TLB_CP			0x0000000000000020LL
185f842aaf8Sart #define TLB_CV			0x0000000000000010LL
186f842aaf8Sart #define TLB_E			0x0000000000000008LL
187f842aaf8Sart #define TLB_P			0x0000000000000004LL
188f842aaf8Sart #define TLB_W			0x0000000000000002LL
189f842aaf8Sart #define TLB_G			0x0000000000000001LL
190f842aaf8Sart 
191f842aaf8Sart #define TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
192f842aaf8Sart (((valid)?TLB_V:0LL)|TLB_SZ(sz)|(((u_int64_t)(pa))&TLB_PA_MASK)|\
193f842aaf8Sart ((cache)?((aliased)?TLB_CP:TLB_CACHE_MASK):TLB_E)|\
194f842aaf8Sart ((priv)?TLB_P:0LL)|((write)?TLB_W:0LL)|((g)?TLB_G:0LL)|((ie)?TLB_IE:0LL))
195f842aaf8Sart 
196f842aaf8Sart #define MMU_CACHE_VIRT	0x3
197f842aaf8Sart #define MMU_CACHE_PHYS	0x2
198f842aaf8Sart #define MMU_CACHE_NONE	0x0
199f842aaf8Sart 
200f842aaf8Sart /* This needs to be updated for sun4u IOMMUs */
201f842aaf8Sart /*
202f842aaf8Sart  * IOMMU PTE bits.
203f842aaf8Sart  */
204f842aaf8Sart #define IOPTE_PPN_MASK  0x07ffff00
205f842aaf8Sart #define IOPTE_PPN_SHIFT 8
206f842aaf8Sart #define IOPTE_RSVD      0x000000f1
207f842aaf8Sart #define IOPTE_WRITE     0x00000004
208f842aaf8Sart #define IOPTE_VALID     0x00000002
209