util/amdfwtool: Add option for directory location
The AMD firmware directory can go in a number of different locations. This patch allows amdfwtool to write the directory correctly for those different locations. If the --location switch is not added to the command line, the default location at ROM base address + 0x20000 is used as before. BUG=b:65484600 TEST=Set PSP firmware location, compare amdfw.rom to previously built version. Verify new location pointers. Change-Id: Ief32e5e37d56088946b623d305c6e93bfd6abeaf Signed-off-by: Martin Roth <martinroth@google.com> Reviewed-on: https://review.coreboot.org/21865 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
b0b4fd45e5
commit
0d3b11898b
|
@ -190,6 +190,7 @@ static void usage(void)
|
||||||
printf(" size must be larger than %dKB\n",
|
printf(" size must be larger than %dKB\n",
|
||||||
MIN_ROM_KB);
|
MIN_ROM_KB);
|
||||||
printf(" and must a multiple of 1024\n");
|
printf(" and must a multiple of 1024\n");
|
||||||
|
printf("-l | --location Location of Directory\n");
|
||||||
printf("-h | --help show this help\n");
|
printf("-h | --help show this help\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -377,9 +378,9 @@ static uint32_t integrate_psp_firmwares(char *base, uint32_t pos,
|
||||||
|
|
||||||
#if PSP2
|
#if PSP2
|
||||||
static const char *optstring =
|
static const char *optstring =
|
||||||
"x:i:g:p:b:s:r:k:c:n:d:t:u:w:m:P:B:S:L:R:K:C:N:D:T:U:W:E:M:o:f:h";
|
"x:i:g:p:b:s:r:k:c:n:d:t:u:w:m:P:B:S:L:R:K:C:N:D:T:U:W:E:M:o:f:l:h";
|
||||||
#else
|
#else
|
||||||
static const char *optstring = "x:i:g:p:b:s:r:k:c:n:d:t:u:w:m:o:f:h";
|
static const char *optstring = "x:i:g:p:b:s:r:k:c:n:d:t:u:w:m:o:f:l:h";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
|
@ -420,6 +421,7 @@ static struct option long_options[] = {
|
||||||
|
|
||||||
{"output", required_argument, 0, 'o' },
|
{"output", required_argument, 0, 'o' },
|
||||||
{"flashsize", required_argument, 0, 'f' },
|
{"flashsize", required_argument, 0, 'f' },
|
||||||
|
{"location", required_argument, 0, 'l' },
|
||||||
{"help", no_argument, 0, 'h' },
|
{"help", no_argument, 0, 'h' },
|
||||||
|
|
||||||
{NULL, 0, 0, 0 }
|
{NULL, 0, 0, 0 }
|
||||||
|
@ -479,6 +481,8 @@ int main(int argc, char **argv)
|
||||||
int targetfd;
|
int targetfd;
|
||||||
char *output = NULL;
|
char *output = NULL;
|
||||||
uint32_t rom_size = CONFIG_ROM_SIZE;
|
uint32_t rom_size = CONFIG_ROM_SIZE;
|
||||||
|
uint32_t dir_location = 0;
|
||||||
|
uint32_t romsig_offset;
|
||||||
uint32_t rom_base_address;
|
uint32_t rom_base_address;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -624,6 +628,15 @@ int main(int argc, char **argv)
|
||||||
retval = 1;
|
retval = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
dir_location = (uint32_t)strtoul(optarg, &tmp, 16);
|
||||||
|
if (*tmp != '\0') {
|
||||||
|
printf("Error: Directory Location specified"
|
||||||
|
" incorrectly (%s)\n\n", optarg);
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
usage();
|
usage();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -662,13 +675,40 @@ int main(int argc, char **argv)
|
||||||
printf(" AMDFWTOOL Using ROM size of %dKB\n", rom_size / 1024);
|
printf(" AMDFWTOOL Using ROM size of %dKB\n", rom_size / 1024);
|
||||||
|
|
||||||
rom_base_address = 0xFFFFFFFF - rom_size + 1;
|
rom_base_address = 0xFFFFFFFF - rom_size + 1;
|
||||||
|
if (dir_location && (dir_location < rom_base_address)) {
|
||||||
|
printf("Error: Directory location outside of ROM.\n\n");
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
rom = malloc(rom_size);
|
rom = malloc(rom_size);
|
||||||
if (!rom)
|
if (!rom)
|
||||||
return 1;
|
return 1;
|
||||||
memset(rom, 0xFF, rom_size);
|
memset(rom, 0xFF, rom_size);
|
||||||
|
|
||||||
current = AMD_ROMSIG_OFFSET;
|
if (dir_location)
|
||||||
amd_romsig = (void *)(rom + AMD_ROMSIG_OFFSET);
|
romsig_offset = current = dir_location - rom_base_address;
|
||||||
|
else
|
||||||
|
romsig_offset = current = AMD_ROMSIG_OFFSET;
|
||||||
|
printf(" AMDFWTOOL Using firmware directory location of %08lx\n",
|
||||||
|
(unsigned long)rom_base_address + current);
|
||||||
|
|
||||||
|
amd_romsig = (void *)(rom + romsig_offset);
|
||||||
amd_romsig[0] = 0x55AA55AA; /* romsig */
|
amd_romsig[0] = 0x55AA55AA; /* romsig */
|
||||||
amd_romsig[1] = 0;
|
amd_romsig[1] = 0;
|
||||||
amd_romsig[2] = 0;
|
amd_romsig[2] = 0;
|
||||||
|
@ -731,7 +771,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
targetfd = open(output, O_RDWR | O_CREAT | O_TRUNC, 0666);
|
targetfd = open(output, O_RDWR | O_CREAT | O_TRUNC, 0666);
|
||||||
if (targetfd >= 0) {
|
if (targetfd >= 0) {
|
||||||
write(targetfd, amd_romsig, current - AMD_ROMSIG_OFFSET);
|
write(targetfd, amd_romsig, current - romsig_offset);
|
||||||
close(targetfd);
|
close(targetfd);
|
||||||
} else {
|
} else {
|
||||||
printf("Error: could not open file: %s\n", output);
|
printf("Error: could not open file: %s\n", output);
|
||||||
|
|
Loading…
Reference in New Issue