io.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*
  2. * Copyright (C) 2013-2014 Synopsys, Inc. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #ifndef __ASM_ARC_IO_H
  7. #define __ASM_ARC_IO_H
  8. #include <linux/types.h>
  9. #include <asm/byteorder.h>
  10. /*
  11. * Given a physical address and a length, return a virtual address
  12. * that can be used to access the memory range with the caching
  13. * properties specified by "flags".
  14. */
  15. #define MAP_NOCACHE (0)
  16. #define MAP_WRCOMBINE (0)
  17. #define MAP_WRBACK (0)
  18. #define MAP_WRTHROUGH (0)
  19. static inline void *
  20. map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
  21. {
  22. return (void *)((unsigned long)paddr);
  23. }
  24. /*
  25. * Take down a mapping set up by map_physmem().
  26. */
  27. static inline void unmap_physmem(void *vaddr, unsigned long flags)
  28. {
  29. }
  30. static inline void sync(void)
  31. {
  32. /* Not yet implemented */
  33. }
  34. static inline u8 __raw_readb(const volatile void __iomem *addr)
  35. {
  36. u8 b;
  37. __asm__ __volatile__("ldb%U1 %0, %1\n"
  38. : "=r" (b)
  39. : "m" (*(volatile u8 __force *)addr)
  40. : "memory");
  41. return b;
  42. }
  43. static inline u16 __raw_readw(const volatile void __iomem *addr)
  44. {
  45. u16 s;
  46. __asm__ __volatile__("ldw%U1 %0, %1\n"
  47. : "=r" (s)
  48. : "m" (*(volatile u16 __force *)addr)
  49. : "memory");
  50. return s;
  51. }
  52. static inline u32 __raw_readl(const volatile void __iomem *addr)
  53. {
  54. u32 w;
  55. __asm__ __volatile__("ld%U1 %0, %1\n"
  56. : "=r" (w)
  57. : "m" (*(volatile u32 __force *)addr)
  58. : "memory");
  59. return w;
  60. }
  61. #define readb __raw_readb
  62. static inline u16 readw(const volatile void __iomem *addr)
  63. {
  64. return __le16_to_cpu(__raw_readw(addr));
  65. }
  66. static inline u32 readl(const volatile void __iomem *addr)
  67. {
  68. return __le32_to_cpu(__raw_readl(addr));
  69. }
  70. static inline void __raw_writeb(u8 b, volatile void __iomem *addr)
  71. {
  72. __asm__ __volatile__("stb%U1 %0, %1\n"
  73. :
  74. : "r" (b), "m" (*(volatile u8 __force *)addr)
  75. : "memory");
  76. }
  77. static inline void __raw_writew(u16 s, volatile void __iomem *addr)
  78. {
  79. __asm__ __volatile__("stw%U1 %0, %1\n"
  80. :
  81. : "r" (s), "m" (*(volatile u16 __force *)addr)
  82. : "memory");
  83. }
  84. static inline void __raw_writel(u32 w, volatile void __iomem *addr)
  85. {
  86. __asm__ __volatile__("st%U1 %0, %1\n"
  87. :
  88. : "r" (w), "m" (*(volatile u32 __force *)addr)
  89. : "memory");
  90. }
  91. #define writeb __raw_writeb
  92. #define writew(b, addr) __raw_writew(__cpu_to_le16(b), addr)
  93. #define writel(b, addr) __raw_writel(__cpu_to_le32(b), addr)
  94. static inline int __raw_readsb(unsigned int addr, void *data, int bytelen)
  95. {
  96. __asm__ __volatile__ ("1:ld.di r8, [r0]\n"
  97. "sub.f r2, r2, 1\n"
  98. "bnz.d 1b\n"
  99. "stb.ab r8, [r1, 1]\n"
  100. :
  101. : "r" (addr), "r" (data), "r" (bytelen)
  102. : "r8");
  103. return bytelen;
  104. }
  105. static inline int __raw_readsw(unsigned int addr, void *data, int wordlen)
  106. {
  107. __asm__ __volatile__ ("1:ld.di r8, [r0]\n"
  108. "sub.f r2, r2, 1\n"
  109. "bnz.d 1b\n"
  110. "stw.ab r8, [r1, 2]\n"
  111. :
  112. : "r" (addr), "r" (data), "r" (wordlen)
  113. : "r8");
  114. return wordlen;
  115. }
  116. static inline int __raw_readsl(unsigned int addr, void *data, int longlen)
  117. {
  118. __asm__ __volatile__ ("1:ld.di r8, [r0]\n"
  119. "sub.f r2, r2, 1\n"
  120. "bnz.d 1b\n"
  121. "st.ab r8, [r1, 4]\n"
  122. :
  123. : "r" (addr), "r" (data), "r" (longlen)
  124. : "r8");
  125. return longlen;
  126. }
  127. static inline int __raw_writesb(unsigned int addr, void *data, int bytelen)
  128. {
  129. __asm__ __volatile__ ("1:ldb.ab r8, [r1, 1]\n"
  130. "sub.f r2, r2, 1\n"
  131. "bnz.d 1b\n"
  132. "st.di r8, [r0, 0]\n"
  133. :
  134. : "r" (addr), "r" (data), "r" (bytelen)
  135. : "r8");
  136. return bytelen;
  137. }
  138. static inline int __raw_writesw(unsigned int addr, void *data, int wordlen)
  139. {
  140. __asm__ __volatile__ ("1:ldw.ab r8, [r1, 2]\n"
  141. "sub.f r2, r2, 1\n"
  142. "bnz.d 1b\n"
  143. "st.ab.di r8, [r0, 0]\n"
  144. :
  145. : "r" (addr), "r" (data), "r" (wordlen)
  146. : "r8");
  147. return wordlen;
  148. }
  149. static inline int __raw_writesl(unsigned int addr, void *data, int longlen)
  150. {
  151. __asm__ __volatile__ ("1:ld.ab r8, [r1, 4]\n"
  152. "sub.f r2, r2, 1\n"
  153. "bnz.d 1b\n"
  154. "st.ab.di r8, [r0, 0]\n"
  155. :
  156. : "r" (addr), "r" (data), "r" (longlen)
  157. : "r8");
  158. return longlen;
  159. }
  160. #define out_arch(type, endian, a, v) __raw_write##type(cpu_to_##endian(v), a)
  161. #define in_arch(type, endian, a) endian##_to_cpu(__raw_read##type(a))
  162. #define out_le32(a, v) out_arch(l, le32, a, v)
  163. #define out_le16(a, v) out_arch(w, le16, a, v)
  164. #define in_le32(a) in_arch(l, le32, a)
  165. #define in_le16(a) in_arch(w, le16, a)
  166. #define out_be32(a, v) out_arch(l, be32, a, v)
  167. #define out_be16(a, v) out_arch(w, be16, a, v)
  168. #define in_be32(a) in_arch(l, be32, a)
  169. #define in_be16(a) in_arch(w, be16, a)
  170. #define out_8(a, v) __raw_writeb(v, a)
  171. #define in_8(a) __raw_readb(a)
  172. /*
  173. * Clear and set bits in one shot. These macros can be used to clear and
  174. * set multiple bits in a register using a single call. These macros can
  175. * also be used to set a multiple-bit bit pattern using a mask, by
  176. * specifying the mask in the 'clear' parameter and the new bit pattern
  177. * in the 'set' parameter.
  178. */
  179. #define clrbits(type, addr, clear) \
  180. out_##type((addr), in_##type(addr) & ~(clear))
  181. #define setbits(type, addr, set) \
  182. out_##type((addr), in_##type(addr) | (set))
  183. #define clrsetbits(type, addr, clear, set) \
  184. out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
  185. #define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
  186. #define setbits_be32(addr, set) setbits(be32, addr, set)
  187. #define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
  188. #define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
  189. #define setbits_le32(addr, set) setbits(le32, addr, set)
  190. #define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
  191. #define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
  192. #define setbits_be16(addr, set) setbits(be16, addr, set)
  193. #define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
  194. #define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
  195. #define setbits_le16(addr, set) setbits(le16, addr, set)
  196. #define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
  197. #define clrbits_8(addr, clear) clrbits(8, addr, clear)
  198. #define setbits_8(addr, set) setbits(8, addr, set)
  199. #define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
  200. static inline phys_addr_t virt_to_phys(void *vaddr)
  201. {
  202. return (phys_addr_t)((unsigned long)vaddr);
  203. }
  204. #endif /* __ASM_ARC_IO_H */