sh: Bring kgdb back from the dead.
[powerpc.git] / arch / sh / kernel / setup.c
index 225f9ea..f964904 100644 (file)
@@ -1,14 +1,11 @@
 /*
- *  linux/arch/sh/kernel/setup.c
+ * arch/sh/kernel/setup.c
  *
- *  Copyright (C) 1999  Niibe Yutaka
- *  Copyright (C) 2002, 2003  Paul Mundt
- */
-
-/*
  * This file handles the architecture-dependent parts of initialization
+ *
+ *  Copyright (C) 1999  Niibe Yutaka
+ *  Copyright (C) 2002 - 2006 Paul Mundt
  */
-
 #include <linux/screen_info.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <asm/setup.h>
 #include <asm/clock.h>
 
-#ifdef CONFIG_SH_KGDB
-#include <asm/kgdb.h>
-static int kgdb_parse_options(char *options);
-#endif
 extern void * __rd_start, * __rd_end;
+
 /*
  * Machine setup..
  */
@@ -75,7 +69,7 @@ static struct sh_machine_vector* __init get_mv_byname(const char* name);
 #define RAMDISK_PROMPT_FLAG            0x8000
 #define RAMDISK_LOAD_FLAG              0x4000
 
-static char command_line[COMMAND_LINE_SIZE] = { 0, };
+static char __initdata command_line[COMMAND_LINE_SIZE] = { 0, };
 
 static struct resource code_resource = { .name = "Kernel code", };
 static struct resource data_resource = { .name = "Kernel data", };
@@ -90,8 +84,8 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
        int len = 0;
 
        /* Save unparsed command line copy for /proc/cmdline */
-       memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
 
        memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START;
        memory_end = memory_start + __MEMORY_SIZE;
@@ -395,9 +389,9 @@ static const char *cpu_name[] = {
        [CPU_SH_NONE]   = "Unknown"
 };
 
-const char *get_cpu_subtype(void)
+const char *get_cpu_subtype(struct sh_cpuinfo *c)
 {
-       return cpu_name[boot_cpu_data.type];
+       return cpu_name[c->type];
 }
 
 #ifdef CONFIG_PROC_FS
@@ -407,19 +401,19 @@ static const char *cpu_flags[] = {
        "ptea", "llsc", "l2", NULL
 };
 
