mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-07-06 03:06:16 +09:00
![Simon Glass](/assets/img/avatar_default.png)
After some thought, I believe there is an unfortunate naming flaw in binman. Entries have a position and size, but now that we support hierarchical sections it is unclear whether a position should be an absolute position within the image, or a relative position within its parent section. At present 'position' actually means the relative position. This indicates a need for an 'image position' for code that wants to find the location of an entry without having to do calculations back through parents to discover this image position. A better name for the current 'position' or 'pos' is 'offset'. It is not always an absolute position, but it is always an offset from its parent offset. It is unfortunate to rename this concept now, 18 months after binman was introduced. However I believe it is the right thing to do. The impact is mostly limited to binman itself and a few changes to in-tree users to binman: tegra sunxi x86 The change makes old binman definitions (e.g. downstream or out-of-tree) incompatible if they use the 'pos = <...>' property. Later work will adjust binman to generate an error when it is used. Signed-off-by: Simon Glass <sjg@chromium.org>
84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* (C) Copyright 2016
|
|
* Xilinx, Inc.
|
|
*
|
|
* (C) Copyright 2016
|
|
* Toradex AG
|
|
*
|
|
* Michal Simek <michal.simek@xilinx.com>
|
|
* Stefan Agner <stefan.agner@toradex.com>
|
|
*/
|
|
#include <common.h>
|
|
#include <binman_sym.h>
|
|
#include <mapmem.h>
|
|
#include <spl.h>
|
|
#include <linux/libfdt.h>
|
|
|
|
#ifndef CONFIG_SPL_LOAD_FIT_ADDRESS
|
|
# define CONFIG_SPL_LOAD_FIT_ADDRESS 0
|
|
#endif
|
|
|
|
static ulong spl_ram_load_read(struct spl_load_info *load, ulong sector,
|
|
ulong count, void *buf)
|
|
{
|
|
debug("%s: sector %lx, count %lx, buf %lx\n",
|
|
__func__, sector, count, (ulong)buf);
|
|
memcpy(buf, (void *)(CONFIG_SPL_LOAD_FIT_ADDRESS + sector), count);
|
|
return count;
|
|
}
|
|
|
|
static int spl_ram_load_image(struct spl_image_info *spl_image,
|
|
struct spl_boot_device *bootdev)
|
|
{
|
|
struct image_header *header;
|
|
|
|
header = (struct image_header *)CONFIG_SPL_LOAD_FIT_ADDRESS;
|
|
|
|
#if CONFIG_IS_ENABLED(DFU_SUPPORT)
|
|
if (bootdev->boot_device == BOOT_DEVICE_DFU)
|
|
spl_dfu_cmd(0, "dfu_alt_info_ram", "ram", "0");
|
|
#endif
|
|
|
|
if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
|
|
image_get_magic(header) == FDT_MAGIC) {
|
|
struct spl_load_info load;
|
|
|
|
debug("Found FIT\n");
|
|
load.bl_len = 1;
|
|
load.read = spl_ram_load_read;
|
|
spl_load_simple_fit(spl_image, &load, 0, header);
|
|
} else {
|
|
ulong u_boot_pos = binman_sym(ulong, u_boot_any, offset);
|
|
|
|
debug("Legacy image\n");
|
|
/*
|
|
* Get the header. It will point to an address defined by
|
|
* handoff which will tell where the image located inside
|
|
* the flash.
|
|
*/
|
|
debug("u_boot_pos = %lx\n", u_boot_pos);
|
|
if (u_boot_pos == BINMAN_SYM_MISSING) {
|
|
/*
|
|
* No binman support or no information. For now, fix it
|
|
* to the address pointed to by U-Boot.
|
|
*/
|
|
u_boot_pos = CONFIG_SYS_TEXT_BASE -
|
|
sizeof(struct image_header);
|
|
}
|
|
header = (struct image_header *)map_sysmem(u_boot_pos, 0);
|
|
|
|
spl_parse_image_header(spl_image, header);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#if CONFIG_IS_ENABLED(RAM_DEVICE)
|
|
SPL_LOAD_IMAGE_METHOD("RAM", 0, BOOT_DEVICE_RAM, spl_ram_load_image);
|
|
#endif
|
|
#if CONFIG_IS_ENABLED(DFU_SUPPORT)
|
|
SPL_LOAD_IMAGE_METHOD("DFU", 0, BOOT_DEVICE_DFU, spl_ram_load_image);
|
|
#endif
|
|
|
|
|