region_file_update_data_arr: Modify region_file with array of buffers

Add region_file_update_data_arr, which has the same functionality as
region_file_update_data, but accepts mutliple data buffers.  This is
useful for when we have the mrc_metadata and data in non-contiguous
addresses, which is the case when we bypass the storing of mrc_cache
data into the cbmem.

BUG=b:150502246
BRANCH=None
TEST=reboot from ec console.  Make sure memory training happens.
     reboot from ec console.  Make sure that we don't do training again.

Change-Id: Ia530f7d428b9b07ce3a73e348016038d9daf4c15
Signed-off-by: Shelley Chen <shchen@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/45407
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Shelley Chen 2020-09-15 00:41:14 -07:00
parent a79e01bf71
commit 2d90ddd2d2
2 changed files with 43 additions and 11 deletions

View File

@ -31,9 +31,22 @@ int region_file_init(struct region_file *f, const struct region_device *p);
*/
int region_file_data(const struct region_file *f, struct region_device *rdev);
/*
* Create region file entry struct to insert multiple data buffers
* into the same region_file.
*/
struct update_region_file_entry {
/* size of this entry */
size_t size;
/* data pointer */
const void *data;
};
/* Update region file with latest data. Returns < 0 on error, 0 on success. */
int region_file_update_data(struct region_file *f, const void *buf,
size_t size);
int region_file_update_data_arr(struct region_file *f,
const struct update_region_file_entry *entries,
size_t num_entries);
int region_file_update_data(struct region_file *f, const void *buf, size_t size);
/* Declared here for easy object allocation. */
struct region_file {

View File

@ -365,12 +365,16 @@ static int commit_data_allocation(struct region_file *f, size_t data_blks)
return 0;
}
static int commit_data(const struct region_file *f, const void *buf,
size_t size)
static int commit_data(const struct region_file *f,
const struct update_region_file_entry *entries,
size_t num_entries)
{
size_t offset = block_to_bytes(region_file_data_begin(f));
if (rdev_writeat(&f->rdev, buf, offset, size) < 0)
return -1;
for (int i = 0; i < num_entries; i++) {
if (rdev_writeat(&f->rdev, entries[i].data, offset, entries[i].size) < 0)
return -1;
offset += entries[i].size;
}
return 0;
}
@ -399,8 +403,9 @@ static int handle_need_to_empty(struct region_file *f)
return 0;
}
static int handle_update(struct region_file *f, size_t blocks, const void *buf,
size_t size)
static int handle_update(struct region_file *f, size_t blocks,
const struct update_region_file_entry *entries,
size_t num_entries)
{
if (!update_can_fit(f, blocks)) {
printk(BIOS_INFO, "REGF update can't fit. Will empty.\n");
@ -413,7 +418,7 @@ static int handle_update(struct region_file *f, size_t blocks, const void *buf,
return -1;
}
if (commit_data(f, buf, size)) {
if (commit_data(f, entries, num_entries)) {
printk(BIOS_ERR, "REGF failed to commit data.\n");
return -1;
}
@ -421,11 +426,16 @@ static int handle_update(struct region_file *f, size_t blocks, const void *buf,
return 0;
}
int region_file_update_data(struct region_file *f, const void *buf, size_t size)
int region_file_update_data_arr(struct region_file *f,
const struct update_region_file_entry *entries,
size_t num_entries)
{
int ret;
size_t blocks;
size_t size = 0;
for (int i = 0; i < num_entries; i++)
size += entries[i].size;
blocks = bytes_to_block(ALIGN_UP(size, REGF_BLOCK_GRANULARITY));
while (1) {
@ -442,7 +452,7 @@ int region_file_update_data(struct region_file *f, const void *buf, size_t size)
ret = -1;
break;
default:
ret = handle_update(f, blocks, buf, size);
ret = handle_update(f, blocks, entries, num_entries);
break;
}
@ -459,3 +469,12 @@ int region_file_update_data(struct region_file *f, const void *buf, size_t size)
return ret;
}
int region_file_update_data(struct region_file *f, const void *buf, size_t size)
{
struct update_region_file_entry entry = {
.size = size,
.data = buf,
};
return region_file_update_data_arr(f, &entry, 1);
}