mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-24 14:25:56 +00:00
cbfs: Record the start address in cbfs_priv
The start address of the CBFS is used when scanning for files. It makes sense to put this in our cbfs_priv struct and calculate it when we read the header. Update the code accordingly. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
e82ab51baf
commit
c685f8bcfc
1 changed files with 31 additions and 13 deletions
|
@ -14,8 +14,18 @@
|
||||||
static const u32 good_magic = 0x4f524243;
|
static const u32 good_magic = 0x4f524243;
|
||||||
static const u8 good_file_magic[] = "LARCHIVE";
|
static const u8 good_file_magic[] = "LARCHIVE";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct cbfs_priv - Private data for this driver
|
||||||
|
*
|
||||||
|
* @initialised: true if this CBFS has been inited
|
||||||
|
* @start: Start position of CBFS in memory, typically memory-mapped SPI flash
|
||||||
|
* @header: Header read from the CBFS, byte-swapped so U-Boot can access it
|
||||||
|
* @file_cache: List of file headers read from CBFS
|
||||||
|
* @result: Success/error result
|
||||||
|
*/
|
||||||
struct cbfs_priv {
|
struct cbfs_priv {
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
void *start;
|
||||||
struct cbfs_header header;
|
struct cbfs_header header;
|
||||||
struct cbfs_cachenode *file_cache;
|
struct cbfs_cachenode *file_cache;
|
||||||
enum cbfs_result result;
|
enum cbfs_result result;
|
||||||
|
@ -132,12 +142,12 @@ static int file_cbfs_next_file(struct cbfs_priv *priv, void *start, int size,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look through a CBFS instance and copy file metadata into regular memory. */
|
/* Look through a CBFS instance and copy file metadata into regular memory. */
|
||||||
static int file_cbfs_fill_cache(struct cbfs_priv *priv, void *start, u32 size,
|
static int file_cbfs_fill_cache(struct cbfs_priv *priv, int size, int align)
|
||||||
u32 align)
|
|
||||||
{
|
{
|
||||||
struct cbfs_cachenode *cache_node;
|
struct cbfs_cachenode *cache_node;
|
||||||
struct cbfs_cachenode *new_node;
|
struct cbfs_cachenode *new_node;
|
||||||
struct cbfs_cachenode **cache_tail = &priv->file_cache;
|
struct cbfs_cachenode **cache_tail = &priv->file_cache;
|
||||||
|
void *start;
|
||||||
|
|
||||||
/* Clear out old information. */
|
/* Clear out old information. */
|
||||||
cache_node = priv->file_cache;
|
cache_node = priv->file_cache;
|
||||||
|
@ -148,6 +158,7 @@ static int file_cbfs_fill_cache(struct cbfs_priv *priv, void *start, u32 size,
|
||||||
}
|
}
|
||||||
priv->file_cache = NULL;
|
priv->file_cache = NULL;
|
||||||
|
|
||||||
|
start = priv->start;
|
||||||
while (size >= align) {
|
while (size >= align) {
|
||||||
int used;
|
int used;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -213,8 +224,14 @@ static int load_header(struct cbfs_priv *priv, ulong addr)
|
||||||
static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
|
static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
|
||||||
{
|
{
|
||||||
int offset = *(u32 *)(end_of_rom - 3);
|
int offset = *(u32 *)(end_of_rom - 3);
|
||||||
|
int ret;
|
||||||
|
|
||||||
return load_header(priv, end_of_rom + offset + 1);
|
ret = load_header(priv, end_of_rom + offset + 1);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
priv->start = (void *)(end_of_rom + 1 - priv->header.rom_size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -226,20 +243,22 @@ static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
|
||||||
*/
|
*/
|
||||||
static int cbfs_load_header_ptr(struct cbfs_priv *priv, ulong base)
|
static int cbfs_load_header_ptr(struct cbfs_priv *priv, ulong base)
|
||||||
{
|
{
|
||||||
return load_header(priv, base + MASTER_HDR_OFFSET);
|
int ret;
|
||||||
|
|
||||||
|
ret = load_header(priv, base + MASTER_HDR_OFFSET);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
priv->start = (void *)base;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cbfs_init(struct cbfs_priv *priv, ulong end_of_rom)
|
static void cbfs_init(struct cbfs_priv *priv, ulong end_of_rom)
|
||||||
{
|
{
|
||||||
void *start_of_rom;
|
|
||||||
|
|
||||||
if (file_cbfs_load_header(priv, end_of_rom))
|
if (file_cbfs_load_header(priv, end_of_rom))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
start_of_rom = (void *)(end_of_rom + 1 - priv->header.rom_size);
|
file_cbfs_fill_cache(priv, priv->header.rom_size, priv->header.align);
|
||||||
|
|
||||||
file_cbfs_fill_cache(priv, start_of_rom, priv->header.rom_size,
|
|
||||||
priv->header.align);
|
|
||||||
if (priv->result == CBFS_SUCCESS)
|
if (priv->result == CBFS_SUCCESS)
|
||||||
priv->initialized = true;
|
priv->initialized = true;
|
||||||
}
|
}
|
||||||
|
@ -262,8 +281,7 @@ int cbfs_init_mem(ulong base, ulong size, struct cbfs_priv **privp)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
file_cbfs_fill_cache(priv, (void *)base, priv->header.rom_size,
|
file_cbfs_fill_cache(priv, priv->header.rom_size, priv->header.align);
|
||||||
priv->header.align);
|
|
||||||
if (priv->result != CBFS_SUCCESS)
|
if (priv->result != CBFS_SUCCESS)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -358,7 +376,7 @@ const struct cbfs_cachenode *file_cbfs_find_uncached(ulong end_of_rom,
|
||||||
if (file_cbfs_load_header(priv, end_of_rom))
|
if (file_cbfs_load_header(priv, end_of_rom))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
start = (void *)(end_of_rom + 1 - priv->header.rom_size);
|
start = priv->start;
|
||||||
size = priv->header.rom_size;
|
size = priv->header.rom_size;
|
||||||
align = priv->header.align;
|
align = priv->header.align;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue