Commit d46869aa authored by Guo Ren's avatar Guo Ren
Browse files

csky: Add setup_initrd check code



We should give some necessary check for initrd just like other
architectures and it seems that setup_initrd() could be a common
code for all architectures.

Signed-off-by: default avatarGuo Ren <guoren@linux.alibaba.com>
parent 4ec575b7
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -47,9 +47,6 @@ static void __init csky_memblock_init(void)
	signed long size;

	memblock_reserve(__pa(_stext), _end - _stext);
#ifdef CONFIG_BLK_DEV_INITRD
	memblock_reserve(__pa(initrd_start), initrd_end - initrd_start);
#endif

	early_init_fdt_reserve_self();
	early_init_fdt_scan_reserved_mem();
+44 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/swap.h>
#include <linux/proc_fs.h>
#include <linux/pfn.h>
#include <linux/initrd.h>

#include <asm/setup.h>
#include <asm/cachectl.h>
@@ -36,6 +37,45 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
						__page_aligned_bss;
EXPORT_SYMBOL(empty_zero_page);

#ifdef CONFIG_BLK_DEV_INITRD
static void __init setup_initrd(void)
{
	unsigned long size;

	if (initrd_start >= initrd_end) {
		pr_err("initrd not found or empty");
		goto disable;
	}

	if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) {
		pr_err("initrd extends beyond end of memory");
		goto disable;
	}

	size = initrd_end - initrd_start;

	if (memblock_is_region_reserved(__pa(initrd_start), size)) {
		pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region",
		       __pa(initrd_start), size);
		goto disable;
	}

	memblock_reserve(__pa(initrd_start), size);

	pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n",
		(void *)(initrd_start), size);

	initrd_below_start_ok = 1;

	return;

disable:
	initrd_start = initrd_end = 0;

	pr_err(" - disabling initrd\n");
}
#endif

void __init mem_init(void)
{
#ifdef CONFIG_HIGHMEM
@@ -47,6 +87,10 @@ void __init mem_init(void)
#endif
	high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);

#ifdef CONFIG_BLK_DEV_INITRD
	setup_initrd();
#endif

	memblock_free_all();

#ifdef CONFIG_HIGHMEM