| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _M68K_PAGE_H | 
|  | 2 | #define _M68K_PAGE_H | 
|  | 3 |  | 
|  | 4 | #include <linux/config.h> | 
|  | 5 |  | 
|  | 6 | /* PAGE_SHIFT determines the page size */ | 
|  | 7 | #ifndef CONFIG_SUN3 | 
|  | 8 | #define PAGE_SHIFT	(12) | 
|  | 9 | #else | 
|  | 10 | #define PAGE_SHIFT	(13) | 
|  | 11 | #endif | 
|  | 12 | #ifdef __ASSEMBLY__ | 
|  | 13 | #define PAGE_SIZE	(1 << PAGE_SHIFT) | 
|  | 14 | #else | 
|  | 15 | #define PAGE_SIZE	(1UL << PAGE_SHIFT) | 
|  | 16 | #endif | 
|  | 17 | #define PAGE_MASK	(~(PAGE_SIZE-1)) | 
|  | 18 |  | 
|  | 19 | #ifdef __KERNEL__ | 
|  | 20 |  | 
|  | 21 | #include <asm/setup.h> | 
|  | 22 |  | 
|  | 23 | #if PAGE_SHIFT < 13 | 
|  | 24 | #define THREAD_SIZE (8192) | 
|  | 25 | #else | 
|  | 26 | #define THREAD_SIZE PAGE_SIZE | 
|  | 27 | #endif | 
|  | 28 |  | 
|  | 29 | #ifndef __ASSEMBLY__ | 
|  | 30 |  | 
|  | 31 | #define get_user_page(vaddr)		__get_free_page(GFP_KERNEL) | 
|  | 32 | #define free_user_page(page, addr)	free_page(addr) | 
|  | 33 |  | 
|  | 34 | /* | 
|  | 35 | * We don't need to check for alignment etc. | 
|  | 36 | */ | 
|  | 37 | #ifdef CPU_M68040_OR_M68060_ONLY | 
|  | 38 | static inline void copy_page(void *to, void *from) | 
|  | 39 | { | 
|  | 40 | unsigned long tmp; | 
|  | 41 |  | 
|  | 42 | __asm__ __volatile__("1:\t" | 
|  | 43 | ".chip 68040\n\t" | 
|  | 44 | "move16 %1@+,%0@+\n\t" | 
|  | 45 | "move16 %1@+,%0@+\n\t" | 
|  | 46 | ".chip 68k\n\t" | 
|  | 47 | "dbra  %2,1b\n\t" | 
|  | 48 | : "=a" (to), "=a" (from), "=d" (tmp) | 
|  | 49 | : "0" (to), "1" (from) , "2" (PAGE_SIZE / 32 - 1) | 
|  | 50 | ); | 
|  | 51 | } | 
|  | 52 |  | 
|  | 53 | static inline void clear_page(void *page) | 
|  | 54 | { | 
|  | 55 | unsigned long tmp; | 
|  | 56 | unsigned long *sp = page; | 
|  | 57 |  | 
|  | 58 | *sp++ = 0; | 
|  | 59 | *sp++ = 0; | 
|  | 60 | *sp++ = 0; | 
|  | 61 | *sp++ = 0; | 
|  | 62 |  | 
|  | 63 | __asm__ __volatile__("1:\t" | 
|  | 64 | ".chip 68040\n\t" | 
|  | 65 | "move16 %2@+,%0@+\n\t" | 
|  | 66 | ".chip 68k\n\t" | 
|  | 67 | "subqw  #8,%2\n\t" | 
|  | 68 | "subqw  #8,%2\n\t" | 
|  | 69 | "dbra   %1,1b\n\t" | 
|  | 70 | : "=a" (sp), "=d" (tmp) | 
|  | 71 | : "a" (page), "0" (sp), | 
|  | 72 | "1" ((PAGE_SIZE - 16) / 16 - 1)); | 
|  | 73 | } | 
|  | 74 |  | 
|  | 75 | #else | 
|  | 76 | #define clear_page(page)	memset((page), 0, PAGE_SIZE) | 
|  | 77 | #define copy_page(to,from)	memcpy((to), (from), PAGE_SIZE) | 
|  | 78 | #endif | 
|  | 79 |  | 
|  | 80 | #define clear_user_page(addr, vaddr, page)	\ | 
|  | 81 | do {	clear_page(addr);		\ | 
|  | 82 | flush_dcache_page(page);	\ | 
|  | 83 | } while (0) | 
|  | 84 | #define copy_user_page(to, from, vaddr, page)	\ | 
|  | 85 | do {	copy_page(to, from);		\ | 
|  | 86 | flush_dcache_page(page);	\ | 
|  | 87 | } while (0) | 
|  | 88 |  | 
|  | 89 | /* | 
|  | 90 | * These are used to make use of C type-checking.. | 
|  | 91 | */ | 
|  | 92 | typedef struct { unsigned long pte; } pte_t; | 
|  | 93 | typedef struct { unsigned long pmd[16]; } pmd_t; | 
|  | 94 | typedef struct { unsigned long pgd; } pgd_t; | 
|  | 95 | typedef struct { unsigned long pgprot; } pgprot_t; | 
|  | 96 |  | 
|  | 97 | #define pte_val(x)	((x).pte) | 
|  | 98 | #define pmd_val(x)	((&x)->pmd[0]) | 
|  | 99 | #define pgd_val(x)	((x).pgd) | 
|  | 100 | #define pgprot_val(x)	((x).pgprot) | 
|  | 101 |  | 
|  | 102 | #define __pte(x)	((pte_t) { (x) } ) | 
|  | 103 | #define __pmd(x)	((pmd_t) { (x) } ) | 
|  | 104 | #define __pgd(x)	((pgd_t) { (x) } ) | 
|  | 105 | #define __pgprot(x)	((pgprot_t) { (x) } ) | 
|  | 106 |  | 
|  | 107 | /* to align the pointer to the (next) page boundary */ | 
|  | 108 | #define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK) | 
|  | 109 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 110 | #endif /* !__ASSEMBLY__ */ | 
|  | 111 |  | 
|  | 112 | #include <asm/page_offset.h> | 
|  | 113 |  | 
|  | 114 | #define PAGE_OFFSET		(PAGE_OFFSET_RAW) | 
|  | 115 |  | 
|  | 116 | #ifndef __ASSEMBLY__ | 
|  | 117 |  | 
|  | 118 | #ifndef CONFIG_SUN3 | 
|  | 119 |  | 
|  | 120 | #define WANT_PAGE_VIRTUAL | 
|  | 121 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | 
|  | 122 | extern unsigned long m68k_memoffset; | 
|  | 123 |  | 
|  | 124 | #define __pa(vaddr)		((unsigned long)(vaddr)+m68k_memoffset) | 
|  | 125 | #define __va(paddr)		((void *)((unsigned long)(paddr)-m68k_memoffset)) | 
|  | 126 | #else | 
| Andreas Schwab | 40bb0c3 | 2005-08-24 17:36:21 +0200 | [diff] [blame] | 127 | #define __pa(vaddr)		virt_to_phys((void *)(vaddr)) | 
|  | 128 | #define __va(paddr)		phys_to_virt((unsigned long)(paddr)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 129 | #endif | 
|  | 130 |  | 
|  | 131 | #else	/* !CONFIG_SUN3 */ | 
|  | 132 | /* This #define is a horrible hack to suppress lots of warnings. --m */ | 
| Andreas Schwab | 40bb0c3 | 2005-08-24 17:36:21 +0200 | [diff] [blame] | 133 | #define __pa(x) ___pa((unsigned long)(x)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 134 | static inline unsigned long ___pa(unsigned long x) | 
|  | 135 | { | 
|  | 136 | if(x == 0) | 
|  | 137 | return 0; | 
|  | 138 | if(x >= PAGE_OFFSET) | 
|  | 139 | return (x-PAGE_OFFSET); | 
|  | 140 | else | 
|  | 141 | return (x+0x2000000); | 
|  | 142 | } | 
|  | 143 |  | 
|  | 144 | static inline void *__va(unsigned long x) | 
|  | 145 | { | 
|  | 146 | if(x == 0) | 
|  | 147 | return (void *)0; | 
|  | 148 |  | 
|  | 149 | if(x < 0x2000000) | 
|  | 150 | return (void *)(x+PAGE_OFFSET); | 
|  | 151 | else | 
|  | 152 | return (void *)(x-0x2000000); | 
|  | 153 | } | 
|  | 154 | #endif	/* CONFIG_SUN3 */ | 
|  | 155 |  | 
|  | 156 | /* | 
|  | 157 | * NOTE: virtual isn't really correct, actually it should be the offset into the | 
|  | 158 | * memory node, but we have no highmem, so that works for now. | 
|  | 159 | * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots | 
|  | 160 | * of the shifts unnecessary. | 
|  | 161 | */ | 
|  | 162 | #define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT) | 
|  | 163 | #define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT) | 
|  | 164 |  | 
|  | 165 | #define virt_to_page(kaddr)	(mem_map + (((unsigned long)(kaddr)-PAGE_OFFSET) >> PAGE_SHIFT)) | 
|  | 166 | #define page_to_virt(page)	((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) | 
|  | 167 |  | 
|  | 168 | #define pfn_to_page(pfn)	virt_to_page(pfn_to_virt(pfn)) | 
|  | 169 | #define page_to_pfn(page)	virt_to_pfn(page_to_virt(page)) | 
|  | 170 |  | 
|  | 171 | #define virt_addr_valid(kaddr)	((void *)(kaddr) >= (void *)PAGE_OFFSET && (void *)(kaddr) < high_memory) | 
|  | 172 | #define pfn_valid(pfn)		virt_addr_valid(pfn_to_virt(pfn)) | 
|  | 173 |  | 
|  | 174 | #endif /* __ASSEMBLY__ */ | 
|  | 175 |  | 
|  | 176 | #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \ | 
|  | 177 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | 
|  | 178 |  | 
|  | 179 | #endif /* __KERNEL__ */ | 
|  | 180 |  | 
| Stephen Rothwell | fd4fd5a | 2005-09-03 15:54:30 -0700 | [diff] [blame] | 181 | #include <asm-generic/page.h> | 
|  | 182 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 183 | #endif /* _M68K_PAGE_H */ |