amdfwtool: Set the cookie when the table header is created

When the table is created, the cookie is known.
When the packing going on, the cookie in header can be checked to see
where we are.

TEST=Identical test on all AMD SOC platform

Change-Id: I300e30292c68a14b44c637b26a13b308dc9c0388
Signed-off-by: Zheng Bao <fishbaozi@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/81254
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c
index 0308b84..72f0c5f 100644
--- a/util/amdfwtool/amdfwtool.c
+++ b/util/amdfwtool/amdfwtool.c
@@ -473,7 +473,7 @@
 	set_current_pointer(ctx, ALIGN_UP(ctx->current + add, align));
 }
 
-static void *new_psp_dir(context *ctx, int multi)
+static void *new_psp_dir(context *ctx, int multi, uint32_t cookie)
 {
 	void *ptr;
 
@@ -488,6 +488,7 @@
 		adjust_current_pointer(ctx, 0, TABLE_ALIGNMENT);
 
 	ptr = BUFF_CURRENT(*ctx);
+	((psp_directory_header *)ptr)->cookie = cookie;
 	((psp_directory_header *)ptr)->num_entries = 0;
 	((psp_directory_header *)ptr)->additional_info = 0;
 	((psp_directory_header *)ptr)->additional_info_fields.address_mode = ctx->address_mode;
@@ -507,23 +508,26 @@
 	return ptr;
 }
 
-static void *new_combo_dir(context *ctx)
+static void *new_combo_dir(context *ctx, uint32_t cookie)
 {
 	void *ptr;
 
 	adjust_current_pointer(ctx, 0, TABLE_ALIGNMENT);
 	ptr = BUFF_CURRENT(*ctx);
+	((psp_combo_header *)ptr)->cookie = cookie;
 	adjust_current_pointer(ctx,
 		sizeof(psp_combo_header) + MAX_COMBO_ENTRIES * sizeof(psp_combo_entry),
 		1);
 	return ptr;
 }
 
-static void fill_dir_header(void *directory, uint32_t count, uint32_t cookie, context *ctx)
+static void fill_dir_header(void *directory, uint32_t count, context *ctx)
 {
 	psp_combo_directory *cdir = directory;
 	psp_directory_table *dir = directory;
 	bios_directory_table *bdir = directory;
+	/* The cookies have same offsets. */
+	uint32_t cookie = ((psp_directory_table *)directory)->header.cookie;
 	uint32_t table_size = 0;
 
 	if (ctx == NULL || directory == NULL) {
@@ -537,7 +541,6 @@
 	switch (cookie) {
 	case PSP2_COOKIE:
 	case BHD2_COOKIE:
-		cdir->header.cookie = cookie;
 		/* lookup mode is hardcoded for now. */
 		cdir->header.lookup = 1;
 		cdir->header.num_entries = count;
@@ -565,7 +568,6 @@
 			dir->header.additional_info_fields.dir_size =
 					table_size / TABLE_ALIGNMENT;
 		}
-		dir->header.cookie = cookie;
 		dir->header.num_entries = count;
 		dir->header.additional_info_fields.spi_block_size = 1;
 		dir->header.additional_info_fields.base_addr = 0;
@@ -588,7 +590,6 @@
 			bdir->header.additional_info_fields.dir_size =
 				table_size / TABLE_ALIGNMENT;
 		}
-		bdir->header.cookie = cookie;
 		bdir->header.num_entries = count;
 		bdir->header.additional_info_fields.spi_block_size = 1;
 		bdir->header.additional_info_fields.base_addr = 0;
@@ -930,7 +931,7 @@
 				SET_ADDR_MODE(pspdir, AMD_ADDR_REL_BIOS);
 		count++;
 	}
-	fill_dir_header(pspdir, count, PSP_COOKIE, ctx);
+	fill_dir_header(pspdir, count, ctx);
 	ctx->current_table = current_table_save;
 }
 
@@ -954,7 +955,7 @@
 	 * is passed, clearly a 2nd-level table is intended.  However, a
 	 * 1st-level cookie may indicate level 1 or flattened.
 	 */
-	pspdir = new_psp_dir(ctx, cb_config->multi_level);
+	pspdir = new_psp_dir(ctx, cb_config->multi_level, cookie);
 
 	if (cookie == PSP_COOKIE)
 		ctx->pspdir = pspdir;
@@ -1080,7 +1081,7 @@
 		}
 	}
 
-	fill_dir_header(pspdir, count, cookie, ctx);
+	fill_dir_header(pspdir, count, ctx);
 	ctx->current_table = current_table_save;
 }
 
@@ -1111,11 +1112,11 @@
 	if (index == count)
 		count++;
 
-	fill_dir_header(pspdir, count, pspdir->header.cookie, ctx);
+	fill_dir_header(pspdir, count, ctx);
 	ctx->current_table = current_table_save;
 }
 
-static void *new_bios_dir(context *ctx, bool multi)
+static void *new_bios_dir(context *ctx, bool multi, uint32_t cookie)
 {
 	void *ptr;
 
@@ -1129,6 +1130,7 @@
 	else
 		adjust_current_pointer(ctx, 0, TABLE_ALIGNMENT);
 	ptr = BUFF_CURRENT(*ctx);
+	((bios_directory_hdr *) ptr)->cookie = cookie;
 	((bios_directory_hdr *) ptr)->additional_info = 0;
 	((bios_directory_hdr *) ptr)->additional_info_fields.address_mode = ctx->address_mode;
 	adjust_current_pointer(ctx,
@@ -1236,7 +1238,7 @@
 		ctx->biosdir->entries[count].ro = 0;
 		count++;
 	}
-	fill_dir_header(ctx->biosdir, count, BHD_COOKIE, ctx);
+	fill_dir_header(ctx->biosdir, count, ctx);
 	ctx->current_table = current_table_save;
 }
 static void integrate_bios_firmwares(context *ctx,
@@ -1253,7 +1255,7 @@
 	uint32_t current_table_save;
 	bios_directory_table *biosdir;
 
-	biosdir = new_bios_dir(ctx, cb_config->multi_level);
+	biosdir = new_bios_dir(ctx, cb_config->multi_level, cookie);
 
 	if (cookie == BHD_COOKIE)
 		ctx->biosdir = biosdir;
@@ -1459,7 +1461,7 @@
 		count++;
 	}
 
-	fill_dir_header(biosdir, count, cookie, ctx);
+	fill_dir_header(biosdir, count, ctx);
 	ctx->current_table = current_table_save;
 }
 
@@ -1657,12 +1659,12 @@
 				cb_config.soc_id);
 
 	if (cb_config.use_combo) {
-		ctx.psp_combo_dir = new_combo_dir(&ctx);
+		ctx.psp_combo_dir = new_combo_dir(&ctx, PSP2_COOKIE);
 
 		adjust_current_pointer(&ctx, 0, 0x1000U);
 
 		if (!cb_config.recovery_ab)
-			ctx.bhd_combo_dir = new_combo_dir(&ctx);
+			ctx.bhd_combo_dir = new_combo_dir(&ctx, BHD2_COOKIE);
 	}
 
 	combo_index = 0;
@@ -1747,7 +1749,7 @@
 			ctx.psp_combo_dir->entries[combo_index].lvl2_addr =
 				BUFF_TO_RUN_MODE(ctx, ctx.pspdir, AMD_ADDR_REL_BIOS);
 
-			fill_dir_header(ctx.psp_combo_dir, combo_index + 1, PSP2_COOKIE, &ctx);
+			fill_dir_header(ctx.psp_combo_dir, combo_index + 1, &ctx);
 		}
 
 		if (have_bios_tables(amd_bios_table)) {
@@ -1793,9 +1795,7 @@
 				ctx.bhd_combo_dir->entries[combo_index].lvl2_addr =
 					BUFF_TO_RUN_MODE(ctx, ctx.biosdir, AMD_ADDR_REL_BIOS);
 
-				fill_dir_header(ctx.bhd_combo_dir, combo_index + 1,
-					BHD2_COOKIE, &ctx);
-
+				fill_dir_header(ctx.bhd_combo_dir, combo_index + 1, &ctx);
 			}
 		}
 		if (cb_config.debug)