2010-02-18 16:13:51 +07:00
|
|
|
#ifndef __ASM_SH_UNCACHED_H
|
|
|
|
#define __ASM_SH_UNCACHED_H
|
|
|
|
|
|
|
|
#include <linux/bug.h>
|
|
|
|
|
|
|
|
#ifdef CONFIG_UNCACHED_MAPPING
|
2010-11-04 10:46:19 +07:00
|
|
|
extern unsigned long cached_to_uncached;
|
|
|
|
extern unsigned long uncached_size;
|
2010-02-18 16:13:51 +07:00
|
|
|
extern unsigned long uncached_start, uncached_end;
|
|
|
|
|
|
|
|
extern int virt_addr_uncached(unsigned long kaddr);
|
|
|
|
extern void uncached_init(void);
|
|
|
|
extern void uncached_resize(unsigned long size);
|
2010-11-04 10:46:19 +07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Jump to uncached area.
|
|
|
|
* When handling TLB or caches, we need to do it from an uncached area.
|
|
|
|
*/
|
|
|
|
#define jump_to_uncached() \
|
|
|
|
do { \
|
|
|
|
unsigned long __dummy; \
|
|
|
|
\
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
"mova 1f, %0\n\t" \
|
|
|
|
"add %1, %0\n\t" \
|
|
|
|
"jmp @%0\n\t" \
|
|
|
|
" nop\n\t" \
|
|
|
|
".balign 4\n" \
|
|
|
|
"1:" \
|
|
|
|
: "=&z" (__dummy) \
|
|
|
|
: "r" (cached_to_uncached)); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Back to cached area.
|
|
|
|
*/
|
|
|
|
#define back_to_cached() \
|
|
|
|
do { \
|
|
|
|
unsigned long __dummy; \
|
|
|
|
ctrl_barrier(); \
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
"mov.l 1f, %0\n\t" \
|
|
|
|
"jmp @%0\n\t" \
|
|
|
|
" nop\n\t" \
|
|
|
|
".balign 4\n" \
|
|
|
|
"1: .long 2f\n" \
|
|
|
|
"2:" \
|
|
|
|
: "=&r" (__dummy)); \
|
|
|
|
} while (0)
|
2010-02-18 16:13:51 +07:00
|
|
|
#else
|
|
|
|
#define virt_addr_uncached(kaddr) (0)
|
|
|
|
#define uncached_init() do { } while (0)
|
|
|
|
#define uncached_resize(size) BUG()
|
2010-11-04 10:46:19 +07:00
|
|
|
#define jump_to_uncached() do { } while (0)
|
|
|
|
#define back_to_cached() do { } while (0)
|
2010-02-18 16:13:51 +07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* __ASM_SH_UNCACHED_H */
|