]> err.no Git - linux-2.6/commitdiff
sh: sparsemem support.
authorPaul Mundt <lethal@linux-sh.org>
Wed, 23 May 2007 08:48:36 +0000 (17:48 +0900)
committerPaul Mundt <lethal@hera.kernel.org>
Fri, 8 Jun 2007 02:43:43 +0000 (02:43 +0000)
This implements basic sparsemem support for SH. Presently this only
uses static sparsemem, and we still permit explicit selection of
flatmem. Those boards that want sparsemem can select it as usual.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/kernel/setup.c
arch/sh/mm/Kconfig
arch/sh/mm/init.c
include/asm-sh/sparsemem.h [new file with mode: 0644]

index 6f1ea9b3337424d2700c19320f9c588ce0855e11..3241a6274b81518c517f95a8f621fbbb9582fa60 100644 (file)
@@ -128,6 +128,7 @@ void __init setup_bootmem_allocator(unsigned long start_pfn)
        bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn,
                                         min_low_pfn, max_low_pfn);
 
+       add_active_range(0, min_low_pfn, max_low_pfn);
        register_bootmem_low_pages();
 
        node_set_online(0);
@@ -192,6 +193,7 @@ static void __init setup_memory(void)
         */
        start_pfn = PFN_UP(__pa(_end));
        setup_bootmem_allocator(start_pfn);
+       sparse_memory_present_with_active_regions(0);
 }
 #else
 extern void __init setup_memory(void);
@@ -250,8 +252,9 @@ void __init setup_arch(char **cmdline_p)
        min_low_pfn = __MEMORY_START >> PAGE_SHIFT;
 
        nodes_clear(node_online_map);
+
+       /* Setup bootmem with available RAM */
        setup_memory();
-       paging_init();
        sparse_init();
 
 #ifdef CONFIG_DUMMY_CONSOLE
@@ -261,8 +264,9 @@ void __init setup_arch(char **cmdline_p)
        /* Perform the machine specific initialisation */
        if (likely(sh_mv.mv_setup))
                sh_mv.mv_setup(cmdline_p);
-}
 
+       paging_init();
+}
 
 static const char *cpu_name[] = {
        [CPU_SH7206]    = "SH7206",     [CPU_SH7619]    = "SH7619",
index 00f64c41edbaec4255e522f1ab4579358c44ef0c..46fd212b3ed6e8daa4e1c0396670963f0bb9716d 100644 (file)
@@ -300,6 +300,13 @@ config NODES_SHIFT
 config ARCH_FLATMEM_ENABLE
        def_bool y
 
+config ARCH_SPARSEMEM_ENABLE
+       def_bool y
+       select SPARSEMEM_STATIC
+
+config ARCH_SPARSEMEM_DEFAULT
+       def_bool y
+
 config MAX_ACTIVE_REGIONS
        int
        default "1"
@@ -307,6 +314,9 @@ config MAX_ACTIVE_REGIONS
 config ARCH_POPULATES_NODE_MAP
        def_bool y
 
+config ARCH_SELECT_MEMORY_MODEL
+       def_bool y
+
 choice
        prompt "Kernel page size"
        default PAGE_SIZE_4KB
index e0e644ff3204c38a114a03e16842ba87a36cdff9..1589466f9f87c4da6e6cf1644a67d46f70d9445e 100644 (file)
@@ -36,14 +36,11 @@ void show_mem(void)
        show_free_areas();
 
        for_each_online_pgdat(pgdat) {
-               struct page *page, *end;
-               unsigned long flags;
+               unsigned long flags, i;
 
                pgdat_resize_lock(pgdat, &flags);
-               page = pgdat->node_mem_map;
-               end = page + pgdat->node_spanned_pages;
-
-               do {
+               for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       struct page *page = pgdat_page_nr(pgdat, i);
                        total++;
                        if (PageReserved(page))
                                reserved++;
@@ -55,9 +52,7 @@ void show_mem(void)
                                free++;
                        else
                                shared += page_count(page) - 1;
-                       page++;
-               } while (page < end);
-
+               }
                pgdat_resize_unlock(pgdat, &flags);
        }
 
@@ -169,15 +164,11 @@ void __init paging_init(void)
                low = pgdat->bdata->node_low_pfn;
 
                max_zone_pfns[ZONE_NORMAL] = low;
-               add_active_range(nid, start_pfn, low);
 
                printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n",
                       nid, start_pfn, low);
 
                free_area_init_nodes(max_zone_pfns);
-
-               printk("Node %u: mem_map starts at %p\n",
-                      pgdat->node_id, pgdat->node_mem_map);
        }
 }
 
@@ -185,16 +176,13 @@ static struct kcore_list kcore_mem, kcore_vmalloc;
 
 void __init mem_init(void)
 {
-       int codesize, reservedpages, datasize, initsize;
+       int codesize, datasize, initsize;
        int nid;
 
-       reservedpages = 0;
-
        for_each_online_node(nid) {
                pg_data_t *pgdat = NODE_DATA(nid);
                unsigned long node_pages = 0;
                void *node_high_memory;
-               int i;
 
                num_physpages += pgdat->node_present_pages;
 
@@ -203,10 +191,6 @@ void __init mem_init(void)
 
                totalram_pages += node_pages;
 
-               for (i = 0; i < node_pages; i++)
-                       if (PageReserved(pgdat->node_mem_map + i))
-                               reservedpages++;
-
                node_high_memory = (void *)((pgdat->node_start_pfn +
                                             pgdat->node_spanned_pages) <<
                                                PAGE_SHIFT);
@@ -239,11 +223,10 @@ void __init mem_init(void)
                   VMALLOC_END - VMALLOC_START);
 
        printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, "
-              "%dk reserved, %dk data, %dk init)\n",
+              "%dk data, %dk init)\n",
                (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
                totalram_pages << (PAGE_SHIFT-10),
                codesize >> 10,
-               reservedpages << (PAGE_SHIFT-10),
                datasize >> 10,
                initsize >> 10);
 
diff --git a/include/asm-sh/sparsemem.h b/include/asm-sh/sparsemem.h
new file mode 100644 (file)
index 0000000..547a540
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __ASM_SH_SPARSEMEM_H
+#define __ASM_SH_SPARSEMEM_H
+
+#ifdef __KERNEL__
+/*
+ * SECTION_SIZE_BITS           2^N: how big each section will be
+ * MAX_PHYSADDR_BITS           2^N: how much physical address space we have
+ * MAX_PHYSMEM_BITS            2^N: how much memory we can have in that space
+ */
+#define SECTION_SIZE_BITS      26
+#define MAX_PHYSADDR_BITS      32
+#define MAX_PHYSMEM_BITS       32
+
+#endif
+
+#endif /* __ASM_SH_SPARSEMEM_H */