summaryrefslogtreecommitdiff
path: root/util/amdfwtool/amdfwtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/amdfwtool/amdfwtool.c')
-rw-r--r--util/amdfwtool/amdfwtool.c198
1 files changed, 106 insertions, 92 deletions
diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c
index ffaf6ee774..1c7f6dc4e6 100644
--- a/util/amdfwtool/amdfwtool.c
+++ b/util/amdfwtool/amdfwtool.c
@@ -2627,112 +2627,126 @@ int main(int argc, char **argv)
if (config)
combo_config[0] = config;
- /* TODO: For now the combo_index is always 0. The combo entries will be processed
- * in the loop which has not been added yet. */
- /* for non-combo image, combo_config[0] == config, and it already is processed.
- * Actually "combo_index > 0" is enough. Put both of them here to make sure and make
- * it clear this will not affect non-combo case. */
- if (cb_config.use_combo && combo_index > 0) {
- open_process_config(combo_config[combo_index], &cb_config, list_deps, debug);
-
- /* In most cases, the address modes are same. */
- if (cb_config.need_ish)
- ctx.address_mode = AMD_ADDR_REL_TAB;
- else if (cb_config.second_gen)
- ctx.address_mode = AMD_ADDR_REL_BIOS;
- else
- ctx.address_mode = AMD_ADDR_PHYSICAL;
- }
-
- if (cb_config.multi_level) {
- /* Do 2nd PSP directory followed by 1st */
- pspdir2 = new_psp_dir(&ctx, cb_config.multi_level);
- integrate_psp_firmwares(&ctx, pspdir2, NULL, NULL,
- amd_psp_fw_table, PSPL2_COOKIE, &cb_config);
- if (cb_config.recovery_ab && !cb_config.recovery_ab_single_copy) {
- /* Create a copy of PSP Directory 2 in the backup slot B.
- Related biosdir2_b copy will be created later. */
- pspdir2_b = new_psp_dir(&ctx, cb_config.multi_level);
- integrate_psp_firmwares(&ctx, pspdir2_b, NULL, NULL,
- amd_psp_fw_table, PSPL2_COOKIE, &cb_config);
- } else {
- /*
- * Either the platform is using only one slot or B is same as above
- * directories for A. Skip creating pspdir2_b here to save flash space.
- * Related biosdir2_b will be skipped automatically.
- */
- pspdir2_b = NULL; /* More explicitly */
+ do {
+ /* for non-combo image, combo_config[0] == config, and
+ * it already is processed. Actually "combo_index >
+ * 0" is enough. Put both of them here to make sure
+ * and make it clear this will not affect non-combo
+ * case.
+ */
+ if (cb_config.use_combo && combo_index > 0) {
+ open_process_config(combo_config[combo_index], &cb_config,
+ list_deps, debug);
+
+ /* In most cases, the address modes are same. */
+ if (cb_config.need_ish)
+ ctx.address_mode = AMD_ADDR_REL_TAB;
+ else if (cb_config.second_gen)
+ ctx.address_mode = AMD_ADDR_REL_BIOS;
+ else
+ ctx.address_mode = AMD_ADDR_PHYSICAL;
}
- pspdir = new_psp_dir(&ctx, cb_config.multi_level);
- integrate_psp_firmwares(&ctx, pspdir, pspdir2, pspdir2_b,
+
+ if (cb_config.multi_level) {
+ /* Do 2nd PSP directory followed by 1st */
+ pspdir2 = new_psp_dir(&ctx, cb_config.multi_level);
+ integrate_psp_firmwares(&ctx, pspdir2, NULL, NULL,
+ amd_psp_fw_table, PSPL2_COOKIE, &cb_config);
+ if (cb_config.recovery_ab && !cb_config.recovery_ab_single_copy) {
+ /* Create a copy of PSP Directory 2 in the backup slot B.
+ Related biosdir2_b copy will be created later. */
+ pspdir2_b = new_psp_dir(&ctx, cb_config.multi_level);
+ integrate_psp_firmwares(&ctx, pspdir2_b, NULL, NULL,
+ amd_psp_fw_table, PSPL2_COOKIE, &cb_config);
+ } else {
+ /*
+ * Either the platform is using only
+ * one slot or B is same as above
+ * directories for A. Skip creating
+ * pspdir2_b here to save flash space.
+ * Related biosdir2_b will be skipped
+ * automatically.
+ */
+ pspdir2_b = NULL; /* More explicitly */
+ }
+ pspdir = new_psp_dir(&ctx, cb_config.multi_level);
+ integrate_psp_firmwares(&ctx, pspdir, pspdir2, pspdir2_b,
amd_psp_fw_table, PSP_COOKIE, &cb_config);
- } else {
- /* flat: PSP 1 cookie and no pointer to 2nd table */
- pspdir = new_psp_dir(&ctx, cb_config.multi_level);
- integrate_psp_firmwares(&ctx, pspdir, NULL, NULL,
+ } else {
+ /* flat: PSP 1 cookie and no pointer to 2nd table */
+ pspdir = new_psp_dir(&ctx, cb_config.multi_level);
+ integrate_psp_firmwares(&ctx, pspdir, NULL, NULL,
amd_psp_fw_table, PSP_COOKIE, &cb_config);
- }
+ }
- if (!cb_config.use_combo) {
- fill_psp_directory_to_efs(amd_romsig, pspdir, &ctx, &cb_config);
- } else {
- fill_psp_directory_to_efs(amd_romsig, psp_combo_dir, &ctx, &cb_config);
- /* 0 -Compare PSP ID, 1 -Compare chip family ID */
- assert_fw_entry(combo_index, MAX_COMBO_ENTRIES, &ctx);
- psp_combo_dir->entries[combo_index].id_sel = 0;
- psp_combo_dir->entries[combo_index].id = get_psp_id(cb_config.soc_id);
- psp_combo_dir->entries[combo_index].lvl2_addr =
- BUFF_TO_RUN_MODE(ctx, pspdir, AMD_ADDR_REL_BIOS);
+ if (!cb_config.use_combo) {
+ fill_psp_directory_to_efs(amd_romsig, pspdir, &ctx, &cb_config);
+ } else {
+ fill_psp_directory_to_efs(amd_romsig, psp_combo_dir, &ctx, &cb_config);
+ /* 0 -Compare PSP ID, 1 -Compare chip family ID */
+ assert_fw_entry(combo_index, MAX_COMBO_ENTRIES, &ctx);
+ psp_combo_dir->entries[combo_index].id_sel = 0;
+ psp_combo_dir->entries[combo_index].id = get_psp_id(cb_config.soc_id);
+ psp_combo_dir->entries[combo_index].lvl2_addr =
+ BUFF_TO_RUN_MODE(ctx, pspdir, AMD_ADDR_REL_BIOS);
- fill_dir_header(psp_combo_dir, combo_index + 1, PSP2_COOKIE, &ctx);
- }
+ fill_dir_header(psp_combo_dir, combo_index + 1, PSP2_COOKIE, &ctx);
+ }
- if (have_bios_tables(amd_bios_table)) {
- bios_directory_table *biosdir = NULL;
- if (cb_config.multi_level) {
- /* Do 2nd level BIOS directory followed by 1st */
- bios_directory_table *biosdir2 = NULL;
- bios_directory_table *biosdir2_b = NULL;
+ if (have_bios_tables(amd_bios_table)) {
+ bios_directory_table *biosdir = NULL;
+ if (cb_config.multi_level) {
+ /* Do 2nd level BIOS directory followed by 1st */
+ bios_directory_table *biosdir2 = NULL;
+ bios_directory_table *biosdir2_b = NULL;
- biosdir2 = new_bios_dir(&ctx, cb_config.multi_level);
+ biosdir2 = new_bios_dir(&ctx, cb_config.multi_level);
- integrate_bios_firmwares(&ctx, biosdir2, NULL,
+ integrate_bios_firmwares(&ctx, biosdir2, NULL,
amd_bios_table, BHDL2_COOKIE, &cb_config);
- if (cb_config.recovery_ab) {
- if (pspdir2_b != NULL) {
- biosdir2_b = new_bios_dir(&ctx, cb_config.multi_level);
- integrate_bios_firmwares(&ctx, biosdir2_b, NULL,
- amd_bios_table, BHDL2_COOKIE, &cb_config);
- }
- add_psp_firmware_entry(&ctx, pspdir2, biosdir2,
- AMD_FW_BIOS_TABLE, TABLE_ALIGNMENT);
- if (pspdir2_b != NULL)
- add_psp_firmware_entry(&ctx, pspdir2_b, biosdir2_b,
+ if (cb_config.recovery_ab) {
+ if (pspdir2_b != NULL) {
+ biosdir2_b = new_bios_dir(&ctx,
+ cb_config.multi_level);
+ integrate_bios_firmwares(&ctx, biosdir2_b, NULL,
+ amd_bios_table, BHDL2_COOKIE,
+ &cb_config);
+ }
+ add_psp_firmware_entry(&ctx, pspdir2, biosdir2,
AMD_FW_BIOS_TABLE, TABLE_ALIGNMENT);
+ if (pspdir2_b != NULL)
+ add_psp_firmware_entry(&ctx, pspdir2_b,
+ biosdir2_b, AMD_FW_BIOS_TABLE,
+ TABLE_ALIGNMENT);
+ } else {
+ biosdir = new_bios_dir(&ctx, cb_config.multi_level);
+ integrate_bios_firmwares(&ctx, biosdir, biosdir2,
+ amd_bios_table, BHD_COOKIE, &cb_config);
+ }
} else {
+ /* flat: BHD1 cookie and no pointer to 2nd table */
biosdir = new_bios_dir(&ctx, cb_config.multi_level);
- integrate_bios_firmwares(&ctx, biosdir, biosdir2,
- amd_bios_table, BHD_COOKIE, &cb_config);
+ integrate_bios_firmwares(&ctx, biosdir, NULL,
+ amd_bios_table, BHD_COOKIE, &cb_config);
+ }
+ if (!cb_config.use_combo) {
+ fill_bios_directory_to_efs(amd_romsig, biosdir,
+ &ctx, &cb_config);
+ } else {
+ fill_bios_directory_to_efs(amd_romsig, bhd_combo_dir,
+ &ctx, &cb_config);
+ assert_fw_entry(combo_index, MAX_COMBO_ENTRIES, &ctx);
+ bhd_combo_dir->entries[combo_index].id_sel = 0;
+ bhd_combo_dir->entries[combo_index].id =
+ get_psp_id(cb_config.soc_id);
+ bhd_combo_dir->entries[combo_index].lvl2_addr =
+ BUFF_TO_RUN_MODE(ctx, biosdir, AMD_ADDR_REL_BIOS);
+
+ fill_dir_header(bhd_combo_dir, combo_index + 1,
+ BHD2_COOKIE, &ctx);
}
- } else {
- /* flat: BHD1 cookie and no pointer to 2nd table */
- biosdir = new_bios_dir(&ctx, cb_config.multi_level);
- integrate_bios_firmwares(&ctx, biosdir, NULL,
- amd_bios_table, BHD_COOKIE, &cb_config);
- }
- if (!cb_config.use_combo) {
- fill_bios_directory_to_efs(amd_romsig, biosdir, &ctx, &cb_config);
- } else {
- fill_bios_directory_to_efs(amd_romsig, bhd_combo_dir, &ctx, &cb_config);
- assert_fw_entry(combo_index, MAX_COMBO_ENTRIES, &ctx);
- bhd_combo_dir->entries[combo_index].id_sel = 0;
- bhd_combo_dir->entries[combo_index].id = get_psp_id(cb_config.soc_id);
- bhd_combo_dir->entries[combo_index].lvl2_addr =
- BUFF_TO_RUN_MODE(ctx, biosdir, AMD_ADDR_REL_BIOS);
-
- fill_dir_header(bhd_combo_dir, combo_index + 1, BHD2_COOKIE, &ctx);
}
- }
+ } while (cb_config.use_combo && combo_config[++combo_index] != NULL);
targetfd = open(output, O_RDWR | O_CREAT | O_TRUNC, 0666);
if (targetfd >= 0) {