version 1.1, 2008/06/03 10:38:45 |
version 1.1.1.1.2.1, 2008/08/13 17:12:29 |
|
|
/* |
/* |
* Page mapping |
* Page mapping |
*/ |
*/ |
#define phys_to_virt(p_addr) (void *)((u_long)(p_addr) + PAGE_OFFSET) |
#define phys_to_virt(pa) (void *)((char *)(pa) + PAGE_OFFSET) |
#define virt_to_phys(v_addr) (void *)((u_long)(v_addr) - PAGE_OFFSET) |
#define virt_to_phys(va) (void *)((char *)(va) - PAGE_OFFSET) |
|
|
/* |
/* |
* Kernel/User Locations |
* Kernel/User Locations |
*/ |
*/ |
#define kern_area(addr) \ |
#define kern_area(addr) \ |
(((u_long)(addr) >= KERNEL_BASE) && ((u_long)(addr) < KERNEL_MAX)) |
(((vaddr_t)(addr) >= KERNEL_BASE) && ((vaddr_t)(addr) < KERNEL_MAX)) |
#define user_area(addr) \ |
#define user_area(addr) \ |
(((u_long)(addr) >= USER_BASE) && ((u_long)(addr) < USER_MAX)) |
(((vaddr_t)(addr) >= USER_BASE) && ((vaddr_t)(addr) < USER_MAX)) |
|
|
/* |
/* |
* Interrupt |
* Interrupt |
*/ |
*/ |
#define NIRQS 14 /* number of interrupt vectors */ |
#define NIRQS 14 /* number of interrupt vectors */ |
|
|
static __inline void |
extern void interrupt_enable(void); |
interrupt_enable(void) |
extern void interrupt_disable(void); |
{ |
extern void interrupt_save(int *sts); |
#ifndef __lint__ |
extern void interrupt_restore(int sts); |
u_long val; |
|
|
|
__asm__ __volatile__( |
|
"mrs %0, cpsr\n\t" |
|
"bic %0, %0, #0xc0\n\t" /* Enable IRQ & FIQ */ |
|
"msr cpsr_c, %0\n\t" |
|
:"=&r" (val) |
|
: |
|
: "memory"); |
|
#endif |
|
} |
|
|
|
static __inline void |
|
interrupt_disable(void) |
|
{ |
|
#ifndef __lint__ |
|
u_long val; |
|
|
|
__asm__ __volatile__( |
|
"mrs %0, cpsr\n\t" |
|
"orr %0, %0, #0xc0\n\t" /* Disable IRQ & FIQ */ |
|
"msr cpsr_c, %0\n\t" |
|
:"=&r" (val) |
|
: |
|
: "memory"); |
|
#endif |
|
} |
|
|
|
static __inline void |
|
interrupt_save(int *sts) |
|
{ |
|
u_long val; |
|
|
|
__asm__ __volatile__( |
|
"mrs %0, cpsr\n\t" |
|
:"=&r" (val) |
|
: |
|
:"memory"); |
|
*sts = (int)val; |
|
} |
|
|
|
static __inline void |
|
interrupt_restore(int sts) |
|
{ |
|
|
|
__asm__ __volatile__( |
|
"msr cpsr_c, %0\n\t" |
|
: |
|
:"r" (sts) |
|
:"memory"); |
|
} |
|
|
|
extern void interrupt_mask(int); |
extern void interrupt_mask(int); |
extern void interrupt_unmask(int, int); |
extern void interrupt_unmask(int, int); |
extern void interrupt_setup(int, int); |
extern void interrupt_setup(int, int); |
extern void interrupt_init(void); |
extern void interrupt_init(void); |
|
extern void interrupt_handler(void); |
|
extern void interrupt_dispatch(int); |
|
|
|
|
/* Interrupt mode for interrupt_setup() */ |
/* Interrupt mode for interrupt_setup() */ |
#define IMODE_EDGE 0 /* edge trigger */ |
#define IMODE_EDGE 0 /* edge trigger */ |
#define IMODE_LEVEL 1 /* level trigger */ |
#define IMODE_LEVEL 1 /* level trigger */ |
|
|
extern void clock_init(void); |
extern void clock_init(void); |
|
|
extern void diag_init(void); |
extern void diag_init(void); |
|
|
#ifdef CONFIG_DIAG_VBA |
|
static __inline void |
|
diag_print(char *buf) |
|
{ |
|
|
|
__asm__ __volatile__( |
|
"mov r0, %0\n\t" |
|
"swi 0xff0000\n\t" /* VBA emulator call */ |
|
: |
|
:"r" (buf) |
|
:"r0"); |
|
} |
|
|
|
#else |
|
extern void diag_print(char *); |
extern void diag_print(char *); |
#endif |
|
|
|
static __inline void |
extern void machine_reset(void); |
machine_idle(void) |
|
{ |
|
|
|
__asm__ __volatile__( |
|
"swi 0x20000\n\t" /* GBA BIOS call */ |
|
:::"r0", "r1", "r2", "r3"); |
|
} |
|
|
|
static __inline void |
|
machine_reset(void) |
|
{ |
|
|
|
__asm__ __volatile__( |
|
"swi 0\n\t" /* GBA BIOS call */ |
|
:::"r0", "r1", "r2", "r3"); |
|
} |
|
|
|
extern void machine_init(void); |
extern void machine_init(void); |
|
extern void machine_idle(void); |
|
|
#endif /* !__ASSEMBLY__ */ |
#endif /* !__ASSEMBLY__ */ |
#endif /* !_GBA_PLATFORM_H */ |
#endif /* !_GBA_PLATFORM_H */ |