summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/amdfwtool/amdfwtool.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c
index a5222958ee..a5e5110856 100644
--- a/util/amdfwtool/amdfwtool.c
+++ b/util/amdfwtool/amdfwtool.c
@@ -213,6 +213,8 @@ static void usage(void)
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("-R | --sharedmem Location of PSP/FW shared memory\n");
+ printf("-P | --sharedmem-size Maximum size of the PSP/FW shared memory area\n");
printf("-h | --help show this help\n");
}
@@ -226,6 +228,7 @@ typedef enum _amd_bios_type {
AMD_BIOS_UCODE = 0x66,
AMD_BIOS_APCB_BK = 0x68,
AMD_BIOS_MP2_CFG = 0x6a,
+ AMD_BIOS_PSP_SHARED_MEM = 0x6b,
AMD_BIOS_L2_PTR = 0x70,
AMD_BIOS_INVALID,
} amd_bios_type;
@@ -396,6 +399,7 @@ static amd_bios_entry amd_bios_table[] = {
{ .type = AMD_BIOS_UCODE, .inst = 1, .level = BDT_LVL2 },
{ .type = AMD_BIOS_UCODE, .inst = 2, .level = BDT_LVL2 },
{ .type = AMD_BIOS_MP2_CFG, .level = BDT_LVL2 },
+ { .type = AMD_BIOS_PSP_SHARED_MEM, .inst = 0, .level = BDT_BOTH },
{ .type = AMD_BIOS_INVALID },
};
@@ -481,7 +485,7 @@ typedef struct _bios_directory_table {
bios_directory_entry entries[];
} bios_directory_table;
-#define MAX_BIOS_ENTRIES 0x2e
+#define MAX_BIOS_ENTRIES 0x2f
typedef struct _context {
char *rom; /* target buffer, size of flash device */
@@ -865,7 +869,8 @@ static void integrate_bios_firmwares(context *ctx,
fw_table[i].type != AMD_BIOS_APOB &&
fw_table[i].type != AMD_BIOS_APOB_NV &&
fw_table[i].type != AMD_BIOS_L2_PTR &&
- fw_table[i].type != AMD_BIOS_BIN))
+ fw_table[i].type != AMD_BIOS_BIN &&
+ fw_table[i].type != AMD_BIOS_PSP_SHARED_MEM))
continue;
/* BIOS Directory items may have additional requirements */
@@ -915,6 +920,11 @@ static void integrate_bios_firmwares(context *ctx,
}
}
+ /* PSP_SHARED_MEM needs a destination and size */
+ if (fw_table[i].type == AMD_BIOS_PSP_SHARED_MEM &&
+ (!fw_table[i].dest || !fw_table[i].size))
+ continue;
+
biosdir->entries[count].type = fw_table[i].type;
biosdir->entries[count].region_type = fw_table[i].region_type;
biosdir->entries[count].dest = fw_table[i].dest ?
@@ -974,6 +984,11 @@ static void integrate_bios_firmwares(context *ctx,
ctx->current = ALIGN(ctx->current + bytes, 0x100U);
break;
+ case AMD_BIOS_PSP_SHARED_MEM:
+ biosdir->entries[count].dest = fw_table[i].dest;
+ biosdir->entries[count].size = fw_table[i].size;
+ break;
+
default: /* everything else is copied from input */
if (fw_table[i].type == AMD_BIOS_APCB ||
fw_table[i].type == AMD_BIOS_APCB_BK)
@@ -1023,8 +1038,8 @@ static void integrate_bios_firmwares(context *ctx,
fill_dir_header(biosdir, count, cookie);
}
-// 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";
+// Unused values: CDE
+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:qR:P:";
static struct option long_options[] = {
{"xhci", required_argument, 0, 'x' },
@@ -1076,6 +1091,8 @@ static struct option long_options[] = {
{"flashsize", required_argument, 0, 'f' },
{"location", required_argument, 0, 'l' },
{"anywhere", no_argument, 0, 'q' },
+ {"sharedmem", required_argument, 0, 'R' },
+ {"sharedmem-size", required_argument, 0, 'P' },
{"help", no_argument, 0, 'h' },
{NULL, 0, 0, 0 }
};
@@ -1399,6 +1416,16 @@ int main(int argc, char **argv)
case 'q':
any_location = 1;
break;
+ case 'R':
+ /* shared memory destination */
+ register_fw_addr(AMD_BIOS_PSP_SHARED_MEM, 0, optarg, 0);
+ sub = instance = 0;
+ break;
+ case 'P':
+ /* shared memory size */
+ register_fw_addr(AMD_BIOS_PSP_SHARED_MEM, NULL, NULL, optarg);
+ sub = instance = 0;
+ break;
case 'h':
usage();