From 61249065f530cb32b1a09a0aac224ebf2f6a87db Mon Sep 17 00:00:00 2001 From: Zheng Bao Date: Sat, 21 Sep 2024 13:50:37 +0800 Subject: [PATCH] amdfwtool: Move L1 before L2 It is more reasonable. And, in later change, the Level 1 should be split with Level 2 and combined with EFS. Change locate_bdt2_bios to locate_bdt_bios. This function is more flexibile and covers both L1 and L2 BIOS directory table. Change-Id: I74605013cf53a38686f4e1e5a89a4e6a870f1f4b Signed-off-by: Zheng Bao Reviewed-on: https://review.coreboot.org/c/coreboot/+/84532 Reviewed-by: Maximilian Brune Tested-by: build bot (Jenkins) --- util/amdfwtool/amdfwtool.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c index 7b5e70e3c3..b59c10f21a 100644 --- a/util/amdfwtool/amdfwtool.c +++ b/util/amdfwtool/amdfwtool.c @@ -1162,20 +1162,20 @@ static void *new_bios_dir(context *ctx, bool multi, uint32_t cookie) return ptr; } -static int locate_bdt2_bios(bios_directory_table *level2, +static int locate_bdt_bios(bios_directory_table *level, uint64_t *source, uint32_t *size) { uint32_t i; *source = 0; *size = 0; - if (!level2) + if (!level) return 0; - for (i = 0 ; i < level2->header.num_entries ; i++) { - if (level2->entries[i].type == AMD_BIOS_BIN) { - *source = level2->entries[i].source; - *size = level2->entries[i].size; + for (i = 0 ; i < level->header.num_entries ; i++) { + if (level->entries[i].type == AMD_BIOS_BIN) { + *source = level->entries[i].source; + *size = level->entries[i].size; return 1; } } @@ -1426,7 +1426,8 @@ static void integrate_bios_firmwares(context *ctx, break; case AMD_BIOS_BIN: /* Don't make a 2nd copy, point to the same one */ - if (level == BDT_LVL1 && locate_bdt2_bios(ctx->biosdir2, &source, &size)) { + if ((level == BDT_LVL1 && locate_bdt_bios(ctx->biosdir2, &source, &size)) || + (level == BDT_LVL2 && locate_bdt_bios(ctx->biosdir, &source, &size))) { biosdir->entries[count].source = source; biosdir->entries[count].address_mode = SET_ADDR_MODE(biosdir, AMD_ADDR_REL_BIOS); @@ -1434,7 +1435,7 @@ static void integrate_bios_firmwares(context *ctx, break; } - /* level 2, or level 1 and no copy found in level 2 */ + /* Level 2 and no copy found in level 1, or level 1 and no copy found in level 2 */ biosdir->entries[count].source = fw_table[i].src; biosdir->entries[count].address_mode = SET_ADDR_MODE(biosdir, AMD_ADDR_REL_BIOS); @@ -1766,7 +1767,11 @@ int main(int argc, char **argv) } if (cb_config.multi_level) { - /* Do 2nd PSP directory followed by 1st */ + /* PSP L1 */ + if (!cb_config.combo_new_rab || ctx.combo_index == 0) + integrate_psp_firmwares(&ctx, + amd_psp_fw_table, PSP_COOKIE, &cb_config); + /* PSP L2 & BIOS L2 (if AB recovery) */ integrate_psp_firmwares(&ctx, amd_psp_fw_table, PSPL2_COOKIE, &cb_config); if (cb_config.recovery_ab) { @@ -1780,9 +1785,6 @@ int main(int argc, char **argv) } integrate_bios_levels(&ctx, &cb_config); } - if (!cb_config.combo_new_rab || ctx.combo_index == 0) - integrate_psp_firmwares(&ctx, - amd_psp_fw_table, PSP_COOKIE, &cb_config); integrate_psp_levels(&ctx, &cb_config); } else { /* flat: PSP 1 cookie and no pointer to 2nd table */ @@ -1801,16 +1803,15 @@ int main(int argc, char **argv) if (have_bios_tables(amd_bios_table) && !cb_config.recovery_ab) { if (cb_config.multi_level) { - /* Do 2nd level BIOS directory followed by 1st */ + integrate_bios_firmwares(&ctx, + amd_bios_table, BHD_COOKIE, &cb_config); integrate_bios_firmwares(&ctx, amd_bios_table, BHDL2_COOKIE, &cb_config); - integrate_bios_firmwares(&ctx, - amd_bios_table, BHD_COOKIE, &cb_config); integrate_bios_levels(&ctx, &cb_config); } else { /* flat: BHD1 cookie and no pointer to 2nd table */ integrate_bios_firmwares(&ctx, - amd_bios_table, BHD_COOKIE, &cb_config); + amd_bios_table, BHD_COOKIE, &cb_config); } if (!cb_config.use_combo) { fill_bios_directory_to_efs(ctx.amd_romsig_ptr, ctx.biosdir,