Ejemplo n.º 1
0
static int setup_dt_blob(void *blob)
{
	unsigned int mem_bank = MEM_BANK;
	unsigned int mem_size = MEM_SIZE;
	int ret;

	if (check_dt_blob_valid(blob)) {
		dbg_info("DT: the blob is not a valid fdt\n");
		return -1;
	}

	dbg_info("\nUsing device tree in place at %x\n",
						(unsigned int)blob);

	if (bootargs) {
		char *p;

		/* set "/chosen" node */
		for (p = bootargs; *p == ' '; p++)
			;

		if (*p == '\0')
			return -1;

		ret = fixup_chosen_node(blob, p);
		if (ret)
			return ret;
	}

	ret = fixup_memory_node(blob, &mem_bank, &mem_size);
	if (ret)
		return ret;

	return 0;
}
Ejemplo n.º 2
0
static int setup_dt_blob(void *blob)
{
	char *bootargs = LINUX_KERNEL_ARG_STRING;
	char *p;
	unsigned int mem_bank = OS_MEM_BANK;
	unsigned int mem_size = OS_MEM_SIZE;
	int ret;

	if (check_dt_blob_valid(blob)) {
		dbg_log(1, "DT: the blob is not a valid fdt\n\r");
		return -1;
	}

	dbg_log(1, "\n\rUsing device tree in place at %d\n\r",
						(unsigned int)blob);

	/* set "/chosen" node */
	for (p = bootargs; *p == ' '; p++)
		;

	if (*p == '\0')
		return -1;

	ret = fixup_chosen_node(blob, p);
	if (ret)
		return ret;

	ret = fixup_memory_node(blob, &mem_bank, &mem_size);
	if (ret)
		return ret;

	return 0;
}
Ejemplo n.º 3
0
static int bootm_linux_fdt(int machid, bootm_headers_t *images)
{
	ulong rd_len;
	void (*kernel_entry)(int zero, int dt_machid, void *dtblob);
	ulong bootmap_base = getenv_bootm_low();
	ulong of_size = images->ft_len;
	char **of_flat_tree = &images->ft_addr;
	ulong *initrd_start = &images->initrd_start;
	ulong *initrd_end = &images->initrd_end;
	struct lmb *lmb = &images->lmb;
	int ret;

	kernel_entry = (void (*)(int, int, void *))images->ep;

	rd_len = images->rd_end - images->rd_start;
	ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
				initrd_start, initrd_end);
	if (ret)
		return ret;

	ret = boot_relocate_fdt(lmb, bootmap_base, of_flat_tree, &of_size);
	if (ret)
		return ret;

	debug("## Transferring control to Linux (at address %08lx) ...\n",
	       (ulong) kernel_entry);

	fdt_chosen(*of_flat_tree, 1);

	fixup_memory_node(*of_flat_tree);
	fdt_fixup_ethernet(*of_flat_tree);
#ifdef CONFIG_DMAMEM
	fdt_fixup_dmamem(*of_flat_tree);
#endif
#ifdef CONFIG_SWITCH
	fdt_fixup_switch(*of_flat_tree);
#endif

	fdt_initrd(*of_flat_tree, *initrd_start, *initrd_end, 1);

	announce_and_cleanup();

	kernel_entry(0, machid, *of_flat_tree);
	/* does not return */

	return 1;
}
Ejemplo n.º 4
0
static int setup_dt_blob(void *blob)
{
	char *bootargs = LINUX_KERNEL_ARG_STRING;
	char *p;
	unsigned int mem_bank = MEM_BANK;
	unsigned int mem_size = MEM_SIZE;
	int ret;

	if (check_dt_blob_valid(blob)) {
		dbg_info("DT: the blob is not a valid fdt\n");
		return -1;
	}

	dbg_info("\nUsing device tree in place at %d\n",
						(unsigned int)blob);

#if defined(CONFIG_LOAD_ANDROID) && defined(CONFIG_SAMA5D3XEK)
	if (get_dm_sn() == BOARD_ID_PDA_DM)
		bootargs = cmd_line_android_pda;
	else
		bootargs = cmd_line_android;
#endif

	/* set "/chosen" node */
	for (p = bootargs; *p == ' '; p++)
		;

	if (*p == '\0')
		return -1;

	ret = fixup_chosen_node(blob, p);
	if (ret)
		return ret;

	ret = fixup_memory_node(blob, &mem_bank, &mem_size);
	if (ret)
		return ret;

	return 0;
}