Blame view

include/asm-mips/page.h 4.55 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   *
   * Copyright (C) 1994 - 1999, 2000, 03 Ralf Baechle
   * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
   */
  #ifndef _ASM_PAGE_H
  #define _ASM_PAGE_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  
  #ifdef __KERNEL__
  
  #include <spaces.h>
  
  #endif
  
  /*
   * PAGE_SHIFT determines the page size
   */
  #ifdef CONFIG_PAGE_SIZE_4KB
  #define PAGE_SHIFT	12
  #endif
  #ifdef CONFIG_PAGE_SIZE_8KB
  #define PAGE_SHIFT	13
  #endif
  #ifdef CONFIG_PAGE_SIZE_16KB
  #define PAGE_SHIFT	14
  #endif
  #ifdef CONFIG_PAGE_SIZE_64KB
  #define PAGE_SHIFT	16
  #endif
  #define PAGE_SIZE	(1UL << PAGE_SHIFT)
  #define PAGE_MASK       (~((1 << PAGE_SHIFT) - 1))
  
  
  #ifdef __KERNEL__
  #ifndef __ASSEMBLY__
  
  extern void clear_page(void * page);
  extern void copy_page(void * to, void * from);
  
  extern unsigned long shm_align_mask;
  
  static inline unsigned long pages_do_alias(unsigned long addr1,
  	unsigned long addr2)
  {
  	return (addr1 ^ addr2) & shm_align_mask;
  }
  
  struct page;
  
  static inline void clear_user_page(void *addr, unsigned long vaddr,
  	struct page *page)
  {
  	extern void (*flush_data_cache_page)(unsigned long addr);
  
  	clear_page(addr);
  	if (pages_do_alias((unsigned long) addr, vaddr))
  		flush_data_cache_page((unsigned long)addr);
  }
  
  static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
  	struct page *to)
  {
  	extern void (*flush_data_cache_page)(unsigned long addr);
  
  	copy_page(vto, vfrom);
  	if (pages_do_alias((unsigned long)vto, vaddr))
  		flush_data_cache_page((unsigned long)vto);
  }
  
  /*
   * These are used to make use of C type-checking..
   */
  #ifdef CONFIG_64BIT_PHYS_ADDR
ec917c2c1   Ralf Baechle   Fixup a few lose ...
77
    #ifdef CONFIG_CPU_MIPS32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
83
84
85
86
87
      typedef struct { unsigned long pte_low, pte_high; } pte_t;
      #define pte_val(x)    ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
    #else
       typedef struct { unsigned long long pte; } pte_t;
       #define pte_val(x)	((x).pte)
    #endif
  #else
  typedef struct { unsigned long pte; } pte_t;
  #define pte_val(x)	((x).pte)
  #endif
c6e8b5877   Ralf Baechle   Update MIPS to us...
88
  #define __pte(x)	((pte_t) { (x) } )
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89

c6e8b5877   Ralf Baechle   Update MIPS to us...
90
91
92
93
94
  /*
   * For 3-level pagetables we defines these ourselves, for 2-level the
   * definitions are supplied by <asm-generic/pgtable-nopmd.h>.
   */
  #ifdef CONFIG_64BIT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95

c6e8b5877   Ralf Baechle   Update MIPS to us...
96
  typedef struct { unsigned long pmd; } pmd_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  #define pmd_val(x)	((x).pmd)
c6e8b5877   Ralf Baechle   Update MIPS to us...
98
  #define __pmd(x)	((pmd_t) { (x) } )
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99

c6e8b5877   Ralf Baechle   Update MIPS to us...
100
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101

c6e8b5877   Ralf Baechle   Update MIPS to us...
102
103
104
105
106
107
108
109
110
111
  /*
   * Right now we don't support 4-level pagetables, so all pud-related
   * definitions come from <asm-generic/pgtable-nopud.h>.
   */
  
  /*
   * Finall the top of the hierarchy, the pgd
   */
  typedef struct { unsigned long pgd; } pgd_t;
  #define pgd_val(x)	((x).pgd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  #define __pgd(x)	((pgd_t) { (x) } )
c6e8b5877   Ralf Baechle   Update MIPS to us...
113
114
115
116
117
118
  
  /*
   * Manipulate page protection bits
   */
  typedef struct { unsigned long pgprot; } pgprot_t;
  #define pgprot_val(x)	((x).pgprot)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  #define __pgprot(x)	((pgprot_t) { (x) } )
c6e8b5877   Ralf Baechle   Update MIPS to us...
120
121
122
123
124
125
126
127
  /*
   * On R4000-style MMUs where a TLB entry is mapping a adjacent even / odd
   * pair of pages we only have a single global bit per pair of pages.  When
   * writing to the TLB make sure we always have the bit set for both pages
   * or none.  This macro is used to access the `buddy' of the pte we're just
   * working on.
   */
  #define ptep_buddy(x)	((pte_t *)((unsigned long)(x) ^ sizeof(pte_t)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
129
130
131
132
133
134
135
136
  #endif /* !__ASSEMBLY__ */
  
  /* to align the pointer to the (next) page boundary */
  #define PAGE_ALIGN(addr)	(((addr) + PAGE_SIZE - 1) & PAGE_MASK)
  
  #define __pa(x)			((unsigned long) (x) - PAGE_OFFSET)
  #define __va(x)			((void *)((unsigned long) (x) + PAGE_OFFSET))
  
  #define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
b1c231f5a   Chad Reese   [MIPS] Fix sparse...
137
  #ifndef CONFIG_SPARSEMEM
b4819b593   Yoichi Yuasa   [PATCH] mips: add...
138
  #ifndef CONFIG_NEED_MULTIPLE_NODES
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
140
  #define pfn_valid(pfn)		((pfn) < max_mapnr)
  #endif
b1c231f5a   Chad Reese   [MIPS] Fix sparse...
141
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142

e53639d8f   Ralf Baechle   [MIPS] Consolidat...
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  #ifdef CONFIG_FLATMEM
  
  #define pfn_valid(pfn)		((pfn) < max_mapnr)
  
  #elif defined(CONFIG_NEED_MULTIPLE_NODES)
  
  #define pfn_valid(pfn)							\
  ({									\
  	unsigned long __pfn = (pfn);					\
  	int __n = pfn_to_nid(__pfn);					\
  	((__n >= 0) ? (__pfn < NODE_DATA(__n)->node_start_pfn +		\
  	                       NODE_DATA(__n)->node_spanned_pages)	\
  	            : 0);						\
  })
  
  #else
  #error Provide a definition of pfn_valid
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  #define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
  #define virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
  
  #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \
  				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  
  #define UNCAC_ADDR(addr)	((addr) - PAGE_OFFSET + UNCAC_BASE)
  #define CAC_ADDR(addr)		((addr) - UNCAC_BASE + PAGE_OFFSET)
  
  #endif /* defined (__KERNEL__) */
  
  #ifdef CONFIG_LIMITED_DMA
  #define WANT_PAGE_VIRTUAL
  #endif
a02036e79   KAMEZAWA Hiroyuki   [PATCH] unify pfn...
175
  #include <asm-generic/memory_model.h>
fd4fd5aac   Stephen Rothwell   [PATCH] mm: conso...
176
  #include <asm-generic/page.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
  #endif /* _ASM_PAGE_H */