Merge with 2.3.48.
[linux-2.6/linux-mips.git] / include / asm-ia64 / page.h
blob2361bc06d73408371610507553d6f96866ea98aa
1 #ifndef _ASM_IA64_PAGE_H
2 #define _ASM_IA64_PAGE_H
3 /*
4 * Pagetable related stuff.
6 * Copyright (C) 1998, 1999 Hewlett-Packard Co
7 * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
8 */
10 #include <linux/config.h>
12 #include <asm/types.h>
15 * PAGE_SHIFT determines the actual kernel page size.
17 #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
18 # define PAGE_SHIFT 12
19 #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
20 # define PAGE_SHIFT 13
21 #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
22 # define PAGE_SHIFT 14
23 #elif defined(CONFIG_IA64_PAGE_SIZE_64KB)
24 # define PAGE_SHIFT 16
25 #else
26 # error Unsupported page size!
27 #endif
29 #define PAGE_SIZE (__IA64_UL_CONST(1) << PAGE_SHIFT)
30 #define PAGE_MASK (~(PAGE_SIZE - 1))
31 #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
33 #ifdef __ASSEMBLY__
34 # define __pa(x) ((x) - PAGE_OFFSET)
35 # define __va(x) ((x) + PAGE_OFFSET)
36 #else /* !__ASSEMBLY */
37 # ifdef __KERNEL__
38 # define STRICT_MM_TYPECHECKS
40 extern void clear_page (void *page);
41 extern void copy_page (void *to, void *from);
43 # ifdef STRICT_MM_TYPECHECKS
45 * These are used to make use of C type-checking..
47 typedef struct { unsigned long pte; } pte_t;
48 typedef struct { unsigned long pmd; } pmd_t;
49 typedef struct { unsigned long pgd; } pgd_t;
50 typedef struct { unsigned long pgprot; } pgprot_t;
52 #define pte_val(x) ((x).pte)
53 #define pmd_val(x) ((x).pmd)
54 #define pgd_val(x) ((x).pgd)
55 #define pgprot_val(x) ((x).pgprot)
57 #define __pte(x) ((pte_t) { (x) } )
58 #define __pgd(x) ((pgd_t) { (x) } )
59 #define __pgprot(x) ((pgprot_t) { (x) } )
61 # else /* !STRICT_MM_TYPECHECKS */
63 * .. while these make it easier on the compiler
65 typedef unsigned long pte_t;
66 typedef unsigned long pmd_t;
67 typedef unsigned long pgd_t;
68 typedef unsigned long pgprot_t;
70 #define pte_val(x) (x)
71 #define pmd_val(x) (x)
72 #define pgd_val(x) (x)
73 #define pgprot_val(x) (x)
75 #define __pte(x) (x)
76 #define __pgd(x) (x)
77 #define __pgprot(x) (x)
79 # endif /* !STRICT_MM_TYPECHECKS */
82 * Note: the MAP_NR() macro can't use __pa() because MAP_NR(X) MUST
83 * map to something >= max_mapnr if X is outside the identity mapped
84 * kernel space.
88 * The dense variant can be used as long as the size of memory holes isn't
89 * very big.
91 #define MAP_NR_DENSE(addr) (((unsigned long) (addr) - PAGE_OFFSET) >> PAGE_SHIFT)
94 * This variant works well for the SGI SN1 architecture (which does have huge
95 * holes in the memory address space).
97 #define MAP_NR_SN1(addr) (((unsigned long) (addr) - PAGE_OFFSET) >> PAGE_SHIFT)
99 #ifdef CONFIG_IA64_GENERIC
100 # define MAP_NR(addr) platform_map_nr(addr)
101 #elif defined (CONFIG_IA64_SN_SN1_SIM)
102 # define MAP_NR(addr) MAP_NR_SN1(addr)
103 #else
104 # define MAP_NR(addr) MAP_NR_DENSE(addr)
105 #endif
107 # endif /* __KERNEL__ */
109 typedef union ia64_va {
110 struct {
111 unsigned long off : 61; /* intra-region offset */
112 unsigned long reg : 3; /* region number */
113 } f;
114 unsigned long l;
115 void *p;
116 } ia64_va;
119 * Note: These macros depend on the fact that PAGE_OFFSET has all
120 * region bits set to 1 and all other bits set to zero. They are
121 * expressed in this way to ensure they result in a single "dep"
122 * instruction.
124 #define __pa(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg = 0; _v.l;})
125 #define __va(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.p;})
127 #define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; } while (0)
128 #define PAGE_BUG(page) do { BUG(); } while (0)
130 extern __inline__ int
131 get_order (unsigned long size)
133 double d = size - 1;
134 long order;
136 __asm__ ("getf.exp %0=%1" : "=r"(order) : "f"(d));
137 order = order - PAGE_SHIFT - 0xffff + 1;
138 if (order < 0)
139 order = 0;
140 return order;
143 #endif /* !ASSEMBLY */
145 #define PAGE_OFFSET 0xe000000000000000
147 #endif /* _ASM_IA64_PAGE_H */