1 // SPDX-License-Identifier: GPL-2.0
3 * Channel subsystem I/O instructions.
6 #include <linux/export.h>
15 #include "cio_inject.h"
17 static inline int __stsch(struct subchannel_id schid, struct schib *addr)
19 unsigned long r1 = *(unsigned int *)&schid;
29 : [cc] "+&d" (ccode), [addr] "=Q" (*addr)
35 int stsch(struct subchannel_id schid, struct schib *addr)
39 ccode = __stsch(schid, addr);
40 trace_s390_cio_stsch(schid, addr, ccode);
46 static inline int __msch(struct subchannel_id schid, struct schib *addr)
48 unsigned long r1 = *(unsigned int *)&schid;
59 : [r1] "d" (r1), [addr] "Q" (*addr)
64 int msch(struct subchannel_id schid, struct schib *addr)
68 ccode = __msch(schid, addr);
69 trace_s390_cio_msch(schid, addr, ccode);
74 static inline int __tsch(struct subchannel_id schid, struct irb *addr)
76 unsigned long r1 = *(unsigned int *)&schid;
84 : [cc] "=&d" (ccode), [addr] "=Q" (*addr)
90 int tsch(struct subchannel_id schid, struct irb *addr)
94 ccode = __tsch(schid, addr);
95 trace_s390_cio_tsch(schid, addr, ccode);
100 static inline int __ssch(struct subchannel_id schid, union orb *addr)
102 unsigned long r1 = *(unsigned int *)&schid;
113 : [r1] "d" (r1), [addr] "Q" (*addr)
114 : "cc", "memory", "1");
118 int ssch(struct subchannel_id schid, union orb *addr)
122 ccode = __ssch(schid, addr);
123 trace_s390_cio_ssch(schid, addr, ccode);
129 static inline int __csch(struct subchannel_id schid)
131 unsigned long r1 = *(unsigned int *)&schid;
145 int csch(struct subchannel_id schid)
149 ccode = __csch(schid);
150 trace_s390_cio_csch(schid, ccode);
156 int tpi(struct tpi_info *addr)
164 : [cc] "=&d" (ccode), [addr] "=Q" (*addr)
167 trace_s390_cio_tpi(addr, ccode);
172 int chsc(void *chsc_area)
174 typedef struct { char _[4096]; } addr_type;
178 " .insn rre,0xb25f0000,%[chsc_area],0\n"
183 : [cc] "+&d" (cc), "+m" (*(addr_type *)chsc_area)
184 : [chsc_area] "d" (chsc_area)
186 trace_s390_cio_chsc(chsc_area, cc);
192 static inline int __rsch(struct subchannel_id schid)
194 unsigned long r1 = *(unsigned int *)&schid;
204 : "cc", "memory", "1");
208 int rsch(struct subchannel_id schid)
212 ccode = __rsch(schid);
213 trace_s390_cio_rsch(schid, ccode);
218 static inline int __hsch(struct subchannel_id schid)
220 unsigned long r1 = *(unsigned int *)&schid;
234 int hsch(struct subchannel_id schid)
238 ccode = __hsch(schid);
239 trace_s390_cio_hsch(schid, ccode);
245 static inline int __xsch(struct subchannel_id schid)
247 unsigned long r1 = *(unsigned int *)&schid;
261 int xsch(struct subchannel_id schid)
265 ccode = __xsch(schid);
266 trace_s390_cio_xsch(schid, ccode);
271 static inline int __stcrw(struct crw *crw)
279 : [cc] "=&d" (ccode), [crw] "=Q" (*crw)
285 static inline int _stcrw(struct crw *crw)
287 #ifdef CONFIG_CIO_INJECT
288 if (static_branch_unlikely(&cio_inject_enabled)) {
289 if (stcrw_get_injected(crw) == 0)
297 int stcrw(struct crw *crw)
302 trace_s390_cio_stcrw(crw, ccode);