Pull button into test branch
[pandora-kernel.git] / arch / sh / kernel / setup.c
index 9af2211..225f9ea 100644 (file)
@@ -1,5 +1,4 @@
-/* $Id: setup.c,v 1.30 2003/10/13 07:21:19 lethal Exp $
- *
+/*
  *  linux/arch/sh/kernel/setup.c
  *
  *  Copyright (C) 1999  Niibe Yutaka
@@ -10,7 +9,7 @@
  * This file handles the architecture-dependent parts of initialization
  */
 
-#include <linux/tty.h>
+#include <linux/screen_info.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/initrd.h>
@@ -21,6 +20,7 @@
 #include <linux/utsname.h>
 #include <linux/cpu.h>
 #include <linux/pfn.h>
+#include <linux/fs.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/sections.h>
@@ -43,27 +43,14 @@ extern void * __rd_start, * __rd_end;
  * The bigger value means no problem.
  */
 struct sh_cpuinfo boot_cpu_data = { CPU_SH_NONE, 10000000, };
+#ifdef CONFIG_VT
 struct screen_info screen_info;
+#endif
 
 #if defined(CONFIG_SH_UNKNOWN)
 struct sh_machine_vector sh_mv;
 #endif
 
-/* We need this to satisfy some external references. */
-struct screen_info screen_info = {
-        0, 25,                  /* orig-x, orig-y */
-        0,                      /* unused */
-        0,                      /* orig-video-page */
-        0,                      /* orig-video-mode */
-        80,                     /* orig-video-cols */
-        0,0,0,                  /* ega_ax, ega_bx, ega_cx */
-        25,                     /* orig-video-lines */
-        0,                      /* orig-video-isVGA */
-        16                      /* orig-video-points */
-};
-
-extern void platform_setup(void);
-extern char *get_system_type(void);
 extern int root_mountflags;
 
 #define MV_NAME_SIZE 32
@@ -90,36 +77,14 @@ static struct sh_machine_vector* __init get_mv_byname(const char* name);
 
 static char command_line[COMMAND_LINE_SIZE] = { 0, };
 
-struct resource standard_io_resources[] = {
-       { "dma1", 0x00, 0x1f },
-       { "pic1", 0x20, 0x3f },
-       { "timer", 0x40, 0x5f },
-       { "keyboard", 0x60, 0x6f },
-       { "dma page reg", 0x80, 0x8f },
-       { "pic2", 0xa0, 0xbf },
-       { "dma2", 0xc0, 0xdf },
-       { "fpu", 0xf0, 0xff }
-};
-
-#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
-
-/* System RAM - interrupted by the 640kB-1M hole */
-#define code_resource (ram_resources[3])
-#define data_resource (ram_resources[4])
-static struct resource ram_resources[] = {
-       { "System RAM", 0x000000, 0x09ffff, IORESOURCE_BUSY },
-       { "System RAM", 0x100000, 0x100000, IORESOURCE_BUSY },
-       { "Video RAM area", 0x0a0000, 0x0bffff },
-       { "Kernel code", 0x100000, 0 },
-       { "Kernel data", 0, 0 }
-};
+static struct resource code_resource = { .name = "Kernel code", };
+static struct resource data_resource = { .name = "Kernel data", };
 
 unsigned long memory_start, memory_end;
 
 static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
                                  struct sh_machine_vector** mvp,
-                                 unsigned long *mv_io_base,
-                                 int *mv_mmio_enable)
+                                 unsigned long *mv_io_base)
 {
        char c = ' ', *to = command_line, *from = COMMAND_LINE;
        int len = 0;
@@ -145,6 +110,7 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
                                memory_end = memory_start + mem_size;
                        }
                }
+
                if (c == ' ' && !memcmp(from, "sh_mv=", 6)) {
                        char* mv_end;
                        char* mv_comma;
@@ -161,7 +127,6 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
                                int ints[3];
                                get_options(mv_comma+1, ARRAY_SIZE(ints), ints);
                                *mv_io_base = ints[1];
-                               *mv_mmio_enable = ints[2];
                                mv_len = mv_comma - from;
                        } else {
                                mv_len = mv_end - from;
@@ -174,6 +139,7 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
 
                        *mvp = get_mv_byname(mv_name);
                }
