blob: 9a1e4075bd93df707508326083c059ac18870dbc [file] [log] [blame]
roy zang87c4db02006-11-02 18:59:15 +08001/*****************************************************************************
2 * (C) Copyright 2003; Tundra Semiconductor Corp.
roy zangee311212006-12-01 11:47:36 +08003 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02004 * SPDX-License-Identifier: GPL-2.0+
roy zang87c4db02006-11-02 18:59:15 +08005 *****************************************************************************/
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
Wolfgang Denk1218abf2007-09-15 20:48:41 +020023DECLARE_GLOBAL_DATA_PTR;
24
roy zangee311212006-12-01 11:47:36 +080025extern void mpicInit (int verbose);
roy zang87c4db02006-11-02 18:59:15 +080026
27/*
28 * Configuration Options
29 */
30
31typedef struct {
32 ulong upper;
33 ulong lower;
34} PB2OCN_LUT_ENTRY;
35
36PB2OCN_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) */
Randy Vinson20220d22008-08-13 11:44:57 -070069 {0x00000000, 0x00000241}, /* PBA=0xFA00_0000 -> PCI/X PCI I/O (Byte-Swap + Translate) */
roy zang87c4db02006-11-02 18:59:15 +080070 {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
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020078#ifdef CONFIG_SYS_CLK_SPREAD
roy zang87c4db02006-11-02 18:59:15 +080079typedef 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
91static 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};
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200101#endif /* CONFIG_SYS_CLK_SPREAD */
roy zang87c4db02006-11-02 18:59:15 +0800102
103/*
104 * Prosessor Bus Clock (in MHz) defined by CG_PB_SELECT
105 * (based on recommended Tsi108 reference clock 33MHz)
106 */
107static int pb_clk_sel[8] = { 0, 0, 183, 100, 133, 167, 200, 233 };
108
109/*
roy zangee311212006-12-01 11:47:36 +0800110 * get_board_bus_clk ()
roy zang87c4db02006-11-02 18:59:15 +0800111 *
112 * returns the bus clock in Hz.
113 */
roy zangee311212006-12-01 11:47:36 +0800114unsigned long get_board_bus_clk (void)
roy zang87c4db02006-11-02 18:59:15 +0800115{
116 ulong i;
117
118 /* Detect PB clock freq. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200119 i = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
roy zang87c4db02006-11-02 18:59:15 +0800120 i = (i >> 16) & 0x07; /* Get PB PLL multiplier */
121
122 return pb_clk_sel[i] * 1000000;
123}
124
125/*
roy zangee311212006-12-01 11:47:36 +0800126 * board_early_init_f ()
roy zang87c4db02006-11-02 18:59:15 +0800127 *
128 * board-specific initialization executed from flash
129 */
130
roy zangee311212006-12-01 11:47:36 +0800131int board_early_init_f (void)
roy zang87c4db02006-11-02 18:59:15 +0800132{
roy zang87c4db02006-11-02 18:59:15 +0800133 ulong i;
134
135 gd->mem_clk = 0;
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200136 i = in32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET +
roy zangee311212006-12-01 11:47:36 +0800137 CG_PWRUP_STATUS);
roy zang9d27b3a2006-12-04 17:56:59 +0800138 i = (i >> 20) & 0x07; /* Get GD PLL multiplier */
roy zang87c4db02006-11-02 18:59:15 +0800139 switch (i) {
roy zangee311212006-12-01 11:47:36 +0800140 case 0: /* external clock */
141 printf ("Using external clock\n");
roy zang87c4db02006-11-02 18:59:15 +0800142 break;
roy zangee311212006-12-01 11:47:36 +0800143 case 1: /* system clock */
roy zang87c4db02006-11-02 18:59:15 +0800144 gd->mem_clk = gd->bus_clk;
145 break;
roy zangee311212006-12-01 11:47:36 +0800146 case 4: /* 133 MHz */
147 case 5: /* 166 MHz */
148 case 6: /* 200 MHz */
roy zang87c4db02006-11-02 18:59:15 +0800149 gd->mem_clk = pb_clk_sel[i] * 1000000;
150 break;
151 default:
roy zangee311212006-12-01 11:47:36 +0800152 printf ("Invalid DDR2 clock setting\n");
roy zang87c4db02006-11-02 18:59:15 +0800153 return -1;
154 }
Wolfgang Denkbde63582008-07-11 22:56:11 +0200155 printf ("BUS: %lu MHz\n", get_board_bus_clk() / 1000000);
156 printf ("MEM: %lu MHz\n", gd->mem_clk / 1000000);
roy zang87c4db02006-11-02 18:59:15 +0800157 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
roy zangee311212006-12-01 11:47:36 +0800165int board_early_init_r (void)
roy zang87c4db02006-11-02 18:59:15 +0800166{
167 ulong temp, i;
168 ulong reg_val;
169 volatile ulong *reg_ptr;
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100170
roy zang87c4db02006-11-02 18:59:15 +0800171 reg_ptr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200172 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x900);
roy zang87c4db02006-11-02 18:59:15 +0800173
174 for (i = 0; i < 32; i++) {
175 *reg_ptr++ = 0x00000201; /* SWAP ENABLED */
176 *reg_ptr++ = 0x00;
177 }
178
roy zangee311212006-12-01 11:47:36 +0800179 __asm__ __volatile__ ("eieio");
180 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800181
182 /* Setup PB_OCN_BAR2: size 256B + ENable @ 0x0_80000000 */
183
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200184 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2,
roy zangee311212006-12-01 11:47:36 +0800185 0x80000001);
186 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800187
188 /* Make sure that OCN_BAR2 decoder is set (to allow following immediate
roy zangee311212006-12-01 11:47:36 +0800189 * read from SDRAM)
roy zang87c4db02006-11-02 18:59:15 +0800190 */
191
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200192 temp = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2);
roy zangee311212006-12-01 11:47:36 +0800193 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800194
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.
roy zangee311212006-12-01 11:47:36 +0800200 *
roy zang87c4db02006-11-02 18:59:15 +0800201 * The aperture defined by PB_OCN_BAR1 startes at address 0xE0000000
roy zangee311212006-12-01 11:47:36 +0800202 * and covers 512MB of address space. To allow larger aperture we also
roy zang87c4db02006-11-02 18:59:15 +0800203 * have to relocate register window of Tsi108
204 *
roy zangee311212006-12-01 11:47:36 +0800205 * Initialize LUT (32-entries) prior switching PB_OCN_BAR1 from BOOT
roy zang87c4db02006-11-02 18:59:15 +0800206 * mode.
roy zangee311212006-12-01 11:47:36 +0800207 *
roy zang87c4db02006-11-02 18:59:15 +0800208 * initialize pointer to LUT associated with PB_OCN_BAR1
209 */
210 reg_ptr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200211 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x800);
roy zang87c4db02006-11-02 18:59:15 +0800212
213 for (i = 0; i < 32; i++) {
214 *reg_ptr++ = pb2ocn_lut1[i].lower;
215 *reg_ptr++ = pb2ocn_lut1[i].upper;
216 }
217
roy zangee311212006-12-01 11:47:36 +0800218 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800219
roy zang9d27b3a2006-12-04 17:56:59 +0800220 /* Base addresses for CS0, CS1, CS2, CS3 */
roy zang87c4db02006-11-02 18:59:15 +0800221
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200222 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_ADDR,
roy zangee311212006-12-01 11:47:36 +0800223 0x00000000);
224 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800225
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200226 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_ADDR,
roy zangee311212006-12-01 11:47:36 +0800227 0x00100000);
228 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800229
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200230 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_ADDR,
roy zangee311212006-12-01 11:47:36 +0800231 0x00200000);
232 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800233
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200234 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_ADDR,
roy zangee311212006-12-01 11:47:36 +0800235 0x00300000);
236 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800237
238 /* Masks for HLP banks */
239
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200240 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_MASK,
roy zangee311212006-12-01 11:47:36 +0800241 0xFFF00000);
242 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800243
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200244 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_MASK,
roy zangee311212006-12-01 11:47:36 +0800245 0xFFF00000);
246 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800247
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200248 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_MASK,
roy zangee311212006-12-01 11:47:36 +0800249 0xFFF00000);
250 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800251
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200252 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_MASK,
roy zangee311212006-12-01 11:47:36 +0800253 0xFFF00000);
254 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800255
256 /* Set CTRL0 values for banks */
257
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200258 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL0,
roy zangee311212006-12-01 11:47:36 +0800259 0x7FFC44C2);
260 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800261
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200262 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL0,
roy zangee311212006-12-01 11:47:36 +0800263 0x7FFC44C0);
264 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800265
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200266 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL0,
roy zangee311212006-12-01 11:47:36 +0800267 0x7FFC44C0);
268 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800269
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200270 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL0,
roy zangee311212006-12-01 11:47:36 +0800271 0x7FFC44C2);
272 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800273
274 /* Set banks to latched mode, enabled, and other default settings */
275
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200276 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL1,
roy zangee311212006-12-01 11:47:36 +0800277 0x7C0F2000);
278 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800279
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200280 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL1,
roy zangee311212006-12-01 11:47:36 +0800281 0x7C0F2000);
282 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800283
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200284 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL1,
roy zangee311212006-12-01 11:47:36 +0800285 0x7C0F2000);
286 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800287
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200288 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL1,
roy zangee311212006-12-01 11:47:36 +0800289 0x7C0F2000);
290 __asm__ __volatile__ ("sync");
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100291
roy zang87c4db02006-11-02 18:59:15 +0800292 /*
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 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200296 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1,
roy zangee311212006-12-01 11:47:36 +0800297 0xE0000011);
298 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800299
roy zangee311212006-12-01 11:47:36 +0800300 /* Make sure that OCN_BAR2 decoder is set (to allow following
301 * immediate read from SDRAM)
roy zang87c4db02006-11-02 18:59:15 +0800302 */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100303
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200304 temp = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1);
roy zangee311212006-12-01 11:47:36 +0800305 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800306
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
roy zangee311212006-12-01 11:47:36 +0800312 * where NVRAM resides is not visible during board_init_f
Stefan Roesea47a12b2010-04-15 16:07:28 +0200313 * (arch/powerpc/lib/board.c)
roy zang87c4db02006-11-02 18:59:15 +0800314 * 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 */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100318
roy zangee311212006-12-01 11:47:36 +0800319 env_init ();
roy zang87c4db02006-11-02 18:59:15 +0800320
321#ifndef DISABLE_PBM
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100322
roy zang87c4db02006-11-02 18:59:15 +0800323 /*
roy zangee311212006-12-01 11:47:36 +0800324 * For IBM processors we have to set Address-Only commands generated
roy zang87c4db02006-11-02 18:59:15 +0800325 * by PBM that are different from ones set after reset.
326 */
327
roy zangee311212006-12-01 11:47:36 +0800328 temp = get_cpu_type ();
roy zang87c4db02006-11-02 18:59:15 +0800329
roy zangee311212006-12-01 11:47:36 +0800330 if ((CPU_750FX == temp) || (CPU_750GX == temp))
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200331 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_MCMD,
roy zangee311212006-12-01 11:47:36 +0800332 0x00009955);
roy zang87c4db02006-11-02 18:59:15 +0800333#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) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200341 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
roy zangee311212006-12-01 11:47:36 +0800342 PCI_PFAB_BAR0_UPPER, 0);
343 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800344
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200345 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_BAR0,
roy zangee311212006-12-01 11:47:36 +0800346 0xFB000001);
347 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800348
349 /* Set Bus Number for the attached PCI/X bus (we will use 0 for NB) */
350
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200351 temp = in32(CONFIG_SYS_TSI108_CSR_BASE +
roy zangee311212006-12-01 11:47:36 +0800352 TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT);
roy zang87c4db02006-11-02 18:59:15 +0800353
354 temp &= ~0xFF00; /* Clear the BUS_NUM field */
355
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200356 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT,
roy zangee311212006-12-01 11:47:36 +0800357 temp);
roy zang87c4db02006-11-02 18:59:15 +0800358
359 /* Map PCI/X IO Space (64KB @ 0x0_FD000000) takes one 16MB LUT entry */
360
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200361 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO_UPPER,
roy zangee311212006-12-01 11:47:36 +0800362 0);
363 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800364
365 /* This register is on the PCI side to interpret the address it receives
roy zangee311212006-12-01 11:47:36 +0800366 * and maps it as a IO address.
roy zang87c4db02006-11-02 18:59:15 +0800367 */
368
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200369 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO,
Randy Vinson20220d22008-08-13 11:44:57 -0700370 0x00000001);
roy zangee311212006-12-01 11:47:36 +0800371 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800372
373 /*
374 * Map PCI/X Memory Space
375 *
roy zangee311212006-12-01 11:47:36 +0800376 * Transactions directed from OCM to PCI Memory Space are directed
roy zang87c4db02006-11-02 18:59:15 +0800377 * 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 *
roy zangee311212006-12-01 11:47:36 +0800384 * The memory mapped window assotiated with PCI P2O_BAR2 provides
roy zang87c4db02006-11-02 18:59:15 +0800385 * 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 =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200395 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x500);
roy zang87c4db02006-11-02 18:59:15 +0800396
397#ifdef DISABLE_PBM
398
roy zangee311212006-12-01 11:47:36 +0800399 /* 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.
roy zang87c4db02006-11-02 18:59:15 +0800402 */
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
roy zangee311212006-12-01 11:47:36 +0800429 __asm__ __volatile__ ("eieio");
430 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800431
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200432 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
roy zangee311212006-12-01 11:47:36 +0800433 reg_val);
434 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800435
roy zangee311212006-12-01 11:47:36 +0800436 /* Set 64-bit PCI bus address for system memory
437 * ( 0 is the best choice for easy mapping)
roy zang87c4db02006-11-02 18:59:15 +0800438 */
439
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200440 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2,
roy zangee311212006-12-01 11:47:36 +0800441 0x00000000);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200442 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2_UPPER,
roy zangee311212006-12-01 11:47:36 +0800443 0x00000000);
444 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800445
446#ifndef DISABLE_PBM
447 /*
roy zangee311212006-12-01 11:47:36 +0800448 * 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
roy zang87c4db02006-11-02 18:59:15 +0800451 * required for Tsi108 emulation testing.
roy zangee311212006-12-01 11:47:36 +0800452 * All system memory is opened for accesses initiated by
roy zang87c4db02006-11-02 18:59:15 +0800453 * 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 =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200460 (ulong *) (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x600);
roy zang87c4db02006-11-02 18:59:15 +0800461
462 reg_val = 0x00000004; /* Destination port = SDC */
463
464 for (i = 0; i < 32; i++) {
465 *reg_ptr++ = reg_val; /* P2O_BAR3_LUTx */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100466
roy zang87c4db02006-11-02 18:59:15 +0800467/* P2O_BAR3_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100468 *reg_ptr++ = 0;
469
roy zang87c4db02006-11-02 18:59:15 +0800470/* offset = 16MB, address translation is enabled to allow byte swapping */
471 reg_val += 0x01000000;
472 }
473
roy zangee311212006-12-01 11:47:36 +0800474 __asm__ __volatile__ ("eieio");
475 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800476
477 /* Configure PCI P2O_BAR3 (size = 512MB, Enabled) */
478
479 reg_val =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200480 in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
roy zang87c4db02006-11-02 18:59:15 +0800481 PCI_P2O_PAGE_SIZES);
482 reg_val &= ~0x00FF;
483 reg_val |= 0x0071;
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200484 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
roy zangee311212006-12-01 11:47:36 +0800485 reg_val);
486 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800487
488 /* Set 64-bit base PCI bus address for window (0x20000000) */
489
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200490 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3_UPPER,
roy zangee311212006-12-01 11:47:36 +0800491 0x00000000);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200492 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3,
roy zangee311212006-12-01 11:47:36 +0800493 0x20000000);
494 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800495
496#endif /* !DISABLE_PBM */
497
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100498#ifdef ENABLE_PCI_CSR_BAR
roy zang87c4db02006-11-02 18:59:15 +0800499 /* open if required access to Tsi108 CSRs from the PCI/X bus */
500 /* enable BAR0 on the PCI/X bus */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200501 reg_val = in32(CONFIG_SYS_TSI108_CSR_BASE +
roy zangee311212006-12-01 11:47:36 +0800502 TSI108_PCI_REG_OFFSET + PCI_MISC_CSR);
roy zang87c4db02006-11-02 18:59:15 +0800503 reg_val |= 0x02;
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200504 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_MISC_CSR,
roy zangee311212006-12-01 11:47:36 +0800505 reg_val);
506 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800507
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200508 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0_UPPER,
roy zangee311212006-12-01 11:47:36 +0800509 0x00000000);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200510 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0,
511 CONFIG_SYS_TSI108_CSR_BASE);
roy zangee311212006-12-01 11:47:36 +0800512 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800513
514#endif
515
516 /*
517 * Finally enable PCI/X Bus Master and Memory Space access
518 */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100519
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200520 reg_val = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR);
roy zang87c4db02006-11-02 18:59:15 +0800521 reg_val |= 0x06;
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200522 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR, reg_val);
roy zangee311212006-12-01 11:47:36 +0800523 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800524
525#endif /* CONFIG_PCI */
526
527 /*
528 * Initialize MPIC outputs (interrupt pins):
529 * Interrupt routing on the Grendel Emul. Board:
roy zangee311212006-12-01 11:47:36 +0800530 * PB_INT[0] -> INT (CPU0)
531 * PB_INT[1] -> INT (CPU1)
532 * PB_INT[2] -> MCP (CPU0)
533 * PB_INT[3] -> MCP (CPU1)
roy zang87c4db02006-11-02 18:59:15 +0800534 * Set interrupt controller outputs as Level_Sensitive/Active_Low
535 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200536 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);
roy zangee311212006-12-01 11:47:36 +0800540 __asm__ __volatile__ ("sync");
roy zang87c4db02006-11-02 18:59:15 +0800541
542 /*
543 * Ensure that Machine Check exception is enabled
544 * We need it to support PCI Bus probing (configuration reads)
545 */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100546
roy zangee311212006-12-01 11:47:36 +0800547 reg_val = mfmsr ();
roy zang87c4db02006-11-02 18:59:15 +0800548 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
roy zangee311212006-12-01 11:47:36 +0800558unsigned long get_l2cr (void)
roy zang87c4db02006-11-02 18:59:15 +0800559{
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
roy zangee311212006-12-01 11:47:36 +0800572int misc_init_r (void)
roy zang87c4db02006-11-02 18:59:15 +0800573{
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200574#ifdef CONFIG_SYS_CLK_SPREAD /* Initialize Spread-Spectrum Clock generation */
roy zang87c4db02006-11-02 18:59:15 +0800575 ulong i;
576
577 /* Ensure that Spread-Spectrum is disabled */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200578 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);
roy zang87c4db02006-11-02 18:59:15 +0800580
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
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200585 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0,
roy zangee311212006-12-01 11:47:36 +0800586 0x002e0044); /* D = 0.25% */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200587 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL1,
roy zangee311212006-12-01 11:47:36 +0800588 0x00000039); /* BWADJ */
roy zang87c4db02006-11-02 18:59:15 +0800589
590 /* Initialize PLL0: CG_PB_CLKO */
591 /* Detect PB clock freq. */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200592 i = in32(CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
roy zang87c4db02006-11-02 18:59:15 +0800593 i = (i >> 16) & 0x07; /* Get PB PLL multiplier */
594
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200595 out32 (CONFIG_SYS_TSI108_CSR_BASE +
roy zangee311212006-12-01 11:47:36 +0800596 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, pll0_config[i].ctrl0);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200597 out32 (CONFIG_SYS_TSI108_CSR_BASE +
roy zangee311212006-12-01 11:47:36 +0800598 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL1, pll0_config[i].ctrl1);
roy zang87c4db02006-11-02 18:59:15 +0800599
600 /* Wait and set SSEN for both PLL0 and 1 */
roy zangee311212006-12-01 11:47:36 +0800601 udelay (1000);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200602 out32 (CONFIG_SYS_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0,
roy zangee311212006-12-01 11:47:36 +0800603 0x802e0044); /* D=0.25% */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200604 out32 (CONFIG_SYS_TSI108_CSR_BASE +
roy zangee311212006-12-01 11:47:36 +0800605 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0,
Wolfgang Denk53677ef2008-05-20 16:00:29 +0200606 0x80000000 | pll0_config[i].ctrl0);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200607#endif /* CONFIG_SYS_CLK_SPREAD */
roy zang87c4db02006-11-02 18:59:15 +0800608
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200609#ifdef CONFIG_SYS_L2
roy zangee311212006-12-01 11:47:36 +0800610 l2cache_enable ();
roy zang87c4db02006-11-02 18:59:15 +0800611#endif
Wolfgang Denkbde63582008-07-11 22:56:11 +0200612 printf ("BUS: %lu MHz\n", gd->bus_clk / 1000000);
613 printf ("MEM: %lu MHz\n", gd->mem_clk / 1000000);
roy zang87c4db02006-11-02 18:59:15 +0800614
615 /*
roy zangee311212006-12-01 11:47:36 +0800616 * 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.
roy zang87c4db02006-11-02 18:59:15 +0800619 * So this seems like a good place to print all this information
620 */
Wolfgang Denk647d3c32007-03-04 01:36:05 +0100621
roy zangee311212006-12-01 11:47:36 +0800622 printf ("CACHE: ");
roy zang87c4db02006-11-02 18:59:15 +0800623 switch (get_cpu_type()) {
624 case CPU_7447A:
roy zangee311212006-12-01 11:47:36 +0800625 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");
roy zang87c4db02006-11-02 18:59:15 +0800635 break;
636
637 case CPU_7448:
roy zangee311212006-12-01 11:47:36 +0800638 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");
roy zang87c4db02006-11-02 18:59:15 +0800647 break;
648 default:
649 break;
650 }
651 return 0;
652}