]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/ppc/msaturn.c
Import sources from 2011-03-30 iso image - lib
[plan9front.git] / sys / src / 9 / ppc / msaturn.c
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 }