mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
fdt: sandbox: Move setup code from board_f to fdtdec
We want to be able to set up the device tree in SPL, so move this code to a common place. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
5a87c4174d
commit
b45122fdf5
5 changed files with 88 additions and 65 deletions
|
@ -6,6 +6,7 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <dm/root.h>
|
#include <dm/root.h>
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
|
#include <asm/io.h>
|
||||||
#include <asm/state.h>
|
#include <asm/state.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
@ -97,3 +98,43 @@ phys_addr_t map_to_sysmem(const void *ptr)
|
||||||
void flush_dcache_range(unsigned long start, unsigned long stop)
|
void flush_dcache_range(unsigned long start, unsigned long stop)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sandbox_read_fdt_from_file(void)
|
||||||
|
{
|
||||||
|
struct sandbox_state *state = state_get_current();
|
||||||
|
const char *fname = state->fdt_fname;
|
||||||
|
void *blob;
|
||||||
|
loff_t size;
|
||||||
|
int err;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
|
||||||
|
if (!state->fdt_fname) {
|
||||||
|
err = fdt_create_empty_tree(blob, 256);
|
||||||
|
if (!err)
|
||||||
|
goto done;
|
||||||
|
printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os_get_filesize(fname, &size);
|
||||||
|
if (err < 0) {
|
||||||
|
printf("Failed to file FDT file '%s'\n", fname);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
fd = os_open(fname, OS_O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
printf("Failed to open FDT file '%s'\n", fname);
|
||||||
|
return -EACCES;
|
||||||
|
}
|
||||||
|
if (os_read(fd, blob, size) != size) {
|
||||||
|
os_close(fd);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
os_close(fd);
|
||||||
|
|
||||||
|
done:
|
||||||
|
gd->fdt_blob = blob;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -75,4 +75,12 @@ int pci_unmap_physmem(const void *addr, unsigned long len,
|
||||||
*/
|
*/
|
||||||
void sandbox_set_enable_pci_map(int enable);
|
void sandbox_set_enable_pci_map(int enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sandbox_read_fdt_from_file() - Read a device tree from a file
|
||||||
|
*
|
||||||
|
* Read a device tree file from a host file and set it up for use as the
|
||||||
|
* control FDT.
|
||||||
|
*/
|
||||||
|
int sandbox_read_fdt_from_file(void);
|
||||||
|
|
||||||
#endif /* _U_BOOT_SANDBOX_H_ */
|
#endif /* _U_BOOT_SANDBOX_H_ */
|
||||||
|
|
|
@ -282,49 +282,6 @@ __weak int arch_cpu_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF_HOSTFILE
|
|
||||||
|
|
||||||
static int read_fdt_from_file(void)
|
|
||||||
{
|
|
||||||
struct sandbox_state *state = state_get_current();
|
|
||||||
const char *fname = state->fdt_fname;
|
|
||||||
void *blob;
|
|
||||||
loff_t size;
|
|
||||||
int err;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
|
|
||||||
if (!state->fdt_fname) {
|
|
||||||
err = fdt_create_empty_tree(blob, 256);
|
|
||||||
if (!err)
|
|
||||||
goto done;
|
|
||||||
printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = os_get_filesize(fname, &size);
|
|
||||||
if (err < 0) {
|
|
||||||
printf("Failed to file FDT file '%s'\n", fname);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
fd = os_open(fname, OS_O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
printf("Failed to open FDT file '%s'\n", fname);
|
|
||||||
return -EACCES;
|
|
||||||
}
|
|
||||||
if (os_read(fd, blob, size) != size) {
|
|
||||||
os_close(fd);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
os_close(fd);
|
|
||||||
|
|
||||||
done:
|
|
||||||
gd->fdt_blob = blob;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SANDBOX
|
#ifdef CONFIG_SANDBOX
|
||||||
static int setup_ram_buf(void)
|
static int setup_ram_buf(void)
|
||||||
{
|
{
|
||||||
|
@ -337,28 +294,6 @@ static int setup_ram_buf(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int setup_fdt(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_OF_CONTROL
|
|
||||||
# ifdef CONFIG_OF_EMBED
|
|
||||||
/* Get a pointer to the FDT */
|
|
||||||
gd->fdt_blob = __dtb_dt_begin;
|
|
||||||
# elif defined CONFIG_OF_SEPARATE
|
|
||||||
/* FDT is at end of image */
|
|
||||||
gd->fdt_blob = (ulong *)&_end;
|
|
||||||
# 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,
|
|
||||||
(uintptr_t)gd->fdt_blob);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the top of usable RAM */
|
/* Get the top of usable RAM */
|
||||||
__weak ulong board_get_usable_ram_top(ulong total_size)
|
__weak ulong board_get_usable_ram_top(ulong total_size)
|
||||||
{
|
{
|
||||||
|
@ -826,7 +761,9 @@ static init_fnc_t init_sequence_f[] = {
|
||||||
setup_ram_buf,
|
setup_ram_buf,
|
||||||
#endif
|
#endif
|
||||||
setup_mon_len,
|
setup_mon_len,
|
||||||
|
#ifdef CONFIG_OF_CONTROL
|
||||||
setup_fdt,
|
setup_fdt,
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_TRACE
|
#ifdef CONFIG_TRACE
|
||||||
trace_early_init,
|
trace_early_init,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -793,4 +793,10 @@ int fdt_get_named_resource(const void *fdt, int node, const char *property,
|
||||||
int fdtdec_decode_memory_region(const void *blob, int node,
|
int fdtdec_decode_memory_region(const void *blob, int node,
|
||||||
const char *mem_type, const char *suffix,
|
const char *mem_type, const char *suffix,
|
||||||
fdt_addr_t *basep, fdt_size_t *sizep);
|
fdt_addr_t *basep, fdt_size_t *sizep);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the device tree ready for use
|
||||||
|
*/
|
||||||
|
int setup_fdt(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
31
lib/fdtdec.c
31
lib/fdtdec.c
|
@ -9,6 +9,7 @@
|
||||||
#include <serial.h>
|
#include <serial.h>
|
||||||
#include <libfdt.h>
|
#include <libfdt.h>
|
||||||
#include <fdtdec.h>
|
#include <fdtdec.h>
|
||||||
|
#include <asm/sections.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
@ -1037,4 +1038,34 @@ int fdtdec_decode_memory_region(const void *blob, int config_node,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int setup_fdt(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_OF_CONTROL
|
||||||
|
# ifdef CONFIG_OF_EMBED
|
||||||
|
/* Get a pointer to the FDT */
|
||||||
|
gd->fdt_blob = __dtb_dt_begin;
|
||||||
|
# elif defined CONFIG_OF_SEPARATE
|
||||||
|
# ifdef CONFIG_SPL_BUILD
|
||||||
|
/* FDT is at end of BSS */
|
||||||
|
gd->fdt_blob = (ulong *)&__bss_end;
|
||||||
|
# else
|
||||||
|
/* FDT is at end of image */
|
||||||
|
gd->fdt_blob = (ulong *)&_end;
|
||||||
#endif
|
#endif
|
||||||
|
# elif defined(CONFIG_OF_HOSTFILE)
|
||||||
|
if (sandbox_read_fdt_from_file()) {
|
||||||
|
puts("Failed to read control FDT\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
# ifndef CONFIG_SPL_BUILD
|
||||||
|
/* Allow the early environment to override the fdt address */
|
||||||
|
gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
|
||||||
|
(uintptr_t)gd->fdt_blob);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !USE_HOSTCC */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue