linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / mips / kernel / setup.c
index 9411f90..d9293c5 100644 (file)
 #include <linux/root_dev.h>
 #include <linux/highmem.h>
 #include <linux/console.h>
+#include <linux/mmzone.h>
 
 #include <asm/addrspace.h>
 #include <asm/bootinfo.h>
+#include <asm/cache.h>
 #include <asm/cpu.h>
 #include <asm/sections.h>
 #include <asm/setup.h>
 #include <asm/system.h>
 
-struct cpuinfo_mips cpu_data[NR_CPUS];
+struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
 
 EXPORT_SYMBOL(cpu_data);
 
@@ -61,8 +63,8 @@ EXPORT_SYMBOL(PCI_DMA_BUS_IS_PHYS);
  *
  * These are initialized so they are in the .data section
  */
-unsigned long mips_machtype = MACH_UNKNOWN;
-unsigned long mips_machgroup = MACH_GROUP_UNKNOWN;
+unsigned long mips_machtype __read_mostly = MACH_UNKNOWN;
+unsigned long mips_machgroup __read_mostly = MACH_GROUP_UNKNOWN;
 
 EXPORT_SYMBOL(mips_machtype);
 EXPORT_SYMBOL(mips_machgroup);
@@ -76,7 +78,7 @@ static char command_line[CL_SIZE];
  * mips_io_port_base is the begin of the address space to which x86 style
  * I/O ports are mapped.
  */
-const unsigned long mips_io_port_base = -1;
+const unsigned long mips_io_port_base __read_mostly = -1;
 EXPORT_SYMBOL(mips_io_port_base);
 
 /*
@@ -86,8 +88,8 @@ EXPORT_SYMBOL(mips_io_port_base);
 unsigned long isa_slot_offset;
 EXPORT_SYMBOL(isa_slot_offset);
 
-static struct resource code_resource = { "Kernel code" };
-static struct resource data_resource = { "Kernel data" };
+static struct resource code_resource = { .name = "Kernel code", };
+static struct resource data_resource = { .name = "Kernel data", };
 
 void __init add_memory_region(phys_t start, phys_t size, long type)
 {
@@ -240,7 +242,7 @@ static inline int parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_en
        if (*tmp)
                strcat(command_line, tmp);
 
-#ifdef CONFIG_MIPS64
+#ifdef CONFIG_64BIT
        /* HACK: Guess if the sign extension was forgotten */
        if (start > 0x0000000080000000 && start < 0x00000000ffffffff)
                start |= 0xffffffff00000000;
@@ -281,12 +283,12 @@ static inline void bootmem_init(void)
                initrd_reserve_bootmem = 1;
        } else {
                unsigned long tmp;
-               unsigned long *initrd_header;
+               u32 *initrd_header;
 
-               tmp = ((reserved_end + PAGE_SIZE-1) & PAGE_MASK) - 8;
+               tmp = ((reserved_end + PAGE_SIZE-1) & PAGE_MASK) - sizeof(u32) * 2;
                if (tmp < reserved_end)
                        tmp += PAGE_SIZE;
-               initrd_header = (unsigned long *)tmp;
+               initrd_header = (u32 *)tmp;
                if (initrd_header[0] == 0x494E5244) {
                        initrd_start = (unsigned long)&initrd_header[2];
                        initrd_end = initrd_start + initrd_header[1];
@@ -356,6 +358,8 @@ static inline void bootmem_init(void)
        }
 #endif
 
+       memory_present(0, first_usable_pfn, max_low_pfn);
+
        /* Initialize the boot-time allocator with low memory only.  */
        bootmap_size = init_bootmem(first_usable_pfn, max_low_pfn);
 
@@ -425,8 +429,10 @@ static inline void bootmem_init(void)
                if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) {
                        printk("initrd extends beyond end of memory "
                               "(0x%0*Lx > 0x%0*Lx)\ndisabling initrd\n",
-                              sizeof(long) * 2, CPHYSADDR(initrd_end),
-                              sizeof(long) * 2, PFN_PHYS(max_low_pfn));
+                              sizeof(long) * 2,
+                              (unsigned long long)CPHYSADDR(initrd_end),
+                              sizeof(long) * 2,
+                              (unsigned long long)PFN_PHYS(max_low_pfn));
                        initrd_start = initrd_end = 0;
                        initrd_reserve_bootmem = 0;
                }
@@ -441,10 +447,21 @@ static inline void resource_init(void)
 {
        int i;
 
+#if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64)
+       /*
+        * The 64bit code in 32bit object format trick can't represent
+        * 64bit wide relocations for linker script symbols.
+        */
+       code_resource.start = CPHYSADDR(&_text);
+       code_resource.end = CPHYSADDR(&_etext) - 1;
+       data_resource.start = CPHYSADDR(&_etext);
+       data_resource.end = CPHYSADDR(&_edata) - 1;
+#else
        code_resource.start = virt_to_phys(&_text);
        code_resource.end = virt_to_phys(&_etext) - 1;
        data_resource.start = virt_to_phys(&_etext);
        data_resource.end = virt_to_phys(&_edata) - 1;
+#endif
 
        /*
         * Request address space for all standard RAM.
@@ -494,31 +511,7 @@ static inline void resource_init(void)
 #undef MAXMEM
 #undef MAXMEM_PFN
 
-static int __initdata earlyinit_debug;
-
-static int __init earlyinit_debug_setup(char *str)
-{
-       earlyinit_debug = 1;
-       return 1;
-}
-__setup("earlyinit_debug", earlyinit_debug_setup);
-
-extern initcall_t __earlyinitcall_start, __earlyinitcall_end;
-
-static void __init do_earlyinitcalls(void)
-{
-       initcall_t *call, *start, *end;
-
-       start = &__earlyinitcall_start;
-       end = &__earlyinitcall_end;
-
-       for (call = start; call < end; call++) {
-               if (earlyinit_debug)
-                       printk("calling earlyinitcall 0x%p\n", *call);
-
-               (*call)();
-       }
-}
+extern void plat_setup(void);
 
 void __init setup_arch(char **cmdline_p)
 {
@@ -535,7 +528,7 @@ void __init setup_arch(char **cmdline_p)
 #endif
 
        /* call board setup routine */
-       do_earlyinitcalls();
+       plat_setup();
 
        strlcpy(command_line, arcs_cmdline, sizeof(command_line));
        strlcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
@@ -544,8 +537,12 @@ void __init setup_arch(char **cmdline_p)
 
        parse_cmdline_early();
        bootmem_init();
+       sparse_init();
        paging_init();
        resource_init();
+#ifdef CONFIG_SMP
+       plat_smp_setup();
+#endif
 }
 
 int __init fpu_disable(char *s)
@@ -556,3 +553,12 @@ int __init fpu_disable(char *s)
 }
 
 __setup("nofpu", fpu_disable);
+
+int __init dsp_disable(char *s)
+{
+       cpu_data[0].ases &= ~MIPS_ASE_DSP;
+
+       return 1;
+}
+
+__setup("nodsp", dsp_disable);