util/ifittool: Add an option to set the FIT pointer a CBFS file

The purpose of this is to eventually move the FIT table out of the
bootblock, generate it separately as a cbfs file and then have the FIT
pointer point to that cbfs file.

TESTED: extracted a FIT table using dd, added it as a cbfs file and see
that the FIT pointer correctly points to it. Also test that trying to
add a non valid FIT cbfs file results in an error.

Change-Id: I6e38b7df31e6b30f75b0ae57a5332f386e00f16b
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50925
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-by: Christian Walter <christian.walter@9elements.com>
This commit is contained in:
Arthur Heymans
2021-02-17 17:34:44 +01:00
committed by Patrick Georgi
parent 6ca3375c08
commit e9e4e54e27
3 changed files with 105 additions and 30 deletions

View File

@@ -519,6 +519,40 @@ int fit_add_microcode_file(struct fit_table *fit,
return 0;
}
static uint32_t *get_fit_ptr(struct buffer *bootblock, fit_offset_converter_t offset_fn,
uint32_t topswap_size)
{
return rom_buffer_pointer(bootblock,
ptr_to_offset(offset_fn, bootblock,
FIT_POINTER_LOCATION - topswap_size));
}
/* Set the FIT pointer to a FIT table. */
int set_fit_pointer(struct buffer *bootblock,
const uint32_t fit_address,
fit_offset_converter_t offset_fn,
uint32_t topswap_size)
{
struct fit_table *fit;
uint32_t *fit_pointer = get_fit_ptr(bootblock, offset_fn, topswap_size);
fit = rom_buffer_pointer(bootblock, ptr_to_offset(offset_fn, bootblock, fit_address));
if (fit_address < FIT_TABLE_LOWEST_ADDRESS) {
ERROR("FIT must be reside in the top 16MiB.\n");
return 1;
}
if (!fit_table_verified(fit)) {
ERROR("FIT not found at address.\n");
return 1;
}
fit_pointer[0] = fit_address;
fit_pointer[1] = 0;
return 0;
}
/*
* Return a pointer to the active FIT.
*/
@@ -527,11 +561,7 @@ struct fit_table *fit_get_table(struct buffer *bootblock,
uint32_t topswap_size)
{
struct fit_table *fit;
uint32_t *fit_pointer;
fit_pointer = rom_buffer_pointer(bootblock,
ptr_to_offset(offset_fn, bootblock,
FIT_POINTER_LOCATION));
uint32_t *fit_pointer = get_fit_ptr(bootblock, offset_fn, 0);
/* Ensure pointer is below 4GiB and within 16MiB of 4GiB */
if (fit_pointer[1] != 0 || fit_pointer[0] < FIT_TABLE_LOWEST_ADDRESS) {