mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 07:31:15 +00:00
binman: Add a library to access binman entries
SPL and TPL can access information about binman entries using link-time symbols but this is not available in U-Boot proper. Of course it could be made available, but the intention is to just read the device tree. Add support for this, so that U-Boot can locate entries. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
553cb06887
commit
3c10dc95bd
5 changed files with 114 additions and 0 deletions
|
@ -18,6 +18,7 @@
|
|||
#if defined(CONFIG_CMD_BEDBUG)
|
||||
#include <bedbug/type.h>
|
||||
#endif
|
||||
#include <binman.h>
|
||||
#include <command.h>
|
||||
#include <console.h>
|
||||
#include <dm.h>
|
||||
|
@ -347,6 +348,14 @@ static int initr_manual_reloc_cmdtable(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int initr_binman(void)
|
||||
{
|
||||
if (!CONFIG_IS_ENABLED(BINMAN_FDT))
|
||||
return 0;
|
||||
|
||||
return binman_init();
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MTD_NOR_FLASH)
|
||||
static int initr_flash(void)
|
||||
{
|
||||
|
@ -697,6 +706,7 @@ static init_fnc_t init_sequence_r[] = {
|
|||
#ifdef CONFIG_EFI_LOADER
|
||||
efi_memory_init,
|
||||
#endif
|
||||
initr_binman,
|
||||
stdio_init_tables,
|
||||
initr_serial,
|
||||
initr_announce,
|
||||
|
|
45
include/binman.h
Normal file
45
include/binman.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/* SPDX-License-Identifier: Intel */
|
||||
/*
|
||||
* Access to binman information at runtime
|
||||
*
|
||||
* Copyright 2019 Google LLC
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#ifndef _BINMAN_H_
|
||||
#define _BINMAN_H_
|
||||
|
||||
/**
|
||||
*struct binman_entry - information about a binman entry
|
||||
*
|
||||
* @image_pos: Position of entry in the image
|
||||
* @size: Size of entry
|
||||
*/
|
||||
struct binman_entry {
|
||||
u32 image_pos;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
/**
|
||||
* binman_entry_find() - Find a binman symbol
|
||||
*
|
||||
* This searches the binman information in the device tree for a symbol of the
|
||||
* given name
|
||||
*
|
||||
* @name: Path to entry to examine (e.g. "/read-only/u-boot")
|
||||
* @entry: Returns information about the entry
|
||||
* @return 0 if OK, -ENOENT if the path is not found, other -ve value if the
|
||||
* binman information is invalid (missing image-pos or size)
|
||||
*/
|
||||
int binman_entry_find(const char *name, struct binman_entry *entry);
|
||||
|
||||
/**
|
||||
* binman_init() - Set up the binman symbol information
|
||||
*
|
||||
* This locates the binary symbol information in the device tree ready for use
|
||||
*
|
||||
* @return 0 if OK, -ENOMEM if out of memory, -EINVAL if there is no binman node
|
||||
*/
|
||||
int binman_init(void);
|
||||
|
||||
#endif
|
10
lib/Kconfig
10
lib/Kconfig
|
@ -7,6 +7,16 @@ config BCH
|
|||
This is used by SoC platforms which do not have built-in ELM
|
||||
hardware engine required for BCH ECC correction.
|
||||
|
||||
config BINMAN_FDT
|
||||
bool "Allow access to binman information in the device tree"
|
||||
depends on BINMAN && OF_CONTROL
|
||||
default y
|
||||
help
|
||||
This enables U-Boot to access information about binman entries,
|
||||
stored in the device tree in a binman node. Typical uses are to
|
||||
locate entries in the firmware image. See binman.h for the available
|
||||
functionality.
|
||||
|
||||
config CC_OPTIMIZE_LIBS_FOR_SPEED
|
||||
bool "Optimize libraries for speed"
|
||||
help
|
||||
|
|
|
@ -21,6 +21,7 @@ obj-$(CONFIG_ASN1_DECODER) += asn1_decoder.o
|
|||
obj-y += crypto/
|
||||
|
||||
obj-$(CONFIG_AES) += aes.o
|
||||
obj-$(CONFIG_$(SPL_TPL_)BINMAN_FDT) += binman.o
|
||||
|
||||
ifndef API_BUILD
|
||||
ifneq ($(CONFIG_UT_UNICODE)$(CONFIG_EFI_LOADER),)
|
||||
|
|
48
lib/binman.c
Normal file
48
lib/binman.c
Normal file
|
@ -0,0 +1,48 @@
|
|||
// SPDX-License-Identifier: Intel
|
||||
/*
|
||||
* Access to binman information at runtime
|
||||
*
|
||||
* Copyright 2019 Google LLC
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <binman.h>
|
||||
#include <dm.h>
|
||||
|
||||
struct binman_info {
|
||||
ofnode image;
|
||||
};
|
||||
|
||||
static struct binman_info *binman;
|
||||
|
||||
int binman_entry_find(const char *name, struct binman_entry *entry)
|
||||
{
|
||||
ofnode node;
|
||||
int ret;
|
||||
|
||||
node = ofnode_find_subnode(binman->image, name);
|
||||
if (!ofnode_valid(node))
|
||||
return log_msg_ret("no binman node", -ENOENT);
|
||||
|
||||
ret = ofnode_read_u32(node, "image-pos", &entry->image_pos);
|
||||
if (ret)
|
||||
return log_msg_ret("bad binman node1", ret);
|
||||
ret = ofnode_read_u32(node, "size", &entry->size);
|
||||
if (ret)
|
||||
return log_msg_ret("bad binman node2", ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int binman_init(void)
|
||||
{
|
||||
binman = malloc(sizeof(struct binman_info));
|
||||
if (!binman)
|
||||
return log_msg_ret("space for binman", -ENOMEM);
|
||||
binman->image = ofnode_path("/binman");
|
||||
if (!ofnode_valid(binman->image))
|
||||
return log_msg_ret("binman node", -EINVAL);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue