xref: /plan9-contrib/sys/src/9/ppc/msaturn.c (revision fe853e2326f51910bb38886e9bfc22ecdef993d7)
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
intend(int)44 intend(int)
45 {
46 }
47 
48 void
hwintrinit(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
vectorenable(Vctl * v)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
vectordisable(Vctl * v)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
intvec(void)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
intack(void)102 intack(void)
103 {
104 	*(ushort*)Ithresh = 0;	// pop(prio) stack
105 }
106 
107 void
machinit(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
sharedseginit(void)169 sharedseginit(void)
170 {
171 }
172 
173 void
trapinit(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
reboot(void *,void *,ulong)188 reboot(void*, void*, ulong)
189 {
190 }
191