summaryrefslogtreecommitdiff
path: root/arch/sandbox/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sandbox/cpu')
-rw-r--r--arch/sandbox/cpu/cpu.c34
-rw-r--r--arch/sandbox/cpu/start.c16
-rw-r--r--arch/sandbox/cpu/state.c48
3 files changed, 86 insertions, 12 deletions
diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c
index d077948dd7b..636d3545b95 100644
--- a/arch/sandbox/cpu/cpu.c
+++ b/arch/sandbox/cpu/cpu.c
@@ -3,19 +3,22 @@
* Copyright (c) 2011 The Chromium OS Authors.
*/
+#define LOG_CATEGORY LOGC_SANDBOX
+
#include <common.h>
#include <bootstage.h>
#include <cpu_func.h>
#include <errno.h>
#include <log.h>
-#include <asm/global_data.h>
-#include <linux/delay.h>
-#include <linux/libfdt.h>
#include <os.h>
+#include <asm/global_data.h>
#include <asm/io.h>
#include <asm/malloc.h>
#include <asm/setjmp.h>
#include <asm/state.h>
+#include <dm/ofnode.h>
+#include <linux/delay.h>
+#include <linux/libfdt.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -373,3 +376,28 @@ ulong timer_get_boot_us(void)
return (count - base_count) / 1000;
}
+
+int sandbox_load_other_fdt(void **fdtp, int *sizep)
+{
+ const char *orig;
+ int ret, size;
+ void *fdt = *fdtp;
+
+ ret = state_load_other_fdt(&orig, &size);
+ if (ret) {
+ log_err("Cannot read other FDT\n");
+ return log_msg_ret("ld", ret);
+ }
+
+ if (!*fdtp) {
+ fdt = os_malloc(size);
+ if (!fdt)
+ return log_msg_ret("mem", -ENOMEM);
+ *sizep = size;
+ }
+
+ memcpy(fdt, orig, *sizep);
+ *fdtp = fdt;
+
+ return 0;
+}
diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index 90a84e93c79..642be164a39 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -205,21 +205,19 @@ SANDBOX_CMDLINE_OPT_SHORT(default_fdt, 'D', 0,
static int sandbox_cmdline_cb_test_fdt(struct sandbox_state *state,
const char *arg)
{
- const char *fmt = "/arch/sandbox/dts/test.dtb";
- char *p;
+ char buf[256];
char *fname;
int len;
- len = strlen(state->argv[0]) + strlen(fmt) + 1;
+ len = state_get_rel_filename("arch/sandbox/dts/test.dtb", buf,
+ sizeof(buf));
+ if (len < 0)
+ return len;
+
fname = os_malloc(len);
if (!fname)
return -ENOMEM;
- strcpy(fname, state->argv[0]);
- p = strrchr(fname, '/');
- if (!p)
- p = fname + strlen(fname);
- len -= p - fname;
- snprintf(p, len, fmt);
+ strcpy(fname, buf);
state->fdt_fname = fname;
return 0;
diff --git a/arch/sandbox/cpu/state.c b/arch/sandbox/cpu/state.c
index e0d01125bb5..fcc4a337e59 100644
--- a/arch/sandbox/cpu/state.c
+++ b/arch/sandbox/cpu/state.c
@@ -396,6 +396,54 @@ bool autoboot_set_keyed(bool autoboot_keyed)
return old_val;
}
+int state_get_rel_filename(const char *rel_path, char *buf, int size)
+{
+ struct sandbox_state *state = state_get_current();
+ int rel_len, prog_len;
+ char *p;
+ int len;
+
+ rel_len = strlen(rel_path);
+ p = strrchr(state->argv[0], '/');
+ prog_len = p ? p - state->argv[0] : 0;
+
+ /* allow space for a / and a terminator */
+ len = prog_len + 1 + rel_len + 1;
+ if (len > size)
+ return -ENOSPC;
+ strncpy(buf, state->argv[0], prog_len);
+ buf[prog_len] = '/';
+ strcpy(buf + prog_len + 1, rel_path);
+
+ return len;
+}
+
+int state_load_other_fdt(const char **bufp, int *sizep)
+{
+ struct sandbox_state *state = state_get_current();
+ char fname[256];
+ int len, ret;
+
+ /* load the file if needed */
+ if (!state->other_fdt_buf) {
+ len = state_get_rel_filename("arch/sandbox/dts/other.dtb",
+ fname, sizeof(fname));
+ if (len < 0)
+ return len;
+
+ ret = os_read_file(fname, &state->other_fdt_buf,
+ &state->other_size);
+ if (ret) {
+ log_err("Cannot read file '%s'\n", fname);
+ return ret;
+ }
+ }
+ *bufp = state->other_fdt_buf;
+ *sizep = state->other_size;
+
+ return 0;
+}
+
int state_init(void)
{
state = &main_state;