162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Setup pointers to hardware-dependent routines. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 562306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 662306a36Sopenharmony_ci * for more details. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 1996, 97, 98, 2000, 03, 04, 06 Ralf Baechle (ralf@linux-mips.org) 962306a36Sopenharmony_ci * Copyright (C) 2006,2007 Thomas Bogendoerfer (tsbogend@alpha.franken.de) 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci#include <linux/eisa.h> 1262306a36Sopenharmony_ci#include <linux/init.h> 1362306a36Sopenharmony_ci#include <linux/export.h> 1462306a36Sopenharmony_ci#include <linux/console.h> 1562306a36Sopenharmony_ci#include <linux/fb.h> 1662306a36Sopenharmony_ci#include <linux/screen_info.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifdef CONFIG_FW_ARC 1962306a36Sopenharmony_ci#include <asm/fw/arc/types.h> 2062306a36Sopenharmony_ci#include <asm/sgialib.h> 2162306a36Sopenharmony_ci#endif 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#ifdef CONFIG_FW_SNIPROM 2462306a36Sopenharmony_ci#include <asm/mipsprom.h> 2562306a36Sopenharmony_ci#endif 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <asm/bootinfo.h> 2862306a36Sopenharmony_ci#include <asm/cpu.h> 2962306a36Sopenharmony_ci#include <asm/io.h> 3062306a36Sopenharmony_ci#include <asm/reboot.h> 3162306a36Sopenharmony_ci#include <asm/sni.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciunsigned int sni_brd_type; 3462306a36Sopenharmony_ciEXPORT_SYMBOL(sni_brd_type); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciextern void sni_machine_restart(char *command); 3762306a36Sopenharmony_ciextern void sni_machine_power_off(void); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic void __init sni_display_setup(void) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) && defined(CONFIG_FW_ARC) 4262306a36Sopenharmony_ci struct screen_info *si = &screen_info; 4362306a36Sopenharmony_ci DISPLAY_STATUS *di; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci di = ArcGetDisplayStatus(1); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci if (di) { 4862306a36Sopenharmony_ci si->orig_x = di->CursorXPosition; 4962306a36Sopenharmony_ci si->orig_y = di->CursorYPosition; 5062306a36Sopenharmony_ci si->orig_video_cols = di->CursorMaxXPosition; 5162306a36Sopenharmony_ci si->orig_video_lines = di->CursorMaxYPosition; 5262306a36Sopenharmony_ci si->orig_video_isVGA = VIDEO_TYPE_VGAC; 5362306a36Sopenharmony_ci si->orig_video_points = 16; 5462306a36Sopenharmony_ci } 5562306a36Sopenharmony_ci#endif 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic void __init sni_console_setup(void) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci#ifndef CONFIG_FW_ARC 6162306a36Sopenharmony_ci char *ctype; 6262306a36Sopenharmony_ci char *cdev; 6362306a36Sopenharmony_ci char *baud; 6462306a36Sopenharmony_ci int port; 6562306a36Sopenharmony_ci static char options[8] __initdata; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci cdev = prom_getenv("console_dev"); 6862306a36Sopenharmony_ci if (strncmp(cdev, "tty", 3) == 0) { 6962306a36Sopenharmony_ci ctype = prom_getenv("console"); 7062306a36Sopenharmony_ci switch (*ctype) { 7162306a36Sopenharmony_ci default: 7262306a36Sopenharmony_ci case 'l': 7362306a36Sopenharmony_ci port = 0; 7462306a36Sopenharmony_ci baud = prom_getenv("lbaud"); 7562306a36Sopenharmony_ci break; 7662306a36Sopenharmony_ci case 'r': 7762306a36Sopenharmony_ci port = 1; 7862306a36Sopenharmony_ci baud = prom_getenv("rbaud"); 7962306a36Sopenharmony_ci break; 8062306a36Sopenharmony_ci } 8162306a36Sopenharmony_ci if (baud) 8262306a36Sopenharmony_ci strcpy(options, baud); 8362306a36Sopenharmony_ci if (strncmp(cdev, "tty552", 6) == 0) 8462306a36Sopenharmony_ci add_preferred_console("ttyS", port, 8562306a36Sopenharmony_ci baud ? options : NULL); 8662306a36Sopenharmony_ci else 8762306a36Sopenharmony_ci add_preferred_console("ttySC", port, 8862306a36Sopenharmony_ci baud ? options : NULL); 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci#endif 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#ifdef DEBUG 9462306a36Sopenharmony_cistatic void __init sni_idprom_dump(void) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci int i; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci pr_debug("SNI IDProm dump:\n"); 9962306a36Sopenharmony_ci for (i = 0; i < 256; i++) { 10062306a36Sopenharmony_ci if (i%16 == 0) 10162306a36Sopenharmony_ci pr_debug("%04x ", i); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci printk("%02x ", *(unsigned char *) (SNI_IDPROM_BASE + i)); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci if (i % 16 == 15) 10662306a36Sopenharmony_ci printk("\n"); 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci} 10962306a36Sopenharmony_ci#endif 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_civoid __init plat_mem_setup(void) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci int cputype; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci set_io_port_base(SNI_PORT_BASE); 11662306a36Sopenharmony_ci// ioport_resource.end = sni_io_resource.end; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* 11962306a36Sopenharmony_ci * Setup (E)ISA I/O memory access stuff 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ci#ifdef CONFIG_EISA 12262306a36Sopenharmony_ci EISA_bus = 1; 12362306a36Sopenharmony_ci#endif 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; 12662306a36Sopenharmony_ci cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE; 12762306a36Sopenharmony_ci switch (sni_brd_type) { 12862306a36Sopenharmony_ci case SNI_BRD_TOWER_OASIC: 12962306a36Sopenharmony_ci switch (cputype) { 13062306a36Sopenharmony_ci case SNI_CPU_M8030: 13162306a36Sopenharmony_ci system_type = "RM400-330"; 13262306a36Sopenharmony_ci break; 13362306a36Sopenharmony_ci case SNI_CPU_M8031: 13462306a36Sopenharmony_ci system_type = "RM400-430"; 13562306a36Sopenharmony_ci break; 13662306a36Sopenharmony_ci case SNI_CPU_M8037: 13762306a36Sopenharmony_ci system_type = "RM400-530"; 13862306a36Sopenharmony_ci break; 13962306a36Sopenharmony_ci case SNI_CPU_M8034: 14062306a36Sopenharmony_ci system_type = "RM400-730"; 14162306a36Sopenharmony_ci break; 14262306a36Sopenharmony_ci default: 14362306a36Sopenharmony_ci system_type = "RM400-xxx"; 14462306a36Sopenharmony_ci break; 14562306a36Sopenharmony_ci } 14662306a36Sopenharmony_ci break; 14762306a36Sopenharmony_ci case SNI_BRD_MINITOWER: 14862306a36Sopenharmony_ci switch (cputype) { 14962306a36Sopenharmony_ci case SNI_CPU_M8021: 15062306a36Sopenharmony_ci case SNI_CPU_M8043: 15162306a36Sopenharmony_ci system_type = "RM400-120"; 15262306a36Sopenharmony_ci break; 15362306a36Sopenharmony_ci case SNI_CPU_M8040: 15462306a36Sopenharmony_ci system_type = "RM400-220"; 15562306a36Sopenharmony_ci break; 15662306a36Sopenharmony_ci case SNI_CPU_M8053: 15762306a36Sopenharmony_ci system_type = "RM400-225"; 15862306a36Sopenharmony_ci break; 15962306a36Sopenharmony_ci case SNI_CPU_M8050: 16062306a36Sopenharmony_ci system_type = "RM400-420"; 16162306a36Sopenharmony_ci break; 16262306a36Sopenharmony_ci default: 16362306a36Sopenharmony_ci system_type = "RM400-xxx"; 16462306a36Sopenharmony_ci break; 16562306a36Sopenharmony_ci } 16662306a36Sopenharmony_ci break; 16762306a36Sopenharmony_ci case SNI_BRD_PCI_TOWER: 16862306a36Sopenharmony_ci system_type = "RM400-Cxx"; 16962306a36Sopenharmony_ci break; 17062306a36Sopenharmony_ci case SNI_BRD_RM200: 17162306a36Sopenharmony_ci system_type = "RM200-xxx"; 17262306a36Sopenharmony_ci break; 17362306a36Sopenharmony_ci case SNI_BRD_PCI_MTOWER: 17462306a36Sopenharmony_ci system_type = "RM300-Cxx"; 17562306a36Sopenharmony_ci break; 17662306a36Sopenharmony_ci case SNI_BRD_PCI_DESKTOP: 17762306a36Sopenharmony_ci switch (read_c0_prid() & PRID_IMP_MASK) { 17862306a36Sopenharmony_ci case PRID_IMP_R4600: 17962306a36Sopenharmony_ci case PRID_IMP_R4700: 18062306a36Sopenharmony_ci system_type = "RM200-C20"; 18162306a36Sopenharmony_ci break; 18262306a36Sopenharmony_ci case PRID_IMP_R5000: 18362306a36Sopenharmony_ci system_type = "RM200-C40"; 18462306a36Sopenharmony_ci break; 18562306a36Sopenharmony_ci default: 18662306a36Sopenharmony_ci system_type = "RM200-Cxx"; 18762306a36Sopenharmony_ci break; 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci break; 19062306a36Sopenharmony_ci case SNI_BRD_PCI_TOWER_CPLUS: 19162306a36Sopenharmony_ci system_type = "RM400-Exx"; 19262306a36Sopenharmony_ci break; 19362306a36Sopenharmony_ci case SNI_BRD_PCI_MTOWER_CPLUS: 19462306a36Sopenharmony_ci system_type = "RM300-Exx"; 19562306a36Sopenharmony_ci break; 19662306a36Sopenharmony_ci } 19762306a36Sopenharmony_ci pr_debug("Found SNI brdtype %02x name %s\n", sni_brd_type, system_type); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci#ifdef DEBUG 20062306a36Sopenharmony_ci sni_idprom_dump(); 20162306a36Sopenharmony_ci#endif 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci switch (sni_brd_type) { 20462306a36Sopenharmony_ci case SNI_BRD_10: 20562306a36Sopenharmony_ci case SNI_BRD_10NEW: 20662306a36Sopenharmony_ci case SNI_BRD_TOWER_OASIC: 20762306a36Sopenharmony_ci case SNI_BRD_MINITOWER: 20862306a36Sopenharmony_ci sni_a20r_init(); 20962306a36Sopenharmony_ci break; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci case SNI_BRD_PCI_TOWER: 21262306a36Sopenharmony_ci case SNI_BRD_PCI_TOWER_CPLUS: 21362306a36Sopenharmony_ci sni_pcit_init(); 21462306a36Sopenharmony_ci break; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci case SNI_BRD_RM200: 21762306a36Sopenharmony_ci sni_rm200_init(); 21862306a36Sopenharmony_ci break; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci case SNI_BRD_PCI_MTOWER: 22162306a36Sopenharmony_ci case SNI_BRD_PCI_DESKTOP: 22262306a36Sopenharmony_ci case SNI_BRD_PCI_MTOWER_CPLUS: 22362306a36Sopenharmony_ci sni_pcimt_init(); 22462306a36Sopenharmony_ci break; 22562306a36Sopenharmony_ci } 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci _machine_restart = sni_machine_restart; 22862306a36Sopenharmony_ci pm_power_off = sni_machine_power_off; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci sni_display_setup(); 23162306a36Sopenharmony_ci sni_console_setup(); 23262306a36Sopenharmony_ci} 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#ifdef CONFIG_PCI 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci#include <linux/pci.h> 23762306a36Sopenharmony_ci#include <video/vga.h> 23862306a36Sopenharmony_ci#include <video/cirrus.h> 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic void quirk_cirrus_ram_size(struct pci_dev *dev) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci u16 cmd; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci /* 24562306a36Sopenharmony_ci * firmware doesn't set the ram size correct, so we 24662306a36Sopenharmony_ci * need to do it here, otherwise we get screen corruption 24762306a36Sopenharmony_ci * on older Cirrus chips 24862306a36Sopenharmony_ci */ 24962306a36Sopenharmony_ci pci_read_config_word(dev, PCI_COMMAND, &cmd); 25062306a36Sopenharmony_ci if ((cmd & (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) 25162306a36Sopenharmony_ci == (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) { 25262306a36Sopenharmony_ci vga_wseq(NULL, CL_SEQR6, 0x12); /* unlock all extension registers */ 25362306a36Sopenharmony_ci vga_wseq(NULL, CL_SEQRF, 0x18); 25462306a36Sopenharmony_ci } 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ciDECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5434_8, 25862306a36Sopenharmony_ci quirk_cirrus_ram_size); 25962306a36Sopenharmony_ciDECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5436, 26062306a36Sopenharmony_ci quirk_cirrus_ram_size); 26162306a36Sopenharmony_ciDECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, 26262306a36Sopenharmony_ci quirk_cirrus_ram_size); 26362306a36Sopenharmony_ci#endif 264