/*
|
/*
|
* linux/include/asm-arm/proc-armv/system.h
|
* linux/include/asm-arm/proc-armv/system.h
|
*
|
*
|
* Copyright (C) 1996 Russell King
|
* Copyright (C) 1996 Russell King
|
*/
|
*/
|
|
|
#ifndef __ASM_PROC_SYSTEM_H
|
#ifndef __ASM_PROC_SYSTEM_H
|
#define __ASM_PROC_SYSTEM_H
|
#define __ASM_PROC_SYSTEM_H
|
|
|
extern const char xchg_str[];
|
extern const char xchg_str[];
|
|
|
extern __inline__ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
|
extern __inline__ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
|
{
|
{
|
switch (size) {
|
switch (size) {
|
case 1: __asm__ __volatile__ ("swpb %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory");
|
case 1: __asm__ __volatile__ ("swpb %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory");
|
break;
|
break;
|
case 2: abort ();
|
case 2: abort ();
|
case 4: __asm__ __volatile__ ("swp %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory");
|
case 4: __asm__ __volatile__ ("swp %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory");
|
break;
|
break;
|
default: arm_invalidptr(xchg_str, size);
|
default: arm_invalidptr(xchg_str, size);
|
}
|
}
|
return x;
|
return x;
|
}
|
}
|
|
|
/*
|
/*
|
* This processor does not need anything special before reset,
|
* This processor does not need anything special before reset,
|
* but RPC may do...
|
* but RPC may do...
|
*/
|
*/
|
extern __inline__ void proc_hard_reset(void)
|
extern __inline__ void proc_hard_reset(void)
|
{
|
{
|
}
|
}
|
|
|
/*
|
/*
|
* We can wait for an interrupt...
|
* We can wait for an interrupt...
|
*/
|
*/
|
#if 0
|
#if 0
|
#define proc_idle() \
|
#define proc_idle() \
|
do { \
|
do { \
|
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
" mcr p15, 0, %0, c15, c8, 2" \
|
" mcr p15, 0, %0, c15, c8, 2" \
|
: : "r" (0)); \
|
: : "r" (0)); \
|
} while (0)
|
} while (0)
|
#else
|
#else
|
#define proc_idle()
|
#define proc_idle()
|
#endif
|
#endif
|
/*
|
/*
|
* A couple of speedups for the ARM
|
* A couple of speedups for the ARM
|
*/
|
*/
|
|
|
/*
|
/*
|
* Save the current interrupt enable state & disable IRQs
|
* Save the current interrupt enable state & disable IRQs
|
*/
|
*/
|
#define save_flags_cli(x) \
|
#define save_flags_cli(x) \
|
do { \
|
do { \
|
unsigned long temp; \
|
unsigned long temp; \
|
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
"mrs %1, cpsr\n" \
|
"mrs %1, cpsr\n" \
|
" and %0, %1, #192\n" \
|
" and %0, %1, #192\n" \
|
" orr %1, %1, #128\n" \
|
" orr %1, %1, #128\n" \
|
" msr cpsr, %1" \
|
" msr cpsr, %1" \
|
: "=r" (x), "=r" (temp) \
|
: "=r" (x), "=r" (temp) \
|
: \
|
: \
|
: "memory"); \
|
: "memory"); \
|
} while (0)
|
} while (0)
|
|
|
/*
|
/*
|
* Enable IRQs
|
* Enable IRQs
|
*/
|
*/
|
#define sti() \
|
#define sti() \
|
do { \
|
do { \
|
unsigned long temp; \
|
unsigned long temp; \
|
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
"mrs %0, cpsr\n" \
|
"mrs %0, cpsr\n" \
|
" bic %0, %0, #128\n" \
|
" bic %0, %0, #128\n" \
|
" msr cpsr, %0" \
|
" msr cpsr, %0" \
|
: "=r" (temp) \
|
: "=r" (temp) \
|
: \
|
: \
|
: "memory"); \
|
: "memory"); \
|
} while(0)
|
} while(0)
|
|
|
/*
|
/*
|
* Disable IRQs
|
* Disable IRQs
|
*/
|
*/
|
#define cli() \
|
#define cli() \
|
do { \
|
do { \
|
unsigned long temp; \
|
unsigned long temp; \
|
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
"mrs %0, cpsr\n" \
|
"mrs %0, cpsr\n" \
|
" orr %0, %0, #128\n" \
|
" orr %0, %0, #128\n" \
|
" msr cpsr, %0" \
|
" msr cpsr, %0" \
|
: "=r" (temp) \
|
: "=r" (temp) \
|
: \
|
: \
|
: "memory"); \
|
: "memory"); \
|
} while(0)
|
} while(0)
|
|
|
/*
|
/*
|
* save current IRQ & FIQ state
|
* save current IRQ & FIQ state
|
*/
|
*/
|
#define save_flags(x) \
|
#define save_flags(x) \
|
do { \
|
do { \
|
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
"mrs %0, cpsr\n" \
|
"mrs %0, cpsr\n" \
|
" and %0, %0, #192" \
|
" and %0, %0, #192" \
|
: "=r" (x)); \
|
: "=r" (x)); \
|
} while (0)
|
} while (0)
|
|
|
/*
|
/*
|
* restore saved IRQ & FIQ state
|
* restore saved IRQ & FIQ state
|
*/
|
*/
|
#define restore_flags(x) \
|
#define restore_flags(x) \
|
do { \
|
do { \
|
unsigned long temp; \
|
unsigned long temp; \
|
__asm__ __volatile__( \
|
__asm__ __volatile__( \
|
"mrs %0, cpsr\n" \
|
"mrs %0, cpsr\n" \
|
" bic %0, %0, #192\n" \
|
" bic %0, %0, #192\n" \
|
" orr %0, %0, %1\n" \
|
" orr %0, %0, %1\n" \
|
" msr cpsr, %0" \
|
" msr cpsr, %0" \
|
: "=r" (temp) \
|
: "=r" (temp) \
|
: "r" (x) \
|
: "r" (x) \
|
: "memory"); \
|
: "memory"); \
|
} while (0)
|
} while (0)
|
|
|
#endif
|
#endif
|
|
|