2 * arch/ppc/platforms/katana.c
4 * Board setup routines for the Artesyn Katana 750 based boards.
6 * Tim Montgomery <timm@artesyncp.com>
8 * Based on code done by Rabeeh Khoury - rabeeh@galileo.co.il
9 * Based on code done by - Mark A. Greer <mgreer@mvista.com>
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version.
17 * Supports the Artesyn 750i, 752i, and 3750. The 752i is virtually identical
18 * to the 750i except that it has an mv64460 bridge.
20 #include <linux/config.h>
21 #include <linux/kernel.h>
22 #include <linux/pci.h>
23 #include <linux/kdev_t.h>
24 #include <linux/console.h>
25 #include <linux/initrd.h>
26 #include <linux/root_dev.h>
27 #include <linux/delay.h>
28 #include <linux/seq_file.h>
29 #include <linux/smp.h>
30 #include <linux/mv643xx.h>
32 #include <linux/bootimg.h>
38 #include <asm/bootinfo.h>
39 #include <asm/mv64x60.h>
40 #include <platforms/katana.h>
42 static struct mv64x60_handle bh;
43 static katana_id_t katana_id;
47 /* PCI Interrupt routing */
49 katana_irq_lookup_750i(unsigned char idsel, unsigned char pin)
51 static char pci_irq_table[][4] = {
53 * PCI IDSEL/INTPIN->INTLINE
57 { KATANA_PCI_INTB_IRQ_750i, KATANA_PCI_INTC_IRQ_750i,
58 KATANA_PCI_INTD_IRQ_750i, KATANA_PCI_INTA_IRQ_750i },
60 { KATANA_PCI_INTC_IRQ_750i, KATANA_PCI_INTD_IRQ_750i,
61 KATANA_PCI_INTA_IRQ_750i, KATANA_PCI_INTB_IRQ_750i },
63 {KATANA_PCI_INTD_IRQ_750i, 0, 0, 0 },
65 const long min_idsel = 4, max_idsel = 6, irqs_per_slot = 4;
67 return PCI_IRQ_TABLE_LOOKUP;
71 katana_irq_lookup_3750(unsigned char idsel, unsigned char pin)
73 static char pci_irq_table[][4] = {
75 * PCI IDSEL/INTPIN->INTLINE
78 { KATANA_PCI_INTA_IRQ_3750, 0, 0, 0 }, /* IDSEL 3 (BCM5691) */
79 { KATANA_PCI_INTB_IRQ_3750, 0, 0, 0 }, /* IDSEL 4 (MV64360 #2)*/
80 { KATANA_PCI_INTC_IRQ_3750, 0, 0, 0 }, /* IDSEL 5 (MV64360 #3)*/
82 const long min_idsel = 3, max_idsel = 5, irqs_per_slot = 4;
84 return PCI_IRQ_TABLE_LOOKUP;
88 katana_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
93 return katana_irq_lookup_750i(idsel, pin);
96 return katana_irq_lookup_3750(idsel, pin);
99 printk(KERN_ERR "Bogus board ID\n");
104 /* Board info retrieval routines */
106 katana_get_board_id(void)
108 switch (in_8((volatile char *)(cpld_base + KATANA_CPLD_PRODUCT_ID))) {
109 case KATANA_PRODUCT_ID_3750:
110 katana_id = KATANA_ID_3750;
113 case KATANA_PRODUCT_ID_750i:
114 katana_id = KATANA_ID_750I;
117 case KATANA_PRODUCT_ID_752i:
118 katana_id = KATANA_ID_752I;
122 printk(KERN_ERR "Unsupported board\n");
127 katana_get_proc_num(void)
131 static int proc = -1;
132 static u8 first_time = 1;
135 if (katana_id != KATANA_ID_3750)
138 save_exclude = mv64x60_pci_exclude_bridge;
139 mv64x60_pci_exclude_bridge = 0;
141 early_read_config_word(bh.hose_a, 0,
142 PCI_DEVFN(0,0), PCI_DEVICE_ID, &val);
144 mv64x60_pci_exclude_bridge = save_exclude;
147 case PCI_DEVICE_ID_KATANA_3750_PROC0:
151 case PCI_DEVICE_ID_KATANA_3750_PROC1:
155 case PCI_DEVICE_ID_KATANA_3750_PROC2:
160 printk(KERN_ERR "Bogus Device ID\n");
171 katana_is_monarch(void)
173 return in_8((volatile char *)(cpld_base + KATANA_CPLD_BD_CFG_3)) &
174 KATANA_CPLD_BD_CFG_3_MONARCH;
178 katana_enable_ipmi(void)
182 /* Enable access to IPMI ctlr by clearing IPMI PORTSEL bit in CPLD */
183 reset_out = in_8((volatile char *)(cpld_base + KATANA_CPLD_RESET_OUT));
184 reset_out &= ~KATANA_CPLD_RESET_OUT_PORTSEL;
185 out_8((volatile void *)(cpld_base + KATANA_CPLD_RESET_OUT), reset_out);
190 katana_bus_freq(void)
194 bd_cfg_0 = in_8((volatile char *)(cpld_base + KATANA_CPLD_BD_CFG_0));
196 switch (bd_cfg_0 & KATANA_CPLD_BD_CFG_0_SYSCLK_MASK) {
197 case KATANA_CPLD_BD_CFG_0_SYSCLK_200:
201 case KATANA_CPLD_BD_CFG_0_SYSCLK_166:
205 case KATANA_CPLD_BD_CFG_0_SYSCLK_133:
209 case KATANA_CPLD_BD_CFG_0_SYSCLK_100:
219 /* Bridge & platform setup routines */
221 katana_intr_setup(void)
223 /* MPP 8, 9, and 10 */
224 mv64x60_clr_bits(&bh, MV64x60_MPP_CNTL_1, 0xfff);
227 if ((katana_id == KATANA_ID_750I) || (katana_id == KATANA_ID_752I))
228 mv64x60_clr_bits(&bh, MV64x60_MPP_CNTL_1, 0x0f000000);
231 * Define GPP 8,9,and 10 interrupt polarity as active low
232 * input signal and level triggered
234 mv64x60_set_bits(&bh, MV64x60_GPP_LEVEL_CNTL, 0x700);
235 mv64x60_clr_bits(&bh, MV64x60_GPP_IO_CNTL, 0x700);
237 if ((katana_id == KATANA_ID_750I) || (katana_id == KATANA_ID_752I)) {
238 mv64x60_set_bits(&bh, MV64x60_GPP_LEVEL_CNTL, (1<<14));
239 mv64x60_clr_bits(&bh, MV64x60_GPP_IO_CNTL, (1<<14));
242 /* Config GPP intr ctlr to respond to level trigger */
243 mv64x60_set_bits(&bh, MV64x60_COMM_ARBITER_CNTL, (1<<10));
245 /* Erranum FEr PCI-#8 */
246 mv64x60_clr_bits(&bh, MV64x60_PCI0_CMD, (1<<5) | (1<<9));
247 mv64x60_clr_bits(&bh, MV64x60_PCI1_CMD, (1<<5) | (1<<9));
250 * Dismiss and then enable interrupt on GPP interrupt cause
253 mv64x60_write(&bh, MV64x60_GPP_INTR_CAUSE, ~0x700);
254 mv64x60_set_bits(&bh, MV64x60_GPP_INTR_MASK, 0x700);
256 if ((katana_id == KATANA_ID_750I) || (katana_id == KATANA_ID_752I)) {
257 mv64x60_write(&bh, MV64x60_GPP_INTR_CAUSE, ~(1<<14));
258 mv64x60_set_bits(&bh, MV64x60_GPP_INTR_MASK, (1<<14));
262 * Dismiss and then enable interrupt on CPU #0 high cause reg
263 * BIT25 summarizes GPP interrupts 8-15
265 mv64x60_set_bits(&bh, MV64360_IC_CPU0_INTR_MASK_HI, (1<<25));
270 katana_setup_peripherals(void)
272 u32 base, size_0, size_1;
274 /* Set up windows for boot CS, soldered & socketed flash, and CPLD */
275 mv64x60_set_32bit_window(&bh, MV64x60_CPU2BOOT_WIN,
276 KATANA_BOOT_WINDOW_BASE, KATANA_BOOT_WINDOW_SIZE, 0);
277 bh.ci->enable_window_32bit(&bh, MV64x60_CPU2BOOT_WIN);
279 /* Assume firmware set up window sizes correctly for dev 0 & 1 */
280 mv64x60_get_32bit_window(&bh, MV64x60_CPU2DEV_0_WIN, &base, &size_0);
283 mv64x60_set_32bit_window(&bh, MV64x60_CPU2DEV_0_WIN,
284 KATANA_SOLDERED_FLASH_BASE, size_0, 0);
285 bh.ci->enable_window_32bit(&bh, MV64x60_CPU2DEV_0_WIN);
288 mv64x60_get_32bit_window(&bh, MV64x60_CPU2DEV_1_WIN, &base, &size_1);
291 mv64x60_set_32bit_window(&bh, MV64x60_CPU2DEV_1_WIN,
292 (KATANA_SOLDERED_FLASH_BASE + size_0), size_1, 0);
293 bh.ci->enable_window_32bit(&bh, MV64x60_CPU2DEV_1_WIN);
296 mv64x60_set_32bit_window(&bh, MV64x60_CPU2DEV_2_WIN,
297 KATANA_SOCKET_BASE, KATANA_SOCKETED_FLASH_SIZE, 0);
298 bh.ci->enable_window_32bit(&bh, MV64x60_CPU2DEV_2_WIN);
300 mv64x60_set_32bit_window(&bh, MV64x60_CPU2DEV_3_WIN,
301 KATANA_CPLD_BASE, KATANA_CPLD_SIZE, 0);
302 bh.ci->enable_window_32bit(&bh, MV64x60_CPU2DEV_3_WIN);
303 cpld_base = (u32)ioremap(KATANA_CPLD_BASE, KATANA_CPLD_SIZE);
305 mv64x60_set_32bit_window(&bh, MV64x60_CPU2SRAM_WIN,
306 KATANA_INTERNAL_SRAM_BASE, MV64360_SRAM_SIZE, 0);
307 bh.ci->enable_window_32bit(&bh, MV64x60_CPU2SRAM_WIN);
308 sram_base = (u32)ioremap(KATANA_INTERNAL_SRAM_BASE, MV64360_SRAM_SIZE);
310 /* Set up Enet->SRAM window */
311 mv64x60_set_32bit_window(&bh, MV64x60_ENET2MEM_4_WIN,
312 KATANA_INTERNAL_SRAM_BASE, MV64360_SRAM_SIZE, 0x2);
313 bh.ci->enable_window_32bit(&bh, MV64x60_ENET2MEM_4_WIN);
315 /* Give enet r/w access to memory region */
316 mv64x60_set_bits(&bh, MV64360_ENET2MEM_ACC_PROT_0, (0x3 << (4 << 1)));
317 mv64x60_set_bits(&bh, MV64360_ENET2MEM_ACC_PROT_1, (0x3 << (4 << 1)));
318 mv64x60_set_bits(&bh, MV64360_ENET2MEM_ACC_PROT_2, (0x3 << (4 << 1)));
320 mv64x60_clr_bits(&bh, MV64x60_PCI1_PCI_DECODE_CNTL, (1 << 3));
321 mv64x60_clr_bits(&bh, MV64x60_TIMR_CNTR_0_3_CNTL,
322 ((1 << 0) | (1 << 8) | (1 << 16) | (1 << 24)));
324 /* Must wait until window set up before retrieving board id */
325 katana_get_board_id();
327 /* Enumerate pci bus (must know board id before getting proc number) */
328 if (katana_get_proc_num() == 0)
329 bh.hose_b->last_busno = pciauto_bus_scan(bh.hose_b, 0);
331 #if defined(CONFIG_NOT_COHERENT_CACHE)
332 mv64x60_write(&bh, MV64360_SRAM_CONFIG, 0x00160000);
334 mv64x60_write(&bh, MV64360_SRAM_CONFIG, 0x001600b2);
338 * Setting the SRAM to 0. Note that this generates parity errors on
339 * internal data path in SRAM since it's first time accessing it
340 * while after reset it's not configured.
342 memset((void *)sram_base, 0, MV64360_SRAM_SIZE);
344 /* Only processor zero [on 3750] is an PCI interrupt controller */
345 if (katana_get_proc_num() == 0)
352 katana_setup_bridge(void)
354 struct mv64x60_setup_info si;
357 memset(&si, 0, sizeof(si));
359 si.phys_reg_base = KATANA_BRIDGE_REG_BASE;
361 si.pci_1.enable_bus = 1;
362 si.pci_1.pci_io.cpu_base = KATANA_PCI1_IO_START_PROC_ADDR;
363 si.pci_1.pci_io.pci_base_hi = 0;
364 si.pci_1.pci_io.pci_base_lo = KATANA_PCI1_IO_START_PCI_ADDR;
365 si.pci_1.pci_io.size = KATANA_PCI1_IO_SIZE;
366 si.pci_1.pci_io.swap = MV64x60_CPU2PCI_SWAP_NONE;
367 si.pci_1.pci_mem[0].cpu_base = KATANA_PCI1_MEM_START_PROC_ADDR;
368 si.pci_1.pci_mem[0].pci_base_hi = KATANA_PCI1_MEM_START_PCI_HI_ADDR;
369 si.pci_1.pci_mem[0].pci_base_lo = KATANA_PCI1_MEM_START_PCI_LO_ADDR;
370 si.pci_1.pci_mem[0].size = KATANA_PCI1_MEM_SIZE;
371 si.pci_1.pci_mem[0].swap = MV64x60_CPU2PCI_SWAP_NONE;
372 si.pci_1.pci_cmd_bits = 0;
373 si.pci_1.latency_timer = 0x80;
375 for (i = 0; i < MV64x60_CPU2MEM_WINDOWS; i++) {
376 #if defined(CONFIG_NOT_COHERENT_CACHE)
377 si.cpu_prot_options[i] = 0;
378 si.enet_options[i] = MV64360_ENET2MEM_SNOOP_NONE;
379 si.mpsc_options[i] = MV64360_MPSC2MEM_SNOOP_NONE;
380 si.idma_options[i] = MV64360_IDMA2MEM_SNOOP_NONE;
382 si.pci_1.acc_cntl_options[i] =
383 MV64360_PCI_ACC_CNTL_SNOOP_NONE |
384 MV64360_PCI_ACC_CNTL_SWAP_NONE |
385 MV64360_PCI_ACC_CNTL_MBURST_128_BYTES |
386 MV64360_PCI_ACC_CNTL_RDSIZE_256_BYTES;
388 si.cpu_prot_options[i] = 0;
389 si.enet_options[i] = MV64360_ENET2MEM_SNOOP_NONE; /* errata */
390 si.mpsc_options[i] = MV64360_MPSC2MEM_SNOOP_NONE; /* errata */
391 si.idma_options[i] = MV64360_IDMA2MEM_SNOOP_NONE; /* errata */
393 si.pci_1.acc_cntl_options[i] =
394 MV64360_PCI_ACC_CNTL_SNOOP_WB |
395 MV64360_PCI_ACC_CNTL_SWAP_NONE |
396 MV64360_PCI_ACC_CNTL_MBURST_32_BYTES |
397 MV64360_PCI_ACC_CNTL_RDSIZE_32_BYTES;
401 /* Lookup PCI host bridges */
402 if (mv64x60_init(&bh, &si))
403 printk(KERN_WARNING "Bridge initialization failed.\n");
405 pci_dram_offset = 0; /* sys mem at same addr on PCI & cpu bus */
406 ppc_md.pci_swizzle = common_swizzle;
407 ppc_md.pci_map_irq = katana_map_irq;
408 ppc_md.pci_exclude_device = mv64x60_pci_exclude_device;
410 mv64x60_set_bus(&bh, 1, 0);
411 bh.hose_b->first_busno = 0;
412 bh.hose_b->last_busno = 0xff;
418 katana_setup_arch(void)
421 ppc_md.progress("katana_setup_arch: enter", 0);
425 #ifdef CONFIG_BLK_DEV_INITRD
427 ROOT_DEV = Root_RAM0;
430 #ifdef CONFIG_ROOT_NFS
433 ROOT_DEV = Root_SDA2;
437 * Set up the L2CR register.
439 * 750FX has only L2E, L2PE (bits 2-8 are reserved)
440 * DD2.0 has bug that requires the L2 to be in WRT mode
441 * avoid dirty data in cache
443 if (PVR_REV(mfspr(PVR)) == 0x0200) {
444 printk(KERN_INFO "DD2.0 detected. Setting L2 cache"
445 "to Writethrough mode\n");
446 _set_L2CR(L2CR_L2E | L2CR_L2PE | L2CR_L2WT);
449 _set_L2CR(L2CR_L2E | L2CR_L2PE);
452 ppc_md.progress("katana_setup_arch: calling setup_bridge", 0);
454 katana_setup_bridge();
455 katana_setup_peripherals();
456 katana_enable_ipmi();
458 printk(KERN_INFO "Artesyn Communication Products, LLC - Katana(TM)\n");
460 ppc_md.progress("katana_setup_arch: exit", 0);
464 /* Platform device data fixup routines. */
465 #if defined(CONFIG_SERIAL_MPSC)
467 katana_fixup_mpsc_pdata(struct platform_device *pdev)
469 struct mpsc_pdata *pdata;
471 pdata = (struct mpsc_pdata *)pdev->dev.platform_data;
473 pdata->max_idle = 40;
474 pdata->default_baud = KATANA_DEFAULT_BAUD;
475 pdata->brg_clk_src = KATANA_MPSC_CLK_SRC;
476 pdata->brg_clk_freq = KATANA_MPSC_CLK_FREQ;
482 #if defined(CONFIG_MV643XX_ETH)
484 katana_fixup_eth_pdata(struct platform_device *pdev)
486 struct mv64xxx_eth_platform_data *eth_pd;
487 static u16 phy_addr[] = {
488 KATANA_ETH0_PHY_ADDR,
489 KATANA_ETH1_PHY_ADDR,
490 KATANA_ETH2_PHY_ADDR,
492 int rx_size = KATANA_ETH_RX_QUEUE_SIZE * MV64340_ETH_DESC_SIZE;
493 int tx_size = KATANA_ETH_TX_QUEUE_SIZE * MV64340_ETH_DESC_SIZE;
495 eth_pd = pdev->dev.platform_data;
496 eth_pd->force_phy_addr = 1;
497 eth_pd->phy_addr = phy_addr[pdev->id];
498 eth_pd->tx_queue_size = KATANA_ETH_TX_QUEUE_SIZE;
499 eth_pd->rx_queue_size = KATANA_ETH_RX_QUEUE_SIZE;
500 eth_pd->tx_sram_addr = mv643xx_sram_alloc(tx_size);
502 if (eth_pd->tx_sram_addr)
503 eth_pd->tx_sram_size = tx_size;
505 printk(KERN_ERR "mv643xx_sram_alloc failed\n");
507 eth_pd->rx_sram_addr = mv643xx_sram_alloc(rx_size);
508 if (eth_pd->rx_sram_addr)
509 eth_pd->rx_sram_size = rx_size;
511 printk(KERN_ERR "mv643xx_sram_alloc failed\n");
516 katana_platform_notify(struct device *dev)
520 void ((*rtn)(struct platform_device *pdev));
522 #if defined(CONFIG_SERIAL_MPSC)
523 { MPSC_CTLR_NAME "0", katana_fixup_mpsc_pdata },
524 { MPSC_CTLR_NAME "1", katana_fixup_mpsc_pdata },
526 #if defined(CONFIG_MV643XX_ETH)
527 { MV64XXX_ETH_NAME "0", katana_fixup_eth_pdata },
528 { MV64XXX_ETH_NAME "1", katana_fixup_eth_pdata },
529 { MV64XXX_ETH_NAME "2", katana_fixup_eth_pdata },
532 struct platform_device *pdev;
535 if (dev && dev->bus_id)
536 for (i=0; i<ARRAY_SIZE(dev_map); i++)
537 if (!strncmp(dev->bus_id, dev_map[i].bus_id,
540 pdev = container_of(dev,
541 struct platform_device, dev);
542 dev_map[i].rtn(pdev);
549 katana_restart(char *cmd)
551 volatile ulong i = 10000000;
553 /* issue hard reset to the reset command register */
554 out_8((volatile char *)(cpld_base + KATANA_CPLD_RST_CMD),
555 KATANA_CPLD_RST_CMD_HR);
558 panic("restart failed\n");
569 katana_power_off(void)
576 katana_show_cpuinfo(struct seq_file *m)
578 seq_printf(m, "vendor\t\t: Artesyn Communication Products, LLC\n");
580 seq_printf(m, "board\t\t: ");
584 seq_printf(m, "Katana 3750\n");
588 seq_printf(m, "Katana 750i\n");
592 seq_printf(m, "Katana 752i\n");
596 seq_printf(m, "Unknown\n");
600 seq_printf(m, "product ID\t: 0x%x\n",
601 in_8((volatile char *)(cpld_base + KATANA_CPLD_PRODUCT_ID)));
602 seq_printf(m, "hardware rev\t: 0x%x\n",
603 in_8((volatile char *)(cpld_base+KATANA_CPLD_HARDWARE_VER)));
604 seq_printf(m, "PLD rev\t\t: 0x%x\n",
605 in_8((volatile char *)(cpld_base + KATANA_CPLD_PLD_VER)));
606 seq_printf(m, "PLB freq\t: %ldMhz\n", katana_bus_freq() / 1000000);
607 seq_printf(m, "PCI\t\t: %sMonarch\n", katana_is_monarch()? "" : "Non-");
613 katana_calibrate_decr(void)
617 freq = katana_bus_freq() / 4;
619 printk(KERN_INFO "time_init: decrementer frequency = %lu.%.6lu MHz\n",
620 freq / 1000000, freq % 1000000);
622 tb_ticks_per_jiffy = freq / HZ;
623 tb_to_us = mulhwu_scale_factor(freq, 1000000);
629 katana_find_end_of_memory(void)
631 return mv64x60_get_mem_size(KATANA_BRIDGE_REG_BASE,
632 MV64x60_TYPE_MV64360);
639 mtspr(DBAT2U, 0xf0001ffe);
640 mtspr(DBAT2L, 0xf000002a);
646 #if defined(CONFIG_SERIAL_TEXT_DEBUG) && defined(CONFIG_SERIAL_MPSC_CONSOLE)
650 io_block_mapping(0xf8100000, 0xf8100000, 0x00020000, _PAGE_IO);
655 platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
656 unsigned long r6, unsigned long r7)
658 parse_bootinfo(find_bootinfo());
662 ppc_md.setup_arch = katana_setup_arch;
663 ppc_md.show_cpuinfo = katana_show_cpuinfo;
664 ppc_md.init_IRQ = mv64360_init_irq;
665 ppc_md.get_irq = mv64360_get_irq;
666 ppc_md.restart = katana_restart;
667 ppc_md.power_off = katana_power_off;
668 ppc_md.halt = katana_halt;
669 ppc_md.find_end_of_memory = katana_find_end_of_memory;
670 ppc_md.calibrate_decr = katana_calibrate_decr;
672 #if defined(CONFIG_SERIAL_TEXT_DEBUG) && defined(CONFIG_SERIAL_MPSC_CONSOLE)
673 ppc_md.setup_io_mappings = katana_map_io;
674 ppc_md.progress = mv64x60_mpsc_progress;
675 mv64x60_progress_init(KATANA_BRIDGE_REG_BASE);
678 #if defined(CONFIG_SERIAL_MPSC) || defined(CONFIG_MV643XX_ETH)
679 platform_notify = katana_platform_notify;
682 katana_set_bat(); /* Need for katana_find_end_of_memory and progress */