1 /* 2 * Copyright (C) 2006 PA Semi, Inc 3 * 4 * Authors: Kip Walker, PA Semi 5 * Olof Johansson, PA Semi 6 * 7 * Maintained by: Olof Johansson <olof@lixom.net> 8 * 9 * Based on arch/powerpc/platforms/maple/setup.c 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 */ 24 25 #include <linux/errno.h> 26 #include <linux/kernel.h> 27 #include <linux/delay.h> 28 #include <linux/console.h> 29 #include <linux/pci.h> 30 31 #include <asm/prom.h> 32 #include <asm/system.h> 33 #include <asm/iommu.h> 34 #include <asm/machdep.h> 35 #include <asm/mpic.h> 36 #include <asm/smp.h> 37 #include <asm/time.h> 38 39 #include "pasemi.h" 40 41 static void pas_restart(char *cmd) 42 { 43 printk("restart unimplemented, looping...\n"); 44 for (;;) ; 45 } 46 47 static void pas_power_off(void) 48 { 49 printk("power off unimplemented, looping...\n"); 50 for (;;) ; 51 } 52 53 static void pas_halt(void) 54 { 55 pas_power_off(); 56 } 57 58 #ifdef CONFIG_SMP 59 struct smp_ops_t pas_smp_ops = { 60 .probe = smp_mpic_probe, 61 .message_pass = smp_mpic_message_pass, 62 .kick_cpu = smp_generic_kick_cpu, 63 .setup_cpu = smp_mpic_setup_cpu, 64 .give_timebase = smp_generic_give_timebase, 65 .take_timebase = smp_generic_take_timebase, 66 }; 67 #endif /* CONFIG_SMP */ 68 69 void __init pas_setup_arch(void) 70 { 71 #ifdef CONFIG_SMP 72 /* Setup SMP callback */ 73 smp_ops = &pas_smp_ops; 74 #endif 75 /* no iommu yet */ 76 pci_dma_ops = &dma_direct_ops; 77 78 /* Lookup PCI hosts */ 79 pas_pci_init(); 80 81 #ifdef CONFIG_DUMMY_CONSOLE 82 conswitchp = &dummy_con; 83 #endif 84 85 printk(KERN_DEBUG "Using default idle loop\n"); 86 } 87 88 /* No legacy IO on our parts */ 89 static int pas_check_legacy_ioport(unsigned int baseport) 90 { 91 return -ENODEV; 92 } 93 94 static __init void pas_init_IRQ(void) 95 { 96 struct device_node *np; 97 struct device_node *root, *mpic_node; 98 unsigned long openpic_addr; 99 const unsigned int *opprop; 100 int naddr, opplen; 101 struct mpic *mpic; 102 103 mpic_node = NULL; 104 105 for_each_node_by_type(np, "interrupt-controller") 106 if (device_is_compatible(np, "open-pic")) { 107 mpic_node = np; 108 break; 109 } 110 if (!mpic_node) 111 for_each_node_by_type(np, "open-pic") { 112 mpic_node = np; 113 break; 114 } 115 if (!mpic_node) { 116 printk(KERN_ERR 117 "Failed to locate the MPIC interrupt controller\n"); 118 return; 119 } 120 121 /* Find address list in /platform-open-pic */ 122 root = of_find_node_by_path("/"); 123 naddr = prom_n_addr_cells(root); 124 opprop = get_property(root, "platform-open-pic", &opplen); 125 if (!opprop) { 126 printk(KERN_ERR "No platform-open-pic property.\n"); 127 of_node_put(root); 128 return; 129 } 130 openpic_addr = of_read_number(opprop, naddr); 131 printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr); 132 of_node_put(root); 133 134 mpic = mpic_alloc(mpic_node, openpic_addr, MPIC_PRIMARY, 0, 0, 135 " PAS-OPIC "); 136 BUG_ON(!mpic); 137 138 mpic_assign_isu(mpic, 0, openpic_addr + 0x10000); 139 mpic_init(mpic); 140 of_node_put(mpic_node); 141 of_node_put(root); 142 } 143 144 static void __init pas_progress(char *s, unsigned short hex) 145 { 146 printk("[%04x] : %s\n", hex, s ? s : ""); 147 } 148 149 150 /* 151 * Called very early, MMU is off, device-tree isn't unflattened 152 */ 153 static int __init pas_probe(void) 154 { 155 unsigned long root = of_get_flat_dt_root(); 156 157 if (!of_flat_dt_is_compatible(root, "PA6T-1682M")) 158 return 0; 159 160 hpte_init_native(); 161 162 return 1; 163 } 164 165 define_machine(pas) { 166 .name = "PA Semi PA6T-1682M", 167 .probe = pas_probe, 168 .setup_arch = pas_setup_arch, 169 .init_IRQ = pas_init_IRQ, 170 .get_irq = mpic_get_irq, 171 .restart = pas_restart, 172 .power_off = pas_power_off, 173 .halt = pas_halt, 174 .get_boot_time = pas_get_boot_time, 175 .calibrate_decr = generic_calibrate_decr, 176 .check_legacy_ioport = pas_check_legacy_ioport, 177 .progress = pas_progress, 178 }; 179