+
                c = *(from++);
                if (!c)
                        break;
@@ -193,9 +159,8 @@ static int __init sh_mv_setup(char **cmdline_p)
        struct sh_machine_vector *mv = NULL;
        char mv_name[MV_NAME_SIZE] = "";
        unsigned long mv_io_base = 0;
-       int mv_mmio_enable = 0;
 
-       parse_cmdline(cmdline_p, mv_name, &mv, &mv_io_base, &mv_mmio_enable);
+       parse_cmdline(cmdline_p, mv_name, &mv, &mv_io_base);
 
 #ifdef CONFIG_SH_UNKNOWN
        if (mv == NULL) {
@@ -237,6 +202,9 @@ static int __init sh_mv_setup(char **cmdline_p)
        __set_io_port_base(mv_io_base);
 #endif
 
+       if (!sh_mv.mv_nr_irqs)
+               sh_mv.mv_nr_irqs = NR_IRQS;
+
        return 0;
 }
 
@@ -245,11 +213,6 @@ void __init setup_arch(char **cmdline_p)
        unsigned long bootmap_size;
        unsigned long start_pfn, max_pfn, max_low_pfn;
 
-#ifdef CONFIG_EARLY_PRINTK
-       extern void enable_early_printk(void);
-
-       enable_early_printk();
-#endif
 #ifdef CONFIG_CMDLINE_BOOL
         strcpy(COMMAND_LINE, CONFIG_CMDLINE);
 #endif
@@ -276,6 +239,7 @@ void __init setup_arch(char **cmdline_p)
 
        sh_mv_setup(cmdline_p);
 
+
        /*
         * Find the highest page frame number we have available
         */
@@ -323,6 +287,7 @@ void __init setup_arch(char **cmdline_p)
                                  PFN_PHYS(pages));
        }
 
+
        /*
         * Reserve the kernel text and
         * Reserve the bootmem bitmap. We do this in two steps (first step
@@ -343,15 +308,18 @@ void __init setup_arch(char **cmdline_p)
        ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
        if (&__rd_start != &__rd_end) {
                LOADER_TYPE = 1;
-               INITRD_START = PHYSADDR((unsigned long)&__rd_start) - __MEMORY_START;
-               INITRD_SIZE = (unsigned long)&__rd_end - (unsigned long)&__rd_start;
+               INITRD_START = PHYSADDR((unsigned long)&__rd_start) -
+                                       __MEMORY_START;
+               INITRD_SIZE = (unsigned long)&__rd_end -
+                             (unsigned long)&__rd_start;
        }
 
        if (LOADER_TYPE && INITRD_START) {
                if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
-                       reserve_bootmem_node(NODE_DATA(0), INITRD_START+__MEMORY_START, INITRD_SIZE);
-                       initrd_start =
-                               INITRD_START ? INITRD_START + PAGE_OFFSET + __MEMORY_START : 0;
+                       reserve_bootmem_node(NODE_DATA(0), INITRD_START +
+                                               __MEMORY_START, INITRD_SIZE);
+                       initrd_start = INITRD_START + PAGE_OFFSET +
+                                       __MEMORY_START;
                        initrd_end = initrd_start + INITRD_SIZE;
                } else {
                        printk("initrd extends beyond end of memory "
@@ -368,14 +336,14 @@ void __init setup_arch(char **cmdline_p)
 #endif
 
        /* Perform the machine specific initialisation */
