Merge branch '2022-09-14-refactor-ramdisk-code-again' into next
To quote the author: The previous attempt at this[1] broke a board and was reverted in [2]. This series adopts a slightly different approach, splitting the changes into many commits. [1]f33a2c1bd0
("image: Remove #ifdefs from select_ramdisk()") [2]621158d106
("Revert "image: Remove #ifdefs from select_ramdisk()"")
This commit is contained in:
commit
6541726ee9
2 changed files with 120 additions and 96 deletions
|
@ -16,6 +16,7 @@
|
|||
#include <fpga.h>
|
||||
#include <image.h>
|
||||
#include <init.h>
|
||||
#include <log.h>
|
||||
#include <mapmem.h>
|
||||
#include <rtc.h>
|
||||
#include <watchdog.h>
|
||||
|
@ -24,7 +25,6 @@
|
|||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
|
||||
/**
|
||||
* image_get_ramdisk - get and verify ramdisk image
|
||||
* @rd_addr: ramdisk image start address
|
||||
|
@ -83,7 +83,6 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, u8 arch,
|
|||
|
||||
return rd_hdr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Shared dual-format routines */
|
||||
|
@ -174,29 +173,29 @@ void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
|
|||
if (to == from)
|
||||
return;
|
||||
|
||||
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
|
||||
if (to > from) {
|
||||
from += len;
|
||||
to += len;
|
||||
}
|
||||
while (len > 0) {
|
||||
size_t tail = (len > chunksz) ? chunksz : len;
|
||||
|
||||
WATCHDOG_RESET();
|
||||
if (IS_ENABLED(CONFIG_HW_WATCHDOG) || IS_ENABLED(CONFIG_WATCHDOG)) {
|
||||
if (to > from) {
|
||||
to -= tail;
|
||||
from -= tail;
|
||||
from += len;
|
||||
to += len;
|
||||
}
|
||||
memmove(to, from, tail);
|
||||
if (to < from) {
|
||||
to += tail;
|
||||
from += tail;
|
||||
while (len > 0) {
|
||||
size_t tail = (len > chunksz) ? chunksz : len;
|
||||
|
||||
WATCHDOG_RESET();
|
||||
if (to > from) {
|
||||
to -= tail;
|
||||
from -= tail;
|
||||
}
|
||||
memmove(to, from, tail);
|
||||
if (to < from) {
|
||||
to += tail;
|
||||
from += tail;
|
||||
}
|
||||
len -= tail;
|
||||
}
|
||||
len -= tail;
|
||||
} else {
|
||||
memmove(to, from, len);
|
||||
}
|
||||
#else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
|
||||
memmove(to, from, len);
|
||||
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -314,7 +313,7 @@ int genimg_has_config(bootm_headers_t *images)
|
|||
* select_ramdisk() - Select and locate the ramdisk to use
|
||||
*
|
||||
* @images: pointer to the bootm images structure
|
||||
* @select: name of ramdisk to select, or NULL for any
|
||||
* @select: name of ramdisk to select, or hex address, NULL for any
|
||||
* @arch: expected ramdisk architecture
|
||||
* @rd_datap: pointer to a ulong variable, will hold ramdisk pointer
|
||||
* @rd_lenp: pointer to a ulong variable, will hold ramdisk length
|
||||
|
@ -324,13 +323,17 @@ int genimg_has_config(bootm_headers_t *images)
|
|||
static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
|
||||
ulong *rd_datap, ulong *rd_lenp)
|
||||
{
|
||||
const char *fit_uname_config;
|
||||
const char *fit_uname_ramdisk;
|
||||
bool done_select = !select;
|
||||
bool done = false;
|
||||
int rd_noffset;
|
||||
ulong rd_addr;
|
||||
char *buf;
|
||||
|
||||
#if CONFIG_IS_ENABLED(FIT)
|
||||
const char *fit_uname_config = images->fit_uname_cfg;
|
||||
const char *fit_uname_ramdisk = NULL;
|
||||
int rd_noffset;
|
||||
if (CONFIG_IS_ENABLED(FIT)) {
|
||||
fit_uname_config = images->fit_uname_cfg;
|
||||
fit_uname_ramdisk = NULL;
|
||||
|
||||
if (select) {
|
||||
ulong default_addr;
|
||||
|
@ -345,48 +348,47 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
|
|||
else
|
||||
default_addr = image_load_addr;
|
||||
|
||||
if (fit_parse_conf(select, default_addr,
|
||||
&rd_addr, &fit_uname_config)) {
|
||||
if (fit_parse_conf(select, default_addr, &rd_addr,
|
||||
&fit_uname_config)) {
|
||||
debug("* ramdisk: config '%s' from image at 0x%08lx\n",
|
||||
fit_uname_config, rd_addr);
|
||||
done_select = true;
|
||||
} else if (fit_parse_subimage(select, default_addr,
|
||||
&rd_addr,
|
||||
&fit_uname_ramdisk)) {
|
||||
debug("* ramdisk: subimage '%s' from image at 0x%08lx\n",
|
||||
fit_uname_ramdisk, rd_addr);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
rd_addr = hextoul(select, NULL);
|
||||
debug("* ramdisk: cmdline image address = 0x%08lx\n",
|
||||
rd_addr);
|
||||
done_select = true;
|
||||
}
|
||||
#if CONFIG_IS_ENABLED(FIT)
|
||||
} else {
|
||||
/* use FIT configuration provided in first bootm
|
||||
* command argument. If the property is not defined,
|
||||
* quit silently (with -ENOPKG)
|
||||
*/
|
||||
rd_addr = map_to_sysmem(images->fit_hdr_os);
|
||||
rd_noffset = fit_get_node_from_config(images,
|
||||
FIT_RAMDISK_PROP,
|
||||
rd_addr);
|
||||
if (rd_noffset == -ENOENT)
|
||||
return -ENOPKG;
|
||||
else if (rd_noffset < 0)
|
||||
return rd_noffset;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check if there is an initrd image at the
|
||||
* address provided in the second bootm argument
|
||||
* check image type, for FIT images get FIT node.
|
||||
}
|
||||
if (!done_select) {
|
||||
rd_addr = hextoul(select, NULL);
|
||||
debug("* ramdisk: cmdline image address = 0x%08lx\n", rd_addr);
|
||||
}
|
||||
if (CONFIG_IS_ENABLED(FIT) && !select) {
|
||||
/* use FIT configuration provided in first bootm
|
||||
* command argument. If the property is not defined,
|
||||
* quit silently (with -ENOPKG)
|
||||
*/
|
||||
buf = map_sysmem(rd_addr, 0);
|
||||
switch (genimg_get_format(buf)) {
|
||||
#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
|
||||
case IMAGE_FORMAT_LEGACY: {
|
||||
rd_addr = map_to_sysmem(images->fit_hdr_os);
|
||||
rd_noffset = fit_get_node_from_config(images, FIT_RAMDISK_PROP,
|
||||
rd_addr);
|
||||
if (rd_noffset == -ENOENT)
|
||||
return -ENOPKG;
|
||||
else if (rd_noffset < 0)
|
||||
return rd_noffset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if there is an initrd image at the
|
||||
* address provided in the second bootm argument
|
||||
* check image type, for FIT images get FIT node.
|
||||
*/
|
||||
buf = map_sysmem(rd_addr, 0);
|
||||
switch (genimg_get_format(buf)) {
|
||||
case IMAGE_FORMAT_LEGACY:
|
||||
if (CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)) {
|
||||
const image_header_t *rd_hdr;
|
||||
|
||||
printf("## Loading init Ramdisk from Legacy Image at %08lx ...\n",
|
||||
|
@ -401,15 +403,15 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
|
|||
|
||||
*rd_datap = image_get_data(rd_hdr);
|
||||
*rd_lenp = image_get_data_size(rd_hdr);
|
||||
break;
|
||||
done = true;
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_IS_ENABLED(FIT)
|
||||
case IMAGE_FORMAT_FIT:
|
||||
rd_noffset = fit_image_load(images,
|
||||
rd_addr, &fit_uname_ramdisk,
|
||||
&fit_uname_config, arch,
|
||||
IH_TYPE_RAMDISK,
|
||||
break;
|
||||
case IMAGE_FORMAT_FIT:
|
||||
if (CONFIG_IS_ENABLED(FIT)) {
|
||||
rd_noffset = fit_image_load(images, rd_addr,
|
||||
&fit_uname_ramdisk,
|
||||
&fit_uname_config,
|
||||
arch, IH_TYPE_RAMDISK,
|
||||
BOOTSTAGE_ID_FIT_RD_START,
|
||||
FIT_LOAD_OPTIONAL_NON_ZERO,
|
||||
rd_datap, rd_lenp);
|
||||
|
@ -419,29 +421,41 @@ static int select_ramdisk(bootm_headers_t *images, const char *select, u8 arch,
|
|||
images->fit_hdr_rd = map_sysmem(rd_addr, 0);
|
||||
images->fit_uname_rd = fit_uname_ramdisk;
|
||||
images->fit_noffset_rd = rd_noffset;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_ANDROID_BOOT_IMAGE
|
||||
case IMAGE_FORMAT_ANDROID:
|
||||
android_image_get_ramdisk((void *)images->os.start,
|
||||
rd_datap, rd_lenp);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
|
||||
char *end = NULL;
|
||||
done = true;
|
||||
}
|
||||
break;
|
||||
case IMAGE_FORMAT_ANDROID:
|
||||
if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
|
||||
void *ptr = map_sysmem(images->os.start, 0);
|
||||
int ret;
|
||||
|
||||
if (select)
|
||||
end = strchr(select, ':');
|
||||
if (end) {
|
||||
*rd_lenp = hextoul(++end, NULL);
|
||||
*rd_datap = rd_addr;
|
||||
break;
|
||||
}
|
||||
ret = android_image_get_ramdisk(ptr, rd_datap, rd_lenp);
|
||||
unmap_sysmem(ptr);
|
||||
if (ret)
|
||||
return ret;
|
||||
done = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!done) {
|
||||
if (IS_ENABLED(CONFIG_SUPPORT_RAW_INITRD)) {
|
||||
char *end = NULL;
|
||||
|
||||
if (select)
|
||||
end = strchr(select, ':');
|
||||
if (end) {
|
||||
*rd_lenp = hextoul(++end, NULL);
|
||||
*rd_datap = rd_addr;
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!done) {
|
||||
puts("Wrong Ramdisk Image Format\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -538,7 +552,6 @@ int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_LMB)
|
||||
/**
|
||||
* boot_ramdisk_high - relocate init ramdisk
|
||||
* @lmb: pointer to lmb handle, will be used for memory mgmt
|
||||
|
@ -632,7 +645,6 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
|
|||
error:
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
int boot_get_setup(bootm_headers_t *images, u8 arch,
|
||||
ulong *setup_start, ulong *setup_len)
|
||||
|
@ -826,15 +838,13 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_LMB)
|
||||
#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
|
||||
/**
|
||||
* boot_get_cmdline - allocate and initialize kernel cmdline
|
||||
* @lmb: pointer to lmb handle, will be used for memory mgmt
|
||||
* @cmd_start: pointer to a ulong variable, will hold cmdline start
|
||||
* @cmd_end: pointer to a ulong variable, will hold cmdline end
|
||||
*
|
||||
* boot_get_cmdline() allocates space for kernel command line below
|
||||
* This allocates space for kernel command line below
|
||||
* BOOTMAPSZ + env_get_bootm_low() address. If "bootargs" U-Boot environment
|
||||
* variable is present its contents is copied to allocated kernel
|
||||
* command line.
|
||||
|
@ -845,10 +855,19 @@ int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
|
|||
*/
|
||||
int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
|
||||
{
|
||||
int barg;
|
||||
char *cmdline;
|
||||
char *s;
|
||||
|
||||
cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
|
||||
/*
|
||||
* Help the compiler detect that this function is only called when
|
||||
* CONFIG_SYS_BOOT_GET_CMDLINE is enabled
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_SYS_BOOT_GET_CMDLINE))
|
||||
return 0;
|
||||
|
||||
barg = IF_ENABLED_INT(CONFIG_SYS_BOOT_GET_CMDLINE, CONFIG_SYS_BARGSIZE);
|
||||
cmdline = (char *)(ulong)lmb_alloc_base(lmb, barg, 0xf,
|
||||
env_get_bootm_mapsize() + env_get_bootm_low());
|
||||
if (!cmdline)
|
||||
return -1;
|
||||
|
@ -894,22 +913,22 @@ int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
|
|||
|
||||
debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
|
||||
|
||||
#if defined(DEBUG)
|
||||
if (IS_ENABLED(CONFIG_CMD_BDI))
|
||||
if (_DEBUG && IS_ENABLED(CONFIG_CMD_BDI))
|
||||
do_bdinfo(NULL, 0, 0, NULL);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int image_setup_linux(bootm_headers_t *images)
|
||||
{
|
||||
ulong of_size = images->ft_len;
|
||||
char **of_flat_tree = &images->ft_addr;
|
||||
struct lmb *lmb = &images->lmb;
|
||||
struct lmb *lmb = images_lmb(images);
|
||||
int ret;
|
||||
|
||||
/* This function cannot be called without lmb support */
|
||||
if (!CONFIG_IS_ENABLED(LMB))
|
||||
return -EFAULT;
|
||||
if (CONFIG_IS_ENABLED(OF_LIBFDT))
|
||||
boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
|
||||
|
||||
|
@ -936,7 +955,6 @@ int image_setup_linux(bootm_headers_t *images)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void genimg_print_size(uint32_t size)
|
||||
{
|
||||
|
|
|
@ -360,6 +360,12 @@ typedef struct bootm_headers {
|
|||
#endif
|
||||
} bootm_headers_t;
|
||||
|
||||
#ifdef CONFIG_LMB
|
||||
#define images_lmb(_images) (&(_images)->lmb)
|
||||
#else
|
||||
#define images_lmb(_images) NULL
|
||||
#endif
|
||||
|
||||
extern bootm_headers_t images;
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue