Blame view

board/spd8xx/spd8xx.c 7.22 KB
f8cac651b   wdenk   Initial revision
1
2
3
4
5
  /*
   * (C) Copyright 2000
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   * Ulrich Lutz, Speech Design GmbH, ulutz@datalab.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
6
   * SPDX-License-Identifier:	GPL-2.0+
f8cac651b   wdenk   Initial revision
7
8
9
10
11
12
13
14
15
16
17
18
19
   */
  
  #include <common.h>
  #include <mpc8xx.h>
  #include <commproc.h>
  
  /* ------------------------------------------------------------------------- */
  
  static long int dram_size (long int, long int *, long int);
  
  /* ------------------------------------------------------------------------- */
  
  #define	_NOT_USED_	0xFFFFFFFF
c83bf6a2d   wdenk   Add a common get_...
20
  const uint sharc_table[] = {
f8cac651b   wdenk   Initial revision
21
22
23
24
  	/*
  	 * Single Read. (Offset 0 in UPM RAM)
  	 */
  	0x0FF3FC04, 0x0FF3EC00, 0x7FFFEC04, 0xFFFFEC04,
c83bf6a2d   wdenk   Add a common get_...
25
26
  	0xFFFFEC05,		/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_,
f8cac651b   wdenk   Initial revision
27
28
29
30
31
32
33
34
35
36
37
38
  	/*
  	 * Burst Read. (Offset 8 in UPM RAM)
  	 */
  	/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Single Write. (Offset 18 in UPM RAM)
  	 */
  	0x0FAFFC04, 0x0FAFEC00, 0x7FFFEC04, 0xFFFFEC04,
c83bf6a2d   wdenk   Add a common get_...
39
40
  	0xFFFFEC05,		/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_,
f8cac651b   wdenk   Initial revision
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  	/*
  	 * Burst Write. (Offset 20 in UPM RAM)
  	 */
  	/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Refresh  (Offset 30 in UPM RAM)
  	 */
  	/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Exception. (Offset 3c in UPM RAM)
  	 */
c83bf6a2d   wdenk   Add a common get_...
59
60
  	0x7FFFFC07,		/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_,
f8cac651b   wdenk   Initial revision
61
  };
c83bf6a2d   wdenk   Add a common get_...
62
  const uint sdram_table[] = {
f8cac651b   wdenk   Initial revision
63
64
65
66
  	/*
  	 * Single Read. (Offset 0 in UPM RAM)
  	 */
  	0x1F07FC04, 0xEEAEFC04, 0x11ADFC04, 0xEFBBBC00,
c83bf6a2d   wdenk   Add a common get_...
67
  	0x1FF77C47,		/* last */
f8cac651b   wdenk   Initial revision
68
69
70
  	/*
  	 * SDRAM Initialization (offset 5 in UPM RAM)
  	 *
8bde7f776   wdenk   * Code cleanup:
71
72
73
  	 * This is no UPM entry point. The following definition uses
  	 * the remaining space to establish an initialization
  	 * sequence, which is executed by a RUN command.
f8cac651b   wdenk   Initial revision
74
75
  	 *
  	 */
c83bf6a2d   wdenk   Add a common get_...
76
  	0x1FF77C35, 0xEFEABC34, 0x1FB57C35,	/* last */
f8cac651b   wdenk   Initial revision
77
78
79
80
  	/*
  	 * Burst Read. (Offset 8 in UPM RAM)
  	 */
  	0x1F07FC04, 0xEEAEFC04, 0x10ADFC04, 0xF0AFFC00,
c83bf6a2d   wdenk   Add a common get_...
81
  	0xF0AFFC00, 0xF1AFFC00, 0xEFBBBC00, 0x1FF77C47,	/* last */
f8cac651b   wdenk   Initial revision
82
83
84
85
86
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Single Write. (Offset 18 in UPM RAM)
  	 */
c83bf6a2d   wdenk   Add a common get_...
87
  	0x1F27FC04, 0xEEAEBC00, 0x01B93C04, 0x1FF77C47,	/* last */
f8cac651b   wdenk   Initial revision
88
89
90
91
92
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Burst Write. (Offset 20 in UPM RAM)
  	 */
  	0x1F07FC04, 0xEEAEBC00, 0x10AD7C00, 0xF0AFFC00,
c83bf6a2d   wdenk   Add a common get_...
93
94
  	0xF0AFFC00, 0xE1BBBC04, 0x1FF77C47,	/* last */
  	_NOT_USED_,
f8cac651b   wdenk   Initial revision
95
96
97
98
99
100
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Refresh  (Offset 30 in UPM RAM)
  	 */
  	0x1FF5FC84, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
c83bf6a2d   wdenk   Add a common get_...
101
102
  	0xFFFFFC84, 0xFFFFFC07,	/* last */
  	_NOT_USED_, _NOT_USED_,
f8cac651b   wdenk   Initial revision
103
104
105
106
  	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
  	/*
  	 * Exception. (Offset 3c in UPM RAM)
  	 */
c83bf6a2d   wdenk   Add a common get_...
107
108
  	0x7FFFFC07,		/* last */
  	_NOT_USED_, _NOT_USED_, _NOT_USED_,
f8cac651b   wdenk   Initial revision
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  };
  
  /* ------------------------------------------------------------------------- */
  
  
  /*
   * Check Board Identity:
   *
   */
  
  int checkboard (void)
  {
  	puts ("Board: SPD823TS
  ");
  	return (0);
  }
  
  /* ------------------------------------------------------------------------- */
9973e3c61   Becky Bruce   Change initdram()...
127
  phys_size_t initdram (int board_type)
f8cac651b   wdenk   Initial revision
128
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
129
  	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
c83bf6a2d   wdenk   Add a common get_...
130
131
  	volatile memctl8xx_t *memctl = &immap->im_memctl;
  	long int size_b0;
f8cac651b   wdenk   Initial revision
132
133
  
  #if 0
c83bf6a2d   wdenk   Add a common get_...
134
135
136
  	/*
  	 * Map controller bank 2 to the SRAM bank at preliminary address.
  	 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
137
138
  	memctl->memc_or2 = CONFIG_SYS_OR2;
  	memctl->memc_br2 = CONFIG_SYS_BR2;
f8cac651b   wdenk   Initial revision
139
  #endif
c83bf6a2d   wdenk   Add a common get_...
140
141
142
  	/*
  	 * Map controller bank 4 to the PER8 bank.
  	 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
143
144
  	memctl->memc_or4 = CONFIG_SYS_OR4;
  	memctl->memc_br4 = CONFIG_SYS_BR4;
f8cac651b   wdenk   Initial revision
145
146
  
  #if 0
c83bf6a2d   wdenk   Add a common get_...
147
148
149
150
  	/* Configure SHARC at UMA */
  	upmconfig (UPMA, (uint *) sharc_table,
  		   sizeof (sharc_table) / sizeof (uint));
  	/* Map controller bank 5 to the SHARC */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
151
152
  	memctl->memc_or5 = CONFIG_SYS_OR5;
  	memctl->memc_br5 = CONFIG_SYS_BR5;
f8cac651b   wdenk   Initial revision
153
  #endif
c83bf6a2d   wdenk   Add a common get_...
154
  	memctl->memc_mamr = 0x00001000;
f8cac651b   wdenk   Initial revision
155

c83bf6a2d   wdenk   Add a common get_...
156
157
158
  	/* Configure SDRAM at UMB */
  	upmconfig (UPMB, (uint *) sdram_table,
  		   sizeof (sdram_table) / sizeof (uint));
f8cac651b   wdenk   Initial revision
159

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
160
  	memctl->memc_mptpr = CONFIG_SYS_MPTPR_1BK_8K;
f8cac651b   wdenk   Initial revision
161

c83bf6a2d   wdenk   Add a common get_...
162
  	memctl->memc_mar = 0x00000088;
f8cac651b   wdenk   Initial revision
163

c83bf6a2d   wdenk   Add a common get_...
164
165
166
  	/*
  	 * Map controller bank 3 to the SDRAM bank at preliminary address.
  	 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
167
168
  	memctl->memc_or3 = CONFIG_SYS_OR3_PRELIM;
  	memctl->memc_br3 = CONFIG_SYS_BR3_PRELIM;
f8cac651b   wdenk   Initial revision
169

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
170
  	memctl->memc_mbmr = CONFIG_SYS_MBMR_8COL;	/* refresh not enabled yet */
f8cac651b   wdenk   Initial revision
171

c83bf6a2d   wdenk   Add a common get_...
172
173
174
175
176
177
178
179
  	udelay (200);
  	memctl->memc_mcr = 0x80806105;
  	udelay (1);
  	memctl->memc_mcr = 0x80806130;
  	udelay (1);
  	memctl->memc_mcr = 0x80806130;
  	udelay (1);
  	memctl->memc_mcr = 0x80806106;
f8cac651b   wdenk   Initial revision
180

c83bf6a2d   wdenk   Add a common get_...
181
  	memctl->memc_mbmr |= MBMR_PTBE;	/* refresh enabled */
f8cac651b   wdenk   Initial revision
182

c83bf6a2d   wdenk   Add a common get_...
183
184
185
186
  	/*
  	 * Check Bank 0 Memory Size for re-configuration
  	 */
  	size_b0 =
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
187
  		dram_size (CONFIG_SYS_MBMR_8COL, SDRAM_BASE3_PRELIM,
c83bf6a2d   wdenk   Add a common get_...
188
  			   SDRAM_MAX_SIZE);
f8cac651b   wdenk   Initial revision
189

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
190
  	memctl->memc_mbmr = CONFIG_SYS_MBMR_8COL | MBMR_PTBE;
f8cac651b   wdenk   Initial revision
191

c83bf6a2d   wdenk   Add a common get_...
192
  	return (size_b0);
f8cac651b   wdenk   Initial revision
193
194
195
196
197
198
199
200
201
202
203
  }
  
  /* ------------------------------------------------------------------------- */
  
  /*
   * Check memory range for valid RAM. A simple memory test determines
   * the actually available RAM size between addresses `base' and
   * `base + maxsize'. Some (not all) hardware errors are detected:
   * - short between address lines
   * - short between data lines
   */
