[SPARC64]: Fix setting of variables in LDOM guest.
[linux-2.6/linux-2.6-openrd.git] / drivers / s390 / cio / ioasm.h
blob7153dd959082253eb00cb182a4b53bb59b2eb72f
1 #ifndef S390_CIO_IOASM_H
2 #define S390_CIO_IOASM_H
4 #include <asm/chpid.h>
5 #include "schid.h"
7 /*
8 * TPI info structure
9 */
10 struct tpi_info {
11 struct subchannel_id schid;
12 __u32 intparm; /* interruption parameter */
13 __u32 adapter_IO : 1;
14 __u32 reserved2 : 1;
15 __u32 isc : 3;
16 __u32 reserved3 : 12;
17 __u32 int_type : 3;
18 __u32 reserved4 : 12;
19 } __attribute__ ((packed));
23 * Some S390 specific IO instructions as inline
26 static inline int stsch(struct subchannel_id schid,
27 volatile struct schib *addr)
29 register struct subchannel_id reg1 asm ("1") = schid;
30 int ccode;
32 asm volatile(
33 " stsch 0(%2)\n"
34 " ipm %0\n"
35 " srl %0,28"
36 : "=d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc");
37 return ccode;
40 static inline int stsch_err(struct subchannel_id schid,
41 volatile struct schib *addr)
43 register struct subchannel_id reg1 asm ("1") = schid;
44 int ccode = -EIO;
46 asm volatile(
47 " stsch 0(%2)\n"
48 "0: ipm %0\n"
49 " srl %0,28\n"
50 "1:\n"
51 EX_TABLE(0b,1b)
52 : "+d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc");
53 return ccode;
56 static inline int msch(struct subchannel_id schid,
57 volatile struct schib *addr)
59 register struct subchannel_id reg1 asm ("1") = schid;
60 int ccode;
62 asm volatile(
63 " msch 0(%2)\n"
64 " ipm %0\n"
65 " srl %0,28"
66 : "=d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc");
67 return ccode;
70 static inline int msch_err(struct subchannel_id schid,
71 volatile struct schib *addr)
73 register struct subchannel_id reg1 asm ("1") = schid;
74 int ccode = -EIO;
76 asm volatile(
77 " msch 0(%2)\n"
78 "0: ipm %0\n"
79 " srl %0,28\n"
80 "1:\n"
81 EX_TABLE(0b,1b)
82 : "+d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc");
83 return ccode;
86 static inline int tsch(struct subchannel_id schid,
87 volatile struct irb *addr)
89 register struct subchannel_id reg1 asm ("1") = schid;
90 int ccode;
92 asm volatile(
93 " tsch 0(%2)\n"
94 " ipm %0\n"
95 " srl %0,28"
96 : "=d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc");
97 return ccode;
100 static inline int tpi( volatile struct tpi_info *addr)
102 int ccode;
104 asm volatile(
105 " tpi 0(%1)\n"
106 " ipm %0\n"
107 " srl %0,28"
108 : "=d" (ccode) : "a" (addr), "m" (*addr) : "cc");
109 return ccode;
112 static inline int ssch(struct subchannel_id schid,
113 volatile struct orb *addr)
115 register struct subchannel_id reg1 asm ("1") = schid;
116 int ccode;
118 asm volatile(
119 " ssch 0(%2)\n"
120 " ipm %0\n"
121 " srl %0,28"
122 : "=d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc");
123 return ccode;
126 static inline int rsch(struct subchannel_id schid)
128 register struct subchannel_id reg1 asm ("1") = schid;
129 int ccode;
131 asm volatile(
132 " rsch\n"
133 " ipm %0\n"
134 " srl %0,28"
135 : "=d" (ccode) : "d" (reg1) : "cc");
136 return ccode;
139 static inline int csch(struct subchannel_id schid)
141 register struct subchannel_id reg1 asm ("1") = schid;
142 int ccode;
144 asm volatile(
145 " csch\n"
146 " ipm %0\n"
147 " srl %0,28"
148 : "=d" (ccode) : "d" (reg1) : "cc");
149 return ccode;
152 static inline int hsch(struct subchannel_id schid)
154 register struct subchannel_id reg1 asm ("1") = schid;
155 int ccode;
157 asm volatile(
158 " hsch\n"
159 " ipm %0\n"
160 " srl %0,28"
161 : "=d" (ccode) : "d" (reg1) : "cc");
162 return ccode;
165 static inline int xsch(struct subchannel_id schid)
167 register struct subchannel_id reg1 asm ("1") = schid;
168 int ccode;
170 asm volatile(
171 " .insn rre,0xb2760000,%1,0\n"
172 " ipm %0\n"
173 " srl %0,28"
174 : "=d" (ccode) : "d" (reg1) : "cc");
175 return ccode;
178 static inline int chsc(void *chsc_area)
180 typedef struct { char _[4096]; } addr_type;
181 int cc;
183 asm volatile(
184 " .insn rre,0xb25f0000,%2,0\n"
185 " ipm %0\n"
186 " srl %0,28\n"
187 : "=d" (cc), "=m" (*(addr_type *) chsc_area)
188 : "d" (chsc_area), "m" (*(addr_type *) chsc_area)
189 : "cc");
190 return cc;
193 static inline int rchp(struct chp_id chpid)
195 register struct chp_id reg1 asm ("1") = chpid;
196 int ccode;
198 asm volatile(
199 " lr 1,%1\n"
200 " rchp\n"
201 " ipm %0\n"
202 " srl %0,28"
203 : "=d" (ccode) : "d" (reg1) : "cc");
204 return ccode;
207 #endif