amdfwtool: Add functions to link all the tables

The purpose of integration function is to pack the FWs into table. We
need to remove other process. Create a dedicate function to link all
the tables together. And this linking function is only called when
both the level 1 and level 2 directory are created. This simplifies
the main function and logic.

TEST=Identical test on all AMD SOC platform

Change-Id: Ieaf97208e943c79d7b76ea62eea9355138c220b9
Signed-off-by: Zheng Bao <fishbaozi@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/81252
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
This commit is contained in:
Zheng Bao 2024-03-14 13:35:38 +08:00 committed by Felix Held
parent e4214b7939
commit f360095d93

View File

@ -880,6 +880,60 @@ static void integrate_psp_ab(context *ctx, psp_directory_table *pspdir,
ctx->current_table = current_table_save; ctx->current_table = current_table_save;
} }
static void integrate_psp_levels(context *ctx,
amd_cb_config *cb_config)
{
uint32_t current_table_save;
bool recovery_ab = cb_config->recovery_ab;
unsigned int count;
psp_directory_table *pspdir, *pspdir2, *pspdir2_b;
bool use_only_a = (cb_config->soc_id == PLATFORM_PHOENIX); /* TODO: b:285390041 */
pspdir = ctx->pspdir;
pspdir2 = ctx->pspdir2;
pspdir2_b = ctx->pspdir2_b;
count = pspdir->header.num_entries;
current_table_save = ctx->current_table;
ctx->current_table = BUFF_TO_RUN_MODE(*ctx, pspdir, AMD_ADDR_REL_BIOS);
if (recovery_ab && (pspdir2 != NULL)) {
if (cb_config->need_ish) { /* Need ISH */
ctx->ish_a_dir = new_ish_dir(ctx);
if (pspdir2_b != NULL)
ctx->ish_b_dir = new_ish_dir(ctx);
}
pspdir->header.num_entries = count;
integrate_psp_ab(ctx, pspdir, pspdir2, ctx->ish_a_dir,
AMD_FW_RECOVERYAB_A, cb_config->soc_id);
if (pspdir2_b != NULL)
integrate_psp_ab(ctx, pspdir, pspdir2_b, ctx->ish_b_dir,
use_only_a ? AMD_FW_RECOVERYAB_A : AMD_FW_RECOVERYAB_B,
cb_config->soc_id);
else
integrate_psp_ab(ctx, pspdir, pspdir2, ctx->ish_a_dir,
use_only_a ? AMD_FW_RECOVERYAB_A : AMD_FW_RECOVERYAB_B,
cb_config->soc_id);
count = pspdir->header.num_entries;
} else if (pspdir2 != NULL) {
assert_fw_entry(count, MAX_PSP_ENTRIES, ctx);
pspdir->entries[count].type = AMD_FW_L2_PTR;
pspdir->entries[count].subprog = 0;
pspdir->entries[count].rsvd = 0;
pspdir->entries[count].size = sizeof(pspdir2->header)
+ pspdir2->header.num_entries
* sizeof(psp_directory_entry);
pspdir->entries[count].addr =
BUFF_TO_RUN_MODE(*ctx, pspdir2, AMD_ADDR_REL_BIOS);
pspdir->entries[count].address_mode =
SET_ADDR_MODE(pspdir, AMD_ADDR_REL_BIOS);
count++;
}
fill_dir_header(pspdir, count, PSP_COOKIE, ctx);
ctx->current_table = current_table_save;
}
static void integrate_psp_firmwares(context *ctx, static void integrate_psp_firmwares(context *ctx,
psp_directory_table *pspdir, psp_directory_table *pspdir,
psp_directory_table *pspdir2, psp_directory_table *pspdir2,
@ -895,7 +949,6 @@ static void integrate_psp_firmwares(context *ctx,
uint64_t addr; uint64_t addr;
uint32_t current_table_save; uint32_t current_table_save;
bool recovery_ab = cb_config->recovery_ab; bool recovery_ab = cb_config->recovery_ab;
bool use_only_a = (cb_config->soc_id == PLATFORM_PHOENIX); /* TODO: b:285390041 */
/* This function can create a primary table, a secondary table, or a /* This function can create a primary table, a secondary table, or a
* flattened table which contains all applicable types. These if-else * flattened table which contains all applicable types. These if-else
@ -1018,43 +1071,8 @@ static void integrate_psp_firmwares(context *ctx,
} }
} }
fill_dir_header(pspdir, count, cookie, ctx); (void) (pspdir2); /* TODO: To be removed in next CLs */
(void) (pspdir2_b);
if (recovery_ab && (pspdir2 != NULL)) {
if (cb_config->need_ish) { /* Need ISH */
ctx->ish_a_dir = new_ish_dir(ctx);
if (pspdir2_b != NULL)
ctx->ish_b_dir = new_ish_dir(ctx);
}
pspdir->header.num_entries = count;
integrate_psp_ab(ctx, pspdir, pspdir2, ctx->ish_a_dir,
AMD_FW_RECOVERYAB_A, cb_config->soc_id);
if (pspdir2_b != NULL)
integrate_psp_ab(ctx, pspdir, pspdir2_b, ctx->ish_b_dir,
use_only_a ? AMD_FW_RECOVERYAB_A : AMD_FW_RECOVERYAB_B,
cb_config->soc_id);
else
integrate_psp_ab(ctx, pspdir, pspdir2, ctx->ish_a_dir,
use_only_a ? AMD_FW_RECOVERYAB_A : AMD_FW_RECOVERYAB_B,
cb_config->soc_id);
count = pspdir->header.num_entries;
} else if (pspdir2 != NULL) {
assert_fw_entry(count, MAX_PSP_ENTRIES, ctx);
pspdir->entries[count].type = AMD_FW_L2_PTR;
pspdir->entries[count].subprog = 0;
pspdir->entries[count].rsvd = 0;
pspdir->entries[count].size = sizeof(pspdir2->header)
+ pspdir2->header.num_entries
* sizeof(psp_directory_entry);
pspdir->entries[count].addr =
BUFF_TO_RUN_MODE(*ctx, pspdir2, AMD_ADDR_REL_BIOS);
pspdir->entries[count].address_mode =
SET_ADDR_MODE(pspdir, AMD_ADDR_REL_BIOS);
count++;
}
fill_dir_header(pspdir, count, cookie, ctx); fill_dir_header(pspdir, count, cookie, ctx);
ctx->current_table = current_table_save; ctx->current_table = current_table_save;
} }
@ -1183,6 +1201,37 @@ static void add_bios_apcb_bk_entry(bios_directory_table *biosdir, unsigned int i
biosdir->entries[idx].address_mode = SET_ADDR_MODE_BY_TABLE(biosdir); biosdir->entries[idx].address_mode = SET_ADDR_MODE_BY_TABLE(biosdir);
} }
static void integrate_bios_levels(context *ctx)
{
unsigned int count = ctx->biosdir->header.num_entries;
uint32_t current_table_save;
current_table_save = ctx->current_table;
ctx->current_table = (char *)ctx->biosdir - ctx->rom;
if (ctx->biosdir2) {
assert_fw_entry(count, MAX_BIOS_ENTRIES, ctx);
ctx->biosdir->entries[count].type = AMD_BIOS_L2_PTR;
ctx->biosdir->entries[count].region_type = 0;
ctx->biosdir->entries[count].size =
+ MAX_BIOS_ENTRIES
* sizeof(bios_directory_entry);
ctx->biosdir->entries[count].source =
BUFF_TO_RUN(*ctx, ctx->biosdir2);
ctx->biosdir->entries[count].address_mode =
SET_ADDR_MODE(ctx->biosdir, AMD_ADDR_REL_BIOS);
ctx->biosdir->entries[count].subprog = 0;
ctx->biosdir->entries[count].inst = 0;
ctx->biosdir->entries[count].copy = 0;
ctx->biosdir->entries[count].compressed = 0;
ctx->biosdir->entries[count].dest = -1;
ctx->biosdir->entries[count].reset = 0;
ctx->biosdir->entries[count].ro = 0;
count++;
}
fill_dir_header(ctx->biosdir, count, BHD_COOKIE, ctx);
ctx->current_table = current_table_save;
}
static void integrate_bios_firmwares(context *ctx, static void integrate_bios_firmwares(context *ctx,
bios_directory_table *biosdir, bios_directory_table *biosdir,
bios_directory_table *biosdir2, bios_directory_table *biosdir2,
@ -1393,29 +1442,6 @@ static void integrate_bios_firmwares(context *ctx,
count++; count++;
} }
fill_dir_header(biosdir, count, cookie, ctx);
if (biosdir2) {
assert_fw_entry(count, MAX_BIOS_ENTRIES, ctx);
biosdir->entries[count].type = AMD_BIOS_L2_PTR;
biosdir->entries[count].region_type = 0;
biosdir->entries[count].size =
+ MAX_BIOS_ENTRIES
* sizeof(bios_directory_entry);
biosdir->entries[count].source =
BUFF_TO_RUN(*ctx, biosdir2);
biosdir->entries[count].address_mode =
SET_ADDR_MODE(biosdir, AMD_ADDR_REL_BIOS);
biosdir->entries[count].subprog = 0;
biosdir->entries[count].inst = 0;
biosdir->entries[count].copy = 0;
biosdir->entries[count].compressed = 0;
biosdir->entries[count].dest = -1;
biosdir->entries[count].reset = 0;
biosdir->entries[count].ro = 0;
count++;
}
fill_dir_header(biosdir, count, cookie, ctx); fill_dir_header(biosdir, count, cookie, ctx);
ctx->current_table = current_table_save; ctx->current_table = current_table_save;
} }
@ -1689,6 +1715,7 @@ int main(int argc, char **argv)
ctx.pspdir = new_psp_dir(&ctx, cb_config.multi_level); ctx.pspdir = new_psp_dir(&ctx, cb_config.multi_level);
integrate_psp_firmwares(&ctx, ctx.pspdir, ctx.pspdir2, ctx.pspdir2_b, integrate_psp_firmwares(&ctx, ctx.pspdir, ctx.pspdir2, ctx.pspdir2_b,
amd_psp_fw_table, PSP_COOKIE, &cb_config); amd_psp_fw_table, PSP_COOKIE, &cb_config);
integrate_psp_levels(&ctx, &cb_config);
} else { } else {
/* flat: PSP 1 cookie and no pointer to 2nd table */ /* flat: PSP 1 cookie and no pointer to 2nd table */
ctx.pspdir = new_psp_dir(&ctx, cb_config.multi_level); ctx.pspdir = new_psp_dir(&ctx, cb_config.multi_level);
@ -1735,6 +1762,7 @@ int main(int argc, char **argv)
ctx.biosdir = new_bios_dir(&ctx, cb_config.multi_level); ctx.biosdir = new_bios_dir(&ctx, cb_config.multi_level);
integrate_bios_firmwares(&ctx, ctx.biosdir, ctx.biosdir2, integrate_bios_firmwares(&ctx, ctx.biosdir, ctx.biosdir2,
amd_bios_table, BHD_COOKIE, &cb_config); amd_bios_table, BHD_COOKIE, &cb_config);
integrate_bios_levels(&ctx);
} }
} else { } else {
/* flat: BHD1 cookie and no pointer to 2nd table */ /* flat: BHD1 cookie and no pointer to 2nd table */