Merge bk://ppc.bkbits.net/for-linus-ppc
[opensuse:kernel.git] / include / asm-ppc / page.h
1 /*
2  * BK Id: %F% %I% %G% %U% %#%
3  */
4 #ifndef _PPC_PAGE_H
5 #define _PPC_PAGE_H
6
7 /* PAGE_SHIFT determines the page size */
8 #define PAGE_SHIFT      12
9 #define PAGE_SIZE       (1UL << PAGE_SHIFT)
10 #define PAGE_MASK       (~(PAGE_SIZE-1))
11
12 #ifdef __KERNEL__
13 #include <linux/config.h>
14
15 /* Be sure to change arch/ppc/Makefile to match */
16 #ifdef CONFIG_KERNEL_START_BOOL
17 #define PAGE_OFFSET     CONFIG_KERNEL_START
18 #else
19 #define PAGE_OFFSET     0xc0000000
20 #endif /* CONFIG_KERNEL_START_BOOL */
21 #define KERNELBASE      PAGE_OFFSET
22
23 #ifndef __ASSEMBLY__
24 #include <asm/system.h> /* for xmon definition */
25
26 #ifdef CONFIG_XMON
27 #define BUG() do { \
28         printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
29         xmon(0); \
30 } while (0)
31 #else
32 #define BUG() do { \
33         printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
34         __asm__ __volatile__(".long 0x0"); \
35 } while (0)
36 #endif
37 #define PAGE_BUG(page) do { BUG(); } while (0)
38
39 #define STRICT_MM_TYPECHECKS
40
41 #ifdef STRICT_MM_TYPECHECKS
42 /*
43  * These are used to make use of C type-checking..
44  */
45 typedef struct { unsigned long pte; } pte_t;
46 typedef struct { unsigned long pmd; } pmd_t;
47 typedef struct { unsigned long pgd; } pgd_t;
48 typedef struct { unsigned long pgprot; } pgprot_t;
49
50 #define pte_val(x)      ((x).pte)
51 #define pmd_val(x)      ((x).pmd)
52 #define pgd_val(x)      ((x).pgd)
53 #define pgprot_val(x)   ((x).pgprot)
54
55 #define __pte(x)        ((pte_t) { (x) } )
56 #define __pmd(x)        ((pmd_t) { (x) } )
57 #define __pgd(x)        ((pgd_t) { (x) } )
58 #define __pgprot(x)     ((pgprot_t) { (x) } )
59
60 #else
61 /*
62  * .. while these make it easier on the compiler
63  */
64 typedef unsigned long pte_t;
65 typedef unsigned long pmd_t;
66 typedef unsigned long pgd_t;
67 typedef unsigned long pgprot_t;
68
69 #define pte_val(x)      (x)
70 #define pmd_val(x)      (x)
71 #define pgd_val(x)      (x)
72 #define pgprot_val(x)   (x)
73
74 #define __pte(x)        (x)
75 #define __pmd(x)        (x)
76 #define __pgd(x)        (x)
77 #define __pgprot(x)     (x)
78
79 #endif
80
81
82 /* align addr on a size boundry - adjust address up if needed -- Cort */
83 #define _ALIGN(addr,size)       (((addr)+size-1)&(~(size-1)))
84
85 /* to align the pointer to the (next) page boundary */
86 #define PAGE_ALIGN(addr)        (((addr)+PAGE_SIZE-1)&PAGE_MASK)
87
88 extern void clear_page(void *page);
89 extern void copy_page(void *to, void *from);
90 extern void clear_user_page(void *page, unsigned long vaddr);
91 extern void copy_user_page(void *to, void *from, unsigned long vaddr);
92
93 extern unsigned long ppc_memstart;
94 extern unsigned long ppc_memoffset;
95 #ifndef CONFIG_APUS
96 #define PPC_MEMSTART    0
97 #define PPC_MEMOFFSET   PAGE_OFFSET
98 #else
99 #define PPC_MEMSTART    ppc_memstart
100 #define PPC_MEMOFFSET   ppc_memoffset
101 #endif
102
103 #if defined(CONFIG_APUS) && !defined(MODULE)
104 /* map phys->virtual and virtual->phys for RAM pages */
105 static inline unsigned long ___pa(unsigned long v)
106
107         unsigned long p;
108         asm volatile ("1: addis %0, %1, %2;" 
109                       ".section \".vtop_fixup\",\"aw\";"
110                       ".align  1;"
111                       ".long   1b;"
112                       ".previous;"
113                       : "=r" (p) 
114                       : "b" (v), "K" (((-PAGE_OFFSET) >> 16) & 0xffff));
115
116         return p;
117 }
118 static inline void* ___va(unsigned long p)
119
120         unsigned long v;
121         asm volatile ("1: addis %0, %1, %2;" 
122                       ".section \".ptov_fixup\",\"aw\";"
123                       ".align  1;"
124                       ".long   1b;"
125                       ".previous;"
126                       : "=r" (v) 
127                       : "b" (p), "K" (((PAGE_OFFSET) >> 16) & 0xffff));
128
129         return (void*) v;
130 }
131 #else
132 #define ___pa(vaddr) ((vaddr)-PPC_MEMOFFSET)
133 #define ___va(paddr) ((paddr)+PPC_MEMOFFSET)
134 #endif
135
136 #define __pa(x) ___pa((unsigned long)(x))
137 #define __va(x) ((void *)(___va((unsigned long)(x))))
138
139 #define MAP_PAGE_RESERVED       (1<<15)
140 #define virt_to_page(kaddr)     (mem_map + (((unsigned long)kaddr-PAGE_OFFSET) >> PAGE_SHIFT))
141 #define VALID_PAGE(page)        ((page - mem_map) < max_mapnr)
142
143 extern unsigned long get_zero_page_fast(void);
144
145 /* Pure 2^n version of get_order */
146 extern __inline__ int get_order(unsigned long size)
147 {
148         int order;
149
150         size = (size-1) >> (PAGE_SHIFT-1);
151         order = -1;
152         do {
153                 size >>= 1;
154                 order++;
155         } while (size);
156         return order;
157 }
158
159 #endif /* __ASSEMBLY__ */
160
161 #define VM_DATA_DEFAULT_FLAGS   (VM_READ | VM_WRITE | VM_EXEC | \
162                                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
163
164 #endif /* __KERNEL__ */
165 #endif /* _PPC_PAGE_H */