diff options
| -rw-r--r-- | arch/sandbox/cpu/start.c | 7 | ||||
| -rw-r--r-- | arch/sandbox/include/asm/state.h | 1 | ||||
| -rw-r--r-- | common/board_f.c | 55 | ||||
| -rw-r--r-- | doc/README.fdt-control | 6 | ||||
| -rw-r--r-- | include/configs/sandbox.h | 2 | 
5 files changed, 70 insertions, 1 deletions
| diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c index 5287fd5ee..2fcec8b36 100644 --- a/arch/sandbox/cpu/start.c +++ b/arch/sandbox/cpu/start.c @@ -104,6 +104,13 @@ static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg)  }  SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command"); +static int sb_cmdline_cb_fdt(struct sandbox_state *state, const char *arg) +{ +	state->fdt_fname = arg; +	return 0; +} +SB_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT"); +  int main(int argc, char *argv[])  {  	struct sandbox_state *state; diff --git a/arch/sandbox/include/asm/state.h b/arch/sandbox/include/asm/state.h index 2b62b46ea..9552708a7 100644 --- a/arch/sandbox/include/asm/state.h +++ b/arch/sandbox/include/asm/state.h @@ -34,6 +34,7 @@ enum exit_type_id {  /* The complete state of the test system */  struct sandbox_state {  	const char *cmd;		/* Command to execute */ +	const char *fdt_fname;		/* Filename of FDT binary */  	enum exit_type_id exit_type;	/* How we exited U-Boot */  	const char *parse_err;		/* Error to report from parsing */  	int argc;			/* Program arguments */ diff --git a/common/board_f.c b/common/board_f.c index 204505519..3a6638f8e 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -31,6 +31,7 @@  #include <version.h>  #include <environment.h>  #include <fdtdec.h> +#include <fs.h>  #if defined(CONFIG_CMD_IDE)  #include <ide.h>  #endif @@ -305,6 +306,55 @@ __weak int arch_cpu_init(void)  	return 0;  } +#ifdef CONFIG_OF_HOSTFILE + +#define CHECK(x)		err = (x); if (err) goto failed; + +/* Create an empty device tree blob */ +static int make_empty_fdt(void *fdt) +{ +	int err; + +	CHECK(fdt_create(fdt, 256)); +	CHECK(fdt_finish_reservemap(fdt)); +	CHECK(fdt_begin_node(fdt, "")); +	CHECK(fdt_end_node(fdt)); +	CHECK(fdt_finish(fdt)); + +	return 0; +failed: +	printf("Unable to create empty FDT: %s\n", fdt_strerror(err)); +	return -EACCES; +} + +static int read_fdt_from_file(void) +{ +	struct sandbox_state *state = state_get_current(); +	void *blob; +	int size; +	int err; + +	blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0); +	if (!state->fdt_fname) { +		err = make_empty_fdt(blob); +		if (!err) +			goto done; +		return err; +	} +	err = fs_set_blk_dev("host", NULL, FS_TYPE_SANDBOX); +	if (err) +		return err; +	size = fs_read(state->fdt_fname, CONFIG_SYS_FDT_LOAD_ADDR, 0, 0); +	if (size < 0) +		return -EIO; + +done: +	gd->fdt_blob = blob; + +	return 0; +} +#endif +  #ifdef CONFIG_SANDBOX  static int setup_ram_buf(void)  { @@ -328,6 +378,11 @@ static int setup_fdt(void)  # else  	gd->fdt_blob = (ulong *)&_end;  # endif +#elif defined(CONFIG_OF_HOSTFILE) +	if (read_fdt_from_file()) { +		puts("Failed to read control FDT\n"); +		return -1; +	}  #endif  	/* Allow the early environment to override the fdt address */  	gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16, diff --git a/doc/README.fdt-control b/doc/README.fdt-control index 8352835ee..5963f78e9 100644 --- a/doc/README.fdt-control +++ b/doc/README.fdt-control @@ -142,7 +142,11 @@ join the two:  and then flash image.bin onto your board. -You cannot use both of these options at the same time. +If CONFIG_OF_HOSTFILE is defined, then it will be read from a file on +startup. This is only useful for sandbox. Use the -d flag to U-Boot to +specify the file to read. + +You cannot use more than one of these options at the same time.  If you wish to put the fdt at a different address in memory, you can  define the "fdtcontroladdr" environment variable. This is the hex diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h index da7cc9a7a..8efadedd8 100644 --- a/include/configs/sandbox.h +++ b/include/configs/sandbox.h @@ -26,6 +26,7 @@  #define CONFIG_SANDBOX_BITS_PER_LONG	64  #define CONFIG_OF_CONTROL +#define CONFIG_OF_HOSTFILE  #define CONFIG_OF_LIBFDT  #define CONFIG_LMB @@ -71,6 +72,7 @@  #define CONFIG_SYS_MEMTEST_START	0x00100000  #define CONFIG_SYS_MEMTEST_END		(CONFIG_SYS_MEMTEST_START + 0x1000)  #define CONFIG_PHYS_64BIT +#define CONFIG_SYS_FDT_LOAD_ADDR	0x1000000  /* Size of our emulated memory */  #define CONFIG_SYS_SDRAM_BASE		0 |