diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/amdfwtool/amdfwtool.h | 9 | ||||
-rw-r--r-- | util/amdfwtool/data_parse.c | 31 | ||||
-rw-r--r-- | util/amdfwtool/signed_psp.c | 1 |
3 files changed, 32 insertions, 9 deletions
diff --git a/util/amdfwtool/amdfwtool.h b/util/amdfwtool/amdfwtool.h index 24e48eb6ec..aa5a98a131 100644 --- a/util/amdfwtool/amdfwtool.h +++ b/util/amdfwtool/amdfwtool.h @@ -330,6 +330,11 @@ typedef struct _ish_directory_table { #define PSP_BOTH (PSP_LVL1 | PSP_LVL2) #define PSP_BOTH_AB (PSP_LVL1_AB | PSP_LVL2_AB) +typedef enum _fwid_type { + FWID_TYPE_FWID = 0, + FWID_TYPE_UUID, +} fwid_type_t; + typedef struct _amd_fw_entry_hash { uint16_t fw_id; uint16_t subtype; @@ -339,9 +344,6 @@ typedef struct _amd_fw_entry_hash { typedef struct _amd_fw_entry { amd_fw_type type; - /* Mendocino and later SoCs use fw_id instead of fw_type. fw_type is still around - for backwards compatibility. fw_id can be populated from the PSP binary file. */ - uint16_t fw_id; char *filename; uint8_t subprog; uint8_t inst; @@ -358,6 +360,7 @@ typedef struct _amd_fw_entry { include but not limited to: *iKek*, *.tkn, *.stkn */ bool skip_hashing; uint8_t hash_tbl_id; + fwid_type_t fwid_type; uint32_t num_hash_entries; amd_fw_entry_hash *hash_entries; bool generate_manifest; diff --git a/util/amdfwtool/data_parse.c b/util/amdfwtool/data_parse.c index c2dc3e22c5..9adaa5db5a 100644 --- a/util/amdfwtool/data_parse.c +++ b/util/amdfwtool/data_parse.c @@ -59,6 +59,11 @@ static const char entries_line_regex[] = H2: Put the hash for the concerned entry in Hash Table 2 */ "([[:space:]]+([Hh][0-9]+))?" + /* followed by an optional whitespace + "UUID" to indicate the binary is using 16 bytes + UUID as firmware identity. In the absence of this field, the binary is using 2 bytes + FWID as firmware identity. + */ + "([[:space:]]+(UUID))?" /* followed by optional whitespace */ "[[:space:]]*$"; static regex_t entries_line_expr; @@ -70,6 +75,8 @@ enum match_id { OPT_LEVEL, OPT_SPACE2, OPT_HASH_TABLE_ID, + OPT_SPACE3, + OPT_FWID_TYPE, N_MATCHES, }; @@ -135,7 +142,8 @@ extern amd_fw_entry amd_psp_fw_table[]; extern amd_bios_entry amd_bios_table[]; static uint8_t find_register_fw_filename_psp_dir(char *fw_name, char *filename, - char level_to_set, uint8_t hash_tbl_id, amd_cb_config *cb_config) + char level_to_set, uint8_t hash_tbl_id, fwid_type_t fwid_type, + amd_cb_config *cb_config) { amd_fw_type fw_type = AMD_FW_INVALID; amd_fw_entry *psp_tableptr; @@ -493,6 +501,7 @@ static uint8_t find_register_fw_filename_psp_dir(char *fw_name, char *filename, SET_LEVEL(psp_tableptr, level_to_set, PSP, cb_config->recovery_ab); psp_tableptr->hash_tbl_id = hash_tbl_id; + psp_tableptr->fwid_type = fwid_type; break; } psp_tableptr++; @@ -606,6 +615,7 @@ static int is_valid_entry(char *oneline, regmatch_t match[N_MATCHES]) oneline[match[FW_FILE].rm_eo] = '\0'; oneline[match[OPT_LEVEL].rm_eo] = '\0'; oneline[match[OPT_HASH_TABLE_ID].rm_eo] = '\0'; + oneline[match[OPT_FWID_TYPE].rm_eo] = '\0'; retval = 1; } else { retval = 0; @@ -658,6 +668,14 @@ static uint8_t get_hash_tbl_id(char *line, regoff_t hash_tbl_index) return tbl; } +static fwid_type_t get_fwid_type(char *line, regoff_t fwid_type_index) +{ + if (fwid_type_index != -1 && !strncmp(&line[fwid_type_index], "UUID", strlen("UUID"))) + return FWID_TYPE_UUID; + + return FWID_TYPE_FWID; +} + static uint8_t process_one_line(char *oneline, regmatch_t *match, char *dir, amd_cb_config *cb_config) { @@ -668,8 +686,11 @@ static uint8_t process_one_line(char *oneline, regmatch_t *match, char *dir, regoff_t ch_hash_tbl_index = match[OPT_HASH_TABLE_ID].rm_so == match[OPT_HASH_TABLE_ID].rm_eo ? -1 : match[OPT_HASH_TABLE_ID].rm_so; + regoff_t ch_fwid_type_index = match[OPT_FWID_TYPE].rm_so == match[OPT_FWID_TYPE].rm_eo ? + -1 : match[OPT_FWID_TYPE].rm_so; char ch_lvl = get_level_from_config(oneline, ch_lvl_index, cb_config); uint8_t ch_hash_tbl = get_hash_tbl_id(oneline, ch_hash_tbl_index); + fwid_type_t ch_fwid_type = get_fwid_type(oneline, ch_fwid_type_index); path_filename = malloc(MAX_LINE_SIZE * 2 + 2); if (strchr(fn, '/')) @@ -679,10 +700,10 @@ static uint8_t process_one_line(char *oneline, regmatch_t *match, char *dir, snprintf(path_filename, MAX_LINE_SIZE * 2 + 2, "%.*s/%.*s", MAX_LINE_SIZE, dir, MAX_LINE_SIZE, fn); - if (find_register_fw_filename_psp_dir( - fw_type_str, path_filename, ch_lvl, ch_hash_tbl, cb_config) == 0) { - if (find_register_fw_filename_bios_dir( - fw_type_str, path_filename, ch_lvl, cb_config) == 0) { + if (find_register_fw_filename_psp_dir(fw_type_str, path_filename, + ch_lvl, ch_hash_tbl, ch_fwid_type, cb_config) == 0) { + if (find_register_fw_filename_bios_dir(fw_type_str, path_filename, + ch_lvl, cb_config) == 0) { fprintf(stderr, "Module's name \"%s\" is not valid\n", fw_type_str); return 0; /* Stop parsing. */ } diff --git a/util/amdfwtool/signed_psp.c b/util/amdfwtool/signed_psp.c index 2e19f72002..738c588d10 100644 --- a/util/amdfwtool/signed_psp.c +++ b/util/amdfwtool/signed_psp.c @@ -384,7 +384,6 @@ void process_signed_psp_firmwares(const char *signed_rom, exit(-1); /* File is successfully processed and is part of signed PSP binaries set. */ - fw_table[i].fw_id = get_psp_fw_type(soc_id, &header); fw_table[i].addr_signed = signed_start_addr; fw_table[i].file_size = (uint32_t)fd_stat.st_size; hash_files[fw_table[i].hash_tbl_id].present = true; |