162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2019 - 2021 Intel Corporation 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#include <fw/api/commands.h> 662306a36Sopenharmony_ci#include "img.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciu8 iwl_fw_lookup_cmd_ver(const struct iwl_fw *fw, u32 cmd_id, u8 def) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci const struct iwl_fw_cmd_version *entry; 1162306a36Sopenharmony_ci unsigned int i; 1262306a36Sopenharmony_ci /* prior to LONG_GROUP, we never used this CMD version API */ 1362306a36Sopenharmony_ci u8 grp = iwl_cmd_groupid(cmd_id) ?: LONG_GROUP; 1462306a36Sopenharmony_ci u8 cmd = iwl_cmd_opcode(cmd_id); 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci if (!fw->ucode_capa.cmd_versions || 1762306a36Sopenharmony_ci !fw->ucode_capa.n_cmd_versions) 1862306a36Sopenharmony_ci return def; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci entry = fw->ucode_capa.cmd_versions; 2162306a36Sopenharmony_ci for (i = 0; i < fw->ucode_capa.n_cmd_versions; i++, entry++) { 2262306a36Sopenharmony_ci if (entry->group == grp && entry->cmd == cmd) { 2362306a36Sopenharmony_ci if (entry->cmd_ver == IWL_FW_CMD_VER_UNKNOWN) 2462306a36Sopenharmony_ci return def; 2562306a36Sopenharmony_ci return entry->cmd_ver; 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci } 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci return def; 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(iwl_fw_lookup_cmd_ver); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciu8 iwl_fw_lookup_notif_ver(const struct iwl_fw *fw, u8 grp, u8 cmd, u8 def) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci const struct iwl_fw_cmd_version *entry; 3662306a36Sopenharmony_ci unsigned int i; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci if (!fw->ucode_capa.cmd_versions || 3962306a36Sopenharmony_ci !fw->ucode_capa.n_cmd_versions) 4062306a36Sopenharmony_ci return def; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci entry = fw->ucode_capa.cmd_versions; 4362306a36Sopenharmony_ci for (i = 0; i < fw->ucode_capa.n_cmd_versions; i++, entry++) { 4462306a36Sopenharmony_ci if (entry->group == grp && entry->cmd == cmd) { 4562306a36Sopenharmony_ci if (entry->notif_ver == IWL_FW_CMD_VER_UNKNOWN) 4662306a36Sopenharmony_ci return def; 4762306a36Sopenharmony_ci return entry->notif_ver; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return def; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(iwl_fw_lookup_notif_ver); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic const struct { 5662306a36Sopenharmony_ci const char *name; 5762306a36Sopenharmony_ci u32 num; 5862306a36Sopenharmony_ci} advanced_lookup[] = { 5962306a36Sopenharmony_ci { "NMI_INTERRUPT_WDG", 0x34 }, 6062306a36Sopenharmony_ci { "SYSASSERT", 0x35 }, 6162306a36Sopenharmony_ci { "UCODE_VERSION_MISMATCH", 0x37 }, 6262306a36Sopenharmony_ci { "BAD_COMMAND", 0x38 }, 6362306a36Sopenharmony_ci { "BAD_COMMAND", 0x39 }, 6462306a36Sopenharmony_ci { "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C }, 6562306a36Sopenharmony_ci { "FATAL_ERROR", 0x3D }, 6662306a36Sopenharmony_ci { "NMI_TRM_HW_ERR", 0x46 }, 6762306a36Sopenharmony_ci { "NMI_INTERRUPT_TRM", 0x4C }, 6862306a36Sopenharmony_ci { "NMI_INTERRUPT_BREAK_POINT", 0x54 }, 6962306a36Sopenharmony_ci { "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C }, 7062306a36Sopenharmony_ci { "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 }, 7162306a36Sopenharmony_ci { "NMI_INTERRUPT_HOST", 0x66 }, 7262306a36Sopenharmony_ci { "NMI_INTERRUPT_LMAC_FATAL", 0x70 }, 7362306a36Sopenharmony_ci { "NMI_INTERRUPT_UMAC_FATAL", 0x71 }, 7462306a36Sopenharmony_ci { "NMI_INTERRUPT_OTHER_LMAC_FATAL", 0x73 }, 7562306a36Sopenharmony_ci { "NMI_INTERRUPT_ACTION_PT", 0x7C }, 7662306a36Sopenharmony_ci { "NMI_INTERRUPT_UNKNOWN", 0x84 }, 7762306a36Sopenharmony_ci { "NMI_INTERRUPT_INST_ACTION_PT", 0x86 }, 7862306a36Sopenharmony_ci { "PNVM_MISSING", FW_SYSASSERT_PNVM_MISSING }, 7962306a36Sopenharmony_ci { "ADVANCED_SYSASSERT", 0 }, 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciconst char *iwl_fw_lookup_assert_desc(u32 num) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci int i; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(advanced_lookup) - 1; i++) 8762306a36Sopenharmony_ci if (advanced_lookup[i].num == (num & ~FW_SYSASSERT_CPU_MASK)) 8862306a36Sopenharmony_ci return advanced_lookup[i].name; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci /* No entry matches 'num', so it is the last: ADVANCED_SYSASSERT */ 9162306a36Sopenharmony_ci return advanced_lookup[i].name; 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(iwl_fw_lookup_assert_desc); 94