1 /*****************************************************************************
2 * (C) Copyright 2003; Tundra Semiconductor Corp.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18 *****************************************************************************/
20 /*----------------------------------------------------------------------------
21 * FILENAME: tsi108_init.c
23 * Originator: Alex Bounine
26 * Initialization code for the Tundra Tsi108 bridge chip
27 *---------------------------------------------------------------------------*/
33 #include <asm/processor.h>
36 extern void mpicInit(int verbose);
39 * Configuration Options
47 PB2OCN_LUT_ENTRY pb2ocn_lut1[32] = {
49 {0x00000000, 0x00000201}, /* PBA=0xE000_0000 -> PCI/X (Byte-Swap) */
50 {0x00000000, 0x00000201}, /* PBA=0xE100_0000 -> PCI/X (Byte-Swap) */
51 {0x00000000, 0x00000201}, /* PBA=0xE200_0000 -> PCI/X (Byte-Swap) */
52 {0x00000000, 0x00000201}, /* PBA=0xE300_0000 -> PCI/X (Byte-Swap) */
53 {0x00000000, 0x00000201}, /* PBA=0xE400_0000 -> PCI/X (Byte-Swap) */
54 {0x00000000, 0x00000201}, /* PBA=0xE500_0000 -> PCI/X (Byte-Swap) */
55 {0x00000000, 0x00000201}, /* PBA=0xE600_0000 -> PCI/X (Byte-Swap) */
56 {0x00000000, 0x00000201}, /* PBA=0xE700_0000 -> PCI/X (Byte-Swap) */
59 {0x00000000, 0x00000201}, /* PBA=0xE800_0000 -> PCI/X (Byte-Swap) */
60 {0x00000000, 0x00000201}, /* PBA=0xE900_0000 -> PCI/X (Byte-Swap) */
61 {0x00000000, 0x00000201}, /* PBA=0xEA00_0000 -> PCI/X (Byte-Swap) */
62 {0x00000000, 0x00000201}, /* PBA=0xEB00_0000 -> PCI/X (Byte-Swap) */
63 {0x00000000, 0x00000201}, /* PBA=0xEC00_0000 -> PCI/X (Byte-Swap) */
64 {0x00000000, 0x00000201}, /* PBA=0xED00_0000 -> PCI/X (Byte-Swap) */
65 {0x00000000, 0x00000201}, /* PBA=0xEE00_0000 -> PCI/X (Byte-Swap) */
66 {0x00000000, 0x00000201}, /* PBA=0xEF00_0000 -> PCI/X (Byte-Swap) */
69 {0x00000000, 0x00000201}, /* PBA=0xF000_0000 -> PCI/X (Byte-Swap) */
70 {0x00000000, 0x00000201}, /* PBA=0xF100_0000 -> PCI/X (Byte-Swap) */
71 {0x00000000, 0x00000201}, /* PBA=0xF200_0000 -> PCI/X (Byte-Swap) */
72 {0x00000000, 0x00000201}, /* PBA=0xF300_0000 -> PCI/X (Byte-Swap) */
73 {0x00000000, 0x00000201}, /* PBA=0xF400_0000 -> PCI/X (Byte-Swap) */
74 {0x00000000, 0x00000201}, /* PBA=0xF500_0000 -> PCI/X (Byte-Swap) */
75 {0x00000000, 0x00000201}, /* PBA=0xF600_0000 -> PCI/X (Byte-Swap) */
76 {0x00000000, 0x00000201}, /* PBA=0xF700_0000 -> PCI/X (Byte-Swap) */
78 {0x00000000, 0x00000201}, /* PBA=0xF800_0000 -> PCI/X (Byte-Swap) */
79 {0x00000000, 0x00000201}, /* PBA=0xF900_0000 -> PCI/X (Byte-Swap) */
80 {0x00000000, 0x00000201}, /* PBA=0xFA00_0000 -> PCI/X PCI I/O (Byte-Swap) */
81 {0x00000000, 0x00000201}, /* PBA=0xFB00_0000 -> PCI/X PCI Config (Byte-Swap) */
83 {0x00000000, 0x02000240}, /* PBA=0xFC00_0000 -> HLP */
84 {0x00000000, 0x01000240}, /* PBA=0xFD00_0000 -> HLP */
85 {0x00000000, 0x03000240}, /* PBA=0xFE00_0000 -> HLP */
86 {0x00000000, 0x00000240} /* PBA=0xFF00_0000 -> HLP : (Translation Enabled + Byte-Swap)*/
96 * Clock Generator SPLL0 initialization values
97 * PLL0 configuration table for various PB_CLKO freq.
98 * Uses pre-calculated values for Fs = 30 kHz, D = 0.5%
99 * Fout depends on required PB_CLKO. Based on Fref = 33 MHz
102 static PLL_CTRL_SET pll0_config[8] = {
103 {0x00000000, 0x00000000}, /* 0: bypass */
104 {0x00000000, 0x00000000}, /* 1: reserved */
105 {0x00430044, 0x00000043}, /* 2: CG_PB_CLKO = 183 MHz */
106 {0x005c0044, 0x00000039}, /* 3: CG_PB_CLKO = 100 MHz */
107 {0x005c0044, 0x00000039}, /* 4: CG_PB_CLKO = 133 MHz */
108 {0x004a0044, 0x00000040}, /* 5: CG_PB_CLKO = 167 MHz */
109 {0x005c0044, 0x00000039}, /* 6: CG_PB_CLKO = 200 MHz */
110 {0x004f0044, 0x0000003e} /* 7: CG_PB_CLKO = 233 MHz */
112 #endif /* CFG_CLK_SPREAD */
115 * Prosessor Bus Clock (in MHz) defined by CG_PB_SELECT
116 * (based on recommended Tsi108 reference clock 33MHz)
118 static int pb_clk_sel[8] = { 0, 0, 183, 100, 133, 167, 200, 233 };
121 * get_board_bus_clk()
123 * returns the bus clock in Hz.
125 unsigned long get_board_bus_clk(void)
129 /* Detect PB clock freq. */
130 i = in32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
131 i = (i >> 16) & 0x07; /* Get PB PLL multiplier */
133 return pb_clk_sel[i] * 1000000;
137 * board_early_init_f()
139 * board-specific initialization executed from flash
142 int board_early_init_f(void)
144 DECLARE_GLOBAL_DATA_PTR;
148 i = in32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
149 i = (i >> 20) & 0x07;
152 printf("Using external clock\n");
155 gd->mem_clk = gd->bus_clk;
160 gd->mem_clk = pb_clk_sel[i] * 1000000;
163 printf("Invalid DDR2 clock setting\n");
166 printf("BUS! %d MHz\n", get_board_bus_clk() / 1000000);
167 printf("MEM! %d MHz\n", gd->mem_clk / 1000000);
172 * board_early_init_r() - Tsi108 initialization function executed right after
173 * relocation. Contains code that cannot be executed from flash.
176 int board_early_init_r(void)
180 volatile ulong *reg_ptr;
183 (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x900);
185 for (i = 0; i < 32; i++) {
186 *reg_ptr++ = 0x00000201; /* SWAP ENABLED */
190 __asm__ __volatile__("eieio");
191 __asm__ __volatile__("sync");
193 /* Setup PB_OCN_BAR2: size 256B + ENable @ 0x0_80000000 */
195 out32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2,
197 __asm__ __volatile__("sync");
199 /* Make sure that OCN_BAR2 decoder is set (to allow following immediate
203 temp = in32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR2);
204 __asm__ __volatile__("sync");
207 * Remap PB_OCN_BAR1 to accomodate PCI-bus aperture and EPROM into the
208 * processor bus address space. Immediately after reset LUT and address
209 * translation are disabled for this BAR. Now we have to initialize LUT
210 * and switch from the BOOT mode to the normal operation mode.
212 * The aperture defined by PB_OCN_BAR1 startes at address 0xE0000000
213 * and covers 512MB of address space. To allow larger aperture we also
214 * have to relocate register window of Tsi108
216 * Initialize LUT (32-entries) prior switching PB_OCN_BAR1 from BOOT
219 * initialize pointer to LUT associated with PB_OCN_BAR1
222 (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + 0x800);
224 for (i = 0; i < 32; i++) {
225 *reg_ptr++ = pb2ocn_lut1[i].lower;
226 *reg_ptr++ = pb2ocn_lut1[i].upper;
229 __asm__ __volatile__("sync");
231 /* Base addresses for Cs0, CS1, CS2, CS3 */
233 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_ADDR,
235 __asm__ __volatile__("sync");
237 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_ADDR,
239 __asm__ __volatile__("sync");
241 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_ADDR,
243 __asm__ __volatile__("sync");
245 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_ADDR,
247 __asm__ __volatile__("sync");
249 /* Masks for HLP banks */
251 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_MASK,
253 __asm__ __volatile__("sync");
255 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_MASK,
257 __asm__ __volatile__("sync");
259 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_MASK,
261 __asm__ __volatile__("sync");
263 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_MASK,
265 __asm__ __volatile__("sync");
267 /* Set CTRL0 values for banks */
269 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL0,
271 __asm__ __volatile__("sync");
273 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL0,
275 __asm__ __volatile__("sync");
277 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL0,
279 __asm__ __volatile__("sync");
281 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL0,
283 __asm__ __volatile__("sync");
285 /* Set banks to latched mode, enabled, and other default settings */
287 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B0_CTRL1,
289 __asm__ __volatile__("sync");
291 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B1_CTRL1,
293 __asm__ __volatile__("sync");
295 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B2_CTRL1,
297 __asm__ __volatile__("sync");
299 out32(CFG_TSI108_CSR_BASE + TSI108_HLP_REG_OFFSET + HLP_B3_CTRL1,
301 __asm__ __volatile__("sync");
304 * Set new value for PB_OCN_BAR1: switch from BOOT to LUT mode.
305 * value for PB_OCN_BAR1: (BA-0xE000_0000 + size 512MB + ENable)
307 out32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1,
309 __asm__ __volatile__("sync");
311 /* Make sure that OCN_BAR2 decoder is set (to allow following
312 * immediate read from SDRAM)
315 temp = in32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_OCN_BAR1);
316 __asm__ __volatile__("sync");
319 * SRI: At this point we have enabled the HLP banks. That means we can
320 * now read from the NVRAM and initialize the environment variables.
321 * We will over-ride the env_init called in board_init_f
322 * This is really a work-around because, the HLP bank 1
323 * where NVRAM resides is not visible during board_init_f
325 * Alternatively, we could use the I2C EEPROM at start-up to configure
326 * and enable all HLP banks and not just HLP 0 as is being done for
335 * For IBM processors we have to set Address-Only commands generated
336 * by PBM that are different from ones set after reset.
339 temp = get_cpu_type();
341 if ((CPU_750FX == temp) || (CPU_750GX == temp)) {
342 out32(CFG_TSI108_CSR_BASE + TSI108_PB_REG_OFFSET + PB_MCMD,
345 #endif /* DISABLE_PBM */
349 * Initialize PCI/X block
352 /* Map PCI/X Configuration Space (16MB @ 0x0_FE000000) */
353 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_BAR0_UPPER,
355 __asm__ __volatile__("sync");
357 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_BAR0,
359 __asm__ __volatile__("sync");
361 /* Set Bus Number for the attached PCI/X bus (we will use 0 for NB) */
364 in32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT);
366 temp &= ~0xFF00; /* Clear the BUS_NUM field */
368 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PCIX_STAT,
371 /* Map PCI/X IO Space (64KB @ 0x0_FD000000) takes one 16MB LUT entry */
373 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO_UPPER,
375 __asm__ __volatile__("sync");
377 /* This register is on the PCI side to interpret the address it receives
378 * and maps it as a IO address.
381 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_PFAB_IO,
383 __asm__ __volatile__("sync");
386 * Map PCI/X Memory Space
388 * Transactions directed from OCM to PCI Memory Space are directed
390 * unchanged (as defined by PB_OCN_BAR1,2 and LUT settings).
391 * If address remapping is required the corresponding PCI_PFAB_MEM32
392 * and PCI_PFAB_PFMx register groups have to be configured.
394 * Map the path from the PCI/X bus into the system memory
396 * The memory mapped window assotiated with PCI P2O_BAR2 provides
397 * access to the system memory without address remapping.
398 * All system memory is opened for accesses initiated by PCI/X bus
401 * Initialize LUT associated with PCI P2O_BAR2
403 * set pointer to LUT associated with PCI P2O_BAR2
407 (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x500);
411 /* In case when PBM is disabled (no HW supported cache snoopng on PB)
412 * P2O_BAR2 is directly mapped into the system memory without address
416 reg_val = 0x00000004; /* SDRAM port + NO Addr_Translation */
418 for (i = 0; i < 32; i++) {
419 *reg_ptr++ = reg_val; /* P2O_BAR2_LUTx */
420 *reg_ptr++ = 0; /* P2O_BAR2_LUT_UPPERx */
423 /* value for PCI BAR2 (size = 512MB, Enabled, No Addr. Translation) */
424 reg_val = 0x00007500;
427 reg_val = 0x00000002; /* Destination port = PBM */
429 for (i = 0; i < 32; i++) {
430 *reg_ptr++ = reg_val; /* P2O_BAR2_LUTx */
431 /* P2O_BAR2_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
432 *reg_ptr++ = 0x40000000;
433 /* offset = 16MB, address translation is enabled to allow byte swapping */
434 reg_val += 0x01000000;
437 /* value for PCI BAR2 (size = 512MB, Enabled, Address Translation Enabled) */
438 reg_val = 0x00007100;
441 __asm__ __volatile__("eieio");
442 __asm__ __volatile__("sync");
444 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
446 __asm__ __volatile__("sync");
448 /* Set 64-bit PCI bus address for system memory
449 * ( 0 is the best choice for easy mapping)
452 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2,
454 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR2_UPPER,
456 __asm__ __volatile__("sync");
460 * The memory mapped window assotiated with PCI P2O_BAR3 provides
461 * access to the system memory using SDRAM OCN port and address
462 * translation. This is alternative way to access SDRAM from PCI
463 * required for Tsi108 emulation testing.
464 * All system memory is opened for accesses initiated by
467 * Initialize LUT associated with PCI P2O_BAR3
469 * set pointer to LUT associated with PCI P2O_BAR3
472 (ulong *) (CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + 0x600);
474 reg_val = 0x00000004; /* Destination port = SDC */
476 for (i = 0; i < 32; i++) {
477 *reg_ptr++ = reg_val; /* P2O_BAR3_LUTx */
479 /* P2O_BAR3_LUT_UPPERx : Set data swapping mode for PBM (byte swapping) */
482 /* offset = 16MB, address translation is enabled to allow byte swapping */
483 reg_val += 0x01000000;
486 __asm__ __volatile__("eieio");
487 __asm__ __volatile__("sync");
489 /* Configure PCI P2O_BAR3 (size = 512MB, Enabled) */
492 in32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET +
496 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_PAGE_SIZES,
498 __asm__ __volatile__("sync");
500 /* Set 64-bit base PCI bus address for window (0x20000000) */
502 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3_UPPER,
504 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR3,
506 __asm__ __volatile__("sync");
508 #endif /* !DISABLE_PBM */
510 #ifdef ENABLE_PCI_CSR_BAR
511 /* open if required access to Tsi108 CSRs from the PCI/X bus */
512 /* enable BAR0 on the PCI/X bus */
514 in32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_MISC_CSR);
516 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_MISC_CSR,
518 __asm__ __volatile__("sync");
520 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0_UPPER,
522 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_P2O_BAR0,
523 CFG_TSI108_CSR_BASE);
524 __asm__ __volatile__("sync");
529 * Finally enable PCI/X Bus Master and Memory Space access
532 reg_val = in32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR);
534 out32(CFG_TSI108_CSR_BASE + TSI108_PCI_REG_OFFSET + PCI_CSR, reg_val);
535 __asm__ __volatile__("sync");
537 #endif /* CONFIG_PCI */
540 * Initialize MPIC outputs (interrupt pins):
541 * Interrupt routing on the Grendel Emul. Board:
542 * PB_INT[0] -> INT (CPU0)
543 * PB_INT[1] -> INT (CPU1)
544 * PB_INT[2] -> MCP (CPU0)
545 * PB_INT[3] -> MCP (CPU1)
546 * Set interrupt controller outputs as Level_Sensitive/Active_Low
548 out32(CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(0), 0x02);
549 out32(CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(1), 0x02);
550 out32(CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(2), 0x02);
551 out32(CFG_TSI108_CSR_BASE + TSI108_MPIC_REG_OFFSET + MPIC_CSR(3), 0x02);
552 __asm__ __volatile__("sync");
555 * Ensure that Machine Check exception is enabled
556 * We need it to support PCI Bus probing (configuration reads)
560 mtmsr(reg_val | MSR_ME);
566 * Needed to print out L2 cache info
567 * used in the misc_init_r function
570 unsigned long get_l2cr(void)
572 unsigned long l2controlreg;
573 asm volatile ("mfspr %0, 1017":"=r" (l2controlreg):);
580 * various things to do after relocation
584 int misc_init_r(void)
586 DECLARE_GLOBAL_DATA_PTR;
587 #ifdef CFG_CLK_SPREAD /* Initialize Spread-Spectrum Clock generation */
590 /* Ensure that Spread-Spectrum is disabled */
591 out32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, 0);
592 out32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0, 0);
594 /* Initialize PLL1: CG_PCI_CLK , internal OCN_CLK
595 * Uses pre-calculated value for Fout = 800 MHz, Fs = 30 kHz, D = 0.5%
598 out32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0, 0x002e0044); /* D = 0.25% */
599 out32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL1, 0x00000039); /* BWADJ */
601 /* Initialize PLL0: CG_PB_CLKO */
602 /* Detect PB clock freq. */
603 i = in32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PWRUP_STATUS);
604 i = (i >> 16) & 0x07; /* Get PB PLL multiplier */
606 out32(CFG_TSI108_CSR_BASE +
607 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0, pll0_config[i].ctrl0);
608 out32(CFG_TSI108_CSR_BASE +
609 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL1, pll0_config[i].ctrl1);
611 /* Wait and set SSEN for both PLL0 and 1 */
613 out32(CFG_TSI108_CSR_BASE + TSI108_CLK_REG_OFFSET + CG_PLL1_CTRL0, 0x802e0044); /* D=0.25% */
614 out32(CFG_TSI108_CSR_BASE +
615 TSI108_CLK_REG_OFFSET + CG_PLL0_CTRL0,
616 0x80000000 | pll0_config[i].ctrl0);
617 #endif /* CFG_CLK_SPREAD */
622 printf("BUS: %d MHz\n", gd->bus_clk / 1000000);
623 printf("MEM: %d MHz\n", gd->mem_clk / 1000000);
626 * All the information needed to print the cache details is avaiblable
627 * at this point i.e. above call to l2cache_enable is the very last
628 * thing done with regards to enabling diabling the cache.
629 * So this seems like a good place to print all this information
633 switch (get_cpu_type()) {
635 printf("L1 Instruction cache - 32KB 8-way");
636 (get_hid0() & (1 << 15)) ? printf(" ENABLED\n") :
637 printf(" DISABLED\n");
638 printf(" L1 Data cache - 32KB 8-way");
639 (get_hid0() & (1 << 14)) ? printf(" ENABLED\n") :
640 printf(" DISABLED\n");
641 printf(" Unified L2 cache - 512KB 8-way");
642 (get_l2cr() & (1 << 31)) ? printf(" ENABLED\n") :
643 printf(" DISABLED\n");
648 printf("L1 Instruction cache - 32KB 8-way");
649 (get_hid0() & (1 << 15)) ? printf(" ENABLED\n") :
650 printf(" DISABLED\n");
651 printf(" L1 Data cache - 32KB 8-way");
652 (get_hid0() & (1 << 14)) ? printf(" ENABLED\n") :
653 printf(" DISABLED\n");
654 printf(" Unified L2 cache - 1MB 8-way");
655 (get_l2cr() & (1 << 31)) ? printf(" ENABLED\n") :
656 printf(" DISABLED\n");