From 37305e78fc25225e6a877f407373d120892de45d Mon Sep 17 00:00:00 2001 From: Martin Roth Date: Tue, 7 Apr 2020 14:16:39 -0600 Subject: [PATCH] util/amdfwtool: update to allow building in any location For the verstage-on-PSP implementation, we need 2 additional copies of the AMD firmware tables at non-standard locations. These are for RW-A & RW-B fmap regions. This change allows us to build the AMD firmware tables into those regions. BUG=b:148767300 TEST=boot with psp_verstage, verify boot location Signed-off-by: Martin Roth Original-Signed-off-by: Martin Roth Original-Change-Id: I2b591b50e9b179fdfaead46ff93722fa2a155e9c Original-Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/coreboot/+/2144534 Original-Reviewed-by: Simon Glass Change-Id: I7f841db8617b953dc671a9c12576145f85263581 Reviewed-on: https://review.coreboot.org/c/coreboot/+/42043 Tested-by: build bot (Jenkins) Reviewed-by: Raul Rangel --- util/amdfwtool/amdfwtool.c | 47 +++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c index 71da6fb7f2..a5222958ee 100644 --- a/util/amdfwtool/amdfwtool.c +++ b/util/amdfwtool/amdfwtool.c @@ -48,6 +48,7 @@ #include #include +#include #include #include #include @@ -211,6 +212,7 @@ static void usage(void) MIN_ROM_KB); printf(" and must a multiple of 1024\n"); printf("-l | --location Location of Directory\n"); + printf("-q | --anywhere Use any 64-byte aligned addr for Directory\n"); printf("-h | --help show this help\n"); } @@ -1021,8 +1023,8 @@ static void integrate_bios_firmwares(context *ctx, fill_dir_header(biosdir, count, cookie); } -// Unused values: CDEPqR -static const char *optstring = "x:i:g:AMS:p:b:s:r:k:c:n:d:t:u:w:m:T:z:J:B:K:L:Y:N:UW:I:a:Q:V:e:v:j:y:G:O:X:F:H:o:f:l:hZ:"; +// Unused values: CDEPR +static const char *optstring = "x:i:g:AMS:p:b:s:r:k:c:n:d:t:u:w:m:T:z:J:B:K:L:Y:N:UW:I:a:Q:V:e:v:j:y:G:O:X:F:H:o:f:l:hZ:q"; static struct option long_options[] = { {"xhci", required_argument, 0, 'x' }, @@ -1073,6 +1075,7 @@ static struct option long_options[] = { {"output", required_argument, 0, 'o' }, {"flashsize", required_argument, 0, 'f' }, {"location", required_argument, 0, 'l' }, + {"anywhere", no_argument, 0, 'q' }, {"help", no_argument, 0, 'h' }, {NULL, 0, 0, 0 } }; @@ -1177,6 +1180,7 @@ int main(int argc, char **argv) uint8_t sub = 0, instance = 0; int abl_image = 0; uint32_t dir_location = 0; + bool any_location = 0; uint32_t romsig_offset; uint32_t rom_base_address; int multi = 0; @@ -1392,6 +1396,9 @@ int main(int argc, char **argv) retval = 1; } break; + case 'q': + any_location = 1; + break; case 'h': usage(); @@ -1434,20 +1441,28 @@ int main(int argc, char **argv) return 1; } - switch (dir_location) { - case 0: /* Fall through */ - case 0xFFFA0000: /* Fall through */ - case 0xFFF20000: /* Fall through */ - case 0xFFE20000: /* Fall through */ - case 0xFFC20000: /* Fall through */ - case 0xFF820000: /* Fall through */ - case 0xFF020000: /* Fall through */ - break; - default: - printf("Error: Invalid Directory location.\n"); - printf(" Valid locations are 0xFFFA0000, 0xFFF20000,\n"); - printf(" 0xFFE20000, 0xFFC20000, 0xFF820000, 0xFF020000\n"); - return 1; + if (any_location) { + if (dir_location & 0x3f) { + printf("Error: Invalid Directory location.\n"); + printf(" Valid locations are 64-byte aligned\n"); + return 1; + } + } else { + switch (dir_location) { + case 0: /* Fall through */ + case 0xFFFA0000: /* Fall through */ + case 0xFFF20000: /* Fall through */ + case 0xFFE20000: /* Fall through */ + case 0xFFC20000: /* Fall through */ + case 0xFF820000: /* Fall through */ + case 0xFF020000: /* Fall through */ + break; + default: + printf("Error: Invalid Directory location.\n"); + printf(" Valid locations are 0xFFFA0000, 0xFFF20000,\n"); + printf(" 0xFFE20000, 0xFFC20000, 0xFF820000, 0xFF020000\n"); + return 1; + } } ctx.rom = malloc(ctx.rom_size);