summaryrefslogtreecommitdiff
path: root/src/cpu/ppc/ppc4xx/sdram.c
blob: 5068f9071f98e077ff108a96457d27bfb1266b08 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * (C) Copyright 2002
 * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301 USA
 */

#include <ppc_asm.tmpl>
#include <ppc.h>
#include <ppc4xx.h>
#include <timer.h>
#include <clock.h>
#include <stdint.h>

#define CONFIG_SDRAM_BANK0
#ifdef CONFIG_SDRAM_BANK0

/*
 * According to the PPC405GPr Users Manual, only non-reserved
 * bits of SDRAM registers can be set. This means reading the
 * contents and masking off bits to be set.
 */
#define CMD_BITS	0x80C00000
#define CMD_MASK	0xFFE00000
#define TR_BITS		0x010E8016
#define TR_MASK		0x018FC01F
#define B0CR_BITS	0x00084001
#define B0CR_MASK	0xFFCEE001
#define RTR_BITS	0x08080000
#define RTR_MASK	0xFFFF0000
#define ECCCF_BITS	0x00000000
#define ECCCF_MASK	0x00F00000
#define PMIT_BITS	0x0F000000
#define PMIT_MASK	0xFFC00000

#define mfsdram0(reg, data)  mtdcr(memcfga,reg);data = mfdcr(memcfgd)
#define mtsdram0(reg, data)  mtdcr(memcfga,reg);mtdcr(memcfgd,data)

#define set_sdram0(reg, val) \
	mfsdram0(reg, reg32); \
	reg32 &= ~(val##_MASK); \
	reg32 |= (val##_BITS); \
	mtsdram0(reg, reg32)

/*-----------------------------------------------------------------------
 */
void memory_init(void)
{
#if 0
	unsigned long speed;
	unsigned long sdtr1;
#endif
	uint32_t reg32;

#if 0
	/*
	 * Determine SDRAM speed
	 */
	speed = get_pci_bus_freq(); /* parameter not used on ppc4xx */

	/*
	 * Support for 100MHz and 133MHz SDRAM
	 */
	if (speed > 100000000) {
		/*
		 * 133 MHz SDRAM
		 */
		sdtr1 = 0x01074015;
		rtr = 0x07f00000;
	} else {
		/*
		 * default: 100 MHz SDRAM
		 */
		sdtr1 = 0x0086400d;
		rtr = 0x05f00000;
	}
#endif

        /*
	 * Disable memory controller.
	 */
/* TODO: work out why this trashes cache ram */
	//mtsdram0(mem_mcopt1, 0x00000000);

#if EMBEDDED_RAM_SIZE==128*1024*1024
	/* TODO */
#elif EMBEDDED_RAM_SIZE==64*1024*1024
	set_sdram0(mem_sdtr1, TR);
	set_sdram0(mem_mb0cf, B0CR);
	set_sdram0(mem_rtr, RTR);
	set_sdram0(mem_ecccf, ECCCF);
	set_sdram0(mem_pmit, PMIT);
#elif EMBEDDED_RAM_SIZE==32*1024*1024
	/* TODO */
#elif EMBEDDED_RAM_SIZE==16*1024*1024
	/* TODO */
#endif

	/*
	 * Wait for 200us
	 */
	udelay(200);

	/*
	 * Set memory controller options reg, MCOPT1.
	 * Set DC_EN to '1' and BRD_PRF to '01' for 16 byte PLB Burst
	 * read/prefetch.
	 */
	set_sdram0(mem_mcopt1, CMD);

	/*
	 * Wait for 10ms
	 */
	udelay(10000);
}

#endif /* CONFIG_SDRAM_BANK0 */