uncached.h 1.3 KB

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