pci_io.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_S390_PCI_IO_H
  3. #define _ASM_S390_PCI_IO_H
  4. #ifdef CONFIG_PCI
  5. #include <linux/kernel.h>
  6. #include <linux/slab.h>
  7. #include <asm/pci_insn.h>
  8. /* I/O size constraints */
  9. #define ZPCI_MAX_READ_SIZE 8
  10. #define ZPCI_MAX_WRITE_SIZE 128
  11. /* I/O Map */
  12. #define ZPCI_IOMAP_SHIFT 48
  13. #define ZPCI_IOMAP_ADDR_SHIFT 62
  14. #define ZPCI_IOMAP_ADDR_BASE (1UL << ZPCI_IOMAP_ADDR_SHIFT)
  15. #define ZPCI_IOMAP_ADDR_OFF_MASK ((1UL << ZPCI_IOMAP_SHIFT) - 1)
  16. #define ZPCI_IOMAP_MAX_ENTRIES \
  17. (1UL << (ZPCI_IOMAP_ADDR_SHIFT - ZPCI_IOMAP_SHIFT))
  18. #define ZPCI_IOMAP_ADDR_IDX_MASK \
  19. ((ZPCI_IOMAP_ADDR_BASE - 1) & ~ZPCI_IOMAP_ADDR_OFF_MASK)
  20. struct zpci_iomap_entry {
  21. u32 fh;
  22. u8 bar;
  23. u16 count;
  24. };
  25. extern struct zpci_iomap_entry *zpci_iomap_start;
  26. #define ZPCI_ADDR(idx) (ZPCI_IOMAP_ADDR_BASE | ((u64) idx << ZPCI_IOMAP_SHIFT))
  27. #define ZPCI_IDX(addr) \
  28. (((__force u64) addr & ZPCI_IOMAP_ADDR_IDX_MASK) >> ZPCI_IOMAP_SHIFT)
  29. #define ZPCI_OFFSET(addr) \
  30. ((__force u64) addr & ZPCI_IOMAP_ADDR_OFF_MASK)
  31. #define ZPCI_CREATE_REQ(handle, space, len) \
  32. ((u64) handle << 32 | space << 16 | len)
  33. #define zpci_read(LENGTH, RETTYPE) \
  34. static inline RETTYPE zpci_read_##RETTYPE(const volatile void __iomem *addr) \
  35. { \
  36. u64 data; \
  37. int rc; \
  38. \
  39. rc = zpci_load(&data, addr, LENGTH); \
  40. if (rc) \
  41. data = -1ULL; \
  42. return (RETTYPE) data; \
  43. }
  44. #define zpci_write(LENGTH, VALTYPE) \
  45. static inline void zpci_write_##VALTYPE(VALTYPE val, \
  46. const volatile void __iomem *addr) \
  47. { \
  48. u64 data = (VALTYPE) val; \
  49. \
  50. zpci_store(addr, data, LENGTH); \
  51. }
  52. zpci_read(8, u64)
  53. zpci_read(4, u32)
  54. zpci_read(2, u16)
  55. zpci_read(1, u8)
  56. zpci_write(8, u64)
  57. zpci_write(4, u32)
  58. zpci_write(2, u16)
  59. zpci_write(1, u8)
  60. static inline int zpci_write_single(volatile void __iomem *dst, const void *src,
  61. unsigned long len)
  62. {
  63. u64 val;
  64. switch (len) {
  65. case 1:
  66. val = (u64) *((u8 *) src);
  67. break;
  68. case 2:
  69. val = (u64) *((u16 *) src);
  70. break;
  71. case 4:
  72. val = (u64) *((u32 *) src);
  73. break;
  74. case 8:
  75. val = (u64) *((u64 *) src);
  76. break;
  77. default:
  78. val = 0; /* let FW report error */
  79. break;
  80. }
  81. return zpci_store(dst, val, len);
  82. }
  83. static inline int zpci_read_single(void *dst, const volatile void __iomem *src,
  84. unsigned long len)
  85. {
  86. u64 data;
  87. int cc;
  88. cc = zpci_load(&data, src, len);
  89. if (cc)
  90. goto out;
  91. switch (len) {
  92. case 1:
  93. *((u8 *) dst) = (u8) data;
  94. break;
  95. case 2:
  96. *((u16 *) dst) = (u16) data;
  97. break;
  98. case 4:
  99. *((u32 *) dst) = (u32) data;
  100. break;
  101. case 8:
  102. *((u64 *) dst) = (u64) data;
  103. break;
  104. }
  105. out:
  106. return cc;
  107. }
  108. int zpci_write_block(volatile void __iomem *dst, const void *src,
  109. unsigned long len);
  110. static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max)
  111. {
  112. int count = len > max ? max : len, size = 1;
  113. while (!(src & 0x1) && !(dst & 0x1) && ((size << 1) <= count)) {
  114. dst = dst >> 1;
  115. src = src >> 1;
  116. size = size << 1;
  117. }
  118. return size;
  119. }
  120. static inline int zpci_memcpy_fromio(void *dst,
  121. const volatile void __iomem *src,
  122. unsigned long n)
  123. {
  124. int size, rc = 0;
  125. while (n > 0) {
  126. size = zpci_get_max_write_size((u64 __force) src,
  127. (u64) dst, n,
  128. ZPCI_MAX_READ_SIZE);
  129. rc = zpci_read_single(dst, src, size);
  130. if (rc)
  131. break;
  132. src += size;
  133. dst += size;
  134. n -= size;
  135. }
  136. return rc;
  137. }
  138. static inline int zpci_memcpy_toio(volatile void __iomem *dst,
  139. const void *src, unsigned long n)
  140. {
  141. int size, rc = 0;
  142. if (!src)
  143. return -EINVAL;
  144. while (n > 0) {
  145. size = zpci_get_max_write_size((u64 __force) dst,
  146. (u64) src, n,
  147. ZPCI_MAX_WRITE_SIZE);
  148. if (size > 8) /* main path */
  149. rc = zpci_write_block(dst, src, size);
  150. else
  151. rc = zpci_write_single(dst, src, size);
  152. if (rc)
  153. break;
  154. src += size;
  155. dst += size;
  156. n -= size;
  157. }
  158. return rc;
  159. }
  160. static inline int zpci_memset_io(volatile void __iomem *dst,
  161. unsigned char val, size_t count)
  162. {
  163. u8 *src = kmalloc(count, GFP_KERNEL);
  164. int rc;
  165. if (src == NULL)
  166. return -ENOMEM;
  167. memset(src, val, count);
  168. rc = zpci_memcpy_toio(dst, src, count);
  169. kfree(src);
  170. return rc;
  171. }
  172. #endif /* CONFIG_PCI */
  173. #endif /* _ASM_S390_PCI_IO_H */