summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Dawson <marshalldawson3rd@gmail.com>2019-02-23 16:41:35 -0700
committerMartin Roth <martinroth@google.com>2019-03-07 15:58:42 +0000
commitc38c0c91aa5182da0874c55e92596d234e1cb1a7 (patch)
treeb0490af5d92c4208774966310281bd078cee0bf0
parentc9b7d1fb57787d7037a5bce031a1300d13f5df40 (diff)
util/amdfwtool: Fix iteration of PSP firmwares
Correct an oversight in the utility that attempts to match up eligible PSP directory table entries with blob names passed on the command line. A 1:1 matchup of items shouldn't be assumed, so the i iterator shouldn't be used to walk both lists. This change has no effect on google/grunt (Family 15h Models 70h-7Fh), but eliminates blank entries of all FF's on builds of amd/bettong (F15h 60h-6Fh) and pcengines/apu2 (F16h 30h-3Fh). Removal of entries also affects the checksum accordingly. TEST=Build before/after images for grunt, bettong, apu2, and diff hexdumps of the amdfw.rom files Change-Id: I13e359d3cc6f5ce408bbf077feec3707ee2b3838 Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/31726 Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Martin Roth <martinroth@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--util/amdfwtool/amdfwtool.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c
index 406ae0560b..234760dfa7 100644
--- a/util/amdfwtool/amdfwtool.c
+++ b/util/amdfwtool/amdfwtool.c
@@ -355,17 +355,18 @@ static uint32_t integrate_psp_firmwares(char *base, uint32_t pos,
int fd;
ssize_t bytes;
struct stat fd_stat;
- unsigned int i;
+ unsigned int i, count;
uint32_t rom_base_address = 0xFFFFFFFF - rom_size + 1;
- for (i = 0; fw_table[i].type != AMD_FW_INVALID; i++) {
+ for (i = 0, count = 0; fw_table[i].type != AMD_FW_INVALID; i++) {
if (fw_table[i].type == AMD_PSP_FUSE_CHAIN) {
- pspdir[4+4*i+0] = fw_table[i].type;
- pspdir[4+4*i+1] = 0xFFFFFFFF;
- pspdir[4+4*i+2] = 1;
- pspdir[4+4*i+3] = 0;
+ pspdir[4+4*count+0] = fw_table[i].type;
+ pspdir[4+4*count+1] = 0xFFFFFFFF;
+ pspdir[4+4*count+2] = 1;
+ pspdir[4+4*count+3] = 0;
+ count++;
} else if (fw_table[i].filename != NULL) {
- pspdir[4+4*i+0] = fw_table[i].type;
+ pspdir[4+4*count+0] = fw_table[i].type;
fd = open(fw_table[i].filename, O_RDONLY);
if (fd < 0) {
@@ -378,10 +379,10 @@ static uint32_t integrate_psp_firmwares(char *base, uint32_t pos,
free(base);
exit(1);
}
- pspdir[4+4*i+1] = (uint32_t)fd_stat.st_size;
+ pspdir[4+4*count+1] = (uint32_t)fd_stat.st_size;
- pspdir[4+4*i+2] = pos + rom_base_address;
- pspdir[4+4*i+3] = 0;
+ pspdir[4+4*count+2] = pos + rom_base_address;
+ pspdir[4+4*count+3] = 0;
if (pos + fd_stat.st_size > rom_size) {
printf("Error: Specified ROM size of %d"
@@ -404,11 +405,12 @@ static uint32_t integrate_psp_firmwares(char *base, uint32_t pos,
close(fd);
pos = ALIGN(pos, 0x100U);
+ count++;
} else {
/* This APU doesn't have this firmware. */
}
}
- fill_psp_head(pspdir, i);
+ fill_psp_head(pspdir, count);
return pos;
}