-       platform_setup();
+       if (likely(sh_mv.mv_setup))
+               sh_mv.mv_setup(cmdline_p);
 
        paging_init();
 }
 
 struct sh_machine_vector* __init get_mv_byname(const char* name)
 {
-       extern int strcasecmp(const char *, const char *);
        extern long __machvec_start, __machvec_end;
        struct sh_machine_vector *all_vecs =
                (struct sh_machine_vector *)&__machvec_start;
@@ -410,25 +378,20 @@ static int __init topology_init(void)
 subsys_initcall(topology_init);
 
 static const char *cpu_name[] = {
-       [CPU_SH7604]    = "SH7604",
-       [CPU_SH7705]    = "SH7705",
-       [CPU_SH7708]    = "SH7708",
-       [CPU_SH7729]    = "SH7729",
-       [CPU_SH7300]    = "SH7300",
-       [CPU_SH7750]    = "SH7750",
-       [CPU_SH7750S]   = "SH7750S",
-       [CPU_SH7750R]   = "SH7750R",
-       [CPU_SH7751]    = "SH7751",
-       [CPU_SH7751R]   = "SH7751R",
-       [CPU_SH7760]    = "SH7760",
-       [CPU_SH73180]   = "SH73180",
-       [CPU_ST40RA]    = "ST40RA",
-       [CPU_ST40GX1]   = "ST40GX1",
-       [CPU_SH4_202]   = "SH4-202",
-       [CPU_SH4_501]   = "SH4-501",
-       [CPU_SH7770]    = "SH7770",
-       [CPU_SH7780]    = "SH7780",
-       [CPU_SH7781]    = "SH7781",
+       [CPU_SH7206]    = "SH7206",     [CPU_SH7619]    = "SH7619",
+       [CPU_SH7604]    = "SH7604",     [CPU_SH7300]    = "SH7300",
+       [CPU_SH7705]    = "SH7705",     [CPU_SH7706]    = "SH7706",
+       [CPU_SH7707]    = "SH7707",     [CPU_SH7708]    = "SH7708",
+       [CPU_SH7709]    = "SH7709",     [CPU_SH7710]    = "SH7710",
+       [CPU_SH7729]    = "SH7729",     [CPU_SH7750]    = "SH7750",
+       [CPU_SH7750S]   = "SH7750S",    [CPU_SH7750R]   = "SH7750R",
+       [CPU_SH7751]    = "SH7751",     [CPU_SH7751R]   = "SH7751R",
+       [CPU_SH7760]    = "SH7760",     [CPU_SH73180]   = "SH73180",
+       [CPU_ST40RA]    = "ST40RA",     [CPU_ST40GX1]   = "ST40GX1",
+       [CPU_SH4_202]   = "SH4-202",    [CPU_SH4_501]   = "SH4-501",
+       [CPU_SH7770]    = "SH7770",     [CPU_SH7780]    = "SH7780",
+       [CPU_SH7781]    = "SH7781",     [CPU_SH7343]    = "SH7343",
+       [CPU_SH7785]    = "SH7785",     [CPU_SH7722]    = "SH7722",
        [CPU_SH_NONE]   = "Unknown"
 };
 
@@ -438,8 +401,10 @@ const char *get_cpu_subtype(void)
 }
 
 #ifdef CONFIG_PROC_FS
+/* Symbolic CPU flags, keep in sync with asm/cpu-features.h */
 static const char *cpu_flags[] = {
-       "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr", "ptea", NULL
+       "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr",
+       "ptea", "llsc", "l2", NULL
 };
 
 static void show_cpuflags(struct seq_file *m)
@@ -460,7 +425,8 @@ static void show_cpuflags(struct seq_file *m)
        seq_printf(m, "\n");
 }
 
-static void show_cacheinfo(struct seq_file *m, const char *type, struct cache_info info)
+static void show_cacheinfo(struct seq_file *m, const char *type,
+                          struct cache_info info)
 {
        unsigned int cache_size;
 
@@ -481,7 +447,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                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", system_utsname.machine);
+       seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine);
        seq_printf(m, "cpu type\t: %s\n", get_cpu_subtype());
 
        show_cpuflags(m);
@@ -493,7 +459,7 @@ 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 (test_bit(SH_CACHE_COMBINED, &(boot_cpu_data.icache.flags))) {
+       if (boot_cpu_data.icache.flags & SH_CACHE_COMBINED) {
                seq_printf(m, "unified\n");
                show_cacheinfo(m, "cache", boot_cpu_data.icache);
        } else {
@@ -502,6 +468,10 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                show_cacheinfo(m, "dcache", boot_cpu_data.dcache);
        }
 
+       /* Optional secondary cache */
+       if (boot_cpu_data.flags & CPU_HAS_L2_CACHE)
+               show_cacheinfo(m, "scache", boot_cpu_data.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);
@@ -617,4 +587,3 @@ static int __init kgdb_parse_options(char *options)
 }
 __setup("kgdb=", kgdb_parse_options);
 #endif /* CONFIG_SH_KGDB */
-