File Index
Files and directories
Sign in
FILE

img.c

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/intel/iwlwifi/fw/img.c C
 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
 9u8 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}
32EXPORT_SYMBOL_GPL(iwl_fw_lookup_cmd_ver);
33
34u8 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}
54EXPORT_SYMBOL_GPL(iwl_fw_lookup_notif_ver);
55
56static 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
84const 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}
95EXPORT_SYMBOL_GPL(iwl_fw_lookup_assert_desc);
~/ Read-only file preview.