Felix Held has submitted this change. ( https://review.coreboot.org/c/coreboot/+/75682?usp=email )
Change subject: amdfwtool: Add PSP backup directory for A/B recovery ......................................................................
amdfwtool: Add PSP backup directory for A/B recovery
Change-Id: Ia5a745c86595554c83cd13a35c312c17987b716b Signed-off-by: Zheng Bao fishbaozi@gmail.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/75682 Reviewed-by: Felix Held felix-coreboot@felixheld.de Tested-by: build bot (Jenkins) no-reply@coreboot.org --- M util/amdfwtool/amdfwtool.c M util/amdfwtool/amdfwtool.h 2 files changed, 27 insertions(+), 5 deletions(-)
Approvals: build bot (Jenkins): Verified Felix Held: Looks good to me, approved
diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c index 434e452..7f17b71 100644 --- a/util/amdfwtool/amdfwtool.c +++ b/util/amdfwtool/amdfwtool.c @@ -528,6 +528,12 @@ return ptr; }
+static void copy_psp_header(void *bak, void *orig) +{ + uint32_t count = ((psp_directory_header *)orig)->num_entries; + memcpy(bak, orig, count * sizeof(bios_directory_entry) + sizeof(psp_directory_table)); +} + static void fill_dir_header(void *directory, uint32_t count, context *ctx) { psp_combo_directory *cdir = directory; @@ -628,6 +634,14 @@ } }
+static void fill_psp_bak_directory_to_efs(embedded_firmware *amd_romsig, void *pspdir_bak, + context *ctx, amd_cb_config *cb_config) +{ + if (cb_config->recovery_ab) + amd_romsig->psp_bak_directory = + BUFF_TO_RUN_MODE(*ctx, pspdir_bak, AMD_ADDR_REL_BIOS); +} + static void fill_bios_directory_to_efs(embedded_firmware *amd_romsig, void *biosdir, context *ctx, amd_cb_config *cb_config) { @@ -816,6 +830,8 @@ { printf("romsig offset:%lx\n", BUFF_TO_RUN(*ctx, ctx->amd_romsig_ptr)); printf("PSP L1 offset:%lx\n", BUFF_TO_RUN(*ctx, ctx->pspdir)); + if (ctx->pspdir_bak != NULL) + printf("PSP L1 backup offset:%lx\n", BUFF_TO_RUN(*ctx, ctx->pspdir_bak)); if (ctx->pspdir2 != NULL) printf("PSP L2(A) offset:%lx\n", BUFF_TO_RUN(*ctx, ctx->pspdir2)); if (ctx->ish_a_dir != NULL) @@ -912,6 +928,7 @@ use_only_a ? AMD_FW_RECOVERYAB_A : AMD_FW_RECOVERYAB_B, cb_config->soc_id);
+ copy_psp_header(ctx->pspdir_bak, ctx->pspdir); } else if (pspdir2 != NULL) { assert_fw_entry(count, MAX_PSP_ENTRIES, ctx); pspdir->entries[count].type = AMD_FW_L2_PTR; @@ -953,9 +970,11 @@ */ pspdir = new_psp_dir(ctx, cb_config->multi_level, cookie);
- if (cookie == PSP_COOKIE) + if (cookie == PSP_COOKIE) { ctx->pspdir = pspdir; - else if (cookie == PSPL2_COOKIE) { + if (recovery_ab) + ctx->pspdir_bak = new_psp_dir(ctx, cb_config->multi_level, cookie); + } else if (cookie == PSPL2_COOKIE) { if (ctx->pspdir2 == NULL) ctx->pspdir2 = pspdir; else if (ctx->pspdir2_b == NULL) @@ -1705,8 +1724,10 @@
/* The pspdir level 1 is special. For new combo layout, all the combo entries share one pspdir L1. It should not be cleared at each iteration. */ - if (!cb_config.combo_new_rab || combo_index == 0) + if (!cb_config.combo_new_rab || combo_index == 0) { ctx.pspdir = NULL; + ctx.pspdir_bak = NULL; + } ctx.pspdir2 = NULL; ctx.pspdir2_b = NULL; ctx.biosdir = NULL; @@ -1773,6 +1794,7 @@ if (!cb_config.use_combo || (cb_config.combo_new_rab && combo_index == 0)) { /* For new combo layout, there is only 1 PSP level 1 directory. */ fill_psp_directory_to_efs(ctx.amd_romsig_ptr, ctx.pspdir, &ctx, &cb_config); + fill_psp_bak_directory_to_efs(ctx.amd_romsig_ptr, ctx.pspdir_bak, &ctx, &cb_config); } else if (cb_config.use_combo && !cb_config.combo_new_rab) { fill_psp_directory_to_efs(ctx.amd_romsig_ptr, ctx.psp_combo_dir, &ctx, &cb_config); add_combo_entry(ctx.psp_combo_dir, ctx.pspdir, combo_index, &ctx, &cb_config); diff --git a/util/amdfwtool/amdfwtool.h b/util/amdfwtool/amdfwtool.h index 0e8ace6..f87fbf5 100644 --- a/util/amdfwtool/amdfwtool.h +++ b/util/amdfwtool/amdfwtool.h @@ -163,7 +163,7 @@ uint32_t bios2_entry; struct second_gen_efs efs_gen; uint32_t bios3_entry; - uint32_t reserved_2Ch; + uint32_t psp_bak_directory; uint32_t promontory_fw_ptr; uint32_t lp_promontory_fw_ptr; uint32_t reserved_38h; @@ -455,7 +455,7 @@ uint8_t sub; } combo_apcb[MAX_COMBO_ENTRIES], combo_apcb_bk[MAX_COMBO_ENTRIES]; embedded_firmware *amd_romsig_ptr; - psp_directory_table *pspdir, *pspdir2, *pspdir2_b; + psp_directory_table *pspdir, *pspdir_bak, *pspdir2, *pspdir2_b; bios_directory_table *biosdir, *biosdir2, *biosdir2_b; psp_combo_directory *psp_combo_dir, *bhd_combo_dir; ish_directory_table *ish_a_dir, *ish_b_dir;