summaryrefslogtreecommitdiffstats
path: root/arch/sandbox
diff options
context:
space:
mode:
authorMarc Kleine-Budde <mkl@pengutronix.de>2015-03-03 13:14:47 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2015-03-06 07:42:21 +0100
commit09d343e941e039afa19b5ead777780e1f799cab4 (patch)
tree4a00a0f22d4165a74f2f5bd21dd53c2f03633ea2 /arch/sandbox
parent1b756f522686d3f469f1ff3363ce158d3d45f204 (diff)
downloadbarebox-09d343e941e039afa19b5ead777780e1f799cab4.tar.gz
barebox-09d343e941e039afa19b5ead777780e1f799cab4.tar.xz
sandbox: add support to pass dtb to barebox
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/sandbox')
-rw-r--r--arch/sandbox/Kconfig1
-rw-r--r--arch/sandbox/board/Makefile1
-rw-r--r--arch/sandbox/board/dtb.c67
-rw-r--r--arch/sandbox/mach-sandbox/include/mach/linux.h2
-rw-r--r--arch/sandbox/os/common.c47
5 files changed, 117 insertions, 1 deletions
diff --git a/arch/sandbox/Kconfig b/arch/sandbox/Kconfig
index 707fca3dc3..9c72673bde 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 5104f5cb26..460116332d 100644
--- a/arch/sandbox/board/Makefile
+++ b/arch/sandbox/board/Makefile
@@ -3,5 +3,6 @@ obj-y += clock.o
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 0000000000..af4a64a9c7
--- /dev/null
+++ b/arch/sandbox/board/dtb.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2013 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+ * Copyright (c) 2015 Marc Kleine-Budde <mkl@pengutronix.de>, 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 <common.h>
+#include <init.h>
+#include <of.h>
+
+#include <mach/linux.h>
+#include <linux/err.h>
+
+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 98f9067046..990173e10b 100644
--- a/arch/sandbox/mach-sandbox/include/mach/linux.h
+++ b/arch/sandbox/mach-sandbox/include/mach/linux.h
@@ -20,6 +20,8 @@ int linux_execve(const char * filename, char *const argv[], char *const envp[]);
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 65dc4a1ab7..cfb261acf2 100644
--- a/arch/sandbox/os/common.c
+++ b/arch/sandbox/os/common.c
@@ -265,6 +265,42 @@ err_out:
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 @@ static struct option long_options[] = {
{"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 @@ static struct option long_options[] = {
{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 @@ int main(int argc, char *argv[])
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 @@ static void print_usage(const char *prgname)
" 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=<file> Map a device tree binary blob (dtb) into barebox.\n"
" -O, --stdout=<file> Register a file as a console capable of doing stdout.\n"
" <file> can be a regular file or a FIFO.\n"
" -I, --stdin=<file> Register a file as a console capable of doing stdin.\n"