diff --git a/arch/sandbox/Kconfig b/arch/sandbox/Kconfig index 707fca3..9c72673 100644 --- a/arch/sandbox/Kconfig +++ b/arch/sandbox/Kconfig @@ -1,5 +1,6 @@ config SANDBOX bool + select OFTREE default y config ARCH_TEXT_BASE diff --git a/arch/sandbox/board/Makefile b/arch/sandbox/board/Makefile index 5104f5c..4601163 100644 --- a/arch/sandbox/board/Makefile +++ b/arch/sandbox/board/Makefile @@ -3,5 +3,6 @@ obj-y += hostfile.o obj-y += console.o obj-y += devices.o +obj-y += dtb.o extra-y += barebox.lds diff --git a/arch/sandbox/board/dtb.c b/arch/sandbox/board/dtb.c new file mode 100644 index 0000000..af4a64a --- /dev/null +++ b/arch/sandbox/board/dtb.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2013 Sascha Hauer , Pengutronix + * Copyright (c) 2015 Marc Kleine-Budde , Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include + +#include +#include + +static const void *dtb; + +int barebox_register_dtb(const void *new_dtb) +{ + if (dtb) + return -EBUSY; + + dtb = new_dtb; + + return 0; +} + +static int of_sandbox_init(void) +{ + struct device_node *root; + int ret; + + if (dtb) { + root = of_unflatten_dtb(dtb); + } else { + root = of_new_node(NULL, NULL); + + ret = of_property_write_u32(root, "#address-cells", 2); + if (ret) + return ret; + + ret = of_property_write_u32(root, "#size-cells", 1); + if (ret) + return ret; + } + + if (IS_ERR(root)) + return PTR_ERR(root); + + of_set_root_node(root); + of_fix_tree(root); + if (IS_ENABLED(CONFIG_OFDEVICE)) + of_probe(); + + return 0; +} +core_initcall(of_sandbox_init); diff --git a/arch/sandbox/mach-sandbox/include/mach/linux.h b/arch/sandbox/mach-sandbox/include/mach/linux.h index 98f9067..990173e 100644 --- a/arch/sandbox/mach-sandbox/include/mach/linux.h +++ b/arch/sandbox/mach-sandbox/include/mach/linux.h @@ -20,6 +20,8 @@ int barebox_register_console(char *name_template, int stdinfd, int stdoutfd); +int barebox_register_dtb(const void *dtb); + struct linux_console_data { int stdinfd; int stdoutfd; diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c index 65dc4a1..cfb261a 100644 --- a/arch/sandbox/os/common.c +++ b/arch/sandbox/os/common.c @@ -265,6 +265,42 @@ return -1; } +static int add_dtb(const char *file) +{ + struct stat s; + void *dtb = NULL; + int fd; + + fd = open(file, O_RDONLY); + if (fd < 0) { + perror("open"); + goto err_out; + } + + if (fstat(fd, &s)) { + perror("fstat"); + goto err_out; + } + + dtb = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (dtb == MAP_FAILED) { + perror("mmap"); + goto err_out; + } + + if (barebox_register_dtb(dtb)) + goto err_out; + + return 0; + + err_out: + if (dtb) + munmap(dtb, s.st_size); + if (fd > 0) + close(fd); + return -1; +} + static void print_usage(const char*); static struct option long_options[] = { @@ -272,6 +308,7 @@ {"malloc", 1, 0, 'm'}, {"image", 1, 0, 'i'}, {"env", 1, 0, 'e'}, + {"dtb", 1, 0, 'd'}, {"stdout", 1, 0, 'O'}, {"stdin", 1, 0, 'I'}, {"xres", 1, 0, 'x'}, @@ -279,7 +316,7 @@ {0, 0, 0, 0}, }; -static const char optstring[] = "hm:i:e:O:I:x:y:"; +static const char optstring[] = "hm:i:e:d:O:I:x:y:"; int main(int argc, char *argv[]) { @@ -308,6 +345,13 @@ break; case 'e': break; + case 'd': + ret = add_dtb(optarg); + if (ret) { + printf("Failed to load dtb: '%s'\n", optarg); + exit(1); + } + break; case 'O': fd = open(optarg, O_WRONLY); if (fd < 0) { @@ -408,6 +452,7 @@ " and thus are used as the default environment.\n" " An empty file generated with dd will do to get started\n" " with an empty environment.\n" +" -d, --dtb= Map a device tree binary blob (dtb) into barebox.\n" " -O, --stdout= Register a file as a console capable of doing stdout.\n" " can be a regular file or a FIFO.\n" " -I, --stdin= Register a file as a console capable of doing stdin.\n"