Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}