3
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5
* See file CREDITS for list of people who contributed to this
8
* This program is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU General Public License as
10
* published by the Free Software Foundation; either version 2 of
11
* the License, or (at your option) any later version.
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
30
* I/O Port configuration table
32
* if conf is 1, then that port pin will be configured at boot time
33
* according to the five values podr/pdir/ppar/psor/pdat for that entry
36
const iop_conf_t iop_conf_tab[4][32] = {
38
/* Port A configuration */
39
{ /* conf ppar psor pdir podr pdat */
40
/* PA31 */ { 1, 1, 1, 0, 0, 0 }, /* FCC1 MII COL */
41
/* PA30 */ { 1, 1, 1, 0, 0, 0 }, /* FCC1 MII CRS */
42
/* PA29 */ { 1, 1, 1, 1, 0, 0 }, /* FCC1 MII TX_ER */
43
/* PA28 */ { 1, 1, 1, 1, 0, 0 }, /* FCC1 MII TX_EN */
44
/* PA27 */ { 1, 1, 1, 0, 0, 0 }, /* FCC1 MII RX_DV */
45
/* PA26 */ { 1, 1, 1, 0, 0, 0 }, /* FCC1 MII RX_ER */
46
/* PA25 */ { 1, 0, 0, 1, 0, 0 }, /* FCC2 MII MDIO */
47
/* PA24 */ { 1, 0, 0, 1, 0, 0 }, /* FCC2 MII MDC */
48
/* PA23 */ { 1, 0, 0, 1, 0, 0 }, /* FCC1 MII MDIO */
49
/* PA22 */ { 1, 0, 0, 1, 0, 0 }, /* FCC1 MII MDC */
50
/* PA21 */ { 1, 1, 0, 1, 0, 0 }, /* FCC1 MII TxD[3] */
51
/* PA20 */ { 1, 1, 0, 1, 0, 0 }, /* FCC1 MII TxD[2] */
52
/* PA19 */ { 1, 1, 0, 1, 0, 0 }, /* FCC1 MII TxD[1] */
53
/* PA18 */ { 1, 1, 0, 1, 0, 0 }, /* FCC1 MII TxD[0] */
54
/* PA17 */ { 1, 1, 0, 0, 0, 0 }, /* FCC1 MII RxD[0] */
55
/* PA16 */ { 1, 1, 0, 0, 0, 0 }, /* FCC1 MII RxD[1] */
56
/* PA15 */ { 1, 1, 0, 0, 0, 0 }, /* FCC1 MII RxD[2] */
57
/* PA14 */ { 1, 1, 0, 0, 0, 0 }, /* FCC1 MII RxD[3] */
58
/* PA13 */ { 1, 0, 0, 1, 0, 0 }, /* FCC2 MII TXSL1 */
59
/* PA12 */ { 1, 0, 0, 1, 0, 1 }, /* FCC2 MII TXSL0 */
60
/* PA11 */ { 1, 0, 0, 1, 0, 0 }, /* FCC1 MII TXSL1 */
61
/* PA10 */ { 1, 0, 0, 1, 0, 1 }, /* FCC1 MII TXSL0 */
63
/* PA9 */ { 0, 1, 0, 1, 0, 0 }, /* SMC2 TXD */
64
/* PA8 */ { 0, 1, 0, 0, 0, 0 }, /* SMC2 RXD */
66
/* PA9 */ { 1, 1, 0, 1, 0, 0 }, /* SMC2 TXD */
67
/* PA8 */ { 1, 1, 0, 0, 0, 0 }, /* SMC2 RXD */
69
/* PA7 */ { 0, 0, 0, 0, 0, 0 }, /* PA7 */
70
/* PA6 */ { 1, 0, 0, 1, 0, 1 }, /* FCC2 MII PAUSE */
71
/* PA5 */ { 1, 0, 0, 1, 0, 1 }, /* FCC1 MII PAUSE */
72
/* PA4 */ { 1, 0, 0, 1, 0, 0 }, /* FCC2 MII PWRDN */
73
/* PA3 */ { 1, 0, 0, 1, 0, 0 }, /* FCC1 MII PWRDN */
74
/* PA2 */ { 0, 0, 0, 0, 0, 0 }, /* PA2 */
75
/* PA1 */ { 1, 0, 0, 0, 0, 0 }, /* FCC2 MII MDINT */
76
/* PA0 */ { 1, 0, 0, 1, 0, 0 } /* FCC1 MII MDINT */
79
/* Port B configuration */
80
{ /* conf ppar psor pdir podr pdat */
81
/* PB31 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TX_ER */
82
/* PB30 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RX_DV */
83
/* PB29 */ { 1, 1, 1, 1, 0, 0 }, /* FCC2 MII TX_EN */
84
/* PB28 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RX_ER */
85
/* PB27 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII COL */
86
/* PB26 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII CRS */
87
/* PB25 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[3] */
88
/* PB24 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[2] */
89
/* PB23 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[1] */
90
/* PB22 */ { 1, 1, 0, 1, 0, 0 }, /* FCC2 MII TxD[0] */
91
/* PB21 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[0] */
92
/* PB20 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[1] */
93
/* PB19 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[2] */
94
/* PB18 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RxD[3] */
95
/* PB17 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RX_DV */
96
/* PB16 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RX_ER */
97
/* PB15 */ { 1, 1, 0, 1, 0, 0 }, /* FCC3 MII TX_ER */
98
/* PB14 */ { 1, 1, 0, 1, 0, 0 }, /* FCC3 MII TX_EN */
99
/* PB13 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII COL */
100
/* PB12 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII CRS */
101
/* PB11 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RxD */
102
/* PB10 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RxD */
103
/* PB9 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RxD */
104
/* PB8 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RxD */
105
/* PB7 */ { 1, 1, 0, 1, 0, 0 }, /* FCC3 MII TxD */
106
/* PB6 */ { 1, 1, 0, 1, 0, 0 }, /* FCC3 MII TxD */
107
/* PB5 */ { 1, 1, 0, 1, 0, 0 }, /* FCC3 MII TxD */
108
/* PB4 */ { 1, 1, 0, 1, 0, 0 }, /* FCC3 MII TxD */
109
/* PB3 */ { 0, 0, 0, 0, 0, 0 }, /* PB3 */
110
/* PB2 */ { 0, 0, 0, 0, 0, 0 }, /* PB2 */
111
/* PB1 */ { 0, 0, 0, 0, 0, 0 }, /* PB1 */
112
/* PB0 */ { 0, 0, 0, 0, 0, 0 } /* PB0 */
116
{ /* conf ppar psor pdir podr pdat */
117
/* PC31 */ { 0, 0, 0, 0, 0, 0 }, /* PC31 */
118
/* PC30 */ { 0, 0, 0, 0, 0, 0 }, /* PC30 */
119
/* PC29 */ { 1, 0, 0, 0, 0, 0 }, /* SCC1 CTS */
120
/* PC28 */ { 1, 0, 0, 0, 0, 0 }, /* SCC2 CTS */
121
/* PC27 */ { 0, 0, 0, 0, 0, 0 }, /* PC27 */
122
/* PC26 */ { 0, 0, 0, 0, 0, 0 }, /* PC26 */
123
/* PC25 */ { 0, 0, 0, 0, 0, 0 }, /* PC25 */
124
/* PC24 */ { 0, 0, 0, 0, 0, 0 }, /* PC24 */
125
/* PC23 */ { 0, 0, 0, 0, 0, 0 }, /* FDC37C78 DACFD */
126
/* PC22 */ { 0, 0, 0, 0, 0, 0 }, /* FDC37C78 DNFD */
127
/* PC21 */ { 1, 1, 0, 0, 0, 0 }, /* FCC1 MII RX_CLK */
128
/* PC20 */ { 1, 1, 0, 0, 0, 0 }, /* FCC1 MII TX_CLK */
129
/* PC19 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII RX_CLK */
130
/* PC18 */ { 1, 1, 0, 0, 0, 0 }, /* FCC2 MII TX_CLK */
131
/* PC17 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII RX_CLK */
132
/* PC16 */ { 1, 1, 0, 0, 0, 0 }, /* FCC3 MII TX_CLK */
134
/* PC15 */ { 0, 0, 0, 0, 0, 0 }, /* PC15 */
136
/* PC15 */ { 1, 1, 0, 1, 0, 0 }, /* PC15 */
138
/* PC14 */ { 0, 0, 0, 0, 0, 0 }, /* PC14 */
139
/* PC13 */ { 0, 0, 0, 0, 0, 0 }, /* PC13 */
140
/* PC12 */ { 0, 0, 0, 0, 0, 0 }, /* PC12 */
141
/* PC11 */ { 0, 0, 0, 0, 0, 0 }, /* PC11 */
142
/* PC10 */ { 0, 0, 0, 0, 0, 0 }, /* PC10 */
143
/* PC9 */ { 0, 0, 0, 0, 0, 0 }, /* FC9 */
144
/* PC8 */ { 0, 0, 0, 0, 0, 0 }, /* PC8 */
145
/* PC7 */ { 0, 0, 0, 0, 0, 0 }, /* PC7 */
146
/* PC6 */ { 0, 0, 0, 0, 0, 0 }, /* PC6 */
147
/* PC5 */ { 0, 0, 0, 0, 0, 0 }, /* PC5 */
148
/* PC4 */ { 0, 0, 0, 0, 0, 0 }, /* PC4 */
149
/* PC3 */ { 0, 0, 0, 0, 0, 0 }, /* PC3 */
150
/* PC2 */ { 0, 0, 0, 0, 0, 0 }, /* PC2 */
151
/* PC1 */ { 0, 0, 0, 0, 0, 0 }, /* PC1 */
152
/* PC0 */ { 0, 0, 0, 0, 0, 0 }, /* FDC37C78 DRQFD */
156
{ /* conf ppar psor pdir podr pdat */
157
/* PD31 */ { 1, 1, 0, 0, 0, 0 }, /* SCC1 RXD */
158
/* PD30 */ { 1, 1, 1, 1, 0, 0 }, /* SCC1 TXD */
159
/* PD29 */ { 1, 0, 0, 1, 0, 0 }, /* SCC1 RTS */
160
/* PD28 */ { 1, 1, 0, 0, 0, 0 }, /* SCC2 RXD */
161
/* PD27 */ { 1, 1, 0, 1, 0, 0 }, /* SCC2 TXD */
162
/* PD26 */ { 1, 0, 0, 1, 0, 0 }, /* SCC2 RTS */
163
/* PD25 */ { 0, 0, 0, 0, 0, 0 }, /* PD25 */
164
/* PD24 */ { 0, 0, 0, 0, 0, 0 }, /* PD24 */
165
/* PD23 */ { 0, 0, 0, 0, 0, 0 }, /* PD23 */
166
/* PD22 */ { 0, 0, 0, 0, 0, 0 }, /* PD22 */
167
/* PD21 */ { 0, 0, 0, 0, 0, 0 }, /* PD21 */
168
/* PD20 */ { 0, 0, 0, 0, 0, 0 }, /* PD20 */
169
/* PD19 */ { 0, 0, 0, 0, 0, 0 }, /* PD19 */
170
/* PD18 */ { 0, 0, 0, 0, 0, 0 }, /* PD18 */
171
/* PD17 */ { 0, 0, 0, 0, 0, 0 }, /* PD17 */
172
/* PD16 */ { 0, 0, 0, 0, 0, 0 }, /* PD16 */
173
#if defined(CONFIG_SOFT_I2C)
174
/* PD15 */ { 1, 0, 0, 1, 1, 1 }, /* I2C SDA */
175
/* PD14 */ { 1, 0, 0, 1, 1, 1 }, /* I2C SCL */
177
#if defined(CONFIG_HARD_I2C)
178
/* PD15 */ { 1, 1, 1, 0, 1, 0 }, /* I2C SDA */
179
/* PD14 */ { 1, 1, 1, 0, 1, 0 }, /* I2C SCL */
180
#else /* normal I/O port pins */
181
/* PD15 */ { 1, 1, 1, 0, 1, 0 }, /* I2C SDA */
182
/* PD14 */ { 1, 1, 1, 0, 1, 0 }, /* I2C SCL */
185
/* PD13 */ { 0, 0, 0, 0, 0, 0 }, /* PD13 */
186
/* PD12 */ { 0, 0, 0, 0, 0, 0 }, /* PD12 */
187
/* PD11 */ { 0, 0, 0, 0, 0, 0 }, /* PD11 */
188
/* PD10 */ { 0, 0, 0, 0, 0, 0 }, /* PD10 */
189
/* PD9 */ { 1, 1, 0, 1, 0, 0 }, /* SMC1 TXD */
190
/* PD8 */ { 1, 1, 0, 0, 0, 0 }, /* SMC1 RXD */
191
/* PD7 */ { 0, 0, 0, 0, 0, 0 }, /* PD7 */
192
/* PD6 */ { 0, 0, 0, 0, 0, 0 }, /* PD6 */
193
/* PD5 */ { 0, 0, 0, 0, 0, 0 }, /* PD5 */
195
/* PD4 */ { 0, 0, 0, 0, 0, 0 }, /* PD4 */
197
/* PD4 */ { 1, 1, 1, 0, 0, 0 }, /* PD4 */
199
/* PD3 */ { 0, 0, 0, 0, 0, 0 }, /* PD3 */
200
/* PD2 */ { 0, 0, 0, 0, 0, 0 }, /* PD2 */
201
/* PD1 */ { 0, 0, 0, 0, 0, 0 }, /* PD1 */
202
/* PD0 */ { 0, 0, 0, 0, 0, 0 } /* PD0 */
207
* UPMB initialization table
209
#define _NOT_USED_ 0xFFFFFFFF
211
static const uint rtc_table[] =
214
* Single Read. (Offset 0 in UPMA RAM)
216
0xfffec00, 0xfffac00, 0xfff2d00, 0xfef2800,
217
0xfaf2080, 0xfaf2080, 0xfff2400, 0x1fff6c05, /* last */
219
* Burst Read. (Offset 8 in UPMA RAM)
221
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
222
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
223
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
224
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
226
* Single Write. (Offset 18 in UPMA RAM)
228
0xfffec00, 0xfffac00, 0xfff2d00, 0xfef2800,
229
0xfaf2080, 0xfaf2080, 0xfaf2400, 0x1fbf6c05, /* last */
231
* Burst Write. (Offset 20 in UPMA RAM)
233
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
234
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
235
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
236
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
238
* Refresh (Offset 30 in UPMA RAM)
240
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
241
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
242
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
244
* Exception. (Offset 3c in UPMA RAM)
246
_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
249
/* ------------------------------------------------------------------------- */
251
/* Check Board Identity:
253
int checkboard (void)
255
printf ("Board: ATC\n");
259
/* ------------------------------------------------------------------------- */
261
/* Try SDRAM initialization with P/LSDMR=sdmr and ORx=orx
263
* This routine performs standard 8260 initialization sequence
264
* and calculates the available memory size. It may be called
265
* several times to try different SDRAM configurations on both
266
* 60x and local buses.
268
static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,
269
ulong orx, volatile uchar * base)
271
volatile uchar c = 0xff;
272
volatile uint *sdmr_ptr;
273
volatile uint *orx_ptr;
277
/* We must be able to test a location outsize the maximum legal size
278
* to find out THAT we are outside; but this address still has to be
279
* mapped by the controller. That means, that the initial mapping has
280
* to be (at least) twice as large as the maximum expected size.
282
maxsize = (1 + (~orx | 0x7fff)) / 2;
284
/* Since CONFIG_SYS_SDRAM_BASE is always 0 (??), we assume that
285
* we are configuring CS1 if base != 0
287
sdmr_ptr = &memctl->memc_psdmr;
288
orx_ptr = &memctl->memc_or2;
293
* Quote from 8260 UM (10.4.2 SDRAM Power-On Initialization, 10-35):
295
* "At system reset, initialization software must set up the
296
* programmable parameters in the memory controller banks registers
297
* (ORx, BRx, P/LSDMR). After all memory parameters are configured,
298
* system software should execute the following initialization sequence
299
* for each SDRAM device.
301
* 1. Issue a PRECHARGE-ALL-BANKS command
302
* 2. Issue eight CBR REFRESH commands
303
* 3. Issue a MODE-SET command to initialize the mode register
305
* The initial commands are executed by setting P/LSDMR[OP] and
306
* accessing the SDRAM with a single-byte transaction."
308
* The appropriate BRx/ORx registers have already been set when we
309
* get here. The SDRAM can be accessed at the address CONFIG_SYS_SDRAM_BASE.
312
*sdmr_ptr = sdmr | PSDMR_OP_PREA;
315
*sdmr_ptr = sdmr | PSDMR_OP_CBRR;
316
for (i = 0; i < 8; i++)
319
*sdmr_ptr = sdmr | PSDMR_OP_MRW;
320
*(base + CONFIG_SYS_MRS_OFFS) = c; /* setting MR on address lines */
322
*sdmr_ptr = sdmr | PSDMR_OP_NORM | PSDMR_RFEN;
325
size = get_ram_size((long *)base, maxsize);
327
*orx_ptr = orx | ~(size - 1);
332
int misc_init_r(void)
334
volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
335
volatile memctl8260_t *memctl = &immap->im_memctl;
337
upmconfig(UPMA, (uint *)rtc_table, sizeof(rtc_table) / sizeof(uint));
338
memctl->memc_mamr = MxMR_RLFx_6X | MxMR_WLFx_6X | MxMR_OP_NORM;
343
phys_size_t initdram (int board_type)
345
volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
346
volatile memctl8260_t *memctl = &immap->im_memctl;
348
#ifndef CONFIG_SYS_RAMBOOT
353
psize = 8 * 1024 * 1024;
355
memctl->memc_mptpr = CONFIG_SYS_MPTPR;
356
memctl->memc_psrt = CONFIG_SYS_PSRT;
358
#ifndef CONFIG_SYS_RAMBOOT
361
size8 = try_init (memctl, CONFIG_SYS_PSDMR_8COL, CONFIG_SYS_OR2_8COL,
362
(uchar *) CONFIG_SYS_SDRAM_BASE);
363
size9 = try_init (memctl, CONFIG_SYS_PSDMR_9COL, CONFIG_SYS_OR2_9COL,
364
(uchar *) CONFIG_SYS_SDRAM_BASE);
368
printf ("(60x:9COL) ");
370
psize = try_init (memctl, CONFIG_SYS_PSDMR_8COL, CONFIG_SYS_OR2_8COL,
371
(uchar *) CONFIG_SYS_SDRAM_BASE);
372
printf ("(60x:8COL) ");
375
#endif /* CONFIG_SYS_RAMBOOT */
382
#if defined(CONFIG_CMD_DOC)
385
doc_probe (CONFIG_SYS_DOC_BASE);
390
struct pci_controller hose;
392
extern void pci_mpc8250_init(struct pci_controller *);
394
void pci_init_board(void)
396
pci_mpc8250_init(&hose);