191 lines
2.7 KiB
C
191 lines
2.7 KiB
C
#include "u.h"
|
|
#include "../port/lib.h"
|
|
#include "mem.h"
|
|
#include "dat.h"
|
|
#include "fns.h"
|
|
#include "io.h"
|
|
#include "../port/error.h"
|
|
#include "msaturn.h"
|
|
|
|
enum {
|
|
Isr = Saturn + 0x0400,
|
|
Ipol = Saturn + 0x0404,
|
|
Issr = Saturn + 0x0500,
|
|
Ier = Saturn + 0x0504,
|
|
Ipri = Saturn + 0x0600,
|
|
Ithresh = Saturn + 0x0706,
|
|
#define Iar Ithresh
|
|
};
|
|
|
|
enum{
|
|
Syscfg = Saturn + 0x0100,
|
|
};
|
|
|
|
static uchar intprio[] = {
|
|
Vecuart0, // uart 0
|
|
Vecunused, // uart 1
|
|
Vecunused, // sint
|
|
Vectimer0, // timer 0
|
|
Vecunused, // timer 1
|
|
Vecether, // ethernet
|
|
Vecunused, // tea
|
|
Vecunused, // irq0
|
|
Vecunused, // irq1
|
|
Vecunused, // irq2
|
|
Vecunused, // irq3
|
|
Vecunused, // irq4
|
|
Vecunused, // irq5
|
|
Vecunused, // irq6
|
|
Vecunused, // irq7
|
|
Vecunused, // irq8
|
|
};
|
|
|
|
void
|
|
intend(int)
|
|
{
|
|
}
|
|
|
|
void
|
|
hwintrinit(void)
|
|
{
|
|
int i;
|
|
|
|
*(ulong*)Ier=0;
|
|
|
|
for(i=0; i<nelem(intprio)/2; i++)
|
|
((uchar*)Ipri)[i] = (intprio[2*i]<<4)|intprio[2*i+1];
|
|
}
|
|
|
|
int
|
|
vectorenable(Vctl*v)
|
|
{
|
|
int i;
|
|
|
|
for(i=0; i<nelem(intprio); i++)
|
|
if(v->irq==intprio[i]){
|
|
*(ulong*)Ier |= 1<<(31-i);
|
|
return v->irq;
|
|
}
|
|
print("intrenable: cannot enable intr %d\n", v->irq);
|
|
return -1;
|
|
}
|
|
|
|
void
|
|
vectordisable(Vctl*v)
|
|
{
|
|
int i;
|
|
|
|
for(i=0; i<nelem(intprio); i++)
|
|
if(v->irq==intprio[i]){
|
|
*(ulong*)Ier &= ~(1<<(31-i));
|
|
return;
|
|
}
|
|
}
|
|
|
|
int
|
|
intvec(void)
|
|
{
|
|
ushort iar;
|
|
int i;
|
|
|
|
iar = *(ushort*)Iar; // push(prio) onto stack
|
|
for(i=0; i<nelem(intprio); i++)
|
|
if(iar==intprio[i])
|
|
return iar;
|
|
|
|
iprint("saturnint: no vector %d\n", iar);
|
|
intack();
|
|
return -1;
|
|
}
|
|
|
|
void
|
|
intack(void)
|
|
{
|
|
*(ushort*)Ithresh = 0; // pop(prio) stack
|
|
}
|
|
|
|
void
|
|
machinit(void)
|
|
{
|
|
int rrate;
|
|
ulong hid;
|
|
extern char* plan9inistr;
|
|
ulong l2cr;
|
|
|
|
memset(m, 0, sizeof(*m));
|
|
m->cputype = getpvr()>>16;
|
|
m->imap = (Imap*)INTMEM;
|
|
|
|
m->loopconst = 1096;
|
|
|
|
rrate = (*(ushort*)Syscfg >> 6) & 3;
|
|
switch(rrate){
|
|
case 0:
|
|
m->bushz = 66666666;
|
|
break;
|
|
case 1:
|
|
m->bushz = 83333333;
|
|
break;
|
|
case 2:
|
|
m->bushz = 100000000;
|
|
break;
|
|
case 3:
|
|
m->bushz = 133333333;
|
|
break;
|
|
}
|
|
|
|
if(getpll() == 0x80000000)
|
|
m->cpuhz = 300000000;
|
|
else
|
|
m->cpuhz = 200000000; /* 750FX? */
|
|
m->cyclefreq = m->bushz / 4;
|
|
|
|
active.machs[0] = 1;
|
|
active.exiting = 0;
|
|
|
|
putmsr(getmsr() | MSR_ME);
|
|
|
|
dcflush((void*)KZERO, 0x2000000);
|
|
l2cr = getl2cr();
|
|
putl2cr(l2cr|BIT(10));
|
|
|
|
kfpinit();
|
|
|
|
hid=gethid0();
|
|
hid |= BIT(28)|BIT(26)|BIT(24);
|
|
puthid0(hid);
|
|
|
|
plan9inistr =
|
|
"console=0\n"
|
|
"ether0=type=saturn\n"
|
|
"fs=135.104.9.42\n"
|
|
"auth=135.104.9.7\n"
|
|
"authdom=cs.bell-labs.com\n"
|
|
"sys=ucu\n"
|
|
"ntp=135.104.9.52\n";
|
|
}
|
|
|
|
void
|
|
sharedseginit(void)
|
|
{
|
|
}
|
|
|
|
void
|
|
trapinit(void)
|
|
{
|
|
int i;
|
|
|
|
for(i = 0x0; i < 0x2000; i += 0x100)
|
|
sethvec(i, trapvec);
|
|
|
|
dcflush(KADDR(0), 0x2000);
|
|
icflush(KADDR(0), 0x2000);
|
|
|
|
putmsr(getmsr() & ~MSR_IP);
|
|
}
|
|
|
|
void
|
|
reboot(void*, void*, ulong)
|
|
{
|
|
}
|