FreeBSD/Linux Kernel Cross Reference
sys/ppc/msaturn.c
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "io.h"
7 #include "../port/error.h"
8 #include "msaturn.h"
9
10 enum {
11 Isr = Saturn + 0x0400,
12 Ipol = Saturn + 0x0404,
13 Issr = Saturn + 0x0500,
14 Ier = Saturn + 0x0504,
15 Ipri = Saturn + 0x0600,
16 Ithresh = Saturn + 0x0706,
17 #define Iar Ithresh
18 };
19
20 enum{
21 Syscfg = Saturn + 0x0100,
22 };
23
24 static uchar intprio[] = {
25 Vecuart0, // uart 0
26 Vecunused, // uart 1
27 Vecunused, // sint
28 Vectimer0, // timer 0
29 Vecunused, // timer 1
30 Vecether, // ethernet
31 Vecunused, // tea
32 Vecunused, // irq0
33 Vecunused, // irq1
34 Vecunused, // irq2
35 Vecunused, // irq3
36 Vecunused, // irq4
37 Vecunused, // irq5
38 Vecunused, // irq6
39 Vecunused, // irq7
40 Vecunused, // irq8
41 };
42
43 void
44 intend(int)
45 {
46 }
47
48 void
49 hwintrinit(void)
50 {
51 int i;
52
53 *(ulong*)Ier=0;
54
55 for(i=0; i<nelem(intprio)/2; i++)
56 ((uchar*)Ipri)[i] = (intprio[2*i]<<4)|intprio[2*i+1];
57 }
58
59 int
60 vectorenable(Vctl*v)
61 {
62 int i;
63
64 for(i=0; i<nelem(intprio); i++)
65 if(v->irq==intprio[i]){
66 *(ulong*)Ier |= 1<<(31-i);
67 return v->irq;
68 }
69 print("intrenable: cannot enable intr %d\n", v->irq);
70 return -1;
71 }
72
73 void
74 vectordisable(Vctl*v)
75 {
76 int i;
77
78 for(i=0; i<nelem(intprio); i++)
79 if(v->irq==intprio[i]){
80 *(ulong*)Ier &= ~(1<<(31-i));
81 return;
82 }
83 }
84
85 int
86 intvec(void)
87 {
88 ushort iar;
89 int i;
90
91 iar = *(ushort*)Iar; // push(prio) onto stack
92 for(i=0; i<nelem(intprio); i++)
93 if(iar==intprio[i])
94 return iar;
95
96 iprint("saturnint: no vector %d\n", iar);
97 intack();
98 return -1;
99 }
100
101 void
102 intack(void)
103 {
104 *(ushort*)Ithresh = 0; // pop(prio) stack
105 }
106
107 void
108 machinit(void)
109 {
110 int rrate;
111 ulong hid;
112 extern char* plan9inistr;
113 ulong l2cr;
114
115 memset(m, 0, sizeof(*m));
116 m->cputype = getpvr()>>16;
117 m->imap = (Imap*)INTMEM;
118
119 m->loopconst = 1096;
120
121 rrate = (*(ushort*)Syscfg >> 6) & 3;
122 switch(rrate){
123 case 0:
124 m->bushz = 66666666;
125 break;
126 case 1:
127 m->bushz = 83333333;
128 break;
129 case 2:
130 m->bushz = 100000000;
131 break;
132 case 3:
133 m->bushz = 133333333;
134 break;
135 }
136
137 if(getpll() == 0x80000000)
138 m->cpuhz = 300000000;
139 else
140 m->cpuhz = 200000000; /* 750FX? */
141 m->cyclefreq = m->bushz / 4;
142
143 active.machs = 1;
144 active.exiting = 0;
145
146 putmsr(getmsr() | MSR_ME);
147
148 dcflush((void*)KZERO, 0x2000000);
149 l2cr = getl2cr();
150 putl2cr(l2cr|BIT(10));
151
152 kfpinit();
153
154 hid=gethid0();
155 hid |= BIT(28)|BIT(26)|BIT(24);
156 puthid0(hid);
157
158 plan9inistr =
159 "console=0\n"
160 "ether0=type=saturn\n"
161 "fs=135.104.9.42\n"
162 "auth=135.104.9.7\n"
163 "authdom=cs.bell-labs.com\n"
164 "sys=ucu\n"
165 "ntp=135.104.9.52\n";
166 }
167
168 void
169 sharedseginit(void)
170 {
171 }
172
173 void
174 trapinit(void)
175 {
176 int i;
177
178 for(i = 0x0; i < 0x2000; i += 0x100)
179 sethvec(i, trapvec);
180
181 dcflush(KADDR(0), 0x2000);
182 icflush(KADDR(0), 0x2000);
183
184 putmsr(getmsr() & ~MSR_IP);
185 }
186
187 void
188 reboot(void*, void*, ulong)
189 {
190 }
Cache object: 9c27ced6513353413a36b2dd5ef90eec
|