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