OSDN Git Service

Merge tag 'mips_4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
[uclinux-h8/linux.git] / arch / mips / kernel / setup.c
index e64b9e8..01a5ff4 100644 (file)
@@ -333,7 +333,7 @@ static void __init finalize_initrd(void)
 
        maybe_bswap_initrd();
 
-       reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT);
+       memblock_reserve(__pa(initrd_start), size);
        initrd_below_start_ok = 1;
 
        pr_info("Initial ramdisk at: 0x%lx (%lu bytes)\n",
@@ -370,20 +370,10 @@ static void __init bootmem_init(void)
 
 #else  /* !CONFIG_SGI_IP27 */
 
-static unsigned long __init bootmap_bytes(unsigned long pages)
-{
-       unsigned long bytes = DIV_ROUND_UP(pages, 8);
-
-       return ALIGN(bytes, sizeof(long));
-}
-
 static void __init bootmem_init(void)
 {
        unsigned long reserved_end;
-       unsigned long mapstart = ~0UL;
-       unsigned long bootmap_size;
        phys_addr_t ramstart = PHYS_ADDR_MAX;
-       bool bootmap_valid = false;
        int i;
 
        /*
@@ -395,6 +385,8 @@ static void __init bootmem_init(void)
        init_initrd();
        reserved_end = (unsigned long) PFN_UP(__pa_symbol(&_end));
 
+       memblock_reserve(PHYS_OFFSET, reserved_end << PAGE_SHIFT);
+
        /*
         * max_low_pfn is not a number of pages. The number of pages
         * of the system is given by 'max_low_pfn - min_low_pfn'.
@@ -442,9 +434,6 @@ static void __init bootmem_init(void)
                if (initrd_end && end <= (unsigned long)PFN_UP(__pa(initrd_end)))
                        continue;
 #endif
-               if (start >= mapstart)
-                       continue;
-               mapstart = max(reserved_end, start);
        }
 
        if (min_low_pfn >= max_low_pfn)
@@ -456,9 +445,11 @@ static void __init bootmem_init(void)
        /*
         * Reserve any memory between the start of RAM and PHYS_OFFSET
         */
-       if (ramstart > PHYS_OFFSET)
+       if (ramstart > PHYS_OFFSET) {
                add_memory_region(PHYS_OFFSET, ramstart - PHYS_OFFSET,
                                  BOOT_MEM_RESERVED);
+               memblock_reserve(PHYS_OFFSET, ramstart - PHYS_OFFSET);
+       }
 
        if (min_low_pfn > ARCH_PFN_OFFSET) {
                pr_info("Wasting %lu bytes for tracking %lu unused pages\n",
@@ -483,52 +474,6 @@ static void __init bootmem_init(void)
                max_low_pfn = PFN_DOWN(HIGHMEM_START);
        }
 
-#ifdef CONFIG_BLK_DEV_INITRD
-       /*
-        * mapstart should be after initrd_end
-        */
-       if (initrd_end)
-               mapstart = max(mapstart, (unsigned long)PFN_UP(__pa(initrd_end)));
-#endif
-
-       /*
-        * check that mapstart doesn't overlap with any of
-        * memory regions that have been reserved through eg. DTB
-        */
-       bootmap_size = bootmap_bytes(max_low_pfn - min_low_pfn);
-
-       bootmap_valid = memory_region_available(PFN_PHYS(mapstart),
-                                               bootmap_size);
-       for (i = 0; i < boot_mem_map.nr_map && !bootmap_valid; i++) {
-               unsigned long mapstart_addr;
-
-               switch (boot_mem_map.map[i].type) {
-               case BOOT_MEM_RESERVED:
-                       mapstart_addr = PFN_ALIGN(boot_mem_map.map[i].addr +
-                                               boot_mem_map.map[i].size);
-                       if (PHYS_PFN(mapstart_addr) < mapstart)
-                               break;
-
-                       bootmap_valid = memory_region_available(mapstart_addr,
-                                                               bootmap_size);
-                       if (bootmap_valid)
-                               mapstart = PHYS_PFN(mapstart_addr);
-                       break;
-               default:
-                       break;
-               }
-       }
-
-       if (!bootmap_valid)
-               panic("No memory area to place a bootmap bitmap");
-
-       /*
-        * Initialize the boot-time allocator with low memory only.
-        */
-       if (bootmap_size != init_bootmem_node(NODE_DATA(0), mapstart,
-                                        min_low_pfn, max_low_pfn))
-               panic("Unexpected memory size required for bootmap");
-
        for (i = 0; i < boot_mem_map.nr_map; i++) {
                unsigned long start, end;
 
@@ -577,9 +522,9 @@ static void __init bootmem_init(void)
                default:
                        /* Not usable memory */
                        if (start > min_low_pfn && end < max_low_pfn)
-                               reserve_bootmem(boot_mem_map.map[i].addr,
-                                               boot_mem_map.map[i].size,
-                                               BOOTMEM_DEFAULT);
+                               memblock_reserve(boot_mem_map.map[i].addr,
+                                               boot_mem_map.map[i].size);
+
                        continue;
                }
 
@@ -602,15 +547,9 @@ static void __init bootmem_init(void)
                size = end - start;
 
                /* Register lowmem ranges */
-               free_bootmem(PFN_PHYS(start), size << PAGE_SHIFT);
                memory_present(0, start, end);
        }
 
-       /*
-        * Reserve the bootmap memory.
-        */
-       reserve_bootmem(PFN_PHYS(mapstart), bootmap_size, BOOTMEM_DEFAULT);
-
 #ifdef CONFIG_RELOCATABLE
        /*
         * The kernel reserves all memory below its _end symbol as bootmem,
@@ -642,29 +581,6 @@ static void __init bootmem_init(void)
 
 #endif /* CONFIG_SGI_IP27 */
 
-/*
- * arch_mem_init - initialize memory management subsystem
- *
- *  o plat_mem_setup() detects the memory configuration and will record detected
- *    memory areas using add_memory_region.
- *
- * At this stage the memory configuration of the system is known to the
- * kernel but generic memory management system is still entirely uninitialized.
- *
- *  o bootmem_init()
- *  o sparse_init()
- *  o paging_init()
- *  o dma_contiguous_reserve()
- *
- * At this stage the bootmem allocator is ready to use.
- *
- * NOTE: historically plat_mem_setup did the entire platform initialization.
- *      This was rather impractical because it meant plat_mem_setup had to
- * get away without any kind of memory allocator.  To keep old code from
- * breaking plat_setup was just renamed to plat_mem_setup and a second platform
- * initialization hook for anything else was introduced.
- */
-
 static int usermem __initdata;
 
 static int __init early_parse_mem(char *p)
@@ -841,6 +757,28 @@ static void __init request_crashkernel(struct resource *res)
 #define BUILTIN_EXTEND_WITH_PROM       \
        IS_ENABLED(CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND)
 
+/*
+ * arch_mem_init - initialize memory management subsystem
+ *
+ *  o plat_mem_setup() detects the memory configuration and will record detected
+ *    memory areas using add_memory_region.
+ *
+ * At this stage the memory configuration of the system is known to the
+ * kernel but generic memory management system is still entirely uninitialized.
+ *
+ *  o bootmem_init()
+ *  o sparse_init()
+ *  o paging_init()
+ *  o dma_contiguous_reserve()
+ *
+ * At this stage the bootmem allocator is ready to use.
+ *
+ * NOTE: historically plat_mem_setup did the entire platform initialization.
+ *      This was rather impractical because it meant plat_mem_setup had to
+ * get away without any kind of memory allocator.  To keep old code from
+ * breaking plat_setup was just renamed to plat_mem_setup and a second platform
+ * initialization hook for anything else was introduced.
+ */
 static void __init arch_mem_init(char **cmdline_p)
 {
        struct memblock_region *reg;
@@ -916,21 +854,29 @@ static void __init arch_mem_init(char **cmdline_p)
        early_init_fdt_scan_reserved_mem();
 
        bootmem_init();
+
+       /*
+        * Prevent memblock from allocating high memory.
+        * This cannot be done before max_low_pfn is detected, so up
+        * to this point is possible to only reserve physical memory
+        * with memblock_reserve; memblock_virt_alloc* can be used
+        * only after this point
+        */
+       memblock_set_current_limit(PFN_PHYS(max_low_pfn));
+
 #ifdef CONFIG_PROC_VMCORE
        if (setup_elfcorehdr && setup_elfcorehdr_size) {
                printk(KERN_INFO "kdump reserved memory at %lx-%lx\n",
                       setup_elfcorehdr, setup_elfcorehdr_size);
-               reserve_bootmem(setup_elfcorehdr, setup_elfcorehdr_size,
-                               BOOTMEM_DEFAULT);
+               memblock_reserve(setup_elfcorehdr, setup_elfcorehdr_size);
        }
 #endif
 
        mips_parse_crashkernel();
 #ifdef CONFIG_KEXEC
        if (crashk_res.start != crashk_res.end)
-               reserve_bootmem(crashk_res.start,
-                               crashk_res.end - crashk_res.start + 1,
-                               BOOTMEM_DEFAULT);
+               memblock_reserve(crashk_res.start,
+                                crashk_res.end - crashk_res.start + 1);
 #endif
        device_tree_init();
        sparse_init();
@@ -940,7 +886,7 @@ static void __init arch_mem_init(char **cmdline_p)
        /* Tell bootmem about cma reserved memblock section */
        for_each_memblock(reserved, reg)
                if (reg->size != 0)
-                       reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
+                       memblock_reserve(reg->base, reg->size);
 
        reserve_bootmem_region(__pa_symbol(&__nosave_begin),
                        __pa_symbol(&__nosave_end)); /* Reserve for hibernation */