ioasm.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #ifndef S390_CIO_IOASM_H
  2. #define S390_CIO_IOASM_H
  3. /*
  4. * TPI info structure
  5. */
  6. struct tpi_info {
  7. __u32 reserved1 : 16; /* reserved 0x00000001 */
  8. __u32 irq : 16; /* aka. subchannel number */
  9. __u32 intparm; /* interruption parameter */
  10. __u32 adapter_IO : 1;
  11. __u32 reserved2 : 1;
  12. __u32 isc : 3;
  13. __u32 reserved3 : 12;
  14. __u32 int_type : 3;
  15. __u32 reserved4 : 12;
  16. } __attribute__ ((packed));
  17. /*
  18. * Some S390 specific IO instructions as inline
  19. */
  20. static inline int stsch(int irq, volatile struct schib *addr)
  21. {
  22. int ccode;
  23. __asm__ __volatile__(
  24. " lr 1,%1\n"
  25. " stsch 0(%2)\n"
  26. " ipm %0\n"
  27. " srl %0,28"
  28. : "=d" (ccode)
  29. : "d" (irq | 0x10000), "a" (addr)
  30. : "cc", "1" );
  31. return ccode;
  32. }
  33. static inline int msch(int irq, volatile struct schib *addr)
  34. {
  35. int ccode;
  36. __asm__ __volatile__(
  37. " lr 1,%1\n"
  38. " msch 0(%2)\n"
  39. " ipm %0\n"
  40. " srl %0,28"
  41. : "=d" (ccode)
  42. : "d" (irq | 0x10000L), "a" (addr)
  43. : "cc", "1" );
  44. return ccode;
  45. }
  46. static inline int msch_err(int irq, volatile struct schib *addr)
  47. {
  48. int ccode;
  49. __asm__ __volatile__(
  50. " lhi %0,%3\n"
  51. " lr 1,%1\n"
  52. " msch 0(%2)\n"
  53. "0: ipm %0\n"
  54. " srl %0,28\n"
  55. "1:\n"
  56. #ifdef CONFIG_ARCH_S390X
  57. ".section __ex_table,\"a\"\n"
  58. " .align 8\n"
  59. " .quad 0b,1b\n"
  60. ".previous"
  61. #else
  62. ".section __ex_table,\"a\"\n"
  63. " .align 4\n"
  64. " .long 0b,1b\n"
  65. ".previous"
  66. #endif
  67. : "=&d" (ccode)
  68. : "d" (irq | 0x10000L), "a" (addr), "K" (-EIO)
  69. : "cc", "1" );
  70. return ccode;
  71. }
  72. static inline int tsch(int irq, volatile struct irb *addr)
  73. {
  74. int ccode;
  75. __asm__ __volatile__(
  76. " lr 1,%1\n"
  77. " tsch 0(%2)\n"
  78. " ipm %0\n"
  79. " srl %0,28"
  80. : "=d" (ccode)
  81. : "d" (irq | 0x10000L), "a" (addr)
  82. : "cc", "1" );
  83. return ccode;
  84. }
  85. static inline int tpi( volatile struct tpi_info *addr)
  86. {
  87. int ccode;
  88. __asm__ __volatile__(
  89. " tpi 0(%1)\n"
  90. " ipm %0\n"
  91. " srl %0,28"
  92. : "=d" (ccode)
  93. : "a" (addr)
  94. : "cc", "1" );
  95. return ccode;
  96. }
  97. static inline int ssch(int irq, volatile struct orb *addr)
  98. {
  99. int ccode;
  100. __asm__ __volatile__(
  101. " lr 1,%1\n"
  102. " ssch 0(%2)\n"
  103. " ipm %0\n"
  104. " srl %0,28"
  105. : "=d" (ccode)
  106. : "d" (irq | 0x10000L), "a" (addr)
  107. : "cc", "1" );
  108. return ccode;
  109. }
  110. static inline int rsch(int irq)
  111. {
  112. int ccode;
  113. __asm__ __volatile__(
  114. " lr 1,%1\n"
  115. " rsch\n"
  116. " ipm %0\n"
  117. " srl %0,28"
  118. : "=d" (ccode)
  119. : "d" (irq | 0x10000L)
  120. : "cc", "1" );
  121. return ccode;
  122. }
  123. static inline int csch(int irq)
  124. {
  125. int ccode;
  126. __asm__ __volatile__(
  127. " lr 1,%1\n"
  128. " csch\n"
  129. " ipm %0\n"
  130. " srl %0,28"
  131. : "=d" (ccode)
  132. : "d" (irq | 0x10000L)
  133. : "cc", "1" );
  134. return ccode;
  135. }
  136. static inline int hsch(int irq)
  137. {
  138. int ccode;
  139. __asm__ __volatile__(
  140. " lr 1,%1\n"
  141. " hsch\n"
  142. " ipm %0\n"
  143. " srl %0,28"
  144. : "=d" (ccode)
  145. : "d" (irq | 0x10000L)
  146. : "cc", "1" );
  147. return ccode;
  148. }
  149. static inline int xsch(int irq)
  150. {
  151. int ccode;
  152. __asm__ __volatile__(
  153. " lr 1,%1\n"
  154. " .insn rre,0xb2760000,%1,0\n"
  155. " ipm %0\n"
  156. " srl %0,28"
  157. : "=d" (ccode)
  158. : "d" (irq | 0x10000L)
  159. : "cc", "1" );
  160. return ccode;
  161. }
  162. static inline int chsc(void *chsc_area)
  163. {
  164. int cc;
  165. __asm__ __volatile__ (
  166. ".insn rre,0xb25f0000,%1,0 \n\t"
  167. "ipm %0 \n\t"
  168. "srl %0,28 \n\t"
  169. : "=d" (cc)
  170. : "d" (chsc_area)
  171. : "cc" );
  172. return cc;
  173. }
  174. static inline int iac( void)
  175. {
  176. int ccode;
  177. __asm__ __volatile__(
  178. " iac 1\n"
  179. " ipm %0\n"
  180. " srl %0,28"
  181. : "=d" (ccode) : : "cc", "1" );
  182. return ccode;
  183. }
  184. static inline int rchp(int chpid)
  185. {
  186. int ccode;
  187. __asm__ __volatile__(
  188. " lr 1,%1\n"
  189. " rchp\n"
  190. " ipm %0\n"
  191. " srl %0,28"
  192. : "=d" (ccode)
  193. : "d" (chpid)
  194. : "cc", "1" );
  195. return ccode;
  196. }
  197. #endif