Mercurial > sarpn
annotate arch/io.c @ 9:0451ffa1c3a0
Added FBA helper functions
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Wed, 06 Apr 2011 16:23:49 -0400 |
parents | e2b1d6184703 |
children | 40af39d064fa |
rev | line source |
---|---|
0 | 1 /* |
2 * Tables taken from Linux's arch/s390/kernel/ebcdic.c | |
3 */ | |
4 | |
5 /* | |
6 * ASCII (IBM PC 437) -> EBCDIC 037 | |
7 */ | |
8 static u8 ascii2ebcdic_table[256] = | |
9 { | |
10 /*00 NUL SOH STX ETX EOT ENQ ACK BEL */ | |
11 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, | |
12 /*08 BS HT LF VT FF CR SO SI */ | |
13 /* ->NL */ | |
14 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
15 /*10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ | |
16 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, | |
17 /*18 CAN EM SUB ESC FS GS RS US */ | |
18 /* ->IGS ->IRS ->IUS */ | |
19 0x18, 0x19, 0x3F, 0x27, 0x22, 0x1D, 0x1E, 0x1F, | |
20 /*20 SP ! " # $ % & ' */ | |
21 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, | |
22 /*28 ( ) * + , - . / */ | |
23 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, | |
24 /*30 0 1 2 3 4 5 6 7 */ | |
25 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, | |
26 /*38 8 9 : ; < = > ? */ | |
27 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, | |
28 /*40 @ A B C D E F G */ | |
29 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, | |
30 /*48 H I J K L M N O */ | |
31 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, | |
32 /*50 P Q R S T U V W */ | |
33 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, | |
34 /*58 X Y Z [ \ ] ^ _ */ | |
35 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D, | |
36 /*60 ` a b c d e f g */ | |
37 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, | |
38 /*68 h i j k l m n o */ | |
39 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, | |
40 /*70 p q r s t u v w */ | |
41 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, | |
42 /*78 x y z { | } ~ DL */ | |
43 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, | |
44 /*80*/ | |
45 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
46 /*88*/ | |
47 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
48 /*90*/ | |
49 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
50 /*98*/ | |
51 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
52 /*A0*/ | |
53 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
54 /*A8*/ | |
55 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
56 /*B0*/ | |
57 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
58 /*B8*/ | |
59 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
60 /*C0*/ | |
61 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
62 /*C8*/ | |
63 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
64 /*D0*/ | |
65 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
66 /*D8*/ | |
67 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
68 /*E0 sz */ | |
69 0x3F, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
70 /*E8*/ | |
71 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
72 /*F0*/ | |
73 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, | |
74 /*F8*/ | |
75 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF | |
76 }; | |
77 | |
78 /* | |
79 * EBCDIC 037 -> ASCII (IBM PC 437) | |
80 */ | |
81 u8 ebcdic2ascii_table[256] = | |
82 { | |
83 /* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ | |
84 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, | |
85 /* 0x08 -GE -SPS -RPT VT FF CR SO SI */ | |
86 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, | |
87 /* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC | |
88 -ENP ->LF */ | |
89 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, | |
90 /* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB | |
91 -IUS */ | |
92 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, | |
93 /* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC | |
94 -INP */ | |
95 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, | |
96 /* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL | |
97 -SW */ | |
98 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, | |
99 /* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */ | |
100 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, | |
101 /* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */ | |
102 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, | |
103 /* 0x40 SP RSP ä ---- */ | |
104 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, | |
105 /* 0x48 . < ( + | */ | |
106 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, | |
107 /* 0x50 & ---- */ | |
108 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, | |
109 /* 0x58 ß ! $ * ) ; */ | |
110 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA, | |
111 /* 0x60 - / ---- Ä ---- ---- ---- */ | |
112 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F, | |
113 /* 0x68 ---- , % _ > ? */ | |
114 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, | |
115 /* 0x70 ---- ---- ---- ---- ---- ---- ---- */ | |
116 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, | |
117 /* 0x78 * ` : # @ ' = " */ | |
118 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, | |
119 /* 0x80 * a b c d e f g */ | |
120 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, | |
121 /* 0x88 h i ---- ---- ---- */ | |
122 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, | |
123 /* 0x90 ° j k l m n o p */ | |
124 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, | |
125 /* 0x98 q r ---- ---- */ | |
126 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, | |
127 /* 0xA0 ~ s t u v w x */ | |
128 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, | |
129 /* 0xA8 y z ---- ---- ---- ---- */ | |
130 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, | |
131 /* 0xB0 ^ ---- § ---- */ | |
132 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, | |
133 /* 0xB8 ---- [ ] ---- ---- ---- ---- */ | |
134 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07, | |
135 /* 0xC0 { A B C D E F G */ | |
136 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, | |
137 /* 0xC8 H I ---- ö ---- */ | |
138 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, | |
139 /* 0xD0 } J K L M N O P */ | |
140 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, | |
141 /* 0xD8 Q R ---- ü */ | |
142 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, | |
143 /* 0xE0 \ S T U V W X */ | |
144 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, | |
145 /* 0xE8 Y Z ---- Ö ---- ---- ---- */ | |
146 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07, | |
147 /* 0xF0 0 1 2 3 4 5 6 7 */ | |
148 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, | |
149 /* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */ | |
150 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07 | |
151 }; | |
152 | |
153 /* | |
154 * Generic translate buffer function. | |
155 */ | |
156 static inline void __translate(u8 *buf, int len, const u8 *table) | |
157 { | |
158 asm volatile( | |
159 " sr %%r0,%%r0\n" /* test byte = 0 */ | |
160 " la %%r2,0(%0)\n" /* buffer */ | |
161 " lr %%r3,%2\n" /* length */ | |
162 " la %%r4,0(%1)\n" /* table */ | |
163 " tre %%r2,%%r4\n" | |
164 : /* output */ | |
165 : /* input */ | |
166 "a" (buf), | |
167 "a" (table), | |
168 "d" (len) | |
169 : /* clobbered */ | |
170 "cc", "r0", "r2", "r3", "r4" | |
171 ); | |
172 } | |
173 | |
174 #define ascii2ebcdic(buf, len) \ | |
175 __translate((buf), (len), ascii2ebcdic_table) | |
176 #define ebcdic2ascii(buf, len) \ | |
177 __translate((buf), (len), ebcdic2ascii_table) | |
178 | |
179 /* console I/O functions */ | |
180 | |
181 #define CON_LEN 132 | |
182 #define CON_DEV 0x0009 | |
183 | |
184 struct pmcw { | |
185 /* word 0 */ | |
186 u32 interrupt_param; /* Interruption Parameter */ | |
187 | |
188 /* word 1*/ | |
189 u8 __zero1:2, | |
190 isc:3, /* I/O-Interruption-Subclass Code */ | |
191 __zero2:3; | |
192 u8 e:1, /* Enabled */ | |
193 lm:2, /* Limit Mode */ | |
194 mm:2, /* Measurement-Mode Enable */ | |
195 d:1, /* Multipath Mode */ | |
196 t:1, /* Timing Facility */ | |
197 v:1; /* Device Number Valid */ | |
198 u16 dev_num; /* Device Number */ | |
199 | |
200 /* word 2 */ | |
201 u8 lpm; /* Logical-Path Mask */ | |
202 u8 pnom; /* Path-Not-Operational Mask */ | |
203 u8 lpum; /* Last-Path-Used Mask */ | |
204 u8 pim; /* Path-Installed Mask */ | |
205 | |
206 /* word 3 */ | |
207 u16 mbi; /* Measurement-Block Index */ | |
208 u8 pom; /* Path-Operational Mask */ | |
209 u8 pam; /* Path-Available Mask */ | |
210 | |
211 /* word 4 & 5 */ | |
212 u8 chpid[8]; /* Channel-Path Identifiers */ | |
213 | |
214 /* word 6 */ | |
215 u16 __zero3; | |
216 u16 __zero4:13, | |
217 f:1, /* Measurement Block Format Control */ | |
218 x:1, /* Extended Measurement Word Mode Enable */ | |
219 s:1; /* Concurrent Sense */ | |
220 }; | |
221 | |
222 struct scsw { | |
223 /* word 0 */ | |
224 u16 key:4, /* Subchannel key */ | |
225 s:1, /* Suspend control */ | |
226 l:1, /* ESW format */ | |
227 cc:2, /* Deferred condition code */ | |
228 f:1, /* Format */ | |
229 p:1, /* Prefetch */ | |
230 i:1, /* Initial-status interruption control */ | |
231 a:1, /* Address-limit-checking control */ | |
232 u:1, /* Supress-suspended interruption */ | |
233 z:1, /* Zero condition code */ | |
234 e:1, /* Extended control */ | |
235 n:1; /* Path no operational */ | |
236 u16 __zero:1, | |
237 fc:3, /* Function control */ | |
1
29382f5864ca
io: fix definition of SCSW
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
0
diff
changeset
|
238 ac:7, /* Activity control */ |
29382f5864ca
io: fix definition of SCSW
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
0
diff
changeset
|
239 sc:5; /* Status control */ |
0 | 240 |
241 /* word 1 */ | |
242 u32 addr; /* CCW Address */ | |
243 | |
244 /* word 2 */ | |
245 u8 dev_status; /* Device status */ | |
246 u8 sch_status; /* Subchannel status */ | |
247 u16 count; /* Count */ | |
248 } __attribute__((packed)); | |
249 | |
250 struct schib { | |
251 struct pmcw pmcw; /* Path Management Control Word */ | |
252 struct scsw scsw; /* Subchannel Status Word */ | |
253 u32 measure_block_1; | |
254 u32 measure_block_2; | |
255 u32 model_dep_area; | |
256 } __attribute__((packed,aligned(4))); | |
257 | |
258 struct orb { | |
259 /* word 0 */ | |
260 u32 param; /* Interruption Parameter */ | |
261 | |
262 /* word 1 */ | |
263 u8 key:4, /* Subchannel Key */ | |
264 s:1, /* Suspend */ | |
265 c:1, /* Streaming-Mode Control */ | |
266 m:1, /* Modification Control */ | |
267 y:1; /* Synchronization Control */ | |
268 u8 f:1, /* Format Control */ | |
269 p:1, /* Prefetch Control */ | |
270 i:1, /* Initial-Status-Interruption Control */ | |
271 a:1, /* Address-Limit-Checking control */ | |
272 u:1, /* Suppress-Suspend-Interruption Control */ | |
273 __zero1:1, | |
274 h:1, /* Format-2-IDAW Control */ | |
275 t:1; /* 2K-IDAW Control */ | |
276 u8 lpm; /* Logical-Path Mask */ | |
277 u8 l:1, /* Incorrect-Length-Suppression Mode */ | |
278 d:1, /* Modified-CCW-Indirect-Data-Addressing Control */ | |
279 __zero2:5, | |
280 x:1; /* ORB-Extension Control */ | |
281 | |
282 /* word 2 */ | |
283 u32 addr; /* Channel-Program Address */ | |
284 | |
285 /* word 3 */ | |
286 u8 css_prio; /* Channel-Subsystem Priority */ | |
287 u8 __reserved1; | |
288 u8 cu_prio; /* Control-Unit Priority */ | |
289 u8 __reserved2; | |
290 | |
291 /* word 4 - 7 */ | |
292 u32 __reserved3; | |
293 u32 __reserved4; | |
294 u32 __reserved5; | |
295 u32 __reserved6; | |
296 } __attribute__((packed,aligned(4))); | |
297 | |
298 struct ccw { | |
299 u8 cmd; /* Command code */ | |
300 u8 flags; /* Flags */ | |
301 u16 count; /* Count */ | |
302 u32 addr; /* Data Address */ | |
303 } __attribute__((packed,aligned(8))); | |
304 | |
305 struct psw { | |
306 u8 _zero0:1, | |
307 r:1, /* PER Mask (R) */ | |
308 _zero1:3, | |
309 t:1, /* DAT Mode (T) */ | |
310 io:1, /* I/O Mask (IO) */ | |
311 ex:1; /* External Mask (EX) */ | |
312 | |
313 u8 key:4, /* Key */ | |
314 _zero2:1, | |
315 m:1, /* Machine-Check Mask (M) */ | |
316 w:1, /* Wait State (W) */ | |
317 p:1; /* Problem State (P) */ | |
318 | |
319 u8 as:2, /* Address-Space Control (AS) */ | |
320 cc:2, /* Condition Code (CC) */ | |
321 prog_mask:4; /* Program Mask */ | |
322 | |
323 u8 _zero3:7, | |
324 ea:1; /* Extended Addressing (EA) */ | |
325 | |
326 u32 ba:1, /* Basic Addressing (BA) */ | |
327 _zero4:31; | |
328 | |
329 u64 ptr; | |
330 }; | |
331 | |
332 struct irb { | |
333 struct scsw scsw; /* Subchannel-Status */ | |
334 u32 w0a, w1a, w2a, w3a, w4a; | |
335 u32 w0b, w1b, w2b, w3b, w4b, w5b, w6b, w7b; | |
336 u32 w0c, w1c, w2c, w3c, w4c, w5c, w6c, w7c; | |
337 } __attribute__((packed,aligned(4))); | |
338 | |
339 static int init_cons; | |
340 static u32 consch; | |
341 | |
342 static struct irb irb; | |
343 static struct orb orb; | |
344 static struct ccw ccw; | |
345 | |
346 static inline int store_sch(u32 sch, struct schib *schib) | |
347 { | |
348 int cc; | |
349 | |
350 asm volatile( | |
351 "lr %%r1,%2\n" | |
352 "stsch %1\n" | |
353 "ipm %0\n" | |
354 "srl %0,28\n" | |
355 : /* output */ | |
356 "=d" (cc), | |
357 "=Q" (*schib) | |
358 : /* input */ | |
359 "d" (sch) | |
360 : /* clobbered */ | |
361 "cc", "r1", "memory" | |
362 ); | |
363 | |
364 return cc; | |
365 } | |
366 | |
367 static inline int modify_sch(u32 sch, struct schib *schib) | |
368 { | |
369 int cc; | |
370 | |
371 asm volatile( | |
372 "lr %%r1,%1\n" | |
373 "msch 0(%2)\n" | |
374 "ipm %0\n" | |
375 "srl %0,28\n" | |
376 : /* output */ | |
377 "=d" (cc) | |
378 : /* input */ | |
379 "d" (sch), | |
380 "a" (schib) | |
381 : /* clobbered */ | |
382 "cc", "r1" | |
383 ); | |
384 | |
385 return cc; | |
386 } | |
387 | |
388 static inline int start_sch(u32 sch, struct orb *orb) | |
389 { | |
390 int cc; | |
391 | |
392 asm volatile( | |
393 " lr %%r1,%1\n" | |
394 " ssch 0(%2)\n" | |
395 " ipm %0\n" | |
396 " srl %0,28\n" | |
397 : /* output */ | |
398 "=d" (cc) | |
399 : /* input */ | |
400 "d" (sch), | |
401 "a" (orb) | |
402 : /* clobbered */ | |
403 "cc", "r1" | |
404 ); | |
405 | |
406 return cc; | |
407 } | |
408 | |
409 #define die() do { \ | |
410 asm volatile( \ | |
411 "SR %r1, %r1 # not used, but should be zero\n" \ | |
412 "SR %r3, %r3 # CPU Address\n" \ | |
413 "SIGP %r1, %r3, 0x05 # Signal, order 0x05\n" \ | |
414 ); \ | |
415 for(;;); \ | |
416 } while(0) | |
417 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
418 u32 find_dev(int devnum) |
0 | 419 { |
420 struct schib schib; | |
421 u32 sch; | |
422 | |
423 for(sch=0x10000; sch<=0x1ffff; sch++) { | |
424 if (store_sch(sch, &schib)) | |
425 continue; | |
426 | |
427 if (!schib.pmcw.v) | |
428 continue; | |
429 | |
430 if (schib.pmcw.dev_num != devnum) | |
431 continue; | |
432 | |
433 schib.pmcw.e = 1; | |
434 | |
435 if (modify_sch(sch, &schib)) | |
436 continue; | |
437 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
438 return sch; |
0 | 439 } |
440 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
441 return 0; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
442 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
443 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
444 static void enable_cons(int devnum) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
445 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
446 struct psw psw; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
447 u32 sch; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
448 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
449 sch = find_dev(devnum); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
450 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
451 if (!sch) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
452 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
453 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
454 // found it |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
455 init_cons = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
456 consch = sch; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
457 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
458 // set up the IO interrupt handler |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
459 psw.ea = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
460 psw.ba = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
461 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
462 asm volatile( |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
463 " larl %%r1,0f\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
464 " stg %%r1,%0\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
465 " brc 15,1f\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
466 /* IO handler code begins */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
467 "0:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
468 " l %%r1,0xb8\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
469 " larl %%r2,irb\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
470 " tsch 0(%%r2)\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
471 " l %%r1,5(%%r2)\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
472 " nill %%r1,0x04\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
473 " brc 8,2f\n" // done? |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
474 " lg %%r1,0x178\n" // yes. |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
475 " bcr 15,%%r1\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
476 "2:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
477 " l %%r1,5(%%r2)\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
478 " nill %%r1,0x80\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
479 " brc 8,3f\n" // attention? |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
480 " lg %%r1,0x178\n" // yes. |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
481 " bcr 15,%%r1\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
482 "3:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
483 " lpswe 0x170\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
484 /* IO handler code ends */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
485 "1:\n" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
486 : /* output */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
487 "=m" (psw.ptr), |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
488 "=m" (irb) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
489 : /* input */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
490 "a" (&irb) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
491 : /* clobbered */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
492 "r1", "r2" |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
493 ); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
494 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
495 __builtin_memcpy(((void*) 0x1f0), &psw, sizeof(struct psw)); |
0 | 496 } |
497 | |
498 static inline void wait_for_io_int() | |
499 { | |
500 struct psw psw; | |
501 | |
502 __builtin_memset(&psw, 0, sizeof(struct psw)); | |
503 psw.io = 1; | |
504 psw.ea = 1; | |
505 psw.ba = 1; | |
506 psw.w = 1; | |
507 | |
508 asm volatile( | |
509 " larl %%r1,0f\n" | |
510 " stg %%r1,%0\n" | |
511 " lpswe %1\n" | |
512 "0:\n" | |
513 : /* output */ | |
514 "=m" (psw.ptr) | |
515 : /* input */ | |
516 "m" (psw) | |
517 : /* clobbered */ | |
518 "r1", "r2" | |
519 ); | |
520 } | |
521 | |
522 int putline(char *buf, int len) | |
523 { | |
524 char data[CON_LEN]; | |
525 | |
526 if (!init_cons) | |
527 enable_cons(CON_DEV); | |
528 | |
529 if ((len <= 0) || (len > CON_LEN)) | |
530 return -1; | |
531 | |
532 __builtin_memcpy(data, buf, len); | |
533 ascii2ebcdic((u8*) data, len); | |
534 | |
535 ccw.cmd = 0x01; | |
536 ccw.flags = 0; | |
537 ccw.count = len; | |
538 ccw.addr = (u32) (u64) data; | |
539 | |
540 __builtin_memset(&orb, 0, sizeof(struct orb)); | |
541 orb.lpm = 0xff; | |
542 orb.addr = (u32) (u64) &ccw; | |
543 orb.f = 1; | |
544 | |
545 if (start_sch(consch, &orb)) | |
546 die(); | |
547 | |
548 wait_for_io_int(); | |
549 | |
550 return len; | |
551 } | |
552 | |
553 int getline(char *buf, int len) | |
554 { | |
4
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
555 int i; |
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
556 |
0 | 557 if (!init_cons) |
558 enable_cons(CON_DEV); | |
559 | |
560 if ((len <= 0) || (len > CON_LEN)) | |
561 return -1; | |
562 | |
563 wait_for_io_int(); | |
564 | |
4
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
565 __builtin_memset(buf, 0, len); |
0 | 566 ccw.cmd = 0x0a; |
567 ccw.flags = 0x20; | |
568 ccw.count = len; | |
569 ccw.addr = (u32) (u64) buf; | |
570 | |
571 __builtin_memset(&orb, 0, sizeof(struct orb)); | |
572 orb.lpm = 0xff; | |
573 orb.addr = (u32) (u64) &ccw; | |
574 orb.f = 1; | |
575 | |
576 if (start_sch(consch, &orb)) | |
577 die(); | |
578 | |
579 wait_for_io_int(); | |
580 | |
4
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
581 for(i=0; i<len; i++) |
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
582 if (!buf[i]) |
0 | 583 break; |
584 | |
4
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
585 if (i) |
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
586 ebcdic2ascii((u8*) buf, i); |
0 | 587 |
4
e2b1d6184703
getline: don't touch bytes past the end of the buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
2
diff
changeset
|
588 return i; |
0 | 589 } |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
590 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
591 #define FBA_BLK_SIZE 512 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
592 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
593 #define DASD_FBA_WRITE 0x41 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
594 #define DASD_FBA_READ 0x42 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
595 #define DASD_FBA_LOCATE_RECORD 0x43 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
596 #define DASD_FBA_DEFINE_EXTENT 0x63 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
597 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
598 enum op_type { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
599 WRITE = 0, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
600 READ, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
601 }; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
602 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
603 struct fba_DE_data { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
604 u8 perm:2, /* Permissions on this extent */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
605 __zero0:2, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
606 da:1, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
607 diag:1, /* allow diagnose */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
608 __zero1:2; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
609 u8 __zero3; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
610 u16 blksize; /* Blocksize */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
611 u32 ext_loc; /* Extent locator */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
612 u32 ext_beg; /* logical number of block 0 in extent */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
613 u32 ext_end; /* logocal number of last block in extent */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
614 }; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
615 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
616 struct fba_LO_data { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
617 u8 zero:4, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
618 cmd:4; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
619 u8 aux; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
620 u16 count; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
621 u32 blkno; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
622 }; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
623 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
624 /* build a Define-Extent CCW */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
625 static void fba_define_extent(struct ccw *ccw, struct fba_DE_data *data, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
626 enum op_type rw, u16 blksize, u32 blkno, u32 len) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
627 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
628 ccw->cmd = DASD_FBA_DEFINE_EXTENT; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
629 ccw->count = 0x10; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
630 ccw->addr = (u32) (u64) data; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
631 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
632 __builtin_memset(data, 0, sizeof(struct fba_DE_data)); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
633 switch(rw) { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
634 case WRITE: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
635 data->perm = 0x00; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
636 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
637 case READ: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
638 data->perm = 0x01; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
639 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
640 default: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
641 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
642 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
643 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
644 data->blksize = blksize; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
645 data->ext_loc = blkno; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
646 data->ext_end = len - 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
647 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
648 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
649 /* build a Locate-Record CCW */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
650 static void fba_locate_record(struct ccw *ccw, struct fba_LO_data *data, |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
651 enum op_type rw, u32 blkno, u32 len) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
652 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
653 ccw->cmd = DASD_FBA_LOCATE_RECORD; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
654 ccw->count = 0x08; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
655 ccw->addr = (u32) (u64) data; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
656 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
657 __builtin_memset(data, 0, sizeof(struct fba_LO_data)); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
658 switch(rw) { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
659 case WRITE: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
660 data->cmd = 0x05; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
661 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
662 case READ: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
663 data->cmd = 0x06; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
664 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
665 default: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
666 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
667 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
668 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
669 data->blkno = blkno; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
670 data->count = len; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
671 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
672 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
673 /* build a Read or Write CCW */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
674 static void fba_readwrite(struct ccw *ccw, void *ptr, enum op_type rw, u32 len) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
675 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
676 if(len > 0xffff) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
677 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
678 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
679 switch(rw) { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
680 case 0: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
681 ccw->cmd = DASD_FBA_WRITE; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
682 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
683 case 1: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
684 ccw->cmd = DASD_FBA_READ; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
685 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
686 default: |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
687 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
688 break; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
689 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
690 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
691 ccw->count = len; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
692 ccw->addr = (u32) (u64) ptr; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
693 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
694 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
695 /** |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
696 * fba_read_blk - read a block from an FBA device |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
697 * @dev: device to read from |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
698 * @blkno: block number to read |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
699 * @ptr: buffer to fill |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
700 * @sync: synchronous I/O |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
701 */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
702 static int __fba_readwrite_blk(u32 dev, u32 blkno, void *ptr, enum op_type dir) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
703 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
704 struct ccw ccw[3]; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
705 struct fba_DE_data defext; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
706 struct fba_LO_data locate; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
707 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
708 __builtin_memset(&orb, 0, sizeof(struct orb)); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
709 orb.lpm = 0xff; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
710 orb.addr = (u32) (u64) ccw; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
711 orb.f = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
712 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
713 __builtin_memset(ccw, 0, sizeof(ccw)); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
714 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
715 /* Define-Extent */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
716 fba_define_extent(&ccw[0], &defext, dir, FBA_BLK_SIZE, blkno, 1); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
717 ccw[0].flags |= 0x40; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
718 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
719 /* Locate */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
720 fba_locate_record(&ccw[1], &locate, dir, 0, 1); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
721 ccw[1].flags |= 0x40; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
722 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
723 /* Read */ |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
724 fba_readwrite(&ccw[2], ptr, dir, FBA_BLK_SIZE); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
725 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
726 if (start_sch(dev, &orb)) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
727 die(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
728 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
729 wait_for_io_int(); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
730 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
731 return 0; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
732 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
733 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
734 int fba_read_blk(u32 dev, u32 blkno, void *ptr) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
735 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
736 return __fba_readwrite_blk(dev, blkno, ptr, READ); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
737 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
738 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
739 int fba_write_blk(u32 dev, u32 blkno, void *ptr) |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
740 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
741 return __fba_readwrite_blk(dev, blkno, ptr, WRITE); |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
742 } |