1f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
2f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Macros and functions to manipulate Meta page tables.
3f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
4f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
5f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#ifndef _METAG_PGTABLE_H
6f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _METAG_PGTABLE_H
7f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
8f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#include <asm-generic/pgtable-nopmd.h>
9f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
10f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Invalid regions on Meta: 0x00000000-0x001FFFFF and 0xFFFF0000-0xFFFFFFFF */
11f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#if PAGE_OFFSET >= LINGLOBAL_BASE
12f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define CONSISTENT_START	0xF7000000
13f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define CONSISTENT_END		0xF73FFFFF
14f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define VMALLOC_START		0xF8000000
15f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define VMALLOC_END		0xFFFEFFFF
16f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#else
17f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define CONSISTENT_START	0x77000000
18f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define CONSISTENT_END		0x773FFFFF
19f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define VMALLOC_START		0x78000000
20f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define VMALLOC_END		0x7FFFFFFF
21f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif
22f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
23f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
24f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Definitions for MMU descriptors
25f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan *
26f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * These are the hardware bits in the MMCU pte entries.
27f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Derived from the Meta toolkit headers.
28f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
29f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_PRESENT		MMCU_ENTRY_VAL_BIT
30f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_WRITE		MMCU_ENTRY_WR_BIT
31f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_PRIV		MMCU_ENTRY_PRIV_BIT
32f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Write combine bit - this can cause writes to occur out of order */
33f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_WR_COMBINE	MMCU_ENTRY_WRC_BIT
34f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Sys coherent bit - this bit is never used by Linux */
35f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SYS_COHERENT	MMCU_ENTRY_SYS_BIT
36f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_ALWAYS_ZERO_1	0x020
37f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_CTRL0	0x040
38f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_CTRL1	0x080
39f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_ALWAYS_ZERO_2	0x100
40f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_ALWAYS_ZERO_3	0x200
41f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_ALWAYS_ZERO_4	0x400
42f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_ALWAYS_ZERO_5	0x800
43f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
44f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* These are software bits that we stuff into the gaps in the hardware
45f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * pte entries that are not used.  Note, these DO get stored in the actual
46f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * hardware, but the hardware just does not use them.
47f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
48f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_ACCESSED		_PAGE_ALWAYS_ZERO_1
49f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_DIRTY		_PAGE_ALWAYS_ZERO_2
50f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_FILE		_PAGE_ALWAYS_ZERO_3
51f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
52f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Pages owned, and protected by, the kernel. */
53f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_KERNEL		_PAGE_PRIV
54f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
55f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* No cacheing of this page */
56f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_WIN0	(MMCU_CWIN_UNCACHED << MMCU_ENTRY_CWIN_S)
57f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* burst cacheing - good for data streaming */
58f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_WIN1	(MMCU_CWIN_BURST << MMCU_ENTRY_CWIN_S)
59f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* One cache way per thread */
60f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_WIN2	(MMCU_CWIN_C1SET << MMCU_ENTRY_CWIN_S)
61f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Full on cacheing */
62f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_WIN3	(MMCU_CWIN_CACHED << MMCU_ENTRY_CWIN_S)
63f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
64f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHEABLE		(_PAGE_CACHE_WIN3 | _PAGE_WR_COMBINE)
65f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
66f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* which bits are used for cache control ... */
67f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CACHE_MASK	(_PAGE_CACHE_CTRL0 | _PAGE_CACHE_CTRL1 | \
68f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_WR_COMBINE)
69f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
70f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* This is a mask of the bits that pte_modify is allowed to change. */
71f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_CHG_MASK		(PAGE_MASK)
72f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
73f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_SHIFT		1
74f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_4K		(0x0)
75f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_8K		(0x1 << _PAGE_SZ_SHIFT)
76f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_16K		(0x2 << _PAGE_SZ_SHIFT)
77f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_32K		(0x3 << _PAGE_SZ_SHIFT)
78f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_64K		(0x4 << _PAGE_SZ_SHIFT)
79f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_128K		(0x5 << _PAGE_SZ_SHIFT)
80f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_256K		(0x6 << _PAGE_SZ_SHIFT)
81f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_512K		(0x7 << _PAGE_SZ_SHIFT)
82f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_1M		(0x8 << _PAGE_SZ_SHIFT)
83f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_2M		(0x9 << _PAGE_SZ_SHIFT)
84f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_4M		(0xa << _PAGE_SZ_SHIFT)
85f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ_MASK		(0xf << _PAGE_SZ_SHIFT)
86f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
87f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#if defined(CONFIG_PAGE_SIZE_4K)
88f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ		(_PAGE_SZ_4K)
89f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_PAGE_SIZE_8K)
90f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ		(_PAGE_SZ_8K)
91f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_PAGE_SIZE_16K)
92f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_SZ		(_PAGE_SZ_16K)
93f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif
94f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define _PAGE_TABLE		(_PAGE_SZ | _PAGE_PRESENT)
95f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
96f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#if defined(CONFIG_HUGETLB_PAGE_SIZE_8K)
97f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_8K)
98f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_16K)
99f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_16K)
100f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_32K)
101f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_32K)
102f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_64K)
103f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_64K)
104f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_128K)
105f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_128K)
106f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_256K)
107f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_256K)
108f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_512K)
109f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_512K)
110f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_1M)
111f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_1M)
112f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_2M)
113f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_2M)
114f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#elif defined(CONFIG_HUGETLB_PAGE_SIZE_4M)
115f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define _PAGE_SZHUGE		(_PAGE_SZ_4M)
116f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif
117f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
118f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
119f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * The Linux memory management assumes a three-level page table setup. On
120f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Meta, we use that, but "fold" the mid level into the top-level page
121f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * table.
122f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
123f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
124f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* PGDIR_SHIFT determines the size of the area a second-level page table can
125f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * map. This is always 4MB.
126f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
127f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
128f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PGDIR_SHIFT	22
129f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PGDIR_SIZE	(1UL << PGDIR_SHIFT)
130f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PGDIR_MASK	(~(PGDIR_SIZE-1))
131f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
132f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
133f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Entries per page directory level: we use a two-level, so
134f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * we don't really have any PMD directory physically. First level tables
135f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * always map 2Gb (local or global) at a granularity of 4MB, second-level
136f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * tables map 4MB with a granularity between 4MB and 4kB (between 1 and
137f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * 1024 entries).
138f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
139f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PTRS_PER_PTE	(PGDIR_SIZE/PAGE_SIZE)
140f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define HPTRS_PER_PTE	(PGDIR_SIZE/HPAGE_SIZE)
141f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PTRS_PER_PGD	512
142f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
143f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define USER_PTRS_PER_PGD	256
144f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define FIRST_USER_ADDRESS	META_MEMORY_BASE
145f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define FIRST_USER_PGD_NR	pgd_index(FIRST_USER_ADDRESS)
146f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
147f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_NONE	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \
148f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_CACHEABLE)
149f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
150f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
151f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_ACCESSED | _PAGE_CACHEABLE)
152f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_SHARED_C	PAGE_SHARED
153f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_COPY	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \
154f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_CACHEABLE)
155f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_COPY_C	PAGE_COPY
156f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
157f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \
158f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_CACHEABLE)
159f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PAGE_KERNEL	__pgprot(_PAGE_PRESENT | _PAGE_DIRTY | \
160f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_ACCESSED | _PAGE_WRITE | \
161f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				 _PAGE_CACHEABLE | _PAGE_KERNEL)
162f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
163f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P000	PAGE_NONE
164f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P001	PAGE_READONLY
165f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P010	PAGE_COPY
166f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P011	PAGE_COPY
167f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P100	PAGE_READONLY
168f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P101	PAGE_READONLY
169f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P110	PAGE_COPY_C
170f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __P111	PAGE_COPY_C
171f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
172f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S000	PAGE_NONE
173f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S001	PAGE_READONLY
174f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S010	PAGE_SHARED
175f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S011	PAGE_SHARED
176f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S100	PAGE_READONLY
177f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S101	PAGE_READONLY
178f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S110	PAGE_SHARED_C
179f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __S111	PAGE_SHARED_C
180f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
181f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#ifndef __ASSEMBLY__
182f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
183f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#include <asm/page.h>
184f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
185f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* zero page used for uninitialized stuff */
186f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganextern unsigned long empty_zero_page;
187f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define ZERO_PAGE(vaddr)	(virt_to_page(empty_zero_page))
188f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
189f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Certain architectures need to do special things when pte's
190f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * within a page table are directly modified.  Thus, the following
191f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * hook is made available.
192f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
193f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define set_pte(pteptr, pteval) ((*(pteptr)) = (pteval))
194f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval)
195f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
196f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
197f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
198f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_pfn(pte)		(pte_val(pte) >> PAGE_SHIFT)
199f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
200f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pfn_pte(pfn, prot)	__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
201f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
202f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_none(x)		(!pte_val(x))
203f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_present(x)		(pte_val(x) & _PAGE_PRESENT)
204f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_clear(mm, addr, xp)	do { pte_val(*(xp)) = 0; } while (0)
205f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
206f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_none(x)		(!pmd_val(x))
207f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_bad(x)		((pmd_val(x) & ~(PAGE_MASK | _PAGE_SZ_MASK)) \
208f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan					!= (_PAGE_TABLE & ~_PAGE_SZ_MASK))
209f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_present(x)		(pmd_val(x) & _PAGE_PRESENT)
210f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_clear(xp)		do { pmd_val(*(xp)) = 0; } while (0)
211f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
212f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_page(x)		pfn_to_page(pte_pfn(x))
213f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
214f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
215f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * The following only work if pte_present() is true.
216f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Undefined behaviour if not..
217f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
218f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
219f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline int pte_write(pte_t pte)   { return pte_val(pte) & _PAGE_WRITE; }
220f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline int pte_dirty(pte_t pte)   { return pte_val(pte) & _PAGE_DIRTY; }
221f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline int pte_young(pte_t pte)   { return pte_val(pte) & _PAGE_ACCESSED; }
222f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline int pte_file(pte_t pte)    { return pte_val(pte) & _PAGE_FILE; }
223f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline int pte_special(pte_t pte) { return 0; }
224f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
225f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_wrprotect(pte_t pte) { pte_val(pte) &= (~_PAGE_WRITE); return pte; }
226f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkclean(pte_t pte)   { pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
227f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkold(pte_t pte)     { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
228f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkwrite(pte_t pte)   { pte_val(pte) |= _PAGE_WRITE; return pte; }
229f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkdirty(pte_t pte)   { pte_val(pte) |= _PAGE_DIRTY; return pte; }
230f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkyoung(pte_t pte)   { pte_val(pte) |= _PAGE_ACCESSED; return pte; }
231f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkspecial(pte_t pte) { return pte; }
232f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_mkhuge(pte_t pte)    { return pte; }
233f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
234f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
235f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Macro and implementation to make a page protection as uncacheable.
236f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
237f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgprot_writecombine(prot)					\
238f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	__pgprot(pgprot_val(prot) & ~(_PAGE_CACHE_CTRL1 | _PAGE_CACHE_CTRL0))
239f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
240f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgprot_noncached(prot)						\
241f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	__pgprot(pgprot_val(prot) & ~_PAGE_CACHEABLE)
242f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
243f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
244f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
245f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Conversion functions: convert a page and protection to a page entry,
246f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * and a page entry and page directory to the page they refer to.
247f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
248f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
249f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define mk_pte(page, pgprot)	pfn_pte(page_to_pfn(page), (pgprot))
250f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
251f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
252f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan{
253f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
254f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	return pte;
255f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan}
256f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
257f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline unsigned long pmd_page_vaddr(pmd_t pmd)
258f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan{
259f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	unsigned long paddr = pmd_val(pmd) & PAGE_MASK;
260f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	if (!paddr)
261f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan		return 0;
262f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	return (unsigned long)__va(paddr);
263f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan}
264f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
265f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_page(pmd)		(pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
266f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_page_shift(pmd)	(12 + ((pmd_val(pmd) & _PAGE_SZ_MASK) \
267f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan					>> _PAGE_SZ_SHIFT))
268f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_num_ptrs(pmd)	(PGDIR_SIZE >> pmd_page_shift(pmd))
269f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
270f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
271f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Each pgd is only 2k, mapping 2Gb (local or global). If we're in global
272f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * space drop the top bit before indexing the pgd.
273f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
274f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#if PAGE_OFFSET >= LINGLOBAL_BASE
275f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgd_index(address)	((((address) & ~0x80000000) >> PGDIR_SHIFT) \
276f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan							& (PTRS_PER_PGD-1))
277f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#else
278f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgd_index(address)	(((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
279f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif
280f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
281f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgd_offset(mm, address)	((mm)->pgd + pgd_index(address))
282f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
283f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgd_offset_k(address)	pgd_offset(&init_mm, address)
284f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
285f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pmd_index(address)	(((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
286f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
287f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* Find an entry in the second-level page table.. */
288f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#if !defined(CONFIG_HUGETLB_PAGE)
289f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan  /* all pages are of size (1 << PAGE_SHIFT), so no need to read 1st level pt */
290f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define pte_index(pmd, address) \
291f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
292f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#else
293f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan  /* some pages are huge, so read 1st level pt to find out */
294f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan# define pte_index(pmd, address) \
295f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	(((address) >> pmd_page_shift(pmd)) & (pmd_num_ptrs(pmd) - 1))
296f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif
297f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_offset_kernel(dir, address) \
298f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(*(dir), address))
299f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_offset_map(dir, address)		pte_offset_kernel(dir, address)
300f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_offset_map_nested(dir, address)	pte_offset_kernel(dir, address)
301f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
302f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_unmap(pte)		do { } while (0)
303f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_unmap_nested(pte)	do { } while (0)
304f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
305f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_ERROR(e) \
306f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	pr_err("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
307f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgd_ERROR(e) \
308f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
309f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
310f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
311f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Meta doesn't have any external MMU info: the kernel page
312f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * tables contain all the necessary information.
313f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
314f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganstatic inline void update_mmu_cache(struct vm_area_struct *vma,
315f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan				    unsigned long address, pte_t *pte)
316f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan{
317f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan}
318f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
319f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
320f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Encode and decode a swap entry (must be !pte_none(e) && !pte_present(e))
321f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * Since PAGE_PRESENT is bit 1, we can use the bits above that.
322f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
323f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __swp_type(x)			(((x).val >> 1) & 0xff)
324f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __swp_offset(x)			((x).val >> 10)
325f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __swp_entry(type, offset)	((swp_entry_t) { ((type) << 1) | \
326f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan					 ((offset) << 10) })
327f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __pte_to_swp_entry(pte)		((swp_entry_t) { pte_val(pte) })
328f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __swp_entry_to_pte(x)		((pte_t) { (x).val })
329f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
330f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define PTE_FILE_MAX_BITS	22
331f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pte_to_pgoff(x)		(pte_val(x) >> 10)
332f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgoff_to_pte(x)		__pte(((x) << 10) | _PAGE_FILE)
333f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
334f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define kern_addr_valid(addr)	(1)
335f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
336f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/*
337f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * No page table caches to initialise
338f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
339f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define pgtable_cache_init()	do { } while (0)
340f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
341f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganextern pgd_t swapper_pg_dir[PTRS_PER_PGD];
342f5df8e268f749987c32c7eee001f7623fd7be69cJames Hoganvoid paging_init(unsigned long mem_end);
343f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
344f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#ifdef CONFIG_METAG_META12
345f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan/* This is a workaround for an issue in Meta 1 cores. These cores cache
346f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * invalid entries in the TLB so we always need to flush whenever we add
347f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * a new pte. Unfortunately we can only flush the whole TLB not shoot down
348f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * single entries so this is sub-optimal. This implementation ensures that
349f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * we will get a flush at the second attempt, so we may still get repeated
350f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan * faults, we just don't overflow the kernel stack handling them.
351f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan */
352f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
353f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
354f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan({									  \
355f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	int __changed = !pte_same(*(__ptep), __entry);			  \
356f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	if (__changed) {						  \
357f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan		set_pte_at((__vma)->vm_mm, (__address), __ptep, __entry); \
358f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	}								  \
359f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	flush_tlb_page(__vma, __address);				  \
360f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan	__changed;							  \
361f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan})
362f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif
363f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
364f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#include <asm-generic/pgtable.h>
365f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan
366f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif /* __ASSEMBLY__ */
367f5df8e268f749987c32c7eee001f7623fd7be69cJames Hogan#endif /* _METAG_PGTABLE_H */
368