uncached.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #ifndef __ASM_SH_UNCACHED_H
  2. #define __ASM_SH_UNCACHED_H
  3. #include <linux/bug.h>
  4. #ifdef CONFIG_UNCACHED_MAPPING
  5. extern unsigned long cached_to_uncached;
  6. extern unsigned long uncached_size;
  7. extern unsigned long uncached_start, uncached_end;
  8. extern int virt_addr_uncached(unsigned long kaddr);
  9. extern void uncached_init(void);
  10. extern void uncached_resize(unsigned long size);
  11. /*
  12. * Jump to uncached area.
  13. * When handling TLB or caches, we need to do it from an uncached area.
  14. */
  15. #define jump_to_uncached() \
  16. do { \
  17. unsigned long __dummy; \
  18. \
  19. __asm__ __volatile__( \
  20. "mova 1f, %0\n\t" \
  21. "add %1, %0\n\t" \
  22. "jmp @%0\n\t" \
  23. " nop\n\t" \
  24. ".balign 4\n" \
  25. "1:" \
  26. : "=&z" (__dummy) \
  27. : "r" (cached_to_uncached)); \
  28. } while (0)
  29. /*
  30. * Back to cached area.
  31. */
  32. #define back_to_cached() \
  33. do { \
  34. unsigned long __dummy; \
  35. ctrl_barrier(); \
  36. __asm__ __volatile__( \
  37. "mov.l 1f, %0\n\t" \
  38. "jmp @%0\n\t" \
  39. " nop\n\t" \
  40. ".balign 4\n" \
  41. "1: .long 2f\n" \
  42. "2:" \
  43. : "=&r" (__dummy)); \
  44. } while (0)
  45. #else
  46. #define virt_addr_uncached(kaddr) (0)
  47. #define uncached_init() do { } while (0)
  48. #define uncached_resize(size) BUG()
  49. #define jump_to_uncached() do { } while (0)
  50. #define back_to_cached() do { } while (0)
  51. #endif
  52. #endif /* __ASM_SH_UNCACHED_H */