198c8bd77SJohannes Berg // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 298c8bd77SJohannes Berg /* 31db385c6SLuca Coelho * Copyright(c) 2019 - 2021 Intel Corporation 498c8bd77SJohannes Berg */ 5*971cbe50SJohannes Berg #include <fw/api/commands.h> 64af11950SMordechay Goodstein #include "img.h" 74af11950SMordechay Goodstein 8*971cbe50SJohannes Berg u8 iwl_fw_lookup_cmd_ver(const struct iwl_fw *fw, u32 cmd_id, u8 def) 94af11950SMordechay Goodstein { 104af11950SMordechay Goodstein const struct iwl_fw_cmd_version *entry; 114af11950SMordechay Goodstein unsigned int i; 12*971cbe50SJohannes Berg /* prior to LONG_GROUP, we never used this CMD version API */ 13*971cbe50SJohannes Berg u8 grp = iwl_cmd_groupid(cmd_id) ?: LONG_GROUP; 14*971cbe50SJohannes Berg u8 cmd = iwl_cmd_opcode(cmd_id); 154af11950SMordechay Goodstein 164af11950SMordechay Goodstein if (!fw->ucode_capa.cmd_versions || 174af11950SMordechay Goodstein !fw->ucode_capa.n_cmd_versions) 18e80bfd11SMordechay Goodstein return def; 194af11950SMordechay Goodstein 204af11950SMordechay Goodstein entry = fw->ucode_capa.cmd_versions; 214af11950SMordechay Goodstein for (i = 0; i < fw->ucode_capa.n_cmd_versions; i++, entry++) { 22e80bfd11SMordechay Goodstein if (entry->group == grp && entry->cmd == cmd) { 23e80bfd11SMordechay Goodstein if (entry->cmd_ver == IWL_FW_CMD_VER_UNKNOWN) 24e80bfd11SMordechay Goodstein return def; 254af11950SMordechay Goodstein return entry->cmd_ver; 264af11950SMordechay Goodstein } 27e80bfd11SMordechay Goodstein } 284af11950SMordechay Goodstein 29e80bfd11SMordechay Goodstein return def; 304af11950SMordechay Goodstein } 314af11950SMordechay Goodstein EXPORT_SYMBOL_GPL(iwl_fw_lookup_cmd_ver); 324af11950SMordechay Goodstein 334af11950SMordechay Goodstein u8 iwl_fw_lookup_notif_ver(const struct iwl_fw *fw, u8 grp, u8 cmd, u8 def) 344af11950SMordechay Goodstein { 354af11950SMordechay Goodstein const struct iwl_fw_cmd_version *entry; 364af11950SMordechay Goodstein unsigned int i; 374af11950SMordechay Goodstein 384af11950SMordechay Goodstein if (!fw->ucode_capa.cmd_versions || 394af11950SMordechay Goodstein !fw->ucode_capa.n_cmd_versions) 404af11950SMordechay Goodstein return def; 414af11950SMordechay Goodstein 424af11950SMordechay Goodstein entry = fw->ucode_capa.cmd_versions; 434af11950SMordechay Goodstein for (i = 0; i < fw->ucode_capa.n_cmd_versions; i++, entry++) { 444af11950SMordechay Goodstein if (entry->group == grp && entry->cmd == cmd) { 454af11950SMordechay Goodstein if (entry->notif_ver == IWL_FW_CMD_VER_UNKNOWN) 464af11950SMordechay Goodstein return def; 474af11950SMordechay Goodstein return entry->notif_ver; 484af11950SMordechay Goodstein } 494af11950SMordechay Goodstein } 504af11950SMordechay Goodstein 514af11950SMordechay Goodstein return def; 524af11950SMordechay Goodstein } 534af11950SMordechay Goodstein EXPORT_SYMBOL_GPL(iwl_fw_lookup_notif_ver); 5479946ee7SMordechay Goodstein 5579946ee7SMordechay Goodstein static const struct { 5679946ee7SMordechay Goodstein const char *name; 571db385c6SLuca Coelho u32 num; 5879946ee7SMordechay Goodstein } advanced_lookup[] = { 5979946ee7SMordechay Goodstein { "NMI_INTERRUPT_WDG", 0x34 }, 6079946ee7SMordechay Goodstein { "SYSASSERT", 0x35 }, 6179946ee7SMordechay Goodstein { "UCODE_VERSION_MISMATCH", 0x37 }, 6279946ee7SMordechay Goodstein { "BAD_COMMAND", 0x38 }, 6379946ee7SMordechay Goodstein { "BAD_COMMAND", 0x39 }, 6479946ee7SMordechay Goodstein { "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C }, 6579946ee7SMordechay Goodstein { "FATAL_ERROR", 0x3D }, 6679946ee7SMordechay Goodstein { "NMI_TRM_HW_ERR", 0x46 }, 6779946ee7SMordechay Goodstein { "NMI_INTERRUPT_TRM", 0x4C }, 6879946ee7SMordechay Goodstein { "NMI_INTERRUPT_BREAK_POINT", 0x54 }, 6979946ee7SMordechay Goodstein { "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C }, 7079946ee7SMordechay Goodstein { "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 }, 7179946ee7SMordechay Goodstein { "NMI_INTERRUPT_HOST", 0x66 }, 7279946ee7SMordechay Goodstein { "NMI_INTERRUPT_LMAC_FATAL", 0x70 }, 7379946ee7SMordechay Goodstein { "NMI_INTERRUPT_UMAC_FATAL", 0x71 }, 7479946ee7SMordechay Goodstein { "NMI_INTERRUPT_OTHER_LMAC_FATAL", 0x73 }, 7579946ee7SMordechay Goodstein { "NMI_INTERRUPT_ACTION_PT", 0x7C }, 7679946ee7SMordechay Goodstein { "NMI_INTERRUPT_UNKNOWN", 0x84 }, 7779946ee7SMordechay Goodstein { "NMI_INTERRUPT_INST_ACTION_PT", 0x86 }, 781db385c6SLuca Coelho { "PNVM_MISSING", FW_SYSASSERT_PNVM_MISSING }, 7979946ee7SMordechay Goodstein { "ADVANCED_SYSASSERT", 0 }, 8079946ee7SMordechay Goodstein }; 8179946ee7SMordechay Goodstein 8279946ee7SMordechay Goodstein const char *iwl_fw_lookup_assert_desc(u32 num) 8379946ee7SMordechay Goodstein { 8479946ee7SMordechay Goodstein int i; 8579946ee7SMordechay Goodstein 8679946ee7SMordechay Goodstein for (i = 0; i < ARRAY_SIZE(advanced_lookup) - 1; i++) 8779946ee7SMordechay Goodstein if (advanced_lookup[i].num == (num & ~FW_SYSASSERT_CPU_MASK)) 8879946ee7SMordechay Goodstein return advanced_lookup[i].name; 8979946ee7SMordechay Goodstein 9079946ee7SMordechay Goodstein /* No entry matches 'num', so it is the last: ADVANCED_SYSASSERT */ 9179946ee7SMordechay Goodstein return advanced_lookup[i].name; 9279946ee7SMordechay Goodstein } 9379946ee7SMordechay Goodstein EXPORT_SYMBOL_GPL(iwl_fw_lookup_assert_desc); 94