ppc64: extern inline -> static inline
[opensuse:kernel.git] / include / asm-ppc64 / page.h
1 #ifndef _PPC64_PAGE_H
2 #define _PPC64_PAGE_H
3
4 /*
5  * Copyright (C) 2001 PPC64 Team, IBM Corp
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version
10  * 2 of the License, or (at your option) any later version.
11  */
12
13 #include <linux/config.h>
14
15 /* PAGE_SHIFT determines the page size */
16 #define PAGE_SHIFT      12
17 #define PAGE_SIZE       (1UL << PAGE_SHIFT)
18 #define PAGE_MASK       (~(PAGE_SIZE-1))
19 #define PAGE_OFFSET_MASK (PAGE_SIZE-1)
20
21 #define SID_SHIFT       28
22 #define SID_MASK        0xfffffffff
23 #define GET_ESID(x)     (((x) >> SID_SHIFT) & SID_MASK)
24
25 /* Define an illegal instr to trap on the bug.
26  * We don't use 0 because that marks the end of a function
27  * in the ELF ABI.  That's "Boo Boo" in case you wonder...
28  */
29 #define BUG_OPCODE .long 0x00b00b00  /* For asm */
30 #define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */
31
32 #ifdef __KERNEL__
33 #ifndef __ASSEMBLY__
34 #include <asm/naca.h>
35
36 #define STRICT_MM_TYPECHECKS
37
38 #define REGION_SIZE   4UL
39 #define OFFSET_SIZE   60UL
40 #define REGION_SHIFT  60UL
41 #define OFFSET_SHIFT  0UL
42 #define REGION_MASK   (((1UL<<REGION_SIZE)-1UL)<<REGION_SHIFT)
43 #define REGION_STRIDE (1UL << REGION_SHIFT)
44
45 typedef union ppc64_va {
46         struct {
47                 unsigned long off : OFFSET_SIZE;  /* intra-region offset */
48                 unsigned long reg : REGION_SIZE;  /* region number */
49         } f;
50         unsigned long l;
51         void *p;
52 } ppc64_va;
53        
54 static __inline__ void clear_page(void *addr)
55 {
56         unsigned long lines, line_size;
57
58         line_size = naca->dCacheL1LineSize; 
59         lines = naca->dCacheL1LinesPerPage;
60
61         __asm__ __volatile__(
62 "       mtctr   %1\n\
63 1:      dcbz    0,%0\n\
64         add     %0,%0,%3\n\
65         bdnz+   1b"
66         : "=r" (addr)
67         : "r" (lines), "0" (addr), "r" (line_size)
68         : "ctr", "memory");
69 }
70
71 extern void copy_page(void *to, void *from);
72 struct page;
73 extern void clear_user_page(void *page, unsigned long vaddr);
74 extern void copy_user_page(void *to, void *from, unsigned long vaddr);
75
76 #ifdef STRICT_MM_TYPECHECKS
77 /*
78  * These are used to make use of C type-checking.  
79  * Entries in the pte table are 64b, while entries in the pgd & pmd are 32b.
80  */
81 typedef struct { unsigned long pte; } pte_t;
82 typedef struct { unsigned int  pmd; } pmd_t;
83 typedef struct { unsigned int  pgd; } pgd_t;
84 typedef struct { unsigned long pgprot; } pgprot_t;
85
86 #define pte_val(x)      ((x).pte)
87 #define pmd_val(x)      ((x).pmd)
88 #define pgd_val(x)      ((x).pgd)
89 #define pgprot_val(x)   ((x).pgprot)
90
91 #define __pte(x)        ((pte_t) { (x) } )
92 #define __pmd(x)        ((pmd_t) { (x) } )
93 #define __pgd(x)        ((pgd_t) { (x) } )
94 #define __pgprot(x)     ((pgprot_t) { (x) } )
95
96 #else
97 /*
98  * .. while these make it easier on the compiler
99  */
100 typedef unsigned long pte_t;
101 typedef unsigned int  pmd_t;
102 typedef unsigned int  pgd_t;
103 typedef unsigned long pgprot_t;
104
105 #define pte_val(x)      (x)
106 #define pmd_val(x)      (x)
107 #define pgd_val(x)      (x)
108 #define pgprot_val(x)   (x)
109
110 #define __pte(x)        (x)
111 #define __pmd(x)        (x)
112 #define __pgd(x)        (x)
113 #define __pgprot(x)     (x)
114
115 #endif
116
117 #ifdef CONFIG_XMON
118 #include <asm/ptrace.h>
119 extern void xmon(struct pt_regs *excp);
120 #define BUG() do { \
121         printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
122         xmon(0); \
123 } while (0)
124 #else
125 #define BUG() do { \
126         printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
127         __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); \
128 } while (0)
129 #endif
130
131 #define PAGE_BUG(page) do { BUG(); } while (0)
132
133 /* Pure 2^n version of get_order */
134 static inline int get_order(unsigned long size)
135 {
136         int order;
137
138         size = (size-1) >> (PAGE_SHIFT-1);
139         order = -1;
140         do {
141                 size >>= 1;
142                 order++;
143         } while (size);
144         return order;
145 }
146
147 #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
148
149 #endif /* __ASSEMBLY__ */
150
151 /* align addr on a size boundry - adjust address up/down if needed */
152 #define _ALIGN_UP(addr,size)    (((addr)+((size)-1))&(~((size)-1)))
153 #define _ALIGN_DOWN(addr,size)  ((addr)&(~((size)-1)))
154
155 /* align addr on a size boundry - adjust address up if needed */
156 #define _ALIGN(addr,size)     _ALIGN_UP(addr,size)
157
158 /* to align the pointer to the (next) double word boundary */
159 #define DOUBLEWORD_ALIGN(addr)  _ALIGN(addr,sizeof(unsigned long))
160
161 /* to align the pointer to the (next) page boundary */
162 #define PAGE_ALIGN(addr)        _ALIGN(addr, PAGE_SIZE)
163
164 #ifdef MODULE
165 #define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))
166 #else
167 #define __page_aligned \
168         __attribute__((__aligned__(PAGE_SIZE), \
169                 __section__(".data.page_aligned")))
170 #endif
171
172
173 /* This must match the -Ttext linker address            */
174 /* Note: tophys & tovirt make assumptions about how     */
175 /*       KERNELBASE is defined for performance reasons. */
176 /*       When KERNELBASE moves, those macros may have   */
177 /*             to change!                               */
178 #define PAGE_OFFSET     0xC000000000000000
179 #define KERNELBASE      PAGE_OFFSET
180 #define VMALLOCBASE     0xD000000000000000
181 #define IOREGIONBASE    0xE000000000000000
182
183 #define IO_REGION_ID       (IOREGIONBASE>>REGION_SHIFT)
184 #define VMALLOC_REGION_ID  (VMALLOCBASE>>REGION_SHIFT)
185 #define KERNEL_REGION_ID   (KERNELBASE>>REGION_SHIFT)
186 #define USER_REGION_ID     (0UL)
187 #define REGION_ID(X)       (((unsigned long)(X))>>REGION_SHIFT)
188
189 /*
190  * Define valid/invalid EA bits (for all ranges)
191  */
192 #define VALID_EA_BITS   (0x000001ffffffffffUL)
193 #define INVALID_EA_BITS (~(REGION_MASK|VALID_EA_BITS))
194
195 #define IS_VALID_REGION_ID(x) \
196         (((x) == USER_REGION_ID) || ((x) >= KERNEL_REGION_ID))
197 #define IS_VALID_EA(x) \
198         ((!((x) & INVALID_EA_BITS)) && IS_VALID_REGION_ID(REGION_ID(x)))
199
200 #define __bpn_to_ba(x) ((((unsigned long)(x))<<PAGE_SHIFT) + KERNELBASE)
201 #define __ba_to_bpn(x) ((((unsigned long)(x)) & ~REGION_MASK) >> PAGE_SHIFT)
202
203 #define __va(x) ((void *)((unsigned long)(x) + KERNELBASE))
204
205 /* Given that physical addresses do not map 1-1 to absolute addresses, we
206  * use these macros to better specify exactly what we want to do.
207  * The only restriction on their use is that the absolute address
208  * macros cannot be used until after the LMB structure has been
209  * initialized in prom.c.  -Peter
210  */
211 #define __v2p(x) ((void *) __pa(x))
212 #define __v2a(x) ((void *) phys_to_absolute(__pa(x)))
213 #define __p2a(x) ((void *) phys_to_absolute(x))
214 #define __p2v(x) ((void *) __va(x))
215 #define __a2p(x) ((void *) absolute_to_phys(x))
216 #define __a2v(x) ((void *) __va(absolute_to_phys(x)))
217
218 #define virt_to_page(kaddr) (mem_map+(__pa((unsigned long)kaddr) >> PAGE_SHIFT))
219
220 #define VALID_PAGE(page)    ((page - mem_map) < max_mapnr)
221
222 #define MAP_NR(addr)        (__pa(addr) >> PAGE_SHIFT)
223
224 #define VM_DATA_DEFAULT_FLAGS   (VM_READ | VM_WRITE | VM_EXEC | \
225                                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
226
227 #endif /* __KERNEL__ */
228 #endif /* _PPC64_PAGE_H */