1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* 3 * Copyright(c) 2019 - 2021 Intel Corporation 4 * Copyright(c) 2024 Intel Corporation 5 */ 6 #include <fw/api/commands.h> 7 #include "img.h" 8 9 u8 iwl_fw_lookup_cmd_ver(const struct iwl_fw *fw, u32 cmd_id, u8 def) 10 { 11 const struct iwl_fw_cmd_version *entry; 12 unsigned int i; 13 /* prior to LONG_GROUP, we never used this CMD version API */ 14 u8 grp = iwl_cmd_groupid(cmd_id) ?: LONG_GROUP; 15 u8 cmd = iwl_cmd_opcode(cmd_id); 16 17 if (!fw->ucode_capa.cmd_versions || 18 !fw->ucode_capa.n_cmd_versions) 19 return def; 20 21 entry = fw->ucode_capa.cmd_versions; 22 for (i = 0; i < fw->ucode_capa.n_cmd_versions; i++, entry++) { 23 if (entry->group == grp && entry->cmd == cmd) { 24 if (entry->cmd_ver == IWL_FW_CMD_VER_UNKNOWN) 25 return def; 26 return entry->cmd_ver; 27 } 28 } 29 30 return def; 31 } 32 EXPORT_SYMBOL_GPL(iwl_fw_lookup_cmd_ver); 33 34 u8 iwl_fw_lookup_notif_ver(const struct iwl_fw *fw, u8 grp, u8 cmd, u8 def) 35 { 36 const struct iwl_fw_cmd_version *entry; 37 unsigned int i; 38 39 if (!fw->ucode_capa.cmd_versions || 40 !fw->ucode_capa.n_cmd_versions) 41 return def; 42 43 entry = fw->ucode_capa.cmd_versions; 44 for (i = 0; i < fw->ucode_capa.n_cmd_versions; i++, entry++) { 45 if (entry->group == grp && entry->cmd == cmd) { 46 if (entry->notif_ver == IWL_FW_CMD_VER_UNKNOWN) 47 return def; 48 return entry->notif_ver; 49 } 50 } 51 52 return def; 53 } 54 EXPORT_SYMBOL_GPL(iwl_fw_lookup_notif_ver); 55 56 static const struct { 57 const char *name; 58 u32 num; 59 } advanced_lookup[] = { 60 { "NMI_INTERRUPT_WDG", 0x34 }, 61 { "SYSASSERT", 0x35 }, 62 { "UCODE_VERSION_MISMATCH", 0x37 }, 63 { "BAD_COMMAND", 0x38 }, 64 { "BAD_COMMAND", 0x39 }, 65 { "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C }, 66 { "FATAL_ERROR", 0x3D }, 67 { "NMI_TRM_HW_ERR", 0x46 }, 68 { "NMI_INTERRUPT_TRM", 0x4C }, 69 { "NMI_INTERRUPT_BREAK_POINT", 0x54 }, 70 { "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C }, 71 { "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 }, 72 { "NMI_INTERRUPT_HOST", 0x66 }, 73 { "NMI_INTERRUPT_LMAC_FATAL", 0x70 }, 74 { "NMI_INTERRUPT_UMAC_FATAL", 0x71 }, 75 { "NMI_INTERRUPT_OTHER_LMAC_FATAL", 0x73 }, 76 { "NMI_INTERRUPT_ACTION_PT", 0x7C }, 77 { "NMI_INTERRUPT_UNKNOWN", 0x84 }, 78 { "NMI_INTERRUPT_INST_ACTION_PT", 0x86 }, 79 { "NMI_INTERRUPT_PREG", 0x88 }, 80 { "PNVM_MISSING", FW_SYSASSERT_PNVM_MISSING }, 81 { "ADVANCED_SYSASSERT", 0 }, 82 }; 83 84 const char *iwl_fw_lookup_assert_desc(u32 num) 85 { 86 int i; 87 88 for (i = 0; i < ARRAY_SIZE(advanced_lookup) - 1; i++) 89 if (advanced_lookup[i].num == (num & ~FW_SYSASSERT_CPU_MASK)) 90 return advanced_lookup[i].name; 91 92 /* No entry matches 'num', so it is the last: ADVANCED_SYSASSERT */ 93 return advanced_lookup[i].name; 94 } 95 EXPORT_SYMBOL_GPL(iwl_fw_lookup_assert_desc); 96