1*74a4d8c2SCharles.Forsyth /*
2*74a4d8c2SCharles.Forsyth * Called from l.s in EPROM to set up a minimal working environment.
3*74a4d8c2SCharles.Forsyth * Since there is no DRAM yet, and therefore no stack, no function
4*74a4d8c2SCharles.Forsyth * calls may be made from sysinit0, and values can't be stored,
5*74a4d8c2SCharles.Forsyth * except to INTMEM. Global values are accessed by offset from SB,
6*74a4d8c2SCharles.Forsyth * which has been set by l.s to point into EPROM.
7*74a4d8c2SCharles.Forsyth *
8*74a4d8c2SCharles.Forsyth * This is PowerPAQ-specific:
9*74a4d8c2SCharles.Forsyth * - assumes 8mbytes
10*74a4d8c2SCharles.Forsyth * - powerpaq CS assignment
11*74a4d8c2SCharles.Forsyth */
12*74a4d8c2SCharles.Forsyth
13*74a4d8c2SCharles.Forsyth #include "u.h"
14*74a4d8c2SCharles.Forsyth #include "lib.h"
15*74a4d8c2SCharles.Forsyth #include "mem.h"
16*74a4d8c2SCharles.Forsyth #include "dat.h"
17*74a4d8c2SCharles.Forsyth #include "fns.h"
18*74a4d8c2SCharles.Forsyth #include "io.h"
19*74a4d8c2SCharles.Forsyth
20*74a4d8c2SCharles.Forsyth #include "archpaq.h"
21*74a4d8c2SCharles.Forsyth
22*74a4d8c2SCharles.Forsyth #define MB (1024*1024)
23*74a4d8c2SCharles.Forsyth
24*74a4d8c2SCharles.Forsyth enum {
25*74a4d8c2SCharles.Forsyth DRAMSIZE = 8*MB,
26*74a4d8c2SCharles.Forsyth FLASHSIZE = 8*MB,
27*74a4d8c2SCharles.Forsyth
28*74a4d8c2SCharles.Forsyth UPMSIZE = 64, /* memory controller instruction RAM */
29*74a4d8c2SCharles.Forsyth SPEED = 50, /* maximum memory clock in MHz */
30*74a4d8c2SCharles.Forsyth
31*74a4d8c2SCharles.Forsyth /* mcr */
32*74a4d8c2SCharles.Forsyth WriteRAM = 0<<30,
33*74a4d8c2SCharles.Forsyth ReadRAM = 1<<30,
34*74a4d8c2SCharles.Forsyth ExecRAM = 2<<30,
35*74a4d8c2SCharles.Forsyth
36*74a4d8c2SCharles.Forsyth SelUPMA = 0<<23,
37*74a4d8c2SCharles.Forsyth SelUPMB = 1<<23,
38*74a4d8c2SCharles.Forsyth
39*74a4d8c2SCharles.Forsyth Once = 1<<8,
40*74a4d8c2SCharles.Forsyth };
41*74a4d8c2SCharles.Forsyth
42*74a4d8c2SCharles.Forsyth /*
43*74a4d8c2SCharles.Forsyth * mpc8bug uses the following for 60ns EDO DRAMs 32-50MHz
44*74a4d8c2SCharles.Forsyth */
45*74a4d8c2SCharles.Forsyth static ulong upmb50[UPMSIZE] = {
46*74a4d8c2SCharles.Forsyth 0x8FFFEC24, 0xFFFEC04, 0xCFFEC04, 0xFFEC04,
47*74a4d8c2SCharles.Forsyth 0xFFEC00, 0x37FFEC47, 0xFFFFFFFF, 0xFFFFFFFF,
48*74a4d8c2SCharles.Forsyth 0x8FFFEC24, 0xFFFEC04, 0x8FFEC04, 0xFFEC0C,
49*74a4d8c2SCharles.Forsyth 0x3FFEC00, 0xFFEC44, 0xFFCC08, 0xCFFCC44,
50*74a4d8c2SCharles.Forsyth 0xFFEC0C, 0x3FFEC00, 0xFFEC44, 0xFFCC00,
51*74a4d8c2SCharles.Forsyth 0x3FFFC847, 0x3FFFEC47, 0xFFFFFFFF, 0xFFFFFFFF,
52*74a4d8c2SCharles.Forsyth 0x8FAFCC24, 0xFAFCC04, 0xCAFCC00, 0x11BFCC47,
53*74a4d8c2SCharles.Forsyth 0xC0FFCC84, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
54*74a4d8c2SCharles.Forsyth 0x8FAFCC24, 0xFAFCC04, 0xCAFCC00, 0x3AFCC4C,
55*74a4d8c2SCharles.Forsyth 0xCAFCC00, 0x3AFCC4C, 0xCAFCC00, 0x3AFCC4C,
56*74a4d8c2SCharles.Forsyth 0xCAFCC00, 0x33BFCC4F, 0xFFFFFFFF, 0xFFFFFFFF,
57*74a4d8c2SCharles.Forsyth 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
58*74a4d8c2SCharles.Forsyth 0xC0FFCC84, 0xFFCC04, 0x7FFCC04, 0x3FFFCC06,
59*74a4d8c2SCharles.Forsyth 0xFFFFCC85, 0xFFFFCC05, 0xFFFFCC05, 0xFFFFFFFF,
60*74a4d8c2SCharles.Forsyth 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
61*74a4d8c2SCharles.Forsyth 0x33FFCC07, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
62*74a4d8c2SCharles.Forsyth };
63*74a4d8c2SCharles.Forsyth
64*74a4d8c2SCharles.Forsyth void
sysinit0(int inrom)65*74a4d8c2SCharles.Forsyth sysinit0(int inrom)
66*74a4d8c2SCharles.Forsyth {
67*74a4d8c2SCharles.Forsyth ulong *upm;
68*74a4d8c2SCharles.Forsyth IMM *io;
69*74a4d8c2SCharles.Forsyth int i;
70*74a4d8c2SCharles.Forsyth
71*74a4d8c2SCharles.Forsyth io = (IMM*)INTMEM; /* running before maps, no KADDR */
72*74a4d8c2SCharles.Forsyth
73*74a4d8c2SCharles.Forsyth /* system interface unit initialisation, FADS manual table 3-2, except as noted */
74*74a4d8c2SCharles.Forsyth io->siumcr = 0x01012440;
75*74a4d8c2SCharles.Forsyth io->sypcr = 0xFFFFFF88;
76*74a4d8c2SCharles.Forsyth io->tbscrk = KEEP_ALIVE_KEY;
77*74a4d8c2SCharles.Forsyth io->tbscr = 0xC3; /* time base enabled */
78*74a4d8c2SCharles.Forsyth io->rtcsck = KEEP_ALIVE_KEY;
79*74a4d8c2SCharles.Forsyth io->rtcsc = 0xC1; /* don't FRZ, real-time clock enabled */
80*74a4d8c2SCharles.Forsyth io->rtcsck = ~KEEP_ALIVE_KEY;
81*74a4d8c2SCharles.Forsyth io->piscrk = KEEP_ALIVE_KEY;
82*74a4d8c2SCharles.Forsyth io->piscr = 0x82;
83*74a4d8c2SCharles.Forsyth
84*74a4d8c2SCharles.Forsyth io->memc[BOOTCS].base = FLASHMEM | 1;
85*74a4d8c2SCharles.Forsyth io->memc[BOOTCS].option = ~(FLASHSIZE-1)|(1<<8)|(2<<4); /* mask, BIH, 2 wait states */
86*74a4d8c2SCharles.Forsyth
87*74a4d8c2SCharles.Forsyth if(!inrom)
88*74a4d8c2SCharles.Forsyth return; /* can't initialise DRAM controller from DRAM */
89*74a4d8c2SCharles.Forsyth
90*74a4d8c2SCharles.Forsyth /* could check DRAM speed here; assume 60ns */
91*74a4d8c2SCharles.Forsyth /* could probe DRAM for size here; assume DRAMSIZE */
92*74a4d8c2SCharles.Forsyth io->mptpr = 0x400; /* powerpaq flash has 0x1000 */
93*74a4d8c2SCharles.Forsyth io->mbmr = (0xC0<<24) | 0xA21114; /* 50MHz BRGCLK */
94*74a4d8c2SCharles.Forsyth upm = upmb50;
95*74a4d8c2SCharles.Forsyth for(i=0; i<UPMSIZE; i++){
96*74a4d8c2SCharles.Forsyth io->mdr = upm[i];
97*74a4d8c2SCharles.Forsyth io->mcr = WriteRAM | SelUPMB | i;
98*74a4d8c2SCharles.Forsyth }
99*74a4d8c2SCharles.Forsyth io->memc[DRAM1].option = ~(DRAMSIZE-1)|0x0800; /* address mask, SAM=1 */
100*74a4d8c2SCharles.Forsyth io->memc[DRAM1].base = 0 | 0xC1; /* base at 0, 32-bit port size, no parity, UPMB */
101*74a4d8c2SCharles.Forsyth }
102