Mercurial > sarpn
annotate arch/io.c @ 16:3d69c66b2610
arch: last fixup, now things seem to work as expected
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Fri, 08 Apr 2011 09:44:57 -0400 |
parents | c75be274ce23 |
children | f219716c6b54 |
rev | line source |
---|---|
12
40af39d064fa
Refactor the arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
9
diff
changeset
|
1 #include "channel.h" |
40af39d064fa
Refactor the arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
9
diff
changeset
|
2 #include <die.h> |
0 | 3 |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
4 u32 find_dev(int devnum) |
0 | 5 { |
6 struct schib schib; | |
7 u32 sch; | |
8 | |
9 for(sch=0x10000; sch<=0x1ffff; sch++) { | |
10 if (store_sch(sch, &schib)) | |
11 continue; | |
12 | |
13 if (!schib.pmcw.v) | |
14 continue; | |
15 | |
16 if (schib.pmcw.dev_num != devnum) | |
17 continue; | |
18 | |
14
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
19 if (!schib.pmcw.e) { |
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
20 schib.pmcw.e = 1; |
0 | 21 |
14
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
22 if (modify_sch(sch, &schib)) |
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
23 continue; |
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
24 } |
0 | 25 |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
26 return sch; |
0 | 27 } |
28 | |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
29 return 0; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
30 } |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
31 |
14
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
32 extern void IOINT(void); |
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
33 |
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
34 void init_io_int() |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
35 { |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
36 struct psw psw; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
37 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
38 // set up the IO interrupt handler |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
39 psw.ea = 1; |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
40 psw.ba = 1; |
14
c75be274ce23
Now functioning arch code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
12
diff
changeset
|
41 psw.ptr = (u64) &IOINT; |
9
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
42 |
0451ffa1c3a0
Added FBA helper functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
4
diff
changeset
|
43 __builtin_memcpy(((void*) 0x1f0), &psw, sizeof(struct psw)); |
0 | 44 } |
16
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
45 |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
46 void wait_for_io_int() |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
47 { |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
48 struct psw psw; |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
49 |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
50 __builtin_memset(&psw, 0, sizeof(struct psw)); |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
51 psw.io = 1; |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
52 psw.ea = 1; |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
53 psw.ba = 1; |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
54 psw.w = 1; |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
55 |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
56 asm volatile( |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
57 " larl %%r1,0f\n" |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
58 " stg %%r1,%0\n" |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
59 " lpswe %1\n" |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
60 "0:\n" |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
61 : /* output */ |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
62 "=m" (psw.ptr) |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
63 : /* input */ |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
64 "m" (psw) |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
65 : /* clobbered */ |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
66 "r1", "r2" |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
67 ); |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
68 |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
69 if (*((u8*) 0x210) & 0x04) |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
70 return; |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
71 |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
72 die(); |
3d69c66b2610
arch: last fixup, now things seem to work as expected
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
73 } |