1458db832SDavid du Colombier #include "u.h"
2458db832SDavid du Colombier #include "../port/lib.h"
3458db832SDavid du Colombier #include "mem.h"
4458db832SDavid du Colombier #include "dat.h"
5458db832SDavid du Colombier #include "fns.h"
6458db832SDavid du Colombier #include "io.h"
7458db832SDavid du Colombier #include "../port/error.h"
8458db832SDavid du Colombier #include "msaturn.h"
9458db832SDavid du Colombier
10458db832SDavid du Colombier enum {
11458db832SDavid du Colombier Isr = Saturn + 0x0400,
12458db832SDavid du Colombier Ipol = Saturn + 0x0404,
13458db832SDavid du Colombier Issr = Saturn + 0x0500,
14458db832SDavid du Colombier Ier = Saturn + 0x0504,
15458db832SDavid du Colombier Ipri = Saturn + 0x0600,
16458db832SDavid du Colombier Ithresh = Saturn + 0x0706,
17458db832SDavid du Colombier #define Iar Ithresh
18458db832SDavid du Colombier };
19458db832SDavid du Colombier
20458db832SDavid du Colombier enum{
21458db832SDavid du Colombier Syscfg = Saturn + 0x0100,
22458db832SDavid du Colombier };
23458db832SDavid du Colombier
24458db832SDavid du Colombier static uchar intprio[] = {
25458db832SDavid du Colombier Vecuart0, // uart 0
26458db832SDavid du Colombier Vecunused, // uart 1
27458db832SDavid du Colombier Vecunused, // sint
28458db832SDavid du Colombier Vectimer0, // timer 0
29458db832SDavid du Colombier Vecunused, // timer 1
30458db832SDavid du Colombier Vecether, // ethernet
31458db832SDavid du Colombier Vecunused, // tea
32458db832SDavid du Colombier Vecunused, // irq0
33458db832SDavid du Colombier Vecunused, // irq1
34458db832SDavid du Colombier Vecunused, // irq2
35458db832SDavid du Colombier Vecunused, // irq3
36458db832SDavid du Colombier Vecunused, // irq4
37458db832SDavid du Colombier Vecunused, // irq5
38458db832SDavid du Colombier Vecunused, // irq6
39458db832SDavid du Colombier Vecunused, // irq7
40458db832SDavid du Colombier Vecunused, // irq8
41458db832SDavid du Colombier };
42458db832SDavid du Colombier
43458db832SDavid du Colombier void
intend(int)44458db832SDavid du Colombier intend(int)
45458db832SDavid du Colombier {
46458db832SDavid du Colombier }
47458db832SDavid du Colombier
48458db832SDavid du Colombier void
hwintrinit(void)49458db832SDavid du Colombier hwintrinit(void)
50458db832SDavid du Colombier {
51458db832SDavid du Colombier int i;
52458db832SDavid du Colombier
53458db832SDavid du Colombier *(ulong*)Ier=0;
54458db832SDavid du Colombier
55458db832SDavid du Colombier for(i=0; i<nelem(intprio)/2; i++)
56458db832SDavid du Colombier ((uchar*)Ipri)[i] = (intprio[2*i]<<4)|intprio[2*i+1];
57458db832SDavid du Colombier }
58458db832SDavid du Colombier
59458db832SDavid du Colombier int
vectorenable(Vctl * v)60458db832SDavid du Colombier vectorenable(Vctl*v)
61458db832SDavid du Colombier {
62458db832SDavid du Colombier int i;
63458db832SDavid du Colombier
64458db832SDavid du Colombier for(i=0; i<nelem(intprio); i++)
65458db832SDavid du Colombier if(v->irq==intprio[i]){
66458db832SDavid du Colombier *(ulong*)Ier |= 1<<(31-i);
67458db832SDavid du Colombier return v->irq;
68458db832SDavid du Colombier }
69458db832SDavid du Colombier print("intrenable: cannot enable intr %d\n", v->irq);
70458db832SDavid du Colombier return -1;
71458db832SDavid du Colombier }
72458db832SDavid du Colombier
73458db832SDavid du Colombier void
vectordisable(Vctl * v)74458db832SDavid du Colombier vectordisable(Vctl*v)
75458db832SDavid du Colombier {
76458db832SDavid du Colombier int i;
77458db832SDavid du Colombier
78458db832SDavid du Colombier for(i=0; i<nelem(intprio); i++)
79458db832SDavid du Colombier if(v->irq==intprio[i]){
80458db832SDavid du Colombier *(ulong*)Ier &= ~(1<<(31-i));
81458db832SDavid du Colombier return;
82458db832SDavid du Colombier }
83458db832SDavid du Colombier }
84458db832SDavid du Colombier
85458db832SDavid du Colombier int
intvec(void)86458db832SDavid du Colombier intvec(void)
87458db832SDavid du Colombier {
88458db832SDavid du Colombier ushort iar;
89458db832SDavid du Colombier int i;
90458db832SDavid du Colombier
91458db832SDavid du Colombier iar = *(ushort*)Iar; // push(prio) onto stack
92458db832SDavid du Colombier for(i=0; i<nelem(intprio); i++)
93458db832SDavid du Colombier if(iar==intprio[i])
94458db832SDavid du Colombier return iar;
95458db832SDavid du Colombier
96458db832SDavid du Colombier iprint("saturnint: no vector %d\n", iar);
97458db832SDavid du Colombier intack();
98458db832SDavid du Colombier return -1;
99458db832SDavid du Colombier }
100458db832SDavid du Colombier
101458db832SDavid du Colombier void
intack(void)102458db832SDavid du Colombier intack(void)
103458db832SDavid du Colombier {
104458db832SDavid du Colombier *(ushort*)Ithresh = 0; // pop(prio) stack
105458db832SDavid du Colombier }
106458db832SDavid du Colombier
107458db832SDavid du Colombier void
machinit(void)108458db832SDavid du Colombier machinit(void)
109458db832SDavid du Colombier {
110458db832SDavid du Colombier int rrate;
111458db832SDavid du Colombier ulong hid;
112458db832SDavid du Colombier extern char* plan9inistr;
113*fe853e23SDavid du Colombier ulong l2cr;
114458db832SDavid du Colombier
115458db832SDavid du Colombier memset(m, 0, sizeof(*m));
116458db832SDavid du Colombier m->cputype = getpvr()>>16;
117458db832SDavid du Colombier m->imap = (Imap*)INTMEM;
118458db832SDavid du Colombier
119458db832SDavid du Colombier m->loopconst = 1096;
120458db832SDavid du Colombier
121458db832SDavid du Colombier rrate = (*(ushort*)Syscfg >> 6) & 3;
122458db832SDavid du Colombier switch(rrate){
123458db832SDavid du Colombier case 0:
124458db832SDavid du Colombier m->bushz = 66666666;
125458db832SDavid du Colombier break;
126458db832SDavid du Colombier case 1:
127458db832SDavid du Colombier m->bushz = 83333333;
128458db832SDavid du Colombier break;
129458db832SDavid du Colombier case 2:
130458db832SDavid du Colombier m->bushz = 100000000;
131458db832SDavid du Colombier break;
132458db832SDavid du Colombier case 3:
133458db832SDavid du Colombier m->bushz = 133333333;
134458db832SDavid du Colombier break;
135458db832SDavid du Colombier }
136458db832SDavid du Colombier
137*fe853e23SDavid du Colombier if(getpll() == 0x80000000)
138*fe853e23SDavid du Colombier m->cpuhz = 300000000;
139*fe853e23SDavid du Colombier else
140*fe853e23SDavid du Colombier m->cpuhz = 200000000; /* 750FX? */
141*fe853e23SDavid du Colombier m->cyclefreq = m->bushz / 4;
142*fe853e23SDavid du Colombier
143458db832SDavid du Colombier active.machs = 1;
144458db832SDavid du Colombier active.exiting = 0;
145458db832SDavid du Colombier
146458db832SDavid du Colombier putmsr(getmsr() | MSR_ME);
147458db832SDavid du Colombier
148*fe853e23SDavid du Colombier dcflush((void*)KZERO, 0x2000000);
149*fe853e23SDavid du Colombier l2cr = getl2cr();
150*fe853e23SDavid du Colombier putl2cr(l2cr|BIT(10));
151458db832SDavid du Colombier
152458db832SDavid du Colombier kfpinit();
153458db832SDavid du Colombier
154458db832SDavid du Colombier hid=gethid0();
155458db832SDavid du Colombier hid |= BIT(28)|BIT(26)|BIT(24);
156458db832SDavid du Colombier puthid0(hid);
157458db832SDavid du Colombier
158458db832SDavid du Colombier plan9inistr =
159458db832SDavid du Colombier "console=0\n"
160458db832SDavid du Colombier "ether0=type=saturn\n"
161458db832SDavid du Colombier "fs=135.104.9.42\n"
162458db832SDavid du Colombier "auth=135.104.9.7\n"
163458db832SDavid du Colombier "authdom=cs.bell-labs.com\n"
164458db832SDavid du Colombier "sys=ucu\n"
165458db832SDavid du Colombier "ntp=135.104.9.52\n";
166458db832SDavid du Colombier }
167458db832SDavid du Colombier
168458db832SDavid du Colombier void
sharedseginit(void)169458db832SDavid du Colombier sharedseginit(void)
170458db832SDavid du Colombier {
171458db832SDavid du Colombier }
172458db832SDavid du Colombier
173458db832SDavid du Colombier void
trapinit(void)174458db832SDavid du Colombier trapinit(void)
175458db832SDavid du Colombier {
176458db832SDavid du Colombier int i;
177458db832SDavid du Colombier
178458db832SDavid du Colombier for(i = 0x0; i < 0x2000; i += 0x100)
179458db832SDavid du Colombier sethvec(i, trapvec);
180458db832SDavid du Colombier
181458db832SDavid du Colombier dcflush(KADDR(0), 0x2000);
182458db832SDavid du Colombier icflush(KADDR(0), 0x2000);
183458db832SDavid du Colombier
184458db832SDavid du Colombier putmsr(getmsr() & ~MSR_IP);
185458db832SDavid du Colombier }
186*fe853e23SDavid du Colombier
187*fe853e23SDavid du Colombier void
reboot(void *,void *,ulong)188*fe853e23SDavid du Colombier reboot(void*, void*, ulong)
189*fe853e23SDavid du Colombier {
190*fe853e23SDavid du Colombier }
191