xref: /inferno-os/os/boot/mpc/initpaq.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
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