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>
This commit is contained in:
parent
1b756f5226
commit
09d343e941
|
@ -1,5 +1,6 @@
|
|||
config SANDBOX
|
||||
bool
|
||||
select OFTREE
|
||||
default y
|
||||
|
||||
config ARCH_TEXT_BASE
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue