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