[MIPS] Malta: Cleanup organization of code into directories.
authorRalf Baechle <ralf@linux-mips.org>
Tue, 15 Jul 2008 17:44:34 +0000 (18:44 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 15 Jul 2008 17:44:34 +0000 (18:44 +0100)
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
46 files changed:
arch/mips/Makefile
arch/mips/mips-boards/generic/Makefile [deleted file]
arch/mips/mips-boards/generic/amon.c [deleted file]
arch/mips/mips-boards/generic/cmdline.c [deleted file]
arch/mips/mips-boards/generic/console.c [deleted file]
arch/mips/mips-boards/generic/display.c [deleted file]
arch/mips/mips-boards/generic/gdb_hook.c [deleted file]
arch/mips/mips-boards/generic/init.c [deleted file]
arch/mips/mips-boards/generic/memory.c [deleted file]
arch/mips/mips-boards/generic/pci.c [deleted file]
arch/mips/mips-boards/generic/reset.c [deleted file]
arch/mips/mips-boards/generic/time.c [deleted file]
arch/mips/mips-boards/malta/Makefile [deleted file]
arch/mips/mips-boards/malta/malta_int.c [deleted file]
arch/mips/mips-boards/malta/malta_mtd.c [deleted file]
arch/mips/mips-boards/malta/malta_platform.c [deleted file]
arch/mips/mips-boards/malta/malta_setup.c [deleted file]
arch/mips/mips-boards/malta/malta_smtc.c [deleted file]
arch/mips/mti-malta/Makefile [new file with mode: 0644]
arch/mips/mti-malta/malta-amon.c [new file with mode: 0644]
arch/mips/mti-malta/malta-cmdline.c [new file with mode: 0644]
arch/mips/mti-malta/malta-console.c [new file with mode: 0644]
arch/mips/mti-malta/malta-display.c [new file with mode: 0644]
arch/mips/mti-malta/malta-init.c [new file with mode: 0644]
arch/mips/mti-malta/malta-int.c [new file with mode: 0644]
arch/mips/mti-malta/malta-kgdb.c [new file with mode: 0644]
arch/mips/mti-malta/malta-memory.c [new file with mode: 0644]
arch/mips/mti-malta/malta-mtd.c [new file with mode: 0644]
arch/mips/mti-malta/malta-pci.c [new file with mode: 0644]
arch/mips/mti-malta/malta-platform.c [new file with mode: 0644]
arch/mips/mti-malta/malta-reset.c [new file with mode: 0644]
arch/mips/mti-malta/malta-setup.c [new file with mode: 0644]
arch/mips/mti-malta/malta-smtc.c [new file with mode: 0644]
arch/mips/mti-malta/malta-time.c [new file with mode: 0644]
include/asm-mips/mach-malta/cpu-feature-overrides.h [new file with mode: 0644]
include/asm-mips/mach-malta/irq.h [new file with mode: 0644]
include/asm-mips/mach-malta/kernel-entry-init.h [new file with mode: 0644]
include/asm-mips/mach-malta/mach-gt64120.h [new file with mode: 0644]
include/asm-mips/mach-malta/mc146818rtc.h [new file with mode: 0644]
include/asm-mips/mach-malta/war.h [new file with mode: 0644]
include/asm-mips/mach-mips/cpu-feature-overrides.h [deleted file]
include/asm-mips/mach-mips/irq.h [deleted file]
include/asm-mips/mach-mips/kernel-entry-init.h [deleted file]
include/asm-mips/mach-mips/mach-gt64120.h [deleted file]
include/asm-mips/mach-mips/mc146818rtc.h [deleted file]
include/asm-mips/mach-mips/war.h [deleted file]

index ed8821ac8a8e827add2fb100e2707ed13617100f..36aa690484c831a6195dd5b69e113583969c2d3e 100644 (file)
@@ -307,9 +307,8 @@ cflags-$(CONFIG_LEMOTE_FULONG) += -Iinclude/asm-mips/mach-lemote
 #
 # MIPS Malta board
 #
-core-$(CONFIG_MIPS_MALTA)      += arch/mips/mips-boards/generic/       \
-                                  arch/mips/mips-boards/malta/
-cflags-$(CONFIG_MIPS_MALTA)    += -Iinclude/asm-mips/mach-mips
+core-$(CONFIG_MIPS_MALTA)      += arch/mips/mti-malta/
+cflags-$(CONFIG_MIPS_MALTA)    += -Iinclude/asm-mips/mach-malta
 load-$(CONFIG_MIPS_MALTA)      += 0xffffffff80100000
 all-$(CONFIG_MIPS_MALTA)       := vmlinux.bin
 
diff --git a/arch/mips/mips-boards/generic/Makefile b/arch/mips/mips-boards/generic/Makefile
deleted file mode 100644 (file)
index f7f87fc..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# Carsten Langgaard, carstenl@mips.com
-# Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
-#
-# This program is free software; you can distribute it and/or modify it
-# under the terms of the GNU General Public License (Version 2) as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
-#
-# Makefile for the MIPS boards generic routines under Linux.
-#
-
-obj-y                          := reset.o display.o init.o memory.o \
-                                  cmdline.o time.o
-obj-y                          += amon.o
-
-obj-$(CONFIG_EARLY_PRINTK)     += console.o
-obj-$(CONFIG_PCI)              += pci.o
-obj-$(CONFIG_KGDB)             += gdb_hook.o
-
-EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/mips-boards/generic/amon.c b/arch/mips/mips-boards/generic/amon.c
deleted file mode 100644 (file)
index 96236bf..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2007  MIPS Technologies, Inc.
- *     All rights reserved.
-
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Arbitrary Monitor interface
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/smp.h>
-
-#include <asm-mips/addrspace.h>
-#include <asm-mips/mips-boards/launch.h>
-#include <asm-mips/mipsmtregs.h>
-
-int amon_cpu_avail(int cpu)
-{
-       struct cpulaunch *launch = (struct cpulaunch *)CKSEG0ADDR(CPULAUNCH);
-
-       if (cpu < 0 || cpu >= NCPULAUNCH) {
-               pr_debug("avail: cpu%d is out of range\n", cpu);
-               return 0;
-       }
-
-       launch += cpu;
-       if (!(launch->flags & LAUNCH_FREADY)) {
-               pr_debug("avail: cpu%d is not ready\n", cpu);
-               return 0;
-       }
-       if (launch->flags & (LAUNCH_FGO|LAUNCH_FGONE)) {
-               pr_debug("avail: too late.. cpu%d is already gone\n", cpu);
-               return 0;
-       }
-
-       return 1;
-}
-
-void amon_cpu_start(int cpu,
-                   unsigned long pc, unsigned long sp,
-                   unsigned long gp, unsigned long a0)
-{
-       volatile struct cpulaunch *launch =
-               (struct cpulaunch  *)CKSEG0ADDR(CPULAUNCH);
-
-       if (!amon_cpu_avail(cpu))
-               return;
-       if (cpu == smp_processor_id()) {
-               pr_debug("launch: I am cpu%d!\n", cpu);
-               return;
-       }
-       launch += cpu;
-
-       pr_debug("launch: starting cpu%d\n", cpu);
-
-       launch->pc = pc;
-       launch->gp = gp;
-       launch->sp = sp;
-       launch->a0 = a0;
-
-       /* Make sure target sees parameters before the go bit */
-       smp_mb();
-
-       launch->flags |= LAUNCH_FGO;
-       while ((launch->flags & LAUNCH_FGONE) == 0)
-               ;
-       pr_debug("launch: cpu%d gone!\n", cpu);
-}
diff --git a/arch/mips/mips-boards/generic/cmdline.c b/arch/mips/mips-boards/generic/cmdline.c
deleted file mode 100644 (file)
index 1871c30..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- * This program is free software; you can distribute it and/or modify it
- * under the terms of the GNU General Public License (Version 2) as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Kernel command line creation using the prom monitor (YAMON) argc/argv.
- */
-#include <linux/init.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-
-extern int prom_argc;
-extern int *_prom_argv;
-
-/*
- * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
- * This macro take care of sign extension.
- */
-#define prom_argv(index) ((char *)(long)_prom_argv[(index)])
-
-char * __init prom_getcmdline(void)
-{
-       return &(arcs_cmdline[0]);
-}
-
-
-void  __init prom_init_cmdline(void)
-{
-       char *cp;
-       int actr;
-
-       actr = 1; /* Always ignore argv[0] */
-
-       cp = &(arcs_cmdline[0]);
-       while(actr < prom_argc) {
-               strcpy(cp, prom_argv(actr));
-               cp += strlen(prom_argv(actr));
-               *cp++ = ' ';
-               actr++;
-       }
-       if (cp != &(arcs_cmdline[0])) {
-               /* get rid of trailing space */
-               --cp;
-               *cp = '\0';
-       }
-}
diff --git a/arch/mips/mips-boards/generic/console.c b/arch/mips/mips-boards/generic/console.c
deleted file mode 100644 (file)
index 43bcfb4..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Putting things on the screen/serial line using YAMONs facilities.
- */
-#include <linux/console.h>
-#include <linux/init.h>
-#include <linux/serial_reg.h>
-#include <asm/io.h>
-
-
-#define PORT(offset) (0x3f8 + (offset))
-
-
-static inline unsigned int serial_in(int offset)
-{
-       return inb(PORT(offset));
-}
-
-static inline void serial_out(int offset, int value)
-{
-       outb(value, PORT(offset));
-}
-
-int prom_putchar(char c)
-{
-       while ((serial_in(UART_LSR) & UART_LSR_THRE) == 0)
-               ;
-
-       serial_out(UART_TX, c);
-
-       return 1;
-}
diff --git a/arch/mips/mips-boards/generic/display.c b/arch/mips/mips-boards/generic/display.c
deleted file mode 100644 (file)
index 7c8828f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Display routines for display messages in MIPS boards ascii display.
- */
-
-#include <linux/compiler.h>
-#include <linux/timer.h>
-#include <asm/io.h>
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/prom.h>
-
-extern const char display_string[];
-static unsigned int display_count;
-static unsigned int max_display_count;
-
-void mips_display_message(const char *str)
-{
-       static unsigned int __iomem *display = NULL;
-       int i;
-
-       if (unlikely(display == NULL))
-               display = ioremap(ASCII_DISPLAY_POS_BASE, 16*sizeof(int));
-
-       for (i = 0; i <= 14; i=i+2) {
-                if (*str)
-                        __raw_writel(*str++, display + i);
-                else
-                        __raw_writel(' ', display + i);
-       }
-}
-
-static void scroll_display_message(unsigned long data);
-static DEFINE_TIMER(mips_scroll_timer, scroll_display_message, HZ, 0);
-
-static void scroll_display_message(unsigned long data)
-{
-       mips_display_message(&display_string[display_count++]);
-       if (display_count == max_display_count)
-               display_count = 0;
-
-       mod_timer(&mips_scroll_timer, jiffies + HZ);
-}
-
-void mips_scroll_message(void)
-{
-       del_timer_sync(&mips_scroll_timer);
-       max_display_count = strlen(display_string) + 1 - 8;
-       mod_timer(&mips_scroll_timer, jiffies + 1);
-}
diff --git a/arch/mips/mips-boards/generic/gdb_hook.c b/arch/mips/mips-boards/generic/gdb_hook.c
deleted file mode 100644 (file)
index 6a1854d..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * This is the interface to the remote debugger stub.
- */
-#include <linux/types.h>
-#include <linux/serial.h>
-#include <linux/serialP.h>
-#include <linux/serial_reg.h>
-
-#include <asm/serial.h>
-#include <asm/io.h>
-
-static struct serial_state rs_table[] = {
-       SERIAL_PORT_DFNS        /* Defined in serial.h */
-};
-
-static struct async_struct kdb_port_info = {0};
-
-int (*generic_putDebugChar)(char);
-char (*generic_getDebugChar)(void);
-
-static __inline__ unsigned int serial_in(struct async_struct *info, int offset)
-{
-       return inb(info->port + offset);
-}
-
-static __inline__ void serial_out(struct async_struct *info, int offset,
-                               int value)
-{
-       outb(value, info->port+offset);
-}
-
-int rs_kgdb_hook(int tty_no, int speed) {
-       int t;
-       struct serial_state *ser = &rs_table[tty_no];
-
-       kdb_port_info.state = ser;
-       kdb_port_info.magic = SERIAL_MAGIC;
-       kdb_port_info.port = ser->port;
-       kdb_port_info.flags = ser->flags;
-
-       /*
-        * Clear all interrupts
-        */
-       serial_in(&kdb_port_info, UART_LSR);
-       serial_in(&kdb_port_info, UART_RX);
-       serial_in(&kdb_port_info, UART_IIR);
-       serial_in(&kdb_port_info, UART_MSR);
-
-       /*
-        * Now, initialize the UART
-        */
-       serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8);   /* reset DLAB */
-       if (kdb_port_info.flags & ASYNC_FOURPORT) {
-               kdb_port_info.MCR = UART_MCR_DTR | UART_MCR_RTS;
-               t = UART_MCR_DTR | UART_MCR_OUT1;
-       } else {
-               kdb_port_info.MCR
-                       = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2;
-               t = UART_MCR_DTR | UART_MCR_RTS;
-       }
-
-       kdb_port_info.MCR = t;          /* no interrupts, please */
-       serial_out(&kdb_port_info, UART_MCR, kdb_port_info.MCR);
-
-       /*
-        * and set the speed of the serial port
-        */
-       if (speed == 0)
-               speed = 9600;
-
-       t = kdb_port_info.state->baud_base / speed;
-       /* set DLAB */
-       serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
-       serial_out(&kdb_port_info, UART_DLL, t & 0xff);/* LS of divisor */
-       serial_out(&kdb_port_info, UART_DLM, t >> 8);  /* MS of divisor */
-       /* reset DLAB */
-       serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8);
-
-       return speed;
-}
-
-int putDebugChar(char c)
-{
-       return generic_putDebugChar(c);
-}
-
-char getDebugChar(void)
-{
-       return generic_getDebugChar();
-}
-
-int rs_putDebugChar(char c)
-{
-
-       if (!kdb_port_info.state) {     /* need to init device first */
-               return 0;
-       }
-
-       while ((serial_in(&kdb_port_info, UART_LSR) & UART_LSR_THRE) == 0)
-               ;
-
-       serial_out(&kdb_port_info, UART_TX, c);
-
-       return 1;
-}
-
-char rs_getDebugChar(void)
-{
-       if (!kdb_port_info.state) {     /* need to init device first */
-               return 0;
-       }
-
-       while (!(serial_in(&kdb_port_info, UART_LSR) & 1))
-               ;
-
-       return serial_in(&kdb_port_info, UART_RX);
-}
diff --git a/arch/mips/mips-boards/generic/init.c b/arch/mips/mips-boards/generic/init.c
deleted file mode 100644 (file)
index c065302..0000000
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright (C) 1999, 2000, 2004, 2005  MIPS Technologies, Inc.
- *     All rights reserved.
- *     Authors: Carsten Langgaard <carstenl@mips.com>
- *              Maciej W. Rozycki <macro@mips.com>
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * PROM library initialisation code.
- */
-#include <linux/init.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-#include <asm/gt64120.h>
-#include <asm/io.h>
-#include <asm/system.h>
-#include <asm/cacheflush.h>
-#include <asm/traps.h>
-
-#include <asm/mips-boards/prom.h>
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/bonito64.h>
-#include <asm/mips-boards/msc01_pci.h>
-
-#include <asm/mips-boards/malta.h>
-
-#ifdef CONFIG_KGDB
-extern int rs_kgdb_hook(int, int);
-extern int rs_putDebugChar(char);
-extern char rs_getDebugChar(void);
-extern int saa9730_kgdb_hook(int);
-extern int saa9730_putDebugChar(char);
-extern char saa9730_getDebugChar(void);
-#endif
-
-int prom_argc;
-int *_prom_argv, *_prom_envp;
-
-/*
- * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
- * This macro take care of sign extension, if running in 64-bit mode.
- */
-#define prom_envp(index) ((char *)(long)_prom_envp[(index)])
-
-int init_debug = 0;
-
-int mips_revision_corid;
-int mips_revision_sconid;
-
-/* Bonito64 system controller register base. */
-unsigned long _pcictrl_bonito;
-unsigned long _pcictrl_bonito_pcicfg;
-
-/* GT64120 system controller register base */
-unsigned long _pcictrl_gt64120;
-
-/* MIPS System controller register base */
-unsigned long _pcictrl_msc;
-
-char *prom_getenv(char *envname)
-{
-       /*
-        * Return a pointer to the given environment variable.
-        * In 64-bit mode: we're using 64-bit pointers, but all pointers
-        * in the PROM structures are only 32-bit, so we need some
-        * workarounds, if we are running in 64-bit mode.
-        */
-       int i, index=0;
-
-       i = strlen(envname);
-
-       while (prom_envp(index)) {
-               if(strncmp(envname, prom_envp(index), i) == 0) {
-                       return(prom_envp(index+1));
-               }
-               index += 2;
-       }
-
-       return NULL;
-}
-
-static inline unsigned char str2hexnum(unsigned char c)
-{
-       if (c >= '0' && c <= '9')
-               return c - '0';
-       if (c >= 'a' && c <= 'f')
-               return c - 'a' + 10;
-       return 0; /* foo */
-}
-
-static inline void str2eaddr(unsigned char *ea, unsigned char *str)
-{
-       int i;
-
-       for (i = 0; i < 6; i++) {
-               unsigned char num;
-
-               if((*str == '.') || (*str == ':'))
-                       str++;
-               num = str2hexnum(*str++) << 4;
-               num |= (str2hexnum(*str++));
-               ea[i] = num;
-       }
-}
-
-int get_ethernet_addr(char *ethernet_addr)
-{
-        char *ethaddr_str;
-
-        ethaddr_str = prom_getenv("ethaddr");
-       if (!ethaddr_str) {
-               printk("ethaddr not set in boot prom\n");
-               return -1;
-       }
-       str2eaddr(ethernet_addr, ethaddr_str);
-
-       if (init_debug > 1) {
-               int i;
-               printk("get_ethernet_addr: ");
-               for (i=0; i<5; i++)
-                       printk("%02x:", (unsigned char)*(ethernet_addr+i));
-               printk("%02x\n", *(ethernet_addr+i));
-       }
-
-       return 0;
-}
-
-#ifdef CONFIG_SERIAL_8250_CONSOLE
-static void __init console_config(void)
-{
-       char console_string[40];
-       int baud = 0;
-       char parity = '\0', bits = '\0', flow = '\0';
-       char *s;
-
-       if ((strstr(prom_getcmdline(), "console=")) == NULL) {
-               s = prom_getenv("modetty0");
-               if (s) {
-                       while (*s >= '0' && *s <= '9')
-                               baud = baud*10 + *s++ - '0';
-                       if (*s == ',') s++;
-                       if (*s) parity = *s++;
-                       if (*s == ',') s++;
-                       if (*s) bits = *s++;
-                       if (*s == ',') s++;
-                       if (*s == 'h') flow = 'r';
-               }
-               if (baud == 0)
-                       baud = 38400;
-               if (parity != 'n' && parity != 'o' && parity != 'e')
-                       parity = 'n';
-               if (bits != '7' && bits != '8')
-                       bits = '8';
-               if (flow == '\0')
-                       flow = 'r';
-               sprintf(console_string, " console=ttyS0,%d%c%c%c", baud, parity, bits, flow);
-               strcat(prom_getcmdline(), console_string);
-               pr_info("Config serial console:%s\n", console_string);
-       }
-}
-#endif
-
-#ifdef CONFIG_KGDB
-void __init kgdb_config(void)
-{
-       extern int (*generic_putDebugChar)(char);
-       extern char (*generic_getDebugChar)(void);
-       char *argptr;
-       int line, speed;
-
-       argptr = prom_getcmdline();
-       if ((argptr = strstr(argptr, "kgdb=ttyS")) != NULL) {
-               argptr += strlen("kgdb=ttyS");
-               if (*argptr != '0' && *argptr != '1')
-                       printk("KGDB: Unknown serial line /dev/ttyS%c, "
-                              "falling back to /dev/ttyS1\n", *argptr);
-               line = *argptr == '0' ? 0 : 1;
-               printk("KGDB: Using serial line /dev/ttyS%d for session\n", line);
-
-               speed = 0;
-               if (*++argptr == ',')
-               {
-                       int c;
-                       while ((c = *++argptr) && ('0' <= c && c <= '9'))
-                               speed = speed * 10 + c - '0';
-               }
-               {
-                       speed = rs_kgdb_hook(line, speed);
-                       generic_putDebugChar = rs_putDebugChar;
-                       generic_getDebugChar = rs_getDebugChar;
-               }
-
-               pr_info("KGDB: Using serial line /dev/ttyS%d at %d for "
-                       "session, please connect your debugger\n",
-                       line ? 1 : 0, speed);
-
-               {
-                       char *s;
-                       for (s = "Please connect GDB to this port\r\n"; *s; )
-                               generic_putDebugChar(*s++);
-               }
-
-               /* Breakpoint is invoked after interrupts are initialised */
-       }
-}
-#endif
-
-static void __init mips_nmi_setup(void)
-{
-       void *base;
-       extern char except_vec_nmi;
-
-       base = cpu_has_veic ?
-               (void *)(CAC_BASE + 0xa80) :
-               (void *)(CAC_BASE + 0x380);
-       memcpy(base, &except_vec_nmi, 0x80);
-       flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
-}
-
-static void __init mips_ejtag_setup(void)
-{
-       void *base;
-       extern char except_vec_ejtag_debug;
-
-       base = cpu_has_veic ?
-               (void *)(CAC_BASE + 0xa00) :
-               (void *)(CAC_BASE + 0x300);
-       memcpy(base, &except_vec_ejtag_debug, 0x80);
-       flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
-}
-
-extern struct plat_smp_ops msmtc_smp_ops;
-
-void __init prom_init(void)
-{
-       prom_argc = fw_arg0;
-       _prom_argv = (int *) fw_arg1;
-       _prom_envp = (int *) fw_arg2;
-
-       mips_display_message("LINUX");
-
-       /*
-        * early setup of _pcictrl_bonito so that we can determine
-        * the system controller on a CORE_EMUL board
-        */
-       _pcictrl_bonito = (unsigned long)ioremap(BONITO_REG_BASE, BONITO_REG_SIZE);
-
-       mips_revision_corid = MIPS_REVISION_CORID;
-
-       if (mips_revision_corid == MIPS_REVISION_CORID_CORE_EMUL) {
-               if (BONITO_PCIDID == 0x0001df53 ||
-                   BONITO_PCIDID == 0x0003df53)
-                       mips_revision_corid = MIPS_REVISION_CORID_CORE_EMUL_BON;
-               else
-                       mips_revision_corid = MIPS_REVISION_CORID_CORE_EMUL_MSC;
-       }
-
-       mips_revision_sconid = MIPS_REVISION_SCONID;
-       if (mips_revision_sconid == MIPS_REVISION_SCON_OTHER) {
-               switch (mips_revision_corid) {
-               case MIPS_REVISION_CORID_QED_RM5261:
-               case MIPS_REVISION_CORID_CORE_LV:
-               case MIPS_REVISION_CORID_CORE_FPGA:
-               case MIPS_REVISION_CORID_CORE_FPGAR2:
-                       mips_revision_sconid = MIPS_REVISION_SCON_GT64120;
-                       break;
-               case MIPS_REVISION_CORID_CORE_EMUL_BON:
-               case MIPS_REVISION_CORID_BONITO64:
-               case MIPS_REVISION_CORID_CORE_20K:
-                       mips_revision_sconid = MIPS_REVISION_SCON_BONITO;
-                       break;
-               case MIPS_REVISION_CORID_CORE_MSC:
-               case MIPS_REVISION_CORID_CORE_FPGA2:
-               case MIPS_REVISION_CORID_CORE_24K:
-                       /*
-                        * SOCit/ROCit support is essentially identical
-                        * but make an attempt to distinguish them
-                        */
-                       mips_revision_sconid = MIPS_REVISION_SCON_SOCIT;
-                       break;
-               case MIPS_REVISION_CORID_CORE_FPGA3:
-               case MIPS_REVISION_CORID_CORE_FPGA4:
-               case MIPS_REVISION_CORID_CORE_FPGA5:
-               case MIPS_REVISION_CORID_CORE_EMUL_MSC:
-               default:
-                       /* See above */
-                       mips_revision_sconid = MIPS_REVISION_SCON_ROCIT;
-                       break;
-               }
-       }
-
-       switch (mips_revision_sconid) {
-               u32 start, map, mask, data;
-
-       case MIPS_REVISION_SCON_GT64120:
-               /*
-                * Setup the North bridge to do Master byte-lane swapping
-                * when running in bigendian.
-                */
-               _pcictrl_gt64120 = (unsigned long)ioremap(MIPS_GT_BASE, 0x2000);
-
-#ifdef CONFIG_CPU_LITTLE_ENDIAN
-               GT_WRITE(GT_PCI0_CMD_OFS, GT_PCI0_CMD_MBYTESWAP_BIT |
-                        GT_PCI0_CMD_SBYTESWAP_BIT);
-#else
-               GT_WRITE(GT_PCI0_CMD_OFS, 0);
-#endif
-               /* Fix up PCI I/O mapping if necessary (for Atlas).  */
-               start = GT_READ(GT_PCI0IOLD_OFS);
-               map = GT_READ(GT_PCI0IOREMAP_OFS);
-               if ((start & map) != 0) {
-                       map &= ~start;
-                       GT_WRITE(GT_PCI0IOREMAP_OFS, map);
-               }
-
-               set_io_port_base(MALTA_GT_PORT_BASE);
-               break;
-
-       case MIPS_REVISION_SCON_BONITO:
-               _pcictrl_bonito_pcicfg = (unsigned long)ioremap(BONITO_PCICFG_BASE, BONITO_PCICFG_SIZE);
-
-               /*
-                * Disable Bonito IOBC.
-                */
-               BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG &
-                       ~(BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
-                         BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
-
-               /*
-                * Setup the North bridge to do Master byte-lane swapping
-                * when running in bigendian.
-                */
-#ifdef CONFIG_CPU_LITTLE_ENDIAN
-               BONITO_BONGENCFG = BONITO_BONGENCFG &
-                       ~(BONITO_BONGENCFG_MSTRBYTESWAP |
-                         BONITO_BONGENCFG_BYTESWAP);
-#else
-               BONITO_BONGENCFG = BONITO_BONGENCFG |
-                       BONITO_BONGENCFG_MSTRBYTESWAP |
-                       BONITO_BONGENCFG_BYTESWAP;
-#endif
-
-               set_io_port_base(MALTA_BONITO_PORT_BASE);
-               break;
-
-       case MIPS_REVISION_SCON_SOCIT:
-       case MIPS_REVISION_SCON_ROCIT:
-               _pcictrl_msc = (unsigned long)ioremap(MIPS_MSC01_PCI_REG_BASE, 0x2000);
-       mips_pci_controller:
-               mb();
-               MSC_READ(MSC01_PCI_CFG, data);
-               MSC_WRITE(MSC01_PCI_CFG, data & ~MSC01_PCI_CFG_EN_BIT);
-               wmb();
-
-               /* Fix up lane swapping.  */
-#ifdef CONFIG_CPU_LITTLE_ENDIAN
-               MSC_WRITE(MSC01_PCI_SWAP, MSC01_PCI_SWAP_NOSWAP);
-#else
-               MSC_WRITE(MSC01_PCI_SWAP,
-                         MSC01_PCI_SWAP_BYTESWAP << MSC01_PCI_SWAP_IO_SHF |
-                         MSC01_PCI_SWAP_BYTESWAP << MSC01_PCI_SWAP_MEM_SHF |
-                         MSC01_PCI_SWAP_BYTESWAP << MSC01_PCI_SWAP_BAR0_SHF);
-#endif
-               /* Fix up target memory mapping.  */
-               MSC_READ(MSC01_PCI_BAR0, mask);
-               MSC_WRITE(MSC01_PCI_P2SCMSKL, mask & MSC01_PCI_BAR0_SIZE_MSK);
-
-               /* Don't handle target retries indefinitely.  */
-               if ((data & MSC01_PCI_CFG_MAXRTRY_MSK) ==
-                   MSC01_PCI_CFG_MAXRTRY_MSK)
-                       data = (data & ~(MSC01_PCI_CFG_MAXRTRY_MSK <<
-                                        MSC01_PCI_CFG_MAXRTRY_SHF)) |
-                              ((MSC01_PCI_CFG_MAXRTRY_MSK - 1) <<
-                               MSC01_PCI_CFG_MAXRTRY_SHF);
-
-               wmb();
-               MSC_WRITE(MSC01_PCI_CFG, data);
-               mb();
-
-               set_io_port_base(MALTA_MSC_PORT_BASE);
-               break;
-
-       case MIPS_REVISION_SCON_SOCITSC:
-       case MIPS_REVISION_SCON_SOCITSCP:
-               _pcictrl_msc = (unsigned long)ioremap(MIPS_SOCITSC_PCI_REG_BASE, 0x2000);
-               goto mips_pci_controller;
-
-       default:
-               /* Unknown system controller */
-               mips_display_message("SC Error");
-               while (1);   /* We die here... */
-       }
-       board_nmi_handler_setup = mips_nmi_setup;
-       board_ejtag_handler_setup = mips_ejtag_setup;
-
-       pr_info("\nLINUX started...\n");
-       prom_init_cmdline();
-       prom_meminit();
-#ifdef CONFIG_SERIAL_8250_CONSOLE
-       console_config();
-#endif
-#ifdef CONFIG_MIPS_CMP
-       register_smp_ops(&cmp_smp_ops);
-#endif
-#ifdef CONFIG_MIPS_MT_SMP
-       register_smp_ops(&vsmp_smp_ops);
-#endif
-#ifdef CONFIG_MIPS_MT_SMTC
-       register_smp_ops(&msmtc_smp_ops);
-#endif
-}
diff --git a/arch/mips/mips-boards/generic/memory.c b/arch/mips/mips-boards/generic/memory.c
deleted file mode 100644 (file)
index 61888ff..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * PROM library functions for acquiring/using memory descriptors given to
- * us from the YAMON.
- */
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/bootmem.h>
-#include <linux/pfn.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-#include <asm/page.h>
-#include <asm/sections.h>
-
-#include <asm/mips-boards/prom.h>
-
-/*#define DEBUG*/
-
-enum yamon_memtypes {
-       yamon_dontuse,
-       yamon_prom,
-       yamon_free,
-};
-static struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];
-
-#ifdef DEBUG
-static char *mtypes[3] = {
-       "Dont use memory",
-       "YAMON PROM memory",
-       "Free memmory",
-};
-#endif
-
-/* determined physical memory size, not overridden by command line args  */
-unsigned long physical_memsize = 0L;
-
-static struct prom_pmemblock * __init prom_getmdesc(void)
-{
-       char *memsize_str;
-       unsigned int memsize;
-       char cmdline[CL_SIZE], *ptr;
-
-       /* otherwise look in the environment */
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str) {
-               printk(KERN_WARNING
-                      "memsize not set in boot prom, set to default (32Mb)\n");
-               physical_memsize = 0x02000000;
-       } else {
-#ifdef DEBUG
-               pr_debug("prom_memsize = %s\n", memsize_str);
-#endif
-               physical_memsize = simple_strtol(memsize_str, NULL, 0);
-       }
-
-#ifdef CONFIG_CPU_BIG_ENDIAN
-       /* SOC-it swaps, or perhaps doesn't swap, when DMA'ing the last
-          word of physical memory */
-       physical_memsize -= PAGE_SIZE;
-#endif
-
-       /* Check the command line for a memsize directive that overrides
-          the physical/default amount */
-       strcpy(cmdline, arcs_cmdline);
-       ptr = strstr(cmdline, "memsize=");
-       if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' '))
-               ptr = strstr(ptr, " memsize=");
-
-       if (ptr)
-               memsize = memparse(ptr + 8, &ptr);
-       else
-               memsize = physical_memsize;
-
-       memset(mdesc, 0, sizeof(mdesc));
-
-       mdesc[0].type = yamon_dontuse;
-       mdesc[0].base = 0x00000000;
-       mdesc[0].size = 0x00001000;
-
-       mdesc[1].type = yamon_prom;
-       mdesc[1].base = 0x00001000;
-       mdesc[1].size = 0x000ef000;
-
-       /*
-        * The area 0x000f0000-0x000fffff is allocated for BIOS memory by the
-        * south bridge and PCI access always forwarded to the ISA Bus and
-        * BIOSCS# is always generated.
-        * This mean that this area can't be used as DMA memory for PCI
-        * devices.
-        */
-       mdesc[2].type = yamon_dontuse;
-       mdesc[2].base = 0x000f0000;
-       mdesc[2].size = 0x00010000;
-
-       mdesc[3].type = yamon_dontuse;
-       mdesc[3].base = 0x00100000;
-       mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - mdesc[3].base;
-
-       mdesc[4].type = yamon_free;
-       mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end));
-       mdesc[4].size = memsize - mdesc[4].base;
-
-       return &mdesc[0];
-}
-
-static int __init prom_memtype_classify(unsigned int type)
-{
-       switch (type) {
-       case yamon_free:
-               return BOOT_MEM_RAM;
-       case yamon_prom:
-               return BOOT_MEM_ROM_DATA;
-       default:
-               return BOOT_MEM_RESERVED;
-       }
-}
-
-void __init prom_meminit(void)
-{
-       struct prom_pmemblock *p;
-
-#ifdef DEBUG
-       pr_debug("YAMON MEMORY DESCRIPTOR dump:\n");
-       p = prom_getmdesc();
-       while (p->size) {
-               int i = 0;
-               pr_debug("[%d,%p]: base<%08lx> size<%08lx> type<%s>\n",
-                        i, p, p->base, p->size, mtypes[p->type]);
-               p++;
-               i++;
-       }
-#endif
-       p = prom_getmdesc();
-
-       while (p->size) {
-               long type;
-               unsigned long base, size;
-
-               type = prom_memtype_classify(p->type);
-               base = p->base;
-               size = p->size;
-
-               add_memory_region(base, size, type);
-                p++;
-       }
-}
-
-void __init prom_free_prom_memory(void)
-{
-       unsigned long addr;
-       int i;
-
-       for (i = 0; i < boot_mem_map.nr_map; i++) {
-               if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
-                       continue;
-
-               addr = boot_mem_map.map[i].addr;
-               free_init_pages("prom memory",
-                               addr, addr + boot_mem_map.map[i].size);
-       }
-}
diff --git a/arch/mips/mips-boards/generic/pci.c b/arch/mips/mips-boards/generic/pci.c
deleted file mode 100644 (file)
index b974319..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 1999, 2000, 2004, 2005  MIPS Technologies, Inc.
- *     All rights reserved.
- *     Authors: Carsten Langgaard <carstenl@mips.com>
- *              Maciej W. Rozycki <macro@mips.com>
- *
- * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * MIPS boards specific PCI support.
- */
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/gt64120.h>
-
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/bonito64.h>
-#include <asm/mips-boards/msc01_pci.h>
-
-static struct resource bonito64_mem_resource = {
-       .name   = "Bonito PCI MEM",
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct resource bonito64_io_resource = {
-       .name   = "Bonito PCI I/O",
-       .start  = 0x00000000UL,
-       .end    = 0x000fffffUL,
-       .flags  = IORESOURCE_IO,
-};
-
-static struct resource gt64120_mem_resource = {
-       .name   = "GT-64120 PCI MEM",
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct resource gt64120_io_resource = {
-       .name   = "GT-64120 PCI I/O",
-       .flags  = IORESOURCE_IO,
-};
-
-static struct resource msc_mem_resource = {
-       .name   = "MSC PCI MEM",
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct resource msc_io_resource = {
-       .name   = "MSC PCI I/O",
-       .flags  = IORESOURCE_IO,
-};
-
-extern struct pci_ops bonito64_pci_ops;
-extern struct pci_ops gt64xxx_pci0_ops;
-extern struct pci_ops msc_pci_ops;
-
-static struct pci_controller bonito64_controller = {
-       .pci_ops        = &bonito64_pci_ops,
-       .io_resource    = &bonito64_io_resource,
-       .mem_resource   = &bonito64_mem_resource,
-       .io_offset      = 0x00000000UL,
-};
-
-static struct pci_controller gt64120_controller = {
-       .pci_ops        = &gt64xxx_pci0_ops,
-       .io_resource    = &gt64120_io_resource,
-       .mem_resource   = &gt64120_mem_resource,
-};
-
-static struct pci_controller msc_controller = {
-       .pci_ops        = &msc_pci_ops,
-       .io_resource    = &msc_io_resource,
-       .mem_resource   = &msc_mem_resource,
-};
-
-void __init mips_pcibios_init(void)
-{
-       struct pci_controller *controller;
-       resource_size_t start, end, map, start1, end1, map1, map2, map3, mask;
-
-       switch (mips_revision_sconid) {
-       case MIPS_REVISION_SCON_GT64120:
-               /*
-                * Due to a bug in the Galileo system controller, we need
-                * to setup the PCI BAR for the Galileo internal registers.
-                * This should be done in the bios/bootprom and will be
-                * fixed in a later revision of YAMON (the MIPS boards
-                * boot prom).
-                */
-               GT_WRITE(GT_PCI0_CFGADDR_OFS,
-                        (0 << GT_PCI0_CFGADDR_BUSNUM_SHF) | /* Local bus */
-                        (0 << GT_PCI0_CFGADDR_DEVNUM_SHF) | /* GT64120 dev */
-                        (0 << GT_PCI0_CFGADDR_FUNCTNUM_SHF) | /* Function 0*/
-                        ((0x20/4) << GT_PCI0_CFGADDR_REGNUM_SHF) | /* BAR 4*/
-                        GT_PCI0_CFGADDR_CONFIGEN_BIT);
-
-               /* Perform the write */
-               GT_WRITE(GT_PCI0_CFGDATA_OFS, CPHYSADDR(MIPS_GT_BASE));
-
-               /* Set up resource ranges from the controller's registers.  */
-               start = GT_READ(GT_PCI0M0LD_OFS);
-               end = GT_READ(GT_PCI0M0HD_OFS);
-               map = GT_READ(GT_PCI0M0REMAP_OFS);
-               end = (end & GT_PCI_HD_MSK) | (start & ~GT_PCI_HD_MSK);
-               start1 = GT_READ(GT_PCI0M1LD_OFS);
-               end1 = GT_READ(GT_PCI0M1HD_OFS);
-               map1 = GT_READ(GT_PCI0M1REMAP_OFS);
-               end1 = (end1 & GT_PCI_HD_MSK) | (start1 & ~GT_PCI_HD_MSK);
-               /* Cannot support multiple windows, use the wider.  */
-               if (end1 - start1 > end - start) {
-                       start = start1;
-                       end = end1;
-                       map = map1;
-               }
-               mask = ~(start ^ end);
-                /* We don't support remapping with a discontiguous mask.  */
-               BUG_ON((start & GT_PCI_HD_MSK) != (map & GT_PCI_HD_MSK) &&
-                      mask != ~((mask & -mask) - 1));
-               gt64120_mem_resource.start = start;
-               gt64120_mem_resource.end = end;
-               gt64120_controller.mem_offset = (start & mask) - (map & mask);
-               /* Addresses are 36-bit, so do shifts in the destinations.  */
-               gt64120_mem_resource.start <<= GT_PCI_DCRM_SHF;
-               gt64120_mem_resource.end <<= GT_PCI_DCRM_SHF;
-               gt64120_mem_resource.end |= (1 << GT_PCI_DCRM_SHF) - 1;
-               gt64120_controller.mem_offset <<= GT_PCI_DCRM_SHF;
-
-               start = GT_READ(GT_PCI0IOLD_OFS);
-               end = GT_READ(GT_PCI0IOHD_OFS);
-               map = GT_READ(GT_PCI0IOREMAP_OFS);
-               end = (end & GT_PCI_HD_MSK) | (start & ~GT_PCI_HD_MSK);
-               mask = ~(start ^ end);
-                /* We don't support remapping with a discontiguous mask.  */
-               BUG_ON((start & GT_PCI_HD_MSK) != (map & GT_PCI_HD_MSK) &&
-                      mask != ~((mask & -mask) - 1));
-               gt64120_io_resource.start = map & mask;
-               gt64120_io_resource.end = (map & mask) | ~mask;
-               gt64120_controller.io_offset = 0;
-               /* Addresses are 36-bit, so do shifts in the destinations.  */
-               gt64120_io_resource.start <<= GT_PCI_DCRM_SHF;
-               gt64120_io_resource.end <<= GT_PCI_DCRM_SHF;
-               gt64120_io_resource.end |= (1 << GT_PCI_DCRM_SHF) - 1;
-
-               controller = &gt64120_controller;
-               break;
-
-       case MIPS_REVISION_SCON_BONITO:
-               /* Set up resource ranges from the controller's registers.  */
-               map = BONITO_PCIMAP;
-               map1 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO0) >>
-                      BONITO_PCIMAP_PCIMAP_LO0_SHIFT;
-               map2 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO1) >>
-                      BONITO_PCIMAP_PCIMAP_LO1_SHIFT;
-               map3 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO2) >>
-                      BONITO_PCIMAP_PCIMAP_LO2_SHIFT;
-               /* Combine as many adjacent windows as possible.  */
-               map = map1;
-               start = BONITO_PCILO0_BASE;
-               end = 1;
-               if (map3 == map2 + 1) {
-                       map = map2;
-                       start = BONITO_PCILO1_BASE;
-                       end++;
-               }
-               if (map2 == map1 + 1) {
-                       map = map1;
-                       start = BONITO_PCILO0_BASE;
-                       end++;
-               }
-               bonito64_mem_resource.start = start;
-               bonito64_mem_resource.end = start +
-                                           BONITO_PCIMAP_WINBASE(end) - 1;
-               bonito64_controller.mem_offset = start -
-                                                BONITO_PCIMAP_WINBASE(map);
-
-               controller = &bonito64_controller;
-               break;
-
-       case MIPS_REVISION_SCON_SOCIT:
-       case MIPS_REVISION_SCON_ROCIT:
-       case MIPS_REVISION_SCON_SOCITSC:
-       case MIPS_REVISION_SCON_SOCITSCP:
-               /* Set up resource ranges from the controller's registers.  */
-               MSC_READ(MSC01_PCI_SC2PMBASL, start);
-               MSC_READ(MSC01_PCI_SC2PMMSKL, mask);
-               MSC_READ(MSC01_PCI_SC2PMMAPL, map);
-               msc_mem_resource.start = start & mask;
-               msc_mem_resource.end = (start & mask) | ~mask;
-               msc_controller.mem_offset = (start & mask) - (map & mask);
-
-               MSC_READ(MSC01_PCI_SC2PIOBASL, start);
-               MSC_READ(MSC01_PCI_SC2PIOMSKL, mask);
-               MSC_READ(MSC01_PCI_SC2PIOMAPL, map);
-               msc_io_resource.start = map & mask;
-               msc_io_resource.end = (map & mask) | ~mask;
-               msc_controller.io_offset = 0;
-               ioport_resource.end = ~mask;
-
-               /* If ranges overlap I/O takes precedence.  */
-               start = start & mask;
-               end = start | ~mask;
-               if ((start >= msc_mem_resource.start &&
-                    start <= msc_mem_resource.end) ||
-                   (end >= msc_mem_resource.start &&
-                    end <= msc_mem_resource.end)) {
-                       /* Use the larger space.  */
-                       start = max(start, msc_mem_resource.start);
-                       end = min(end, msc_mem_resource.end);
-                       if (start - msc_mem_resource.start >=
-                           msc_mem_resource.end - end)
-                               msc_mem_resource.end = start - 1;
-                       else
-                               msc_mem_resource.start = end + 1;
-               }
-
-               controller = &msc_controller;
-               break;
-       default:
-               return;
-       }
-
-       if (controller->io_resource->start < 0x00001000UL)      /* FIXME */
-               controller->io_resource->start = 0x00001000UL;
-
-       iomem_resource.end &= 0xfffffffffULL;                   /* 64 GB */
-       ioport_resource.end = controller->io_resource->end;
-
-       register_pci_controller(controller);
-}
diff --git a/arch/mips/mips-boards/generic/reset.c b/arch/mips/mips-boards/generic/reset.c
deleted file mode 100644 (file)
index 42dee4d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- * Reset the MIPS boards.
- *
- */
-#include <linux/pm.h>
-
-#include <asm/io.h>
-#include <asm/reboot.h>
-#include <asm/mips-boards/generic.h>
-
-static void mips_machine_restart(char *command);
-static void mips_machine_halt(void);
-
-static void mips_machine_restart(char *command)
-{
-       unsigned int __iomem *softres_reg =
-               ioremap(SOFTRES_REG, sizeof(unsigned int));
-
-       __raw_writel(GORESET, softres_reg);
-}
-
-static void mips_machine_halt(void)
-{
-       unsigned int __iomem *softres_reg =
-               ioremap(SOFTRES_REG, sizeof(unsigned int));
-
-       __raw_writel(GORESET, softres_reg);
-}
-
-
-void mips_reboot_setup(void)
-{
-       _machine_restart = mips_machine_restart;
-       _machine_halt = mips_machine_halt;
-       pm_power_off = mips_machine_halt;
-}
diff --git a/arch/mips/mips-boards/generic/time.c b/arch/mips/mips-boards/generic/time.c
deleted file mode 100644 (file)
index 0b97d47..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Setting up the clock on the MIPS boards.
- */
-
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/kernel_stat.h>
-#include <linux/sched.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/time.h>
-#include <linux/timex.h>
-#include <linux/mc146818rtc.h>
-
-#include <asm/mipsregs.h>
-#include <asm/mipsmtregs.h>
-#include <asm/hardirq.h>
-#include <asm/i8253.h>
-#include <asm/irq.h>
-#include <asm/div64.h>
-#include <asm/cpu.h>
-#include <asm/time.h>
-#include <asm/mc146818-time.h>
-#include <asm/msc01_ic.h>
-
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/prom.h>
-
-#include <asm/mips-boards/maltaint.h>
-
-unsigned long cpu_khz;
-
-static int mips_cpu_timer_irq;
-static int mips_cpu_perf_irq;
-extern int cp0_perfcount_irq;
-
-static void mips_timer_dispatch(void)
-{
-       do_IRQ(mips_cpu_timer_irq);
-}
-
-static void mips_perf_dispatch(void)
-{
-       do_IRQ(mips_cpu_perf_irq);
-}
-
-/*
- * Estimate CPU frequency.  Sets mips_hpt_frequency as a side-effect
- */
-static unsigned int __init estimate_cpu_frequency(void)
-{
-       unsigned int prid = read_c0_prid() & 0xffff00;
-       unsigned int count;
-
-       unsigned long flags;
-       unsigned int start;
-
-       local_irq_save(flags);
-
-       /* Start counter exactly on falling edge of update flag */
-       while (CMOS_READ(RTC_REG_A) & RTC_UIP);
-       while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
-
-       /* Start r4k counter. */
-       start = read_c0_count();
-
-       /* Read counter exactly on falling edge of update flag */
-       while (CMOS_READ(RTC_REG_A) & RTC_UIP);
-       while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
-
-       count = read_c0_count() - start;
-
-       /* restore interrupts */
-       local_irq_restore(flags);
-
-       mips_hpt_frequency = count;
-       if ((prid != (PRID_COMP_MIPS | PRID_IMP_20KC)) &&
-           (prid != (PRID_COMP_MIPS | PRID_IMP_25KF)))
-               count *= 2;
-
-       count += 5000;    /* round */
-       count -= count%10000;
-
-       return count;
-}
-
-unsigned long read_persistent_clock(void)
-{
-       return mc146818_get_cmos_time();
-}
-
-static void __init plat_perf_setup(void)
-{
-#ifdef MSC01E_INT_BASE
-       if (cpu_has_veic) {
-               set_vi_handler(MSC01E_INT_PERFCTR, mips_perf_dispatch);
-               mips_cpu_perf_irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR;
-       } else
-#endif
-       if (cp0_perfcount_irq >= 0) {
-               if (cpu_has_vint)
-                       set_vi_handler(cp0_perfcount_irq, mips_perf_dispatch);
-               mips_cpu_perf_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
-#ifdef CONFIG_SMP
-               set_irq_handler(mips_cpu_perf_irq, handle_percpu_irq);
-#endif
-       }
-}
-
-unsigned int __cpuinit get_c0_compare_int(void)
-{
-#ifdef MSC01E_INT_BASE
-       if (cpu_has_veic) {
-               set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch);
-               mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR;
-       } else
-#endif
-       {
-               if (cpu_has_vint)
-                       set_vi_handler(cp0_compare_irq, mips_timer_dispatch);
-               mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
-       }
-
-       return mips_cpu_timer_irq;
-}
-
-void __init plat_time_init(void)
-{
-       unsigned int est_freq;
-
-        /* Set Data mode - binary. */
-        CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL);
-
-       est_freq = estimate_cpu_frequency();
-
-       printk("CPU frequency %d.%02d MHz\n", est_freq/1000000,
-              (est_freq%1000000)*100/1000000);
-
-        cpu_khz = est_freq / 1000;
-
-       mips_scroll_message();
-#ifdef CONFIG_I8253            /* Only Malta has a PIT */
-       setup_pit_timer();
-#endif
-
-       plat_perf_setup();
-}
diff --git a/arch/mips/mips-boards/malta/Makefile b/arch/mips/mips-boards/malta/Makefile
deleted file mode 100644 (file)
index db4ad65..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# Carsten Langgaard, carstenl@mips.com
-# Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
-#
-# This program is free software; you can distribute it and/or modify it
-# under the terms of the GNU General Public License (Version 2) as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
-#
-# Makefile for the MIPS Malta specific kernel interface routines
-# under Linux.
-#
-
-obj-y := malta_int.o malta_mtd.o malta_platform.o malta_setup.o
-
-# FIXME FIXME FIXME
-obj-$(CONFIG_MIPS_MT_SMTC) += malta_smtc.o
-
-EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/mips-boards/malta/malta_int.c b/arch/mips/mips-boards/malta/malta_int.c
deleted file mode 100644 (file)
index ea17611..0000000
+++ /dev/null
@@ -1,712 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 2000, 2001, 2004 MIPS Technologies, Inc.
- * Copyright (C) 2001 Ralf Baechle
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Routines for generic manipulation of the interrupts found on the MIPS
- * Malta board.
- * The interrupt controller is located in the South Bridge a PIIX4 device
- * with two internal 82C95 interrupt controllers.
- */
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/io.h>
-#include <linux/kernel_stat.h>
-#include <linux/kernel.h>
-#include <linux/random.h>
-
-#include <asm/traps.h>
-#include <asm/i8259.h>
-#include <asm/irq_cpu.h>
-#include <asm/irq_regs.h>
-#include <asm/mips-boards/malta.h>
-#include <asm/mips-boards/maltaint.h>
-#include <asm/mips-boards/piix4.h>
-#include <asm/gt64120.h>
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/msc01_pci.h>
-#include <asm/msc01_ic.h>
-#include <asm/gic.h>
-#include <asm/gcmpregs.h>
-
-int gcmp_present = -1;
-int gic_present;
-static unsigned long _msc01_biu_base;
-static unsigned long _gcmp_base;
-static unsigned int ipi_map[NR_CPUS];
-
-static DEFINE_SPINLOCK(mips_irq_lock);
-
-static inline int mips_pcibios_iack(void)
-{
-       int irq;
-       u32 dummy;
-
-       /*
-        * Determine highest priority pending interrupt by performing
-        * a PCI Interrupt Acknowledge cycle.
-        */
-       switch (mips_revision_sconid) {
-       case MIPS_REVISION_SCON_SOCIT:
-       case MIPS_REVISION_SCON_ROCIT:
-       case MIPS_REVISION_SCON_SOCITSC:
-       case MIPS_REVISION_SCON_SOCITSCP:
-               MSC_READ(MSC01_PCI_IACK, irq);
-               irq &= 0xff;
-               break;
-       case MIPS_REVISION_SCON_GT64120:
-               irq = GT_READ(GT_PCI0_IACK_OFS);
-               irq &= 0xff;
-               break;
-       case MIPS_REVISION_SCON_BONITO:
-               /* The following will generate a PCI IACK cycle on the
-                * Bonito controller. It's a little bit kludgy, but it
-                * was the easiest way to implement it in hardware at
-                * the given time.
-                */
-               BONITO_PCIMAP_CFG = 0x20000;
-
-               /* Flush Bonito register block */
-               dummy = BONITO_PCIMAP_CFG;
-               iob();    /* sync */
-
-               irq = readl((u32 *)_pcictrl_bonito_pcicfg);
-               iob();    /* sync */
-               irq &= 0xff;
-               BONITO_PCIMAP_CFG = 0;
-               break;
-       default:
-               printk(KERN_WARNING "Unknown system controller.\n");
-               return -1;
-       }
-       return irq;
-}
-
-static inline int get_int(void)
-{
-       unsigned long flags;
-       int irq;
-       spin_lock_irqsave(&mips_irq_lock, flags);
-
-       irq = mips_pcibios_iack();
-
-       /*
-        * The only way we can decide if an interrupt is spurious
-        * is by checking the 8259 registers.  This needs a spinlock
-        * on an SMP system,  so leave it up to the generic code...
-        */
-
-       spin_unlock_irqrestore(&mips_irq_lock, flags);
-
-       return irq;
-}
-
-static void malta_hw0_irqdispatch(void)
-{
-       int irq;
-
-       irq = get_int();
-       if (irq < 0) {
-               /* interrupt has already been cleared */
-               return;
-       }
-
-       do_IRQ(MALTA_INT_BASE + irq);
-}
-
-static void malta_ipi_irqdispatch(void)
-{
-       int irq;
-
-       irq = gic_get_int();
-       if (irq < 0)
-               return;  /* interrupt has already been cleared */
-
-       do_IRQ(MIPS_GIC_IRQ_BASE + irq);
-}
-
-static void corehi_irqdispatch(void)
-{
-       unsigned int intedge, intsteer, pcicmd, pcibadaddr;
-       unsigned int pcimstat, intisr, inten, intpol;
-       unsigned int intrcause, datalo, datahi;
-       struct pt_regs *regs = get_irq_regs();
-
-       printk(KERN_EMERG "CoreHI interrupt, shouldn't happen, we die here!\n");
-       printk(KERN_EMERG "epc   : %08lx\nStatus: %08lx\n"
-                       "Cause : %08lx\nbadVaddr : %08lx\n",
-                       regs->cp0_epc, regs->cp0_status,
-                       regs->cp0_cause, regs->cp0_badvaddr);
-
-       /* Read all the registers and then print them as there is a
-          problem with interspersed printk's upsetting the Bonito controller.
-          Do it for the others too.
-       */
-
-       switch (mips_revision_sconid) {
-       case MIPS_REVISION_SCON_SOCIT:
-       case MIPS_REVISION_SCON_ROCIT:
-       case MIPS_REVISION_SCON_SOCITSC:
-       case MIPS_REVISION_SCON_SOCITSCP:
-               ll_msc_irq();
-               break;
-       case MIPS_REVISION_SCON_GT64120:
-               intrcause = GT_READ(GT_INTRCAUSE_OFS);
-               datalo = GT_READ(GT_CPUERR_ADDRLO_OFS);
-               datahi = GT_READ(GT_CPUERR_ADDRHI_OFS);
-               printk(KERN_EMERG "GT_INTRCAUSE = %08x\n", intrcause);
-               printk(KERN_EMERG "GT_CPUERR_ADDR = %02x%08x\n",
-                               datahi, datalo);
-               break;
-       case MIPS_REVISION_SCON_BONITO:
-               pcibadaddr = BONITO_PCIBADADDR;
-               pcimstat = BONITO_PCIMSTAT;
-               intisr = BONITO_INTISR;
-               inten = BONITO_INTEN;
-               intpol = BONITO_INTPOL;
-               intedge = BONITO_INTEDGE;
-               intsteer = BONITO_INTSTEER;
-               pcicmd = BONITO_PCICMD;
-               printk(KERN_EMERG "BONITO_INTISR = %08x\n", intisr);
-               printk(KERN_EMERG "BONITO_INTEN = %08x\n", inten);
-               printk(KERN_EMERG "BONITO_INTPOL = %08x\n", intpol);
-               printk(KERN_EMERG "BONITO_INTEDGE = %08x\n", intedge);
-               printk(KERN_EMERG "BONITO_INTSTEER = %08x\n", intsteer);
-               printk(KERN_EMERG "BONITO_PCICMD = %08x\n", pcicmd);
-               printk(KERN_EMERG "BONITO_PCIBADADDR = %08x\n", pcibadaddr);
-               printk(KERN_EMERG "BONITO_PCIMSTAT = %08x\n", pcimstat);
-               break;
-       }
-
-       die("CoreHi interrupt", regs);
-}
-
-static inline int clz(unsigned long x)
-{
-       __asm__(
-       "       .set    push                                    \n"
-       "       .set    mips32                                  \n"
-       "       clz     %0, %1                                  \n"
-       "       .set    pop                                     \n"
-       : "=r" (x)
-       : "r" (x));
-
-       return x;
-}
-
-/*
- * Version of ffs that only looks at bits 12..15.
- */
-static inline unsigned int irq_ffs(unsigned int pending)
-{
-#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
-       return -clz(pending) + 31 - CAUSEB_IP;
-#else
-       unsigned int a0 = 7;
-       unsigned int t0;
-
-       t0 = pending & 0xf000;
-       t0 = t0 < 1;
-       t0 = t0 << 2;
-       a0 = a0 - t0;
-       pending = pending << t0;
-
-       t0 = pending & 0xc000;
-       t0 = t0 < 1;
-       t0 = t0 << 1;
-       a0 = a0 - t0;
-       pending = pending << t0;
-
-       t0 = pending & 0x8000;
-       t0 = t0 < 1;
-       /* t0 = t0 << 2; */
-       a0 = a0 - t0;
-       /* pending = pending << t0; */
-
-       return a0;
-#endif
-}
-
-/*
- * IRQs on the Malta board look basically (barring software IRQs which we
- * don't use at all and all external interrupt sources are combined together
- * on hardware interrupt 0 (MIPS IRQ 2)) like:
- *
- *     MIPS IRQ        Source
- *      --------        ------
- *             0       Software (ignored)
- *             1        Software (ignored)
- *             2        Combined hardware interrupt (hw0)
- *             3        Hardware (ignored)
- *             4        Hardware (ignored)
- *             5        Hardware (ignored)
- *             6        Hardware (ignored)
- *             7        R4k timer (what we use)
- *
- * We handle the IRQ according to _our_ priority which is:
- *
- * Highest ----     R4k Timer
- * Lowest  ----     Combined hardware interrupt
- *
- * then we just return, if multiple IRQs are pending then we will just take
- * another exception, big deal.
- */
-
-asmlinkage void plat_irq_dispatch(void)
-{
-       unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
-       int irq;
-
-       irq = irq_ffs(pending);
-
-       if (irq == MIPSCPU_INT_I8259A)
-               malta_hw0_irqdispatch();
-       else if (gic_present && ((1 << irq) & ipi_map[smp_processor_id()]))
-               malta_ipi_irqdispatch();
-       else if (irq >= 0)
-               do_IRQ(MIPS_CPU_IRQ_BASE + irq);
-       else
-               spurious_interrupt();
-}
-
-#ifdef CONFIG_MIPS_MT_SMP
-
-
-#define GIC_MIPS_CPU_IPI_RESCHED_IRQ   3
-#define GIC_MIPS_CPU_IPI_CALL_IRQ      4
-
-#define MIPS_CPU_IPI_RESCHED_IRQ 0     /* SW int 0 for resched */
-#define C_RESCHED C_SW0
-#define MIPS_CPU_IPI_CALL_IRQ 1                /* SW int 1 for resched */
-#define C_CALL C_SW1
-static int cpu_ipi_resched_irq, cpu_ipi_call_irq;
-
-static void ipi_resched_dispatch(void)
-{
-       do_IRQ(MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ);
-}
-
-static void ipi_call_dispatch(void)
-{
-       do_IRQ(MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ);
-}
-
-static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
-{
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
-{
-       smp_call_function_interrupt();
-
-       return IRQ_HANDLED;
-}
-
-static struct irqaction irq_resched = {
-       .handler        = ipi_resched_interrupt,
-       .flags          = IRQF_DISABLED|IRQF_PERCPU,
-       .name           = "IPI_resched"
-};
-
-static struct irqaction irq_call = {
-       .handler        = ipi_call_interrupt,
-       .flags          = IRQF_DISABLED|IRQF_PERCPU,
-       .name           = "IPI_call"
-};
-#endif /* CONFIG_MIPS_MT_SMP */
-
-static struct irqaction i8259irq = {
-       .handler = no_action,
-       .name = "XT-PIC cascade"
-};
-
-static struct irqaction corehi_irqaction = {
-       .handler = no_action,
-       .name = "CoreHi"
-};
-
-static msc_irqmap_t __initdata msc_irqmap[] = {
-       {MSC01C_INT_TMR,                MSC01_IRQ_EDGE, 0},
-       {MSC01C_INT_PCI,                MSC01_IRQ_LEVEL, 0},
-};
-static int __initdata msc_nr_irqs = ARRAY_SIZE(msc_irqmap);
-
-static msc_irqmap_t __initdata msc_eicirqmap[] = {
-       {MSC01E_INT_SW0,                MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_SW1,                MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_I8259A,             MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_SMI,                MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_COREHI,             MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_CORELO,             MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_TMR,                MSC01_IRQ_EDGE, 0},
-       {MSC01E_INT_PCI,                MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_PERFCTR,            MSC01_IRQ_LEVEL, 0},
-       {MSC01E_INT_CPUCTR,             MSC01_IRQ_LEVEL, 0}
-};
-
-static int __initdata msc_nr_eicirqs = ARRAY_SIZE(msc_eicirqmap);
-
-#if defined(CONFIG_MIPS_MT_SMP)
-/*
- * This GIC specific tabular array defines the association between External
- * Interrupts and CPUs/Core Interrupts. The nature of the External
- * Interrupts is also defined here - polarity/trigger.
- */
-static struct gic_intr_map gic_intr_map[] = {
-       { GIC_EXT_INTR(0),      X,      X,              X,              X,              0 },
-       { GIC_EXT_INTR(1),      X,      X,              X,              X,              0 },
-       { GIC_EXT_INTR(2),      X,      X,              X,              X,              0 },
-       { GIC_EXT_INTR(3),      0,      GIC_CPU_INT0,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(4),      0,      GIC_CPU_INT1,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(5),      0,      GIC_CPU_INT2,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(6),      0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(7),      0,      GIC_CPU_INT4,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(8),      0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(9),      0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(10),     X,      X,              X,              X,              0 },
-       { GIC_EXT_INTR(11),     X,      X,              X,              X,              0 },
-       { GIC_EXT_INTR(12),     0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
-       { GIC_EXT_INTR(13),     0,      GIC_MAP_TO_NMI_MSK,     GIC_POL_POS, GIC_TRIG_LEVEL,    0 },
-       { GIC_EXT_INTR(14),     0,      GIC_MAP_TO_NMI_MSK,     GIC_POL_POS, GIC_TRIG_LEVEL,    0 },
-       { GIC_EXT_INTR(15),     X,      X,              X,              X,              0 },
-       { GIC_EXT_INTR(16),     0,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(17),     0,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(18),     1,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(19),     1,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(20),     2,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(21),     2,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(22),     3,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-       { GIC_EXT_INTR(23),     3,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
-};
-#endif
-
-/*
- * GCMP needs to be detected before any SMP initialisation
- */
-static int __init gcmp_probe(unsigned long addr, unsigned long size)
-{
-       if (gcmp_present >= 0)
-               return gcmp_present;
-
-       _gcmp_base = (unsigned long) ioremap_nocache(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ);
-       _msc01_biu_base = (unsigned long) ioremap_nocache(MSC01_BIU_REG_BASE, MSC01_BIU_ADDRSPACE_SZ);
-       gcmp_present = (GCMPGCB(GCMPB) & GCMP_GCB_GCMPB_GCMPBASE_MSK) == GCMP_BASE_ADDR;
-
-       if (gcmp_present)
-               printk(KERN_DEBUG "GCMP present\n");
-       return gcmp_present;
-}
-
-#if defined(CONFIG_MIPS_MT_SMP)
-static void __init fill_ipi_map(void)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(gic_intr_map); i++) {
-               if (gic_intr_map[i].ipiflag && (gic_intr_map[i].cpunum != X))
-                       ipi_map[gic_intr_map[i].cpunum] |=
-                               (1 << (gic_intr_map[i].pin + 2));
-       }
-}
-#endif
-
-void __init arch_init_irq(void)
-{
-       int gic_present, gcmp_present;
-
-       init_i8259_irqs();
-
-       if (!cpu_has_veic)
-               mips_cpu_irq_init();
-
-       gcmp_present = gcmp_probe(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ);
-       if (gcmp_present)  {
-               GCMPGCB(GICBA) = GIC_BASE_ADDR | GCMP_GCB_GICBA_EN_MSK;
-               gic_present = 1;
-       } else {
-               _msc01_biu_base = (unsigned long) ioremap_nocache(MSC01_BIU_REG_BASE, MSC01_BIU_ADDRSPACE_SZ);
-               gic_present = (REG(_msc01_biu_base, MSC01_SC_CFG) &
-               MSC01_SC_CFG_GICPRES_MSK) >> MSC01_SC_CFG_GICPRES_SHF;
-       }
-       if (gic_present)
-               printk(KERN_DEBUG "GIC present\n");
-
-       switch (mips_revision_sconid) {
-       case MIPS_REVISION_SCON_SOCIT:
-       case MIPS_REVISION_SCON_ROCIT:
-               if (cpu_has_veic)
-                       init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
-                                       MSC01E_INT_BASE, msc_eicirqmap,
-                                       msc_nr_eicirqs);
-               else
-                       init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
-                                       MSC01C_INT_BASE, msc_irqmap,
-                                       msc_nr_irqs);
-               break;
-
-       case MIPS_REVISION_SCON_SOCITSC:
-       case MIPS_REVISION_SCON_SOCITSCP:
-               if (cpu_has_veic)
-                       init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
-                                       MSC01E_INT_BASE, msc_eicirqmap,
-                                       msc_nr_eicirqs);
-               else
-                       init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
-                                       MSC01C_INT_BASE, msc_irqmap,
-                                       msc_nr_irqs);
-       }
-
-       if (cpu_has_veic) {
-               set_vi_handler(MSC01E_INT_I8259A, malta_hw0_irqdispatch);
-               set_vi_handler(MSC01E_INT_COREHI, corehi_irqdispatch);
-               setup_irq(MSC01E_INT_BASE+MSC01E_INT_I8259A, &i8259irq);
-               setup_irq(MSC01E_INT_BASE+MSC01E_INT_COREHI, &corehi_irqaction);
-       } else if (cpu_has_vint) {
-               set_vi_handler(MIPSCPU_INT_I8259A, malta_hw0_irqdispatch);
-               set_vi_handler(MIPSCPU_INT_COREHI, corehi_irqdispatch);
-#ifdef CONFIG_MIPS_MT_SMTC
-               setup_irq_smtc(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq,
-                       (0x100 << MIPSCPU_INT_I8259A));
-               setup_irq_smtc(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI,
-                       &corehi_irqaction, (0x100 << MIPSCPU_INT_COREHI));
-               /*
-                * Temporary hack to ensure that the subsidiary device
-                * interrupts coing in via the i8259A, but associated
-                * with low IRQ numbers, will restore the Status.IM
-                * value associated with the i8259A.
-                */
-               {
-                       int i;
-
-                       for (i = 0; i < 16; i++)
-                               irq_hwmask[i] = (0x100 << MIPSCPU_INT_I8259A);
-               }
-#else /* Not SMTC */
-               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq);
-               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI,
-                                               &corehi_irqaction);
-#endif /* CONFIG_MIPS_MT_SMTC */
-       } else {
-               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq);
-               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI,
-                                               &corehi_irqaction);
-       }
-
-#if defined(CONFIG_MIPS_MT_SMP)
-       if (gic_present) {
-               /* FIXME */
-               int i;
-               struct {
-                       unsigned int resched;
-                       unsigned int call;
-               } ipiirq[] = {
-                       {
-                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE0,
-                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE0},
-                       {
-                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE1,
-                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE1
-                       }, {
-                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE2,
-                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE2
-                       }, {
-                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE3,
-                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE3
-                       }
-               };
-               fill_ipi_map();
-               gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map, ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE);
-               if (!gcmp_present) {
-                       /* Enable the GIC */
-                       i = REG(_msc01_biu_base, MSC01_SC_CFG);
-                       REG(_msc01_biu_base, MSC01_SC_CFG) =
-                               (i | (0x1 << MSC01_SC_CFG_GICENA_SHF));
-                       pr_debug("GIC Enabled\n");
-               }
-
-               /* set up ipi interrupts */
-               if (cpu_has_vint) {
-                       set_vi_handler(MIPSCPU_INT_IPI0, malta_ipi_irqdispatch);
-                       set_vi_handler(MIPSCPU_INT_IPI1, malta_ipi_irqdispatch);
-               }
-               /* Argh.. this really needs sorting out.. */
-               printk("CPU%d: status register was %08x\n", smp_processor_id(), read_c0_status());
-               write_c0_status(read_c0_status() | STATUSF_IP3 | STATUSF_IP4);
-               printk("CPU%d: status register now %08x\n", smp_processor_id(), read_c0_status());
-               write_c0_status(0x1100dc00);
-               printk("CPU%d: status register frc %08x\n", smp_processor_id(), read_c0_status());
-               for (i = 0; i < ARRAY_SIZE(ipiirq); i++) {
-                       setup_irq(MIPS_GIC_IRQ_BASE + ipiirq[i].resched, &irq_resched);
-                       setup_irq(MIPS_GIC_IRQ_BASE + ipiirq[i].call, &irq_call);
-
-                       set_irq_handler(MIPS_GIC_IRQ_BASE + ipiirq[i].resched, handle_percpu_irq);
-                       set_irq_handler(MIPS_GIC_IRQ_BASE + ipiirq[i].call, handle_percpu_irq);
-               }
-       } else {
-               /* set up ipi interrupts */
-               if (cpu_has_veic) {
-                       set_vi_handler (MSC01E_INT_SW0, ipi_resched_dispatch);
-                       set_vi_handler (MSC01E_INT_SW1, ipi_call_dispatch);
-                       cpu_ipi_resched_irq = MSC01E_INT_SW0;
-                       cpu_ipi_call_irq = MSC01E_INT_SW1;
-               } else {
-                       if (cpu_has_vint) {
-                               set_vi_handler (MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch);
-                               set_vi_handler (MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch);
-                       }
-                       cpu_ipi_resched_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ;
-                       cpu_ipi_call_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ;
-               }
-
-               setup_irq(cpu_ipi_resched_irq, &irq_resched);
-               setup_irq(cpu_ipi_call_irq, &irq_call);
-
-               set_irq_handler(cpu_ipi_resched_irq, handle_percpu_irq);
-               set_irq_handler(cpu_ipi_call_irq, handle_percpu_irq);
-       }
-#endif
-}
-
-void malta_be_init(void)
-{
-       if (gcmp_present) {
-               /* Could change CM error mask register */
-       }
-}
-
-
-static char *tr[8] = {
-       "mem",  "gcr",  "gic",  "mmio",
-       "0x04", "0x05", "0x06", "0x07"
-};
-
-static char *mcmd[32] = {
-       [0x00] = "0x00",
-       [0x01] = "Legacy Write",
-       [0x02] = "Legacy Read",
-       [0x03] = "0x03",
-       [0x04] = "0x04",
-       [0x05] = "0x05",
-       [0x06] = "0x06",
-       [0x07] = "0x07",
-       [0x08] = "Coherent Read Own",
-       [0x09] = "Coherent Read Share",
-       [0x0a] = "Coherent Read Discard",
-       [0x0b] = "Coherent Ready Share Always",
-       [0x0c] = "Coherent Upgrade",
-       [0x0d] = "Coherent Writeback",
-       [0x0e] = "0x0e",
-       [0x0f] = "0x0f",
-       [0x10] = "Coherent Copyback",
-       [0x11] = "Coherent Copyback Invalidate",
-       [0x12] = "Coherent Invalidate",
-       [0x13] = "Coherent Write Invalidate",
-       [0x14] = "Coherent Completion Sync",
-       [0x15] = "0x15",
-       [0x16] = "0x16",
-       [0x17] = "0x17",
-       [0x18] = "0x18",
-       [0x19] = "0x19",
-       [0x1a] = "0x1a",
-       [0x1b] = "0x1b",
-       [0x1c] = "0x1c",
-       [0x1d] = "0x1d",
-       [0x1e] = "0x1e",
-       [0x1f] = "0x1f"
-};
-
-static char *core[8] = {
-       "Invalid/OK",   "Invalid/Data",
-       "Shared/OK",    "Shared/Data",
-       "Modified/OK",  "Modified/Data",
-       "Exclusive/OK", "Exclusive/Data"
-};
-
-static char *causes[32] = {
-       "None", "GC_WR_ERR", "GC_RD_ERR", "COH_WR_ERR",
-       "COH_RD_ERR", "MMIO_WR_ERR", "MMIO_RD_ERR", "0x07",
-       "0x08", "0x09", "0x0a", "0x0b",
-       "0x0c", "0x0d", "0x0e", "0x0f",
-       "0x10", "0x11", "0x12", "0x13",
-       "0x14", "0x15", "0x16", "INTVN_WR_ERR",
-       "INTVN_RD_ERR", "0x19", "0x1a", "0x1b",
-       "0x1c", "0x1d", "0x1e", "0x1f"
-};
-
-int malta_be_handler(struct pt_regs *regs, int is_fixup)
-{
-       /* This duplicates the handling in do_be which seems wrong */
-       int retval = is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL;
-
-       if (gcmp_present) {
-               unsigned long cm_error = GCMPGCB(GCMEC);
-               unsigned long cm_addr = GCMPGCB(GCMEA);
-               unsigned long cm_other = GCMPGCB(GCMEO);
-               unsigned long cause, ocause;
-               char buf[256];
-
-               cause = (cm_error & GCMP_GCB_GMEC_ERROR_TYPE_MSK);
-               if (cause != 0) {
-                       cause >>= GCMP_GCB_GMEC_ERROR_TYPE_SHF;
-                       if (cause < 16) {
-                               unsigned long cca_bits = (cm_error >> 15) & 7;
-                               unsigned long tr_bits = (cm_error >> 12) & 7;
-                               unsigned long mcmd_bits = (cm_error >> 7) & 0x1f;
-                               unsigned long stag_bits = (cm_error >> 3) & 15;
-                               unsigned long sport_bits = (cm_error >> 0) & 7;
-
-                               snprintf(buf, sizeof(buf),
-                                        "CCA=%lu TR=%s MCmd=%s STag=%lu "
-                                        "SPort=%lu\n",
-                                        cca_bits, tr[tr_bits], mcmd[mcmd_bits],
-                                        stag_bits, sport_bits);
-                       } else {
-                               /* glob state & sresp together */
-                               unsigned long c3_bits = (cm_error >> 18) & 7;
-                               unsigned long c2_bits = (cm_error >> 15) & 7;
-                               unsigned long c1_bits = (cm_error >> 12) & 7;
-                               unsigned long c0_bits = (cm_error >> 9) & 7;
-                               unsigned long sc_bit = (cm_error >> 8) & 1;
-                               unsigned long mcmd_bits = (cm_error >> 3) & 0x1f;
-                               unsigned long sport_bits = (cm_error >> 0) & 7;
-                               snprintf(buf, sizeof(buf),
-                                        "C3=%s C2=%s C1=%s C0=%s SC=%s "
-                                        "MCmd=%s SPort=%lu\n",
-                                        core[c3_bits], core[c2_bits],
-                                        core[c1_bits], core[c0_bits],
-                                        sc_bit ? "True" : "False",
-                                        mcmd[mcmd_bits], sport_bits);
-                       }
-
-                       ocause = (cm_other & GCMP_GCB_GMEO_ERROR_2ND_MSK) >>
-                                GCMP_GCB_GMEO_ERROR_2ND_SHF;
-
-                       printk("CM_ERROR=%08lx %s <%s>\n", cm_error,
-                              causes[cause], buf);
-                       printk("CM_ADDR =%08lx\n", cm_addr);
-                       printk("CM_OTHER=%08lx %s\n", cm_other, causes[ocause]);
-
-                       /* reprime cause register */
-                       GCMPGCB(GCMEC) = 0;
-               }
-       }
-
-       return retval;
-}
diff --git a/arch/mips/mips-boards/malta/malta_mtd.c b/arch/mips/mips-boards/malta/malta_mtd.c
deleted file mode 100644 (file)
index 8ad9bdf..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2006 MIPS Technologies, Inc.
- *     written by Ralf Baechle <ralf@linux-mips.org>
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/partitions.h>
-#include <linux/mtd/physmap.h>
-#include <mtd/mtd-abi.h>
-
-static struct mtd_partition malta_mtd_partitions[] = {
-       {
-               .name =         "YAMON",
-               .offset =       0x0,
-               .size =         0x100000,
-               .mask_flags =   MTD_WRITEABLE
-       }, {
-               .name =         "User FS",
-               .offset =       0x100000,
-               .size =         0x2e0000
-       }, {
-               .name =         "Board Config",
-               .offset =       0x3e0000,
-               .size =         0x020000,
-               .mask_flags =   MTD_WRITEABLE
-       }
-};
-
-static struct physmap_flash_data malta_flash_data = {
-       .width          = 4,
-       .nr_parts       = ARRAY_SIZE(malta_mtd_partitions),
-       .parts          = malta_mtd_partitions
-};
-
-static struct resource malta_flash_resource = {
-       .start          = 0x1e000000,
-       .end            = 0x1e3fffff,
-       .flags          = IORESOURCE_MEM
-};
-
-static struct platform_device malta_flash = {
-       .name           = "physmap-flash",
-       .id             = 0,
-       .dev            = {
-               .platform_data  = &malta_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &malta_flash_resource,
-};
-
-static int __init malta_mtd_init(void)
-{
-       platform_device_register(&malta_flash);
-
-       return 0;
-}
-
-module_init(malta_mtd_init)
diff --git a/arch/mips/mips-boards/malta/malta_platform.c b/arch/mips/mips-boards/malta/malta_platform.c
deleted file mode 100644 (file)
index 83b9bab..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2007 MIPS Technologies, Inc.
- *   written by Ralf Baechle (ralf@linux-mips.org)
- *
- * Probe driver for the Malta's UART ports:
- *
- *   o 2 ports in the SMC SuperIO
- *   o 1 port in the CBUS UART, a discrete 16550 which normally is only used
- *     for bringups.
- *
- * We don't use 8250_platform.c on Malta as it would result in the CBUS
- * UART becoming ttyS0.
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/serial_8250.h>
-
-#define SMC_PORT(base, int)                                            \
-{                                                                      \
-       .iobase         = base,                                         \
-       .irq            = int,                                          \
-       .uartclk        = 1843200,                                      \
-       .iotype         = UPIO_PORT,                                    \
-       .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,            \
-       .regshift       = 0,                                            \
-}
-
-#define CBUS_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP)
-
-static struct plat_serial8250_port uart8250_data[] = {
-       SMC_PORT(0x3F8, 4),
-       SMC_PORT(0x2F8, 3),
-       {
-               .mapbase        = 0x1f000900,   /* The CBUS UART */
-               .irq            = MIPS_CPU_IRQ_BASE + 2,
-               .uartclk        = 3686400,      /* Twice the usual clk! */
-               .iotype         = UPIO_MEM32,
-               .flags          = CBUS_UART_FLAGS,
-               .regshift       = 3,
-       },
-       { },
-};
-
-static struct platform_device uart8250_device = {
-       .name                   = "serial8250",
-       .id                     = PLAT8250_DEV_PLATFORM2,
-       .dev                    = {
-               .platform_data  = uart8250_data,
-       },
-};
-
-static int __init uart8250_init(void)
-{
-       return platform_device_register(&uart8250_device);
-}
-
-module_init(uart8250_init);
-
-MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>");
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("8250 UART probe driver for the Malta CBUS UART");
diff --git a/arch/mips/mips-boards/malta/malta_setup.c b/arch/mips/mips-boards/malta/malta_setup.c
deleted file mode 100644 (file)
index e7cad54..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
- * Copyright (C) 2008 Dmitri Vorobiev
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- */
-#include <linux/cpu.h>
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/irq.h>
-#include <linux/pci.h>
-#include <linux/screen_info.h>
-#include <linux/time.h>
-
-#include <asm/bootinfo.h>
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/prom.h>
-#include <asm/mips-boards/malta.h>
-#include <asm/mips-boards/maltaint.h>
-#include <asm/dma.h>
-#include <asm/traps.h>
-#ifdef CONFIG_VT
-#include <linux/console.h>
-#endif
-
-extern void malta_be_init(void);
-extern int malta_be_handler(struct pt_regs *regs, int is_fixup);
-
-static struct resource standard_io_resources[] = {
-       {
-               .name = "dma1",
-               .start = 0x00,
-               .end = 0x1f,
-               .flags = IORESOURCE_BUSY
-       },
-       {
-               .name = "timer",
-               .start = 0x40,
-               .end = 0x5f,
-               .flags = IORESOURCE_BUSY
-       },
-       {
-               .name = "keyboard",
-               .start = 0x60,
-               .end = 0x6f,
-               .flags = IORESOURCE_BUSY
-       },
-       {
-               .name = "dma page reg",
-               .start = 0x80,
-               .end = 0x8f,
-               .flags = IORESOURCE_BUSY
-       },
-       {
-               .name = "dma2",
-               .start = 0xc0,
-               .end = 0xdf,
-               .flags = IORESOURCE_BUSY
-       },
-};
-
-const char *get_system_type(void)
-{
-       return "MIPS Malta";
-}
-
-#if defined(CONFIG_MIPS_MT_SMTC)
-const char display_string[] = "       SMTC LINUX ON MALTA       ";
-#else
-const char display_string[] = "        LINUX ON MALTA       ";
-#endif /* CONFIG_MIPS_MT_SMTC */
-
-#ifdef CONFIG_BLK_DEV_FD
-static void __init fd_activate(void)
-{
-       /*
-        * Activate Floppy Controller in the SMSC FDC37M817 Super I/O
-        * Controller.
-        * Done by YAMON 2.00 onwards
-        */
-       /* Entering config state. */
-       SMSC_WRITE(SMSC_CONFIG_ENTER, SMSC_CONFIG_REG);
-
-       /* Activate floppy controller. */
-       SMSC_WRITE(SMSC_CONFIG_DEVNUM, SMSC_CONFIG_REG);
-       SMSC_WRITE(SMSC_CONFIG_DEVNUM_FLOPPY, SMSC_DATA_REG);
-       SMSC_WRITE(SMSC_CONFIG_ACTIVATE, SMSC_CONFIG_REG);
-       SMSC_WRITE(SMSC_CONFIG_ACTIVATE_ENABLE, SMSC_DATA_REG);
-
-       /* Exit config state. */
-       SMSC_WRITE(SMSC_CONFIG_EXIT, SMSC_CONFIG_REG);
-}
-#endif
-
-#ifdef CONFIG_BLK_DEV_IDE
-static void __init pci_clock_check(void)
-{
-       unsigned int __iomem *jmpr_p =
-               (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
-       int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07;
-       static const int pciclocks[] __initdata = {
-               33, 20, 25, 30, 12, 16, 37, 10
-       };
-       int pciclock = pciclocks[jmpr];
-       char *argptr = prom_getcmdline();
-
-       if (pciclock != 33 && !strstr(argptr, "idebus=")) {
-               printk(KERN_WARNING "WARNING: PCI clock is %dMHz, "
-                               "setting idebus\n", pciclock);
-               argptr += strlen(argptr);
-               sprintf(argptr, " idebus=%d", pciclock);
-               if (pciclock < 20 || pciclock > 66)
-                       printk(KERN_WARNING "WARNING: IDE timing "
-                                       "calculations will be incorrect\n");
-       }
-}
-#endif
-
-#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
-static void __init screen_info_setup(void)
-{
-       screen_info = (struct screen_info) {
-               .orig_x = 0,
-               .orig_y = 25,
-               .ext_mem_k = 0,
-               .orig_video_page = 0,
-               .orig_video_mode = 0,
-               .orig_video_cols = 80,
-               .unused2 = 0,
-               .orig_video_ega_bx = 0,
-               .unused3 = 0,
-               .orig_video_lines = 25,
-               .orig_video_isVGA = VIDEO_TYPE_VGAC,
-               .orig_video_points = 16
-       };
-}
-#endif
-
-static void __init bonito_quirks_setup(void)
-{
-       char *argptr;
-
-       argptr = prom_getcmdline();
-       if (strstr(argptr, "debug")) {
-               BONITO_BONGENCFG |= BONITO_BONGENCFG_DEBUGMODE;
-               printk(KERN_INFO "Enabled Bonito debug mode\n");
-       } else
-               BONITO_BONGENCFG &= ~BONITO_BONGENCFG_DEBUGMODE;
-
-#ifdef CONFIG_DMA_COHERENT
-       if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) {
-               BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN;
-               printk(KERN_INFO "Enabled Bonito CPU coherency\n");
-
-               argptr = prom_getcmdline();
-               if (strstr(argptr, "iobcuncached")) {
-                       BONITO_PCICACHECTRL &= ~BONITO_PCICACHECTRL_IOBCCOH_EN;
-                       BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG &
-                               ~(BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
-                                       BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
-                       printk(KERN_INFO "Disabled Bonito IOBC coherency\n");
-               } else {
-                       BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_IOBCCOH_EN;
-                       BONITO_PCIMEMBASECFG |=
-                               (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
-                                       BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
-                       printk(KERN_INFO "Enabled Bonito IOBC coherency\n");
-               }
-       } else
-               panic("Hardware DMA cache coherency not supported");
-#endif
-}
-
-void __init plat_mem_setup(void)
-{
-       unsigned int i;
-
-       mips_pcibios_init();
-
-       /* Request I/O space for devices used on the Malta board. */
-       for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++)
-               request_resource(&ioport_resource, standard_io_resources+i);
-
-       /*
-        * Enable DMA channel 4 (cascade channel) in the PIIX4 south bridge.
-        */
-       enable_dma(4);
-
-#ifdef CONFIG_KGDB
-       kgdb_config();
-#endif
-
-#ifdef CONFIG_DMA_COHERENT
-       if (mips_revision_sconid != MIPS_REVISION_SCON_BONITO)
-               panic("Hardware DMA cache coherency not supported");
-#endif
-
-       if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO)
-               bonito_quirks_setup();
-
-#ifdef CONFIG_BLK_DEV_IDE
-       pci_clock_check();
-#endif
-
-#ifdef CONFIG_BLK_DEV_FD
-       fd_activate();
-#endif
-
-#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
-       screen_info_setup();
-#endif
-       mips_reboot_setup();
-
-       board_be_init = malta_be_init;
-       board_be_handler = malta_be_handler;
-}
diff --git a/arch/mips/mips-boards/malta/malta_smtc.c b/arch/mips/mips-boards/malta/malta_smtc.c
deleted file mode 100644 (file)
index 5ea705e..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Malta Platform-specific hooks for SMP operation
- */
-#include <linux/irq.h>
-#include <linux/init.h>
-
-#include <asm/mipsregs.h>
-#include <asm/mipsmtregs.h>
-#include <asm/smtc.h>
-#include <asm/smtc_ipi.h>
-
-/* VPE/SMP Prototype implements platform interfaces directly */
-
-/*
- * Cause the specified action to be performed on a targeted "CPU"
- */
-
-static void msmtc_send_ipi_single(int cpu, unsigned int action)
-{
-       /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */
-       smtc_send_ipi(cpu, LINUX_SMP_IPI, action);
-}
-
-static void msmtc_send_ipi_mask(cpumask_t mask, unsigned int action)
-{
-       unsigned int i;
-
-       for_each_cpu_mask(i, mask)
-               msmtc_send_ipi_single(i, action);
-}
-
-/*
- * Post-config but pre-boot cleanup entry point
- */
-static void __cpuinit msmtc_init_secondary(void)
-{
-       void smtc_init_secondary(void);
-       int myvpe;
-
-       /* Don't enable Malta I/O interrupts (IP2) for secondary VPEs */
-       myvpe = read_c0_tcbind() & TCBIND_CURVPE;
-       if (myvpe != 0) {
-               /* Ideally, this should be done only once per VPE, but... */
-               clear_c0_status(ST0_IM);
-               set_c0_status((0x100 << cp0_compare_irq)
-                               | (0x100 << MIPS_CPU_IPI_IRQ));
-               if (cp0_perfcount_irq >= 0)
-                       set_c0_status(0x100 << cp0_perfcount_irq);
-       }
-
-       smtc_init_secondary();
-}
-
-/*
- * Platform "CPU" startup hook
- */
-static void __cpuinit msmtc_boot_secondary(int cpu, struct task_struct *idle)
-{
-       smtc_boot_secondary(cpu, idle);
-}
-
-/*
- * SMP initialization finalization entry point
- */
-static void __cpuinit msmtc_smp_finish(void)
-{
-       smtc_smp_finish();
-}
-
-/*
- * Hook for after all CPUs are online
- */
-
-static void msmtc_cpus_done(void)
-{
-}
-
-/*
- * Platform SMP pre-initialization
- *
- * As noted above, we can assume a single CPU for now
- * but it may be multithreaded.
- */
-
-static void __init msmtc_smp_setup(void)
-{
-       mipsmt_build_cpu_map(0);
-}
-
-static void __init msmtc_prepare_cpus(unsigned int max_cpus)
-{
-       mipsmt_prepare_cpus();
-}
-
-struct plat_smp_ops msmtc_smp_ops = {
-       .send_ipi_single        = msmtc_send_ipi_single,
-       .send_ipi_mask          = msmtc_send_ipi_mask,
-       .init_secondary         = msmtc_init_secondary,
-       .smp_finish             = msmtc_smp_finish,
-       .cpus_done              = msmtc_cpus_done,
-       .boot_secondary         = msmtc_boot_secondary,
-       .smp_setup              = msmtc_smp_setup,
-       .prepare_cpus           = msmtc_prepare_cpus,
-};
-
-#ifdef CONFIG_MIPS_MT_SMTC_IRQAFF
-/*
- * IRQ affinity hook
- */
-
-
-void plat_set_irq_affinity(unsigned int irq, cpumask_t affinity)
-{
-       cpumask_t tmask = affinity;
-       int cpu = 0;
-       void smtc_set_irq_affinity(unsigned int irq, cpumask_t aff);
-
-       /*
-        * On the legacy Malta development board, all I/O interrupts
-        * are routed through the 8259 and combined in a single signal
-        * to the CPU daughterboard, and on the CoreFPGA2/3 34K models,
-        * that signal is brought to IP2 of both VPEs. To avoid racing
-        * concurrent interrupt service events, IP2 is enabled only on
-        * one VPE, by convention VPE0.  So long as no bits are ever
-        * cleared in the affinity mask, there will never be any
-        * interrupt forwarding.  But as soon as a program or operator
-        * sets affinity for one of the related IRQs, we need to make
-        * sure that we don't ever try to forward across the VPE boundry,
-        * at least not until we engineer a system where the interrupt
-        * _ack() or _end() function can somehow know that it corresponds
-        * to an interrupt taken on another VPE, and perform the appropriate
-        * restoration of Status.IM state using MFTR/MTTR instead of the
-        * normal local behavior. We also ensure that no attempt will
-        * be made to forward to an offline "CPU".
-        */
-
-       for_each_cpu_mask(cpu, affinity) {
-               if ((cpu_data[cpu].vpe_id != 0) || !cpu_online(cpu))
-                       cpu_clear(cpu, tmask);
-       }
-       irq_desc[irq].affinity = tmask;
-
-       if (cpus_empty(tmask))
-               /*
-                * We could restore a default mask here, but the
-                * runtime code can anyway deal with the null set
-                */
-               printk(KERN_WARNING
-                       "IRQ affinity leaves no legal CPU for IRQ %d\n", irq);
-
-       /* Do any generic SMTC IRQ affinity setup */
-       smtc_set_irq_affinity(irq, tmask);
-}
-#endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */
diff --git a/arch/mips/mti-malta/Makefile b/arch/mips/mti-malta/Makefile
new file mode 100644 (file)
index 0000000..f806444
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# Carsten Langgaard, carstenl@mips.com
+# Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+#
+# Copyright (C) 2008 Wind River Systems, Inc.
+#   written by Ralf Baechle <ralf@linux-mips.org>
+#
+obj-y                          := malta-amon.o malta-cmdline.o \
+                                  malta-display.o malta-init.o malta-int.o \
+                                  malta-memory.o malta-mtd.o \
+                                  malta-platform.o malta-reset.o \
+                                  malta-setup.o malta-time.o
+
+obj-$(CONFIG_EARLY_PRINTK)     += malta-console.o
+obj-$(CONFIG_PCI)              += malta-pci.o
+obj-$(CONFIG_KGDB)             += malta-kgdb.o
+
+# FIXME FIXME FIXME
+obj-$(CONFIG_MIPS_MT_SMTC)     += malta_smtc.o
+
+EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/mti-malta/malta-amon.c b/arch/mips/mti-malta/malta-amon.c
new file mode 100644 (file)
index 0000000..96236bf
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2007  MIPS Technologies, Inc.
+ *     All rights reserved.
+
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Arbitrary Monitor interface
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+
+#include <asm-mips/addrspace.h>
+#include <asm-mips/mips-boards/launch.h>
+#include <asm-mips/mipsmtregs.h>
+
+int amon_cpu_avail(int cpu)
+{
+       struct cpulaunch *launch = (struct cpulaunch *)CKSEG0ADDR(CPULAUNCH);
+
+       if (cpu < 0 || cpu >= NCPULAUNCH) {
+               pr_debug("avail: cpu%d is out of range\n", cpu);
+               return 0;
+       }
+
+       launch += cpu;
+       if (!(launch->flags & LAUNCH_FREADY)) {
+               pr_debug("avail: cpu%d is not ready\n", cpu);
+               return 0;
+       }
+       if (launch->flags & (LAUNCH_FGO|LAUNCH_FGONE)) {
+               pr_debug("avail: too late.. cpu%d is already gone\n", cpu);
+               return 0;
+       }
+
+       return 1;
+}
+
+void amon_cpu_start(int cpu,
+                   unsigned long pc, unsigned long sp,
+                   unsigned long gp, unsigned long a0)
+{
+       volatile struct cpulaunch *launch =
+               (struct cpulaunch  *)CKSEG0ADDR(CPULAUNCH);
+
+       if (!amon_cpu_avail(cpu))
+               return;
+       if (cpu == smp_processor_id()) {
+               pr_debug("launch: I am cpu%d!\n", cpu);
+               return;
+       }
+       launch += cpu;
+
+       pr_debug("launch: starting cpu%d\n", cpu);
+
+       launch->pc = pc;
+       launch->gp = gp;
+       launch->sp = sp;
+       launch->a0 = a0;
+
+       /* Make sure target sees parameters before the go bit */
+       smp_mb();
+
+       launch->flags |= LAUNCH_FGO;
+       while ((launch->flags & LAUNCH_FGONE) == 0)
+               ;
+       pr_debug("launch: cpu%d gone!\n", cpu);
+}
diff --git a/arch/mips/mti-malta/malta-cmdline.c b/arch/mips/mti-malta/malta-cmdline.c
new file mode 100644 (file)
index 0000000..1871c30
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ * This program is free software; you can distribute it and/or modify it
+ * under the terms of the GNU General Public License (Version 2) as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Kernel command line creation using the prom monitor (YAMON) argc/argv.
+ */
+#include <linux/init.h>
+#include <linux/string.h>
+
+#include <asm/bootinfo.h>
+
+extern int prom_argc;
+extern int *_prom_argv;
+
+/*
+ * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
+ * This macro take care of sign extension.
+ */
+#define prom_argv(index) ((char *)(long)_prom_argv[(index)])
+
+char * __init prom_getcmdline(void)
+{
+       return &(arcs_cmdline[0]);
+}
+
+
+void  __init prom_init_cmdline(void)
+{
+       char *cp;
+       int actr;
+
+       actr = 1; /* Always ignore argv[0] */
+
+       cp = &(arcs_cmdline[0]);
+       while(actr < prom_argc) {
+               strcpy(cp, prom_argv(actr));
+               cp += strlen(prom_argv(actr));
+               *cp++ = ' ';
+               actr++;
+       }
+       if (cp != &(arcs_cmdline[0])) {
+               /* get rid of trailing space */
+               --cp;
+               *cp = '\0';
+       }
+}
diff --git a/arch/mips/mti-malta/malta-console.c b/arch/mips/mti-malta/malta-console.c
new file mode 100644 (file)
index 0000000..43bcfb4
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Putting things on the screen/serial line using YAMONs facilities.
+ */
+#include <linux/console.h>
+#include <linux/init.h>
+#include <linux/serial_reg.h>
+#include <asm/io.h>
+
+
+#define PORT(offset) (0x3f8 + (offset))
+
+
+static inline unsigned int serial_in(int offset)
+{
+       return inb(PORT(offset));
+}
+
+static inline void serial_out(int offset, int value)
+{
+       outb(value, PORT(offset));
+}
+
+int prom_putchar(char c)
+{
+       while ((serial_in(UART_LSR) & UART_LSR_THRE) == 0)
+               ;
+
+       serial_out(UART_TX, c);
+
+       return 1;
+}
diff --git a/arch/mips/mti-malta/malta-display.c b/arch/mips/mti-malta/malta-display.c
new file mode 100644 (file)
index 0000000..7c8828f
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Display routines for display messages in MIPS boards ascii display.
+ */
+
+#include <linux/compiler.h>
+#include <linux/timer.h>
+#include <asm/io.h>
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/prom.h>
+
+extern const char display_string[];
+static unsigned int display_count;
+static unsigned int max_display_count;
+
+void mips_display_message(const char *str)
+{
+       static unsigned int __iomem *display = NULL;
+       int i;
+
+       if (unlikely(display == NULL))
+               display = ioremap(ASCII_DISPLAY_POS_BASE, 16*sizeof(int));
+
+       for (i = 0; i <= 14; i=i+2) {
+                if (*str)
+                        __raw_writel(*str++, display + i);
+                else
+                        __raw_writel(' ', display + i);
+       }
+}
+
+static void scroll_display_message(unsigned long data);
+static DEFINE_TIMER(mips_scroll_timer, scroll_display_message, HZ, 0);
+
+static void scroll_display_message(unsigned long data)
+{
+       mips_display_message(&display_string[display_count++]);
+       if (display_count == max_display_count)
+               display_count = 0;
+
+       mod_timer(&mips_scroll_timer, jiffies + HZ);
+}
+
+void mips_scroll_message(void)
+{
+       del_timer_sync(&mips_scroll_timer);
+       max_display_count = strlen(display_string) + 1 - 8;
+       mod_timer(&mips_scroll_timer, jiffies + 1);
+}
diff --git a/arch/mips/mti-malta/malta-init.c b/arch/mips/mti-malta/malta-init.c
new file mode 100644 (file)
index 0000000..c065302
--- /dev/null
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 1999, 2000, 2004, 2005  MIPS Technologies, Inc.
+ *     All rights reserved.
+ *     Authors: Carsten Langgaard <carstenl@mips.com>
+ *              Maciej W. Rozycki <macro@mips.com>
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * PROM library initialisation code.
+ */
+#include <linux/init.h>
+#include <linux/string.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+#include <asm/gt64120.h>
+#include <asm/io.h>
+#include <asm/system.h>
+#include <asm/cacheflush.h>
+#include <asm/traps.h>
+
+#include <asm/mips-boards/prom.h>
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/bonito64.h>
+#include <asm/mips-boards/msc01_pci.h>
+
+#include <asm/mips-boards/malta.h>
+
+#ifdef CONFIG_KGDB
+extern int rs_kgdb_hook(int, int);
+extern int rs_putDebugChar(char);
+extern char rs_getDebugChar(void);
+extern int saa9730_kgdb_hook(int);
+extern int saa9730_putDebugChar(char);
+extern char saa9730_getDebugChar(void);
+#endif
+
+int prom_argc;
+int *_prom_argv, *_prom_envp;
+
+/*
+ * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer.
+ * This macro take care of sign extension, if running in 64-bit mode.
+ */
+#define prom_envp(index) ((char *)(long)_prom_envp[(index)])
+
+int init_debug = 0;
+
+int mips_revision_corid;
+int mips_revision_sconid;
+
+/* Bonito64 system controller register base. */
+unsigned long _pcictrl_bonito;
+unsigned long _pcictrl_bonito_pcicfg;
+
+/* GT64120 system controller register base */
+unsigned long _pcictrl_gt64120;
+
+/* MIPS System controller register base */
+unsigned long _pcictrl_msc;
+
+char *prom_getenv(char *envname)
+{
+       /*
+        * Return a pointer to the given environment variable.
+        * In 64-bit mode: we're using 64-bit pointers, but all pointers
+        * in the PROM structures are only 32-bit, so we need some
+        * workarounds, if we are running in 64-bit mode.
+        */
+       int i, index=0;
+
+       i = strlen(envname);
+
+       while (prom_envp(index)) {
+               if(strncmp(envname, prom_envp(index), i) == 0) {
+                       return(prom_envp(index+1));
+               }
+               index += 2;
+       }
+
+       return NULL;
+}
+
+static inline unsigned char str2hexnum(unsigned char c)
+{
+       if (c >= '0' && c <= '9')
+               return c - '0';
+       if (c >= 'a' && c <= 'f')
+               return c - 'a' + 10;
+       return 0; /* foo */
+}
+
+static inline void str2eaddr(unsigned char *ea, unsigned char *str)
+{
+       int i;
+
+       for (i = 0; i < 6; i++) {
+               unsigned char num;
+
+               if((*str == '.') || (*str == ':'))
+                       str++;
+               num = str2hexnum(*str++) << 4;
+               num |= (str2hexnum(*str++));
+               ea[i] = num;
+       }
+}
+
+int get_ethernet_addr(char *ethernet_addr)
+{
+        char *ethaddr_str;
+
+        ethaddr_str = prom_getenv("ethaddr");
+       if (!ethaddr_str) {
+               printk("ethaddr not set in boot prom\n");
+               return -1;
+       }
+       str2eaddr(ethernet_addr, ethaddr_str);
+
+       if (init_debug > 1) {
+               int i;
+               printk("get_ethernet_addr: ");
+               for (i=0; i<5; i++)
+                       printk("%02x:", (unsigned char)*(ethernet_addr+i));
+               printk("%02x\n", *(ethernet_addr+i));
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+static void __init console_config(void)
+{
+       char console_string[40];
+       int baud = 0;
+       char parity = '\0', bits = '\0', flow = '\0';
+       char *s;
+
+       if ((strstr(prom_getcmdline(), "console=")) == NULL) {
+               s = prom_getenv("modetty0");
+               if (s) {
+                       while (*s >= '0' && *s <= '9')
+                               baud = baud*10 + *s++ - '0';
+                       if (*s == ',') s++;
+                       if (*s) parity = *s++;
+                       if (*s == ',') s++;
+                       if (*s) bits = *s++;
+                       if (*s == ',') s++;
+                       if (*s == 'h') flow = 'r';
+               }
+               if (baud == 0)
+                       baud = 38400;
+               if (parity != 'n' && parity != 'o' && parity != 'e')
+                       parity = 'n';
+               if (bits != '7' && bits != '8')
+                       bits = '8';
+               if (flow == '\0')
+                       flow = 'r';
+               sprintf(console_string, " console=ttyS0,%d%c%c%c", baud, parity, bits, flow);
+               strcat(prom_getcmdline(), console_string);
+               pr_info("Config serial console:%s\n", console_string);
+       }
+}
+#endif
+
+#ifdef CONFIG_KGDB
+void __init kgdb_config(void)
+{
+       extern int (*generic_putDebugChar)(char);
+       extern char (*generic_getDebugChar)(void);
+       char *argptr;
+       int line, speed;
+
+       argptr = prom_getcmdline();
+       if ((argptr = strstr(argptr, "kgdb=ttyS")) != NULL) {
+               argptr += strlen("kgdb=ttyS");
+               if (*argptr != '0' && *argptr != '1')
+                       printk("KGDB: Unknown serial line /dev/ttyS%c, "
+                              "falling back to /dev/ttyS1\n", *argptr);
+               line = *argptr == '0' ? 0 : 1;
+               printk("KGDB: Using serial line /dev/ttyS%d for session\n", line);
+
+               speed = 0;
+               if (*++argptr == ',')
+               {
+                       int c;
+                       while ((c = *++argptr) && ('0' <= c && c <= '9'))
+                               speed = speed * 10 + c - '0';
+               }
+               {
+                       speed = rs_kgdb_hook(line, speed);
+                       generic_putDebugChar = rs_putDebugChar;
+                       generic_getDebugChar = rs_getDebugChar;
+               }
+
+               pr_info("KGDB: Using serial line /dev/ttyS%d at %d for "
+                       "session, please connect your debugger\n",
+                       line ? 1 : 0, speed);
+
+               {
+                       char *s;
+                       for (s = "Please connect GDB to this port\r\n"; *s; )
+                               generic_putDebugChar(*s++);
+               }
+
+               /* Breakpoint is invoked after interrupts are initialised */
+       }
+}
+#endif
+
+static void __init mips_nmi_setup(void)
+{
+       void *base;
+       extern char except_vec_nmi;
+
+       base = cpu_has_veic ?
+               (void *)(CAC_BASE + 0xa80) :
+               (void *)(CAC_BASE + 0x380);
+       memcpy(base, &except_vec_nmi, 0x80);
+       flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
+}
+
+static void __init mips_ejtag_setup(void)
+{
+       void *base;
+       extern char except_vec_ejtag_debug;
+
+       base = cpu_has_veic ?
+               (void *)(CAC_BASE + 0xa00) :
+               (void *)(CAC_BASE + 0x300);
+       memcpy(base, &except_vec_ejtag_debug, 0x80);
+       flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
+}
+
+extern struct plat_smp_ops msmtc_smp_ops;
+
+void __init prom_init(void)
+{
+       prom_argc = fw_arg0;
+       _prom_argv = (int *) fw_arg1;
+       _prom_envp = (int *) fw_arg2;
+
+       mips_display_message("LINUX");
+
+       /*
+        * early setup of _pcictrl_bonito so that we can determine
+        * the system controller on a CORE_EMUL board
+        */
+       _pcictrl_bonito = (unsigned long)ioremap(BONITO_REG_BASE, BONITO_REG_SIZE);
+
+       mips_revision_corid = MIPS_REVISION_CORID;
+
+       if (mips_revision_corid == MIPS_REVISION_CORID_CORE_EMUL) {
+               if (BONITO_PCIDID == 0x0001df53 ||
+                   BONITO_PCIDID == 0x0003df53)
+                       mips_revision_corid = MIPS_REVISION_CORID_CORE_EMUL_BON;
+               else
+                       mips_revision_corid = MIPS_REVISION_CORID_CORE_EMUL_MSC;
+       }
+
+       mips_revision_sconid = MIPS_REVISION_SCONID;
+       if (mips_revision_sconid == MIPS_REVISION_SCON_OTHER) {
+               switch (mips_revision_corid) {
+               case MIPS_REVISION_CORID_QED_RM5261:
+               case MIPS_REVISION_CORID_CORE_LV:
+               case MIPS_REVISION_CORID_CORE_FPGA:
+               case MIPS_REVISION_CORID_CORE_FPGAR2:
+                       mips_revision_sconid = MIPS_REVISION_SCON_GT64120;
+                       break;
+               case MIPS_REVISION_CORID_CORE_EMUL_BON:
+               case MIPS_REVISION_CORID_BONITO64:
+               case MIPS_REVISION_CORID_CORE_20K:
+                       mips_revision_sconid = MIPS_REVISION_SCON_BONITO;
+                       break;
+               case MIPS_REVISION_CORID_CORE_MSC:
+               case MIPS_REVISION_CORID_CORE_FPGA2:
+               case MIPS_REVISION_CORID_CORE_24K:
+                       /*
+                        * SOCit/ROCit support is essentially identical
+                        * but make an attempt to distinguish them
+                        */
+                       mips_revision_sconid = MIPS_REVISION_SCON_SOCIT;
+                       break;
+               case MIPS_REVISION_CORID_CORE_FPGA3:
+               case MIPS_REVISION_CORID_CORE_FPGA4:
+               case MIPS_REVISION_CORID_CORE_FPGA5:
+               case MIPS_REVISION_CORID_CORE_EMUL_MSC:
+               default:
+                       /* See above */
+                       mips_revision_sconid = MIPS_REVISION_SCON_ROCIT;
+                       break;
+               }
+       }
+
+       switch (mips_revision_sconid) {
+               u32 start, map, mask, data;
+
+       case MIPS_REVISION_SCON_GT64120:
+               /*
+                * Setup the North bridge to do Master byte-lane swapping
+                * when running in bigendian.
+                */
+               _pcictrl_gt64120 = (unsigned long)ioremap(MIPS_GT_BASE, 0x2000);
+
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+               GT_WRITE(GT_PCI0_CMD_OFS, GT_PCI0_CMD_MBYTESWAP_BIT |
+                        GT_PCI0_CMD_SBYTESWAP_BIT);
+#else
+               GT_WRITE(GT_PCI0_CMD_OFS, 0);
+#endif
+               /* Fix up PCI I/O mapping if necessary (for Atlas).  */
+               start = GT_READ(GT_PCI0IOLD_OFS);
+               map = GT_READ(GT_PCI0IOREMAP_OFS);
+               if ((start & map) != 0) {
+                       map &= ~start;
+                       GT_WRITE(GT_PCI0IOREMAP_OFS, map);
+               }
+
+               set_io_port_base(MALTA_GT_PORT_BASE);
+               break;
+
+       case MIPS_REVISION_SCON_BONITO:
+               _pcictrl_bonito_pcicfg = (unsigned long)ioremap(BONITO_PCICFG_BASE, BONITO_PCICFG_SIZE);
+
+               /*
+                * Disable Bonito IOBC.
+                */
+               BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG &
+                       ~(BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
+                         BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
+
+               /*
+                * Setup the North bridge to do Master byte-lane swapping
+                * when running in bigendian.
+                */
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+               BONITO_BONGENCFG = BONITO_BONGENCFG &
+                       ~(BONITO_BONGENCFG_MSTRBYTESWAP |
+                         BONITO_BONGENCFG_BYTESWAP);
+#else
+               BONITO_BONGENCFG = BONITO_BONGENCFG |
+                       BONITO_BONGENCFG_MSTRBYTESWAP |
+                       BONITO_BONGENCFG_BYTESWAP;
+#endif
+
+               set_io_port_base(MALTA_BONITO_PORT_BASE);
+               break;
+
+       case MIPS_REVISION_SCON_SOCIT:
+       case MIPS_REVISION_SCON_ROCIT:
+               _pcictrl_msc = (unsigned long)ioremap(MIPS_MSC01_PCI_REG_BASE, 0x2000);
+       mips_pci_controller:
+               mb();
+               MSC_READ(MSC01_PCI_CFG, data);
+               MSC_WRITE(MSC01_PCI_CFG, data & ~MSC01_PCI_CFG_EN_BIT);
+               wmb();
+
+               /* Fix up lane swapping.  */
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+               MSC_WRITE(MSC01_PCI_SWAP, MSC01_PCI_SWAP_NOSWAP);
+#else
+               MSC_WRITE(MSC01_PCI_SWAP,
+                         MSC01_PCI_SWAP_BYTESWAP << MSC01_PCI_SWAP_IO_SHF |
+                         MSC01_PCI_SWAP_BYTESWAP << MSC01_PCI_SWAP_MEM_SHF |
+                         MSC01_PCI_SWAP_BYTESWAP << MSC01_PCI_SWAP_BAR0_SHF);
+#endif
+               /* Fix up target memory mapping.  */
+               MSC_READ(MSC01_PCI_BAR0, mask);
+               MSC_WRITE(MSC01_PCI_P2SCMSKL, mask & MSC01_PCI_BAR0_SIZE_MSK);
+
+               /* Don't handle target retries indefinitely.  */
+               if ((data & MSC01_PCI_CFG_MAXRTRY_MSK) ==
+                   MSC01_PCI_CFG_MAXRTRY_MSK)
+                       data = (data & ~(MSC01_PCI_CFG_MAXRTRY_MSK <<
+                                        MSC01_PCI_CFG_MAXRTRY_SHF)) |
+                              ((MSC01_PCI_CFG_MAXRTRY_MSK - 1) <<
+                               MSC01_PCI_CFG_MAXRTRY_SHF);
+
+               wmb();
+               MSC_WRITE(MSC01_PCI_CFG, data);
+               mb();
+
+               set_io_port_base(MALTA_MSC_PORT_BASE);
+               break;
+
+       case MIPS_REVISION_SCON_SOCITSC:
+       case MIPS_REVISION_SCON_SOCITSCP:
+               _pcictrl_msc = (unsigned long)ioremap(MIPS_SOCITSC_PCI_REG_BASE, 0x2000);
+               goto mips_pci_controller;
+
+       default:
+               /* Unknown system controller */
+               mips_display_message("SC Error");
+               while (1);   /* We die here... */
+       }
+       board_nmi_handler_setup = mips_nmi_setup;
+       board_ejtag_handler_setup = mips_ejtag_setup;
+
+       pr_info("\nLINUX started...\n");
+       prom_init_cmdline();
+       prom_meminit();
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+       console_config();
+#endif
+#ifdef CONFIG_MIPS_CMP
+       register_smp_ops(&cmp_smp_ops);
+#endif
+#ifdef CONFIG_MIPS_MT_SMP
+       register_smp_ops(&vsmp_smp_ops);
+#endif
+#ifdef CONFIG_MIPS_MT_SMTC
+       register_smp_ops(&msmtc_smp_ops);
+#endif
+}
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
new file mode 100644 (file)
index 0000000..ea17611
--- /dev/null
@@ -0,0 +1,712 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 2000, 2001, 2004 MIPS Technologies, Inc.
+ * Copyright (C) 2001 Ralf Baechle
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Routines for generic manipulation of the interrupts found on the MIPS
+ * Malta board.
+ * The interrupt controller is located in the South Bridge a PIIX4 device
+ * with two internal 82C95 interrupt controllers.
+ */
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel_stat.h>
+#include <linux/kernel.h>
+#include <linux/random.h>
+
+#include <asm/traps.h>
+#include <asm/i8259.h>
+#include <asm/irq_cpu.h>
+#include <asm/irq_regs.h>
+#include <asm/mips-boards/malta.h>
+#include <asm/mips-boards/maltaint.h>
+#include <asm/mips-boards/piix4.h>
+#include <asm/gt64120.h>
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/msc01_pci.h>
+#include <asm/msc01_ic.h>
+#include <asm/gic.h>
+#include <asm/gcmpregs.h>
+
+int gcmp_present = -1;
+int gic_present;
+static unsigned long _msc01_biu_base;
+static unsigned long _gcmp_base;
+static unsigned int ipi_map[NR_CPUS];
+
+static DEFINE_SPINLOCK(mips_irq_lock);
+
+static inline int mips_pcibios_iack(void)
+{
+       int irq;
+       u32 dummy;
+
+       /*
+        * Determine highest priority pending interrupt by performing
+        * a PCI Interrupt Acknowledge cycle.
+        */
+       switch (mips_revision_sconid) {
+       case MIPS_REVISION_SCON_SOCIT:
+       case MIPS_REVISION_SCON_ROCIT:
+       case MIPS_REVISION_SCON_SOCITSC:
+       case MIPS_REVISION_SCON_SOCITSCP:
+               MSC_READ(MSC01_PCI_IACK, irq);
+               irq &= 0xff;
+               break;
+       case MIPS_REVISION_SCON_GT64120:
+               irq = GT_READ(GT_PCI0_IACK_OFS);
+               irq &= 0xff;
+               break;
+       case MIPS_REVISION_SCON_BONITO:
+               /* The following will generate a PCI IACK cycle on the
+                * Bonito controller. It's a little bit kludgy, but it
+                * was the easiest way to implement it in hardware at
+                * the given time.
+                */
+               BONITO_PCIMAP_CFG = 0x20000;
+
+               /* Flush Bonito register block */
+               dummy = BONITO_PCIMAP_CFG;
+               iob();    /* sync */
+
+               irq = readl((u32 *)_pcictrl_bonito_pcicfg);
+               iob();    /* sync */
+               irq &= 0xff;
+               BONITO_PCIMAP_CFG = 0;
+               break;
+       default:
+               printk(KERN_WARNING "Unknown system controller.\n");
+               return -1;
+       }
+       return irq;
+}
+
+static inline int get_int(void)
+{
+       unsigned long flags;
+       int irq;
+       spin_lock_irqsave(&mips_irq_lock, flags);
+
+       irq = mips_pcibios_iack();
+
+       /*
+        * The only way we can decide if an interrupt is spurious
+        * is by checking the 8259 registers.  This needs a spinlock
+        * on an SMP system,  so leave it up to the generic code...
+        */
+
+       spin_unlock_irqrestore(&mips_irq_lock, flags);
+
+       return irq;
+}
+
+static void malta_hw0_irqdispatch(void)
+{
+       int irq;
+
+       irq = get_int();
+       if (irq < 0) {
+               /* interrupt has already been cleared */
+               return;
+       }
+
+       do_IRQ(MALTA_INT_BASE + irq);
+}
+
+static void malta_ipi_irqdispatch(void)
+{
+       int irq;
+
+       irq = gic_get_int();
+       if (irq < 0)
+               return;  /* interrupt has already been cleared */
+
+       do_IRQ(MIPS_GIC_IRQ_BASE + irq);
+}
+
+static void corehi_irqdispatch(void)
+{
+       unsigned int intedge, intsteer, pcicmd, pcibadaddr;
+       unsigned int pcimstat, intisr, inten, intpol;
+       unsigned int intrcause, datalo, datahi;
+       struct pt_regs *regs = get_irq_regs();
+
+       printk(KERN_EMERG "CoreHI interrupt, shouldn't happen, we die here!\n");
+       printk(KERN_EMERG "epc   : %08lx\nStatus: %08lx\n"
+                       "Cause : %08lx\nbadVaddr : %08lx\n",
+                       regs->cp0_epc, regs->cp0_status,
+                       regs->cp0_cause, regs->cp0_badvaddr);
+
+       /* Read all the registers and then print them as there is a
+          problem with interspersed printk's upsetting the Bonito controller.
+          Do it for the others too.
+       */
+
+       switch (mips_revision_sconid) {
+       case MIPS_REVISION_SCON_SOCIT:
+       case MIPS_REVISION_SCON_ROCIT:
+       case MIPS_REVISION_SCON_SOCITSC:
+       case MIPS_REVISION_SCON_SOCITSCP:
+               ll_msc_irq();
+               break;
+       case MIPS_REVISION_SCON_GT64120:
+               intrcause = GT_READ(GT_INTRCAUSE_OFS);
+               datalo = GT_READ(GT_CPUERR_ADDRLO_OFS);
+               datahi = GT_READ(GT_CPUERR_ADDRHI_OFS);
+               printk(KERN_EMERG "GT_INTRCAUSE = %08x\n", intrcause);
+               printk(KERN_EMERG "GT_CPUERR_ADDR = %02x%08x\n",
+                               datahi, datalo);
+               break;
+       case MIPS_REVISION_SCON_BONITO:
+               pcibadaddr = BONITO_PCIBADADDR;
+               pcimstat = BONITO_PCIMSTAT;
+               intisr = BONITO_INTISR;
+               inten = BONITO_INTEN;
+               intpol = BONITO_INTPOL;
+               intedge = BONITO_INTEDGE;
+               intsteer = BONITO_INTSTEER;
+               pcicmd = BONITO_PCICMD;
+               printk(KERN_EMERG "BONITO_INTISR = %08x\n", intisr);
+               printk(KERN_EMERG "BONITO_INTEN = %08x\n", inten);
+               printk(KERN_EMERG "BONITO_INTPOL = %08x\n", intpol);
+               printk(KERN_EMERG "BONITO_INTEDGE = %08x\n", intedge);
+               printk(KERN_EMERG "BONITO_INTSTEER = %08x\n", intsteer);
+               printk(KERN_EMERG "BONITO_PCICMD = %08x\n", pcicmd);
+               printk(KERN_EMERG "BONITO_PCIBADADDR = %08x\n", pcibadaddr);
+               printk(KERN_EMERG "BONITO_PCIMSTAT = %08x\n", pcimstat);
+               break;
+       }
+
+       die("CoreHi interrupt", regs);
+}
+
+static inline int clz(unsigned long x)
+{
+       __asm__(
+       "       .set    push                                    \n"
+       "       .set    mips32                                  \n"
+       "       clz     %0, %1                                  \n"
+       "       .set    pop                                     \n"
+       : "=r" (x)
+       : "r" (x));
+
+       return x;
+}
+
+/*
+ * Version of ffs that only looks at bits 12..15.
+ */
+static inline unsigned int irq_ffs(unsigned int pending)
+{
+#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
+       return -clz(pending) + 31 - CAUSEB_IP;
+#else
+       unsigned int a0 = 7;
+       unsigned int t0;
+
+       t0 = pending & 0xf000;
+       t0 = t0 < 1;
+       t0 = t0 << 2;
+       a0 = a0 - t0;
+       pending = pending << t0;
+
+       t0 = pending & 0xc000;
+       t0 = t0 < 1;
+       t0 = t0 << 1;
+       a0 = a0 - t0;
+       pending = pending << t0;
+
+       t0 = pending & 0x8000;
+       t0 = t0 < 1;
+       /* t0 = t0 << 2; */
+       a0 = a0 - t0;
+       /* pending = pending << t0; */
+
+       return a0;
+#endif
+}
+
+/*
+ * IRQs on the Malta board look basically (barring software IRQs which we
+ * don't use at all and all external interrupt sources are combined together
+ * on hardware interrupt 0 (MIPS IRQ 2)) like:
+ *
+ *     MIPS IRQ        Source
+ *      --------        ------
+ *             0       Software (ignored)
+ *             1        Software (ignored)
+ *             2        Combined hardware interrupt (hw0)
+ *             3        Hardware (ignored)
+ *             4        Hardware (ignored)
+ *             5        Hardware (ignored)
+ *             6        Hardware (ignored)
+ *             7        R4k timer (what we use)
+ *
+ * We handle the IRQ according to _our_ priority which is:
+ *
+ * Highest ----     R4k Timer
+ * Lowest  ----     Combined hardware interrupt
+ *
+ * then we just return, if multiple IRQs are pending then we will just take
+ * another exception, big deal.
+ */
+
+asmlinkage void plat_irq_dispatch(void)
+{
+       unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
+       int irq;
+
+       irq = irq_ffs(pending);
+
+       if (irq == MIPSCPU_INT_I8259A)
+               malta_hw0_irqdispatch();
+       else if (gic_present && ((1 << irq) & ipi_map[smp_processor_id()]))
+               malta_ipi_irqdispatch();
+       else if (irq >= 0)
+               do_IRQ(MIPS_CPU_IRQ_BASE + irq);
+       else
+               spurious_interrupt();
+}
+
+#ifdef CONFIG_MIPS_MT_SMP
+
+
+#define GIC_MIPS_CPU_IPI_RESCHED_IRQ   3
+#define GIC_MIPS_CPU_IPI_CALL_IRQ      4
+
+#define MIPS_CPU_IPI_RESCHED_IRQ 0     /* SW int 0 for resched */
+#define C_RESCHED C_SW0
+#define MIPS_CPU_IPI_CALL_IRQ 1                /* SW int 1 for resched */
+#define C_CALL C_SW1
+static int cpu_ipi_resched_irq, cpu_ipi_call_irq;
+
+static void ipi_resched_dispatch(void)
+{
+       do_IRQ(MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ);
+}
+
+static void ipi_call_dispatch(void)
+{
+       do_IRQ(MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ);
+}
+
+static irqreturn_t ipi_resched_interrupt(int irq, void *dev_id)
+{
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t ipi_call_interrupt(int irq, void *dev_id)
+{
+       smp_call_function_interrupt();
+
+       return IRQ_HANDLED;
+}
+
+static struct irqaction irq_resched = {
+       .handler        = ipi_resched_interrupt,
+       .flags          = IRQF_DISABLED|IRQF_PERCPU,
+       .name           = "IPI_resched"
+};
+
+static struct irqaction irq_call = {
+       .handler        = ipi_call_interrupt,
+       .flags          = IRQF_DISABLED|IRQF_PERCPU,
+       .name           = "IPI_call"
+};
+#endif /* CONFIG_MIPS_MT_SMP */
+
+static struct irqaction i8259irq = {
+       .handler = no_action,
+       .name = "XT-PIC cascade"
+};
+
+static struct irqaction corehi_irqaction = {
+       .handler = no_action,
+       .name = "CoreHi"
+};
+
+static msc_irqmap_t __initdata msc_irqmap[] = {
+       {MSC01C_INT_TMR,                MSC01_IRQ_EDGE, 0},
+       {MSC01C_INT_PCI,                MSC01_IRQ_LEVEL, 0},
+};
+static int __initdata msc_nr_irqs = ARRAY_SIZE(msc_irqmap);
+
+static msc_irqmap_t __initdata msc_eicirqmap[] = {
+       {MSC01E_INT_SW0,                MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_SW1,                MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_I8259A,             MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_SMI,                MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_COREHI,             MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_CORELO,             MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_TMR,                MSC01_IRQ_EDGE, 0},
+       {MSC01E_INT_PCI,                MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_PERFCTR,            MSC01_IRQ_LEVEL, 0},
+       {MSC01E_INT_CPUCTR,             MSC01_IRQ_LEVEL, 0}
+};
+
+static int __initdata msc_nr_eicirqs = ARRAY_SIZE(msc_eicirqmap);
+
+#if defined(CONFIG_MIPS_MT_SMP)
+/*
+ * This GIC specific tabular array defines the association between External
+ * Interrupts and CPUs/Core Interrupts. The nature of the External
+ * Interrupts is also defined here - polarity/trigger.
+ */
+static struct gic_intr_map gic_intr_map[] = {
+       { GIC_EXT_INTR(0),      X,      X,              X,              X,              0 },
+       { GIC_EXT_INTR(1),      X,      X,              X,              X,              0 },
+       { GIC_EXT_INTR(2),      X,      X,              X,              X,              0 },
+       { GIC_EXT_INTR(3),      0,      GIC_CPU_INT0,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(4),      0,      GIC_CPU_INT1,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(5),      0,      GIC_CPU_INT2,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(6),      0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(7),      0,      GIC_CPU_INT4,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(8),      0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(9),      0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(10),     X,      X,              X,              X,              0 },
+       { GIC_EXT_INTR(11),     X,      X,              X,              X,              0 },
+       { GIC_EXT_INTR(12),     0,      GIC_CPU_INT3,   GIC_POL_POS,    GIC_TRIG_LEVEL, 0 },
+       { GIC_EXT_INTR(13),     0,      GIC_MAP_TO_NMI_MSK,     GIC_POL_POS, GIC_TRIG_LEVEL,    0 },
+       { GIC_EXT_INTR(14),     0,      GIC_MAP_TO_NMI_MSK,     GIC_POL_POS, GIC_TRIG_LEVEL,    0 },
+       { GIC_EXT_INTR(15),     X,      X,              X,              X,              0 },
+       { GIC_EXT_INTR(16),     0,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(17),     0,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(18),     1,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(19),     1,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(20),     2,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(21),     2,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(22),     3,      GIC_CPU_INT1,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+       { GIC_EXT_INTR(23),     3,      GIC_CPU_INT2,   GIC_POL_POS, GIC_TRIG_EDGE,     1 },
+};
+#endif
+
+/*
+ * GCMP needs to be detected before any SMP initialisation
+ */
+static int __init gcmp_probe(unsigned long addr, unsigned long size)
+{
+       if (gcmp_present >= 0)
+               return gcmp_present;
+
+       _gcmp_base = (unsigned long) ioremap_nocache(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ);
+       _msc01_biu_base = (unsigned long) ioremap_nocache(MSC01_BIU_REG_BASE, MSC01_BIU_ADDRSPACE_SZ);
+       gcmp_present = (GCMPGCB(GCMPB) & GCMP_GCB_GCMPB_GCMPBASE_MSK) == GCMP_BASE_ADDR;
+
+       if (gcmp_present)
+               printk(KERN_DEBUG "GCMP present\n");
+       return gcmp_present;
+}
+
+#if defined(CONFIG_MIPS_MT_SMP)
+static void __init fill_ipi_map(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(gic_intr_map); i++) {
+               if (gic_intr_map[i].ipiflag && (gic_intr_map[i].cpunum != X))
+                       ipi_map[gic_intr_map[i].cpunum] |=
+                               (1 << (gic_intr_map[i].pin + 2));
+       }
+}
+#endif
+
+void __init arch_init_irq(void)
+{
+       int gic_present, gcmp_present;
+
+       init_i8259_irqs();
+
+       if (!cpu_has_veic)
+               mips_cpu_irq_init();
+
+       gcmp_present = gcmp_probe(GCMP_BASE_ADDR, GCMP_ADDRSPACE_SZ);
+       if (gcmp_present)  {
+               GCMPGCB(GICBA) = GIC_BASE_ADDR | GCMP_GCB_GICBA_EN_MSK;
+               gic_present = 1;
+       } else {
+               _msc01_biu_base = (unsigned long) ioremap_nocache(MSC01_BIU_REG_BASE, MSC01_BIU_ADDRSPACE_SZ);
+               gic_present = (REG(_msc01_biu_base, MSC01_SC_CFG) &
+               MSC01_SC_CFG_GICPRES_MSK) >> MSC01_SC_CFG_GICPRES_SHF;
+       }
+       if (gic_present)
+               printk(KERN_DEBUG "GIC present\n");
+
+       switch (mips_revision_sconid) {
+       case MIPS_REVISION_SCON_SOCIT:
+       case MIPS_REVISION_SCON_ROCIT:
+               if (cpu_has_veic)
+                       init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
+                                       MSC01E_INT_BASE, msc_eicirqmap,
+                                       msc_nr_eicirqs);
+               else
+                       init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
+                                       MSC01C_INT_BASE, msc_irqmap,
+                                       msc_nr_irqs);
+               break;
+
+       case MIPS_REVISION_SCON_SOCITSC:
+       case MIPS_REVISION_SCON_SOCITSCP:
+               if (cpu_has_veic)
+                       init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
+                                       MSC01E_INT_BASE, msc_eicirqmap,
+                                       msc_nr_eicirqs);
+               else
+                       init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
+                                       MSC01C_INT_BASE, msc_irqmap,
+                                       msc_nr_irqs);
+       }
+
+       if (cpu_has_veic) {
+               set_vi_handler(MSC01E_INT_I8259A, malta_hw0_irqdispatch);
+               set_vi_handler(MSC01E_INT_COREHI, corehi_irqdispatch);
+               setup_irq(MSC01E_INT_BASE+MSC01E_INT_I8259A, &i8259irq);
+               setup_irq(MSC01E_INT_BASE+MSC01E_INT_COREHI, &corehi_irqaction);
+       } else if (cpu_has_vint) {
+               set_vi_handler(MIPSCPU_INT_I8259A, malta_hw0_irqdispatch);
+               set_vi_handler(MIPSCPU_INT_COREHI, corehi_irqdispatch);
+#ifdef CONFIG_MIPS_MT_SMTC
+               setup_irq_smtc(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq,
+                       (0x100 << MIPSCPU_INT_I8259A));
+               setup_irq_smtc(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI,
+                       &corehi_irqaction, (0x100 << MIPSCPU_INT_COREHI));
+               /*
+                * Temporary hack to ensure that the subsidiary device
+                * interrupts coing in via the i8259A, but associated
+                * with low IRQ numbers, will restore the Status.IM
+                * value associated with the i8259A.
+                */
+               {
+                       int i;
+
+                       for (i = 0; i < 16; i++)
+                               irq_hwmask[i] = (0x100 << MIPSCPU_INT_I8259A);
+               }
+#else /* Not SMTC */
+               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq);
+               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI,
+                                               &corehi_irqaction);
+#endif /* CONFIG_MIPS_MT_SMTC */
+       } else {
+               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_I8259A, &i8259irq);
+               setup_irq(MIPS_CPU_IRQ_BASE+MIPSCPU_INT_COREHI,
+                                               &corehi_irqaction);
+       }
+
+#if defined(CONFIG_MIPS_MT_SMP)
+       if (gic_present) {
+               /* FIXME */
+               int i;
+               struct {
+                       unsigned int resched;
+                       unsigned int call;
+               } ipiirq[] = {
+                       {
+                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE0,
+                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE0},
+                       {
+                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE1,
+                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE1
+                       }, {
+                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE2,
+                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE2
+                       }, {
+                               .resched = GIC_IPI_EXT_INTR_RESCHED_VPE3,
+                               .call =  GIC_IPI_EXT_INTR_CALLFNC_VPE3
+                       }
+               };
+               fill_ipi_map();
+               gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map, ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE);
+               if (!gcmp_present) {
+                       /* Enable the GIC */
+                       i = REG(_msc01_biu_base, MSC01_SC_CFG);
+                       REG(_msc01_biu_base, MSC01_SC_CFG) =
+                               (i | (0x1 << MSC01_SC_CFG_GICENA_SHF));
+                       pr_debug("GIC Enabled\n");
+               }
+
+               /* set up ipi interrupts */
+               if (cpu_has_vint) {
+                       set_vi_handler(MIPSCPU_INT_IPI0, malta_ipi_irqdispatch);
+                       set_vi_handler(MIPSCPU_INT_IPI1, malta_ipi_irqdispatch);
+               }
+               /* Argh.. this really needs sorting out.. */
+               printk("CPU%d: status register was %08x\n", smp_processor_id(), read_c0_status());
+               write_c0_status(read_c0_status() | STATUSF_IP3 | STATUSF_IP4);
+               printk("CPU%d: status register now %08x\n", smp_processor_id(), read_c0_status());
+               write_c0_status(0x1100dc00);
+               printk("CPU%d: status register frc %08x\n", smp_processor_id(), read_c0_status());
+               for (i = 0; i < ARRAY_SIZE(ipiirq); i++) {
+                       setup_irq(MIPS_GIC_IRQ_BASE + ipiirq[i].resched, &irq_resched);
+                       setup_irq(MIPS_GIC_IRQ_BASE + ipiirq[i].call, &irq_call);
+
+                       set_irq_handler(MIPS_GIC_IRQ_BASE + ipiirq[i].resched, handle_percpu_irq);
+                       set_irq_handler(MIPS_GIC_IRQ_BASE + ipiirq[i].call, handle_percpu_irq);
+               }
+       } else {
+               /* set up ipi interrupts */
+               if (cpu_has_veic) {
+                       set_vi_handler (MSC01E_INT_SW0, ipi_resched_dispatch);
+                       set_vi_handler (MSC01E_INT_SW1, ipi_call_dispatch);
+                       cpu_ipi_resched_irq = MSC01E_INT_SW0;
+                       cpu_ipi_call_irq = MSC01E_INT_SW1;
+               } else {
+                       if (cpu_has_vint) {
+                               set_vi_handler (MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch);
+                               set_vi_handler (MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch);
+                       }
+                       cpu_ipi_resched_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ;
+                       cpu_ipi_call_irq = MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ;
+               }
+
+               setup_irq(cpu_ipi_resched_irq, &irq_resched);
+               setup_irq(cpu_ipi_call_irq, &irq_call);
+
+               set_irq_handler(cpu_ipi_resched_irq, handle_percpu_irq);
+               set_irq_handler(cpu_ipi_call_irq, handle_percpu_irq);
+       }
+#endif
+}
+
+void malta_be_init(void)
+{
+       if (gcmp_present) {
+               /* Could change CM error mask register */
+       }
+}
+
+
+static char *tr[8] = {
+       "mem",  "gcr",  "gic",  "mmio",
+       "0x04", "0x05", "0x06", "0x07"
+};
+
+static char *mcmd[32] = {
+       [0x00] = "0x00",
+       [0x01] = "Legacy Write",
+       [0x02] = "Legacy Read",
+       [0x03] = "0x03",
+       [0x04] = "0x04",
+       [0x05] = "0x05",
+       [0x06] = "0x06",
+       [0x07] = "0x07",
+       [0x08] = "Coherent Read Own",
+       [0x09] = "Coherent Read Share",
+       [0x0a] = "Coherent Read Discard",
+       [0x0b] = "Coherent Ready Share Always",
+       [0x0c] = "Coherent Upgrade",
+       [0x0d] = "Coherent Writeback",
+       [0x0e] = "0x0e",
+       [0x0f] = "0x0f",
+       [0x10] = "Coherent Copyback",
+       [0x11] = "Coherent Copyback Invalidate",
+       [0x12] = "Coherent Invalidate",
+       [0x13] = "Coherent Write Invalidate",
+       [0x14] = "Coherent Completion Sync",
+       [0x15] = "0x15",
+       [0x16] = "0x16",
+       [0x17] = "0x17",
+       [0x18] = "0x18",
+       [0x19] = "0x19",
+       [0x1a] = "0x1a",
+       [0x1b] = "0x1b",
+       [0x1c] = "0x1c",
+       [0x1d] = "0x1d",
+       [0x1e] = "0x1e",
+       [0x1f] = "0x1f"
+};
+
+static char *core[8] = {
+       "Invalid/OK",   "Invalid/Data",
+       "Shared/OK",    "Shared/Data",
+       "Modified/OK",  "Modified/Data",
+       "Exclusive/OK", "Exclusive/Data"
+};
+
+static char *causes[32] = {
+       "None", "GC_WR_ERR", "GC_RD_ERR", "COH_WR_ERR",
+       "COH_RD_ERR", "MMIO_WR_ERR", "MMIO_RD_ERR", "0x07",
+       "0x08", "0x09", "0x0a", "0x0b",
+       "0x0c", "0x0d", "0x0e", "0x0f",
+       "0x10", "0x11", "0x12", "0x13",
+       "0x14", "0x15", "0x16", "INTVN_WR_ERR",
+       "INTVN_RD_ERR", "0x19", "0x1a", "0x1b",
+       "0x1c", "0x1d", "0x1e", "0x1f"
+};
+
+int malta_be_handler(struct pt_regs *regs, int is_fixup)
+{
+       /* This duplicates the handling in do_be which seems wrong */
+       int retval = is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL;
+
+       if (gcmp_present) {
+               unsigned long cm_error = GCMPGCB(GCMEC);
+               unsigned long cm_addr = GCMPGCB(GCMEA);
+               unsigned long cm_other = GCMPGCB(GCMEO);
+               unsigned long cause, ocause;
+               char buf[256];
+
+               cause = (cm_error & GCMP_GCB_GMEC_ERROR_TYPE_MSK);
+               if (cause != 0) {
+                       cause >>= GCMP_GCB_GMEC_ERROR_TYPE_SHF;
+                       if (cause < 16) {
+                               unsigned long cca_bits = (cm_error >> 15) & 7;
+                               unsigned long tr_bits = (cm_error >> 12) & 7;
+                               unsigned long mcmd_bits = (cm_error >> 7) & 0x1f;
+                               unsigned long stag_bits = (cm_error >> 3) & 15;
+                               unsigned long sport_bits = (cm_error >> 0) & 7;
+
+                               snprintf(buf, sizeof(buf),
+                                        "CCA=%lu TR=%s MCmd=%s STag=%lu "
+                                        "SPort=%lu\n",
+                                        cca_bits, tr[tr_bits], mcmd[mcmd_bits],
+                                        stag_bits, sport_bits);
+                       } else {
+                               /* glob state & sresp together */
+                               unsigned long c3_bits = (cm_error >> 18) & 7;
+                               unsigned long c2_bits = (cm_error >> 15) & 7;
+                               unsigned long c1_bits = (cm_error >> 12) & 7;
+                               unsigned long c0_bits = (cm_error >> 9) & 7;
+                               unsigned long sc_bit = (cm_error >> 8) & 1;
+                               unsigned long mcmd_bits = (cm_error >> 3) & 0x1f;
+                               unsigned long sport_bits = (cm_error >> 0) & 7;
+                               snprintf(buf, sizeof(buf),
+                                        "C3=%s C2=%s C1=%s C0=%s SC=%s "
+                                        "MCmd=%s SPort=%lu\n",
+                                        core[c3_bits], core[c2_bits],
+                                        core[c1_bits], core[c0_bits],
+                                        sc_bit ? "True" : "False",
+                                        mcmd[mcmd_bits], sport_bits);
+                       }
+
+                       ocause = (cm_other & GCMP_GCB_GMEO_ERROR_2ND_MSK) >>
+                                GCMP_GCB_GMEO_ERROR_2ND_SHF;
+
+                       printk("CM_ERROR=%08lx %s <%s>\n", cm_error,
+                              causes[cause], buf);
+                       printk("CM_ADDR =%08lx\n", cm_addr);
+                       printk("CM_OTHER=%08lx %s\n", cm_other, causes[ocause]);
+
+                       /* reprime cause register */
+                       GCMPGCB(GCMEC) = 0;
+               }
+       }
+
+       return retval;
+}
diff --git a/arch/mips/mti-malta/malta-kgdb.c b/arch/mips/mti-malta/malta-kgdb.c
new file mode 100644 (file)
index 0000000..6a1854d
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * This is the interface to the remote debugger stub.
+ */
+#include <linux/types.h>
+#include <linux/serial.h>
+#include <linux/serialP.h>
+#include <linux/serial_reg.h>
+
+#include <asm/serial.h>
+#include <asm/io.h>
+
+static struct serial_state rs_table[] = {
+       SERIAL_PORT_DFNS        /* Defined in serial.h */
+};
+
+static struct async_struct kdb_port_info = {0};
+
+int (*generic_putDebugChar)(char);
+char (*generic_getDebugChar)(void);
+
+static __inline__ unsigned int serial_in(struct async_struct *info, int offset)
+{
+       return inb(info->port + offset);
+}
+
+static __inline__ void serial_out(struct async_struct *info, int offset,
+                               int value)
+{
+       outb(value, info->port+offset);
+}
+
+int rs_kgdb_hook(int tty_no, int speed) {
+       int t;
+       struct serial_state *ser = &rs_table[tty_no];
+
+       kdb_port_info.state = ser;
+       kdb_port_info.magic = SERIAL_MAGIC;
+       kdb_port_info.port = ser->port;
+       kdb_port_info.flags = ser->flags;
+
+       /*
+        * Clear all interrupts
+        */
+       serial_in(&kdb_port_info, UART_LSR);
+       serial_in(&kdb_port_info, UART_RX);
+       serial_in(&kdb_port_info, UART_IIR);
+       serial_in(&kdb_port_info, UART_MSR);
+
+       /*
+        * Now, initialize the UART
+        */
+       serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8);   /* reset DLAB */
+       if (kdb_port_info.flags & ASYNC_FOURPORT) {
+               kdb_port_info.MCR = UART_MCR_DTR | UART_MCR_RTS;
+               t = UART_MCR_DTR | UART_MCR_OUT1;
+       } else {
+               kdb_port_info.MCR
+                       = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2;
+               t = UART_MCR_DTR | UART_MCR_RTS;
+       }
+
+       kdb_port_info.MCR = t;          /* no interrupts, please */
+       serial_out(&kdb_port_info, UART_MCR, kdb_port_info.MCR);
+
+       /*
+        * and set the speed of the serial port
+        */
+       if (speed == 0)
+               speed = 9600;
+
+       t = kdb_port_info.state->baud_base / speed;
+       /* set DLAB */
+       serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
+       serial_out(&kdb_port_info, UART_DLL, t & 0xff);/* LS of divisor */
+       serial_out(&kdb_port_info, UART_DLM, t >> 8);  /* MS of divisor */
+       /* reset DLAB */
+       serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8);
+
+       return speed;
+}
+
+int putDebugChar(char c)
+{
+       return generic_putDebugChar(c);
+}
+
+char getDebugChar(void)
+{
+       return generic_getDebugChar();
+}
+
+int rs_putDebugChar(char c)
+{
+
+       if (!kdb_port_info.state) {     /* need to init device first */
+               return 0;
+       }
+
+       while ((serial_in(&kdb_port_info, UART_LSR) & UART_LSR_THRE) == 0)
+               ;
+
+       serial_out(&kdb_port_info, UART_TX, c);
+
+       return 1;
+}
+
+char rs_getDebugChar(void)
+{
+       if (!kdb_port_info.state) {     /* need to init device first */
+               return 0;
+       }
+
+       while (!(serial_in(&kdb_port_info, UART_LSR) & 1))
+               ;
+
+       return serial_in(&kdb_port_info, UART_RX);
+}
diff --git a/arch/mips/mti-malta/malta-memory.c b/arch/mips/mti-malta/malta-memory.c
new file mode 100644 (file)
index 0000000..61888ff
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * PROM library functions for acquiring/using memory descriptors given to
+ * us from the YAMON.
+ */
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/bootmem.h>
+#include <linux/pfn.h>
+#include <linux/string.h>
+
+#include <asm/bootinfo.h>
+#include <asm/page.h>
+#include <asm/sections.h>
+
+#include <asm/mips-boards/prom.h>
+
+/*#define DEBUG*/
+
+enum yamon_memtypes {
+       yamon_dontuse,
+       yamon_prom,
+       yamon_free,
+};
+static struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];
+
+#ifdef DEBUG
+static char *mtypes[3] = {
+       "Dont use memory",
+       "YAMON PROM memory",
+       "Free memmory",
+};
+#endif
+
+/* determined physical memory size, not overridden by command line args  */
+unsigned long physical_memsize = 0L;
+
+static struct prom_pmemblock * __init prom_getmdesc(void)
+{
+       char *memsize_str;
+       unsigned int memsize;
+       char cmdline[CL_SIZE], *ptr;
+
+       /* otherwise look in the environment */
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str) {
+               printk(KERN_WARNING
+                      "memsize not set in boot prom, set to default (32Mb)\n");
+               physical_memsize = 0x02000000;
+       } else {
+#ifdef DEBUG
+               pr_debug("prom_memsize = %s\n", memsize_str);
+#endif
+               physical_memsize = simple_strtol(memsize_str, NULL, 0);
+       }
+
+#ifdef CONFIG_CPU_BIG_ENDIAN
+       /* SOC-it swaps, or perhaps doesn't swap, when DMA'ing the last
+          word of physical memory */
+       physical_memsize -= PAGE_SIZE;
+#endif
+
+       /* Check the command line for a memsize directive that overrides
+          the physical/default amount */
+       strcpy(cmdline, arcs_cmdline);
+       ptr = strstr(cmdline, "memsize=");
+       if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' '))
+               ptr = strstr(ptr, " memsize=");
+
+       if (ptr)
+               memsize = memparse(ptr + 8, &ptr);
+       else
+               memsize = physical_memsize;
+
+       memset(mdesc, 0, sizeof(mdesc));
+
+       mdesc[0].type = yamon_dontuse;
+       mdesc[0].base = 0x00000000;
+       mdesc[0].size = 0x00001000;
+
+       mdesc[1].type = yamon_prom;
+       mdesc[1].base = 0x00001000;
+       mdesc[1].size = 0x000ef000;
+
+       /*
+        * The area 0x000f0000-0x000fffff is allocated for BIOS memory by the
+        * south bridge and PCI access always forwarded to the ISA Bus and
+        * BIOSCS# is always generated.
+        * This mean that this area can't be used as DMA memory for PCI
+        * devices.
+        */
+       mdesc[2].type = yamon_dontuse;
+       mdesc[2].base = 0x000f0000;
+       mdesc[2].size = 0x00010000;
+
+       mdesc[3].type = yamon_dontuse;
+       mdesc[3].base = 0x00100000;
+       mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - mdesc[3].base;
+
+       mdesc[4].type = yamon_free;
+       mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end));
+       mdesc[4].size = memsize - mdesc[4].base;
+
+       return &mdesc[0];
+}
+
+static int __init prom_memtype_classify(unsigned int type)
+{
+       switch (type) {
+       case yamon_free:
+               return BOOT_MEM_RAM;
+       case yamon_prom:
+               return BOOT_MEM_ROM_DATA;
+       default:
+               return BOOT_MEM_RESERVED;
+       }
+}
+
+void __init prom_meminit(void)
+{
+       struct prom_pmemblock *p;
+
+#ifdef DEBUG
+       pr_debug("YAMON MEMORY DESCRIPTOR dump:\n");
+       p = prom_getmdesc();
+       while (p->size) {
+               int i = 0;
+               pr_debug("[%d,%p]: base<%08lx> size<%08lx> type<%s>\n",
+                        i, p, p->base, p->size, mtypes[p->type]);
+               p++;
+               i++;
+       }
+#endif
+       p = prom_getmdesc();
+
+       while (p->size) {
+               long type;
+               unsigned long base, size;
+
+               type = prom_memtype_classify(p->type);
+               base = p->base;
+               size = p->size;
+
+               add_memory_region(base, size, type);
+                p++;
+       }
+}
+
+void __init prom_free_prom_memory(void)
+{
+       unsigned long addr;
+       int i;
+
+       for (i = 0; i < boot_mem_map.nr_map; i++) {
+               if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
+                       continue;
+
+               addr = boot_mem_map.map[i].addr;
+               free_init_pages("prom memory",
+                               addr, addr + boot_mem_map.map[i].size);
+       }
+}
diff --git a/arch/mips/mti-malta/malta-mtd.c b/arch/mips/mti-malta/malta-mtd.c
new file mode 100644 (file)
index 0000000..8ad9bdf
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2006 MIPS Technologies, Inc.
+ *     written by Ralf Baechle <ralf@linux-mips.org>
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <mtd/mtd-abi.h>
+
+static struct mtd_partition malta_mtd_partitions[] = {
+       {
+               .name =         "YAMON",
+               .offset =       0x0,
+               .size =         0x100000,
+               .mask_flags =   MTD_WRITEABLE
+       }, {
+               .name =         "User FS",
+               .offset =       0x100000,
+               .size =         0x2e0000
+       }, {
+               .name =         "Board Config",
+               .offset =       0x3e0000,
+               .size =         0x020000,
+               .mask_flags =   MTD_WRITEABLE
+       }
+};
+
+static struct physmap_flash_data malta_flash_data = {
+       .width          = 4,
+       .nr_parts       = ARRAY_SIZE(malta_mtd_partitions),
+       .parts          = malta_mtd_partitions
+};
+
+static struct resource malta_flash_resource = {
+       .start          = 0x1e000000,
+       .end            = 0x1e3fffff,
+       .flags          = IORESOURCE_MEM
+};
+
+static struct platform_device malta_flash = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &malta_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &malta_flash_resource,
+};
+
+static int __init malta_mtd_init(void)
+{
+       platform_device_register(&malta_flash);
+
+       return 0;
+}
+
+module_init(malta_mtd_init)
diff --git a/arch/mips/mti-malta/malta-pci.c b/arch/mips/mti-malta/malta-pci.c
new file mode 100644 (file)
index 0000000..b974319
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 1999, 2000, 2004, 2005  MIPS Technologies, Inc.
+ *     All rights reserved.
+ *     Authors: Carsten Langgaard <carstenl@mips.com>
+ *              Maciej W. Rozycki <macro@mips.com>
+ *
+ * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * MIPS boards specific PCI support.
+ */
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include <asm/gt64120.h>
+
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/bonito64.h>
+#include <asm/mips-boards/msc01_pci.h>
+
+static struct resource bonito64_mem_resource = {
+       .name   = "Bonito PCI MEM",
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct resource bonito64_io_resource = {
+       .name   = "Bonito PCI I/O",
+       .start  = 0x00000000UL,
+       .end    = 0x000fffffUL,
+       .flags  = IORESOURCE_IO,
+};
+
+static struct resource gt64120_mem_resource = {
+       .name   = "GT-64120 PCI MEM",
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct resource gt64120_io_resource = {
+       .name   = "GT-64120 PCI I/O",
+       .flags  = IORESOURCE_IO,
+};
+
+static struct resource msc_mem_resource = {
+       .name   = "MSC PCI MEM",
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct resource msc_io_resource = {
+       .name   = "MSC PCI I/O",
+       .flags  = IORESOURCE_IO,
+};
+
+extern struct pci_ops bonito64_pci_ops;
+extern struct pci_ops gt64xxx_pci0_ops;
+extern struct pci_ops msc_pci_ops;
+
+static struct pci_controller bonito64_controller = {
+       .pci_ops        = &bonito64_pci_ops,
+       .io_resource    = &bonito64_io_resource,
+       .mem_resource   = &bonito64_mem_resource,
+       .io_offset      = 0x00000000UL,
+};
+
+static struct pci_controller gt64120_controller = {
+       .pci_ops        = &gt64xxx_pci0_ops,
+       .io_resource    = &gt64120_io_resource,
+       .mem_resource   = &gt64120_mem_resource,
+};
+
+static struct pci_controller msc_controller = {
+       .pci_ops        = &msc_pci_ops,
+       .io_resource    = &msc_io_resource,
+       .mem_resource   = &msc_mem_resource,
+};
+
+void __init mips_pcibios_init(void)
+{
+       struct pci_controller *controller;
+       resource_size_t start, end, map, start1, end1, map1, map2, map3, mask;
+
+       switch (mips_revision_sconid) {
+       case MIPS_REVISION_SCON_GT64120:
+               /*
+                * Due to a bug in the Galileo system controller, we need
+                * to setup the PCI BAR for the Galileo internal registers.
+                * This should be done in the bios/bootprom and will be
+                * fixed in a later revision of YAMON (the MIPS boards
+                * boot prom).
+                */
+               GT_WRITE(GT_PCI0_CFGADDR_OFS,
+                        (0 << GT_PCI0_CFGADDR_BUSNUM_SHF) | /* Local bus */
+                        (0 << GT_PCI0_CFGADDR_DEVNUM_SHF) | /* GT64120 dev */
+                        (0 << GT_PCI0_CFGADDR_FUNCTNUM_SHF) | /* Function 0*/
+                        ((0x20/4) << GT_PCI0_CFGADDR_REGNUM_SHF) | /* BAR 4*/
+                        GT_PCI0_CFGADDR_CONFIGEN_BIT);
+
+               /* Perform the write */
+               GT_WRITE(GT_PCI0_CFGDATA_OFS, CPHYSADDR(MIPS_GT_BASE));
+
+               /* Set up resource ranges from the controller's registers.  */
+               start = GT_READ(GT_PCI0M0LD_OFS);
+               end = GT_READ(GT_PCI0M0HD_OFS);
+               map = GT_READ(GT_PCI0M0REMAP_OFS);
+               end = (end & GT_PCI_HD_MSK) | (start & ~GT_PCI_HD_MSK);
+               start1 = GT_READ(GT_PCI0M1LD_OFS);
+               end1 = GT_READ(GT_PCI0M1HD_OFS);
+               map1 = GT_READ(GT_PCI0M1REMAP_OFS);
+               end1 = (end1 & GT_PCI_HD_MSK) | (start1 & ~GT_PCI_HD_MSK);
+               /* Cannot support multiple windows, use the wider.  */
+               if (end1 - start1 > end - start) {
+                       start = start1;
+                       end = end1;
+                       map = map1;
+               }
+               mask = ~(start ^ end);
+                /* We don't support remapping with a discontiguous mask.  */
+               BUG_ON((start & GT_PCI_HD_MSK) != (map & GT_PCI_HD_MSK) &&
+                      mask != ~((mask & -mask) - 1));
+               gt64120_mem_resource.start = start;
+               gt64120_mem_resource.end = end;
+               gt64120_controller.mem_offset = (start & mask) - (map & mask);
+               /* Addresses are 36-bit, so do shifts in the destinations.  */
+               gt64120_mem_resource.start <<= GT_PCI_DCRM_SHF;
+               gt64120_mem_resource.end <<= GT_PCI_DCRM_SHF;
+               gt64120_mem_resource.end |= (1 << GT_PCI_DCRM_SHF) - 1;
+               gt64120_controller.mem_offset <<= GT_PCI_DCRM_SHF;
+
+               start = GT_READ(GT_PCI0IOLD_OFS);
+               end = GT_READ(GT_PCI0IOHD_OFS);
+               map = GT_READ(GT_PCI0IOREMAP_OFS);
+               end = (end & GT_PCI_HD_MSK) | (start & ~GT_PCI_HD_MSK);
+               mask = ~(start ^ end);
+                /* We don't support remapping with a discontiguous mask.  */
+               BUG_ON((start & GT_PCI_HD_MSK) != (map & GT_PCI_HD_MSK) &&
+                      mask != ~((mask & -mask) - 1));
+               gt64120_io_resource.start = map & mask;
+               gt64120_io_resource.end = (map & mask) | ~mask;
+               gt64120_controller.io_offset = 0;
+               /* Addresses are 36-bit, so do shifts in the destinations.  */
+               gt64120_io_resource.start <<= GT_PCI_DCRM_SHF;
+               gt64120_io_resource.end <<= GT_PCI_DCRM_SHF;
+               gt64120_io_resource.end |= (1 << GT_PCI_DCRM_SHF) - 1;
+
+               controller = &gt64120_controller;
+               break;
+
+       case MIPS_REVISION_SCON_BONITO:
+               /* Set up resource ranges from the controller's registers.  */
+               map = BONITO_PCIMAP;
+               map1 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO0) >>
+                      BONITO_PCIMAP_PCIMAP_LO0_SHIFT;
+               map2 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO1) >>
+                      BONITO_PCIMAP_PCIMAP_LO1_SHIFT;
+               map3 = (BONITO_PCIMAP & BONITO_PCIMAP_PCIMAP_LO2) >>
+                      BONITO_PCIMAP_PCIMAP_LO2_SHIFT;
+               /* Combine as many adjacent windows as possible.  */
+               map = map1;
+               start = BONITO_PCILO0_BASE;
+               end = 1;
+               if (map3 == map2 + 1) {
+                       map = map2;
+                       start = BONITO_PCILO1_BASE;
+                       end++;
+               }
+               if (map2 == map1 + 1) {
+                       map = map1;
+                       start = BONITO_PCILO0_BASE;
+                       end++;
+               }
+               bonito64_mem_resource.start = start;
+               bonito64_mem_resource.end = start +
+                                           BONITO_PCIMAP_WINBASE(end) - 1;
+               bonito64_controller.mem_offset = start -
+                                                BONITO_PCIMAP_WINBASE(map);
+
+               controller = &bonito64_controller;
+               break;
+
+       case MIPS_REVISION_SCON_SOCIT:
+       case MIPS_REVISION_SCON_ROCIT:
+       case MIPS_REVISION_SCON_SOCITSC:
+       case MIPS_REVISION_SCON_SOCITSCP:
+               /* Set up resource ranges from the controller's registers.  */
+               MSC_READ(MSC01_PCI_SC2PMBASL, start);
+               MSC_READ(MSC01_PCI_SC2PMMSKL, mask);
+               MSC_READ(MSC01_PCI_SC2PMMAPL, map);
+               msc_mem_resource.start = start & mask;
+               msc_mem_resource.end = (start & mask) | ~mask;
+               msc_controller.mem_offset = (start & mask) - (map & mask);
+
+               MSC_READ(MSC01_PCI_SC2PIOBASL, start);
+               MSC_READ(MSC01_PCI_SC2PIOMSKL, mask);
+               MSC_READ(MSC01_PCI_SC2PIOMAPL, map);
+               msc_io_resource.start = map & mask;
+               msc_io_resource.end = (map & mask) | ~mask;
+               msc_controller.io_offset = 0;
+               ioport_resource.end = ~mask;
+
+               /* If ranges overlap I/O takes precedence.  */
+               start = start & mask;
+               end = start | ~mask;
+               if ((start >= msc_mem_resource.start &&
+                    start <= msc_mem_resource.end) ||
+                   (end >= msc_mem_resource.start &&
+                    end <= msc_mem_resource.end)) {
+                       /* Use the larger space.  */
+                       start = max(start, msc_mem_resource.start);
+                       end = min(end, msc_mem_resource.end);
+                       if (start - msc_mem_resource.start >=
+                           msc_mem_resource.end - end)
+                               msc_mem_resource.end = start - 1;
+                       else
+                               msc_mem_resource.start = end + 1;
+               }
+
+               controller = &msc_controller;
+               break;
+       default:
+               return;
+       }
+
+       if (controller->io_resource->start < 0x00001000UL)      /* FIXME */
+               controller->io_resource->start = 0x00001000UL;
+
+       iomem_resource.end &= 0xfffffffffULL;                   /* 64 GB */
+       ioport_resource.end = controller->io_resource->end;
+
+       register_pci_controller(controller);
+}
diff --git a/arch/mips/mti-malta/malta-platform.c b/arch/mips/mti-malta/malta-platform.c
new file mode 100644 (file)
index 0000000..83b9bab
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2007 MIPS Technologies, Inc.
+ *   written by Ralf Baechle (ralf@linux-mips.org)
+ *
+ * Probe driver for the Malta's UART ports:
+ *
+ *   o 2 ports in the SMC SuperIO
+ *   o 1 port in the CBUS UART, a discrete 16550 which normally is only used
+ *     for bringups.
+ *
+ * We don't use 8250_platform.c on Malta as it would result in the CBUS
+ * UART becoming ttyS0.
+ */
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/serial_8250.h>
+
+#define SMC_PORT(base, int)                                            \
+{                                                                      \
+       .iobase         = base,                                         \
+       .irq            = int,                                          \
+       .uartclk        = 1843200,                                      \
+       .iotype         = UPIO_PORT,                                    \
+       .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,            \
+       .regshift       = 0,                                            \
+}
+
+#define CBUS_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP)
+
+static struct plat_serial8250_port uart8250_data[] = {
+       SMC_PORT(0x3F8, 4),
+       SMC_PORT(0x2F8, 3),
+       {
+               .mapbase        = 0x1f000900,   /* The CBUS UART */
+               .irq            = MIPS_CPU_IRQ_BASE + 2,
+               .uartclk        = 3686400,      /* Twice the usual clk! */
+               .iotype         = UPIO_MEM32,
+               .flags          = CBUS_UART_FLAGS,
+               .regshift       = 3,
+       },
+       { },
+};
+
+static struct platform_device uart8250_device = {
+       .name                   = "serial8250",
+       .id                     = PLAT8250_DEV_PLATFORM2,
+       .dev                    = {
+               .platform_data  = uart8250_data,
+       },
+};
+
+static int __init uart8250_init(void)
+{
+       return platform_device_register(&uart8250_device);
+}
+
+module_init(uart8250_init);
+
+MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("8250 UART probe driver for the Malta CBUS UART");
diff --git a/arch/mips/mti-malta/malta-reset.c b/arch/mips/mti-malta/malta-reset.c
new file mode 100644 (file)
index 0000000..42dee4d
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ * ########################################################################
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * ########################################################################
+ *
+ * Reset the MIPS boards.
+ *
+ */
+#include <linux/pm.h>
+
+#include <asm/io.h>
+#include <asm/reboot.h>
+#include <asm/mips-boards/generic.h>
+
+static void mips_machine_restart(char *command);
+static void mips_machine_halt(void);
+
+static void mips_machine_restart(char *command)
+{
+       unsigned int __iomem *softres_reg =
+               ioremap(SOFTRES_REG, sizeof(unsigned int));
+
+       __raw_writel(GORESET, softres_reg);
+}
+
+static void mips_machine_halt(void)
+{
+       unsigned int __iomem *softres_reg =
+               ioremap(SOFTRES_REG, sizeof(unsigned int));
+
+       __raw_writel(GORESET, softres_reg);
+}
+
+
+void mips_reboot_setup(void)
+{
+       _machine_restart = mips_machine_restart;
+       _machine_halt = mips_machine_halt;
+       pm_power_off = mips_machine_halt;
+}
diff --git a/arch/mips/mti-malta/malta-setup.c b/arch/mips/mti-malta/malta-setup.c
new file mode 100644 (file)
index 0000000..e7cad54
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
+ * Copyright (C) 2008 Dmitri Vorobiev
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ */
+#include <linux/cpu.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/ioport.h>
+#include <linux/irq.h>
+#include <linux/pci.h>
+#include <linux/screen_info.h>
+#include <linux/time.h>
+
+#include <asm/bootinfo.h>
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/prom.h>
+#include <asm/mips-boards/malta.h>
+#include <asm/mips-boards/maltaint.h>
+#include <asm/dma.h>
+#include <asm/traps.h>
+#ifdef CONFIG_VT
+#include <linux/console.h>
+#endif
+
+extern void malta_be_init(void);
+extern int malta_be_handler(struct pt_regs *regs, int is_fixup);
+
+static struct resource standard_io_resources[] = {
+       {
+               .name = "dma1",
+               .start = 0x00,
+               .end = 0x1f,
+               .flags = IORESOURCE_BUSY
+       },
+       {
+               .name = "timer",
+               .start = 0x40,
+               .end = 0x5f,
+               .flags = IORESOURCE_BUSY
+       },
+       {
+               .name = "keyboard",
+               .start = 0x60,
+               .end = 0x6f,
+               .flags = IORESOURCE_BUSY
+       },
+       {
+               .name = "dma page reg",
+               .start = 0x80,
+               .end = 0x8f,
+               .flags = IORESOURCE_BUSY
+       },
+       {
+               .name = "dma2",
+               .start = 0xc0,
+               .end = 0xdf,
+               .flags = IORESOURCE_BUSY
+       },
+};
+
+const char *get_system_type(void)
+{
+       return "MIPS Malta";
+}
+
+#if defined(CONFIG_MIPS_MT_SMTC)
+const char display_string[] = "       SMTC LINUX ON MALTA       ";
+#else
+const char display_string[] = "        LINUX ON MALTA       ";
+#endif /* CONFIG_MIPS_MT_SMTC */
+
+#ifdef CONFIG_BLK_DEV_FD
+static void __init fd_activate(void)
+{
+       /*
+        * Activate Floppy Controller in the SMSC FDC37M817 Super I/O
+        * Controller.
+        * Done by YAMON 2.00 onwards
+        */
+       /* Entering config state. */
+       SMSC_WRITE(SMSC_CONFIG_ENTER, SMSC_CONFIG_REG);
+
+       /* Activate floppy controller. */
+       SMSC_WRITE(SMSC_CONFIG_DEVNUM, SMSC_CONFIG_REG);
+       SMSC_WRITE(SMSC_CONFIG_DEVNUM_FLOPPY, SMSC_DATA_REG);
+       SMSC_WRITE(SMSC_CONFIG_ACTIVATE, SMSC_CONFIG_REG);
+       SMSC_WRITE(SMSC_CONFIG_ACTIVATE_ENABLE, SMSC_DATA_REG);
+
+       /* Exit config state. */
+       SMSC_WRITE(SMSC_CONFIG_EXIT, SMSC_CONFIG_REG);
+}
+#endif
+
+#ifdef CONFIG_BLK_DEV_IDE
+static void __init pci_clock_check(void)
+{
+       unsigned int __iomem *jmpr_p =
+               (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
+       int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07;
+       static const int pciclocks[] __initdata = {
+               33, 20, 25, 30, 12, 16, 37, 10
+       };
+       int pciclock = pciclocks[jmpr];
+       char *argptr = prom_getcmdline();
+
+       if (pciclock != 33 && !strstr(argptr, "idebus=")) {
+               printk(KERN_WARNING "WARNING: PCI clock is %dMHz, "
+                               "setting idebus\n", pciclock);
+               argptr += strlen(argptr);
+               sprintf(argptr, " idebus=%d", pciclock);
+               if (pciclock < 20 || pciclock > 66)
+                       printk(KERN_WARNING "WARNING: IDE timing "
+                                       "calculations will be incorrect\n");
+       }
+}
+#endif
+
+#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
+static void __init screen_info_setup(void)
+{
+       screen_info = (struct screen_info) {
+               .orig_x = 0,
+               .orig_y = 25,
+               .ext_mem_k = 0,
+               .orig_video_page = 0,
+               .orig_video_mode = 0,
+               .orig_video_cols = 80,
+               .unused2 = 0,
+               .orig_video_ega_bx = 0,
+               .unused3 = 0,
+               .orig_video_lines = 25,
+               .orig_video_isVGA = VIDEO_TYPE_VGAC,
+               .orig_video_points = 16
+       };
+}
+#endif
+
+static void __init bonito_quirks_setup(void)
+{
+       char *argptr;
+
+       argptr = prom_getcmdline();
+       if (strstr(argptr, "debug")) {
+               BONITO_BONGENCFG |= BONITO_BONGENCFG_DEBUGMODE;
+               printk(KERN_INFO "Enabled Bonito debug mode\n");
+       } else
+               BONITO_BONGENCFG &= ~BONITO_BONGENCFG_DEBUGMODE;
+
+#ifdef CONFIG_DMA_COHERENT
+       if (BONITO_PCICACHECTRL & BONITO_PCICACHECTRL_CPUCOH_PRES) {
+               BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_CPUCOH_EN;
+               printk(KERN_INFO "Enabled Bonito CPU coherency\n");
+
+               argptr = prom_getcmdline();
+               if (strstr(argptr, "iobcuncached")) {
+                       BONITO_PCICACHECTRL &= ~BONITO_PCICACHECTRL_IOBCCOH_EN;
+                       BONITO_PCIMEMBASECFG = BONITO_PCIMEMBASECFG &
+                               ~(BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
+                                       BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
+                       printk(KERN_INFO "Disabled Bonito IOBC coherency\n");
+               } else {
+                       BONITO_PCICACHECTRL |= BONITO_PCICACHECTRL_IOBCCOH_EN;
+                       BONITO_PCIMEMBASECFG |=
+                               (BONITO_PCIMEMBASECFG_MEMBASE0_CACHED |
+                                       BONITO_PCIMEMBASECFG_MEMBASE1_CACHED);
+                       printk(KERN_INFO "Enabled Bonito IOBC coherency\n");
+               }
+       } else
+               panic("Hardware DMA cache coherency not supported");
+#endif
+}
+
+void __init plat_mem_setup(void)
+{
+       unsigned int i;
+
+       mips_pcibios_init();
+
+       /* Request I/O space for devices used on the Malta board. */
+       for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++)
+               request_resource(&ioport_resource, standard_io_resources+i);
+
+       /*
+        * Enable DMA channel 4 (cascade channel) in the PIIX4 south bridge.
+        */
+       enable_dma(4);
+
+#ifdef CONFIG_KGDB
+       kgdb_config();
+#endif
+
+#ifdef CONFIG_DMA_COHERENT
+       if (mips_revision_sconid != MIPS_REVISION_SCON_BONITO)
+               panic("Hardware DMA cache coherency not supported");
+#endif
+
+       if (mips_revision_sconid == MIPS_REVISION_SCON_BONITO)
+               bonito_quirks_setup();
+
+#ifdef CONFIG_BLK_DEV_IDE
+       pci_clock_check();
+#endif
+
+#ifdef CONFIG_BLK_DEV_FD
+       fd_activate();
+#endif
+
+#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
+       screen_info_setup();
+#endif
+       mips_reboot_setup();
+
+       board_be_init = malta_be_init;
+       board_be_handler = malta_be_handler;
+}
diff --git a/arch/mips/mti-malta/malta-smtc.c b/arch/mips/mti-malta/malta-smtc.c
new file mode 100644 (file)
index 0000000..5ea705e
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Malta Platform-specific hooks for SMP operation
+ */
+#include <linux/irq.h>
+#include <linux/init.h>
+
+#include <asm/mipsregs.h>
+#include <asm/mipsmtregs.h>
+#include <asm/smtc.h>
+#include <asm/smtc_ipi.h>
+
+/* VPE/SMP Prototype implements platform interfaces directly */
+
+/*
+ * Cause the specified action to be performed on a targeted "CPU"
+ */
+
+static void msmtc_send_ipi_single(int cpu, unsigned int action)
+{
+       /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */
+       smtc_send_ipi(cpu, LINUX_SMP_IPI, action);
+}
+
+static void msmtc_send_ipi_mask(cpumask_t mask, unsigned int action)
+{
+       unsigned int i;
+
+       for_each_cpu_mask(i, mask)
+               msmtc_send_ipi_single(i, action);
+}
+
+/*
+ * Post-config but pre-boot cleanup entry point
+ */
+static void __cpuinit msmtc_init_secondary(void)
+{
+       void smtc_init_secondary(void);
+       int myvpe;
+
+       /* Don't enable Malta I/O interrupts (IP2) for secondary VPEs */
+       myvpe = read_c0_tcbind() & TCBIND_CURVPE;
+       if (myvpe != 0) {
+               /* Ideally, this should be done only once per VPE, but... */
+               clear_c0_status(ST0_IM);
+               set_c0_status((0x100 << cp0_compare_irq)
+                               | (0x100 << MIPS_CPU_IPI_IRQ));
+               if (cp0_perfcount_irq >= 0)
+                       set_c0_status(0x100 << cp0_perfcount_irq);
+       }
+
+       smtc_init_secondary();
+}
+
+/*
+ * Platform "CPU" startup hook
+ */
+static void __cpuinit msmtc_boot_secondary(int cpu, struct task_struct *idle)
+{
+       smtc_boot_secondary(cpu, idle);
+}
+
+/*
+ * SMP initialization finalization entry point
+ */
+static void __cpuinit msmtc_smp_finish(void)
+{
+       smtc_smp_finish();
+}
+
+/*
+ * Hook for after all CPUs are online
+ */
+
+static void msmtc_cpus_done(void)
+{
+}
+
+/*
+ * Platform SMP pre-initialization
+ *
+ * As noted above, we can assume a single CPU for now
+ * but it may be multithreaded.
+ */
+
+static void __init msmtc_smp_setup(void)
+{
+       mipsmt_build_cpu_map(0);
+}
+
+static void __init msmtc_prepare_cpus(unsigned int max_cpus)
+{
+       mipsmt_prepare_cpus();
+}
+
+struct plat_smp_ops msmtc_smp_ops = {
+       .send_ipi_single        = msmtc_send_ipi_single,
+       .send_ipi_mask          = msmtc_send_ipi_mask,
+       .init_secondary         = msmtc_init_secondary,
+       .smp_finish             = msmtc_smp_finish,
+       .cpus_done              = msmtc_cpus_done,
+       .boot_secondary         = msmtc_boot_secondary,
+       .smp_setup              = msmtc_smp_setup,
+       .prepare_cpus           = msmtc_prepare_cpus,
+};
+
+#ifdef CONFIG_MIPS_MT_SMTC_IRQAFF
+/*
+ * IRQ affinity hook
+ */
+
+
+void plat_set_irq_affinity(unsigned int irq, cpumask_t affinity)
+{
+       cpumask_t tmask = affinity;
+       int cpu = 0;
+       void smtc_set_irq_affinity(unsigned int irq, cpumask_t aff);
+
+       /*
+        * On the legacy Malta development board, all I/O interrupts
+        * are routed through the 8259 and combined in a single signal
+        * to the CPU daughterboard, and on the CoreFPGA2/3 34K models,
+        * that signal is brought to IP2 of both VPEs. To avoid racing
+        * concurrent interrupt service events, IP2 is enabled only on
+        * one VPE, by convention VPE0.  So long as no bits are ever
+        * cleared in the affinity mask, there will never be any
+        * interrupt forwarding.  But as soon as a program or operator
+        * sets affinity for one of the related IRQs, we need to make
+        * sure that we don't ever try to forward across the VPE boundry,
+        * at least not until we engineer a system where the interrupt
+        * _ack() or _end() function can somehow know that it corresponds
+        * to an interrupt taken on another VPE, and perform the appropriate
+        * restoration of Status.IM state using MFTR/MTTR instead of the
+        * normal local behavior. We also ensure that no attempt will
+        * be made to forward to an offline "CPU".
+        */
+
+       for_each_cpu_mask(cpu, affinity) {
+               if ((cpu_data[cpu].vpe_id != 0) || !cpu_online(cpu))
+                       cpu_clear(cpu, tmask);
+       }
+       irq_desc[irq].affinity = tmask;
+
+       if (cpus_empty(tmask))
+               /*
+                * We could restore a default mask here, but the
+                * runtime code can anyway deal with the null set
+                */
+               printk(KERN_WARNING
+                       "IRQ affinity leaves no legal CPU for IRQ %d\n", irq);
+
+       /* Do any generic SMTC IRQ affinity setup */
+       smtc_set_irq_affinity(irq, tmask);
+}
+#endif /* CONFIG_MIPS_MT_SMTC_IRQAFF */
diff --git a/arch/mips/mti-malta/malta-time.c b/arch/mips/mti-malta/malta-time.c
new file mode 100644 (file)
index 0000000..0b97d47
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Setting up the clock on the MIPS boards.
+ */
+
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/kernel_stat.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/time.h>
+#include <linux/timex.h>
+#include <linux/mc146818rtc.h>
+
+#include <asm/mipsregs.h>
+#include <asm/mipsmtregs.h>
+#include <asm/hardirq.h>
+#include <asm/i8253.h>
+#include <asm/irq.h>
+#include <asm/div64.h>
+#include <asm/cpu.h>
+#include <asm/time.h>
+#include <asm/mc146818-time.h>
+#include <asm/msc01_ic.h>
+
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/prom.h>
+
+#include <asm/mips-boards/maltaint.h>
+
+unsigned long cpu_khz;
+
+static int mips_cpu_timer_irq;
+static int mips_cpu_perf_irq;
+extern int cp0_perfcount_irq;
+
+static void mips_timer_dispatch(void)
+{
+       do_IRQ(mips_cpu_timer_irq);
+}
+
+static void mips_perf_dispatch(void)
+{
+       do_IRQ(mips_cpu_perf_irq);
+}
+
+/*
+ * Estimate CPU frequency.  Sets mips_hpt_frequency as a side-effect
+ */
+static unsigned int __init estimate_cpu_frequency(void)
+{
+       unsigned int prid = read_c0_prid() & 0xffff00;
+       unsigned int count;
+
+       unsigned long flags;
+       unsigned int start;
+
+       local_irq_save(flags);
+
+       /* Start counter exactly on falling edge of update flag */
+       while (CMOS_READ(RTC_REG_A) & RTC_UIP);
+       while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
+
+       /* Start r4k counter. */
+       start = read_c0_count();
+
+       /* Read counter exactly on falling edge of update flag */
+       while (CMOS_READ(RTC_REG_A) & RTC_UIP);
+       while (!(CMOS_READ(RTC_REG_A) & RTC_UIP));
+
+       count = read_c0_count() - start;
+
+       /* restore interrupts */
+       local_irq_restore(flags);
+
+       mips_hpt_frequency = count;
+       if ((prid != (PRID_COMP_MIPS | PRID_IMP_20KC)) &&
+           (prid != (PRID_COMP_MIPS | PRID_IMP_25KF)))
+               count *= 2;
+
+       count += 5000;    /* round */
+       count -= count%10000;
+
+       return count;
+}
+
+unsigned long read_persistent_clock(void)
+{
+       return mc146818_get_cmos_time();
+}
+
+static void __init plat_perf_setup(void)
+{
+#ifdef MSC01E_INT_BASE
+       if (cpu_has_veic) {
+               set_vi_handler(MSC01E_INT_PERFCTR, mips_perf_dispatch);
+               mips_cpu_perf_irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR;
+       } else
+#endif
+       if (cp0_perfcount_irq >= 0) {
+               if (cpu_has_vint)
+                       set_vi_handler(cp0_perfcount_irq, mips_perf_dispatch);
+               mips_cpu_perf_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq;
+#ifdef CONFIG_SMP
+               set_irq_handler(mips_cpu_perf_irq, handle_percpu_irq);
+#endif
+       }
+}
+
+unsigned int __cpuinit get_c0_compare_int(void)
+{
+#ifdef MSC01E_INT_BASE
+       if (cpu_has_veic) {
+               set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch);
+               mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR;
+       } else
+#endif
+       {
+               if (cpu_has_vint)
+                       set_vi_handler(cp0_compare_irq, mips_timer_dispatch);
+               mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
+       }
+
+       return mips_cpu_timer_irq;
+}
+
+void __init plat_time_init(void)
+{
+       unsigned int est_freq;
+
+        /* Set Data mode - binary. */
+        CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL);
+
+       est_freq = estimate_cpu_frequency();
+
+       printk("CPU frequency %d.%02d MHz\n", est_freq/1000000,
+              (est_freq%1000000)*100/1000000);
+
+        cpu_khz = est_freq / 1000;
+
+       mips_scroll_message();
+#ifdef CONFIG_I8253            /* Only Malta has a PIT */
+       setup_pit_timer();
+#endif
+
+       plat_perf_setup();
+}
diff --git a/include/asm-mips/mach-malta/cpu-feature-overrides.h b/include/asm-mips/mach-malta/cpu-feature-overrides.h
new file mode 100644 (file)
index 0000000..7f3e3f9
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2003, 2004 Chris Dearman
+ * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
+ */
+#ifndef __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H
+#define __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H
+
+
+/*
+ * CPU feature overrides for MIPS boards
+ */
+#ifdef CONFIG_CPU_MIPS32
+#define cpu_has_tlb            1
+#define cpu_has_4kex           1
+#define cpu_has_4k_cache       1
+/* #define cpu_has_fpu         ? */
+/* #define cpu_has_32fpr       ? */
+#define cpu_has_counter                1
+/* #define cpu_has_watch       ? */
+#define cpu_has_divec          1
+#define cpu_has_vce            0
+/* #define cpu_has_cache_cdex_p        ? */
+/* #define cpu_has_cache_cdex_s        ? */
+/* #define cpu_has_prefetch    ? */
+#define cpu_has_mcheck         1
+/* #define cpu_has_ejtag       ? */
+#ifdef CONFIG_CPU_HAS_LLSC
+#define cpu_has_llsc           1
+#else
+#define cpu_has_llsc           0
+#endif
+/* #define cpu_has_vtag_icache ? */
+/* #define cpu_has_dc_aliases  ? */
+/* #define cpu_has_ic_fills_f_dc ? */
+#define cpu_has_nofpuex                0
+/* #define cpu_has_64bits      ? */
+/* #define cpu_has_64bit_zero_reg ? */
+/* #define cpu_has_inclusive_pcaches ? */
+#define cpu_icache_snoops_remote_store 1
+#endif
+
+#ifdef CONFIG_CPU_MIPS64
+#define cpu_has_tlb            1
+#define cpu_has_4kex           1
+#define cpu_has_4k_cache       1
+/* #define cpu_has_fpu         ? */
+/* #define cpu_has_32fpr       ? */
+#define cpu_has_counter                1
+/* #define cpu_has_watch       ? */
+#define cpu_has_divec          1
+#define cpu_has_vce            0
+/* #define cpu_has_cache_cdex_p        ? */
+/* #define cpu_has_cache_cdex_s        ? */
+/* #define cpu_has_prefetch    ? */
+#define cpu_has_mcheck         1
+/* #define cpu_has_ejtag       ? */
+#define cpu_has_llsc           1
+/* #define cpu_has_vtag_icache ? */
+/* #define cpu_has_dc_aliases  ? */
+/* #define cpu_has_ic_fills_f_dc ? */
+#define cpu_has_nofpuex                0
+/* #define cpu_has_64bits      ? */
+/* #define cpu_has_64bit_zero_reg ? */
+/* #define cpu_has_inclusive_pcaches ? */
+#define cpu_icache_snoops_remote_store 1
+#endif
+
+#endif /* __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H */
diff --git a/include/asm-mips/mach-malta/irq.h b/include/asm-mips/mach-malta/irq.h
new file mode 100644 (file)
index 0000000..9b9da26
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __ASM_MACH_MIPS_IRQ_H
+#define __ASM_MACH_MIPS_IRQ_H
+
+
+#define NR_IRQS        256
+
+#include_next <irq.h>
+
+#endif /* __ASM_MACH_MIPS_IRQ_H */
diff --git a/include/asm-mips/mach-malta/kernel-entry-init.h b/include/asm-mips/mach-malta/kernel-entry-init.h
new file mode 100644 (file)
index 0000000..0b793e7
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Chris Dearman (chris@mips.com)
+ * Copyright (C) 2007 Mips Technologies, Inc.
+ */
+#ifndef __ASM_MACH_MIPS_KERNEL_ENTRY_INIT_H
+#define __ASM_MACH_MIPS_KERNEL_ENTRY_INIT_H
+
+       .macro  kernel_entry_setup
+#ifdef CONFIG_MIPS_MT_SMTC
+       mfc0    t0, CP0_CONFIG
+       bgez    t0, 9f
+       mfc0    t0, CP0_CONFIG, 1
+       bgez    t0, 9f
+       mfc0    t0, CP0_CONFIG, 2
+       bgez    t0, 9f
+       mfc0    t0, CP0_CONFIG, 3
+       and     t0, 1<<2
+       bnez    t0, 0f
+9:
+       /* Assume we came from YAMON... */
+       PTR_LA  v0, 0x9fc00534  /* YAMON print */
+       lw      v0, (v0)
+       move    a0, zero
+       PTR_LA  a1, nonmt_processor
+       jal     v0
+
+       PTR_LA  v0, 0x9fc00520  /* YAMON exit */
+       lw      v0, (v0)
+       li      a0, 1
+       jal     v0
+
+1:     b       1b
+
+       __INITDATA
+nonmt_processor:
+       .asciz  "SMTC kernel requires the MT ASE to run\n"
+       __FINIT
+0:
+#endif
+       .endm
+
+/*
+ * Do SMP slave processor setup necessary before we can safely execute C code.
+ */
+       .macro  smp_slave_setup
+       .endm
+
+#endif /* __ASM_MACH_MIPS_KERNEL_ENTRY_INIT_H */
diff --git a/include/asm-mips/mach-malta/mach-gt64120.h b/include/asm-mips/mach-malta/mach-gt64120.h
new file mode 100644 (file)
index 0000000..0f86314
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ *  This is a direct copy of the ev96100.h file, with a global
+ * search and replace.  The numbers are the same.
+ *
+ *  The reason I'm duplicating this is so that the 64120/96100
+ * defines won't be confusing in the source code.
+ */
+#ifndef _ASM_MACH_MIPS_MACH_GT64120_DEP_H
+#define _ASM_MACH_MIPS_MACH_GT64120_DEP_H
+
+#define MIPS_GT_BASE   0x1be00000
+
+extern unsigned long _pcictrl_gt64120;
+/*
+ *   GT64120 config space base address
+ */
+#define GT64120_BASE   _pcictrl_gt64120
+
+#endif /* _ASM_MACH_MIPS_MACH_GT64120_DEP_H */
diff --git a/include/asm-mips/mach-malta/mc146818rtc.h b/include/asm-mips/mach-malta/mc146818rtc.h
new file mode 100644 (file)
index 0000000..ea612f3
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ * Copyright (C) 2003 by Ralf Baechle
+ *
+ * This program is free software; you can distribute it and/or modify it
+ * under the terms of the GNU General Public License (Version 2) as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * RTC routines for Malta style attached PIIX4 device, which contains a
+ * Motorola MC146818A-compatible Real Time Clock.
+ */
+#ifndef __ASM_MACH_MALTA_MC146818RTC_H
+#define __ASM_MACH_MALTA_MC146818RTC_H
+
+#include <asm/io.h>
+#include <asm/mips-boards/generic.h>
+#include <asm/mips-boards/malta.h>
+
+#define RTC_PORT(x)    (0x70 + (x))
+#define RTC_IRQ                8
+
+static inline unsigned char CMOS_READ(unsigned long addr)
+{
+       outb(addr, MALTA_RTC_ADR_REG);
+       return inb(MALTA_RTC_DAT_REG);
+}
+
+static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
+{
+       outb(addr, MALTA_RTC_ADR_REG);
+       outb(data, MALTA_RTC_DAT_REG);
+}
+
+#define RTC_ALWAYS_BCD 0
+
+#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900)
+
+#endif /* __ASM_MACH_MALTA_MC146818RTC_H */
diff --git a/include/asm-mips/mach-malta/war.h b/include/asm-mips/mach-malta/war.h
new file mode 100644 (file)
index 0000000..7c6931d
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
+ */
+#ifndef __ASM_MIPS_MACH_MIPS_WAR_H
+#define __ASM_MIPS_MACH_MIPS_WAR_H
+
+#define R4600_V1_INDEX_ICACHEOP_WAR    0
+#define R4600_V1_HIT_CACHEOP_WAR       0
+#define R4600_V2_HIT_CACHEOP_WAR       0
+#define R5432_CP0_INTERRUPT_WAR                0
+#define BCM1250_M3_WAR                 0
+#define SIBYTE_1956_WAR                        0
+#define MIPS4K_ICACHE_REFILL_WAR       1
+#define MIPS_CACHE_SYNC_WAR            1
+#define TX49XX_ICACHE_INDEX_INV_WAR    0
+#define RM9000_CDEX_SMP_WAR            0
+#define ICACHE_REFILLS_WORKAROUND_WAR  1
+#define R10000_LLSC_WAR                        0
+#define MIPS34K_MISSED_ITLB_WAR                0
+
+#endif /* __ASM_MIPS_MACH_MIPS_WAR_H */
diff --git a/include/asm-mips/mach-mips/cpu-feature-overrides.h b/include/asm-mips/mach-mips/cpu-feature-overrides.h
deleted file mode 100644 (file)
index 7f3e3f9..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2003, 2004 Chris Dearman
- * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
- */
-#ifndef __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H
-#define __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H
-
-
-/*
- * CPU feature overrides for MIPS boards
- */
-#ifdef CONFIG_CPU_MIPS32
-#define cpu_has_tlb            1
-#define cpu_has_4kex           1
-#define cpu_has_4k_cache       1
-/* #define cpu_has_fpu         ? */
-/* #define cpu_has_32fpr       ? */
-#define cpu_has_counter                1
-/* #define cpu_has_watch       ? */
-#define cpu_has_divec          1
-#define cpu_has_vce            0
-/* #define cpu_has_cache_cdex_p        ? */
-/* #define cpu_has_cache_cdex_s        ? */
-/* #define cpu_has_prefetch    ? */
-#define cpu_has_mcheck         1
-/* #define cpu_has_ejtag       ? */
-#ifdef CONFIG_CPU_HAS_LLSC
-#define cpu_has_llsc           1
-#else
-#define cpu_has_llsc           0
-#endif
-/* #define cpu_has_vtag_icache ? */
-/* #define cpu_has_dc_aliases  ? */
-/* #define cpu_has_ic_fills_f_dc ? */
-#define cpu_has_nofpuex                0
-/* #define cpu_has_64bits      ? */
-/* #define cpu_has_64bit_zero_reg ? */
-/* #define cpu_has_inclusive_pcaches ? */
-#define cpu_icache_snoops_remote_store 1
-#endif
-
-#ifdef CONFIG_CPU_MIPS64
-#define cpu_has_tlb            1
-#define cpu_has_4kex           1
-#define cpu_has_4k_cache       1
-/* #define cpu_has_fpu         ? */
-/* #define cpu_has_32fpr       ? */
-#define cpu_has_counter                1
-/* #define cpu_has_watch       ? */
-#define cpu_has_divec          1
-#define cpu_has_vce            0
-/* #define cpu_has_cache_cdex_p        ? */
-/* #define cpu_has_cache_cdex_s        ? */
-/* #define cpu_has_prefetch    ? */
-#define cpu_has_mcheck         1
-/* #define cpu_has_ejtag       ? */
-#define cpu_has_llsc           1
-/* #define cpu_has_vtag_icache ? */
-/* #define cpu_has_dc_aliases  ? */
-/* #define cpu_has_ic_fills_f_dc ? */
-#define cpu_has_nofpuex                0
-/* #define cpu_has_64bits      ? */
-/* #define cpu_has_64bit_zero_reg ? */
-/* #define cpu_has_inclusive_pcaches ? */
-#define cpu_icache_snoops_remote_store 1
-#endif
-
-#endif /* __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H */
diff --git a/include/asm-mips/mach-mips/irq.h b/include/asm-mips/mach-mips/irq.h
deleted file mode 100644 (file)
index 9b9da26..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __ASM_MACH_MIPS_IRQ_H
-#define __ASM_MACH_MIPS_IRQ_H
-
-
-#define NR_IRQS        256
-
-#include_next <irq.h>
-
-#endif /* __ASM_MACH_MIPS_IRQ_H */
diff --git a/include/asm-mips/mach-mips/kernel-entry-init.h b/include/asm-mips/mach-mips/kernel-entry-init.h
deleted file mode 100644 (file)
index 0b793e7..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Chris Dearman (chris@mips.com)
- * Copyright (C) 2007 Mips Technologies, Inc.
- */
-#ifndef __ASM_MACH_MIPS_KERNEL_ENTRY_INIT_H
-#define __ASM_MACH_MIPS_KERNEL_ENTRY_INIT_H
-
-       .macro  kernel_entry_setup
-#ifdef CONFIG_MIPS_MT_SMTC
-       mfc0    t0, CP0_CONFIG
-       bgez    t0, 9f
-       mfc0    t0, CP0_CONFIG, 1
-       bgez    t0, 9f
-       mfc0    t0, CP0_CONFIG, 2
-       bgez    t0, 9f
-       mfc0    t0, CP0_CONFIG, 3
-       and     t0, 1<<2
-       bnez    t0, 0f
-9:
-       /* Assume we came from YAMON... */
-       PTR_LA  v0, 0x9fc00534  /* YAMON print */
-       lw      v0, (v0)
-       move    a0, zero
-       PTR_LA  a1, nonmt_processor
-       jal     v0
-
-       PTR_LA  v0, 0x9fc00520  /* YAMON exit */
-       lw      v0, (v0)
-       li      a0, 1
-       jal     v0
-
-1:     b       1b
-
-       __INITDATA
-nonmt_processor:
-       .asciz  "SMTC kernel requires the MT ASE to run\n"
-       __FINIT
-0:
-#endif
-       .endm
-
-/*
- * Do SMP slave processor setup necessary before we can safely execute C code.
- */
-       .macro  smp_slave_setup
-       .endm
-
-#endif /* __ASM_MACH_MIPS_KERNEL_ENTRY_INIT_H */
diff --git a/include/asm-mips/mach-mips/mach-gt64120.h b/include/asm-mips/mach-mips/mach-gt64120.h
deleted file mode 100644 (file)
index 0f86314..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  This is a direct copy of the ev96100.h file, with a global
- * search and replace.  The numbers are the same.
- *
- *  The reason I'm duplicating this is so that the 64120/96100
- * defines won't be confusing in the source code.
- */
-#ifndef _ASM_MACH_MIPS_MACH_GT64120_DEP_H
-#define _ASM_MACH_MIPS_MACH_GT64120_DEP_H
-
-#define MIPS_GT_BASE   0x1be00000
-
-extern unsigned long _pcictrl_gt64120;
-/*
- *   GT64120 config space base address
- */
-#define GT64120_BASE   _pcictrl_gt64120
-
-#endif /* _ASM_MACH_MIPS_MACH_GT64120_DEP_H */
diff --git a/include/asm-mips/mach-mips/mc146818rtc.h b/include/asm-mips/mach-mips/mc146818rtc.h
deleted file mode 100644 (file)
index ea612f3..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- * Copyright (C) 2003 by Ralf Baechle
- *
- * This program is free software; you can distribute it and/or modify it
- * under the terms of the GNU General Public License (Version 2) as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * RTC routines for Malta style attached PIIX4 device, which contains a
- * Motorola MC146818A-compatible Real Time Clock.
- */
-#ifndef __ASM_MACH_MALTA_MC146818RTC_H
-#define __ASM_MACH_MALTA_MC146818RTC_H
-
-#include <asm/io.h>
-#include <asm/mips-boards/generic.h>
-#include <asm/mips-boards/malta.h>
-
-#define RTC_PORT(x)    (0x70 + (x))
-#define RTC_IRQ                8
-
-static inline unsigned char CMOS_READ(unsigned long addr)
-{
-       outb(addr, MALTA_RTC_ADR_REG);
-       return inb(MALTA_RTC_DAT_REG);
-}
-
-static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
-{
-       outb(addr, MALTA_RTC_ADR_REG);
-       outb(data, MALTA_RTC_DAT_REG);
-}
-
-#define RTC_ALWAYS_BCD 0
-
-#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1900)
-
-#endif /* __ASM_MACH_MALTA_MC146818RTC_H */
diff --git a/include/asm-mips/mach-mips/war.h b/include/asm-mips/mach-mips/war.h
deleted file mode 100644 (file)
index 7c6931d..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
- */
-#ifndef __ASM_MIPS_MACH_MIPS_WAR_H
-#define __ASM_MIPS_MACH_MIPS_WAR_H
-
-#define R4600_V1_INDEX_ICACHEOP_WAR    0
-#define R4600_V1_HIT_CACHEOP_WAR       0
-#define R4600_V2_HIT_CACHEOP_WAR       0
-#define R5432_CP0_INTERRUPT_WAR                0
-#define BCM1250_M3_WAR                 0
-#define SIBYTE_1956_WAR                        0
-#define MIPS4K_ICACHE_REFILL_WAR       1
-#define MIPS_CACHE_SYNC_WAR            1
-#define TX49XX_ICACHE_INDEX_INV_WAR    0
-#define RM9000_CDEX_SMP_WAR            0
-#define ICACHE_REFILLS_WORKAROUND_WAR  1
-#define R10000_LLSC_WAR                        0
-#define MIPS34K_MISSED_ITLB_WAR                0
-
-#endif /* __ASM_MIPS_MACH_MIPS_WAR_H */