1 /* 2 * Setup pointers to hardware-dependent routines. 3 * 4 * This file is subject to the terms and conditions of the GNU General Public 5 * License. See the file "COPYING" in the main directory of this archive 6 * for more details. 7 * 8 * Copyright (C) 1996, 97, 98, 2000, 03, 04, 06 Ralf Baechle (ralf@linux-mips.org) 9 * Copyright (C) 2006,2007 Thomas Bogendoerfer (tsbogend@alpha.franken.de) 10 */ 11 #include <linux/eisa.h> 12 #include <linux/init.h> 13 #include <linux/export.h> 14 #include <linux/console.h> 15 #include <linux/fb.h> 16 #include <linux/screen_info.h> 17 18 #ifdef CONFIG_FW_ARC 19 #include <asm/fw/arc/types.h> 20 #include <asm/sgialib.h> 21 #endif 22 23 #ifdef CONFIG_FW_SNIPROM 24 #include <asm/mipsprom.h> 25 #endif 26 27 #include <asm/bootinfo.h> 28 #include <asm/cpu.h> 29 #include <asm/io.h> 30 #include <asm/reboot.h> 31 #include <asm/sni.h> 32 33 unsigned int sni_brd_type; 34 EXPORT_SYMBOL(sni_brd_type); 35 36 extern void sni_machine_restart(char *command); 37 extern void sni_machine_power_off(void); 38 39 static void __init sni_display_setup(void) 40 { 41 #if defined(CONFIG_VGA_CONSOLE) && defined(CONFIG_FW_ARC) 42 static struct screen_info si; 43 DISPLAY_STATUS *di; 44 45 di = ArcGetDisplayStatus(1); 46 47 if (di) { 48 si.orig_x = di->CursorXPosition; 49 si.orig_y = di->CursorYPosition; 50 si.orig_video_cols = di->CursorMaxXPosition; 51 si.orig_video_lines = di->CursorMaxYPosition; 52 si.orig_video_isVGA = VIDEO_TYPE_VGAC; 53 si.orig_video_points = 16; 54 55 vgacon_register_screen(&si); 56 } 57 #endif 58 } 59 60 static void __init sni_console_setup(void) 61 { 62 #ifndef CONFIG_FW_ARC 63 char *ctype; 64 char *cdev; 65 char *baud; 66 int port; 67 static char options[8] __initdata; 68 69 cdev = prom_getenv("console_dev"); 70 if (strncmp(cdev, "tty", 3) == 0) { 71 ctype = prom_getenv("console"); 72 switch (*ctype) { 73 default: 74 case 'l': 75 port = 0; 76 baud = prom_getenv("lbaud"); 77 break; 78 case 'r': 79 port = 1; 80 baud = prom_getenv("rbaud"); 81 break; 82 } 83 if (baud) 84 strcpy(options, baud); 85 if (strncmp(cdev, "tty552", 6) == 0) 86 add_preferred_console("ttyS", port, 87 baud ? options : NULL); 88 else 89 add_preferred_console("ttySC", port, 90 baud ? options : NULL); 91 } 92 #endif 93 } 94 95 #ifdef DEBUG 96 static void __init sni_idprom_dump(void) 97 { 98 int i; 99 100 pr_debug("SNI IDProm dump:\n"); 101 for (i = 0; i < 256; i++) { 102 if (i%16 == 0) 103 pr_debug("%04x ", i); 104 105 printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); 106 107 if (i % 16 == 15) 108 printk("\n"); 109 } 110 } 111 #endif 112 113 void __init plat_mem_setup(void) 114 { 115 int cputype; 116 117 set_io_port_base(SNI_PORT_BASE); 118 // ioport_resource.end = sni_io_resource.end; 119 120 /* 121 * Setup (E)ISA I/O memory access stuff 122 */ 123 #ifdef CONFIG_EISA 124 EISA_bus = 1; 125 #endif 126 127 sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; 128 cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE; 129 switch (sni_brd_type) { 130 case SNI_BRD_TOWER_OASIC: 131 switch (cputype) { 132 case SNI_CPU_M8030: 133 system_type = "RM400-330"; 134 break; 135 case SNI_CPU_M8031: 136 system_type = "RM400-430"; 137 break; 138 case SNI_CPU_M8037: 139 system_type = "RM400-530"; 140 break; 141 case SNI_CPU_M8034: 142 system_type = "RM400-730"; 143 break; 144 default: 145 system_type = "RM400-xxx"; 146 break; 147 } 148 break; 149 case SNI_BRD_MINITOWER: 150 switch (cputype) { 151 case SNI_CPU_M8021: 152 case SNI_CPU_M8043: 153 system_type = "RM400-120"; 154 break; 155 case SNI_CPU_M8040: 156 system_type = "RM400-220"; 157 break; 158 case SNI_CPU_M8053: 159 system_type = "RM400-225"; 160 break; 161 case SNI_CPU_M8050: 162 system_type = "RM400-420"; 163 break; 164 default: 165 system_type = "RM400-xxx"; 166 break; 167 } 168 break; 169 case SNI_BRD_PCI_TOWER: 170 system_type = "RM400-Cxx"; 171 break; 172 case SNI_BRD_RM200: 173 system_type = "RM200-xxx"; 174 break; 175 case SNI_BRD_PCI_MTOWER: 176 system_type = "RM300-Cxx"; 177 break; 178 case SNI_BRD_PCI_DESKTOP: 179 switch (read_c0_prid() & PRID_IMP_MASK) { 180 case PRID_IMP_R4600: 181 case PRID_IMP_R4700: 182 system_type = "RM200-C20"; 183 break; 184 case PRID_IMP_R5000: 185 system_type = "RM200-C40"; 186 break; 187 default: 188 system_type = "RM200-Cxx"; 189 break; 190 } 191 break; 192 case SNI_BRD_PCI_TOWER_CPLUS: 193 system_type = "RM400-Exx"; 194 break; 195 case SNI_BRD_PCI_MTOWER_CPLUS: 196 system_type = "RM300-Exx"; 197 break; 198 } 199 pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type, system_type); 200 201 #ifdef DEBUG 202 sni_idprom_dump(); 203 #endif 204 205 switch (sni_brd_type) { 206 case SNI_BRD_10: 207 case SNI_BRD_10NEW: 208 case SNI_BRD_TOWER_OASIC: 209 case SNI_BRD_MINITOWER: 210 sni_a20r_init(); 211 break; 212 213 case SNI_BRD_PCI_TOWER: 214 case SNI_BRD_PCI_TOWER_CPLUS: 215 sni_pcit_init(); 216 break; 217 218 case SNI_BRD_RM200: 219 sni_rm200_init(); 220 break; 221 222 case SNI_BRD_PCI_MTOWER: 223 case SNI_BRD_PCI_DESKTOP: 224 case SNI_BRD_PCI_MTOWER_CPLUS: 225 sni_pcimt_init(); 226 break; 227 } 228 229 _machine_restart = sni_machine_restart; 230 pm_power_off = sni_machine_power_off; 231 232 sni_display_setup(); 233 sni_console_setup(); 234 } 235 236 #ifdef CONFIG_PCI 237 238 #include <linux/pci.h> 239 #include <video/vga.h> 240 #include <video/cirrus.h> 241 242 static void quirk_cirrus_ram_size(struct pci_dev *dev) 243 { 244 u16 cmd; 245 246 /* 247 * firmware doesn't set the ram size correct, so we 248 * need to do it here, otherwise we get screen corruption 249 * on older Cirrus chips 250 */ 251 pci_read_config_word(dev, PCI_COMMAND, &cmd); 252 if ((cmd & (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) 253 == (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) { 254 vga_wseq(NULL, CL_SEQR6, 0x12); /* unlock all extension registers */ 255 vga_wseq(NULL, CL_SEQRF, 0x18); 256 } 257 } 258 259 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5434_8, 260 quirk_cirrus_ram_size); 261 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5436, 262 quirk_cirrus_ram_size); 263 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, 264 quirk_cirrus_ram_size); 265 #endif 266