Optimize andes_clear_page() and andes_copy_page() with prefetch
[linux-2.6/linux-mips.git] / include / asm-ppc / page.h
bloba4f6b0a4bfb92f1e75aa2b79b25c39cdd4291d92
1 #include <linux/config.h>
2 #ifndef __ASSEMBLY__
3 #include <asm/system.h> /* for xmon definition */
4 #endif /* ndef __ASSEMBLY__ */
6 #ifndef _PPC_PAGE_H
7 #define _PPC_PAGE_H
9 /* PAGE_SHIFT determines the page size */
10 #define PAGE_SHIFT 12
11 #define PAGE_SIZE (1UL << PAGE_SHIFT)
12 #define PAGE_MASK (~(PAGE_SIZE-1))
14 #define PAGE_OFFSET 0xc0000000
15 #define KERNELBASE PAGE_OFFSET
17 #ifndef __ASSEMBLY__
18 #ifdef __KERNEL__
20 #ifdef CONFIG_XMON
21 #define BUG() do { \
22 printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
23 xmon(0); \
24 } while (0)
25 #else
26 #define BUG() do { \
27 printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
28 __asm__ __volatile__(".long 0x0"); \
29 } while (0)
30 #endif
31 #define PAGE_BUG(page) do { BUG(); } while (0)
33 #define STRICT_MM_TYPECHECKS
35 #ifdef STRICT_MM_TYPECHECKS
37 * These are used to make use of C type-checking..
39 typedef struct { unsigned long pte; } pte_t;
40 typedef struct { unsigned long pmd; } pmd_t;
41 typedef struct { unsigned long pgd; } pgd_t;
42 typedef struct { unsigned long pgprot; } pgprot_t;
44 #define pte_val(x) ((x).pte)
45 #define pmd_val(x) ((x).pmd)
46 #define pgd_val(x) ((x).pgd)
47 #define pgprot_val(x) ((x).pgprot)
49 #define __pte(x) ((pte_t) { (x) } )
50 #define __pmd(x) ((pmd_t) { (x) } )
51 #define __pgd(x) ((pgd_t) { (x) } )
52 #define __pgprot(x) ((pgprot_t) { (x) } )
54 #else
56 * .. while these make it easier on the compiler
58 typedef unsigned long pte_t;
59 typedef unsigned long pmd_t;
60 typedef unsigned long pgd_t;
61 typedef unsigned long pgprot_t;
63 #define pte_val(x) (x)
64 #define pmd_val(x) (x)
65 #define pgd_val(x) (x)
66 #define pgprot_val(x) (x)
68 #define __pte(x) (x)
69 #define __pmd(x) (x)
70 #define __pgd(x) (x)
71 #define __pgprot(x) (x)
73 #endif
76 /* align addr on a size boundry - adjust address up if needed -- Cort */
77 #define _ALIGN(addr,size) (((addr)+size-1)&(~(size-1)))
79 /* to align the pointer to the (next) page boundary */
80 #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
82 extern void clear_page(void *page);
83 extern void copy_page(void *to, void *from);
84 #define clear_user_page(page, vaddr) clear_page(page)
85 #define copy_user_page(to, from, vaddr) copy_page(to, from)
87 /* map phys->virtual and virtual->phys for RAM pages */
88 static inline unsigned long ___pa(unsigned long v)
90 unsigned long p;
91 asm volatile ("1: addis %0, %1, %2;"
92 ".section \".vtop_fixup\",\"aw\";"
93 ".align 1;"
94 ".long 1b;"
95 ".previous;"
96 : "=r" (p)
97 : "b" (v), "K" (((-PAGE_OFFSET) >> 16) & 0xffff));
99 return p;
101 static inline void* ___va(unsigned long p)
103 unsigned long v;
104 asm volatile ("1: addis %0, %1, %2;"
105 ".section \".ptov_fixup\",\"aw\";"
106 ".align 1;"
107 ".long 1b;"
108 ".previous;"
109 : "=r" (v)
110 : "b" (p), "K" (((PAGE_OFFSET) >> 16) & 0xffff));
112 return (void*) v;
114 #define __pa(x) ___pa ((unsigned long)(x))
115 #define __va(x) ___va ((unsigned long)(x))
117 #define MAP_NR(addr) (((unsigned long)addr-PAGE_OFFSET) >> PAGE_SHIFT)
118 #define MAP_PAGE_RESERVED (1<<15)
120 extern unsigned long get_zero_page_fast(void);
122 /* Pure 2^n version of get_order */
123 extern __inline__ int get_order(unsigned long size)
125 int order;
127 size = (size-1) >> (PAGE_SHIFT-1);
128 order = -1;
129 do {
130 size >>= 1;
131 order++;
132 } while (size);
133 return order;
136 #endif /* __KERNEL__ */
137 #endif /* __ASSEMBLY__ */
138 #endif /* _PPC_PAGE_H */