root / pc-bios / s390-ccw / cio.h @ f487b677
History | View | Annotate | Download (8.6 kB)
1 | 1e17c2c1 | Alexander Graf | /*
|
---|---|---|---|
2 | 1e17c2c1 | Alexander Graf | * Channel IO definitions
|
3 | 1e17c2c1 | Alexander Graf | *
|
4 | 1e17c2c1 | Alexander Graf | * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
|
5 | 1e17c2c1 | Alexander Graf | *
|
6 | 1e17c2c1 | Alexander Graf | * Inspired by various s390 headers in Linux 3.9.
|
7 | 1e17c2c1 | Alexander Graf | *
|
8 | 1e17c2c1 | Alexander Graf | * This work is licensed under the terms of the GNU GPL, version 2 or (at
|
9 | 1e17c2c1 | Alexander Graf | * your option) any later version. See the COPYING file in the top-level
|
10 | 1e17c2c1 | Alexander Graf | * directory.
|
11 | 1e17c2c1 | Alexander Graf | */
|
12 | 1e17c2c1 | Alexander Graf | |
13 | 1e17c2c1 | Alexander Graf | #ifndef CIO_H
|
14 | 1e17c2c1 | Alexander Graf | #define CIO_H
|
15 | 1e17c2c1 | Alexander Graf | |
16 | 1e17c2c1 | Alexander Graf | /*
|
17 | 1e17c2c1 | Alexander Graf | * path management control word
|
18 | 1e17c2c1 | Alexander Graf | */
|
19 | 1e17c2c1 | Alexander Graf | struct pmcw {
|
20 | 1e17c2c1 | Alexander Graf | __u32 intparm; /* interruption parameter */
|
21 | 1e17c2c1 | Alexander Graf | __u32 qf : 1; /* qdio facility */ |
22 | 1e17c2c1 | Alexander Graf | __u32 w : 1;
|
23 | 1e17c2c1 | Alexander Graf | __u32 isc : 3; /* interruption sublass */ |
24 | 1e17c2c1 | Alexander Graf | __u32 res5 : 3; /* reserved zeros */ |
25 | 1e17c2c1 | Alexander Graf | __u32 ena : 1; /* enabled */ |
26 | 1e17c2c1 | Alexander Graf | __u32 lm : 2; /* limit mode */ |
27 | 1e17c2c1 | Alexander Graf | __u32 mme : 2; /* measurement-mode enable */ |
28 | 1e17c2c1 | Alexander Graf | __u32 mp : 1; /* multipath mode */ |
29 | 1e17c2c1 | Alexander Graf | __u32 tf : 1; /* timing facility */ |
30 | 1e17c2c1 | Alexander Graf | __u32 dnv : 1; /* device number valid */ |
31 | 1e17c2c1 | Alexander Graf | __u32 dev : 16; /* device number */ |
32 | 1e17c2c1 | Alexander Graf | __u8 lpm; /* logical path mask */
|
33 | 1e17c2c1 | Alexander Graf | __u8 pnom; /* path not operational mask */
|
34 | 1e17c2c1 | Alexander Graf | __u8 lpum; /* last path used mask */
|
35 | 1e17c2c1 | Alexander Graf | __u8 pim; /* path installed mask */
|
36 | 1e17c2c1 | Alexander Graf | __u16 mbi; /* measurement-block index */
|
37 | 1e17c2c1 | Alexander Graf | __u8 pom; /* path operational mask */
|
38 | 1e17c2c1 | Alexander Graf | __u8 pam; /* path available mask */
|
39 | 1e17c2c1 | Alexander Graf | __u8 chpid[8]; /* CHPID 0-7 (if available) */ |
40 | 1e17c2c1 | Alexander Graf | __u32 unused1 : 8; /* reserved zeros */ |
41 | 1e17c2c1 | Alexander Graf | __u32 st : 3; /* subchannel type */ |
42 | 1e17c2c1 | Alexander Graf | __u32 unused2 : 18; /* reserved zeros */ |
43 | 1e17c2c1 | Alexander Graf | __u32 mbfc : 1; /* measurement block format control */ |
44 | 1e17c2c1 | Alexander Graf | __u32 xmwme : 1; /* extended measurement word mode enable */ |
45 | 1e17c2c1 | Alexander Graf | __u32 csense : 1; /* concurrent sense; can be enabled ...*/ |
46 | 1e17c2c1 | Alexander Graf | /* ... per MSCH, however, if facility */
|
47 | 1e17c2c1 | Alexander Graf | /* ... is not installed, this results */
|
48 | 1e17c2c1 | Alexander Graf | /* ... in an operand exception. */
|
49 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed)); |
50 | 1e17c2c1 | Alexander Graf | |
51 | 1e17c2c1 | Alexander Graf | /* Target SCHIB configuration. */
|
52 | 1e17c2c1 | Alexander Graf | struct schib_config {
|
53 | 1e17c2c1 | Alexander Graf | __u64 mba; |
54 | 1e17c2c1 | Alexander Graf | __u32 intparm; |
55 | 1e17c2c1 | Alexander Graf | __u16 mbi; |
56 | 1e17c2c1 | Alexander Graf | __u32 isc:3;
|
57 | 1e17c2c1 | Alexander Graf | __u32 ena:1;
|
58 | 1e17c2c1 | Alexander Graf | __u32 mme:2;
|
59 | 1e17c2c1 | Alexander Graf | __u32 mp:1;
|
60 | 1e17c2c1 | Alexander Graf | __u32 csense:1;
|
61 | 1e17c2c1 | Alexander Graf | __u32 mbfc:1;
|
62 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed)); |
63 | 1e17c2c1 | Alexander Graf | |
64 | 1e17c2c1 | Alexander Graf | struct scsw {
|
65 | 1e17c2c1 | Alexander Graf | __u16 flags; |
66 | 1e17c2c1 | Alexander Graf | __u16 ctrl; |
67 | 1e17c2c1 | Alexander Graf | __u32 cpa; |
68 | 1e17c2c1 | Alexander Graf | __u8 dstat; |
69 | 1e17c2c1 | Alexander Graf | __u8 cstat; |
70 | 1e17c2c1 | Alexander Graf | __u16 count; |
71 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed)); |
72 | 1e17c2c1 | Alexander Graf | |
73 | 1e17c2c1 | Alexander Graf | #define SCSW_FCTL_CLEAR_FUNC 0x1000 |
74 | 1e17c2c1 | Alexander Graf | #define SCSW_FCTL_HALT_FUNC 0x2000 |
75 | 1e17c2c1 | Alexander Graf | #define SCSW_FCTL_START_FUNC 0x4000 |
76 | 1e17c2c1 | Alexander Graf | |
77 | 1e17c2c1 | Alexander Graf | /*
|
78 | 1e17c2c1 | Alexander Graf | * subchannel information block
|
79 | 1e17c2c1 | Alexander Graf | */
|
80 | 1e17c2c1 | Alexander Graf | struct schib {
|
81 | 1e17c2c1 | Alexander Graf | struct pmcw pmcw; /* path management control word */ |
82 | 1e17c2c1 | Alexander Graf | struct scsw scsw; /* subchannel status word */ |
83 | 1e17c2c1 | Alexander Graf | __u64 mba; /* measurement block address */
|
84 | 1e17c2c1 | Alexander Graf | __u8 mda[4]; /* model dependent area */ |
85 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed,aligned(4)));
|
86 | 1e17c2c1 | Alexander Graf | |
87 | 1e17c2c1 | Alexander Graf | struct subchannel_id {
|
88 | 1e17c2c1 | Alexander Graf | __u32 cssid : 8;
|
89 | 1e17c2c1 | Alexander Graf | __u32 : 4;
|
90 | 1e17c2c1 | Alexander Graf | __u32 m : 1;
|
91 | 1e17c2c1 | Alexander Graf | __u32 ssid : 2;
|
92 | 1e17c2c1 | Alexander Graf | __u32 one : 1;
|
93 | 1e17c2c1 | Alexander Graf | __u32 sch_no : 16;
|
94 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed, aligned(4)));
|
95 | 1e17c2c1 | Alexander Graf | |
96 | 1e17c2c1 | Alexander Graf | /*
|
97 | 1e17c2c1 | Alexander Graf | * TPI info structure
|
98 | 1e17c2c1 | Alexander Graf | */
|
99 | 1e17c2c1 | Alexander Graf | struct tpi_info {
|
100 | 1e17c2c1 | Alexander Graf | struct subchannel_id schid;
|
101 | 1e17c2c1 | Alexander Graf | __u32 intparm; /* interruption parameter */
|
102 | 1e17c2c1 | Alexander Graf | __u32 adapter_IO : 1;
|
103 | 1e17c2c1 | Alexander Graf | __u32 reserved2 : 1;
|
104 | 1e17c2c1 | Alexander Graf | __u32 isc : 3;
|
105 | 1e17c2c1 | Alexander Graf | __u32 reserved3 : 12;
|
106 | 1e17c2c1 | Alexander Graf | __u32 int_type : 3;
|
107 | 1e17c2c1 | Alexander Graf | __u32 reserved4 : 12;
|
108 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed)); |
109 | 1e17c2c1 | Alexander Graf | |
110 | 1e17c2c1 | Alexander Graf | /* channel command word (type 1) */
|
111 | 1e17c2c1 | Alexander Graf | struct ccw1 {
|
112 | 1e17c2c1 | Alexander Graf | __u8 cmd_code; |
113 | 1e17c2c1 | Alexander Graf | __u8 flags; |
114 | 1e17c2c1 | Alexander Graf | __u16 count; |
115 | 1e17c2c1 | Alexander Graf | __u32 cda; |
116 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed)); |
117 | 1e17c2c1 | Alexander Graf | |
118 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_DC 0x80 |
119 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_CC 0x40 |
120 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_SLI 0x20 |
121 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_SKIP 0x10 |
122 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_PCI 0x08 |
123 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_IDA 0x04 |
124 | 1e17c2c1 | Alexander Graf | #define CCW_FLAG_SUSPEND 0x02 |
125 | 1e17c2c1 | Alexander Graf | |
126 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_NOOP 0x03 |
127 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_BASIC_SENSE 0x04 |
128 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_TIC 0x08 |
129 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_SENSE_ID 0xe4 |
130 | 1e17c2c1 | Alexander Graf | |
131 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_SET_VQ 0x13 |
132 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_VDEV_RESET 0x33 |
133 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_READ_FEAT 0x12 |
134 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_WRITE_FEAT 0x11 |
135 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_READ_CONF 0x22 |
136 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_WRITE_CONF 0x21 |
137 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_WRITE_STATUS 0x31 |
138 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_SET_IND 0x43 |
139 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_SET_CONF_IND 0x53 |
140 | 1e17c2c1 | Alexander Graf | #define CCW_CMD_READ_VQ_CONF 0x32 |
141 | 1e17c2c1 | Alexander Graf | |
142 | 1e17c2c1 | Alexander Graf | /*
|
143 | 1e17c2c1 | Alexander Graf | * Command-mode operation request block
|
144 | 1e17c2c1 | Alexander Graf | */
|
145 | 1e17c2c1 | Alexander Graf | struct cmd_orb {
|
146 | 1e17c2c1 | Alexander Graf | __u32 intparm; /* interruption parameter */
|
147 | 1e17c2c1 | Alexander Graf | __u32 key:4; /* flags, like key, suspend control, etc. */ |
148 | 1e17c2c1 | Alexander Graf | __u32 spnd:1; /* suspend control */ |
149 | 1e17c2c1 | Alexander Graf | __u32 res1:1; /* reserved */ |
150 | 1e17c2c1 | Alexander Graf | __u32 mod:1; /* modification control */ |
151 | 1e17c2c1 | Alexander Graf | __u32 sync:1; /* synchronize control */ |
152 | 1e17c2c1 | Alexander Graf | __u32 fmt:1; /* format control */ |
153 | 1e17c2c1 | Alexander Graf | __u32 pfch:1; /* prefetch control */ |
154 | 1e17c2c1 | Alexander Graf | __u32 isic:1; /* initial-status-interruption control */ |
155 | 1e17c2c1 | Alexander Graf | __u32 alcc:1; /* address-limit-checking control */ |
156 | 1e17c2c1 | Alexander Graf | __u32 ssic:1; /* suppress-suspended-interr. control */ |
157 | 1e17c2c1 | Alexander Graf | __u32 res2:1; /* reserved */ |
158 | 1e17c2c1 | Alexander Graf | __u32 c64:1; /* IDAW/QDIO 64 bit control */ |
159 | 1e17c2c1 | Alexander Graf | __u32 i2k:1; /* IDAW 2/4kB block size control */ |
160 | 1e17c2c1 | Alexander Graf | __u32 lpm:8; /* logical path mask */ |
161 | 1e17c2c1 | Alexander Graf | __u32 ils:1; /* incorrect length */ |
162 | 1e17c2c1 | Alexander Graf | __u32 zero:6; /* reserved zeros */ |
163 | 1e17c2c1 | Alexander Graf | __u32 orbx:1; /* ORB extension control */ |
164 | 1e17c2c1 | Alexander Graf | __u32 cpa; /* channel program address */
|
165 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed, aligned(4)));
|
166 | 1e17c2c1 | Alexander Graf | |
167 | 1e17c2c1 | Alexander Graf | struct ciw {
|
168 | 1e17c2c1 | Alexander Graf | __u8 type; |
169 | 1e17c2c1 | Alexander Graf | __u8 command; |
170 | 1e17c2c1 | Alexander Graf | __u16 count; |
171 | 1e17c2c1 | Alexander Graf | }; |
172 | 1e17c2c1 | Alexander Graf | |
173 | 1e17c2c1 | Alexander Graf | /*
|
174 | 1e17c2c1 | Alexander Graf | * sense-id response buffer layout
|
175 | 1e17c2c1 | Alexander Graf | */
|
176 | 1e17c2c1 | Alexander Graf | struct senseid {
|
177 | 1e17c2c1 | Alexander Graf | /* common part */
|
178 | 1e17c2c1 | Alexander Graf | __u8 reserved; /* always 0x'FF' */
|
179 | 1e17c2c1 | Alexander Graf | __u16 cu_type; /* control unit type */
|
180 | 1e17c2c1 | Alexander Graf | __u8 cu_model; /* control unit model */
|
181 | 1e17c2c1 | Alexander Graf | __u16 dev_type; /* device type */
|
182 | 1e17c2c1 | Alexander Graf | __u8 dev_model; /* device model */
|
183 | 1e17c2c1 | Alexander Graf | __u8 unused; /* padding byte */
|
184 | 1e17c2c1 | Alexander Graf | /* extended part */
|
185 | 1e17c2c1 | Alexander Graf | struct ciw ciw[62]; |
186 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed, aligned(4)));
|
187 | 1e17c2c1 | Alexander Graf | |
188 | 1e17c2c1 | Alexander Graf | /* interruption response block */
|
189 | 1e17c2c1 | Alexander Graf | struct irb {
|
190 | 1e17c2c1 | Alexander Graf | struct scsw scsw;
|
191 | 1e17c2c1 | Alexander Graf | __u32 esw[5];
|
192 | 1e17c2c1 | Alexander Graf | __u32 ecw[8];
|
193 | 1e17c2c1 | Alexander Graf | __u32 emw[8];
|
194 | 1e17c2c1 | Alexander Graf | } __attribute__ ((packed, aligned(4)));
|
195 | 1e17c2c1 | Alexander Graf | |
196 | 1e17c2c1 | Alexander Graf | /*
|
197 | 1e17c2c1 | Alexander Graf | * Some S390 specific IO instructions as inline
|
198 | 1e17c2c1 | Alexander Graf | */
|
199 | 1e17c2c1 | Alexander Graf | |
200 | 1e17c2c1 | Alexander Graf | static inline int stsch_err(struct subchannel_id schid, struct schib *addr) |
201 | 1e17c2c1 | Alexander Graf | { |
202 | 1e17c2c1 | Alexander Graf | register struct subchannel_id reg1 asm ("1") = schid; |
203 | 1e17c2c1 | Alexander Graf | int ccode = -EIO;
|
204 | 1e17c2c1 | Alexander Graf | |
205 | 1e17c2c1 | Alexander Graf | asm volatile( |
206 | 1e17c2c1 | Alexander Graf | " stsch 0(%3)\n"
|
207 | 1e17c2c1 | Alexander Graf | "0: ipm %0\n"
|
208 | 1e17c2c1 | Alexander Graf | " srl %0,28\n"
|
209 | 1e17c2c1 | Alexander Graf | "1:\n"
|
210 | 1e17c2c1 | Alexander Graf | : "+d" (ccode), "=m" (*addr) |
211 | 1e17c2c1 | Alexander Graf | : "d" (reg1), "a" (addr) |
212 | 1e17c2c1 | Alexander Graf | : "cc");
|
213 | 1e17c2c1 | Alexander Graf | return ccode;
|
214 | 1e17c2c1 | Alexander Graf | } |
215 | 1e17c2c1 | Alexander Graf | |
216 | 1e17c2c1 | Alexander Graf | static inline int msch(struct subchannel_id schid, struct schib *addr) |
217 | 1e17c2c1 | Alexander Graf | { |
218 | 1e17c2c1 | Alexander Graf | register struct subchannel_id reg1 asm ("1") = schid; |
219 | 1e17c2c1 | Alexander Graf | int ccode;
|
220 | 1e17c2c1 | Alexander Graf | |
221 | 1e17c2c1 | Alexander Graf | asm volatile( |
222 | 1e17c2c1 | Alexander Graf | " msch 0(%2)\n"
|
223 | 1e17c2c1 | Alexander Graf | " ipm %0\n"
|
224 | 1e17c2c1 | Alexander Graf | " srl %0,28"
|
225 | 1e17c2c1 | Alexander Graf | : "=d" (ccode)
|
226 | 1e17c2c1 | Alexander Graf | : "d" (reg1), "a" (addr), "m" (*addr) |
227 | 1e17c2c1 | Alexander Graf | : "cc");
|
228 | 1e17c2c1 | Alexander Graf | return ccode;
|
229 | 1e17c2c1 | Alexander Graf | } |
230 | 1e17c2c1 | Alexander Graf | |
231 | 1e17c2c1 | Alexander Graf | static inline int msch_err(struct subchannel_id schid, struct schib *addr) |
232 | 1e17c2c1 | Alexander Graf | { |
233 | 1e17c2c1 | Alexander Graf | register struct subchannel_id reg1 asm ("1") = schid; |
234 | 1e17c2c1 | Alexander Graf | int ccode = -EIO;
|
235 | 1e17c2c1 | Alexander Graf | |
236 | 1e17c2c1 | Alexander Graf | asm volatile( |
237 | 1e17c2c1 | Alexander Graf | " msch 0(%2)\n"
|
238 | 1e17c2c1 | Alexander Graf | "0: ipm %0\n"
|
239 | 1e17c2c1 | Alexander Graf | " srl %0,28\n"
|
240 | 1e17c2c1 | Alexander Graf | "1:\n"
|
241 | 1e17c2c1 | Alexander Graf | : "+d" (ccode)
|
242 | 1e17c2c1 | Alexander Graf | : "d" (reg1), "a" (addr), "m" (*addr) |
243 | 1e17c2c1 | Alexander Graf | : "cc");
|
244 | 1e17c2c1 | Alexander Graf | return ccode;
|
245 | 1e17c2c1 | Alexander Graf | } |
246 | 1e17c2c1 | Alexander Graf | |
247 | 1e17c2c1 | Alexander Graf | static inline int tsch(struct subchannel_id schid, struct irb *addr) |
248 | 1e17c2c1 | Alexander Graf | { |
249 | 1e17c2c1 | Alexander Graf | register struct subchannel_id reg1 asm ("1") = schid; |
250 | 1e17c2c1 | Alexander Graf | int ccode;
|
251 | 1e17c2c1 | Alexander Graf | |
252 | 1e17c2c1 | Alexander Graf | asm volatile( |
253 | 1e17c2c1 | Alexander Graf | " tsch 0(%3)\n"
|
254 | 1e17c2c1 | Alexander Graf | " ipm %0\n"
|
255 | 1e17c2c1 | Alexander Graf | " srl %0,28"
|
256 | 1e17c2c1 | Alexander Graf | : "=d" (ccode), "=m" (*addr) |
257 | 1e17c2c1 | Alexander Graf | : "d" (reg1), "a" (addr) |
258 | 1e17c2c1 | Alexander Graf | : "cc");
|
259 | 1e17c2c1 | Alexander Graf | return ccode;
|
260 | 1e17c2c1 | Alexander Graf | } |
261 | 1e17c2c1 | Alexander Graf | |
262 | 1e17c2c1 | Alexander Graf | static inline int ssch(struct subchannel_id schid, struct cmd_orb *addr) |
263 | 1e17c2c1 | Alexander Graf | { |
264 | 1e17c2c1 | Alexander Graf | register struct subchannel_id reg1 asm("1") = schid; |
265 | 1e17c2c1 | Alexander Graf | int ccode = -EIO;
|
266 | 1e17c2c1 | Alexander Graf | |
267 | 1e17c2c1 | Alexander Graf | asm volatile( |
268 | 1e17c2c1 | Alexander Graf | " ssch 0(%2)\n"
|
269 | 1e17c2c1 | Alexander Graf | "0: ipm %0\n"
|
270 | 1e17c2c1 | Alexander Graf | " srl %0,28\n"
|
271 | 1e17c2c1 | Alexander Graf | "1:\n"
|
272 | 1e17c2c1 | Alexander Graf | : "+d" (ccode)
|
273 | 1e17c2c1 | Alexander Graf | : "d" (reg1), "a" (addr), "m" (*addr) |
274 | 1e17c2c1 | Alexander Graf | : "cc", "memory"); |
275 | 1e17c2c1 | Alexander Graf | return ccode;
|
276 | 1e17c2c1 | Alexander Graf | } |
277 | 1e17c2c1 | Alexander Graf | |
278 | 1e17c2c1 | Alexander Graf | static inline int csch(struct subchannel_id schid) |
279 | 1e17c2c1 | Alexander Graf | { |
280 | 1e17c2c1 | Alexander Graf | register struct subchannel_id reg1 asm("1") = schid; |
281 | 1e17c2c1 | Alexander Graf | int ccode;
|
282 | 1e17c2c1 | Alexander Graf | |
283 | 1e17c2c1 | Alexander Graf | asm volatile( |
284 | 1e17c2c1 | Alexander Graf | " csch\n"
|
285 | 1e17c2c1 | Alexander Graf | " ipm %0\n"
|
286 | 1e17c2c1 | Alexander Graf | " srl %0,28"
|
287 | 1e17c2c1 | Alexander Graf | : "=d" (ccode)
|
288 | 1e17c2c1 | Alexander Graf | : "d" (reg1)
|
289 | 1e17c2c1 | Alexander Graf | : "cc");
|
290 | 1e17c2c1 | Alexander Graf | return ccode;
|
291 | 1e17c2c1 | Alexander Graf | } |
292 | 1e17c2c1 | Alexander Graf | |
293 | 1e17c2c1 | Alexander Graf | static inline int tpi(struct tpi_info *addr) |
294 | 1e17c2c1 | Alexander Graf | { |
295 | 1e17c2c1 | Alexander Graf | int ccode;
|
296 | 1e17c2c1 | Alexander Graf | |
297 | 1e17c2c1 | Alexander Graf | asm volatile( |
298 | 1e17c2c1 | Alexander Graf | " tpi 0(%2)\n"
|
299 | 1e17c2c1 | Alexander Graf | " ipm %0\n"
|
300 | 1e17c2c1 | Alexander Graf | " srl %0,28"
|
301 | 1e17c2c1 | Alexander Graf | : "=d" (ccode), "=m" (*addr) |
302 | 1e17c2c1 | Alexander Graf | : "a" (addr)
|
303 | 1e17c2c1 | Alexander Graf | : "cc");
|
304 | 1e17c2c1 | Alexander Graf | return ccode;
|
305 | 1e17c2c1 | Alexander Graf | } |
306 | 1e17c2c1 | Alexander Graf | |
307 | 1e17c2c1 | Alexander Graf | static inline int chsc(void *chsc_area) |
308 | 1e17c2c1 | Alexander Graf | { |
309 | 1e17c2c1 | Alexander Graf | typedef struct { char _[4096]; } addr_type; |
310 | 1e17c2c1 | Alexander Graf | int cc;
|
311 | 1e17c2c1 | Alexander Graf | |
312 | 1e17c2c1 | Alexander Graf | asm volatile( |
313 | 1e17c2c1 | Alexander Graf | " .insn rre,0xb25f0000,%2,0\n"
|
314 | 1e17c2c1 | Alexander Graf | " ipm %0\n"
|
315 | 1e17c2c1 | Alexander Graf | " srl %0,28\n"
|
316 | 1e17c2c1 | Alexander Graf | : "=d" (cc), "=m" (*(addr_type *) chsc_area) |
317 | 1e17c2c1 | Alexander Graf | : "d" (chsc_area), "m" (*(addr_type *) chsc_area) |
318 | 1e17c2c1 | Alexander Graf | : "cc");
|
319 | 1e17c2c1 | Alexander Graf | return cc;
|
320 | 1e17c2c1 | Alexander Graf | } |
321 | 1e17c2c1 | Alexander Graf | |
322 | 1e17c2c1 | Alexander Graf | #endif /* CIO_H */ |