Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2043ca8 authored by Franck Bui-Huu's avatar Franck Bui-Huu Committed by Ralf Baechle
Browse files

[MIPS] setup.c: move initrd code inside dedicated functions



NUMA specific code could rely on them too.

Signed-off-by: default avatarFranck Bui-Huu <vagabon.xyz@gmail.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent b6f1f0de
Loading
Loading
Loading
Loading
+86 −58
Original line number Original line Diff line number Diff line
@@ -200,7 +200,12 @@ static inline void parse_cmdline_early(void)
	}
	}
}
}


static inline int parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_end)
/*
 * Manage initrd
 */
#ifdef CONFIG_BLK_DEV_INITRD

static int __init parse_rd_cmdline(unsigned long *rd_start, unsigned long *rd_end)
{
{
	/*
	/*
	 * "rd_start=0xNNNNNNNN" defines the memory address of an initrd
	 * "rd_start=0xNNNNNNNN" defines the memory address of an initrd
@@ -263,49 +268,93 @@ static inline int parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_en
	return 0;
	return 0;
}
}


/*
static unsigned long __init init_initrd(void)
 * Initialize the bootmem allocator. It also setup initrd related data
 * if needed.
 */
static void __init bootmem_init(void)
{
{
	unsigned long reserved_end = (unsigned long)&_end;
	unsigned long tmp, end;
#ifndef CONFIG_SGI_IP27
	u32 *initrd_header;
	unsigned long highest = 0;
	unsigned long mapstart = -1UL;
	unsigned long bootmap_size;
	int i;
#endif
#ifdef CONFIG_BLK_DEV_INITRD
	int initrd_reserve_bootmem = 0;


	/* Board specific code should have set up initrd_start and initrd_end */
	ROOT_DEV = Root_RAM0;
	ROOT_DEV = Root_RAM0;
	if (parse_rd_cmdline(&initrd_start, &initrd_end)) {
		reserved_end = max(reserved_end, initrd_end);
		initrd_reserve_bootmem = 1;
	} else {
		unsigned long tmp;
		u32 *initrd_header;


		tmp = PAGE_ALIGN(reserved_end) - sizeof(u32) * 2;
	if (parse_rd_cmdline(&initrd_start, &initrd_end))
		if (tmp < reserved_end)
		return initrd_end;
	/*
	 * Board specific code should have set up initrd_start
	 * and initrd_end...
	 */
	end = (unsigned long)&_end;
	tmp = PAGE_ALIGN(end) - sizeof(u32) * 2;
	if (tmp < end)
		tmp += PAGE_SIZE;
		tmp += PAGE_SIZE;

	initrd_header = (u32 *)tmp;
	initrd_header = (u32 *)tmp;
	if (initrd_header[0] == 0x494E5244) {
	if (initrd_header[0] == 0x494E5244) {
		initrd_start = (unsigned long)&initrd_header[2];
		initrd_start = (unsigned long)&initrd_header[2];
		initrd_end = initrd_start + initrd_header[1];
		initrd_end = initrd_start + initrd_header[1];
			reserved_end = max(reserved_end, initrd_end);
			initrd_reserve_bootmem = 1;
	}
	}
	return initrd_end;
}

static void __init finalize_initrd(void)
{
	unsigned long size = initrd_end - initrd_start;

	if (size == 0) {
		printk(KERN_INFO "Initrd not found or empty");
		goto disable;
	}
	if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) {
		printk("Initrd extends beyond end of memory");
		goto disable;
	}

	reserve_bootmem(CPHYSADDR(initrd_start), size);
	initrd_below_start_ok = 1;

	printk(KERN_INFO "Initial ramdisk at: 0x%lx (%lu bytes)\n",
	       initrd_start, size);
	return;
disable:
	printk(" - disabling initrd\n");
	initrd_start = 0;
	initrd_end = 0;
}

#else  /* !CONFIG_BLK_DEV_INITRD */

#define init_initrd()		0
#define finalize_initrd()	do {} while (0)

#endif

/*
 * Initialize the bootmem allocator. It also setup initrd related data
 * if needed.
 */
#ifdef CONFIG_SGI_IP27

static void __init bootmem_init(void)
{
	init_initrd();
	finalize_initrd();
}
}
#endif	/* CONFIG_BLK_DEV_INITRD */


#ifndef CONFIG_SGI_IP27
#else  /* !CONFIG_SGI_IP27 */

static void __init bootmem_init(void)
{
	unsigned long reserved_end;
	unsigned long highest = 0;
	unsigned long mapstart = -1UL;
	unsigned long bootmap_size;
	int i;

	/*
	/*
	 * reserved_end is now a pfn
	 * Init any data related to initrd. It's a nop if INITRD is
	 * not selected. Once that done we can determine the low bound
	 * of usable memory.
	 */
	 */
	reserved_end = PFN_UP(CPHYSADDR(reserved_end));
	reserved_end = init_initrd();
	reserved_end = PFN_UP(CPHYSADDR(max(reserved_end, (unsigned long)&_end)));


	/*
	/*
	 * Find the highest page frame number we have available.
	 * Find the highest page frame number we have available.
@@ -388,34 +437,13 @@ static void __init bootmem_init(void)
	 */
	 */
	reserve_bootmem(PFN_PHYS(mapstart), bootmap_size);
	reserve_bootmem(PFN_PHYS(mapstart), bootmap_size);


#endif /* CONFIG_SGI_IP27 */
	/*

	 * Reserve initrd memory if needed.
#ifdef CONFIG_BLK_DEV_INITRD
	 */
	initrd_below_start_ok = 1;
	finalize_initrd();
	if (initrd_start) {
		unsigned long initrd_size = ((unsigned char *)initrd_end) -
			((unsigned char *)initrd_start);
		const int width = sizeof(long) * 2;

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

		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",
			       width,
			       (unsigned long long) CPHYSADDR(initrd_end),
			       width,
			       (unsigned long long) PFN_PHYS(max_low_pfn));
			initrd_start = initrd_end = 0;
			initrd_reserve_bootmem = 0;
}
}


		if (initrd_reserve_bootmem)
#endif	/* CONFIG_SGI_IP27 */
			reserve_bootmem(CPHYSADDR(initrd_start), initrd_size);
	}
#endif /* CONFIG_BLK_DEV_INITRD  */
}


/*
/*
 * arch_mem_init - initialize memory managment subsystem
 * arch_mem_init - initialize memory managment subsystem