io_64.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. #ifndef __SPARC64_IO_H
  2. #define __SPARC64_IO_H
  3. #include <linux/kernel.h>
  4. #include <linux/compiler.h>
  5. #include <linux/types.h>
  6. #include <asm/page.h> /* IO address mapping routines need this */
  7. #include <asm/asi.h>
  8. #include <asm-generic/pci_iomap.h>
  9. /* BIO layer definitions. */
  10. extern unsigned long kern_base, kern_size;
  11. /* __raw_{read,write}{b,w,l,q} uses direct access.
  12. * Access the memory as big endian bypassing the cache
  13. * by using ASI_PHYS_BYPASS_EC_E
  14. */
  15. #define __raw_readb __raw_readb
  16. static inline u8 __raw_readb(const volatile void __iomem *addr)
  17. {
  18. u8 ret;
  19. __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_raw_readb */"
  20. : "=r" (ret)
  21. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  22. return ret;
  23. }
  24. #define __raw_readw __raw_readw
  25. static inline u16 __raw_readw(const volatile void __iomem *addr)
  26. {
  27. u16 ret;
  28. __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_raw_readw */"
  29. : "=r" (ret)
  30. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  31. return ret;
  32. }
  33. #define __raw_readl __raw_readl
  34. static inline u32 __raw_readl(const volatile void __iomem *addr)
  35. {
  36. u32 ret;
  37. __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_raw_readl */"
  38. : "=r" (ret)
  39. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  40. return ret;
  41. }
  42. #define __raw_readq __raw_readq
  43. static inline u64 __raw_readq(const volatile void __iomem *addr)
  44. {
  45. u64 ret;
  46. __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_raw_readq */"
  47. : "=r" (ret)
  48. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  49. return ret;
  50. }
  51. #define __raw_writeb __raw_writeb
  52. static inline void __raw_writeb(u8 b, const volatile void __iomem *addr)
  53. {
  54. __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_raw_writeb */"
  55. : /* no outputs */
  56. : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  57. }
  58. #define __raw_writew __raw_writew
  59. static inline void __raw_writew(u16 w, const volatile void __iomem *addr)
  60. {
  61. __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_raw_writew */"
  62. : /* no outputs */
  63. : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  64. }
  65. #define __raw_writel __raw_writel
  66. static inline void __raw_writel(u32 l, const volatile void __iomem *addr)
  67. {
  68. __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_raw_writel */"
  69. : /* no outputs */
  70. : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  71. }
  72. #define __raw_writeq __raw_writeq
  73. static inline void __raw_writeq(u64 q, const volatile void __iomem *addr)
  74. {
  75. __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_raw_writeq */"
  76. : /* no outputs */
  77. : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
  78. }
  79. /* Memory functions, same as I/O accesses on Ultra.
  80. * Access memory as little endian bypassing
  81. * the cache by using ASI_PHYS_BYPASS_EC_E_L
  82. */
  83. #define readb readb
  84. static inline u8 readb(const volatile void __iomem *addr)
  85. { u8 ret;
  86. __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_readb */"
  87. : "=r" (ret)
  88. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  89. : "memory");
  90. return ret;
  91. }
  92. #define readw readw
  93. static inline u16 readw(const volatile void __iomem *addr)
  94. { u16 ret;
  95. __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_readw */"
  96. : "=r" (ret)
  97. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  98. : "memory");
  99. return ret;
  100. }
  101. #define readl readl
  102. static inline u32 readl(const volatile void __iomem *addr)
  103. { u32 ret;
  104. __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_readl */"
  105. : "=r" (ret)
  106. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  107. : "memory");
  108. return ret;
  109. }
  110. #define readq readq
  111. static inline u64 readq(const volatile void __iomem *addr)
  112. { u64 ret;
  113. __asm__ __volatile__("ldxa\t[%1] %2, %0\t/* pci_readq */"
  114. : "=r" (ret)
  115. : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  116. : "memory");
  117. return ret;
  118. }
  119. #define writeb writeb
  120. static inline void writeb(u8 b, volatile void __iomem *addr)
  121. {
  122. __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_writeb */"
  123. : /* no outputs */
  124. : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  125. : "memory");
  126. }
  127. #define writew writew
  128. static inline void writew(u16 w, volatile void __iomem *addr)
  129. {
  130. __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_writew */"
  131. : /* no outputs */
  132. : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  133. : "memory");
  134. }
  135. #define writel writel
  136. static inline void writel(u32 l, volatile void __iomem *addr)
  137. {
  138. __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_writel */"
  139. : /* no outputs */
  140. : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  141. : "memory");
  142. }
  143. #define writeq writeq
  144. static inline void writeq(u64 q, volatile void __iomem *addr)
  145. {
  146. __asm__ __volatile__("stxa\t%r0, [%1] %2\t/* pci_writeq */"
  147. : /* no outputs */
  148. : "Jr" (q), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L)
  149. : "memory");
  150. }
  151. #define inb inb
  152. static inline u8 inb(unsigned long addr)
  153. {
  154. return readb((volatile void __iomem *)addr);
  155. }
  156. #define inw inw
  157. static inline u16 inw(unsigned long addr)
  158. {
  159. return readw((volatile void __iomem *)addr);
  160. }
  161. #define inl inl
  162. static inline u32 inl(unsigned long addr)
  163. {
  164. return readl((volatile void __iomem *)addr);
  165. }
  166. #define outb outb
  167. static inline void outb(u8 b, unsigned long addr)
  168. {
  169. writeb(b, (volatile void __iomem *)addr);
  170. }
  171. #define outw outw
  172. static inline void outw(u16 w, unsigned long addr)
  173. {
  174. writew(w, (volatile void __iomem *)addr);
  175. }
  176. #define outl outl
  177. static inline void outl(u32 l, unsigned long addr)
  178. {
  179. writel(l, (volatile void __iomem *)addr);
  180. }
  181. #define inb_p(__addr) inb(__addr)
  182. #define outb_p(__b, __addr) outb(__b, __addr)
  183. #define inw_p(__addr) inw(__addr)
  184. #define outw_p(__w, __addr) outw(__w, __addr)
  185. #define inl_p(__addr) inl(__addr)
  186. #define outl_p(__l, __addr) outl(__l, __addr)
  187. void outsb(unsigned long, const void *, unsigned long);
  188. void outsw(unsigned long, const void *, unsigned long);
  189. void outsl(unsigned long, const void *, unsigned long);
  190. void insb(unsigned long, void *, unsigned long);
  191. void insw(unsigned long, void *, unsigned long);
  192. void insl(unsigned long, void *, unsigned long);
  193. static inline void ioread8_rep(void __iomem *port, void *buf, unsigned long count)
  194. {
  195. insb((unsigned long __force)port, buf, count);
  196. }
  197. static inline void ioread16_rep(void __iomem *port, void *buf, unsigned long count)
  198. {
  199. insw((unsigned long __force)port, buf, count);
  200. }
  201. static inline void ioread32_rep(void __iomem *port, void *buf, unsigned long count)
  202. {
  203. insl((unsigned long __force)port, buf, count);
  204. }
  205. static inline void iowrite8_rep(void __iomem *port, const void *buf, unsigned long count)
  206. {
  207. outsb((unsigned long __force)port, buf, count);
  208. }
  209. static inline void iowrite16_rep(void __iomem *port, const void *buf, unsigned long count)
  210. {
  211. outsw((unsigned long __force)port, buf, count);
  212. }
  213. static inline void iowrite32_rep(void __iomem *port, const void *buf, unsigned long count)
  214. {
  215. outsl((unsigned long __force)port, buf, count);
  216. }
  217. #define readb_relaxed(__addr) readb(__addr)
  218. #define readw_relaxed(__addr) readw(__addr)
  219. #define readl_relaxed(__addr) readl(__addr)
  220. #define readq_relaxed(__addr) readq(__addr)
  221. /* Valid I/O Space regions are anywhere, because each PCI bus supported
  222. * can live in an arbitrary area of the physical address range.
  223. */
  224. #define IO_SPACE_LIMIT 0xffffffffffffffffUL
  225. /* Now, SBUS variants, only difference from PCI is that we do
  226. * not use little-endian ASIs.
  227. */
  228. static inline u8 sbus_readb(const volatile void __iomem *addr)
  229. {
  230. return __raw_readb(addr);
  231. }
  232. static inline u16 sbus_readw(const volatile void __iomem *addr)
  233. {
  234. return __raw_readw(addr);
  235. }
  236. static inline u32 sbus_readl(const volatile void __iomem *addr)
  237. {
  238. return __raw_readl(addr);
  239. }
  240. static inline u64 sbus_readq(const volatile void __iomem *addr)
  241. {
  242. return __raw_readq(addr);
  243. }
  244. static inline void sbus_writeb(u8 b, volatile void __iomem *addr)
  245. {
  246. __raw_writeb(b, addr);
  247. }
  248. static inline void sbus_writew(u16 w, volatile void __iomem *addr)
  249. {
  250. __raw_writew(w, addr);
  251. }
  252. static inline void sbus_writel(u32 l, volatile void __iomem *addr)
  253. {
  254. __raw_writel(l, addr);
  255. }
  256. static inline void sbus_writeq(u64 q, volatile void __iomem *addr)
  257. {
  258. __raw_writeq(q, addr);
  259. }
  260. static inline void sbus_memset_io(volatile void __iomem *dst, int c, __kernel_size_t n)
  261. {
  262. while(n--) {
  263. sbus_writeb(c, dst);
  264. dst++;
  265. }
  266. }
  267. static inline void memset_io(volatile void __iomem *dst, int c, __kernel_size_t n)
  268. {
  269. volatile void __iomem *d = dst;
  270. while (n--) {
  271. writeb(c, d);
  272. d++;
  273. }
  274. }
  275. static inline void sbus_memcpy_fromio(void *dst, const volatile void __iomem *src,
  276. __kernel_size_t n)
  277. {
  278. char *d = dst;
  279. while (n--) {
  280. char tmp = sbus_readb(src);
  281. *d++ = tmp;
  282. src++;
  283. }
  284. }
  285. static inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
  286. __kernel_size_t n)
  287. {
  288. char *d = dst;
  289. while (n--) {
  290. char tmp = readb(src);
  291. *d++ = tmp;
  292. src++;
  293. }
  294. }
  295. static inline void sbus_memcpy_toio(volatile void __iomem *dst, const void *src,
  296. __kernel_size_t n)
  297. {
  298. const char *s = src;
  299. volatile void __iomem *d = dst;
  300. while (n--) {
  301. char tmp = *s++;
  302. sbus_writeb(tmp, d);
  303. d++;
  304. }
  305. }
  306. static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
  307. __kernel_size_t n)
  308. {
  309. const char *s = src;
  310. volatile void __iomem *d = dst;
  311. while (n--) {
  312. char tmp = *s++;
  313. writeb(tmp, d);
  314. d++;
  315. }
  316. }
  317. #define mmiowb()
  318. #ifdef __KERNEL__
  319. /* On sparc64 we have the whole physical IO address space accessible
  320. * using physically addressed loads and stores, so this does nothing.
  321. */
  322. static inline void __iomem *ioremap(unsigned long offset, unsigned long size)
  323. {
  324. return (void __iomem *)offset;
  325. }
  326. #define ioremap_nocache(X,Y) ioremap((X),(Y))
  327. #define ioremap_wc(X,Y) ioremap((X),(Y))
  328. static inline void iounmap(volatile void __iomem *addr)
  329. {
  330. }
  331. #define ioread8(X) readb(X)
  332. #define ioread16(X) readw(X)
  333. #define ioread16be(X) __raw_readw(X)
  334. #define ioread32(X) readl(X)
  335. #define ioread32be(X) __raw_readl(X)
  336. #define iowrite8(val,X) writeb(val,X)
  337. #define iowrite16(val,X) writew(val,X)
  338. #define iowrite16be(val,X) __raw_writew(val,X)
  339. #define iowrite32(val,X) writel(val,X)
  340. #define iowrite32be(val,X) __raw_writel(val,X)
  341. /* Create a virtual mapping cookie for an IO port range */
  342. void __iomem *ioport_map(unsigned long port, unsigned int nr);
  343. void ioport_unmap(void __iomem *);
  344. /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
  345. struct pci_dev;
  346. void pci_iounmap(struct pci_dev *dev, void __iomem *);
  347. static inline int sbus_can_dma_64bit(void)
  348. {
  349. return 1;
  350. }
  351. static inline int sbus_can_burst64(void)
  352. {
  353. return 1;
  354. }
  355. struct device;
  356. void sbus_set_sbus64(struct device *, int);
  357. /*
  358. * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  359. * access
  360. */
  361. #define xlate_dev_mem_ptr(p) __va(p)
  362. /*
  363. * Convert a virtual cached pointer to an uncached pointer
  364. */
  365. #define xlate_dev_kmem_ptr(p) p
  366. #endif
  367. #endif /* !(__SPARC64_IO_H) */