special usb hub handling, IDE disks, and retries all over the place
[linux-2.4.git] / include / asm-mips / page.h
1 /*
2  * Definitions for page handling
3  *
4  * This file is subject to the terms and conditions of the GNU General Public
5  * License.  See the file "COPYING" in the main directory of this archive
6  * for more details.
7  *
8  * Copyright (C) 1994 - 1999, 2003 by Ralf Baechle
9  */
10 #ifndef __ASM_PAGE_H
11 #define __ASM_PAGE_H
12
13 #include <linux/config.h>
14 #include <asm/break.h>
15
16 #ifdef __KERNEL__
17
18 /*
19  * PAGE_SHIFT determines the page size
20  */
21 #ifdef CONFIG_PAGE_SIZE_4KB
22 #define PAGE_SHIFT      12
23 #endif
24 #ifdef CONFIG_PAGE_SIZE_16KB
25 #define PAGE_SHIFT      14
26 #endif
27 #ifdef CONFIG_PAGE_SIZE_64KB
28 #define PAGE_SHIFT      16
29 #endif
30 #define PAGE_SIZE       (1L << PAGE_SHIFT)
31 #define PAGE_MASK       (~(PAGE_SIZE-1))
32
33 #ifndef __ASSEMBLY__
34
35 #include <asm/cacheflush.h>
36
37 #define BUG()                                                           \
38 do {                                                                    \
39         __asm__ __volatile__("break %0" : : "i" (BRK_BUG));             \
40 } while (0)
41
42 #define PAGE_BUG(page) do {  BUG(); } while (0)
43
44 extern void clear_page(void * page);
45 extern void copy_page(void * to, void * from);
46
47 extern unsigned long shm_align_mask;
48
49 static inline unsigned long pages_do_alias(unsigned long addr1,
50         unsigned long addr2)
51 {
52         return (addr1 ^ addr2) & shm_align_mask;
53 }
54
55 static inline void clear_user_page(void *page, unsigned long vaddr)
56 {
57         unsigned long kaddr = (unsigned long) page;
58
59         clear_page(page);
60         if (pages_do_alias(kaddr, vaddr))
61                 flush_data_cache_page(kaddr);
62 }
63
64 static inline void copy_user_page(void * to, void * from, unsigned long vaddr)
65 {
66         unsigned long kto = (unsigned long) to;
67
68         copy_page(to, from);
69         if (pages_do_alias(kto, vaddr))
70                 flush_data_cache_page(kto);
71 }
72
73 /*
74  * These are used to make use of C type-checking..
75  */
76 #ifdef CONFIG_64BIT_PHYS_ADDR
77   #ifdef CONFIG_CPU_MIPS32
78     typedef struct { unsigned long pte_low, pte_high; } pte_t;
79     #define pte_val(x)    ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
80     #define __pte(x)    ({ pte_t __pte = {(x), ((unsigned long long)(x)) >> 32}; __pte; })
81   #else
82     typedef struct { unsigned long long pte_low; } pte_t;
83     #define pte_val(x)    ((x).pte_low)
84     #define __pte(x)    ((pte_t) { (x) } )
85   #endif
86 #else
87 typedef struct { unsigned long pte_low; } pte_t;
88 #define pte_val(x)    ((x).pte_low)
89 #define __pte(x)        ((pte_t) { (x) } )
90 #endif
91
92 typedef struct { unsigned long pmd; } pmd_t;
93 typedef struct { unsigned long pgd; } pgd_t;
94 typedef struct { unsigned long pgprot; } pgprot_t;
95
96 #define pmd_val(x)      ((x).pmd)
97 #define pgd_val(x)      ((x).pgd)
98 #define pgprot_val(x)   ((x).pgprot)
99
100 #define ptep_buddy(x)   ((pte_t *)((unsigned long)(x) ^ sizeof(pte_t)))
101
102 #define __pmd(x)        ((pmd_t) { (x) } )
103 #define __pgd(x)        ((pgd_t) { (x) } )
104 #define __pgprot(x)     ((pgprot_t) { (x) } )
105
106 /* Pure 2^n version of get_order */
107 static __inline__ int get_order(unsigned long size)
108 {
109         int order;
110
111         size = (size-1) >> (PAGE_SHIFT-1);
112         order = -1;
113         do {
114                 size >>= 1;
115                 order++;
116         } while (size);
117         return order;
118 }
119
120 #endif /* !__ASSEMBLY__ */
121
122 /* to align the pointer to the (next) page boundary */
123 #define PAGE_ALIGN(addr)        (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
124
125 /*
126  * This handles the memory map.
127  * We handle pages at KSEG0 for kernels with 32 bit address space.
128  */
129 #define PAGE_OFFSET     0x80000000UL
130 #define UNCAC_BASE      0xa0000000UL
131
132 #define __pa(x)         ((unsigned long) (x) - PAGE_OFFSET)
133 #define __va(x)         ((void *)((unsigned long) (x) + PAGE_OFFSET))
134 #define virt_to_page(kaddr)     (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
135 #define VALID_PAGE(page)        ((page - mem_map) < max_mapnr)
136
137 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
138                                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
139
140 #define UNCAC_ADDR(addr)        ((addr) - PAGE_OFFSET + UNCAC_BASE)
141 #define CAC_ADDR(addr)          ((addr) - UNCAC_BASE + PAGE_OFFSET)
142
143 /*
144  * Memory above this physical address will be considered highmem.
145  */
146 #define HIGHMEM_START   0x20000000UL
147
148 #endif /* defined (__KERNEL__) */
149
150 #endif /* __ASM_PAGE_H */