1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle 7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 8 */ 9#ifndef _ASM_PAGE_H 10#define _ASM_PAGE_H 11 12#include <linux/config.h> 13 14/* PAGE_SHIFT determines the page size */ 15#define PAGE_SHIFT 12 16#define PAGE_SIZE (1UL << PAGE_SHIFT) 17#define PAGE_MASK (~(PAGE_SIZE-1)) 18 19#ifdef __KERNEL__ 20 21#ifndef __ASSEMBLY__ 22 23#define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; } while (0) 24#define PAGE_BUG(page) do { BUG(); } while (0) 25 26/* 27 * Prototypes for clear_page / copy_page variants with processor dependant 28 * optimizations. 29 */ 30void sb1_clear_page(void * page); 31void sb1_copy_page(void * to, void * from); 32 33extern void (*_clear_page)(void * page); 34extern void (*_copy_page)(void * to, void * from); 35 36extern void mips64_clear_page_dc(unsigned long page); 37extern void mips64_clear_page_sc(unsigned long page); 38void r4k_clear_page_d16(void * page); 39void r4k_clear_page_d32(void * page); 40void r4k_clear_page_r4600_v1(void * page); 41void r4k_clear_page_r4600_v2(void * page); 42void r4k_clear_page_s16(void * page); 43void r4k_clear_page_s32(void * page); 44void r4k_clear_page_s64(void * page); 45void r4k_clear_page_s128(void * page); 46 47extern void mips64_copy_page_dc(unsigned long to, unsigned long from); 48extern void mips64_copy_page_sc(unsigned long to, unsigned long from); 49void r4k_copy_page_d16(void * to, void * from); 50void r4k_copy_page_d32(void * to, void * from); 51void r4k_copy_page_r4600_v1(void * to, void * from); 52void r4k_copy_page_r4600_v2(void * to, void * from); 53void r4k_copy_page_s16(void * to, void * from); 54void r4k_copy_page_s32(void * to, void * from); 55void r4k_copy_page_s64(void * to, void * from); 56void r4k_copy_page_s128(void * to, void * from); 57 58#define clear_page(page) _clear_page(page) 59#define copy_page(to, from) _copy_page(to, from) 60#define clear_user_page(page, vaddr) clear_page(page) 61#define copy_user_page(to, from, vaddr) copy_page(to, from) 62 63/* 64 * These are used to make use of C type-checking.. 65 */ 66typedef struct { unsigned long pte; } pte_t; 67typedef struct { unsigned long pmd; } pmd_t; 68typedef struct { unsigned long pgd; } pgd_t; 69typedef struct { unsigned long pgprot; } pgprot_t; 70 71#define pte_val(x) ((x).pte) 72#define pmd_val(x) ((x).pmd) 73#define pgd_val(x) ((x).pgd) 74#define pgprot_val(x) ((x).pgprot) 75 76#define ptep_buddy(x) ((pte_t *)((unsigned long)(x) ^ sizeof(pte_t))) 77 78#define __pte(x) ((pte_t) { (x) } ) 79#define __pmd(x) ((pmd_t) { (x) } ) 80#define __pgd(x) ((pgd_t) { (x) } ) 81#define __pgprot(x) ((pgprot_t) { (x) } ) 82 83/* Pure 2^n version of get_order */ 84extern __inline__ int get_order(unsigned long size) 85{ 86 int order; 87 88 size = (size-1) >> (PAGE_SHIFT-1); 89 order = -1; 90 do { 91 size >>= 1; 92 order++; 93 } while (size); 94 return order; 95} 96 97#endif /* !__ASSEMBLY__ */ 98 99/* to align the pointer to the (next) page boundary */ 100#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) 101 102/* 103 * This handles the memory map. 104 * We handle pages at KSEG0 for kernels with upto 512mb of memory, 105 * at XKPHYS with a suitable caching mode for kernels with more than that. 106 */ 107#if defined(CONFIG_SGI_IP22) || defined(CONFIG_MIPS_ATLAS) || \ 108 defined(CONFIG_MIPS_MALTA) || defined(CONFIG_MIPS_SEAD) || \ 109 defined(CONFIG_DECSTATION) 110#define PAGE_OFFSET 0xffffffff80000000UL 111#define UNCAC_BASE 0xffffffffa0000000UL 112#endif 113#if defined(CONFIG_SGI_IP32) 114#define PAGE_OFFSET 0x9800000000000000UL 115#define UNCAC_BASE 0x9000000000000000UL 116#endif 117#if defined(CONFIG_SGI_IP27) 118#define PAGE_OFFSET 0xa800000000000000UL 119#define UNCAC_BASE 0x9600000000000000UL 120#endif 121#if defined(CONFIG_SIBYTE_SB1250) 122#define PAGE_OFFSET 0xa800000000000000UL 123#endif 124 125#define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) 126#define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) 127#ifndef CONFIG_DISCONTIGMEM 128#define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT)) 129#define VALID_PAGE(page) ((page - mem_map) < max_mapnr) 130#endif 131 132#define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE) 133#define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET) 134 135#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ 136 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 137 138#endif /* defined (__KERNEL__) */ 139 140#endif /* _ASM_PAGE_H */ 141