123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #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 = 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)
- {
- }
|