]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/freescale/mpc7448hpc2/tsi108_init.c
Merge branch 'u-boot/master' into u-boot-arm/master
[karo-tx-uboot.git] / board / freescale / mpc7448hpc2 / tsi108_init.c
1 /*****************************************************************************
2  * (C) Copyright 2003;  Tundra Semiconductor Corp.
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  *****************************************************************************/
6
7 /*----------------------------------------------------------------------------
8  * FILENAME: tsi108_init.c
9  *
10  * Originator: Alex Bounine
11  *
12  * DESCRIPTION:
13  * Initialization code for the Tundra Tsi108 bridge chip
14  *---------------------------------------------------------------------------*/
15
16 #include <common.h>
17 #include <74xx_7xx.h>
18 #include <config.h>
19 #include <version.h>
20 #include <asm/processor.h>
21 #include <tsi108.h>
22
23 DECLARE_GLOBAL_DATA_PTR;
24
25 extern void mpicInit (int verbose);
26
27 /*
28  * Configuration Options
29  */
30
31 typedef struct {
32         ulong upper;
33         ulong lower;
34 } PB2OCN_LUT_ENTRY;
35
36 PB2OCN_LUT_ENTRY pb2ocn_lut1[32] = {
37         /* 0 - 7 */
38         {0x00000000, 0x00000201}, /* PBA=0xE000_0000 -> PCI/X (Byte-Swap) */
39         {0x00000000, 0x00000201}, /* PBA=0xE100_0000 -> PCI/X (Byte-Swap) */
40         {0x00000000, 0x00000201}, /* PBA=0xE200_0000 -> PCI/X (Byte-Swap) */
41         {0x00000000, 0x00000201}, /* PBA=0xE300_0000 -> PCI/X (Byte-Swap) */
42         {0x00000000, 0x00000201}, /* PBA=0xE400_0000 -> PCI/X (Byte-Swap) */
43         {0x00000000, 0x00000201}, /* PBA=0xE500_0000 -> PCI/X (Byte-Swap) */
44         {0x00000000, 0x00000201}, /* PBA=0xE600_0000 -> PCI/X (Byte-Swap) */
45         {0x00000000, 0x00000201}, /* PBA=0xE700_0000 -> PCI/X (Byte-Swap) */
46
47         /* 8 - 15 */
48         {0x00000000, 0x00000201}, /* PBA=0xE800_0000 -> PCI/X (Byte-Swap) */
49         {0x00000000, 0x00000201}, /* PBA=0xE900_0000 -> PCI/X (Byte-Swap) */
50         {0x00000000, 0x00000201}, /* PBA=0xEA00_0000 -> PCI/X (Byte-Swap) */
51         {0x00000000, 0x00000201}, /* PBA=0xEB00_0000 -> PCI/X (Byte-Swap) */
52         {0x00000000, 0x00000201}, /* PBA=0xEC00_0000 -> PCI/X (Byte-Swap) */
53         {0x00000000, 0x00000201}, /* PBA=0xED00_0000 -> PCI/X (Byte-Swap) */
54         {0x00000000, 0x00000201}, /* PBA=0xEE00_0000 -> PCI/X (Byte-Swap) */
55         {0x00000000, 0x00000201}, /* PBA=0xEF00_0000 -> PCI/X (Byte-Swap) */
56
57         /* 16 - 23 */
58         {0x00000000, 0x00000201}, /* PBA=0xF000_0000 -> PCI/X (Byte-Swap) */
59         {0x00000000, 0x00000201}, /* PBA=0xF100_0000 -> PCI/X (Byte-Swap) */
60         {0x00000000, 0x00000201}, /* PBA=0xF200_0000 -> PCI/X (Byte-Swap) */
61         {0x00000000, 0x00000201}, /* PBA=0xF300_0000 -> PCI/X (Byte-Swap) */
62         {0x00000000, 0x00000201}, /* PBA=0xF400_0000 -> PCI/X (Byte-Swap) */
63         {0x00000000, 0x00000201}, /* PBA=0xF500_0000 -> PCI/X (Byte-Swap) */
64         {0x00000000, 0x00000201}, /* PBA=0xF600_0000 -> PCI/X (Byte-Swap) */
65         {0x00000000, 0x00000201}, /* PBA=0xF700_0000 -> PCI/X (Byte-Swap) */
66         /* 24 - 31 */
67         {0x00000000, 0x00000201}, /* PBA=0xF800_0000 -> PCI/X (Byte-Swap) */
68         {0x00000000, 0x00000201}, /* PBA=0xF900_0000 -> PCI/X (Byte-Swap) */
69         {0x00000000, 0x00000241}, /* PBA=0xFA00_0000 -> PCI/X  PCI I/O (Byte-Swap + Translate) */
70         {0x00000000, 0x00000201}, /* PBA=0xFB00_0000 -> PCI/X  PCI Config (Byte-Swap) */
71
72         {0x00000000, 0x02000240}, /* PBA=0xFC00_0000 -> HLP */
73         {0x00000000, 0x01000240}, /* PBA=0xFD00_0000 -> HLP */
74         {0x00000000, 0x03000240}, /* PBA=0xFE00_0000 -> HLP */
75         {0x00000000, 0x00000240}  /* PBA=0xFF00_0000 -> HLP : (Translation Enabled + Byte-Swap)*/
76 };
77
78 #ifdef CONFIG_SYS_CLK_SPREAD
79 typedef struct {
80         ulong ctrl0;
81         ulong ctrl1;
82 } PLL_CTRL_SET;
83
84 /*
85  * Clock Generator SPLL0 initialization values
86  * PLL0 configuration table for various PB_CLKO freq.
87  * Uses pre-calculated values for Fs = 30 kHz, D = 0.5%
88  * Fout depends on required PB_CLKO. Based on Fref = 33 MHz
89  */
90
91 static PLL_CTRL_SET pll0_config[8] = {
92         {0x00000000, 0x00000000},       /* 0: bypass */
93         {0x00000000, 0x00000000},       /* 1: reserved */
94         {0x00430044, 0x00000043},       /* 2: CG_PB_CLKO = 183 MHz */
95         {0x005c0044, 0x00000039},       /* 3: CG_PB_CLKO = 100 MHz */
96         {0x005c0044, 0x00000039},       /* 4: CG_PB_CLKO = 133 MHz */
97         {0x004a0044, 0x00000040},       /* 5: CG_PB_CLKO = 167 MHz */
98         {0x005c0044, 0x00000039},       /* 6: CG_PB_CLKO = 200 MHz */
99         {0x004f0044, 0x0000003e}        /* 7: CG_PB_CLKO = 233 MHz */
100 };
101 #endif  /* CONFIG_SYS_CLK_SPREAD */
102
103 /*
104  * Prosessor Bus Clock (in MHz) defined by CG_PB_SELECT
105  * (based on recommended Tsi108 reference clock 33MHz)
106  */
107 static int pb_clk_sel[8] = { 0, 0, 183, 100, 133, 167, 200, 233 };
108
109 /*
110  * get_board_bus_clk ()
111  *
112  * returns the bus clock in Hz.
113  */
114 unsigned long get_board_bus_clk (void)
115 {
116         ulong i;
117
118         /* Detect PB clock freq. */
119         i = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
120         i = (i >> 16) & 0x07;   /* Get PB PLL multiplier */
121
122         return pb_clk_sel[i] * 1000000;
123 }
124
125 /*
126  * board_early_init_f ()
127  *
128  * board-specific initialization executed from flash
129  */
130
131 int board_early_init_f (void)
132 {
133         ulong i;
134
135         gd->mem_clk = 0;
136         i = in32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET +
137                         CG_PWRUP_STATUS);
138         i = (i >> 20) & 0x07;   /* Get GD PLL multiplier */
139         switch (i) {
140         case 0: /* external clock */
141                 printf ("Using external clock\n");
142                 break;
143         case 1: /* system clock */
144                 gd->mem_clk = gd->bus_clk;
145                 break;
146         case 4: /* 133 MHz */
147         case 5: /* 166 MHz */
148         case 6: /* 200 MHz */
149                 gd->mem_clk = pb_clk_sel[i] * 1000000;
150                 break;
151         default:
152                 printf ("Invalid DDR2 clock setting\n");
153                 return -1;
154         }
155         printf ("BUS: %lu MHz\n", get_board_bus_clk() / 1000000);
156         printf ("MEM: %lu MHz\n", gd->mem_clk / 1000000);
157         return 0;
158 }
159
160 /*
161  * board_early_init_r() - Tsi108 initialization function executed right after
162  * relocation. Contains code that cannot be executed from flash.
163  */
164
165 int board_early_init_r (void)
166 {
167         ulong temp, i;
168         ulong reg_val;
169         volatile ulong *reg_ptr;
170
171         reg_ptr =
172                 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x900);
173
174         for (i = 0; i < 32; i++) {
175                 *reg_ptr++ = 0x00000201;        /* SWAP ENABLED */
176                 *reg_ptr++ = 0x00;
177         }
178
179         __asm__ __volatile__ ("eieio");
180         __asm__ __volatile__ ("sync");
181
182         /* Setup PB_OCN_BAR2: size 256B + ENable @ 0x0_80000000 */
183
184         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2,
185                 0x80000001);
186         __asm__ __volatile__ ("sync");
187
188         /* Make sure that OCN_BAR2 decoder is set (to allow following immediate
189          * read from SDRAM)
190          */
191
192         temp = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2);
193         __asm__ __volatile__ ("sync");
194
195         /*
196          * Remap PB_OCN_BAR1 to accomodate PCI-bus aperture and EPROM into the
197          * processor bus address space. Immediately after reset LUT and address
198          * translation are disabled for this BAR. Now we have to initialize LUT
199          * and switch from the BOOT mode to the normal operation mode.
200          *
201          * The aperture defined by PB_OCN_BAR1 startes at address 0xE0000000
202          * and covers 512MB of address space. To allow larger aperture we also
203          * have to relocate register window of Tsi108
204          *
205          * Initialize LUT (32-entries) prior switching PB_OCN_BAR1 from BOOT
206          * mode.
207          *
208          * initialize pointer to LUT associated with PB_OCN_BAR1
209          */
210         reg_ptr =
211                 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x800);
212
213         for (i = 0; i < 32; i++) {
214                 *reg_ptr++ = pb2ocn_lut1[i].lower;
215                 *reg_ptr++ = pb2ocn_lut1[i].upper;
216         }
217
218         __asm__ __volatile__ ("sync");
219
220         /* Base addresses for CS0, CS1, CS2, CS3 */
221
222         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_ADDR,
223                 0x00000000);
224         __asm__ __volatile__ ("sync");
225
226         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_ADDR,
227                 0x00100000);
228         __asm__ __volatile__ ("sync");
229
230         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_ADDR,
231                 0x00200000);
232         __asm__ __volatile__ ("sync");
233
234         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_ADDR,
235                 0x00300000);
236         __asm__ __volatile__ ("sync");
237
238         /* Masks for HLP banks */
239
240         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_MASK,
241                 0xFFF00000);
242         __asm__ __volatile__ ("sync");
243
244         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_MASK,
245                 0xFFF00000);
246         __asm__ __volatile__ ("sync");
247
248         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_MASK,
249                 0xFFF00000);
250         __asm__ __volatile__ ("sync");
251
252         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_MASK,
253                 0xFFF00000);
254         __asm__ __volatile__ ("sync");
255
256         /* Set CTRL0 values for banks */
257
258         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL0,
259                 0x7FFC44C2);
260         __asm__ __volatile__ ("sync");
261
262         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL0,
263                 0x7FFC44C0);
264         __asm__ __volatile__ ("sync");
265
266         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL0,
267                 0x7FFC44C0);
268         __asm__ __volatile__ ("sync");
269
270         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL0,
271                 0x7FFC44C2);
272         __asm__ __volatile__ ("sync");
273
274         /* Set banks to latched mode, enabled, and other default settings */
275
276         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL1,
277                 0x7C0F2000);
278         __asm__ __volatile__ ("sync");
279
280         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL1,
281                 0x7C0F2000);
282         __asm__ __volatile__ ("sync");
283
284         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL1,
285                 0x7C0F2000);
286         __asm__ __volatile__ ("sync");
287
288         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL1,
289                 0x7C0F2000);
290         __asm__ __volatile__ ("sync");
291
292         /*
293          * Set new value for PB_OCN_BAR1: switch from BOOT to LUT mode.
294          * value for PB_OCN_BAR1: (BA-0xE000_0000 + size 512MB + ENable)
295          */
296         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1,
297                 0xE0000011);
298         __asm__ __volatile__ ("sync");
299
300         /* Make sure that OCN_BAR2 decoder is set (to allow following
301          * immediate read from SDRAM)
302          */
303
304         temp = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1);
305         __asm__ __volatile__ ("sync");
306
307         /*
308          * SRI: At this point we have enabled the HLP banks. That means we can
309          * now read from the NVRAM and initialize the environment variables.
310          * We will over-ride the env_init called in board_init_f
311          * This is really a work-around because, the HLP bank 1
312          * where NVRAM resides is not visible during board_init_f
313          * (arch/powerpc/lib/board.c)
314          * Alternatively, we could use the I2C EEPROM at start-up to configure
315          * and enable all HLP banks and not just HLP 0 as is being done for
316          * Taiga Rev. 2.
317          */
318
319         env_init ();
320
321 #ifndef DISABLE_PBM
322
323         /*
324          * For IBM processors we have to set Address-Only commands generated
325          * by PBM that are different from ones set after reset.
326          */
327
328         temp = get_cpu_type ();
329
330         if ((CPU_750FX == temp) || (CPU_750GX == temp))
331                 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_MCMD,
332                         0x00009955);
333 #endif  /* DISABLE_PBM */
334
335 #ifdef CONFIG_PCI
336         /*
337          * Initialize PCI/X block
338          */
339
340         /* Map PCI/X Configuration Space (16MB @ 0x0_FE000000) */
341         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
342                 PCI_PFAB_BAR0_UPPER, 0);
343         __asm__ __volatile__ ("sync");
344
345         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_BAR0,
346                 0xFB000001);
347         __asm__ __volatile__ ("sync");
348
349         /* Set Bus Number for the attached PCI/X bus (we will use 0 for NB) */
350
351         temp =  in32(CONFIG_SYS_TSI108_CSR_BASE +
352                 TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT);
353
354         temp &= ~0xFF00;        /* Clear the BUS_NUM field */
355
356         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT,
357                 temp);
358
359         /* Map PCI/X IO Space (64KB @ 0x0_FD000000) takes one 16MB LUT entry */
360
361         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO_UPPER,
362                 0);
363         __asm__ __volatile__ ("sync");
364
365         /* This register is on the PCI side to interpret the address it receives
366          * and maps it as a IO address.
367          */
368
369         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO,
370                 0x00000001);
371         __asm__ __volatile__ ("sync");
372
373         /*
374          * Map PCI/X Memory Space
375          *
376          * Transactions directed from OCM to PCI Memory Space are directed
377          * from PB to PCI
378          * unchanged (as defined by PB_OCN_BAR1,2 and LUT settings).
379          * If address remapping is required the corresponding PCI_PFAB_MEM32
380          * and PCI_PFAB_PFMx register groups have to be configured.
381          *
382          * Map the path from the PCI/X bus into the system memory
383          *
384          * The memory mapped window assotiated with PCI P2O_BAR2 provides
385          * access to the system memory without address remapping.
386          * All system memory is opened for accesses initiated by PCI/X bus
387          * masters.
388          *
389          * Initialize LUT associated with PCI P2O_BAR2
390          *
391          * set pointer to LUT associated with PCI P2O_BAR2
392          */
393
394         reg_ptr =
395                 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x500);
396
397 #ifdef DISABLE_PBM
398
399         /* In case when PBM is disabled (no HW supported cache snoopng on PB)
400          * P2O_BAR2 is directly mapped into the system memory without address
401          * translation.
402          */
403
404         reg_val = 0x00000004;   /* SDRAM port + NO Addr_Translation */
405
406         for (i = 0; i < 32; i++) {
407                 *reg_ptr++ = reg_val;   /* P2O_BAR2_LUTx */
408                 *reg_ptr++ = 0;         /* P2O_BAR2_LUT_UPPERx */
409         }
410
411         /* value for PCI BAR2 (size = 512MB, Enabled, No Addr. Translation) */
412         reg_val = 0x00007500;
413 #else
414
415         reg_val = 0x00000002;   /* Destination port = PBM */
416
417         for (i = 0; i < 32; i++) {
418                 *reg_ptr++ = reg_val;   /* P2O_BAR2_LUTx */
419 /* P2O_BAR2_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
420                 *reg_ptr++ = 0x40000000;
421 /* offset = 16MB, address translation is enabled to allow byte swapping */
422                 reg_val += 0x01000000;
423         }
424
425 /* value for PCI BAR2 (size = 512MB, Enabled, Address Translation Enabled) */
426         reg_val = 0x00007100;
427 #endif
428
429         __asm__ __volatile__ ("eieio");
430         __asm__ __volatile__ ("sync");
431
432         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
433                 reg_val);
434         __asm__ __volatile__ ("sync");
435
436         /* Set 64-bit PCI bus address for system memory
437          * ( 0 is the best choice for easy mapping)
438          */
439
440         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2,
441                 0x00000000);
442         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2_UPPER,
443                 0x00000000);
444         __asm__ __volatile__ ("sync");
445
446 #ifndef DISABLE_PBM
447         /*
448          *  The memory mapped window assotiated with PCI P2O_BAR3 provides
449          *  access to the system memory using SDRAM OCN port and address
450          *  translation. This is alternative way to access SDRAM from PCI
451          *  required for Tsi108 emulation testing.
452          *  All system memory is opened for accesses initiated by
453          *  PCI/X bus masters.
454          *
455          *  Initialize LUT associated with PCI P2O_BAR3
456          *
457          *  set pointer to LUT associated with PCI P2O_BAR3
458          */
459         reg_ptr =
460                 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x600);
461
462         reg_val = 0x00000004;   /* Destination port = SDC */
463
464         for (i = 0; i < 32; i++) {
465                 *reg_ptr++ = reg_val;   /* P2O_BAR3_LUTx */
466
467 /* P2O_BAR3_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
468                 *reg_ptr++ = 0;
469
470 /* offset = 16MB, address translation is enabled to allow byte swapping */
471                 reg_val += 0x01000000;
472         }
473
474         __asm__ __volatile__ ("eieio");
475         __asm__ __volatile__ ("sync");
476
477         /* Configure PCI P2O_BAR3 (size = 512MB, Enabled) */
478
479         reg_val =
480                 in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
481                  PCI_P2O_PAGE_SIZES);
482         reg_val &= ~0x00FF;
483         reg_val |= 0x0071;
484         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
485                 reg_val);
486         __asm__ __volatile__ ("sync");
487
488         /* Set 64-bit base PCI bus address for window (0x20000000) */
489
490         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3_UPPER,
491                 0x00000000);
492         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3,
493                 0x20000000);
494         __asm__ __volatile__ ("sync");
495
496 #endif  /* !DISABLE_PBM */
497
498 #ifdef ENABLE_PCI_CSR_BAR
499         /* open if required access to Tsi108 CSRs from the PCI/X bus */
500         /* enable BAR0 on the PCI/X bus */
501         reg_val = in32(CONFIG_SYS_TSI108_CSR_BASE +
502                 TSI108_PCI_REG_OFFSET + PCI_MISC_CSR);
503         reg_val |= 0x02;
504         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_MISC_CSR,
505                 reg_val);
506         __asm__ __volatile__ ("sync");
507
508         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0_UPPER,
509                 0x00000000);
510         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0,
511                 CONFIG_SYS_TSI108_CSR_BASE);
512         __asm__ __volatile__ ("sync");
513
514 #endif
515
516         /*
517          * Finally enable PCI/X Bus Master and Memory Space access
518          */
519
520         reg_val = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR);
521         reg_val |= 0x06;
522         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR, reg_val);
523         __asm__ __volatile__ ("sync");
524
525 #endif  /* CONFIG_PCI */
526
527         /*
528          * Initialize MPIC outputs (interrupt pins):
529          * Interrupt routing on the Grendel Emul. Board:
530          * PB_INT[0] -> INT (CPU0)
531          * PB_INT[1] -> INT (CPU1)
532          * PB_INT[2] -> MCP (CPU0)
533          * PB_INT[3] -> MCP (CPU1)
534          * Set interrupt controller outputs as Level_Sensitive/Active_Low
535          */
536         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(0), 0x02);
537         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(1), 0x02);
538         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(2), 0x02);
539         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(3), 0x02);
540         __asm__ __volatile__ ("sync");
541
542         /*
543          * Ensure that Machine Check exception is enabled
544          * We need it to support PCI Bus probing (configuration reads)
545          */
546
547         reg_val = mfmsr ();
548         mtmsr(reg_val | MSR_ME);
549
550         return 0;
551 }
552
553 /*
554  * Needed to print out L2 cache info
555  * used in the misc_init_r function
556  */
557
558 unsigned long get_l2cr (void)
559 {
560         unsigned long l2controlreg;
561         asm volatile ("mfspr %0, 1017":"=r" (l2controlreg):);
562         return l2controlreg;
563 }
564
565 /*
566  * misc_init_r()
567  *
568  * various things to do after relocation
569  *
570  */
571
572 int misc_init_r (void)
573 {
574 #ifdef CONFIG_SYS_CLK_SPREAD    /* Initialize Spread-Spectrum Clock generation */
575         ulong i;
576
577         /* Ensure that Spread-Spectrum is disabled */
578         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, 0);
579         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0, 0);
580
581         /* Initialize PLL1: CG_PCI_CLK , internal OCN_CLK
582          * Uses pre-calculated value for Fout = 800 MHz, Fs = 30 kHz, D = 0.5%
583          */
584
585         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0,
586                 0x002e0044);    /* D = 0.25% */
587         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL1,
588                 0x00000039);    /* BWADJ */
589
590         /* Initialize PLL0: CG_PB_CLKO  */
591         /* Detect PB clock freq. */
592         i = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
593         i = (i >> 16) & 0x07;   /* Get PB PLL multiplier */
594
595         out32 (CONFIG_SYS_TSI108_CSR_BASE +
596                 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, pll0_config[i].ctrl0);
597         out32 (CONFIG_SYS_TSI108_CSR_BASE +
598                 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL1, pll0_config[i].ctrl1);
599
600         /* Wait and set SSEN for both PLL0 and 1 */
601         udelay (1000);
602         out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0,
603                 0x802e0044);    /* D=0.25% */
604         out32 (CONFIG_SYS_TSI108_CSR_BASE +
605                 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0,
606                 0x80000000 | pll0_config[i].ctrl0);
607 #endif  /* CONFIG_SYS_CLK_SPREAD */
608
609 #ifdef CONFIG_SYS_L2
610         l2cache_enable ();
611 #endif
612         printf ("BUS:   %lu MHz\n", gd->bus_clk / 1000000);
613         printf ("MEM:   %lu MHz\n", gd->mem_clk / 1000000);
614
615         /*
616          * All the information needed to print the cache details is avaiblable
617          * at this point i.e. above call to l2cache_enable is the very last
618          * thing done with regards to enabling diabling the cache.
619          * So this seems like a good place to print all this information
620          */
621
622         printf ("CACHE: ");
623         switch (get_cpu_type()) {
624         case CPU_7447A:
625                 printf ("L1 Instruction cache - 32KB 8-way");
626                 (get_hid0 () & (1 << 15)) ? printf (" ENABLED\n") :
627                         printf (" DISABLED\n");
628                 printf ("L1 Data cache - 32KB 8-way");
629                 (get_hid0 () & (1 << 14)) ? printf (" ENABLED\n") :
630                         printf (" DISABLED\n");
631                 printf ("Unified L2 cache - 512KB 8-way");
632                 (get_l2cr () & (1 << 31)) ? printf (" ENABLED\n") :
633                         printf (" DISABLED\n");
634                 printf ("\n");
635                 break;
636
637         case CPU_7448:
638                 printf ("L1 Instruction cache - 32KB 8-way");
639                 (get_hid0 () & (1 << 15)) ? printf (" ENABLED\n") :
640                         printf (" DISABLED\n");
641                 printf ("L1 Data cache - 32KB 8-way");
642                 (get_hid0 () & (1 << 14)) ? printf (" ENABLED\n") :
643                         printf (" DISABLED\n");
644                 printf ("Unified L2 cache - 1MB 8-way");
645                 (get_l2cr () & (1 << 31)) ? printf (" ENABLED\n") :
646                         printf (" DISABLED\n");
647                 break;
648         default:
649                 break;
650         }
651         return 0;
652 }