xref: /plan9-contrib/sys/src/9/ppc/msaturn.c (revision fe853e2326f51910bb38886e9bfc22ecdef993d7)
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