Linux Audio

Check our new training course

Loading...
v3.1
 
  1#ifndef S390_CIO_IOASM_H
  2#define S390_CIO_IOASM_H
  3
  4#include <asm/chpid.h>
  5#include <asm/schid.h>
 
  6#include "orb.h"
  7#include "cio.h"
 
  8
  9/*
 10 * TPI info structure
 11 */
 12struct tpi_info {
 13	struct subchannel_id schid;
 14	__u32 intparm;		 /* interruption parameter */
 15	__u32 adapter_IO : 1;
 16	__u32 reserved2	 : 1;
 17	__u32 isc	 : 3;
 18	__u32 reserved3	 : 12;
 19	__u32 int_type	 : 3;
 20	__u32 reserved4	 : 12;
 21} __attribute__ ((packed));
 22
 23
 24/*
 25 * Some S390 specific IO instructions as inline
 26 */
 27
 28static inline int stsch_err(struct subchannel_id schid, struct schib *addr)
 29{
 30	register struct subchannel_id reg1 asm ("1") = schid;
 31	int ccode = -EIO;
 32
 33	asm volatile(
 34		"	stsch	0(%3)\n"
 35		"0:	ipm	%0\n"
 36		"	srl	%0,28\n"
 37		"1:\n"
 38		EX_TABLE(0b,1b)
 39		: "+d" (ccode), "=m" (*addr)
 40		: "d" (reg1), "a" (addr)
 41		: "cc");
 42	return ccode;
 43}
 44
 45static inline int msch(struct subchannel_id schid, struct schib *addr)
 46{
 47	register struct subchannel_id reg1 asm ("1") = schid;
 48	int ccode;
 49
 50	asm volatile(
 51		"	msch	0(%2)\n"
 52		"	ipm	%0\n"
 53		"	srl	%0,28"
 54		: "=d" (ccode)
 55		: "d" (reg1), "a" (addr), "m" (*addr)
 56		: "cc");
 57	return ccode;
 58}
 59
 60static inline int msch_err(struct subchannel_id schid, struct schib *addr)
 61{
 62	register struct subchannel_id reg1 asm ("1") = schid;
 63	int ccode = -EIO;
 64
 65	asm volatile(
 66		"	msch	0(%2)\n"
 67		"0:	ipm	%0\n"
 68		"	srl	%0,28\n"
 69		"1:\n"
 70		EX_TABLE(0b,1b)
 71		: "+d" (ccode)
 72		: "d" (reg1), "a" (addr), "m" (*addr)
 73		: "cc");
 74	return ccode;
 75}
 76
 77static inline int tsch(struct subchannel_id schid, struct irb *addr)
 78{
 79	register struct subchannel_id reg1 asm ("1") = schid;
 80	int ccode;
 81
 82	asm volatile(
 83		"	tsch	0(%3)\n"
 84		"	ipm	%0\n"
 85		"	srl	%0,28"
 86		: "=d" (ccode), "=m" (*addr)
 87		: "d" (reg1), "a" (addr)
 88		: "cc");
 89	return ccode;
 90}
 91
 92static inline int ssch(struct subchannel_id schid, union orb *addr)
 93{
 94	register struct subchannel_id reg1 asm("1") = schid;
 95	int ccode = -EIO;
 96
 97	asm volatile(
 98		"	ssch	0(%2)\n"
 99		"0:	ipm	%0\n"
100		"	srl	%0,28\n"
101		"1:\n"
102		EX_TABLE(0b, 1b)
103		: "+d" (ccode)
104		: "d" (reg1), "a" (addr), "m" (*addr)
105		: "cc", "memory");
106	return ccode;
107}
108
109static inline int csch(struct subchannel_id schid)
110{
111	register struct subchannel_id reg1 asm("1") = schid;
112	int ccode;
113
114	asm volatile(
115		"	csch\n"
116		"	ipm	%0\n"
117		"	srl	%0,28"
118		: "=d" (ccode)
119		: "d" (reg1)
120		: "cc");
121	return ccode;
122}
123
124static inline int tpi(struct tpi_info *addr)
125{
126	int ccode;
127
128	asm volatile(
129		"	tpi	0(%2)\n"
130		"	ipm	%0\n"
131		"	srl	%0,28"
132		: "=d" (ccode), "=m" (*addr)
133		: "a" (addr)
134		: "cc");
135	return ccode;
136}
137
138static inline int chsc(void *chsc_area)
139{
140	typedef struct { char _[4096]; } addr_type;
141	int cc;
142
143	asm volatile(
144		"	.insn	rre,0xb25f0000,%2,0\n"
145		"	ipm	%0\n"
146		"	srl	%0,28\n"
147		: "=d" (cc), "=m" (*(addr_type *) chsc_area)
148		: "d" (chsc_area), "m" (*(addr_type *) chsc_area)
149		: "cc");
150	return cc;
151}
152
153static inline int rchp(struct chp_id chpid)
154{
155	register struct chp_id reg1 asm ("1") = chpid;
156	int ccode;
157
158	asm volatile(
159		"	lr	1,%1\n"
160		"	rchp\n"
161		"	ipm	%0\n"
162		"	srl	%0,28"
163		: "=d" (ccode) : "d" (reg1) : "cc");
164	return ccode;
165}
166
167#endif
v6.9.4
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef S390_CIO_IOASM_H
 3#define S390_CIO_IOASM_H
 4
 5#include <asm/chpid.h>
 6#include <asm/schid.h>
 7#include <asm/crw.h>
 8#include "orb.h"
 9#include "cio.h"
10#include "trace.h"
11
12/*
13 * Some S390 specific IO instructions
14 */
 
 
 
 
 
 
 
 
 
 
15
16int stsch(struct subchannel_id schid, struct schib *addr);
17int msch(struct subchannel_id schid, struct schib *addr);
18int tsch(struct subchannel_id schid, struct irb *addr);
19int ssch(struct subchannel_id schid, union orb *addr);
20int csch(struct subchannel_id schid);
21int tpi(struct tpi_info *addr);
22int chsc(void *chsc_area);
23int rsch(struct subchannel_id schid);
24int hsch(struct subchannel_id schid);
25int xsch(struct subchannel_id schid);
26int stcrw(struct crw *crw);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
28#endif