-static void show_cpuflags(struct seq_file *m)
+static void show_cpuflags(struct seq_file *m, struct sh_cpuinfo *c)
 {
        unsigned long i;
 
        seq_printf(m, "cpu flags\t:");
 
-       if (!cpu_data->flags) {
+       if (!c->flags) {
                seq_printf(m, " %s\n", cpu_flags[0]);
                return;
        }
 
        for (i = 0; cpu_flags[i]; i++)
-               if ((cpu_data->flags & (1 << i)))
+               if ((c->flags & (1 << i)))
                        seq_printf(m, " %s", cpu_flags[i+1]);
 
        seq_printf(m, "\n");
@@ -441,16 +435,20 @@ static void show_cacheinfo(struct seq_file *m, const char *type,
  */
 static int show_cpuinfo(struct seq_file *m, void *v)
 {
-       unsigned int cpu = smp_processor_id();
+       struct sh_cpuinfo *c = v;
+       unsigned int cpu = c - cpu_data;
+
+       if (!cpu_online(cpu))
+               return 0;
 
-       if (!cpu && cpu_online(cpu))
+       if (cpu == 0)
                seq_printf(m, "machine\t\t: %s\n", get_system_type());
 
        seq_printf(m, "processor\t: %d\n", cpu);
        seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine);
-       seq_printf(m, "cpu type\t: %s\n", get_cpu_subtype());
+       seq_printf(m, "cpu type\t: %s\n", get_cpu_subtype(c));
 
-       show_cpuflags(m);
+       show_cpuflags(m, c);
 
        seq_printf(m, "cache type\t: ");
 
@@ -459,22 +457,22 @@ static int show_cpuinfo(struct seq_file *m, void *v)
         * unified cache on the SH-2 and SH-3, as well as the harvard
         * style cache on the SH-4.
         */
-       if (boot_cpu_data.icache.flags & SH_CACHE_COMBINED) {
+       if (c->icache.flags & SH_CACHE_COMBINED) {
                seq_printf(m, "unified\n");
-               show_cacheinfo(m, "cache", boot_cpu_data.icache);
+               show_cacheinfo(m, "cache", c->icache);
        } else {
                seq_printf(m, "split (harvard)\n");
-               show_cacheinfo(m, "icache", boot_cpu_data.icache);
-               show_cacheinfo(m, "dcache", boot_cpu_data.dcache);
+               show_cacheinfo(m, "icache", c->icache);
+               show_cacheinfo(m, "dcache", c->dcache);
        }
 
        /* Optional secondary cache */
-       if (boot_cpu_data.flags & CPU_HAS_L2_CACHE)
-               show_cacheinfo(m, "scache", boot_cpu_data.scache);
+       if (c->flags & CPU_HAS_L2_CACHE)
+               show_cacheinfo(m, "scache", c->scache);
 
        seq_printf(m, "bogomips\t: %lu.%02lu\n",
-                    boot_cpu_data.loops_per_jiffy/(500000/HZ),
-                    (boot_cpu_data.loops_per_jiffy/(5000/HZ)) % 100);
+                    c->loops_per_jiffy/(500000/HZ),
+                    (c->loops_per_jiffy/(5000/HZ)) % 100);
 
        return show_clocks(m);
 }
@@ -498,92 +496,3 @@ struct seq_operations cpuinfo_op = {
        .show   = show_cpuinfo,
 };
 #endif /* CONFIG_PROC_FS */
-
-#ifdef CONFIG_SH_KGDB
-/*
- * Parse command-line kgdb options.  By default KGDB is enabled,
- * entered on error (or other action) using default serial info.
- * The command-line option can include a serial port specification
- * and an action to override default or configured behavior.
- */
-struct kgdb_sermap kgdb_sci_sermap =
-{ "ttySC", 5, kgdb_sci_setup, NULL };
-
-struct kgdb_sermap *kgdb_serlist = &kgdb_sci_sermap;
-struct kgdb_sermap *kgdb_porttype = &kgdb_sci_sermap;
-
-void kgdb_register_sermap(struct kgdb_sermap *map)
-{
-       struct kgdb_sermap *last;
-
-       for (last = kgdb_serlist; last->next; last = last->next)
-               ;
-       last->next = map;
-       if (!map->namelen) {
-               map->namelen = strlen(map->name);
-       }
-}
-
-static int __init kgdb_parse_options(char *options)
-{
-       char c;
-       int baud;
-
-       /* Check for port spec (or use default) */
-
-       /* Determine port type and instance */
-       if (!memcmp(options, "tty", 3)) {
-               struct kgdb_sermap *map = kgdb_serlist;
-
-               while (map && memcmp(options, map->name, map->namelen))
-                       map = map->next;
-
-               if (!map) {
-                       KGDB_PRINTK("unknown port spec in %s\n", options);
-                       return -1;
-               }
-
-               kgdb_porttype = map;
-               kgdb_serial_setup = map->setup_fn;
-               kgdb_portnum = options[map->namelen] - '0';
-               options += map->namelen + 1;
-
-               options = (*options == ',') ? options+1 : options;
-
-               /* Read optional parameters (baud/parity/bits) */
-               baud = simple_strtoul(options, &options, 10);
-               if (baud != 0) {
-                       kgdb_baud = baud;
-
-                       c = toupper(*options);
-                       if (c == 'E' || c == 'O' || c == 'N') {
-                               kgdb_parity = c;
-                               options++;
-                       }
-
-                       c = *options;
-                       if (c == '7' || c == '8') {
-                               kgdb_bits = c;
-                               options++;
-                       }
-                       options = (*options == ',') ? options+1 : options;
-               }
-       }
-
-       /* Check for action specification */
-       if (!memcmp(options, "halt", 4)) {
-               kgdb_halt = 1;
-               options += 4;
-       } else if (!memcmp(options, "disabled", 8)) {
-               kgdb_enabled = 0;
-               options += 8;
-       }
-
-       if (*options) {
-                KGDB_PRINTK("ignored unknown options: %s\n", options);
-               return 0;
-       }
-       return 1;
-}
-__setup("kgdb=", kgdb_parse_options);
-#endif /* CONFIG_SH_KGDB */