2005-04-16 15:20:36 -07:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 1994 - 1999 , 2000 , 03 Ralf Baechle
* Copyright ( C ) 1999 , 2000 Silicon Graphics , Inc .
*/
# ifndef _ASM_PAGE_H
# define _ASM_PAGE_H
# include <spaces.h>
2009-07-31 16:58:17 -04:00
# include <linux/const.h>
2013-11-14 16:12:31 +00:00
# include <linux/kernel.h>
# include <asm/mipsregs.h>
2005-04-16 15:20:36 -07:00
/*
* PAGE_SHIFT determines the page size
*/
# ifdef CONFIG_PAGE_SIZE_4KB
# define PAGE_SHIFT 12
# endif
# ifdef CONFIG_PAGE_SIZE_8KB
# define PAGE_SHIFT 13
# endif
# ifdef CONFIG_PAGE_SIZE_16KB
# define PAGE_SHIFT 14
# endif
2009-04-02 14:07:10 +02:00
# ifdef CONFIG_PAGE_SIZE_32KB
# define PAGE_SHIFT 15
# endif
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_PAGE_SIZE_64KB
# define PAGE_SHIFT 16
# endif
2009-07-31 16:58:17 -04:00
# define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
2013-04-22 17:57:54 +02:00
# define PAGE_MASK (~((1 << PAGE_SHIFT) - 1))
2005-04-16 15:20:36 -07:00
2013-11-14 16:12:31 +00:00
/*
* This is used for calculating the real page sizes
2014-08-25 10:50:12 +02:00
* for FTLB or VTLB + FTLB configurations .
2013-11-14 16:12:31 +00:00
*/
static inline unsigned int page_size_ftlb ( unsigned int mmuextdef )
{
switch ( mmuextdef ) {
case MIPS_CONF4_MMUEXTDEF_FTLBSIZEEXT :
if ( PAGE_SIZE = = ( 1 < < 30 ) )
return 5 ;
if ( PAGE_SIZE = = ( 1llu < < 32 ) )
return 6 ;
if ( PAGE_SIZE > ( 256 < < 10 ) )
return 7 ; /* reserved */
/* fall through */
case MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT :
return ( PAGE_SHIFT - 10 ) / 2 ;
default :
panic ( " Invalid FTLB configuration with Conf4_mmuextdef=%d value \n " ,
mmuextdef > > 14 ) ;
}
}
2012-10-17 00:48:10 +02:00
# ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
2009-05-27 17:47:43 -07:00
# define HPAGE_SHIFT (PAGE_SHIFT + PAGE_SHIFT - 3)
2009-07-31 16:58:17 -04:00
# define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT)
2009-05-27 17:47:43 -07:00
# define HPAGE_MASK (~(HPAGE_SIZE - 1))
# define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
2012-10-17 00:48:10 +02:00
# else /* !CONFIG_MIPS_HUGE_TLB_SUPPORT */
2012-01-11 15:37:13 +01:00
# define HPAGE_SHIFT ({BUILD_BUG(); 0; })
# define HPAGE_SIZE ({BUILD_BUG(); 0; })
# define HPAGE_MASK ({BUILD_BUG(); 0; })
# define HUGETLB_PAGE_ORDER ({BUILD_BUG(); 0; })
2012-10-17 00:48:10 +02:00
# endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */
2009-05-27 17:47:43 -07:00
2007-06-04 17:46:34 +02:00
# include <linux/pfn.h>
2007-01-10 09:44:05 +01:00
2008-07-15 19:57:32 +03:00
extern void build_clear_page ( void ) ;
extern void build_copy_page ( void ) ;
2007-01-10 09:44:05 +01:00
/*
* It ' s normally defined only for FLATMEM config but it ' s
* used in our early mem init code for all memory models .
* So always define it .
*/
# define ARCH_PFN_OFFSET PFN_UP(PHYS_OFFSET)
2005-04-16 15:20:36 -07:00
extern void clear_page ( void * page ) ;
extern void copy_page ( void * to , void * from ) ;
extern unsigned long shm_align_mask ;
static inline unsigned long pages_do_alias ( unsigned long addr1 ,
unsigned long addr2 )
{
return ( addr1 ^ addr2 ) & shm_align_mask ;
}
struct page ;
static inline void clear_user_page ( void * addr , unsigned long vaddr ,
struct page * page )
{
extern void ( * flush_data_cache_page ) ( unsigned long addr ) ;
clear_page ( addr ) ;
2006-08-12 16:40:08 +01:00
if ( pages_do_alias ( ( unsigned long ) addr , vaddr & PAGE_MASK ) )
2005-04-16 15:20:36 -07:00
flush_data_cache_page ( ( unsigned long ) addr ) ;
}
2006-12-12 17:14:56 +00:00
struct vm_area_struct ;
extern void copy_user_highpage ( struct page * to , struct page * from ,
unsigned long vaddr , struct vm_area_struct * vma ) ;
2005-04-16 15:20:36 -07:00
2006-12-12 17:14:56 +00:00
# define __HAVE_ARCH_COPY_USER_HIGHPAGE
2005-04-16 15:20:36 -07:00
/*
* These are used to make use of C type - checking . .
*/
2014-11-22 00:16:48 +01:00
# ifdef CONFIG_PHYS_ADDR_T_64BIT
2005-10-07 16:58:15 +01:00
# ifdef CONFIG_CPU_MIPS32
2005-04-16 15:20:36 -07:00
typedef struct { unsigned long pte_low , pte_high ; } pte_t ;
2013-01-22 12:59:30 +01:00
# define pte_val(x) ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
# define __pte(x) ({ pte_t __pte = {(x), ((unsigned long long)(x)) >> 32}; __pte; })
2005-04-16 15:20:36 -07:00
# else
typedef struct { unsigned long long pte ; } pte_t ;
2013-01-22 12:59:30 +01:00
# define pte_val(x) ((x).pte)
2006-08-31 19:39:09 +01:00
# define __pte(x) ((pte_t) { (x) } )
2005-04-16 15:20:36 -07:00
# endif
# else
typedef struct { unsigned long pte ; } pte_t ;
# define pte_val(x) ((x).pte)
2005-02-10 12:19:59 +00:00
# define __pte(x) ((pte_t) { (x) } )
2006-08-31 19:39:09 +01:00
# endif
2008-02-08 04:22:04 -08:00
typedef struct page * pgtable_t ;
2005-04-16 15:20:36 -07:00
2005-02-10 12:19:59 +00:00
/*
* Right now we don ' t support 4 - level pagetables , so all pud - related
* definitions come from < asm - generic / pgtable - nopud . h > .
*/
/*
* Finall the top of the hierarchy , the pgd
*/
typedef struct { unsigned long pgd ; } pgd_t ;
# define pgd_val(x) ((x).pgd)
2005-04-16 15:20:36 -07:00
# define __pgd(x) ((pgd_t) { (x) } )
2005-02-10 12:19:59 +00:00
/*
* Manipulate page protection bits
*/
typedef struct { unsigned long pgprot ; } pgprot_t ;
# define pgprot_val(x) ((x).pgprot)
2005-04-16 15:20:36 -07:00
# define __pgprot(x) ((pgprot_t) { (x) } )
2005-02-10 12:19:59 +00:00
/*
* On R4000 - style MMUs where a TLB entry is mapping a adjacent even / odd
* pair of pages we only have a single global bit per pair of pages . When
* writing to the TLB make sure we always have the bit set for both pages
* or none . This macro is used to access the ` buddy ' of the pte we ' re just
* working on .
*/
# define ptep_buddy(x) ((pte_t *)((unsigned long)(x) ^ sizeof(pte_t)))
2007-01-10 09:44:05 +01:00
/*
* __pa ( ) / __va ( ) should be used only during mem init .
*/
2007-10-11 23:46:12 +01:00
# ifdef CONFIG_64BIT
2007-06-04 17:46:35 +02:00
# define __pa(x) \
( { \
unsigned long __x = ( unsigned long ) ( x ) ; \
__x < CKSEG0 ? XPHYSADDR ( __x ) : CPHYSADDR ( __x ) ; \
} )
2006-10-19 13:20:00 +02:00
# else
2007-06-04 17:46:35 +02:00
# define __pa(x) \
( ( unsigned long ) ( x ) - PAGE_OFFSET + PHYS_OFFSET )
2006-10-19 13:20:00 +02:00
# endif
2007-01-10 09:44:05 +01:00
# define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
2013-05-07 17:11:16 +00:00
# include <asm/io.h>
2010-08-17 16:01:59 +01:00
/*
* RELOC_HIDE was originally added by 6007 b903dfe5f1d13e0c711ac2894bdd4a61b1ad
* ( lmo ) rsp . 8431f d094d625b94d364fe393076ccef88e6ce18 ( kernel . org ) . The
* discussion can be found in lkml posting
* < a2ebde260608230500o3407b108hc03debb9da6e62c @ mail . gmail . com > which is
* archived at http : //lists.linuxcoding.com/kernel/2006-q3/msg17360.html
*
* It is unclear if the misscompilations mentioned in
* http : //lkml.org/lkml/2010/8/8/138 also affect MIPS so we keep this one
* until GCC 3. x has been retired before we can apply
* https : //patchwork.linux-mips.org/patch/1541/
*/
2014-01-09 13:06:34 +00:00
# ifndef __pa_symbol
2007-10-11 23:46:15 +01:00
# define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0))
2014-01-09 13:06:34 +00:00
# endif
2005-04-16 15:20:36 -07:00
# define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
2006-06-12 09:13:56 +01:00
# ifdef CONFIG_FLATMEM
2013-05-18 17:02:59 +02:00
static inline int pfn_valid ( unsigned long pfn )
{
/* avoid <linux/mm.h> include hell */
extern unsigned long max_mapnr ;
return pfn > = ARCH_PFN_OFFSET & & pfn < max_mapnr ;
}
2006-06-12 09:13:56 +01:00
2006-07-05 01:22:44 +09:00
# elif defined(CONFIG_SPARSEMEM)
/* pfn_valid is defined in linux/mmzone.h */
2006-06-12 09:13:56 +01:00
# elif defined(CONFIG_NEED_MULTIPLE_NODES)
# define pfn_valid(pfn) \
( { \
unsigned long __pfn = ( pfn ) ; \
int __n = pfn_to_nid ( __pfn ) ; \
( ( __n > = 0 ) ? ( __pfn < NODE_DATA ( __n ) - > node_start_pfn + \
2013-01-22 12:59:30 +01:00
NODE_DATA ( __n ) - > node_spanned_pages ) \
: 0 ) ; \
2006-06-12 09:13:56 +01:00
} )
# endif
2014-07-14 16:39:19 +01:00
# define virt_to_page(kaddr) pfn_to_page(PFN_DOWN(virt_to_phys((void *) \
( kaddr ) ) ) )
2012-12-28 15:34:40 +01:00
extern int __virt_addr_valid ( const volatile void * kaddr ) ;
# define virt_addr_valid(kaddr) \
__virt_addr_valid ( ( const volatile void * ) ( kaddr ) )
2005-04-16 15:20:36 -07:00
# define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC )
2013-06-20 14:36:30 +00:00
# define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE)
# define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET)
2005-04-16 15:20:36 -07:00
2006-03-27 01:15:43 -08:00
# include <asm-generic/memory_model.h>
2009-05-13 22:56:30 +00:00
# include <asm-generic/getorder.h>
2005-09-03 15:54:30 -07:00
2005-04-16 15:20:36 -07:00
# endif /* _ASM_PAGE_H */