summaryrefslogtreecommitdiff
path: root/os/boot/mpc/initrpcg.c
blob: 55219548535481370542f14abfacb41ee56152e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

/*
 * Called from l.s in EPROM to set up a minimal working environment.
 * Since there is no DRAM yet, and therefore no stack, no function
 * calls may be made from sysinit, and values can't be stored,
 * except to INTMEM.  Global values are accessed by offset from SB,
 * which has been set by l.s to point into EPROM.
 */

#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"

#include	"archrpcg.h"

#define	MB	(1024*1024)

enum {
	UPMSIZE = 64,	/* memory controller instruction RAM */
	DRAMSIZE = 16*MB,
	FLASHSIZE = 4*MB,

	WriteRAM = 0<<30,
	ReadRAM = 1<<30,
	ExecRAM = 2<<30,

	SelUPMA = 0<<23,
	SelUPMB = 1<<23,
};
/* RPCG values for RPXLite AW */
static	ulong	upma50[UPMSIZE] = {
	0xCFFFCC24,	0x0FFFCC04,	0x0CAFCC04,	0x03AFCC08,       
	0x3FBFCC27,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xCFFFCC24,	0x0FFFCC04,	0x0CAFCC84,	0x03AFCC88,
	0x3FBFCC27,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xCFFFCC24,	0x0FFFCC04,	0x0CFFCC04,	0x03FFCC00,
	0x3FFFCC27,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xCFFFCC24,	0x0FFFCC04,	0x0CFFCC84,	0x03FFCC84,
	0x0CFFCC00,	0x33FFCC27,	0xFFFFCC25,	0xFFFFCC25,
	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xC0FFCC24,	0x03FFCC24,	0x0FFFCC24,	0x0FFFCC24,
	0x3FFFCC27,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,	0xFFFFCC25,
};

void
sysinit0(int inrom)
{
	ulong *upm;
	IMM *io;
	int i;

	io = (IMM*)INTMEM;		/* running before maps, no KADDR */
	io->siumcr = 0x01012440;
	io->sypcr = 0xFFFFFF88;
	io->tbscrk = KEEP_ALIVE_KEY;
	io->tbscr = 0xC3;
	io->rtcsck = KEEP_ALIVE_KEY;
	io->rtcsc = 0xC1;
	io->rtcsck = ~KEEP_ALIVE_KEY;
	io->piscrk = KEEP_ALIVE_KEY;
	io->piscr = 0x82;
return;
	io->memc[BCSRCS].option = 0xFFFF8910;	/* 32k block, all types access, CSNT, CS early negate, burst inhibit, 1 ws */
	io->memc[BCSRCS].base = BCSRMEM | 1;	/* base, 32-bit port, no parity, GPCM */

	io->memc[BOOTCS].base = FLASHMEM | 0x801; /* base, 16 bit port */
	io->memc[BOOTCS].option = ~(FLASHSIZE-1)|(1<<8)|(4<<4);	/* mask, BIH, 4 wait states */

	if(1||!inrom)
		return;	/* can't initialise DRAM controller from DRAM */

	/* TO DO: could check DRAM size and speed now */

	upm = upma50;
	for(i=0; i<nelem(upma50); i++){
		io->mdr = upm[i];
		io->mcr = WriteRAM | SelUPMA | i;
	}
	io->mptpr = 0x0800;	/* divide by 8 */
	io->mamr = (0x58<<24) | 0xA01430;	/* 40MHz BRGCLK */
	io->memc[DRAM1].option = ~(DRAMSIZE-1)|0x0E00;	/* address mask, SAM=1, G5LA/S=3 */
	io->memc[DRAM1].base = 0 | 0x81;	/* base at 0, 32-bit port size, no parity, UPMA */
}