2005-04-16 15:20:36 -07:00
/*
2008-08-02 10:55:55 +01:00
* arch / arm / include / asm / proc - fns . h
2005-04-16 15:20:36 -07:00
*
* Copyright ( C ) 1997 - 1999 Russell King
* Copyright ( C ) 2000 Deep Blue Solutions Ltd
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef __ASM_PROCFNS_H
# define __ASM_PROCFNS_H
# ifdef __KERNEL__
2011-02-06 15:32:24 +00:00
# include <asm/glue-proc.h>
# include <asm/page.h>
2005-04-16 15:20:36 -07:00
2011-02-06 15:32:24 +00:00
# ifndef __ASSEMBLY__
struct mm_struct ;
2005-04-16 15:20:36 -07:00
/*
2011-02-06 15:32:24 +00:00
* Don ' t change this structure - ASM code relies on it .
2005-04-16 15:20:36 -07:00
*/
2011-02-06 15:32:24 +00:00
extern struct processor {
/* MISC
* get data abort address / flags
*/
void ( * _data_abort ) ( unsigned long pc ) ;
/*
* Retrieve prefetch fault address
*/
unsigned long ( * _prefetch_abort ) ( unsigned long lr ) ;
/*
* Set up any processor specifics
*/
void ( * _proc_init ) ( void ) ;
/*
* Disable any processor specifics
*/
void ( * _proc_fin ) ( void ) ;
/*
* Special stuff for a reset
*/
void ( * reset ) ( unsigned long addr ) __attribute__ ( ( noreturn ) ) ;
/*
* Idle the processor
*/
int ( * _do_idle ) ( void ) ;
/*
* Processor architecture specific
*/
/*
* clean a virtual address range from the
* D - cache without flushing the cache .
*/
void ( * dcache_clean_area ) ( void * addr , int size ) ;
/*
* Set the page table
*/
void ( * switch_mm ) ( unsigned long pgd_phys , struct mm_struct * mm ) ;
/*
* Set a possibly extended PTE . Non - extended PTEs should
* ignore ' ext ' .
*/
void ( * set_pte_ext ) ( pte_t * ptep , pte_t pte , unsigned int ext ) ;
2011-02-06 15:48:39 +00:00
/* Suspend/resume */
unsigned int suspend_size ;
void ( * do_suspend ) ( void * ) ;
void ( * do_resume ) ( void * ) ;
2011-02-06 15:32:24 +00:00
} processor ;
2005-04-16 15:20:36 -07:00
# ifndef MULTI_CPU
2011-02-06 15:32:24 +00:00
extern void cpu_proc_init ( void ) ;
extern void cpu_proc_fin ( void ) ;
extern int cpu_do_idle ( void ) ;
extern void cpu_dcache_clean_area ( void * , int ) ;
extern void cpu_do_switch_mm ( unsigned long pgd_phys , struct mm_struct * mm ) ;
extern void cpu_set_pte_ext ( pte_t * ptep , pte_t pte , unsigned int ext ) ;
extern void cpu_reset ( unsigned long addr ) __attribute__ ( ( noreturn ) ) ;
2005-04-16 15:20:36 -07:00
# else
2011-02-06 15:32:24 +00:00
# define cpu_proc_init() processor._proc_init()
# define cpu_proc_fin() processor._proc_fin()
# define cpu_reset(addr) processor.reset(addr)
# define cpu_do_idle() processor._do_idle()
# define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz)
# define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext)
# define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm)
2005-04-16 15:20:36 -07:00
# endif
2011-02-06 15:48:39 +00:00
extern void cpu_resume ( void ) ;
2005-04-16 15:20:36 -07:00
# include <asm/memory.h>
2006-06-20 20:46:52 +01:00
# ifdef CONFIG_MMU
2005-04-16 15:20:36 -07:00
# define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm)
# define cpu_get_pgd() \
( { \
unsigned long pg ; \
__asm__ ( " mrc p15, 0, %0, c2, c0, 0 " \
: " =r " ( pg ) : : " cc " ) ; \
pg & = ~ 0x3fff ; \
( pgd_t * ) phys_to_virt ( pg ) ; \
} )
2006-06-20 20:46:52 +01:00
# endif
2005-04-16 15:20:36 -07:00
# endif /* __ASSEMBLY__ */
# endif /* __KERNEL__ */
# endif /* __ASM_PROCFNS_H */