1 // SPDX-License-Identifier: GPL-2.0
3 * Channel subsystem I/O instructions.
6 #include <linux/export.h>
8 #include <asm/asm-extable.h>
10 #include <asm/schid.h>
16 #include "cio_inject.h"
18 static inline int __stsch(struct subchannel_id schid, struct schib *addr)
20 unsigned long r1 = *(unsigned int *)&schid;
30 : [cc] "+&d" (ccode), [addr] "=Q" (*addr)
36 int stsch(struct subchannel_id schid, struct schib *addr)
40 ccode = __stsch(schid, addr);
41 trace_s390_cio_stsch(schid, addr, ccode);
47 static inline int __msch(struct subchannel_id schid, struct schib *addr)
49 unsigned long r1 = *(unsigned int *)&schid;
60 : [r1] "d" (r1), [addr] "Q" (*addr)
65 int msch(struct subchannel_id schid, struct schib *addr)
69 ccode = __msch(schid, addr);
70 trace_s390_cio_msch(schid, addr, ccode);
75 static inline int __tsch(struct subchannel_id schid, struct irb *addr)
77 unsigned long r1 = *(unsigned int *)&schid;
85 : [cc] "=&d" (ccode), [addr] "=Q" (*addr)
91 int tsch(struct subchannel_id schid, struct irb *addr)
95 ccode = __tsch(schid, addr);
96 trace_s390_cio_tsch(schid, addr, ccode);
101 static inline int __ssch(struct subchannel_id schid, union orb *addr)
103 unsigned long r1 = *(unsigned int *)&schid;
114 : [r1] "d" (r1), [addr] "Q" (*addr)
115 : "cc", "memory", "1");
119 int ssch(struct subchannel_id schid, union orb *addr)
123 ccode = __ssch(schid, addr);
124 trace_s390_cio_ssch(schid, addr, ccode);
130 static inline int __csch(struct subchannel_id schid)
132 unsigned long r1 = *(unsigned int *)&schid;
146 int csch(struct subchannel_id schid)
150 ccode = __csch(schid);
151 trace_s390_cio_csch(schid, ccode);
157 int tpi(struct tpi_info *addr)
165 : [cc] "=&d" (ccode), [addr] "=Q" (*addr)
168 trace_s390_cio_tpi(addr, ccode);
173 int chsc(void *chsc_area)
175 typedef struct { char _[4096]; } addr_type;
179 " .insn rre,0xb25f0000,%[chsc_area],0\n"
184 : [cc] "+&d" (cc), "+m" (*(addr_type *)chsc_area)
185 : [chsc_area] "d" (chsc_area)
187 trace_s390_cio_chsc(chsc_area, cc);
193 static inline int __rsch(struct subchannel_id schid)
195 unsigned long r1 = *(unsigned int *)&schid;
205 : "cc", "memory", "1");
209 int rsch(struct subchannel_id schid)
213 ccode = __rsch(schid);
214 trace_s390_cio_rsch(schid, ccode);
219 static inline int __hsch(struct subchannel_id schid)
221 unsigned long r1 = *(unsigned int *)&schid;
235 int hsch(struct subchannel_id schid)
239 ccode = __hsch(schid);
240 trace_s390_cio_hsch(schid, ccode);
246 static inline int __xsch(struct subchannel_id schid)
248 unsigned long r1 = *(unsigned int *)&schid;
262 int xsch(struct subchannel_id schid)
266 ccode = __xsch(schid);
267 trace_s390_cio_xsch(schid, ccode);
272 static inline int __stcrw(struct crw *crw)
280 : [cc] "=&d" (ccode), [crw] "=Q" (*crw)
286 static inline int _stcrw(struct crw *crw)
288 #ifdef CONFIG_CIO_INJECT
289 if (static_branch_unlikely(&cio_inject_enabled)) {
290 if (stcrw_get_injected(crw) == 0)
298 int stcrw(struct crw *crw)
303 trace_s390_cio_stcrw(crw, ccode);