c83bf6a2d   wdenk   Add a common get_...
204
205
  static long int dram_size (long int mamr_value, long int *base,
  			   long int maxsize)
f8cac651b   wdenk   Initial revision
206
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
207
  	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
c83bf6a2d   wdenk   Add a common get_...
208
  	volatile memctl8xx_t *memctl = &immap->im_memctl;
f8cac651b   wdenk   Initial revision
209

c83bf6a2d   wdenk   Add a common get_...
210
  	memctl->memc_mbmr = mamr_value;
f8cac651b   wdenk   Initial revision
211

c83bf6a2d   wdenk   Add a common get_...
212
  	return (get_ram_size (base, maxsize));
f8cac651b   wdenk   Initial revision
213
214
215
  }
  
  /* ------------------------------------------------------------------------- */
c83bf6a2d   wdenk   Add a common get_...
216
  void reset_phy (void)
f8cac651b   wdenk   Initial revision
217
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
218
  	immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
f8cac651b   wdenk   Initial revision
219
220
221
222
  	ushort sreg;
  
  	/* Configure extra port pins for NS DP83843 PHY */
  	immr->im_ioport.iop_papar &= ~(PA_ENET_MDC | PA_ENET_MDIO);
c83bf6a2d   wdenk   Add a common get_...
223
224
  	sreg = immr->im_ioport.iop_padir;
  	sreg |= PA_ENET_MDC;	/* Mgmt. Data Clock is Output */
f8cac651b   wdenk   Initial revision
225
226
227
228
229
230
  	sreg &= ~(PA_ENET_MDIO);	/* Mgmt. Data I/O is bidirect. => Input */
  	immr->im_ioport.iop_padir = sreg;
  
  	immr->im_ioport.iop_padat &= ~(PA_ENET_MDC);	/* set MDC = 0 */
  
  	/*
8bde7f776   wdenk   * Code cleanup:
231
232
  	 * RESET in implemented by a positive pulse of at least 1 us
  	 * at the reset pin.
f8cac651b   wdenk   Initial revision
233
234
235
236
  	 *
  	 * Configure RESET pins for NS DP83843 PHY, and RESET chip.
  	 *
  	 * Note: The RESET pin is high active, but there is an
c83bf6a2d   wdenk   Add a common get_...
237
  	 *       inverter on the SPD823TS board...
f8cac651b   wdenk   Initial revision
238
239
  	 */
  	immr->im_ioport.iop_pcpar &= ~(PC_ENET_RESET);
c83bf6a2d   wdenk   Add a common get_...
240
  	immr->im_ioport.iop_pcdir |= PC_ENET_RESET;
f8cac651b   wdenk   Initial revision
241
242
243
244
  	/* assert RESET signal of PHY */
  	immr->im_ioport.iop_pcdat &= ~(PC_ENET_RESET);
  	udelay (10);
  	/* de-assert RESET signal of PHY */
c83bf6a2d   wdenk   Add a common get_...
245
  	immr->im_ioport.iop_pcdat |= PC_ENET_RESET;
f8cac651b   wdenk   Initial revision
246
247
248
249
  	udelay (10);
  }
  
  /* ------------------------------------------------------------------------- */
c83bf6a2d   wdenk   Add a common get_...
250
  void ide_set_reset (int on)
f8cac651b   wdenk   Initial revision
251
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
252
  	volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
f8cac651b   wdenk   Initial revision
253
254
255
256
257
  
  	/*
  	 * Configure PC for IDE Reset Pin
  	 */
  	if (on) {		/* assert RESET */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
258
  		immr->im_ioport.iop_pcdat &= ~(CONFIG_SYS_PC_IDE_RESET);
f8cac651b   wdenk   Initial revision
259
  	} else {		/* release RESET */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
260
  		immr->im_ioport.iop_pcdat |= CONFIG_SYS_PC_IDE_RESET;
f8cac651b   wdenk   Initial revision
261
262
263
  	}
  
  	/* program port pin as GPIO output */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
264
265
266
  	immr->im_ioport.iop_pcpar &= ~(CONFIG_SYS_PC_IDE_RESET);
  	immr->im_ioport.iop_pcso &= ~(CONFIG_SYS_PC_IDE_RESET);
  	immr->im_ioport.iop_pcdir |= CONFIG_SYS_PC_IDE_RESET;
f8cac651b   wdenk   Initial revision
267
268
269
  }
  
  /* ------------------------------------------------------------------------- */