1 /* 2 * MPC8536 DS Board Setup 3 * 4 * Copyright 2008 Freescale Semiconductor, Inc. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2 of the License, or (at your 9 * option) any later version. 10 */ 11 12 #include <linux/stddef.h> 13 #include <linux/kernel.h> 14 #include <linux/pci.h> 15 #include <linux/kdev_t.h> 16 #include <linux/delay.h> 17 #include <linux/seq_file.h> 18 #include <linux/interrupt.h> 19 #include <linux/of_platform.h> 20 #include <linux/memblock.h> 21 22 #include <asm/time.h> 23 #include <asm/machdep.h> 24 #include <asm/pci-bridge.h> 25 #include <mm/mmu_decl.h> 26 #include <asm/prom.h> 27 #include <asm/udbg.h> 28 #include <asm/mpic.h> 29 #include <asm/swiotlb.h> 30 31 #include <sysdev/fsl_soc.h> 32 #include <sysdev/fsl_pci.h> 33 34 #include "mpc85xx.h" 35 36 void __init mpc8536_ds_pic_init(void) 37 { 38 struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, 39 0, 256, " OpenPIC "); 40 BUG_ON(mpic == NULL); 41 mpic_init(mpic); 42 } 43 44 /* 45 * Setup the architecture 46 */ 47 static void __init mpc8536_ds_setup_arch(void) 48 { 49 #ifdef CONFIG_PCI 50 struct device_node *np; 51 struct pci_controller *hose; 52 #endif 53 dma_addr_t max = 0xffffffff; 54 55 if (ppc_md.progress) 56 ppc_md.progress("mpc8536_ds_setup_arch()", 0); 57 58 #ifdef CONFIG_PCI 59 for_each_node_by_type(np, "pci") { 60 if (of_device_is_compatible(np, "fsl,mpc8540-pci") || 61 of_device_is_compatible(np, "fsl,mpc8548-pcie")) { 62 struct resource rsrc; 63 of_address_to_resource(np, 0, &rsrc); 64 if ((rsrc.start & 0xfffff) == 0x8000) 65 fsl_add_bridge(np, 1); 66 else 67 fsl_add_bridge(np, 0); 68 69 hose = pci_find_hose_for_OF_device(np); 70 max = min(max, hose->dma_window_base_cur + 71 hose->dma_window_size); 72 } 73 } 74 75 #endif 76 77 #ifdef CONFIG_SWIOTLB 78 if ((memblock_end_of_DRAM() - 1) > max) { 79 ppc_swiotlb_enable = 1; 80 set_pci_dma_ops(&swiotlb_dma_ops); 81 ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; 82 } 83 #endif 84 85 printk("MPC8536 DS board from Freescale Semiconductor\n"); 86 } 87 88 machine_device_initcall(mpc8536_ds, mpc85xx_common_publish_devices); 89 90 machine_arch_initcall(mpc8536_ds, swiotlb_setup_bus_notifier); 91 92 /* 93 * Called very early, device-tree isn't unflattened 94 */ 95 static int __init mpc8536_ds_probe(void) 96 { 97 unsigned long root = of_get_flat_dt_root(); 98 99 return of_flat_dt_is_compatible(root, "fsl,mpc8536ds"); 100 } 101 102 define_machine(mpc8536_ds) { 103 .name = "MPC8536 DS", 104 .probe = mpc8536_ds_probe, 105 .setup_arch = mpc8536_ds_setup_arch, 106 .init_IRQ = mpc8536_ds_pic_init, 107 #ifdef CONFIG_PCI 108 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 109 #endif 110 .get_irq = mpic_get_irq, 111 .restart = fsl_rstcr_restart, 112 .calibrate_decr = generic_calibrate_decr, 113 .progress = udbg_progress, 114 }; 115