xref: /dpdk/drivers/net/hns3/hns3_intr.c (revision 501a40ae8370dcbfe086ef080a60c86a8d428ef6)
13988ab0eSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor)  * Copyright(c) 2018-2021 HiSilicon Limited.
33988ab0eSWei Hu (Xavier)  */
43988ab0eSWei Hu (Xavier) 
53988ab0eSWei Hu (Xavier) #include <rte_alarm.h>
63988ab0eSWei Hu (Xavier) #include <rte_cycles.h>
73988ab0eSWei Hu (Xavier) #include <rte_ethdev.h>
83988ab0eSWei Hu (Xavier) #include <rte_io.h>
93988ab0eSWei Hu (Xavier) #include <rte_malloc.h>
103988ab0eSWei Hu (Xavier) 
11a4c7152dSHuisong Li #include "hns3_common.h"
123988ab0eSWei Hu (Xavier) #include "hns3_logs.h"
133988ab0eSWei Hu (Xavier) #include "hns3_regs.h"
143988ab0eSWei Hu (Xavier) #include "hns3_rxtx.h"
151c757dd5SChengwen Feng #include "hns3_intr.h"
163988ab0eSWei Hu (Xavier) 
173988ab0eSWei Hu (Xavier) #define SWITCH_CONTEXT_US	10
183988ab0eSWei Hu (Xavier) 
192790c646SWei Hu (Xavier) static const char *reset_string[HNS3_MAX_RESET] = {
201c1eb759SHongbo Zheng 	"flr", "vf_func", "vf_pf_func", "vf_full", "vf_global",
211c1eb759SHongbo Zheng 	"pf_func", "global", "IMP", "none",
222790c646SWei Hu (Xavier) };
232790c646SWei Hu (Xavier) 
24f53a793bSWei Hu (Xavier) static const struct hns3_hw_error mac_afifo_tnl_int[] = {
25a3e124faSHongbo Zheng 	{
26a3e124faSHongbo Zheng 		.int_msk = BIT(0),
27d3d31324SHongbo Zheng 		.msg = "egu_cge_afifo_ecc_1bit_err",
28a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
29a3e124faSHongbo Zheng 	}, {
30a3e124faSHongbo Zheng 		.int_msk = BIT(1),
31d3d31324SHongbo Zheng 		.msg = "egu_cge_afifo_ecc_mbit_err",
32a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
33a3e124faSHongbo Zheng 	}, {
34a3e124faSHongbo Zheng 		.int_msk = BIT(2),
35d3d31324SHongbo Zheng 		.msg = "egu_lge_afifo_ecc_1bit_err",
36a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
37a3e124faSHongbo Zheng 	}, {
38a3e124faSHongbo Zheng 		.int_msk = BIT(3),
39d3d31324SHongbo Zheng 		.msg = "egu_lge_afifo_ecc_mbit_err",
40a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
41a3e124faSHongbo Zheng 	}, {
42a3e124faSHongbo Zheng 		.int_msk = BIT(4),
43d3d31324SHongbo Zheng 		.msg = "cge_igu_afifo_ecc_1bit_err",
44a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
45a3e124faSHongbo Zheng 	}, {
46a3e124faSHongbo Zheng 		.int_msk = BIT(5),
47d3d31324SHongbo Zheng 		.msg = "cge_igu_afifo_ecc_mbit_err",
48a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
49a3e124faSHongbo Zheng 	}, {
50a3e124faSHongbo Zheng 		.int_msk = BIT(6),
51d3d31324SHongbo Zheng 		.msg = "lge_igu_afifo_ecc_1bit_err",
52a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
53a3e124faSHongbo Zheng 	}, {
54a3e124faSHongbo Zheng 		.int_msk = BIT(7),
55d3d31324SHongbo Zheng 		.msg = "lge_igu_afifo_ecc_mbit_err",
56a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
57a3e124faSHongbo Zheng 	}, {
58a3e124faSHongbo Zheng 		.int_msk = BIT(8),
59d3d31324SHongbo Zheng 		.msg = "cge_igu_afifo_overflow_err",
60a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
61a3e124faSHongbo Zheng 	}, {
62a3e124faSHongbo Zheng 		.int_msk = BIT(9),
63d3d31324SHongbo Zheng 		.msg = "lge_igu_afifo_overflow_err",
64a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
65a3e124faSHongbo Zheng 	}, {
66a3e124faSHongbo Zheng 		.int_msk = BIT(10),
67d3d31324SHongbo Zheng 		.msg = "egu_cge_afifo_underrun_err",
68a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
69a3e124faSHongbo Zheng 	}, {
70a3e124faSHongbo Zheng 		.int_msk = BIT(11),
71d3d31324SHongbo Zheng 		.msg = "egu_lge_afifo_underrun_err",
72a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
73a3e124faSHongbo Zheng 	}, {
74a3e124faSHongbo Zheng 		.int_msk = BIT(12),
75d3d31324SHongbo Zheng 		.msg = "egu_ge_afifo_underrun_err",
76a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
77a3e124faSHongbo Zheng 	}, {
78a3e124faSHongbo Zheng 		.int_msk = BIT(13),
79d3d31324SHongbo Zheng 		.msg = "ge_igu_afifo_overflow_err",
80a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
81a3e124faSHongbo Zheng 	}, {
82a3e124faSHongbo Zheng 		.int_msk = 0,
83d3d31324SHongbo Zheng 		.msg = NULL,
84a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
85a3e124faSHongbo Zheng 	}
863988ab0eSWei Hu (Xavier) };
873988ab0eSWei Hu (Xavier) 
88f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st1[] = {
89a3e124faSHongbo Zheng 	{
90a3e124faSHongbo Zheng 		.int_msk = 0xFFFFFFFF,
91d3d31324SHongbo Zheng 		.msg = "rpu_rx_pkt_ecc_mbit_err",
92a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
93a3e124faSHongbo Zheng 	}, {
94a3e124faSHongbo Zheng 		.int_msk = 0,
95d3d31324SHongbo Zheng 		.msg = NULL,
96a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
97a3e124faSHongbo Zheng 	}
98f53a793bSWei Hu (Xavier) };
99f53a793bSWei Hu (Xavier) 
100f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st2_ras[] = {
101a3e124faSHongbo Zheng 	{
102a3e124faSHongbo Zheng 		.int_msk = BIT(13),
103d3d31324SHongbo Zheng 		.msg = "rpu_rx_pkt_bit32_ecc_mbit_err",
104a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
105a3e124faSHongbo Zheng 	}, {
106a3e124faSHongbo Zheng 		.int_msk = BIT(14),
107d3d31324SHongbo Zheng 		.msg = "rpu_rx_pkt_bit33_ecc_mbit_err",
108a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
109a3e124faSHongbo Zheng 	}, {
110a3e124faSHongbo Zheng 		.int_msk = BIT(15),
111d3d31324SHongbo Zheng 		.msg = "rpu_rx_pkt_bit34_ecc_mbit_err",
112a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
113a3e124faSHongbo Zheng 	}, {
114a3e124faSHongbo Zheng 		.int_msk = BIT(16),
115d3d31324SHongbo Zheng 		.msg = "rpu_rx_pkt_bit35_ecc_mbit_err",
116a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
117a3e124faSHongbo Zheng 	}, {
118a3e124faSHongbo Zheng 		.int_msk = BIT(17),
119d3d31324SHongbo Zheng 		.msg = "rcb_tx_ring_ecc_mbit_err",
120a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
121a3e124faSHongbo Zheng 	}, {
122a3e124faSHongbo Zheng 		.int_msk = BIT(18),
123d3d31324SHongbo Zheng 		.msg = "rcb_rx_ring_ecc_mbit_err",
124a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
125a3e124faSHongbo Zheng 	}, {
126a3e124faSHongbo Zheng 		.int_msk = BIT(19),
127d3d31324SHongbo Zheng 		.msg = "rcb_tx_fbd_ecc_mbit_err",
128a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
129a3e124faSHongbo Zheng 	}, {
130a3e124faSHongbo Zheng 		.int_msk = BIT(20),
131d3d31324SHongbo Zheng 		.msg = "rcb_rx_ebd_ecc_mbit_err",
132a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
133a3e124faSHongbo Zheng 	}, {
134a3e124faSHongbo Zheng 		.int_msk = BIT(21),
135d3d31324SHongbo Zheng 		.msg = "rcb_tso_info_ecc_mbit_err",
136a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
137a3e124faSHongbo Zheng 	}, {
138a3e124faSHongbo Zheng 		.int_msk = BIT(22),
139d3d31324SHongbo Zheng 		.msg = "rcb_tx_int_info_ecc_mbit_err",
140a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
141a3e124faSHongbo Zheng 	}, {
142a3e124faSHongbo Zheng 		.int_msk = BIT(23),
143d3d31324SHongbo Zheng 		.msg = "rcb_rx_int_info_ecc_mbit_err",
144a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
145a3e124faSHongbo Zheng 	}, {
146a3e124faSHongbo Zheng 		.int_msk = BIT(24),
147d3d31324SHongbo Zheng 		.msg = "tpu_tx_pkt_0_ecc_mbit_err",
148a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
149a3e124faSHongbo Zheng 	}, {
150a3e124faSHongbo Zheng 		.int_msk = BIT(25),
151d3d31324SHongbo Zheng 		.msg = "tpu_tx_pkt_1_ecc_mbit_err",
152a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
153a3e124faSHongbo Zheng 	}, {
154a3e124faSHongbo Zheng 		.int_msk = BIT(26),
155d3d31324SHongbo Zheng 		.msg = "rd_bus_err",
156a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
157a3e124faSHongbo Zheng 	}, {
158a3e124faSHongbo Zheng 		.int_msk = BIT(27),
159d3d31324SHongbo Zheng 		.msg = "wr_bus_err",
160a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
161a3e124faSHongbo Zheng 	}, {
162a3e124faSHongbo Zheng 		.int_msk = BIT(30),
163d3d31324SHongbo Zheng 		.msg = "ooo_ecc_err_detect",
164a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
165a3e124faSHongbo Zheng 	}, {
166a3e124faSHongbo Zheng 		.int_msk = BIT(31),
167d3d31324SHongbo Zheng 		.msg = "ooo_ecc_err_multpl",
168a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
169a3e124faSHongbo Zheng 	}, {
170a3e124faSHongbo Zheng 		.int_msk = 0,
171d3d31324SHongbo Zheng 		.msg = NULL,
172a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
173a3e124faSHongbo Zheng 	}
1743988ab0eSWei Hu (Xavier) };
1753988ab0eSWei Hu (Xavier) 
176f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st2_msix[] = {
177a3e124faSHongbo Zheng 	{
178a3e124faSHongbo Zheng 		.int_msk = BIT(29),
179d3d31324SHongbo Zheng 		.msg = "rx_q_search_miss",
180a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
181a3e124faSHongbo Zheng 	}, {
182a3e124faSHongbo Zheng 		.int_msk = 0,
183d3d31324SHongbo Zheng 		.msg = NULL,
184a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
185a3e124faSHongbo Zheng 	}
1863988ab0eSWei Hu (Xavier) };
1873988ab0eSWei Hu (Xavier) 
188f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_port_based_pf_int[] = {
189a3e124faSHongbo Zheng 	{
190a3e124faSHongbo Zheng 		.int_msk = BIT(0),
191d3d31324SHongbo Zheng 		.msg = "roc_pkt_without_key_port",
192a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
193a3e124faSHongbo Zheng 	}, {
194a3e124faSHongbo Zheng 		.int_msk = BIT(9),
195d3d31324SHongbo Zheng 		.msg = "low_water_line_err_port",
196a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
197a3e124faSHongbo Zheng 	}, {
198a3e124faSHongbo Zheng 		.int_msk = 0,
199d3d31324SHongbo Zheng 		.msg = NULL,
200a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
201a3e124faSHongbo Zheng 	}
202f53a793bSWei Hu (Xavier) };
203f53a793bSWei Hu (Xavier) 
204f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppp_pf_abnormal_int[] = {
205a3e124faSHongbo Zheng 	{
206a3e124faSHongbo Zheng 		.int_msk = BIT(0),
207d3d31324SHongbo Zheng 		.msg = "tx_vlan_tag_err",
208a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
209a3e124faSHongbo Zheng 	}, {
210a3e124faSHongbo Zheng 		.int_msk = BIT(1),
211d3d31324SHongbo Zheng 		.msg = "rss_list_tc_unassigned_queue_err",
212a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
213a3e124faSHongbo Zheng 	}, {
214a3e124faSHongbo Zheng 		.int_msk = 0,
215d3d31324SHongbo Zheng 		.msg = NULL,
216a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
217a3e124faSHongbo Zheng 	}
2183988ab0eSWei Hu (Xavier) };
2193988ab0eSWei Hu (Xavier) 
220f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_pf_abnormal_int_ras[] = {
221a3e124faSHongbo Zheng 	{
222a3e124faSHongbo Zheng 		.int_msk = BIT(3),
223d3d31324SHongbo Zheng 		.msg = "tx_rd_fbd_poison",
224a3e124faSHongbo Zheng 		.reset_level = HNS3_FUNC_RESET
225a3e124faSHongbo Zheng 	}, {
226a3e124faSHongbo Zheng 		.int_msk = BIT(4),
227d3d31324SHongbo Zheng 		.msg = "rx_rd_ebd_poison",
228a3e124faSHongbo Zheng 		.reset_level = HNS3_FUNC_RESET
229a3e124faSHongbo Zheng 	}, {
230a3e124faSHongbo Zheng 		.int_msk = 0,
231d3d31324SHongbo Zheng 		.msg = NULL,
232a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
233a3e124faSHongbo Zheng 	}
234f53a793bSWei Hu (Xavier) };
235f53a793bSWei Hu (Xavier) 
236f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_pf_abnormal_int_msix[] = {
237a3e124faSHongbo Zheng 	{
238a3e124faSHongbo Zheng 		.int_msk = BIT(0),
239d3d31324SHongbo Zheng 		.msg = "over_8bd_no_fe",
240a3e124faSHongbo Zheng 		.reset_level = HNS3_FUNC_RESET
241a3e124faSHongbo Zheng 	}, {
242a3e124faSHongbo Zheng 		.int_msk = BIT(1),
243d3d31324SHongbo Zheng 		.msg = "tso_mss_cmp_min_err",
244a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
245a3e124faSHongbo Zheng 	}, {
246a3e124faSHongbo Zheng 		.int_msk = BIT(2),
247d3d31324SHongbo Zheng 		.msg = "tso_mss_cmp_max_err",
248a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
249a3e124faSHongbo Zheng 	}, {
250a3e124faSHongbo Zheng 		.int_msk = BIT(5),
251d3d31324SHongbo Zheng 		.msg = "buf_wait_timeout",
252a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
253a3e124faSHongbo Zheng 	}, {
254a3e124faSHongbo Zheng 		.int_msk = 0,
255d3d31324SHongbo Zheng 		.msg = NULL,
256a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
257a3e124faSHongbo Zheng 	}
2583988ab0eSWei Hu (Xavier) };
2593988ab0eSWei Hu (Xavier) 
260f53a793bSWei Hu (Xavier) static const struct hns3_hw_error imp_tcm_ecc_int[] = {
261a3e124faSHongbo Zheng 	{
262a3e124faSHongbo Zheng 		.int_msk = BIT(1),
263d3d31324SHongbo Zheng 		.msg = "imp_itcm0_ecc_mbit_err",
264a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
265a3e124faSHongbo Zheng 	}, {
266a3e124faSHongbo Zheng 		.int_msk = BIT(3),
267d3d31324SHongbo Zheng 		.msg = "imp_itcm1_ecc_mbit_err",
268a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
269a3e124faSHongbo Zheng 	}, {
270a3e124faSHongbo Zheng 		.int_msk = BIT(5),
271d3d31324SHongbo Zheng 		.msg = "imp_itcm2_ecc_mbit_err",
272a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
273a3e124faSHongbo Zheng 	}, {
274a3e124faSHongbo Zheng 		.int_msk = BIT(7),
275d3d31324SHongbo Zheng 		.msg = "imp_itcm3_ecc_mbit_err",
276a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
277a3e124faSHongbo Zheng 	}, {
278a3e124faSHongbo Zheng 		.int_msk = BIT(9),
279d3d31324SHongbo Zheng 		.msg = "imp_dtcm0_mem0_ecc_mbit_err",
280a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
281a3e124faSHongbo Zheng 	}, {
282a3e124faSHongbo Zheng 		.int_msk = BIT(11),
283d3d31324SHongbo Zheng 		.msg = "imp_dtcm0_mem1_ecc_mbit_err",
284a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
285a3e124faSHongbo Zheng 	}, {
286a3e124faSHongbo Zheng 		.int_msk = BIT(13),
287d3d31324SHongbo Zheng 		.msg = "imp_dtcm1_mem0_ecc_mbit_err",
288a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
289a3e124faSHongbo Zheng 	}, {
290a3e124faSHongbo Zheng 		.int_msk = BIT(15),
291d3d31324SHongbo Zheng 		.msg = "imp_dtcm1_mem1_ecc_mbit_err",
292a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
293a3e124faSHongbo Zheng 	}, {
294a3e124faSHongbo Zheng 		.int_msk = BIT(17),
295d3d31324SHongbo Zheng 		.msg = "imp_itcm4_ecc_mbit_err",
296a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
297a3e124faSHongbo Zheng 	}, {
298a3e124faSHongbo Zheng 		.int_msk = 0,
299d3d31324SHongbo Zheng 		.msg = NULL,
300a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
301a3e124faSHongbo Zheng 	}
302f53a793bSWei Hu (Xavier) };
303f53a793bSWei Hu (Xavier) 
304f53a793bSWei Hu (Xavier) static const struct hns3_hw_error cmdq_mem_ecc_int[] = {
305a3e124faSHongbo Zheng 	{
306a3e124faSHongbo Zheng 		.int_msk = BIT(1),
307d3d31324SHongbo Zheng 		.msg = "cmdq_nic_rx_depth_ecc_mbit_err",
308a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
309a3e124faSHongbo Zheng 	}, {
310a3e124faSHongbo Zheng 		.int_msk = BIT(3),
311d3d31324SHongbo Zheng 		.msg = "cmdq_nic_tx_depth_ecc_mbit_err",
312a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
313a3e124faSHongbo Zheng 	}, {
314a3e124faSHongbo Zheng 		.int_msk = BIT(5),
315d3d31324SHongbo Zheng 		.msg = "cmdq_nic_rx_tail_ecc_mbit_err",
316a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
317a3e124faSHongbo Zheng 	}, {
318a3e124faSHongbo Zheng 		.int_msk = BIT(7),
319d3d31324SHongbo Zheng 		.msg = "cmdq_nic_tx_tail_ecc_mbit_err",
320a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
321a3e124faSHongbo Zheng 	}, {
322a3e124faSHongbo Zheng 		.int_msk = BIT(9),
323d3d31324SHongbo Zheng 		.msg = "cmdq_nic_rx_head_ecc_mbit_err",
324a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
325a3e124faSHongbo Zheng 	}, {
326a3e124faSHongbo Zheng 		.int_msk = BIT(11),
327d3d31324SHongbo Zheng 		.msg = "cmdq_nic_tx_head_ecc_mbit_err",
328a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
329a3e124faSHongbo Zheng 	}, {
330a3e124faSHongbo Zheng 		.int_msk = BIT(13),
331d3d31324SHongbo Zheng 		.msg = "cmdq_nic_rx_addr_ecc_mbit_err",
332a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
333a3e124faSHongbo Zheng 	}, {
334a3e124faSHongbo Zheng 		.int_msk = BIT(15),
335d3d31324SHongbo Zheng 		.msg = "cmdq_nic_tx_addr_ecc_mbit_err",
336a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
337a3e124faSHongbo Zheng 	}, {
338a3e124faSHongbo Zheng 		.int_msk = 0,
339d3d31324SHongbo Zheng 		.msg = NULL,
340a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
341a3e124faSHongbo Zheng 	}
342f53a793bSWei Hu (Xavier) };
343f53a793bSWei Hu (Xavier) 
344f53a793bSWei Hu (Xavier) static const struct hns3_hw_error tqp_int_ecc_int[] = {
345a3e124faSHongbo Zheng 	{
346a3e124faSHongbo Zheng 		.int_msk = BIT(6),
347d3d31324SHongbo Zheng 		.msg = "tqp_int_cfg_even_ecc_mbit_err",
348a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
349a3e124faSHongbo Zheng 	}, {
350a3e124faSHongbo Zheng 		.int_msk = BIT(7),
351d3d31324SHongbo Zheng 		.msg = "tqp_int_cfg_odd_ecc_mbit_err",
352a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
353a3e124faSHongbo Zheng 	}, {
354a3e124faSHongbo Zheng 		.int_msk = BIT(8),
355d3d31324SHongbo Zheng 		.msg = "tqp_int_ctrl_even_ecc_mbit_err",
356a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
357a3e124faSHongbo Zheng 	}, {
358a3e124faSHongbo Zheng 		.int_msk = BIT(9),
359d3d31324SHongbo Zheng 		.msg = "tqp_int_ctrl_odd_ecc_mbit_err",
360a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
361a3e124faSHongbo Zheng 	}, {
362a3e124faSHongbo Zheng 		.int_msk = BIT(10),
363d3d31324SHongbo Zheng 		.msg = "tx_queue_scan_int_ecc_mbit_err",
364a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
365a3e124faSHongbo Zheng 	}, {
366a3e124faSHongbo Zheng 		.int_msk = BIT(11),
367d3d31324SHongbo Zheng 		.msg = "rx_queue_scan_int_ecc_mbit_err",
368a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
369a3e124faSHongbo Zheng 	}, {
370a3e124faSHongbo Zheng 		.int_msk = 0,
371d3d31324SHongbo Zheng 		.msg = NULL,
372a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
373a3e124faSHongbo Zheng 	}
374f53a793bSWei Hu (Xavier) };
375f53a793bSWei Hu (Xavier) 
376f53a793bSWei Hu (Xavier) static const struct hns3_hw_error imp_rd_poison_int[] = {
377a3e124faSHongbo Zheng 	{
378a3e124faSHongbo Zheng 		.int_msk = BIT(0),
379d3d31324SHongbo Zheng 		.msg = "imp_rd_poison_int",
380a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
381a3e124faSHongbo Zheng 	}, {
382a3e124faSHongbo Zheng 		.int_msk = 0,
383d3d31324SHongbo Zheng 		.msg = NULL,
384a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
385a3e124faSHongbo Zheng 	}
386f53a793bSWei Hu (Xavier) };
387f53a793bSWei Hu (Xavier) 
388f53a793bSWei Hu (Xavier) #define HNS3_SSU_MEM_ECC_ERR(x) \
389a3e124faSHongbo Zheng { \
390a3e124faSHongbo Zheng 	.int_msk = BIT(x), \
391d3d31324SHongbo Zheng 	.msg = "ssu_mem" #x "_ecc_mbit_err", \
392a3e124faSHongbo Zheng 	.reset_level = HNS3_GLOBAL_RESET \
393a3e124faSHongbo Zheng }
394f53a793bSWei Hu (Xavier) 
395f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_ecc_multi_bit_int_0[] = {
396f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(0),
397f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(1),
398f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(2),
399f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(3),
400f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(4),
401f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(5),
402f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(6),
403f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(7),
404f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(8),
405f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(9),
406f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(10),
407f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(11),
408f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(12),
409f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(13),
410f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(14),
411f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(15),
412f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(16),
413f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(17),
414f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(18),
415f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(19),
416f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(20),
417f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(21),
418f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(22),
419f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(23),
420f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(24),
421f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(25),
422f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(26),
423f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(27),
424f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(28),
425f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(29),
426f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(30),
427f53a793bSWei Hu (Xavier) 	HNS3_SSU_MEM_ECC_ERR(31),
428d3d31324SHongbo Zheng 	{ .int_msk = 0,
429d3d31324SHongbo Zheng 	  .msg = NULL,
430f53a793bSWei Hu (Xavier) 	  .reset_level = HNS3_NONE_RESET}
431f53a793bSWei Hu (Xavier) };
432f53a793bSWei Hu (Xavier) 
433f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_ecc_multi_bit_int_1[] = {
434a3e124faSHongbo Zheng 	{
435a3e124faSHongbo Zheng 		.int_msk = BIT(0),
436d3d31324SHongbo Zheng 		.msg = "ssu_mem32_ecc_mbit_err",
437a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
438a3e124faSHongbo Zheng 	}, {
439a3e124faSHongbo Zheng 		.int_msk = 0,
440d3d31324SHongbo Zheng 		.msg = NULL,
441a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
442a3e124faSHongbo Zheng 	}
443f53a793bSWei Hu (Xavier) };
444f53a793bSWei Hu (Xavier) 
445f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_common_ecc_int[] = {
446a3e124faSHongbo Zheng 	{
447a3e124faSHongbo Zheng 		.int_msk = BIT(0),
448d3d31324SHongbo Zheng 		.msg = "buf_sum_err",
449a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
450a3e124faSHongbo Zheng 	}, {
451a3e124faSHongbo Zheng 		.int_msk = BIT(1),
452d3d31324SHongbo Zheng 		.msg = "ppp_mb_num_err",
453a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
454a3e124faSHongbo Zheng 	}, {
455a3e124faSHongbo Zheng 		.int_msk = BIT(2),
456d3d31324SHongbo Zheng 		.msg = "ppp_mbid_err",
457a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
458a3e124faSHongbo Zheng 	}, {
459a3e124faSHongbo Zheng 		.int_msk = BIT(3),
460d3d31324SHongbo Zheng 		.msg = "ppp_rlt_mac_err",
461a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
462a3e124faSHongbo Zheng 	}, {
463a3e124faSHongbo Zheng 		.int_msk = BIT(4),
464d3d31324SHongbo Zheng 		.msg = "ppp_rlt_host_err",
465a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
466a3e124faSHongbo Zheng 	}, {
467a3e124faSHongbo Zheng 		.int_msk = BIT(5),
468d3d31324SHongbo Zheng 		.msg = "cks_edit_position_err",
469a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
470a3e124faSHongbo Zheng 	}, {
471a3e124faSHongbo Zheng 		.int_msk = BIT(6),
472d3d31324SHongbo Zheng 		.msg = "cks_edit_condition_err",
473a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
474a3e124faSHongbo Zheng 	}, {
475a3e124faSHongbo Zheng 		.int_msk = BIT(7),
476d3d31324SHongbo Zheng 		.msg = "vlan_edit_condition_err",
477a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
478a3e124faSHongbo Zheng 	}, {
479a3e124faSHongbo Zheng 		.int_msk = BIT(8),
480d3d31324SHongbo Zheng 		.msg = "vlan_num_ot_err",
481a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
482a3e124faSHongbo Zheng 	}, {
483a3e124faSHongbo Zheng 		.int_msk = BIT(9),
484d3d31324SHongbo Zheng 		.msg = "vlan_num_in_err",
485a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
486a3e124faSHongbo Zheng 	}, {
487a3e124faSHongbo Zheng 		.int_msk = 0,
488d3d31324SHongbo Zheng 		.msg = NULL,
489a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
490a3e124faSHongbo Zheng 	}
491f53a793bSWei Hu (Xavier) };
492f53a793bSWei Hu (Xavier) 
493f53a793bSWei Hu (Xavier) static const struct hns3_hw_error igu_int[] = {
494a3e124faSHongbo Zheng 	{
495a3e124faSHongbo Zheng 		.int_msk = BIT(0),
496d3d31324SHongbo Zheng 		.msg = "igu_rx_buf0_ecc_mbit_err",
497a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
498a3e124faSHongbo Zheng 	}, {
499a3e124faSHongbo Zheng 		.int_msk = BIT(2),
500d3d31324SHongbo Zheng 		.msg = "igu_rx_buf1_ecc_mbit_err",
501a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
502a3e124faSHongbo Zheng 	}, {
503a3e124faSHongbo Zheng 		.int_msk = 0,
504d3d31324SHongbo Zheng 		.msg = NULL,
505a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
506a3e124faSHongbo Zheng 	}
507f53a793bSWei Hu (Xavier) };
508f53a793bSWei Hu (Xavier) 
509f53a793bSWei Hu (Xavier) static const struct hns3_hw_error msix_ecc_int[] = {
510a3e124faSHongbo Zheng 	{
511a3e124faSHongbo Zheng 		.int_msk = BIT(1),
512d3d31324SHongbo Zheng 		.msg = "msix_nic_ecc_mbit_err",
513a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
514a3e124faSHongbo Zheng 	}, {
515a3e124faSHongbo Zheng 		.int_msk = 0,
516d3d31324SHongbo Zheng 		.msg = NULL,
517a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
518a3e124faSHongbo Zheng 	}
519f53a793bSWei Hu (Xavier) };
520f53a793bSWei Hu (Xavier) 
521f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppp_mpf_abnormal_int_st1[] = {
522a3e124faSHongbo Zheng 	{
523a3e124faSHongbo Zheng 		.int_msk = BIT(0),
524d3d31324SHongbo Zheng 		.msg = "vf_vlan_ad_mem_ecc_mbit_err",
525a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
526a3e124faSHongbo Zheng 	}, {
527a3e124faSHongbo Zheng 		.int_msk = BIT(1),
528d3d31324SHongbo Zheng 		.msg = "umv_mcast_group_mem_ecc_mbit_err",
529a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
530a3e124faSHongbo Zheng 	}, {
531a3e124faSHongbo Zheng 		.int_msk = BIT(2),
532d3d31324SHongbo Zheng 		.msg = "umv_key_mem0_ecc_mbit_err",
533a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
534a3e124faSHongbo Zheng 	}, {
535a3e124faSHongbo Zheng 		.int_msk = BIT(3),
536d3d31324SHongbo Zheng 		.msg = "umv_key_mem1_ecc_mbit_err",
537a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
538a3e124faSHongbo Zheng 	}, {
539a3e124faSHongbo Zheng 		.int_msk = BIT(4),
540d3d31324SHongbo Zheng 		.msg = "umv_key_mem2_ecc_mbit_err",
541a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
542a3e124faSHongbo Zheng 	}, {
543a3e124faSHongbo Zheng 		.int_msk = BIT(5),
544d3d31324SHongbo Zheng 		.msg = "umv_key_mem3_ecc_mbit_err",
545a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
546a3e124faSHongbo Zheng 	}, {
547a3e124faSHongbo Zheng 		.int_msk = BIT(6),
548d3d31324SHongbo Zheng 		.msg = "umv_ad_mem_ecc_mbit_err",
549a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
550a3e124faSHongbo Zheng 	}, {
551a3e124faSHongbo Zheng 		.int_msk = BIT(7),
552d3d31324SHongbo Zheng 		.msg = "rss_tc_mode_mem_ecc_mbit_err",
553a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
554a3e124faSHongbo Zheng 	}, {
555a3e124faSHongbo Zheng 		.int_msk = BIT(8),
556d3d31324SHongbo Zheng 		.msg = "rss_idt_mem0_ecc_mbit_err",
557a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
558a3e124faSHongbo Zheng 	}, {
559a3e124faSHongbo Zheng 		.int_msk = BIT(9),
560d3d31324SHongbo Zheng 		.msg = "rss_idt_mem1_ecc_mbit_err",
561a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
562a3e124faSHongbo Zheng 	}, {
563a3e124faSHongbo Zheng 		.int_msk = BIT(10),
564d3d31324SHongbo Zheng 		.msg = "rss_idt_mem2_ecc_mbit_err",
565a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
566a3e124faSHongbo Zheng 	}, {
567a3e124faSHongbo Zheng 		.int_msk = BIT(11),
568d3d31324SHongbo Zheng 		.msg = "rss_idt_mem3_ecc_mbit_err",
569a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
570a3e124faSHongbo Zheng 	}, {
571a3e124faSHongbo Zheng 		.int_msk = BIT(12),
572d3d31324SHongbo Zheng 		.msg = "rss_idt_mem4_ecc_mbit_err",
573a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
574a3e124faSHongbo Zheng 	}, {
575a3e124faSHongbo Zheng 		.int_msk = BIT(13),
576d3d31324SHongbo Zheng 		.msg = "rss_idt_mem5_ecc_mbit_err",
577a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
578a3e124faSHongbo Zheng 	}, {
579a3e124faSHongbo Zheng 		.int_msk = BIT(14),
580d3d31324SHongbo Zheng 		.msg = "rss_idt_mem6_ecc_mbit_err",
581a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
582a3e124faSHongbo Zheng 	}, {
583a3e124faSHongbo Zheng 		.int_msk = BIT(15),
584d3d31324SHongbo Zheng 		.msg = "rss_idt_mem7_ecc_mbit_err",
585a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
586a3e124faSHongbo Zheng 	}, {
587a3e124faSHongbo Zheng 		.int_msk = BIT(16),
588d3d31324SHongbo Zheng 		.msg = "rss_idt_mem8_ecc_mbit_err",
589a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
590a3e124faSHongbo Zheng 	}, {
591a3e124faSHongbo Zheng 		.int_msk = BIT(17),
592d3d31324SHongbo Zheng 		.msg = "rss_idt_mem9_ecc_mbit_err",
593a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
594a3e124faSHongbo Zheng 	}, {
595a3e124faSHongbo Zheng 		.int_msk = BIT(18),
596d3d31324SHongbo Zheng 		.msg = "rss_idt_mem10_ecc_m1bit_err",
597a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
598a3e124faSHongbo Zheng 	}, {
599a3e124faSHongbo Zheng 		.int_msk = BIT(19),
600d3d31324SHongbo Zheng 		.msg = "rss_idt_mem11_ecc_mbit_err",
601a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
602a3e124faSHongbo Zheng 	}, {
603a3e124faSHongbo Zheng 		.int_msk = BIT(20),
604d3d31324SHongbo Zheng 		.msg = "rss_idt_mem12_ecc_mbit_err",
605a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
606a3e124faSHongbo Zheng 	}, {
607a3e124faSHongbo Zheng 		.int_msk = BIT(21),
608d3d31324SHongbo Zheng 		.msg = "rss_idt_mem13_ecc_mbit_err",
609a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
610a3e124faSHongbo Zheng 	}, {
611a3e124faSHongbo Zheng 		.int_msk = BIT(22),
612d3d31324SHongbo Zheng 		.msg = "rss_idt_mem14_ecc_mbit_err",
613a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
614a3e124faSHongbo Zheng 	}, {
615a3e124faSHongbo Zheng 		.int_msk = BIT(23),
616d3d31324SHongbo Zheng 		.msg = "rss_idt_mem15_ecc_mbit_err",
617a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
618a3e124faSHongbo Zheng 	}, {
619a3e124faSHongbo Zheng 		.int_msk = BIT(24),
620d3d31324SHongbo Zheng 		.msg = "port_vlan_mem_ecc_mbit_err",
621a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
622a3e124faSHongbo Zheng 	}, {
623a3e124faSHongbo Zheng 		.int_msk = BIT(25),
624d3d31324SHongbo Zheng 		.msg = "mcast_linear_table_mem_ecc_mbit_err",
625a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
626a3e124faSHongbo Zheng 	}, {
627a3e124faSHongbo Zheng 		.int_msk = BIT(26),
628d3d31324SHongbo Zheng 		.msg = "mcast_result_mem_ecc_mbit_err",
629a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
630a3e124faSHongbo Zheng 	}, {
631a3e124faSHongbo Zheng 		.int_msk = BIT(27),
632d3d31324SHongbo Zheng 		.msg = "flow_director_ad_mem0_ecc_mbit_err",
633a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
634a3e124faSHongbo Zheng 	}, {
635a3e124faSHongbo Zheng 		.int_msk = BIT(28),
636d3d31324SHongbo Zheng 		.msg = "flow_director_ad_mem1_ecc_mbit_err",
637a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
638a3e124faSHongbo Zheng 	}, {
639a3e124faSHongbo Zheng 		.int_msk = BIT(29),
640d3d31324SHongbo Zheng 		.msg = "rx_vlan_tag_memory_ecc_mbit_err",
641a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
642a3e124faSHongbo Zheng 	}, {
643a3e124faSHongbo Zheng 		.int_msk = BIT(30),
644d3d31324SHongbo Zheng 		.msg = "Tx_UP_mapping_config_mem_ecc_mbit_err",
645a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
646a3e124faSHongbo Zheng 	}, {
647a3e124faSHongbo Zheng 		.int_msk = 0,
648d3d31324SHongbo Zheng 		.msg = NULL,
649a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
650a3e124faSHongbo Zheng 	}
651f53a793bSWei Hu (Xavier) };
652f53a793bSWei Hu (Xavier) 
653f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppp_mpf_abnormal_int_st3[] = {
654a3e124faSHongbo Zheng 	{
655a3e124faSHongbo Zheng 		.int_msk = BIT(0),
656d3d31324SHongbo Zheng 		.msg = "hfs_fifo_mem_ecc_mbit_err",
657a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
658a3e124faSHongbo Zheng 	}, {
659a3e124faSHongbo Zheng 		.int_msk = BIT(1),
660d3d31324SHongbo Zheng 		.msg = "rslt_descr_fifo_mem_ecc_mbit_err",
661a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
662a3e124faSHongbo Zheng 	}, {
663a3e124faSHongbo Zheng 		.int_msk = BIT(2),
664d3d31324SHongbo Zheng 		.msg = "tx_vlan_tag_mem_ecc_mbit_err",
665a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
666a3e124faSHongbo Zheng 	}, {
667a3e124faSHongbo Zheng 		.int_msk = BIT(3),
668d3d31324SHongbo Zheng 		.msg = "FD_CN0_memory_ecc_mbit_err",
669a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
670a3e124faSHongbo Zheng 	}, {
671a3e124faSHongbo Zheng 		.int_msk = BIT(4),
672d3d31324SHongbo Zheng 		.msg = "FD_CN1_memory_ecc_mbit_err",
673a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
674a3e124faSHongbo Zheng 	}, {
675a3e124faSHongbo Zheng 		.int_msk = BIT(5),
676d3d31324SHongbo Zheng 		.msg = "GRO_AD_memory_ecc_mbit_err",
677a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
678a3e124faSHongbo Zheng 	}, {
679a3e124faSHongbo Zheng 		.int_msk = 0,
680d3d31324SHongbo Zheng 		.msg = NULL,
681a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
682a3e124faSHongbo Zheng 	}
683f53a793bSWei Hu (Xavier) };
684f53a793bSWei Hu (Xavier) 
685f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st3[] = {
686a3e124faSHongbo Zheng 	{
687a3e124faSHongbo Zheng 		.int_msk = BIT(4),
688d3d31324SHongbo Zheng 		.msg = "gro_bd_ecc_mbit_err",
689a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
690a3e124faSHongbo Zheng 	}, {
691a3e124faSHongbo Zheng 		.int_msk = BIT(5),
692d3d31324SHongbo Zheng 		.msg = "gro_context_ecc_mbit_err",
693a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
694a3e124faSHongbo Zheng 	}, {
695a3e124faSHongbo Zheng 		.int_msk = BIT(6),
696d3d31324SHongbo Zheng 		.msg = "rx_stash_cfg_ecc_mbit_err",
697a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
698a3e124faSHongbo Zheng 	}, {
699a3e124faSHongbo Zheng 		.int_msk = BIT(7),
700d3d31324SHongbo Zheng 		.msg = "axi_rd_fbd_ecc_mbit_err",
701a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
702a3e124faSHongbo Zheng 	}, {
703a3e124faSHongbo Zheng 		.int_msk = 0,
704d3d31324SHongbo Zheng 		.msg = NULL,
705a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
706a3e124faSHongbo Zheng 	}
707f53a793bSWei Hu (Xavier) };
708f53a793bSWei Hu (Xavier) 
709f53a793bSWei Hu (Xavier) static const struct hns3_hw_error tm_sch_int[] = {
710a3e124faSHongbo Zheng 	{
711a3e124faSHongbo Zheng 		.int_msk = BIT(1),
712d3d31324SHongbo Zheng 		.msg = "tm_sch_ecc_mbit_err",
713a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
714a3e124faSHongbo Zheng 	}, {
715a3e124faSHongbo Zheng 		.int_msk = BIT(2),
716d3d31324SHongbo Zheng 		.msg = "tm_sch_port_shap_sub_fifo_wr_err",
717a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
718a3e124faSHongbo Zheng 	}, {
719a3e124faSHongbo Zheng 		.int_msk = BIT(3),
720d3d31324SHongbo Zheng 		.msg = "tm_sch_port_shap_sub_fifo_rd_err",
721a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
722a3e124faSHongbo Zheng 	}, {
723a3e124faSHongbo Zheng 		.int_msk = BIT(4),
724d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_pshap_sub_fifo_wr_err",
725a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
726a3e124faSHongbo Zheng 	}, {
727a3e124faSHongbo Zheng 		.int_msk = BIT(5),
728d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_pshap_sub_fifo_rd_err",
729a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
730a3e124faSHongbo Zheng 	}, {
731a3e124faSHongbo Zheng 		.int_msk = BIT(6),
732d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_cshap_sub_fifo_wr_err",
733a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
734a3e124faSHongbo Zheng 	}, {
735a3e124faSHongbo Zheng 		.int_msk = BIT(7),
736d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_cshap_sub_fifo_rd_err",
737a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
738a3e124faSHongbo Zheng 	}, {
739a3e124faSHongbo Zheng 		.int_msk = BIT(8),
740d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_pshap_sub_fifo_wr_err",
741a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
742a3e124faSHongbo Zheng 	}, {
743a3e124faSHongbo Zheng 		.int_msk = BIT(9),
744d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_pshap_sub_fifo_rd_err",
745a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
746a3e124faSHongbo Zheng 	}, {
747a3e124faSHongbo Zheng 		.int_msk = BIT(10),
748d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_cshap_sub_fifo_wr_err",
749a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
750a3e124faSHongbo Zheng 	}, {
751a3e124faSHongbo Zheng 		.int_msk = BIT(11),
752d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_cshap_sub_fifo_rd_err",
753a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
754a3e124faSHongbo Zheng 	}, {
755a3e124faSHongbo Zheng 		.int_msk = BIT(12),
756d3d31324SHongbo Zheng 		.msg = "tm_sch_port_shap_offset_fifo_wr_err",
757a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
758a3e124faSHongbo Zheng 	}, {
759a3e124faSHongbo Zheng 		.int_msk = BIT(13),
760d3d31324SHongbo Zheng 		.msg = "tm_sch_port_shap_offset_fifo_rd_err",
761a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
762a3e124faSHongbo Zheng 	}, {
763a3e124faSHongbo Zheng 		.int_msk = BIT(14),
764d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_pshap_offset_fifo_wr_err",
765a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
766a3e124faSHongbo Zheng 	}, {
767a3e124faSHongbo Zheng 		.int_msk = BIT(15),
768d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_pshap_offset_fifo_rd_err",
769a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
770a3e124faSHongbo Zheng 	}, {
771a3e124faSHongbo Zheng 		.int_msk = BIT(16),
772d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_cshap_offset_fifo_wr_err",
773a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
774a3e124faSHongbo Zheng 	}, {
775a3e124faSHongbo Zheng 		.int_msk = BIT(17),
776d3d31324SHongbo Zheng 		.msg = "tm_sch_pg_cshap_offset_fifo_rd_err",
777a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
778a3e124faSHongbo Zheng 	}, {
779a3e124faSHongbo Zheng 		.int_msk = BIT(18),
780d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_pshap_offset_fifo_wr_err",
781a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
782a3e124faSHongbo Zheng 	}, {
783a3e124faSHongbo Zheng 		.int_msk = BIT(19),
784d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_pshap_offset_fifo_rd_err",
785a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
786a3e124faSHongbo Zheng 	}, {
787a3e124faSHongbo Zheng 		.int_msk = BIT(20),
788d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_cshap_offset_fifo_wr_err",
789a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
790a3e124faSHongbo Zheng 	}, {
791a3e124faSHongbo Zheng 		.int_msk = BIT(21),
792d3d31324SHongbo Zheng 		.msg = "tm_sch_pri_cshap_offset_fifo_rd_err",
793a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
794a3e124faSHongbo Zheng 	}, {
795a3e124faSHongbo Zheng 		.int_msk = BIT(22),
796d3d31324SHongbo Zheng 		.msg = "tm_sch_rq_fifo_wr_err",
797a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
798a3e124faSHongbo Zheng 	}, {
799a3e124faSHongbo Zheng 		.int_msk = BIT(23),
800d3d31324SHongbo Zheng 		.msg = "tm_sch_rq_fifo_rd_err",
801a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
802a3e124faSHongbo Zheng 	}, {
803a3e124faSHongbo Zheng 		.int_msk = BIT(24),
804d3d31324SHongbo Zheng 		.msg = "tm_sch_nq_fifo_wr_err",
805a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
806a3e124faSHongbo Zheng 	}, {
807a3e124faSHongbo Zheng 		.int_msk = BIT(25),
808d3d31324SHongbo Zheng 		.msg = "tm_sch_nq_fifo_rd_err",
809a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
810a3e124faSHongbo Zheng 	}, {
811a3e124faSHongbo Zheng 		.int_msk = BIT(26),
812d3d31324SHongbo Zheng 		.msg = "tm_sch_roce_up_fifo_wr_err",
813a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
814a3e124faSHongbo Zheng 	}, {
815a3e124faSHongbo Zheng 		.int_msk = BIT(27),
816d3d31324SHongbo Zheng 		.msg = "tm_sch_roce_up_fifo_rd_err",
817a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
818a3e124faSHongbo Zheng 	}, {
819a3e124faSHongbo Zheng 		.int_msk = BIT(28),
820d3d31324SHongbo Zheng 		.msg = "tm_sch_rcb_byte_fifo_wr_err",
821a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
822a3e124faSHongbo Zheng 	}, {
823a3e124faSHongbo Zheng 		.int_msk = BIT(29),
824d3d31324SHongbo Zheng 		.msg = "tm_sch_rcb_byte_fifo_rd_err",
825a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
826a3e124faSHongbo Zheng 	}, {
827a3e124faSHongbo Zheng 		.int_msk = BIT(30),
828d3d31324SHongbo Zheng 		.msg = "tm_sch_ssu_byte_fifo_wr_err",
829a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
830a3e124faSHongbo Zheng 	}, {
831a3e124faSHongbo Zheng 		.int_msk = BIT(31),
832d3d31324SHongbo Zheng 		.msg = "tm_sch_ssu_byte_fifo_rd_err",
833a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
834a3e124faSHongbo Zheng 	}, {
835a3e124faSHongbo Zheng 		.int_msk = 0,
836d3d31324SHongbo Zheng 		.msg = NULL,
837a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
838a3e124faSHongbo Zheng 	}
839f53a793bSWei Hu (Xavier) };
840f53a793bSWei Hu (Xavier) 
841f53a793bSWei Hu (Xavier) static const struct hns3_hw_error qcn_fifo_int[] = {
842a3e124faSHongbo Zheng 	{
843a3e124faSHongbo Zheng 		.int_msk = BIT(0),
844d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp0_sch_fifo_rd_err",
845a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
846a3e124faSHongbo Zheng 	}, {
847a3e124faSHongbo Zheng 		.int_msk = BIT(1),
848d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp0_sch_fifo_wr_err",
849a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
850a3e124faSHongbo Zheng 	}, {
851a3e124faSHongbo Zheng 		.int_msk = BIT(2),
852d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp1_sch_fifo_rd_err",
853a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
854a3e124faSHongbo Zheng 	}, {
855a3e124faSHongbo Zheng 		.int_msk = BIT(3),
856d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp1_sch_fifo_wr_err",
857a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
858a3e124faSHongbo Zheng 	}, {
859a3e124faSHongbo Zheng 		.int_msk = BIT(4),
860d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp2_sch_fifo_rd_err",
861a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
862a3e124faSHongbo Zheng 	}, {
863a3e124faSHongbo Zheng 		.int_msk = BIT(5),
864d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp2_sch_fifo_wr_err",
865a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
866a3e124faSHongbo Zheng 	}, {
867a3e124faSHongbo Zheng 		.int_msk = BIT(6),
868d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp3_sch_fifo_rd_err",
869a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
870a3e124faSHongbo Zheng 	}, {
871a3e124faSHongbo Zheng 		.int_msk = BIT(7),
872d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp3_sch_fifo_wr_err",
873a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
874a3e124faSHongbo Zheng 	}, {
875a3e124faSHongbo Zheng 		.int_msk = BIT(8),
876d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp0_offset_fifo_rd_err",
877a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
878a3e124faSHongbo Zheng 	}, {
879a3e124faSHongbo Zheng 		.int_msk = BIT(9),
880d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp0_offset_fifo_wr_err",
881a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
882a3e124faSHongbo Zheng 	}, {
883a3e124faSHongbo Zheng 		.int_msk = BIT(10),
884d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp1_offset_fifo_rd_err",
885a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
886a3e124faSHongbo Zheng 	}, {
887a3e124faSHongbo Zheng 		.int_msk = BIT(11),
888d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp1_offset_fifo_wr_err",
889a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
890a3e124faSHongbo Zheng 	}, {
891a3e124faSHongbo Zheng 		.int_msk = BIT(12),
892d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp2_offset_fifo_rd_err",
893a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
894a3e124faSHongbo Zheng 	}, {
895a3e124faSHongbo Zheng 		.int_msk = BIT(13),
896d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp2_offset_fifo_wr_err",
897a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
898a3e124faSHongbo Zheng 	}, {
899a3e124faSHongbo Zheng 		.int_msk = BIT(14),
900d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp3_offset_fifo_rd_err",
901a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
902a3e124faSHongbo Zheng 	}, {
903a3e124faSHongbo Zheng 		.int_msk = BIT(15),
904d3d31324SHongbo Zheng 		.msg = "qcn_shap_gp3_offset_fifo_wr_err",
905a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
906a3e124faSHongbo Zheng 	}, {
907a3e124faSHongbo Zheng 		.int_msk = BIT(16),
908d3d31324SHongbo Zheng 		.msg = "qcn_byte_info_fifo_rd_err",
909a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
910a3e124faSHongbo Zheng 	}, {
911a3e124faSHongbo Zheng 		.int_msk = BIT(17),
912d3d31324SHongbo Zheng 		.msg = "qcn_byte_info_fifo_wr_err",
913a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
914a3e124faSHongbo Zheng 	}, {
915a3e124faSHongbo Zheng 		.int_msk = 0,
916d3d31324SHongbo Zheng 		.msg = NULL,
917a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
918a3e124faSHongbo Zheng 	}
919f53a793bSWei Hu (Xavier) };
920f53a793bSWei Hu (Xavier) 
921f53a793bSWei Hu (Xavier) static const struct hns3_hw_error qcn_ecc_int[] = {
922a3e124faSHongbo Zheng 	{
923a3e124faSHongbo Zheng 		.int_msk = BIT(1),
924d3d31324SHongbo Zheng 		.msg = "qcn_byte_mem_ecc_mbit_err",
925a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
926a3e124faSHongbo Zheng 	}, {
927a3e124faSHongbo Zheng 		.int_msk = BIT(3),
928d3d31324SHongbo Zheng 		.msg = "qcn_time_mem_ecc_mbit_err",
929a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
930a3e124faSHongbo Zheng 	}, {
931a3e124faSHongbo Zheng 		.int_msk = BIT(5),
932d3d31324SHongbo Zheng 		.msg = "qcn_fb_mem_ecc_mbit_err",
933a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
934a3e124faSHongbo Zheng 	}, {
935a3e124faSHongbo Zheng 		.int_msk = BIT(7),
936d3d31324SHongbo Zheng 		.msg = "qcn_link_mem_ecc_mbit_err",
937a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
938a3e124faSHongbo Zheng 	}, {
939a3e124faSHongbo Zheng 		.int_msk = BIT(9),
940d3d31324SHongbo Zheng 		.msg = "qcn_rate_mem_ecc_mbit_err",
941a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
942a3e124faSHongbo Zheng 	}, {
943a3e124faSHongbo Zheng 		.int_msk = BIT(11),
944d3d31324SHongbo Zheng 		.msg = "qcn_tmplt_mem_ecc_mbit_err",
945a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
946a3e124faSHongbo Zheng 	}, {
947a3e124faSHongbo Zheng 		.int_msk = BIT(13),
948d3d31324SHongbo Zheng 		.msg = "qcn_shap_cfg_mem_ecc_mbit_err",
949a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
950a3e124faSHongbo Zheng 	}, {
951a3e124faSHongbo Zheng 		.int_msk = BIT(15),
952d3d31324SHongbo Zheng 		.msg = "qcn_gp0_barrel_mem_ecc_mbit_err",
953a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
954a3e124faSHongbo Zheng 	}, {
955a3e124faSHongbo Zheng 		.int_msk = BIT(17),
956d3d31324SHongbo Zheng 		.msg = "qcn_gp1_barrel_mem_ecc_mbit_err",
957a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
958a3e124faSHongbo Zheng 	}, {
959a3e124faSHongbo Zheng 		.int_msk = BIT(19),
960d3d31324SHongbo Zheng 		.msg = "qcn_gp2_barrel_mem_ecc_mbit_err",
961a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
962a3e124faSHongbo Zheng 	}, {
963a3e124faSHongbo Zheng 		.int_msk = BIT(21),
964d3d31324SHongbo Zheng 		.msg = "qcn_gp3_barral_mem_ecc_mbit_err",
965a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
966a3e124faSHongbo Zheng 	}, {
967a3e124faSHongbo Zheng 		.int_msk = 0,
968d3d31324SHongbo Zheng 		.msg = NULL,
969a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
970a3e124faSHongbo Zheng 	}
971f53a793bSWei Hu (Xavier) };
972f53a793bSWei Hu (Xavier) 
973f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ncsi_ecc_int[] = {
974a3e124faSHongbo Zheng 	{
975a3e124faSHongbo Zheng 		.int_msk = BIT(1),
976d3d31324SHongbo Zheng 		.msg = "ncsi_tx_ecc_mbit_err",
977a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
978a3e124faSHongbo Zheng 	}, {
979a3e124faSHongbo Zheng 		.int_msk = 0,
980d3d31324SHongbo Zheng 		.msg = NULL,
981a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
982a3e124faSHongbo Zheng 	}
983f53a793bSWei Hu (Xavier) };
984f53a793bSWei Hu (Xavier) 
985f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_fifo_overflow_int[] = {
986a3e124faSHongbo Zheng 	{
987a3e124faSHongbo Zheng 		.int_msk = BIT(0),
988d3d31324SHongbo Zheng 		.msg = "ig_mac_inf_int",
989a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
990a3e124faSHongbo Zheng 	}, {
991a3e124faSHongbo Zheng 		.int_msk = BIT(1),
992d3d31324SHongbo Zheng 		.msg = "ig_host_inf_int",
993a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
994a3e124faSHongbo Zheng 	}, {
995a3e124faSHongbo Zheng 		.int_msk = BIT(2),
996d3d31324SHongbo Zheng 		.msg = "ig_roc_buf_int",
997a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
998a3e124faSHongbo Zheng 	}, {
999a3e124faSHongbo Zheng 		.int_msk = BIT(3),
1000d3d31324SHongbo Zheng 		.msg = "ig_host_data_fifo_int",
1001a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1002a3e124faSHongbo Zheng 	}, {
1003a3e124faSHongbo Zheng 		.int_msk = BIT(4),
1004d3d31324SHongbo Zheng 		.msg = "ig_host_key_fifo_int",
1005a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1006a3e124faSHongbo Zheng 	}, {
1007a3e124faSHongbo Zheng 		.int_msk = BIT(5),
1008d3d31324SHongbo Zheng 		.msg = "tx_qcn_fifo_int",
1009a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1010a3e124faSHongbo Zheng 	}, {
1011a3e124faSHongbo Zheng 		.int_msk = BIT(6),
1012d3d31324SHongbo Zheng 		.msg = "rx_qcn_fifo_int",
1013a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1014a3e124faSHongbo Zheng 	}, {
1015a3e124faSHongbo Zheng 		.int_msk = BIT(7),
1016d3d31324SHongbo Zheng 		.msg = "tx_pf_rd_fifo_int",
1017a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1018a3e124faSHongbo Zheng 	}, {
1019a3e124faSHongbo Zheng 		.int_msk = BIT(8),
1020d3d31324SHongbo Zheng 		.msg = "rx_pf_rd_fifo_int",
1021a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1022a3e124faSHongbo Zheng 	}, {
1023a3e124faSHongbo Zheng 		.int_msk = BIT(9),
1024d3d31324SHongbo Zheng 		.msg = "qm_eof_fifo_int",
1025a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1026a3e124faSHongbo Zheng 	}, {
1027a3e124faSHongbo Zheng 		.int_msk = BIT(10),
1028d3d31324SHongbo Zheng 		.msg = "mb_rlt_fifo_int",
1029a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1030a3e124faSHongbo Zheng 	}, {
1031a3e124faSHongbo Zheng 		.int_msk = BIT(11),
1032d3d31324SHongbo Zheng 		.msg = "dup_uncopy_fifo_int",
1033a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1034a3e124faSHongbo Zheng 	}, {
1035a3e124faSHongbo Zheng 		.int_msk = BIT(12),
1036d3d31324SHongbo Zheng 		.msg = "dup_cnt_rd_fifo_int",
1037a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1038a3e124faSHongbo Zheng 	}, {
1039a3e124faSHongbo Zheng 		.int_msk = BIT(13),
1040d3d31324SHongbo Zheng 		.msg = "dup_cnt_drop_fifo_int",
1041a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1042a3e124faSHongbo Zheng 	}, {
1043a3e124faSHongbo Zheng 		.int_msk = BIT(14),
1044d3d31324SHongbo Zheng 		.msg = "dup_cnt_wrb_fifo_int",
1045a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1046a3e124faSHongbo Zheng 	}, {
1047a3e124faSHongbo Zheng 		.int_msk = BIT(15),
1048d3d31324SHongbo Zheng 		.msg = "host_cmd_fifo_int",
1049a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1050a3e124faSHongbo Zheng 	}, {
1051a3e124faSHongbo Zheng 		.int_msk = BIT(16),
1052d3d31324SHongbo Zheng 		.msg = "mac_cmd_fifo_int",
1053a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1054a3e124faSHongbo Zheng 	}, {
1055a3e124faSHongbo Zheng 		.int_msk = BIT(17),
1056d3d31324SHongbo Zheng 		.msg = "host_cmd_bitmap_empty_int",
1057a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1058a3e124faSHongbo Zheng 	}, {
1059a3e124faSHongbo Zheng 		.int_msk = BIT(18),
1060d3d31324SHongbo Zheng 		.msg = "mac_cmd_bitmap_empty_int",
1061a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1062a3e124faSHongbo Zheng 	}, {
1063a3e124faSHongbo Zheng 		.int_msk = BIT(19),
1064d3d31324SHongbo Zheng 		.msg = "dup_bitmap_empty_int",
1065a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1066a3e124faSHongbo Zheng 	}, {
1067a3e124faSHongbo Zheng 		.int_msk = BIT(20),
1068d3d31324SHongbo Zheng 		.msg = "out_queue_bitmap_empty_int",
1069a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1070a3e124faSHongbo Zheng 	}, {
1071a3e124faSHongbo Zheng 		.int_msk = BIT(21),
1072d3d31324SHongbo Zheng 		.msg = "bank2_bitmap_empty_int",
1073a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1074a3e124faSHongbo Zheng 	}, {
1075a3e124faSHongbo Zheng 		.int_msk = BIT(22),
1076d3d31324SHongbo Zheng 		.msg = "bank1_bitmap_empty_int",
1077a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1078a3e124faSHongbo Zheng 	}, {
1079a3e124faSHongbo Zheng 		.int_msk = BIT(23),
1080d3d31324SHongbo Zheng 		.msg = "bank0_bitmap_empty_int",
1081a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1082a3e124faSHongbo Zheng 	}, {
1083a3e124faSHongbo Zheng 		.int_msk = 0,
1084d3d31324SHongbo Zheng 		.msg = NULL,
1085a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
1086a3e124faSHongbo Zheng 	}
1087f53a793bSWei Hu (Xavier) };
1088f53a793bSWei Hu (Xavier) 
1089f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_ets_tcg_int[] = {
1090a3e124faSHongbo Zheng 	{
1091a3e124faSHongbo Zheng 		.int_msk = BIT(0),
1092d3d31324SHongbo Zheng 		.msg = "ets_rd_int_rx_tcg",
1093a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1094a3e124faSHongbo Zheng 	}, {
1095a3e124faSHongbo Zheng 		.int_msk = BIT(1),
1096d3d31324SHongbo Zheng 		.msg = "ets_wr_int_rx_tcg",
1097a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1098a3e124faSHongbo Zheng 	}, {
1099a3e124faSHongbo Zheng 		.int_msk = BIT(2),
1100d3d31324SHongbo Zheng 		.msg = "ets_rd_int_tx_tcg",
1101a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1102a3e124faSHongbo Zheng 	}, {
1103a3e124faSHongbo Zheng 		.int_msk = BIT(3),
1104d3d31324SHongbo Zheng 		.msg = "ets_wr_int_tx_tcg",
1105a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1106a3e124faSHongbo Zheng 	}, {
1107a3e124faSHongbo Zheng 		.int_msk = 0,
1108d3d31324SHongbo Zheng 		.msg = NULL,
1109a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
1110a3e124faSHongbo Zheng 	}
1111f53a793bSWei Hu (Xavier) };
1112f53a793bSWei Hu (Xavier) 
1113f53a793bSWei Hu (Xavier) static const struct hns3_hw_error igu_egu_tnl_int[] = {
1114a3e124faSHongbo Zheng 	{
1115a3e124faSHongbo Zheng 		.int_msk = BIT(0),
1116d3d31324SHongbo Zheng 		.msg = "rx_buf_overflow",
1117a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1118a3e124faSHongbo Zheng 	}, {
1119a3e124faSHongbo Zheng 		.int_msk = BIT(1),
1120d3d31324SHongbo Zheng 		.msg = "rx_stp_fifo_overflow",
1121a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1122a3e124faSHongbo Zheng 	}, {
1123a3e124faSHongbo Zheng 		.int_msk = BIT(2),
1124d3d31324SHongbo Zheng 		.msg = "rx_stp_fifo_underflow",
1125a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1126a3e124faSHongbo Zheng 	}, {
1127a3e124faSHongbo Zheng 		.int_msk = BIT(3),
1128d3d31324SHongbo Zheng 		.msg = "tx_buf_overflow",
1129a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1130a3e124faSHongbo Zheng 	}, {
1131a3e124faSHongbo Zheng 		.int_msk = BIT(4),
1132d3d31324SHongbo Zheng 		.msg = "tx_buf_underrun",
1133a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1134a3e124faSHongbo Zheng 	}, {
1135a3e124faSHongbo Zheng 		.int_msk = BIT(5),
1136d3d31324SHongbo Zheng 		.msg = "rx_stp_buf_overflow",
1137a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1138a3e124faSHongbo Zheng 	}, {
1139a3e124faSHongbo Zheng 		.int_msk = 0,
1140d3d31324SHongbo Zheng 		.msg = NULL,
1141a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
1142a3e124faSHongbo Zheng 	}
1143f53a793bSWei Hu (Xavier) };
1144f53a793bSWei Hu (Xavier) 
1145f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_port_based_err_int[] = {
1146a3e124faSHongbo Zheng 	{
1147a3e124faSHongbo Zheng 		.int_msk = BIT(0),
1148d3d31324SHongbo Zheng 		.msg = "roc_pkt_without_key_port",
1149a3e124faSHongbo Zheng 		.reset_level = HNS3_FUNC_RESET
1150a3e124faSHongbo Zheng 	}, {
1151a3e124faSHongbo Zheng 		.int_msk = BIT(1),
1152d3d31324SHongbo Zheng 		.msg = "tpu_pkt_without_key_port",
1153a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1154a3e124faSHongbo Zheng 	}, {
1155a3e124faSHongbo Zheng 		.int_msk = BIT(2),
1156d3d31324SHongbo Zheng 		.msg = "igu_pkt_without_key_port",
1157a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1158a3e124faSHongbo Zheng 	}, {
1159a3e124faSHongbo Zheng 		.int_msk = BIT(3),
1160d3d31324SHongbo Zheng 		.msg = "roc_eof_mis_match_port",
1161a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1162a3e124faSHongbo Zheng 	}, {
1163a3e124faSHongbo Zheng 		.int_msk = BIT(4),
1164d3d31324SHongbo Zheng 		.msg = "tpu_eof_mis_match_port",
1165a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1166a3e124faSHongbo Zheng 	}, {
1167a3e124faSHongbo Zheng 		.int_msk = BIT(5),
1168d3d31324SHongbo Zheng 		.msg = "igu_eof_mis_match_port",
1169a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1170a3e124faSHongbo Zheng 	}, {
1171a3e124faSHongbo Zheng 		.int_msk = BIT(6),
1172d3d31324SHongbo Zheng 		.msg = "roc_sof_mis_match_port",
1173a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1174a3e124faSHongbo Zheng 	}, {
1175a3e124faSHongbo Zheng 		.int_msk = BIT(7),
1176d3d31324SHongbo Zheng 		.msg = "tpu_sof_mis_match_port",
1177a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1178a3e124faSHongbo Zheng 	}, {
1179a3e124faSHongbo Zheng 		.int_msk = BIT(8),
1180d3d31324SHongbo Zheng 		.msg = "igu_sof_mis_match_port",
1181a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1182a3e124faSHongbo Zheng 	}, {
1183a3e124faSHongbo Zheng 		.int_msk = BIT(11),
1184d3d31324SHongbo Zheng 		.msg = "ets_rd_int_rx_port",
1185a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1186a3e124faSHongbo Zheng 	}, {
1187a3e124faSHongbo Zheng 		.int_msk = BIT(12),
1188d3d31324SHongbo Zheng 		.msg = "ets_wr_int_rx_port",
1189a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1190a3e124faSHongbo Zheng 	}, {
1191a3e124faSHongbo Zheng 		.int_msk = BIT(13),
1192d3d31324SHongbo Zheng 		.msg = "ets_rd_int_tx_port",
1193a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1194a3e124faSHongbo Zheng 	}, {
1195a3e124faSHongbo Zheng 		.int_msk = BIT(14),
1196d3d31324SHongbo Zheng 		.msg = "ets_wr_int_tx_port",
1197a3e124faSHongbo Zheng 		.reset_level = HNS3_GLOBAL_RESET
1198a3e124faSHongbo Zheng 	}, {
1199a3e124faSHongbo Zheng 		.int_msk = 0,
1200d3d31324SHongbo Zheng 		.msg = NULL,
1201a3e124faSHongbo Zheng 		.reset_level = HNS3_NONE_RESET
1202a3e124faSHongbo Zheng 	}
1203f53a793bSWei Hu (Xavier) };
1204f53a793bSWei Hu (Xavier) 
1205f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc mpf_ras_err_tbl[] = {
1206a3e124faSHongbo Zheng 	{
1207a3e124faSHongbo Zheng 		.desc_offset = 0,
1208d3d31324SHongbo Zheng 		.data_offset = 0,
1209f53a793bSWei Hu (Xavier) 		.msg = "IMP_TCM_ECC_INT_STS",
1210a3e124faSHongbo Zheng 		.hw_err = imp_tcm_ecc_int
1211a3e124faSHongbo Zheng 	}, {
1212a3e124faSHongbo Zheng 		.desc_offset = 0,
1213d3d31324SHongbo Zheng 		.data_offset = 1,
1214f53a793bSWei Hu (Xavier) 		.msg = "CMDQ_MEM_ECC_INT_STS",
1215a3e124faSHongbo Zheng 		.hw_err = cmdq_mem_ecc_int
1216a3e124faSHongbo Zheng 	}, {
1217a3e124faSHongbo Zheng 		.desc_offset = 0,
1218d3d31324SHongbo Zheng 		.data_offset = 2,
1219f53a793bSWei Hu (Xavier) 		.msg = "IMP_RD_POISON_INT_STS",
1220a3e124faSHongbo Zheng 		.hw_err = imp_rd_poison_int
1221a3e124faSHongbo Zheng 	}, {
1222a3e124faSHongbo Zheng 		.desc_offset = 0,
1223d3d31324SHongbo Zheng 		.data_offset = 3,
1224f53a793bSWei Hu (Xavier) 		.msg = "TQP_INT_ECC_INT_STS",
1225a3e124faSHongbo Zheng 		.hw_err = tqp_int_ecc_int
1226a3e124faSHongbo Zheng 	}, {
1227a3e124faSHongbo Zheng 		.desc_offset = 0,
1228d3d31324SHongbo Zheng 		.data_offset = 4,
1229f53a793bSWei Hu (Xavier) 		.msg = "MSIX_ECC_INT_STS",
1230a3e124faSHongbo Zheng 		.hw_err = msix_ecc_int
1231a3e124faSHongbo Zheng 	}, {
1232a3e124faSHongbo Zheng 		.desc_offset = 2,
1233d3d31324SHongbo Zheng 		.data_offset = 2,
1234f53a793bSWei Hu (Xavier) 		.msg = "SSU_ECC_MULTI_BIT_INT_0",
1235a3e124faSHongbo Zheng 		.hw_err = ssu_ecc_multi_bit_int_0
1236a3e124faSHongbo Zheng 	}, {
1237a3e124faSHongbo Zheng 		.desc_offset = 2,
1238d3d31324SHongbo Zheng 		.data_offset = 3,
1239f53a793bSWei Hu (Xavier) 		.msg = "SSU_ECC_MULTI_BIT_INT_1",
1240a3e124faSHongbo Zheng 		.hw_err = ssu_ecc_multi_bit_int_1
1241a3e124faSHongbo Zheng 	}, {
1242a3e124faSHongbo Zheng 		.desc_offset = 2,
1243d3d31324SHongbo Zheng 		.data_offset = 4,
1244f53a793bSWei Hu (Xavier) 		.msg = "SSU_COMMON_ERR_INT",
1245a3e124faSHongbo Zheng 		.hw_err = ssu_common_ecc_int
1246a3e124faSHongbo Zheng 	}, {
1247a3e124faSHongbo Zheng 		.desc_offset = 3,
1248d3d31324SHongbo Zheng 		.data_offset = 0,
1249f53a793bSWei Hu (Xavier) 		.msg = "IGU_INT_STS",
1250a3e124faSHongbo Zheng 		.hw_err = igu_int
1251a3e124faSHongbo Zheng 	}, {
1252a3e124faSHongbo Zheng 		.desc_offset = 4,
1253d3d31324SHongbo Zheng 		.data_offset = 1,
1254f53a793bSWei Hu (Xavier) 		.msg = "PPP_MPF_ABNORMAL_INT_ST1",
1255a3e124faSHongbo Zheng 		.hw_err = ppp_mpf_abnormal_int_st1
1256a3e124faSHongbo Zheng 	}, {
1257a3e124faSHongbo Zheng 		.desc_offset = 4,
1258d3d31324SHongbo Zheng 		.data_offset = 3,
1259f53a793bSWei Hu (Xavier) 		.msg = "PPP_MPF_ABNORMAL_INT_ST3",
1260a3e124faSHongbo Zheng 		.hw_err = ppp_mpf_abnormal_int_st3
1261a3e124faSHongbo Zheng 	}, {
1262a3e124faSHongbo Zheng 		.desc_offset = 5,
1263d3d31324SHongbo Zheng 		.data_offset = 1,
1264f53a793bSWei Hu (Xavier) 		.msg = "PPU_MPF_ABNORMAL_INT_ST1",
1265a3e124faSHongbo Zheng 		.hw_err = ppu_mpf_abnormal_int_st1
1266a3e124faSHongbo Zheng 	}, {
1267a3e124faSHongbo Zheng 		.desc_offset = 5,
1268d3d31324SHongbo Zheng 		.data_offset = 2,
1269f53a793bSWei Hu (Xavier) 		.msg = "PPU_MPF_ABNORMAL_INT_ST2_RAS",
1270a3e124faSHongbo Zheng 		.hw_err = ppu_mpf_abnormal_int_st2_ras
1271a3e124faSHongbo Zheng 	}, {
1272a3e124faSHongbo Zheng 		.desc_offset = 5,
1273d3d31324SHongbo Zheng 		.data_offset = 3,
1274f53a793bSWei Hu (Xavier) 		.msg = "PPU_MPF_ABNORMAL_INT_ST3",
1275a3e124faSHongbo Zheng 		.hw_err = ppu_mpf_abnormal_int_st3
1276a3e124faSHongbo Zheng 	}, {
1277a3e124faSHongbo Zheng 		.desc_offset = 6,
1278d3d31324SHongbo Zheng 		.data_offset = 0,
1279f53a793bSWei Hu (Xavier) 		.msg = "TM_SCH_RINT",
1280a3e124faSHongbo Zheng 		.hw_err = tm_sch_int
1281a3e124faSHongbo Zheng 	}, {
1282a3e124faSHongbo Zheng 		.desc_offset = 7,
1283d3d31324SHongbo Zheng 		.data_offset = 0,
1284f53a793bSWei Hu (Xavier) 		.msg = "QCN_FIFO_RINT",
1285a3e124faSHongbo Zheng 		.hw_err = qcn_fifo_int
1286a3e124faSHongbo Zheng 	}, {
1287a3e124faSHongbo Zheng 		.desc_offset = 7,
1288d3d31324SHongbo Zheng 		.data_offset = 1,
1289f53a793bSWei Hu (Xavier) 		.msg = "QCN_ECC_RINT",
1290a3e124faSHongbo Zheng 		.hw_err = qcn_ecc_int
1291a3e124faSHongbo Zheng 	}, {
1292a3e124faSHongbo Zheng 		.desc_offset = 9,
1293d3d31324SHongbo Zheng 		.data_offset = 0,
1294f53a793bSWei Hu (Xavier) 		.msg = "NCSI_ECC_INT_RPT",
1295a3e124faSHongbo Zheng 		.hw_err = ncsi_ecc_int
1296a3e124faSHongbo Zheng 	}, {
1297a3e124faSHongbo Zheng 		.desc_offset = 0,
1298d3d31324SHongbo Zheng 		.data_offset = 0,
1299f53a793bSWei Hu (Xavier) 		.msg = NULL,
1300a3e124faSHongbo Zheng 		.hw_err = NULL
1301a3e124faSHongbo Zheng 	}
1302f53a793bSWei Hu (Xavier) };
1303f53a793bSWei Hu (Xavier) 
1304f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc pf_ras_err_tbl[] = {
1305a3e124faSHongbo Zheng 	{
1306a3e124faSHongbo Zheng 		.desc_offset = 0,
1307d3d31324SHongbo Zheng 		.data_offset = 0,
1308f53a793bSWei Hu (Xavier) 		.msg = "SSU_PORT_BASED_ERR_INT_RAS",
1309a3e124faSHongbo Zheng 		.hw_err = ssu_port_based_err_int
1310a3e124faSHongbo Zheng 	}, {
1311a3e124faSHongbo Zheng 		.desc_offset = 0,
1312d3d31324SHongbo Zheng 		.data_offset = 1,
1313f53a793bSWei Hu (Xavier) 		.msg = "SSU_FIFO_OVERFLOW_INT",
1314a3e124faSHongbo Zheng 		.hw_err = ssu_fifo_overflow_int
1315a3e124faSHongbo Zheng 	}, {
1316a3e124faSHongbo Zheng 		.desc_offset = 0,
1317d3d31324SHongbo Zheng 		.data_offset = 2,
1318f53a793bSWei Hu (Xavier) 		.msg = "SSU_ETS_TCG_INT",
1319a3e124faSHongbo Zheng 		.hw_err = ssu_ets_tcg_int
1320a3e124faSHongbo Zheng 	}, {
1321a3e124faSHongbo Zheng 		.desc_offset = 1,
1322d3d31324SHongbo Zheng 		.data_offset = 0,
1323f53a793bSWei Hu (Xavier) 		.msg = "IGU_EGU_TNL_INT_STS",
1324a3e124faSHongbo Zheng 		.hw_err = igu_egu_tnl_int
1325a3e124faSHongbo Zheng 	}, {
1326a3e124faSHongbo Zheng 		.desc_offset = 3,
1327d3d31324SHongbo Zheng 		.data_offset = 0,
1328f53a793bSWei Hu (Xavier) 		.msg = "PPU_PF_ABNORMAL_INT_ST_RAS",
1329a3e124faSHongbo Zheng 		.hw_err = ppu_pf_abnormal_int_ras
1330a3e124faSHongbo Zheng 	}, {
1331a3e124faSHongbo Zheng 		.desc_offset = 0,
1332d3d31324SHongbo Zheng 		.data_offset = 0,
1333f53a793bSWei Hu (Xavier) 		.msg = NULL,
1334a3e124faSHongbo Zheng 		.hw_err = NULL
1335a3e124faSHongbo Zheng 	}
1336f53a793bSWei Hu (Xavier) };
1337f53a793bSWei Hu (Xavier) 
1338f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc mpf_msix_err_tbl[] = {
1339a3e124faSHongbo Zheng 	{
1340a3e124faSHongbo Zheng 		.desc_offset = 1,
1341d3d31324SHongbo Zheng 		.data_offset = 0,
1342f53a793bSWei Hu (Xavier) 		.msg = "MAC_AFIFO_TNL_INT_R",
1343a3e124faSHongbo Zheng 		.hw_err = mac_afifo_tnl_int
1344a3e124faSHongbo Zheng 	}, {
1345a3e124faSHongbo Zheng 		.desc_offset = 5,
1346d3d31324SHongbo Zheng 		.data_offset = 2,
1347f53a793bSWei Hu (Xavier) 		.msg = "PPU_MPF_ABNORMAL_INT_ST2_MSIX",
1348a3e124faSHongbo Zheng 		.hw_err = ppu_mpf_abnormal_int_st2_msix
1349a3e124faSHongbo Zheng 	}, {
1350a3e124faSHongbo Zheng 		.desc_offset = 0,
1351d3d31324SHongbo Zheng 		.data_offset = 0,
1352f53a793bSWei Hu (Xavier) 		.msg = NULL,
1353a3e124faSHongbo Zheng 		.hw_err = NULL
1354a3e124faSHongbo Zheng 	}
1355f53a793bSWei Hu (Xavier) };
1356f53a793bSWei Hu (Xavier) 
1357f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc pf_msix_err_tbl[] = {
1358a3e124faSHongbo Zheng 	{
1359a3e124faSHongbo Zheng 		.desc_offset = 0,
1360d3d31324SHongbo Zheng 		.data_offset = 0,
1361f53a793bSWei Hu (Xavier) 		.msg = "SSU_PORT_BASED_ERR_INT_MSIX",
1362a3e124faSHongbo Zheng 		.hw_err = ssu_port_based_pf_int
1363a3e124faSHongbo Zheng 	}, {
1364a3e124faSHongbo Zheng 		.desc_offset = 2,
1365d3d31324SHongbo Zheng 		.data_offset = 0,
1366f53a793bSWei Hu (Xavier) 		.msg = "PPP_PF_ABNORMAL_INT_ST0",
1367a3e124faSHongbo Zheng 		.hw_err = ppp_pf_abnormal_int
1368a3e124faSHongbo Zheng 	}, {
1369a3e124faSHongbo Zheng 		.desc_offset = 3,
1370d3d31324SHongbo Zheng 		.data_offset = 0,
1371f53a793bSWei Hu (Xavier) 		.msg = "PPU_PF_ABNORMAL_INT_ST_MSIX",
1372a3e124faSHongbo Zheng 		.hw_err = ppu_pf_abnormal_int_msix
1373a3e124faSHongbo Zheng 	}, {
1374a3e124faSHongbo Zheng 		.desc_offset = 0,
1375d3d31324SHongbo Zheng 		.data_offset = 0,
1376f53a793bSWei Hu (Xavier) 		.msg = NULL,
1377a3e124faSHongbo Zheng 		.hw_err = NULL
1378a3e124faSHongbo Zheng 	}
1379f53a793bSWei Hu (Xavier) };
1380f53a793bSWei Hu (Xavier) 
13811c1eb759SHongbo Zheng enum hns3_hw_err_report_type {
1382f53a793bSWei Hu (Xavier) 	MPF_MSIX_ERR,
1383f53a793bSWei Hu (Xavier) 	PF_MSIX_ERR,
1384f53a793bSWei Hu (Xavier) 	MPF_RAS_ERR,
1385f53a793bSWei Hu (Xavier) 	PF_RAS_ERR,
1386f53a793bSWei Hu (Xavier) };
1387f53a793bSWei Hu (Xavier) 
13881c1eb759SHongbo Zheng static const struct hns3_hw_mod_name hns3_hw_module_name[] = {
13891c1eb759SHongbo Zheng 	{
13901c1eb759SHongbo Zheng 		.module_name = MODULE_NONE,
13911c1eb759SHongbo Zheng 		.msg = "MODULE_NONE"
13921c1eb759SHongbo Zheng 	}, {
13931c1eb759SHongbo Zheng 		.module_name = MODULE_BIOS_COMMON,
13941c1eb759SHongbo Zheng 		.msg = "MODULE_BIOS_COMMON"
13951c1eb759SHongbo Zheng 	}, {
13961c1eb759SHongbo Zheng 		.module_name = MODULE_GE,
13971c1eb759SHongbo Zheng 		.msg = "MODULE_GE"
13981c1eb759SHongbo Zheng 	}, {
13991c1eb759SHongbo Zheng 		.module_name = MODULE_IGU_EGU,
14001c1eb759SHongbo Zheng 		.msg = "MODULE_IGU_EGU"
14011c1eb759SHongbo Zheng 	}, {
14021c1eb759SHongbo Zheng 		.module_name = MODULE_LGE,
14031c1eb759SHongbo Zheng 		.msg = "MODULE_LGE"
14041c1eb759SHongbo Zheng 	}, {
14051c1eb759SHongbo Zheng 		.module_name = MODULE_NCSI,
14061c1eb759SHongbo Zheng 		.msg = "MODULE_NCSI"
14071c1eb759SHongbo Zheng 	}, {
14081c1eb759SHongbo Zheng 		.module_name = MODULE_PPP,
14091c1eb759SHongbo Zheng 		.msg = "MODULE_PPP"
14101c1eb759SHongbo Zheng 	}, {
14111c1eb759SHongbo Zheng 		.module_name = MODULE_QCN,
14121c1eb759SHongbo Zheng 		.msg = "MODULE_QCN"
14131c1eb759SHongbo Zheng 	}, {
14141c1eb759SHongbo Zheng 		.module_name = MODULE_RCB_RX,
14151c1eb759SHongbo Zheng 		.msg = "MODULE_RCB_RX"
14161c1eb759SHongbo Zheng 	}, {
14171c1eb759SHongbo Zheng 		.module_name = MODULE_RTC,
14181c1eb759SHongbo Zheng 		.msg = "MODULE_RTC"
14191c1eb759SHongbo Zheng 	}, {
14201c1eb759SHongbo Zheng 		.module_name = MODULE_SSU,
14211c1eb759SHongbo Zheng 		.msg = "MODULE_SSU"
14221c1eb759SHongbo Zheng 	}, {
14231c1eb759SHongbo Zheng 		.module_name = MODULE_TM,
14241c1eb759SHongbo Zheng 		.msg = "MODULE_TM"
14251c1eb759SHongbo Zheng 	}, {
14261c1eb759SHongbo Zheng 		.module_name = MODULE_RCB_TX,
14271c1eb759SHongbo Zheng 		.msg = "MODULE_RCB_TX"
14281c1eb759SHongbo Zheng 	}, {
14291c1eb759SHongbo Zheng 		.module_name = MODULE_TXDMA,
14301c1eb759SHongbo Zheng 		.msg = "MODULE_TXDMA"
14311c1eb759SHongbo Zheng 	}, {
14321c1eb759SHongbo Zheng 		.module_name = MODULE_MASTER,
14331c1eb759SHongbo Zheng 		.msg = "MODULE_MASTER"
14341c1eb759SHongbo Zheng 	}, {
1435*501a40aeSJie Hai 		.module_name = MODULE_HIMAC,
1436*501a40aeSJie Hai 		.msg = "MODULE_HIMAC"
14371c1eb759SHongbo Zheng 	}
14381c1eb759SHongbo Zheng };
14391c1eb759SHongbo Zheng 
14401c1eb759SHongbo Zheng static const struct hns3_hw_err_type hns3_hw_error_type[] = {
14411c1eb759SHongbo Zheng 	{
14421c1eb759SHongbo Zheng 		.error_type = NONE_ERROR,
14431c1eb759SHongbo Zheng 		.msg = "none_error"
14441c1eb759SHongbo Zheng 	}, {
14451c1eb759SHongbo Zheng 		.error_type = FIFO_ERROR,
14461c1eb759SHongbo Zheng 		.msg = "fifo_error"
14471c1eb759SHongbo Zheng 	}, {
14481c1eb759SHongbo Zheng 		.error_type = MEMORY_ERROR,
14491c1eb759SHongbo Zheng 		.msg = "memory_error"
14501c1eb759SHongbo Zheng 	}, {
14511c1eb759SHongbo Zheng 		.error_type = POISION_ERROR,
14521c1eb759SHongbo Zheng 		.msg = "poision_error"
14531c1eb759SHongbo Zheng 	}, {
14541c1eb759SHongbo Zheng 		.error_type = MSIX_ECC_ERROR,
14551c1eb759SHongbo Zheng 		.msg = "msix_ecc_error"
14561c1eb759SHongbo Zheng 	}, {
14571c1eb759SHongbo Zheng 		.error_type = TQP_INT_ECC_ERROR,
14581c1eb759SHongbo Zheng 		.msg = "tqp_int_ecc_error"
14591c1eb759SHongbo Zheng 	}, {
14601c1eb759SHongbo Zheng 		.error_type = PF_ABNORMAL_INT_ERROR,
14611c1eb759SHongbo Zheng 		.msg = "pf_abnormal_int_error"
14621c1eb759SHongbo Zheng 	}, {
14631c1eb759SHongbo Zheng 		.error_type = MPF_ABNORMAL_INT_ERROR,
14641c1eb759SHongbo Zheng 		.msg = "mpf_abnormal_int_error"
14651c1eb759SHongbo Zheng 	}, {
14661c1eb759SHongbo Zheng 		.error_type = COMMON_ERROR,
14671c1eb759SHongbo Zheng 		.msg = "common_error"
14681c1eb759SHongbo Zheng 	}, {
14691c1eb759SHongbo Zheng 		.error_type = PORT_ERROR,
14701c1eb759SHongbo Zheng 		.msg = "port_error"
14711c1eb759SHongbo Zheng 	}, {
14721c1eb759SHongbo Zheng 		.error_type = ETS_ERROR,
14731c1eb759SHongbo Zheng 		.msg = "ets_error"
14741c1eb759SHongbo Zheng 	}, {
14751c1eb759SHongbo Zheng 		.error_type = NCSI_ERROR,
14761c1eb759SHongbo Zheng 		.msg = "ncsi_error"
14771c1eb759SHongbo Zheng 	}, {
14781c1eb759SHongbo Zheng 		.error_type = GLB_ERROR,
14791c1eb759SHongbo Zheng 		.msg = "glb_error"
14801c1eb759SHongbo Zheng 	}
14811c1eb759SHongbo Zheng };
14821c1eb759SHongbo Zheng 
148353688fc9SChengwen Feng static void
148453688fc9SChengwen Feng hns3_report_reset_begin(struct hns3_hw *hw)
148553688fc9SChengwen Feng {
148653688fc9SChengwen Feng 	struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id];
148753688fc9SChengwen Feng 	rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_ERR_RECOVERING, NULL);
148853688fc9SChengwen Feng }
148953688fc9SChengwen Feng 
149053688fc9SChengwen Feng static void
149153688fc9SChengwen Feng hns3_report_reset_success(struct hns3_hw *hw)
149253688fc9SChengwen Feng {
149353688fc9SChengwen Feng 	struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id];
149453688fc9SChengwen Feng 	rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_RECOVERY_SUCCESS, NULL);
149553688fc9SChengwen Feng }
149653688fc9SChengwen Feng 
149753688fc9SChengwen Feng static void
149853688fc9SChengwen Feng hns3_report_reset_failed(struct hns3_hw *hw)
149953688fc9SChengwen Feng {
150053688fc9SChengwen Feng 	struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id];
150153688fc9SChengwen Feng 	rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_RECOVERY_FAILED, NULL);
150253688fc9SChengwen Feng }
150353688fc9SChengwen Feng 
1504f53a793bSWei Hu (Xavier) static int
1505f53a793bSWei Hu (Xavier) hns3_config_ncsi_hw_err_int(struct hns3_adapter *hns, bool en)
1506f53a793bSWei Hu (Xavier) {
1507f53a793bSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
1508f53a793bSWei Hu (Xavier) 	struct hns3_cmd_desc desc;
1509f53a793bSWei Hu (Xavier) 	int ret;
1510f53a793bSWei Hu (Xavier) 
1511f53a793bSWei Hu (Xavier) 	/* configure NCSI error interrupts */
1512f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_NCSI_INT_EN, false);
1513f53a793bSWei Hu (Xavier) 	if (en)
1514f53a793bSWei Hu (Xavier) 		desc.data[0] = rte_cpu_to_le_32(HNS3_NCSI_ERR_INT_EN);
1515f53a793bSWei Hu (Xavier) 
1516f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
1517f53a793bSWei Hu (Xavier) 	if (ret)
1518f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s NCSI error interrupts, ret = %d",
1519f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1520f53a793bSWei Hu (Xavier) 
1521f53a793bSWei Hu (Xavier) 	return ret;
1522f53a793bSWei Hu (Xavier) }
1523f53a793bSWei Hu (Xavier) 
1524f53a793bSWei Hu (Xavier) static int
1525f53a793bSWei Hu (Xavier) enable_igu_egu_err_intr(struct hns3_adapter *hns, bool en)
1526f53a793bSWei Hu (Xavier) {
1527f53a793bSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
1528f53a793bSWei Hu (Xavier) 	struct hns3_cmd_desc desc;
1529f53a793bSWei Hu (Xavier) 	int ret;
1530f53a793bSWei Hu (Xavier) 
1531f53a793bSWei Hu (Xavier) 	/* configure IGU,EGU error interrupts */
1532f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_IGU_COMMON_INT_EN, false);
1533f53a793bSWei Hu (Xavier) 	if (en)
1534f53a793bSWei Hu (Xavier) 		desc.data[0] = rte_cpu_to_le_32(HNS3_IGU_ERR_INT_ENABLE);
1535f53a793bSWei Hu (Xavier) 	else
1536f53a793bSWei Hu (Xavier) 		desc.data[0] = rte_cpu_to_le_32(HNS3_IGU_ERR_INT_DISABLE);
1537f53a793bSWei Hu (Xavier) 
1538f53a793bSWei Hu (Xavier) 	desc.data[1] = rte_cpu_to_le_32(HNS3_IGU_ERR_INT_EN_MASK);
1539f53a793bSWei Hu (Xavier) 
1540f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
1541f53a793bSWei Hu (Xavier) 	if (ret) {
1542f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s IGU common interrupts, ret = %d",
1543f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1544f53a793bSWei Hu (Xavier) 		return ret;
1545f53a793bSWei Hu (Xavier) 	}
1546f53a793bSWei Hu (Xavier) 
1547f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_IGU_EGU_TNL_INT_EN, false);
1548f53a793bSWei Hu (Xavier) 	if (en)
1549f53a793bSWei Hu (Xavier) 		desc.data[0] = rte_cpu_to_le_32(HNS3_IGU_TNL_ERR_INT_EN);
1550f53a793bSWei Hu (Xavier) 
1551f53a793bSWei Hu (Xavier) 	desc.data[1] = rte_cpu_to_le_32(HNS3_IGU_TNL_ERR_INT_EN_MASK);
1552f53a793bSWei Hu (Xavier) 
1553f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
1554f53a793bSWei Hu (Xavier) 	if (ret) {
1555f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s IGU-EGU TNL interrupts, ret = %d",
1556f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1557f53a793bSWei Hu (Xavier) 		return ret;
1558f53a793bSWei Hu (Xavier) 	}
1559f53a793bSWei Hu (Xavier) 
1560f53a793bSWei Hu (Xavier) 	return hns3_config_ncsi_hw_err_int(hns, en);
1561f53a793bSWei Hu (Xavier) }
1562f53a793bSWei Hu (Xavier) 
15633988ab0eSWei Hu (Xavier) static int
15643988ab0eSWei Hu (Xavier) config_ppp_err_intr(struct hns3_adapter *hns, uint32_t cmd, bool en)
15653988ab0eSWei Hu (Xavier) {
15663988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
15673988ab0eSWei Hu (Xavier) 	struct hns3_cmd_desc desc[2];
15683988ab0eSWei Hu (Xavier) 	int ret;
15693988ab0eSWei Hu (Xavier) 
15703988ab0eSWei Hu (Xavier) 	/* configure PPP error interrupts */
15713988ab0eSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[0], cmd, false);
15723988ab0eSWei Hu (Xavier) 	desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT);
15733988ab0eSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[1], cmd, false);
15743988ab0eSWei Hu (Xavier) 
1575f53a793bSWei Hu (Xavier) 	if (cmd == HNS3_OPC_PPP_CMD0_INT_CMD) {
15763988ab0eSWei Hu (Xavier) 		if (en) {
15773988ab0eSWei Hu (Xavier) 			desc[0].data[0] =
15783988ab0eSWei Hu (Xavier) 				rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT0_EN);
15793988ab0eSWei Hu (Xavier) 			desc[0].data[1] =
15803988ab0eSWei Hu (Xavier) 				rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT1_EN);
15813988ab0eSWei Hu (Xavier) 			desc[0].data[4] =
15823988ab0eSWei Hu (Xavier) 				rte_cpu_to_le_32(HNS3_PPP_PF_ERR_INT_EN);
15833988ab0eSWei Hu (Xavier) 		}
15843988ab0eSWei Hu (Xavier) 
15853988ab0eSWei Hu (Xavier) 		desc[1].data[0] =
15863988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT0_EN_MASK);
15873988ab0eSWei Hu (Xavier) 		desc[1].data[1] =
15883988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT1_EN_MASK);
15893988ab0eSWei Hu (Xavier) 		desc[1].data[2] =
15903988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_PPP_PF_ERR_INT_EN_MASK);
1591f53a793bSWei Hu (Xavier) 	} else if (cmd == HNS3_OPC_PPP_CMD1_INT_CMD) {
15923988ab0eSWei Hu (Xavier) 		if (en) {
15933988ab0eSWei Hu (Xavier) 			desc[0].data[0] =
15943988ab0eSWei Hu (Xavier) 				rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT2_EN);
15953988ab0eSWei Hu (Xavier) 			desc[0].data[1] =
15963988ab0eSWei Hu (Xavier) 				rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT3_EN);
15973988ab0eSWei Hu (Xavier) 		}
15983988ab0eSWei Hu (Xavier) 
15993988ab0eSWei Hu (Xavier) 		desc[1].data[0] =
16003988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT2_EN_MASK);
16013988ab0eSWei Hu (Xavier) 		desc[1].data[1] =
16023988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT3_EN_MASK);
16033988ab0eSWei Hu (Xavier) 	}
16043988ab0eSWei Hu (Xavier) 
16053988ab0eSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc[0], 2);
16063988ab0eSWei Hu (Xavier) 	if (ret)
1607f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s PPP error int, ret = %d",
1608f53a793bSWei Hu (Xavier) 		en ? "enable" : "disable", ret);
16093988ab0eSWei Hu (Xavier) 
16103988ab0eSWei Hu (Xavier) 	return ret;
16113988ab0eSWei Hu (Xavier) }
16123988ab0eSWei Hu (Xavier) 
16133988ab0eSWei Hu (Xavier) static int
16143988ab0eSWei Hu (Xavier) enable_ppp_err_intr(struct hns3_adapter *hns, bool en)
16153988ab0eSWei Hu (Xavier) {
16163988ab0eSWei Hu (Xavier) 	int ret;
16173988ab0eSWei Hu (Xavier) 
1618f53a793bSWei Hu (Xavier) 	ret = config_ppp_err_intr(hns, HNS3_OPC_PPP_CMD0_INT_CMD, en);
16193988ab0eSWei Hu (Xavier) 	if (ret)
16203988ab0eSWei Hu (Xavier) 		return ret;
16213988ab0eSWei Hu (Xavier) 
1622f53a793bSWei Hu (Xavier) 	return config_ppp_err_intr(hns, HNS3_OPC_PPP_CMD1_INT_CMD, en);
16233988ab0eSWei Hu (Xavier) }
16243988ab0eSWei Hu (Xavier) 
16253988ab0eSWei Hu (Xavier) static int
16263988ab0eSWei Hu (Xavier) enable_ssu_err_intr(struct hns3_adapter *hns, bool en)
16273988ab0eSWei Hu (Xavier) {
16283988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
16293988ab0eSWei Hu (Xavier) 	struct hns3_cmd_desc desc[2];
16303988ab0eSWei Hu (Xavier) 	int ret;
16313988ab0eSWei Hu (Xavier) 
16323988ab0eSWei Hu (Xavier) 	/* configure SSU ecc error interrupts */
1633f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[0], HNS3_OPC_SSU_ECC_INT_CMD, false);
16343988ab0eSWei Hu (Xavier) 	desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT);
1635f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[1], HNS3_OPC_SSU_ECC_INT_CMD, false);
16363988ab0eSWei Hu (Xavier) 	if (en) {
16373988ab0eSWei Hu (Xavier) 		desc[0].data[0] =
16383988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_SSU_1BIT_ECC_ERR_INT_EN);
16393988ab0eSWei Hu (Xavier) 		desc[0].data[1] =
16403988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_SSU_MULTI_BIT_ECC_ERR_INT_EN);
16413988ab0eSWei Hu (Xavier) 		desc[0].data[4] =
16423988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_SSU_BIT32_ECC_ERR_INT_EN);
16433988ab0eSWei Hu (Xavier) 	}
16443988ab0eSWei Hu (Xavier) 
16453988ab0eSWei Hu (Xavier) 	desc[1].data[0] = rte_cpu_to_le_32(HNS3_SSU_1BIT_ECC_ERR_INT_EN_MASK);
16463988ab0eSWei Hu (Xavier) 	desc[1].data[1] =
16473988ab0eSWei Hu (Xavier) 		rte_cpu_to_le_32(HNS3_SSU_MULTI_BIT_ECC_ERR_INT_EN_MASK);
16483988ab0eSWei Hu (Xavier) 	desc[1].data[2] = rte_cpu_to_le_32(HNS3_SSU_BIT32_ECC_ERR_INT_EN_MASK);
16493988ab0eSWei Hu (Xavier) 
16503988ab0eSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc[0], 2);
16513988ab0eSWei Hu (Xavier) 	if (ret) {
1652f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s SSU ECC error interrupt, ret = %d",
1653f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
16543988ab0eSWei Hu (Xavier) 		return ret;
16553988ab0eSWei Hu (Xavier) 	}
16563988ab0eSWei Hu (Xavier) 
16573988ab0eSWei Hu (Xavier) 	/* configure SSU common error interrupts */
1658f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[0], HNS3_OPC_SSU_COMMON_INT_CMD, false);
16593988ab0eSWei Hu (Xavier) 	desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT);
1660f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[1], HNS3_OPC_SSU_COMMON_INT_CMD, false);
16613988ab0eSWei Hu (Xavier) 
16623988ab0eSWei Hu (Xavier) 	if (en) {
16633988ab0eSWei Hu (Xavier) 		desc[0].data[0] = rte_cpu_to_le_32(HNS3_SSU_COMMON_INT_EN);
16643988ab0eSWei Hu (Xavier) 		desc[0].data[1] =
16653988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_SSU_PORT_BASED_ERR_INT_EN);
16663988ab0eSWei Hu (Xavier) 		desc[0].data[2] =
16673988ab0eSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_SSU_FIFO_OVERFLOW_ERR_INT_EN);
16683988ab0eSWei Hu (Xavier) 	}
16693988ab0eSWei Hu (Xavier) 
16703988ab0eSWei Hu (Xavier) 	desc[1].data[0] = rte_cpu_to_le_32(HNS3_SSU_COMMON_INT_EN_MASK |
16713988ab0eSWei Hu (Xavier) 					   HNS3_SSU_PORT_BASED_ERR_INT_EN_MASK);
16723988ab0eSWei Hu (Xavier) 	desc[1].data[1] =
16733988ab0eSWei Hu (Xavier) 		rte_cpu_to_le_32(HNS3_SSU_FIFO_OVERFLOW_ERR_INT_EN_MASK);
16743988ab0eSWei Hu (Xavier) 
16753988ab0eSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc[0], 2);
16763988ab0eSWei Hu (Xavier) 	if (ret)
1677f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s SSU COMMON error intr, ret = %d",
1678f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
16793988ab0eSWei Hu (Xavier) 
16803988ab0eSWei Hu (Xavier) 	return ret;
16813988ab0eSWei Hu (Xavier) }
16823988ab0eSWei Hu (Xavier) 
16835f8845f4SHongbo Zheng void
16845f8845f4SHongbo Zheng hns3_config_mac_tnl_int(struct hns3_hw *hw, bool en)
16855f8845f4SHongbo Zheng {
16865f8845f4SHongbo Zheng 	struct hns3_cmd_desc desc;
16875f8845f4SHongbo Zheng 	int ret;
16885f8845f4SHongbo Zheng 
16895f8845f4SHongbo Zheng 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MAC_TNL_INT_EN, false);
16905f8845f4SHongbo Zheng 	if (en)
16915f8845f4SHongbo Zheng 		desc.data[0] = rte_cpu_to_le_32(HNS3_MAC_TNL_INT_EN);
16925f8845f4SHongbo Zheng 	else
16935f8845f4SHongbo Zheng 		desc.data[0] = 0;
16945f8845f4SHongbo Zheng 
16955f8845f4SHongbo Zheng 	desc.data[1] = rte_cpu_to_le_32(HNS3_MAC_TNL_INT_EN_MASK);
16965f8845f4SHongbo Zheng 
16975f8845f4SHongbo Zheng 	ret = hns3_cmd_send(hw, &desc, 1);
16985f8845f4SHongbo Zheng 	if (ret)
16995f8845f4SHongbo Zheng 		hns3_err(hw, "fail to %s mac tnl intr, ret = %d",
17005f8845f4SHongbo Zheng 			 en ? "enable" : "disable", ret);
17015f8845f4SHongbo Zheng }
17025f8845f4SHongbo Zheng 
17033988ab0eSWei Hu (Xavier) static int
17043988ab0eSWei Hu (Xavier) config_ppu_err_intrs(struct hns3_adapter *hns, uint32_t cmd, bool en)
17053988ab0eSWei Hu (Xavier) {
17063988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
17073988ab0eSWei Hu (Xavier) 	struct hns3_cmd_desc desc[2];
17083988ab0eSWei Hu (Xavier) 	int num = 1;
17093988ab0eSWei Hu (Xavier) 
17103988ab0eSWei Hu (Xavier) 	/* configure PPU error interrupts */
17113988ab0eSWei Hu (Xavier) 	switch (cmd) {
1712f53a793bSWei Hu (Xavier) 	case HNS3_OPC_PPU_MPF_ECC_INT_CMD:
17133988ab0eSWei Hu (Xavier) 		hns3_cmd_setup_basic_desc(&desc[0], cmd, false);
17143988ab0eSWei Hu (Xavier) 		desc[0].flag |= HNS3_CMD_FLAG_NEXT;
17153988ab0eSWei Hu (Xavier) 		hns3_cmd_setup_basic_desc(&desc[1], cmd, false);
17163988ab0eSWei Hu (Xavier) 		if (en) {
17173988ab0eSWei Hu (Xavier) 			desc[0].data[0] = HNS3_PPU_MPF_ABNORMAL_INT0_EN;
17183988ab0eSWei Hu (Xavier) 			desc[0].data[1] = HNS3_PPU_MPF_ABNORMAL_INT1_EN;
17193988ab0eSWei Hu (Xavier) 			desc[1].data[3] = HNS3_PPU_MPF_ABNORMAL_INT3_EN;
17203988ab0eSWei Hu (Xavier) 			desc[1].data[4] = HNS3_PPU_MPF_ABNORMAL_INT2_EN;
17213988ab0eSWei Hu (Xavier) 		}
17223988ab0eSWei Hu (Xavier) 
17233988ab0eSWei Hu (Xavier) 		desc[1].data[0] = HNS3_PPU_MPF_ABNORMAL_INT0_EN_MASK;
17243988ab0eSWei Hu (Xavier) 		desc[1].data[1] = HNS3_PPU_MPF_ABNORMAL_INT1_EN_MASK;
17253988ab0eSWei Hu (Xavier) 		desc[1].data[2] = HNS3_PPU_MPF_ABNORMAL_INT2_EN_MASK;
17263988ab0eSWei Hu (Xavier) 		desc[1].data[3] |= HNS3_PPU_MPF_ABNORMAL_INT3_EN_MASK;
17273988ab0eSWei Hu (Xavier) 		num = 2;
17283988ab0eSWei Hu (Xavier) 		break;
1729f53a793bSWei Hu (Xavier) 	case HNS3_OPC_PPU_MPF_OTHER_INT_CMD:
17303988ab0eSWei Hu (Xavier) 		hns3_cmd_setup_basic_desc(&desc[0], cmd, false);
17313988ab0eSWei Hu (Xavier) 		if (en)
17323988ab0eSWei Hu (Xavier) 			desc[0].data[0] = HNS3_PPU_MPF_ABNORMAL_INT2_EN2;
17333988ab0eSWei Hu (Xavier) 
17343988ab0eSWei Hu (Xavier) 		desc[0].data[2] = HNS3_PPU_MPF_ABNORMAL_INT2_EN2_MASK;
17353988ab0eSWei Hu (Xavier) 		break;
1736f53a793bSWei Hu (Xavier) 	case HNS3_OPC_PPU_PF_OTHER_INT_CMD:
17373988ab0eSWei Hu (Xavier) 		hns3_cmd_setup_basic_desc(&desc[0], cmd, false);
17383988ab0eSWei Hu (Xavier) 		if (en)
17393988ab0eSWei Hu (Xavier) 			desc[0].data[0] = HNS3_PPU_PF_ABNORMAL_INT_EN;
17403988ab0eSWei Hu (Xavier) 
17413988ab0eSWei Hu (Xavier) 		desc[0].data[2] = HNS3_PPU_PF_ABNORMAL_INT_EN_MASK;
17423988ab0eSWei Hu (Xavier) 		break;
17433988ab0eSWei Hu (Xavier) 	default:
17443988ab0eSWei Hu (Xavier) 		hns3_err(hw,
17453988ab0eSWei Hu (Xavier) 			 "Invalid cmd(%u) to configure PPU error interrupts.",
17463988ab0eSWei Hu (Xavier) 			 cmd);
17473988ab0eSWei Hu (Xavier) 		return -EINVAL;
17483988ab0eSWei Hu (Xavier) 	}
17493988ab0eSWei Hu (Xavier) 
17503988ab0eSWei Hu (Xavier) 	return hns3_cmd_send(hw, &desc[0], num);
17513988ab0eSWei Hu (Xavier) }
17523988ab0eSWei Hu (Xavier) 
17533988ab0eSWei Hu (Xavier) static int
17543988ab0eSWei Hu (Xavier) enable_ppu_err_intr(struct hns3_adapter *hns, bool en)
17553988ab0eSWei Hu (Xavier) {
17563988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
17573988ab0eSWei Hu (Xavier) 	int ret;
17583988ab0eSWei Hu (Xavier) 
1759f53a793bSWei Hu (Xavier) 	ret = config_ppu_err_intrs(hns, HNS3_OPC_PPU_MPF_ECC_INT_CMD, en);
17603988ab0eSWei Hu (Xavier) 	if (ret) {
1761f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s PPU MPF ECC error intr, ret = %d",
1762f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
17633988ab0eSWei Hu (Xavier) 		return ret;
17643988ab0eSWei Hu (Xavier) 	}
17653988ab0eSWei Hu (Xavier) 
1766f53a793bSWei Hu (Xavier) 	ret = config_ppu_err_intrs(hns, HNS3_OPC_PPU_MPF_OTHER_INT_CMD, en);
17673988ab0eSWei Hu (Xavier) 	if (ret) {
1768f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s PPU MPF other intr, ret = %d",
1769f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
17703988ab0eSWei Hu (Xavier) 		return ret;
17713988ab0eSWei Hu (Xavier) 	}
17723988ab0eSWei Hu (Xavier) 
1773f53a793bSWei Hu (Xavier) 	ret = config_ppu_err_intrs(hns, HNS3_OPC_PPU_PF_OTHER_INT_CMD, en);
17743988ab0eSWei Hu (Xavier) 	if (ret)
1775f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s PPU PF error interrupts, ret = %d",
1776f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1777f53a793bSWei Hu (Xavier) 	return ret;
1778f53a793bSWei Hu (Xavier) }
1779f53a793bSWei Hu (Xavier) 
1780f53a793bSWei Hu (Xavier) static int
1781f53a793bSWei Hu (Xavier) enable_tm_err_intr(struct hns3_adapter *hns, bool en)
1782f53a793bSWei Hu (Xavier) {
1783f53a793bSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
1784f53a793bSWei Hu (Xavier) 	struct hns3_cmd_desc desc;
1785f53a793bSWei Hu (Xavier) 	int ret;
1786f53a793bSWei Hu (Xavier) 
1787f53a793bSWei Hu (Xavier) 	/* configure TM SCH error interrupts */
1788f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_TM_SCH_ECC_INT_EN, false);
1789f53a793bSWei Hu (Xavier) 	if (en)
1790f53a793bSWei Hu (Xavier) 		desc.data[0] = rte_cpu_to_le_32(HNS3_TM_SCH_ECC_ERR_INT_EN);
1791f53a793bSWei Hu (Xavier) 
1792f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
1793f53a793bSWei Hu (Xavier) 	if (ret) {
1794f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s TM SCH interrupts, ret = %d",
1795f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1796f53a793bSWei Hu (Xavier) 		return ret;
1797f53a793bSWei Hu (Xavier) 	}
1798f53a793bSWei Hu (Xavier) 
1799f53a793bSWei Hu (Xavier) 	/* configure TM QCN hw errors */
18003903c053SChengwen Feng 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_TM_QCN_MEM_INT_CFG, false);
1801ffb62592SChengwen Feng 	desc.data[0] = rte_cpu_to_le_32(HNS3_TM_QCN_ERR_INT_TYPE);
1802ffb62592SChengwen Feng 	if (en) {
1803ffb62592SChengwen Feng 		desc.data[0] |= rte_cpu_to_le_32(HNS3_TM_QCN_FIFO_INT_EN);
1804f53a793bSWei Hu (Xavier) 		desc.data[1] = rte_cpu_to_le_32(HNS3_TM_QCN_MEM_ERR_INT_EN);
1805ffb62592SChengwen Feng 	}
1806f53a793bSWei Hu (Xavier) 
1807f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
1808f53a793bSWei Hu (Xavier) 	if (ret)
1809f665790aSDavid Marchand 		hns3_err(hw, "fail to %s TM QCN mem errors, ret = %d",
1810f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1811f53a793bSWei Hu (Xavier) 
1812f53a793bSWei Hu (Xavier) 	return ret;
1813f53a793bSWei Hu (Xavier) }
1814f53a793bSWei Hu (Xavier) 
1815f53a793bSWei Hu (Xavier) static int
1816f53a793bSWei Hu (Xavier) enable_common_err_intr(struct hns3_adapter *hns, bool en)
1817f53a793bSWei Hu (Xavier) {
1818f53a793bSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
1819f53a793bSWei Hu (Xavier) 	struct hns3_cmd_desc desc[2];
1820f53a793bSWei Hu (Xavier) 	int ret;
1821f53a793bSWei Hu (Xavier) 
1822f53a793bSWei Hu (Xavier) 	/* configure common error interrupts */
1823f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[0], HNS3_OPC_COMMON_ECC_INT_CFG, false);
1824f53a793bSWei Hu (Xavier) 	desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT);
1825f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[1], HNS3_OPC_COMMON_ECC_INT_CFG, false);
1826f53a793bSWei Hu (Xavier) 
1827f53a793bSWei Hu (Xavier) 	if (en) {
1828f53a793bSWei Hu (Xavier) 		desc[0].data[0] =
1829f53a793bSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_IMP_TCM_ECC_ERR_INT_EN);
1830f53a793bSWei Hu (Xavier) 		desc[0].data[2] =
1831f53a793bSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_CMDQ_NIC_ECC_ERR_INT_EN);
1832f53a793bSWei Hu (Xavier) 		desc[0].data[3] =
1833f53a793bSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_IMP_RD_POISON_ERR_INT_EN);
1834f53a793bSWei Hu (Xavier) 		desc[0].data[4] =
1835f53a793bSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_TQP_ECC_ERR_INT_EN |
1836f53a793bSWei Hu (Xavier) 					 HNS3_MSIX_SRAM_ECC_ERR_INT_EN);
1837f53a793bSWei Hu (Xavier) 		desc[0].data[5] =
1838f53a793bSWei Hu (Xavier) 			rte_cpu_to_le_32(HNS3_IMP_ITCM4_ECC_ERR_INT_EN);
1839f53a793bSWei Hu (Xavier) 	}
1840f53a793bSWei Hu (Xavier) 
1841f53a793bSWei Hu (Xavier) 	desc[1].data[0] = rte_cpu_to_le_32(HNS3_IMP_TCM_ECC_ERR_INT_EN_MASK);
1842f53a793bSWei Hu (Xavier) 	desc[1].data[2] = rte_cpu_to_le_32(HNS3_CMDQ_NIC_ECC_ERR_INT_EN_MASK);
1843f53a793bSWei Hu (Xavier) 	desc[1].data[3] = rte_cpu_to_le_32(HNS3_IMP_RD_POISON_ERR_INT_EN_MASK);
1844f53a793bSWei Hu (Xavier) 	desc[1].data[4] = rte_cpu_to_le_32(HNS3_TQP_ECC_ERR_INT_EN_MASK |
1845f53a793bSWei Hu (Xavier) 				      HNS3_MSIX_SRAM_ECC_ERR_INT_EN_MASK);
1846f53a793bSWei Hu (Xavier) 	desc[1].data[5] = rte_cpu_to_le_32(HNS3_IMP_ITCM4_ECC_ERR_INT_EN_MASK);
1847f53a793bSWei Hu (Xavier) 
1848f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc[0], RTE_DIM(desc));
1849f53a793bSWei Hu (Xavier) 	if (ret)
1850f665790aSDavid Marchand 		hns3_err(hw, "fail to %s common err interrupts, ret = %d",
1851f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
1852f53a793bSWei Hu (Xavier) 
18533988ab0eSWei Hu (Xavier) 	return ret;
18543988ab0eSWei Hu (Xavier) }
18553988ab0eSWei Hu (Xavier) 
18563988ab0eSWei Hu (Xavier) static int
18573988ab0eSWei Hu (Xavier) enable_mac_err_intr(struct hns3_adapter *hns, bool en)
18583988ab0eSWei Hu (Xavier) {
18593988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
18603988ab0eSWei Hu (Xavier) 	struct hns3_cmd_desc desc;
18613988ab0eSWei Hu (Xavier) 	int ret;
18623988ab0eSWei Hu (Xavier) 
18633988ab0eSWei Hu (Xavier) 	/* configure MAC common error interrupts */
1864f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MAC_COMMON_INT_EN, false);
18653988ab0eSWei Hu (Xavier) 	if (en)
18663988ab0eSWei Hu (Xavier) 		desc.data[0] = rte_cpu_to_le_32(HNS3_MAC_COMMON_ERR_INT_EN);
18673988ab0eSWei Hu (Xavier) 
18683988ab0eSWei Hu (Xavier) 	desc.data[1] = rte_cpu_to_le_32(HNS3_MAC_COMMON_ERR_INT_EN_MASK);
18693988ab0eSWei Hu (Xavier) 
18703988ab0eSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
18713988ab0eSWei Hu (Xavier) 	if (ret)
1872f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to %s MAC COMMON error intr: %d",
1873f53a793bSWei Hu (Xavier) 			 en ? "enable" : "disable", ret);
18743988ab0eSWei Hu (Xavier) 
18753988ab0eSWei Hu (Xavier) 	return ret;
18763988ab0eSWei Hu (Xavier) }
18773988ab0eSWei Hu (Xavier) 
18783988ab0eSWei Hu (Xavier) static const struct hns3_hw_blk hw_blk[] = {
18793988ab0eSWei Hu (Xavier) 	{
1880f53a793bSWei Hu (Xavier) 		.name = "IGU_EGU",
1881f53a793bSWei Hu (Xavier) 		.enable_err_intr = enable_igu_egu_err_intr,
1882f53a793bSWei Hu (Xavier) 	},
1883f53a793bSWei Hu (Xavier) 	{
18843988ab0eSWei Hu (Xavier) 		.name = "PPP",
18853988ab0eSWei Hu (Xavier) 		.enable_err_intr = enable_ppp_err_intr,
18863988ab0eSWei Hu (Xavier) 	},
18873988ab0eSWei Hu (Xavier) 	{
18883988ab0eSWei Hu (Xavier) 		.name = "SSU",
18893988ab0eSWei Hu (Xavier) 		.enable_err_intr = enable_ssu_err_intr,
18903988ab0eSWei Hu (Xavier) 	},
18913988ab0eSWei Hu (Xavier) 	{
18923988ab0eSWei Hu (Xavier) 		.name = "PPU",
18933988ab0eSWei Hu (Xavier) 		.enable_err_intr = enable_ppu_err_intr,
18943988ab0eSWei Hu (Xavier) 	},
18953988ab0eSWei Hu (Xavier) 	{
1896f53a793bSWei Hu (Xavier) 		.name = "TM",
1897f53a793bSWei Hu (Xavier) 		.enable_err_intr = enable_tm_err_intr,
1898f53a793bSWei Hu (Xavier) 	},
1899f53a793bSWei Hu (Xavier) 	{
1900f53a793bSWei Hu (Xavier) 		.name = "COMMON",
1901f53a793bSWei Hu (Xavier) 		.enable_err_intr = enable_common_err_intr,
1902f53a793bSWei Hu (Xavier) 	},
1903f53a793bSWei Hu (Xavier) 	{
19043988ab0eSWei Hu (Xavier) 		.name = "MAC",
19053988ab0eSWei Hu (Xavier) 		.enable_err_intr = enable_mac_err_intr,
19063988ab0eSWei Hu (Xavier) 	},
19073988ab0eSWei Hu (Xavier) 	{
19083988ab0eSWei Hu (Xavier) 		.name = NULL,
19093988ab0eSWei Hu (Xavier) 		.enable_err_intr = NULL,
19103988ab0eSWei Hu (Xavier) 	}
19113988ab0eSWei Hu (Xavier) };
19123988ab0eSWei Hu (Xavier) 
19133988ab0eSWei Hu (Xavier) int
19143988ab0eSWei Hu (Xavier) hns3_enable_hw_error_intr(struct hns3_adapter *hns, bool en)
19153988ab0eSWei Hu (Xavier) {
19163988ab0eSWei Hu (Xavier) 	const struct hns3_hw_blk *module = hw_blk;
19173988ab0eSWei Hu (Xavier) 	int ret = 0;
19183988ab0eSWei Hu (Xavier) 
19193988ab0eSWei Hu (Xavier) 	while (module->enable_err_intr) {
19203988ab0eSWei Hu (Xavier) 		ret = module->enable_err_intr(hns, en);
19213988ab0eSWei Hu (Xavier) 		if (ret)
19223988ab0eSWei Hu (Xavier) 			return ret;
19233988ab0eSWei Hu (Xavier) 
19243988ab0eSWei Hu (Xavier) 		module++;
19253988ab0eSWei Hu (Xavier) 	}
19263988ab0eSWei Hu (Xavier) 
19273988ab0eSWei Hu (Xavier) 	return ret;
19283988ab0eSWei Hu (Xavier) }
19293988ab0eSWei Hu (Xavier) 
19303988ab0eSWei Hu (Xavier) static enum hns3_reset_level
19313988ab0eSWei Hu (Xavier) hns3_find_highest_level(struct hns3_adapter *hns, const char *reg,
19323988ab0eSWei Hu (Xavier) 			const struct hns3_hw_error *err, uint32_t err_sts)
19333988ab0eSWei Hu (Xavier) {
19343988ab0eSWei Hu (Xavier) 	enum hns3_reset_level reset_level = HNS3_FUNC_RESET;
19353988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
19363988ab0eSWei Hu (Xavier) 	bool need_reset = false;
19373988ab0eSWei Hu (Xavier) 
19383988ab0eSWei Hu (Xavier) 	while (err->msg) {
19393988ab0eSWei Hu (Xavier) 		if (err->int_msk & err_sts) {
19403988ab0eSWei Hu (Xavier) 			hns3_warn(hw, "%s %s found [error status=0x%x]",
19413988ab0eSWei Hu (Xavier) 				  reg, err->msg, err_sts);
19423988ab0eSWei Hu (Xavier) 			if (err->reset_level != HNS3_NONE_RESET &&
19433988ab0eSWei Hu (Xavier) 			    err->reset_level >= reset_level) {
19443988ab0eSWei Hu (Xavier) 				reset_level = err->reset_level;
19453988ab0eSWei Hu (Xavier) 				need_reset = true;
19463988ab0eSWei Hu (Xavier) 			}
19473988ab0eSWei Hu (Xavier) 		}
19483988ab0eSWei Hu (Xavier) 		err++;
19493988ab0eSWei Hu (Xavier) 	}
19503988ab0eSWei Hu (Xavier) 	if (need_reset)
19513988ab0eSWei Hu (Xavier) 		return reset_level;
19523988ab0eSWei Hu (Xavier) 	else
19533988ab0eSWei Hu (Xavier) 		return HNS3_NONE_RESET;
19543988ab0eSWei Hu (Xavier) }
19553988ab0eSWei Hu (Xavier) 
19563988ab0eSWei Hu (Xavier) static int
1957f53a793bSWei Hu (Xavier) query_num_bds(struct hns3_hw *hw, bool is_ras, uint32_t *mpf_bd_num,
1958f53a793bSWei Hu (Xavier) 	      uint32_t *pf_bd_num)
19593988ab0eSWei Hu (Xavier) {
1960f53a793bSWei Hu (Xavier) 	uint32_t mpf_min_bd_num, pf_min_bd_num;
1961f53a793bSWei Hu (Xavier) 	uint32_t mpf_bd_num_val, pf_bd_num_val;
1962f53a793bSWei Hu (Xavier) 	enum hns3_opcode_type opcode;
1963f53a793bSWei Hu (Xavier) 	struct hns3_cmd_desc desc;
19643988ab0eSWei Hu (Xavier) 	int ret;
19653988ab0eSWei Hu (Xavier) 
1966f53a793bSWei Hu (Xavier) 	if (is_ras) {
1967f53a793bSWei Hu (Xavier) 		opcode = HNS3_OPC_QUERY_RAS_INT_STS_BD_NUM;
1968f53a793bSWei Hu (Xavier) 		mpf_min_bd_num = HNS3_MPF_RAS_INT_MIN_BD_NUM;
1969f53a793bSWei Hu (Xavier) 		pf_min_bd_num = HNS3_PF_RAS_INT_MIN_BD_NUM;
1970f53a793bSWei Hu (Xavier) 	} else {
1971f53a793bSWei Hu (Xavier) 		opcode = HNS3_OPC_QUERY_MSIX_INT_STS_BD_NUM;
1972f53a793bSWei Hu (Xavier) 		mpf_min_bd_num = HNS3_MPF_MSIX_INT_MIN_BD_NUM;
1973f53a793bSWei Hu (Xavier) 		pf_min_bd_num = HNS3_PF_MSIX_INT_MIN_BD_NUM;
1974f53a793bSWei Hu (Xavier) 	}
19753988ab0eSWei Hu (Xavier) 
1976f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc, opcode, true);
1977f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc, 1);
1978f53a793bSWei Hu (Xavier) 	if (ret) {
1979f53a793bSWei Hu (Xavier) 		hns3_err(hw, "query num bds in msix failed, ret = %d", ret);
19803988ab0eSWei Hu (Xavier) 		return ret;
19813988ab0eSWei Hu (Xavier) 	}
19823988ab0eSWei Hu (Xavier) 
1983f53a793bSWei Hu (Xavier) 	mpf_bd_num_val = rte_le_to_cpu_32(desc.data[0]);
1984f53a793bSWei Hu (Xavier) 	pf_bd_num_val = rte_le_to_cpu_32(desc.data[1]);
1985f53a793bSWei Hu (Xavier) 	if (mpf_bd_num_val < mpf_min_bd_num || pf_bd_num_val < pf_min_bd_num) {
1986f53a793bSWei Hu (Xavier) 		hns3_err(hw, "error bd num: mpf(%u), min_mpf(%u), "
1987f665790aSDavid Marchand 			 "pf(%u), min_pf(%u)", mpf_bd_num_val, mpf_min_bd_num,
1988f53a793bSWei Hu (Xavier) 			 pf_bd_num_val, pf_min_bd_num);
1989f53a793bSWei Hu (Xavier) 		return -EINVAL;
19903988ab0eSWei Hu (Xavier) 	}
19913988ab0eSWei Hu (Xavier) 
1992f53a793bSWei Hu (Xavier) 	*mpf_bd_num = mpf_bd_num_val;
1993f53a793bSWei Hu (Xavier) 	*pf_bd_num = pf_bd_num_val;
19943988ab0eSWei Hu (Xavier) 
1995f53a793bSWei Hu (Xavier) 	return 0;
19963988ab0eSWei Hu (Xavier) }
19973988ab0eSWei Hu (Xavier) 
19983988ab0eSWei Hu (Xavier) void
19993988ab0eSWei Hu (Xavier) hns3_intr_unregister(const struct rte_intr_handle *hdl,
20003988ab0eSWei Hu (Xavier) 		     rte_intr_callback_fn cb_fn, void *cb_arg)
20013988ab0eSWei Hu (Xavier) {
20023988ab0eSWei Hu (Xavier) 	int retry_cnt = 0;
20033988ab0eSWei Hu (Xavier) 	int ret;
20043988ab0eSWei Hu (Xavier) 
20053988ab0eSWei Hu (Xavier) 	do {
20063988ab0eSWei Hu (Xavier) 		ret = rte_intr_callback_unregister(hdl, cb_fn, cb_arg);
20073988ab0eSWei Hu (Xavier) 		if (ret >= 0) {
20083988ab0eSWei Hu (Xavier) 			break;
20093988ab0eSWei Hu (Xavier) 		} else if (ret != -EAGAIN) {
20103988ab0eSWei Hu (Xavier) 			PMD_INIT_LOG(ERR, "Failed to unregister intr: %d", ret);
20113988ab0eSWei Hu (Xavier) 			break;
20123988ab0eSWei Hu (Xavier) 		}
20133988ab0eSWei Hu (Xavier) 		rte_delay_ms(HNS3_INTR_UNREG_FAIL_DELAY_MS);
20143988ab0eSWei Hu (Xavier) 	} while (retry_cnt++ < HNS3_INTR_UNREG_FAIL_RETRY_CNT);
20153988ab0eSWei Hu (Xavier) }
20163988ab0eSWei Hu (Xavier) 
2017f53a793bSWei Hu (Xavier) static uint32_t
2018f53a793bSWei Hu (Xavier) hns3_get_hw_error_status(struct hns3_cmd_desc *desc, uint8_t desc_offset,
2019f53a793bSWei Hu (Xavier) 			 uint8_t data_offset)
2020f53a793bSWei Hu (Xavier) {
2021f53a793bSWei Hu (Xavier) 	uint32_t status;
2022f53a793bSWei Hu (Xavier) 	uint32_t *desc_data;
2023f53a793bSWei Hu (Xavier) 
2024f53a793bSWei Hu (Xavier) 	if (desc_offset == 0)
2025f53a793bSWei Hu (Xavier) 		status = rte_le_to_cpu_32(desc[desc_offset].data[data_offset]);
2026f53a793bSWei Hu (Xavier) 	else {
2027f53a793bSWei Hu (Xavier) 		desc_data = (uint32_t *)&desc[desc_offset];
2028f53a793bSWei Hu (Xavier) 		status = rte_le_to_cpu_32(*(desc_data + data_offset));
2029f53a793bSWei Hu (Xavier) 	}
2030f53a793bSWei Hu (Xavier) 
2031f53a793bSWei Hu (Xavier) 	return status;
2032f53a793bSWei Hu (Xavier) }
2033f53a793bSWei Hu (Xavier) 
2034f53a793bSWei Hu (Xavier) static int
2035f53a793bSWei Hu (Xavier) hns3_handle_hw_error(struct hns3_adapter *hns, struct hns3_cmd_desc *desc,
2036e12a0166STyler Retzlaff 		     int num, RTE_ATOMIC(uint64_t) *levels,
20371c1eb759SHongbo Zheng 		     enum hns3_hw_err_report_type err_type)
2038f53a793bSWei Hu (Xavier) {
2039f53a793bSWei Hu (Xavier) 	const struct hns3_hw_error_desc *err = pf_ras_err_tbl;
2040f53a793bSWei Hu (Xavier) 	enum hns3_opcode_type opcode;
2041f53a793bSWei Hu (Xavier) 	enum hns3_reset_level req_level;
2042f53a793bSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
2043f53a793bSWei Hu (Xavier) 	uint32_t status;
2044f53a793bSWei Hu (Xavier) 	int ret;
2045f53a793bSWei Hu (Xavier) 
2046f53a793bSWei Hu (Xavier) 	switch (err_type) {
2047f53a793bSWei Hu (Xavier) 	case MPF_MSIX_ERR:
2048f53a793bSWei Hu (Xavier) 		err = mpf_msix_err_tbl;
2049f53a793bSWei Hu (Xavier) 		opcode = HNS3_OPC_QUERY_CLEAR_ALL_MPF_MSIX_INT;
2050f53a793bSWei Hu (Xavier) 		break;
2051f53a793bSWei Hu (Xavier) 	case PF_MSIX_ERR:
2052f53a793bSWei Hu (Xavier) 		err = pf_msix_err_tbl;
2053f53a793bSWei Hu (Xavier) 		opcode = HNS3_OPC_QUERY_CLEAR_ALL_PF_MSIX_INT;
2054f53a793bSWei Hu (Xavier) 		break;
2055f53a793bSWei Hu (Xavier) 	case MPF_RAS_ERR:
2056f53a793bSWei Hu (Xavier) 		err = mpf_ras_err_tbl;
2057f53a793bSWei Hu (Xavier) 		opcode = HNS3_OPC_QUERY_CLEAR_MPF_RAS_INT;
2058f53a793bSWei Hu (Xavier) 		break;
2059f53a793bSWei Hu (Xavier) 	case PF_RAS_ERR:
2060f53a793bSWei Hu (Xavier) 		err = pf_ras_err_tbl;
2061f53a793bSWei Hu (Xavier) 		opcode = HNS3_OPC_QUERY_CLEAR_PF_RAS_INT;
2062f53a793bSWei Hu (Xavier) 		break;
2063f53a793bSWei Hu (Xavier) 	default:
2064f665790aSDavid Marchand 		hns3_err(hw, "error hardware err_type = %d", err_type);
2065f53a793bSWei Hu (Xavier) 		return -EINVAL;
2066f53a793bSWei Hu (Xavier) 	}
2067f53a793bSWei Hu (Xavier) 
2068f53a793bSWei Hu (Xavier) 	/* query all hardware errors */
2069f53a793bSWei Hu (Xavier) 	hns3_cmd_setup_basic_desc(&desc[0], opcode, true);
2070f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc[0], num);
2071f53a793bSWei Hu (Xavier) 	if (ret) {
2072f665790aSDavid Marchand 		hns3_err(hw, "query hw err int 0x%x cmd failed, ret = %d",
2073f53a793bSWei Hu (Xavier) 			 opcode, ret);
2074f53a793bSWei Hu (Xavier) 		return ret;
2075f53a793bSWei Hu (Xavier) 	}
2076f53a793bSWei Hu (Xavier) 
2077f53a793bSWei Hu (Xavier) 	/* traverses the error table and process based on the error type */
2078f53a793bSWei Hu (Xavier) 	while (err->msg) {
2079f53a793bSWei Hu (Xavier) 		status = hns3_get_hw_error_status(desc, err->desc_offset,
2080f53a793bSWei Hu (Xavier) 						  err->data_offset);
2081f53a793bSWei Hu (Xavier) 		if (status) {
2082f53a793bSWei Hu (Xavier) 			/*
2083f53a793bSWei Hu (Xavier) 			 * set the reset_level or non_reset flag based on
2084f53a793bSWei Hu (Xavier) 			 * the error type and add error statistics. here just
2085f53a793bSWei Hu (Xavier) 			 * set the flag, the actual reset action is in
2086f53a793bSWei Hu (Xavier) 			 * hns3_msix_process.
2087f53a793bSWei Hu (Xavier) 			 */
2088f53a793bSWei Hu (Xavier) 			req_level = hns3_find_highest_level(hns, err->msg,
2089f53a793bSWei Hu (Xavier) 							    err->hw_err,
2090f53a793bSWei Hu (Xavier) 							    status);
2091f53a793bSWei Hu (Xavier) 			hns3_atomic_set_bit(req_level, levels);
2092f53a793bSWei Hu (Xavier) 		}
2093f53a793bSWei Hu (Xavier) 		err++;
2094f53a793bSWei Hu (Xavier) 	}
2095f53a793bSWei Hu (Xavier) 
2096f53a793bSWei Hu (Xavier) 	/* clear all hardware errors */
2097f53a793bSWei Hu (Xavier) 	hns3_cmd_reuse_desc(&desc[0], false);
2098f53a793bSWei Hu (Xavier) 	ret = hns3_cmd_send(hw, &desc[0], num);
2099f53a793bSWei Hu (Xavier) 	if (ret)
2100f665790aSDavid Marchand 		hns3_err(hw, "clear all hw err int cmd failed, ret = %d",
2101f53a793bSWei Hu (Xavier) 			 ret);
2102f53a793bSWei Hu (Xavier) 
2103f53a793bSWei Hu (Xavier) 	return ret;
2104f53a793bSWei Hu (Xavier) }
2105f53a793bSWei Hu (Xavier) 
21063988ab0eSWei Hu (Xavier) void
2107e12a0166STyler Retzlaff hns3_handle_msix_error(struct hns3_adapter *hns, RTE_ATOMIC(uint64_t) *levels)
21083988ab0eSWei Hu (Xavier) {
21093988ab0eSWei Hu (Xavier) 	uint32_t mpf_bd_num, pf_bd_num, bd_num;
21103988ab0eSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
21113988ab0eSWei Hu (Xavier) 	struct hns3_cmd_desc *desc;
21123988ab0eSWei Hu (Xavier) 	int ret;
21133988ab0eSWei Hu (Xavier) 
21143988ab0eSWei Hu (Xavier) 	/* query the number of bds for the MSIx int status */
2115f53a793bSWei Hu (Xavier) 	ret = query_num_bds(hw, false, &mpf_bd_num, &pf_bd_num);
21163988ab0eSWei Hu (Xavier) 	if (ret) {
2117f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to query msix int status bd num: ret = %d",
2118f53a793bSWei Hu (Xavier) 			 ret);
21193988ab0eSWei Hu (Xavier) 		return;
21203988ab0eSWei Hu (Xavier) 	}
21213988ab0eSWei Hu (Xavier) 
2122f53a793bSWei Hu (Xavier) 	bd_num = RTE_MAX(mpf_bd_num, pf_bd_num);
21233988ab0eSWei Hu (Xavier) 	desc = rte_zmalloc(NULL, bd_num * sizeof(struct hns3_cmd_desc), 0);
21243988ab0eSWei Hu (Xavier) 	if (desc == NULL) {
2125f53a793bSWei Hu (Xavier) 		hns3_err(hw,
2126f53a793bSWei Hu (Xavier) 			 "fail to zmalloc desc for handling msix error, size = %zu",
2127f53a793bSWei Hu (Xavier) 			 bd_num * sizeof(struct hns3_cmd_desc));
21283988ab0eSWei Hu (Xavier) 		return;
21293988ab0eSWei Hu (Xavier) 	}
21303988ab0eSWei Hu (Xavier) 
2131f53a793bSWei Hu (Xavier) 	/* handle all main PF MSIx errors */
2132f53a793bSWei Hu (Xavier) 	ret = hns3_handle_hw_error(hns, desc, mpf_bd_num, levels, MPF_MSIX_ERR);
21333988ab0eSWei Hu (Xavier) 	if (ret) {
2134f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to handle all main pf msix errors, ret = %d",
2135f53a793bSWei Hu (Xavier) 			 ret);
21363988ab0eSWei Hu (Xavier) 		goto out;
21373988ab0eSWei Hu (Xavier) 	}
21383988ab0eSWei Hu (Xavier) 
21393988ab0eSWei Hu (Xavier) 	memset(desc, 0, bd_num * sizeof(struct hns3_cmd_desc));
2140f53a793bSWei Hu (Xavier) 
2141f53a793bSWei Hu (Xavier) 	/* handle all PF MSIx errors */
2142f53a793bSWei Hu (Xavier) 	ret = hns3_handle_hw_error(hns, desc, pf_bd_num, levels, PF_MSIX_ERR);
21433988ab0eSWei Hu (Xavier) 	if (ret) {
2144f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to handle all pf msix errors, ret = %d",
2145f53a793bSWei Hu (Xavier) 			 ret);
21463988ab0eSWei Hu (Xavier) 		goto out;
21473988ab0eSWei Hu (Xavier) 	}
21483988ab0eSWei Hu (Xavier) 
2149f53a793bSWei Hu (Xavier) out:
2150f53a793bSWei Hu (Xavier) 	rte_free(desc);
21513988ab0eSWei Hu (Xavier) }
21523988ab0eSWei Hu (Xavier) 
2153f53a793bSWei Hu (Xavier) void
2154e12a0166STyler Retzlaff hns3_handle_ras_error(struct hns3_adapter *hns, RTE_ATOMIC(uint64_t) *levels)
2155f53a793bSWei Hu (Xavier) {
2156f53a793bSWei Hu (Xavier) 	uint32_t mpf_bd_num, pf_bd_num, bd_num;
2157f53a793bSWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
2158f53a793bSWei Hu (Xavier) 	struct hns3_cmd_desc *desc;
2159f53a793bSWei Hu (Xavier) 	uint32_t status;
2160f53a793bSWei Hu (Xavier) 	int ret;
2161f53a793bSWei Hu (Xavier) 
2162f53a793bSWei Hu (Xavier) 	status = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG);
2163f53a793bSWei Hu (Xavier) 	if ((status & HNS3_RAS_REG_NFE_MASK) == 0)
2164f53a793bSWei Hu (Xavier) 		return;
2165f53a793bSWei Hu (Xavier) 
2166f53a793bSWei Hu (Xavier) 	/* query the number of bds for the RAS int status */
2167f53a793bSWei Hu (Xavier) 	ret = query_num_bds(hw, true, &mpf_bd_num, &pf_bd_num);
2168f53a793bSWei Hu (Xavier) 	if (ret) {
2169f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to query ras int status bd num: ret = %d",
2170f53a793bSWei Hu (Xavier) 			 ret);
2171f53a793bSWei Hu (Xavier) 		return;
21723988ab0eSWei Hu (Xavier) 	}
21733988ab0eSWei Hu (Xavier) 
2174f53a793bSWei Hu (Xavier) 	bd_num = RTE_MAX(mpf_bd_num, pf_bd_num);
2175f53a793bSWei Hu (Xavier) 	desc = rte_zmalloc(NULL, bd_num * sizeof(struct hns3_cmd_desc), 0);
2176f53a793bSWei Hu (Xavier) 	if (desc == NULL) {
2177f53a793bSWei Hu (Xavier) 		hns3_err(hw,
2178f53a793bSWei Hu (Xavier) 			 "fail to zmalloc desc for handing ras error, size = %zu",
2179f53a793bSWei Hu (Xavier) 			 bd_num * sizeof(struct hns3_cmd_desc));
2180f53a793bSWei Hu (Xavier) 		return;
21813988ab0eSWei Hu (Xavier) 	}
21823988ab0eSWei Hu (Xavier) 
2183f53a793bSWei Hu (Xavier) 	/* handle all main PF RAS errors */
2184f53a793bSWei Hu (Xavier) 	ret = hns3_handle_hw_error(hns, desc, mpf_bd_num, levels, MPF_RAS_ERR);
2185f53a793bSWei Hu (Xavier) 	if (ret) {
2186f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to handle all main pf ras errors, ret = %d",
2187f53a793bSWei Hu (Xavier) 			 ret);
2188f53a793bSWei Hu (Xavier) 		goto out;
2189f53a793bSWei Hu (Xavier) 	}
2190f53a793bSWei Hu (Xavier) 
2191f53a793bSWei Hu (Xavier) 	memset(desc, 0, bd_num * sizeof(struct hns3_cmd_desc));
2192f53a793bSWei Hu (Xavier) 
2193f53a793bSWei Hu (Xavier) 	/* handle all PF RAS errors */
2194f53a793bSWei Hu (Xavier) 	ret = hns3_handle_hw_error(hns, desc, pf_bd_num, levels, PF_RAS_ERR);
2195f53a793bSWei Hu (Xavier) 	if (ret) {
2196f53a793bSWei Hu (Xavier) 		hns3_err(hw, "fail to handle all pf ras errors, ret = %d", ret);
2197f53a793bSWei Hu (Xavier) 		goto out;
2198f53a793bSWei Hu (Xavier) 	}
2199f53a793bSWei Hu (Xavier) 
22003988ab0eSWei Hu (Xavier) out:
22013988ab0eSWei Hu (Xavier) 	rte_free(desc);
22023988ab0eSWei Hu (Xavier) }
22032790c646SWei Hu (Xavier) 
22041c1eb759SHongbo Zheng static void
22051c1eb759SHongbo Zheng hns3_handle_type_reg_error_data(struct hns3_hw *hw,
22061c1eb759SHongbo Zheng 				struct hns3_mod_err_info *mod_err_info,
22071c1eb759SHongbo Zheng 				struct hns3_type_reg_err_info *err_info)
22081c1eb759SHongbo Zheng {
22091c1eb759SHongbo Zheng #define HNS3_ERR_TYPE_MASK 0x7F
22101c1eb759SHongbo Zheng #define HNS3_ERR_TYPE_IS_RAS_OFFSET 7
22111c1eb759SHongbo Zheng 
22121c1eb759SHongbo Zheng 	uint8_t mod_id, total_module, type_id, total_type;
22131c1eb759SHongbo Zheng 	uint8_t is_ras;
22141c1eb759SHongbo Zheng 	uint8_t i;
22151c1eb759SHongbo Zheng 
22161c1eb759SHongbo Zheng 	mod_id = mod_err_info->mod_id;
22171c1eb759SHongbo Zheng 	type_id = err_info->type_id & HNS3_ERR_TYPE_MASK;
22181c1eb759SHongbo Zheng 	is_ras = err_info->type_id >> HNS3_ERR_TYPE_IS_RAS_OFFSET;
22191c1eb759SHongbo Zheng 
222077d1f6b1SChengwen Feng 	total_module = RTE_DIM(hns3_hw_module_name);
222177d1f6b1SChengwen Feng 	total_type = RTE_DIM(hns3_hw_error_type);
22221c1eb759SHongbo Zheng 
22231c1eb759SHongbo Zheng 	hns3_err(hw, "total_module:%u, total_type:%u",
22241c1eb759SHongbo Zheng 		 total_module, total_type);
22251c1eb759SHongbo Zheng 
22261c1eb759SHongbo Zheng 	if (mod_id < total_module && type_id < total_type)
22271c1eb759SHongbo Zheng 		hns3_err(hw, "found %s %s, is %s error.",
22281c1eb759SHongbo Zheng 			 hns3_hw_module_name[mod_id].msg,
22291c1eb759SHongbo Zheng 			 hns3_hw_error_type[type_id].msg,
22301c1eb759SHongbo Zheng 			 is_ras ? "ras" : "msix");
22311c1eb759SHongbo Zheng 	else
22321c1eb759SHongbo Zheng 		hns3_err(hw, "unknown module[%u] or type[%u].",
22331c1eb759SHongbo Zheng 			 mod_id, type_id);
22341c1eb759SHongbo Zheng 
22351c1eb759SHongbo Zheng 	hns3_err(hw, "reg_value:");
22361c1eb759SHongbo Zheng 	for (i = 0; i < err_info->reg_num; i++)
22371c1eb759SHongbo Zheng 		hns3_err(hw, "0x%08x", err_info->reg[i]);
22381c1eb759SHongbo Zheng }
22391c1eb759SHongbo Zheng 
22401c1eb759SHongbo Zheng static void
22411c1eb759SHongbo Zheng hns3_handle_module_error_data(struct hns3_hw *hw, uint32_t *buf,
22421c1eb759SHongbo Zheng 			      uint32_t buf_size)
22431c1eb759SHongbo Zheng {
22441c1eb759SHongbo Zheng 	struct hns3_type_reg_err_info *type_reg_err_info;
22451c1eb759SHongbo Zheng 	struct hns3_mod_err_info *mod_err_info;
22461c1eb759SHongbo Zheng 	struct hns3_sum_err_info *sum_err_info;
22471c1eb759SHongbo Zheng 	uint8_t mod_num, reset_type;
22481c1eb759SHongbo Zheng 	uint32_t offset = 0;
22491c1eb759SHongbo Zheng 	uint8_t err_num;
22501c1eb759SHongbo Zheng 	uint8_t i;
22511c1eb759SHongbo Zheng 
22521c1eb759SHongbo Zheng 	sum_err_info = (struct hns3_sum_err_info *)&buf[offset++];
22531c1eb759SHongbo Zheng 	mod_num = sum_err_info->mod_num;
22541c1eb759SHongbo Zheng 	reset_type = sum_err_info->reset_type;
22553db84600SChengwen Feng 
22563db84600SChengwen Feng 	if (reset_type >= HNS3_MAX_RESET) {
22573db84600SChengwen Feng 		hns3_err(hw, "invalid reset type = %u", reset_type);
22583db84600SChengwen Feng 		return;
22593db84600SChengwen Feng 	}
22603db84600SChengwen Feng 
22611c1eb759SHongbo Zheng 	if (reset_type && reset_type != HNS3_NONE_RESET)
22621c1eb759SHongbo Zheng 		hns3_atomic_set_bit(reset_type, &hw->reset.request);
22631c1eb759SHongbo Zheng 
22641c1eb759SHongbo Zheng 	hns3_err(hw, "reset_type = %s, mod_num = %u.",
22651c1eb759SHongbo Zheng 		 reset_string[reset_type], mod_num);
22661c1eb759SHongbo Zheng 
22671c1eb759SHongbo Zheng 	while (mod_num--) {
22681c1eb759SHongbo Zheng 		if (offset >= buf_size) {
22691c1eb759SHongbo Zheng 			hns3_err(hw, "offset(%u) exceeds buf's size(%u).",
22701c1eb759SHongbo Zheng 				 offset, buf_size);
22711c1eb759SHongbo Zheng 			return;
22721c1eb759SHongbo Zheng 		}
22731c1eb759SHongbo Zheng 		mod_err_info = (struct hns3_mod_err_info *)&buf[offset++];
22741c1eb759SHongbo Zheng 		err_num = mod_err_info->err_num;
22751c1eb759SHongbo Zheng 		for (i = 0; i < err_num; i++) {
22761c1eb759SHongbo Zheng 			if (offset >= buf_size) {
22771c1eb759SHongbo Zheng 				hns3_err(hw,
22781c1eb759SHongbo Zheng 					 "offset(%u) exceeds buf size(%u).",
22791c1eb759SHongbo Zheng 					 offset, buf_size);
22801c1eb759SHongbo Zheng 				return;
22811c1eb759SHongbo Zheng 			}
22821c1eb759SHongbo Zheng 
22831c1eb759SHongbo Zheng 			type_reg_err_info = (struct hns3_type_reg_err_info *)
22841c1eb759SHongbo Zheng 					     &buf[offset++];
22851c1eb759SHongbo Zheng 			hns3_handle_type_reg_error_data(hw, mod_err_info,
22861c1eb759SHongbo Zheng 							type_reg_err_info);
22871c1eb759SHongbo Zheng 
22881c1eb759SHongbo Zheng 			offset += type_reg_err_info->reg_num;
22891c1eb759SHongbo Zheng 		}
22901c1eb759SHongbo Zheng 	}
22911c1eb759SHongbo Zheng }
22921c1eb759SHongbo Zheng 
22931c1eb759SHongbo Zheng static int
22941c1eb759SHongbo Zheng hns3_query_all_err_bd_num(struct hns3_hw *hw, uint32_t *bd_num)
22951c1eb759SHongbo Zheng {
22961c1eb759SHongbo Zheng 	struct hns3_cmd_desc desc;
22971c1eb759SHongbo Zheng 	uint32_t bd_num_data;
22981c1eb759SHongbo Zheng 	int ret;
22991c1eb759SHongbo Zheng 
23001c1eb759SHongbo Zheng 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_QUERY_ALL_ERR_BD_NUM, true);
23011c1eb759SHongbo Zheng 	ret = hns3_cmd_send(hw, &desc, 1);
23021c1eb759SHongbo Zheng 	if (ret) {
23031c1eb759SHongbo Zheng 		hns3_err(hw, "failed to query error bd_num, ret = %d.", ret);
23041c1eb759SHongbo Zheng 		return ret;
23051c1eb759SHongbo Zheng 	}
23061c1eb759SHongbo Zheng 
23071c1eb759SHongbo Zheng 	bd_num_data = rte_le_to_cpu_32(desc.data[0]);
23081c1eb759SHongbo Zheng 	*bd_num = bd_num_data;
23091c1eb759SHongbo Zheng 	if (bd_num_data == 0) {
23101c1eb759SHongbo Zheng 		hns3_err(hw, "the value of bd_num is 0!");
23111c1eb759SHongbo Zheng 		return -EINVAL;
23121c1eb759SHongbo Zheng 	}
23131c1eb759SHongbo Zheng 
23141c1eb759SHongbo Zheng 	return 0;
23151c1eb759SHongbo Zheng }
23161c1eb759SHongbo Zheng 
23171c1eb759SHongbo Zheng static int
23181c1eb759SHongbo Zheng hns3_query_all_err_info(struct hns3_hw *hw, struct hns3_cmd_desc *desc,
23191c1eb759SHongbo Zheng 			uint32_t bd_num)
23201c1eb759SHongbo Zheng {
23211c1eb759SHongbo Zheng 	int ret;
23221c1eb759SHongbo Zheng 
23231c1eb759SHongbo Zheng 	hns3_cmd_setup_basic_desc(desc, HNS3_OPC_QUERY_ALL_ERR_INFO, true);
23241c1eb759SHongbo Zheng 	ret = hns3_cmd_send(hw, desc, bd_num);
23251c1eb759SHongbo Zheng 	if (ret) {
23261c1eb759SHongbo Zheng 		hns3_err(hw, "failed to query error info, ret = %d.", ret);
23271c1eb759SHongbo Zheng 		return ret;
23281c1eb759SHongbo Zheng 	}
23291c1eb759SHongbo Zheng 
23301c1eb759SHongbo Zheng 	return ret;
23311c1eb759SHongbo Zheng }
23321c1eb759SHongbo Zheng 
23331c1eb759SHongbo Zheng static void
23341c1eb759SHongbo Zheng hns3_handle_hw_error_v2(struct hns3_hw *hw)
23351c1eb759SHongbo Zheng {
23361c1eb759SHongbo Zheng 	uint32_t bd_num, buf_len, i, buf_size;
23371c1eb759SHongbo Zheng 	struct hns3_cmd_desc *desc;
23381c1eb759SHongbo Zheng 	uint32_t *desc_data;
23391c1eb759SHongbo Zheng 	uint32_t *buf;
23401c1eb759SHongbo Zheng 	int ret;
23411c1eb759SHongbo Zheng 
23421c1eb759SHongbo Zheng 	ret = hns3_query_all_err_bd_num(hw, &bd_num);
23431c1eb759SHongbo Zheng 	if (ret)
23441c1eb759SHongbo Zheng 		goto out;
23451c1eb759SHongbo Zheng 
23461c1eb759SHongbo Zheng 	desc = rte_zmalloc("hns3_ras", bd_num * sizeof(struct hns3_cmd_desc),
23471c1eb759SHongbo Zheng 					   0);
23481c1eb759SHongbo Zheng 	if (desc == NULL) {
23491c1eb759SHongbo Zheng 		hns3_err(hw, "failed to malloc hns3 ras cmd desc.");
23501c1eb759SHongbo Zheng 		goto out;
23511c1eb759SHongbo Zheng 	}
23521c1eb759SHongbo Zheng 
23531c1eb759SHongbo Zheng 	ret = hns3_query_all_err_info(hw, desc, bd_num);
23541c1eb759SHongbo Zheng 	if (ret)
23551c1eb759SHongbo Zheng 		goto err_desc;
23561c1eb759SHongbo Zheng 
23571c1eb759SHongbo Zheng 	buf_len = bd_num * sizeof(struct hns3_cmd_desc) - HNS3_DESC_NO_DATA_LEN;
23581c1eb759SHongbo Zheng 	buf_size = buf_len / HNS3_DESC_DATA_UNIT_SIZE;
23591c1eb759SHongbo Zheng 
23601c1eb759SHongbo Zheng 	desc_data = rte_zmalloc("hns3_ras", buf_len, 0);
23611c1eb759SHongbo Zheng 	if (desc_data == NULL) {
23621c1eb759SHongbo Zheng 		hns3_err(hw, "failed to malloc hns3 ras desc data.");
23631c1eb759SHongbo Zheng 		goto err_desc;
23641c1eb759SHongbo Zheng 	}
23651c1eb759SHongbo Zheng 
23661c1eb759SHongbo Zheng 	buf = rte_zmalloc("hns3_ras", buf_len, 0);
23671c1eb759SHongbo Zheng 	if (buf == NULL) {
23681c1eb759SHongbo Zheng 		hns3_err(hw, "failed to malloc hns3 ras buf data.");
23691c1eb759SHongbo Zheng 		goto err_buf_alloc;
23701c1eb759SHongbo Zheng 	}
23711c1eb759SHongbo Zheng 
23721c1eb759SHongbo Zheng 	memcpy(desc_data, &desc[0].data[0], buf_len);
23731c1eb759SHongbo Zheng 	for (i = 0; i < buf_size; i++)
23741c1eb759SHongbo Zheng 		buf[i] = rte_le_to_cpu_32(desc_data[i]);
23751c1eb759SHongbo Zheng 
23761c1eb759SHongbo Zheng 	hns3_handle_module_error_data(hw, buf, buf_size);
23771c1eb759SHongbo Zheng 	rte_free(buf);
23781c1eb759SHongbo Zheng 
23791c1eb759SHongbo Zheng err_buf_alloc:
23801c1eb759SHongbo Zheng 	rte_free(desc_data);
23811c1eb759SHongbo Zheng err_desc:
23821c1eb759SHongbo Zheng 	rte_free(desc);
23831c1eb759SHongbo Zheng out:
23841c1eb759SHongbo Zheng 	return;
23851c1eb759SHongbo Zheng }
23861c1eb759SHongbo Zheng 
23871c1eb759SHongbo Zheng void
23881c1eb759SHongbo Zheng hns3_handle_error(struct hns3_adapter *hns)
23891c1eb759SHongbo Zheng {
23901c1eb759SHongbo Zheng 	struct hns3_hw *hw = &hns->hw;
23911c1eb759SHongbo Zheng 
2392efcaa81eSChengchang Tang 	if (hns3_dev_get_support(hw, RAS_IMP)) {
23931c1eb759SHongbo Zheng 		hns3_handle_hw_error_v2(hw);
23941c1eb759SHongbo Zheng 		hns3_schedule_reset(hns);
23951c1eb759SHongbo Zheng 	} else {
23961c1eb759SHongbo Zheng 		hns3_handle_msix_error(hns, &hw->reset.request);
23971c1eb759SHongbo Zheng 		hns3_handle_ras_error(hns, &hw->reset.request);
23981c1eb759SHongbo Zheng 		hns3_schedule_reset(hns);
23991c1eb759SHongbo Zheng 	}
24001c1eb759SHongbo Zheng }
24011c1eb759SHongbo Zheng 
24022790c646SWei Hu (Xavier) int
24032790c646SWei Hu (Xavier) hns3_reset_init(struct hns3_hw *hw)
24042790c646SWei Hu (Xavier) {
24052790c646SWei Hu (Xavier) 	rte_spinlock_init(&hw->lock);
24062790c646SWei Hu (Xavier) 	hw->reset.level = HNS3_NONE_RESET;
24072790c646SWei Hu (Xavier) 	hw->reset.stage = RESET_STAGE_NONE;
24082790c646SWei Hu (Xavier) 	hw->reset.request = 0;
24092790c646SWei Hu (Xavier) 	hw->reset.pending = 0;
24101f089a3aSLijun Ou 	hw->reset.resetting = 0;
2411e12a0166STyler Retzlaff 	rte_atomic_store_explicit(&hw->reset.disable_cmd, 0, rte_memory_order_relaxed);
24122790c646SWei Hu (Xavier) 	hw->reset.wait_data = rte_zmalloc("wait_data",
24132790c646SWei Hu (Xavier) 					  sizeof(struct hns3_wait_data), 0);
24142790c646SWei Hu (Xavier) 	if (!hw->reset.wait_data) {
24152790c646SWei Hu (Xavier) 		PMD_INIT_LOG(ERR, "Failed to allocate memory for wait_data");
24162790c646SWei Hu (Xavier) 		return -ENOMEM;
24172790c646SWei Hu (Xavier) 	}
24182790c646SWei Hu (Xavier) 	return 0;
24192790c646SWei Hu (Xavier) }
24202790c646SWei Hu (Xavier) 
24212790c646SWei Hu (Xavier) void
24222790c646SWei Hu (Xavier) hns3_schedule_reset(struct hns3_adapter *hns)
24232790c646SWei Hu (Xavier) {
24242790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
24252790c646SWei Hu (Xavier) 
24262790c646SWei Hu (Xavier) 	/* Reschedule the reset process after successful initialization */
24272790c646SWei Hu (Xavier) 	if (hw->adapter_state == HNS3_NIC_UNINITIALIZED) {
2428e12a0166STyler Retzlaff 		rte_atomic_store_explicit(&hw->reset.schedule, SCHEDULE_PENDING,
2429e12a0166STyler Retzlaff 				 rte_memory_order_relaxed);
24302790c646SWei Hu (Xavier) 		return;
24312790c646SWei Hu (Xavier) 	}
24322790c646SWei Hu (Xavier) 
24332790c646SWei Hu (Xavier) 	if (hw->adapter_state >= HNS3_NIC_CLOSED)
24342790c646SWei Hu (Xavier) 		return;
24352790c646SWei Hu (Xavier) 
24362790c646SWei Hu (Xavier) 	/* Schedule restart alarm if it is not scheduled yet */
2437e12a0166STyler Retzlaff 	if (rte_atomic_load_explicit(&hw->reset.schedule, rte_memory_order_relaxed) ==
2438b5236601SChengchang Tang 			SCHEDULE_REQUESTED)
24392790c646SWei Hu (Xavier) 		return;
2440e12a0166STyler Retzlaff 	if (rte_atomic_load_explicit(&hw->reset.schedule, rte_memory_order_relaxed) ==
2441b5236601SChengchang Tang 			    SCHEDULE_DEFERRED)
24422790c646SWei Hu (Xavier) 		rte_eal_alarm_cancel(hw->reset.ops->reset_service, hns);
2443c48e7437SDengdui Huang 
2444e12a0166STyler Retzlaff 	rte_atomic_store_explicit(&hw->reset.schedule, SCHEDULE_REQUESTED,
2445e12a0166STyler Retzlaff 				 rte_memory_order_relaxed);
24462790c646SWei Hu (Xavier) 
24472790c646SWei Hu (Xavier) 	rte_eal_alarm_set(SWITCH_CONTEXT_US, hw->reset.ops->reset_service, hns);
24482790c646SWei Hu (Xavier) }
24492790c646SWei Hu (Xavier) 
24502790c646SWei Hu (Xavier) void
24512790c646SWei Hu (Xavier) hns3_schedule_delayed_reset(struct hns3_adapter *hns)
24522790c646SWei Hu (Xavier) {
24532790c646SWei Hu (Xavier) #define DEFERRED_SCHED_US (3 * MSEC_PER_SEC * USEC_PER_MSEC)
24542790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
24552790c646SWei Hu (Xavier) 
24562790c646SWei Hu (Xavier) 	/* Do nothing if it is uninited or closed */
24572790c646SWei Hu (Xavier) 	if (hw->adapter_state == HNS3_NIC_UNINITIALIZED ||
24582790c646SWei Hu (Xavier) 	    hw->adapter_state >= HNS3_NIC_CLOSED) {
24592790c646SWei Hu (Xavier) 		return;
24602790c646SWei Hu (Xavier) 	}
24612790c646SWei Hu (Xavier) 
2462e12a0166STyler Retzlaff 	if (rte_atomic_load_explicit(&hw->reset.schedule, rte_memory_order_relaxed) !=
2463b5236601SChengchang Tang 			    SCHEDULE_NONE)
24642790c646SWei Hu (Xavier) 		return;
2465e12a0166STyler Retzlaff 	rte_atomic_store_explicit(&hw->reset.schedule, SCHEDULE_DEFERRED,
2466e12a0166STyler Retzlaff 			 rte_memory_order_relaxed);
24672790c646SWei Hu (Xavier) 	rte_eal_alarm_set(DEFERRED_SCHED_US, hw->reset.ops->reset_service, hns);
24682790c646SWei Hu (Xavier) }
24692790c646SWei Hu (Xavier) 
24702790c646SWei Hu (Xavier) void
24712790c646SWei Hu (Xavier) hns3_wait_callback(void *param)
24722790c646SWei Hu (Xavier) {
24732790c646SWei Hu (Xavier) 	struct hns3_wait_data *data = (struct hns3_wait_data *)param;
24742790c646SWei Hu (Xavier) 	struct hns3_adapter *hns = data->hns;
24752790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
24762790c646SWei Hu (Xavier) 	uint64_t msec;
24772790c646SWei Hu (Xavier) 	bool done;
24782790c646SWei Hu (Xavier) 
24792790c646SWei Hu (Xavier) 	data->count--;
24802790c646SWei Hu (Xavier) 	if (data->check_completion) {
24812790c646SWei Hu (Xavier) 		/*
24822790c646SWei Hu (Xavier) 		 * Check if the current time exceeds the deadline
24832790c646SWei Hu (Xavier) 		 * or a pending reset coming, or reset during close.
24842790c646SWei Hu (Xavier) 		 */
248578dbb6f9SChengwen Feng 		msec = hns3_clock_gettime_ms();
24862790c646SWei Hu (Xavier) 		if (msec > data->end_ms || is_reset_pending(hns) ||
24872790c646SWei Hu (Xavier) 		    hw->adapter_state == HNS3_NIC_CLOSING) {
24882790c646SWei Hu (Xavier) 			done = false;
24892790c646SWei Hu (Xavier) 			data->count = 0;
24902790c646SWei Hu (Xavier) 		} else
24912790c646SWei Hu (Xavier) 			done = data->check_completion(hw);
24922790c646SWei Hu (Xavier) 	} else
24932790c646SWei Hu (Xavier) 		done = true;
24942790c646SWei Hu (Xavier) 
24952790c646SWei Hu (Xavier) 	if (!done && data->count > 0) {
24962790c646SWei Hu (Xavier) 		rte_eal_alarm_set(data->interval, hns3_wait_callback, data);
24972790c646SWei Hu (Xavier) 		return;
24982790c646SWei Hu (Xavier) 	}
24992790c646SWei Hu (Xavier) 	if (done)
25002790c646SWei Hu (Xavier) 		data->result = HNS3_WAIT_SUCCESS;
25012790c646SWei Hu (Xavier) 	else {
25022790c646SWei Hu (Xavier) 		hns3_err(hw, "%s wait timeout at stage %d",
25032790c646SWei Hu (Xavier) 			 reset_string[hw->reset.level], hw->reset.stage);
25042790c646SWei Hu (Xavier) 		data->result = HNS3_WAIT_TIMEOUT;
25052790c646SWei Hu (Xavier) 	}
25062790c646SWei Hu (Xavier) 	hns3_schedule_reset(hns);
25072790c646SWei Hu (Xavier) }
25082790c646SWei Hu (Xavier) 
25092790c646SWei Hu (Xavier) void
25102790c646SWei Hu (Xavier) hns3_notify_reset_ready(struct hns3_hw *hw, bool enable)
25112790c646SWei Hu (Xavier) {
25122790c646SWei Hu (Xavier) 	uint32_t reg_val;
25132790c646SWei Hu (Xavier) 
25142790c646SWei Hu (Xavier) 	reg_val = hns3_read_dev(hw, HNS3_CMDQ_TX_DEPTH_REG);
25152790c646SWei Hu (Xavier) 	if (enable)
25162790c646SWei Hu (Xavier) 		reg_val |= HNS3_NIC_SW_RST_RDY;
25172790c646SWei Hu (Xavier) 	else
25182790c646SWei Hu (Xavier) 		reg_val &= ~HNS3_NIC_SW_RST_RDY;
25192790c646SWei Hu (Xavier) 
25202790c646SWei Hu (Xavier) 	hns3_write_dev(hw, HNS3_CMDQ_TX_DEPTH_REG, reg_val);
25212790c646SWei Hu (Xavier) }
25222790c646SWei Hu (Xavier) 
25232790c646SWei Hu (Xavier) int
25242790c646SWei Hu (Xavier) hns3_reset_req_hw_reset(struct hns3_adapter *hns)
25252790c646SWei Hu (Xavier) {
25262790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
25272790c646SWei Hu (Xavier) 
25282790c646SWei Hu (Xavier) 	if (hw->reset.wait_data->result == HNS3_WAIT_UNKNOWN) {
25292790c646SWei Hu (Xavier) 		hw->reset.wait_data->hns = hns;
25302790c646SWei Hu (Xavier) 		hw->reset.wait_data->check_completion = NULL;
25312790c646SWei Hu (Xavier) 		hw->reset.wait_data->interval = HNS3_RESET_SYNC_US;
25322790c646SWei Hu (Xavier) 		hw->reset.wait_data->count = 1;
25332790c646SWei Hu (Xavier) 		hw->reset.wait_data->result = HNS3_WAIT_REQUEST;
25342790c646SWei Hu (Xavier) 		rte_eal_alarm_set(hw->reset.wait_data->interval,
25352790c646SWei Hu (Xavier) 				  hns3_wait_callback, hw->reset.wait_data);
25362790c646SWei Hu (Xavier) 		return -EAGAIN;
25372790c646SWei Hu (Xavier) 	} else if (hw->reset.wait_data->result == HNS3_WAIT_REQUEST)
25382790c646SWei Hu (Xavier) 		return -EAGAIN;
25392790c646SWei Hu (Xavier) 
25402790c646SWei Hu (Xavier) 	/* inform hardware that preparatory work is done */
25412790c646SWei Hu (Xavier) 	hns3_notify_reset_ready(hw, true);
25422790c646SWei Hu (Xavier) 	return 0;
25432790c646SWei Hu (Xavier) }
25442790c646SWei Hu (Xavier) 
25452790c646SWei Hu (Xavier) static void
2546e12a0166STyler Retzlaff hns3_clear_reset_level(struct hns3_hw *hw, RTE_ATOMIC(uint64_t) *levels)
25472790c646SWei Hu (Xavier) {
25482790c646SWei Hu (Xavier) 	uint64_t merge_cnt = hw->reset.stats.merge_cnt;
254982c2ca6dSMin Hu (Connor) 	uint64_t tmp;
25502790c646SWei Hu (Xavier) 
25512790c646SWei Hu (Xavier) 	switch (hw->reset.level) {
25522790c646SWei Hu (Xavier) 	case HNS3_IMP_RESET:
25532790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_IMP_RESET, levels);
25542790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_GLOBAL_RESET, levels);
255582c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25562790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_FUNC_RESET, levels);
255782c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25582790c646SWei Hu (Xavier) 		break;
25592790c646SWei Hu (Xavier) 	case HNS3_GLOBAL_RESET:
25602790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_GLOBAL_RESET, levels);
25612790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_FUNC_RESET, levels);
256282c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25632790c646SWei Hu (Xavier) 		break;
25642790c646SWei Hu (Xavier) 	case HNS3_FUNC_RESET:
25652790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_FUNC_RESET, levels);
25662790c646SWei Hu (Xavier) 		break;
25672790c646SWei Hu (Xavier) 	case HNS3_VF_RESET:
25682790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_VF_RESET, levels);
25692790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_VF_PF_FUNC_RESET, levels);
257082c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25712790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels);
257282c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25732790c646SWei Hu (Xavier) 		break;
25742790c646SWei Hu (Xavier) 	case HNS3_VF_FULL_RESET:
25752790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_VF_FULL_RESET, levels);
25762790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels);
257782c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25782790c646SWei Hu (Xavier) 		break;
25792790c646SWei Hu (Xavier) 	case HNS3_VF_PF_FUNC_RESET:
25802790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_VF_PF_FUNC_RESET, levels);
25812790c646SWei Hu (Xavier) 		tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels);
258282c2ca6dSMin Hu (Connor) 		merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt;
25832790c646SWei Hu (Xavier) 		break;
25842790c646SWei Hu (Xavier) 	case HNS3_VF_FUNC_RESET:
25852790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_VF_FUNC_RESET, levels);
25862790c646SWei Hu (Xavier) 		break;
25872790c646SWei Hu (Xavier) 	case HNS3_FLR_RESET:
25882790c646SWei Hu (Xavier) 		hns3_atomic_clear_bit(HNS3_FLR_RESET, levels);
25892790c646SWei Hu (Xavier) 		break;
25902790c646SWei Hu (Xavier) 	case HNS3_NONE_RESET:
25912790c646SWei Hu (Xavier) 	default:
25922790c646SWei Hu (Xavier) 		return;
25932790c646SWei Hu (Xavier) 	};
259482c2ca6dSMin Hu (Connor) 
259582c2ca6dSMin Hu (Connor) 	if (merge_cnt != hw->reset.stats.merge_cnt) {
25962790c646SWei Hu (Xavier) 		hns3_warn(hw,
25972790c646SWei Hu (Xavier) 			  "No need to do low-level reset after %s reset. "
2598b80c527aSChengwen Feng 			  "merge cnt: %" PRIu64 " total merge cnt: %" PRIu64,
25992790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level],
26002790c646SWei Hu (Xavier) 			  hw->reset.stats.merge_cnt - merge_cnt,
26012790c646SWei Hu (Xavier) 			  hw->reset.stats.merge_cnt);
260282c2ca6dSMin Hu (Connor) 		hw->reset.stats.merge_cnt = merge_cnt;
260382c2ca6dSMin Hu (Connor) 	}
26042790c646SWei Hu (Xavier) }
26052790c646SWei Hu (Xavier) 
26062790c646SWei Hu (Xavier) static bool
26072790c646SWei Hu (Xavier) hns3_reset_err_handle(struct hns3_adapter *hns)
26082790c646SWei Hu (Xavier) {
2609b25987faSHongbo Zheng #define MAX_RESET_FAIL_CNT 30
26102790c646SWei Hu (Xavier) 
26112790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
26122790c646SWei Hu (Xavier) 
26132790c646SWei Hu (Xavier) 	if (hw->adapter_state == HNS3_NIC_CLOSING)
26142790c646SWei Hu (Xavier) 		goto reset_fail;
26152790c646SWei Hu (Xavier) 
26162790c646SWei Hu (Xavier) 	if (is_reset_pending(hns)) {
26172790c646SWei Hu (Xavier) 		hw->reset.attempts = 0;
26182790c646SWei Hu (Xavier) 		hw->reset.stats.fail_cnt++;
26192790c646SWei Hu (Xavier) 		hns3_warn(hw, "%s reset fail because new Reset is pending "
2620b80c527aSChengwen Feng 			      "attempts:%" PRIu64,
26212790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level],
26222790c646SWei Hu (Xavier) 			  hw->reset.stats.fail_cnt);
26232790c646SWei Hu (Xavier) 		hw->reset.level = HNS3_NONE_RESET;
26242790c646SWei Hu (Xavier) 		return true;
26252790c646SWei Hu (Xavier) 	}
26262790c646SWei Hu (Xavier) 
26272790c646SWei Hu (Xavier) 	hw->reset.attempts++;
26282790c646SWei Hu (Xavier) 	if (hw->reset.attempts < MAX_RESET_FAIL_CNT) {
26292790c646SWei Hu (Xavier) 		hns3_atomic_set_bit(hw->reset.level, &hw->reset.pending);
26302790c646SWei Hu (Xavier) 		hns3_warn(hw, "%s retry to reset attempts: %d",
26312790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level],
26322790c646SWei Hu (Xavier) 			  hw->reset.attempts);
26332790c646SWei Hu (Xavier) 		return true;
26342790c646SWei Hu (Xavier) 	}
26352790c646SWei Hu (Xavier) 
263680cd38e1SHongbo Zheng 	/*
263780cd38e1SHongbo Zheng 	 * Failure to reset does not mean that the network port is
263880cd38e1SHongbo Zheng 	 * completely unavailable, so cmd still needs to be initialized.
263980cd38e1SHongbo Zheng 	 * Regardless of whether the execution is successful or not, the
264080cd38e1SHongbo Zheng 	 * flow after execution must be continued.
264180cd38e1SHongbo Zheng 	 */
2642e12a0166STyler Retzlaff 	if (rte_atomic_load_explicit(&hw->reset.disable_cmd, rte_memory_order_relaxed))
264380cd38e1SHongbo Zheng 		(void)hns3_cmd_init(hw);
26442790c646SWei Hu (Xavier) reset_fail:
26452790c646SWei Hu (Xavier) 	hw->reset.attempts = 0;
26462790c646SWei Hu (Xavier) 	hw->reset.stats.fail_cnt++;
2647b80c527aSChengwen Feng 	hns3_warn(hw, "%s reset fail fail_cnt:%" PRIu64 " success_cnt:%" PRIu64
2648b80c527aSChengwen Feng 		  " global_cnt:%" PRIu64 " imp_cnt:%" PRIu64
2649b80c527aSChengwen Feng 		  " request_cnt:%" PRIu64 " exec_cnt:%" PRIu64
2650b80c527aSChengwen Feng 		  " merge_cnt:%" PRIu64 "adapter_state:%d",
26512790c646SWei Hu (Xavier) 		  reset_string[hw->reset.level], hw->reset.stats.fail_cnt,
26522790c646SWei Hu (Xavier) 		  hw->reset.stats.success_cnt, hw->reset.stats.global_cnt,
26532790c646SWei Hu (Xavier) 		  hw->reset.stats.imp_cnt, hw->reset.stats.request_cnt,
2654cea37e51SChunsong Feng 		  hw->reset.stats.exec_cnt, hw->reset.stats.merge_cnt,
2655cea37e51SChunsong Feng 		  hw->adapter_state);
26562790c646SWei Hu (Xavier) 
26572790c646SWei Hu (Xavier) 	/* IMP no longer waiting the ready flag */
26582790c646SWei Hu (Xavier) 	hns3_notify_reset_ready(hw, true);
26592790c646SWei Hu (Xavier) 	return false;
26602790c646SWei Hu (Xavier) }
26612790c646SWei Hu (Xavier) 
26622790c646SWei Hu (Xavier) static int
26632790c646SWei Hu (Xavier) hns3_reset_pre(struct hns3_adapter *hns)
26642790c646SWei Hu (Xavier) {
26652790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
26662790c646SWei Hu (Xavier) 	struct timeval tv;
26672790c646SWei Hu (Xavier) 	int ret;
26682790c646SWei Hu (Xavier) 
26692790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_NONE) {
2670e12a0166STyler Retzlaff 		rte_atomic_store_explicit(&hns->hw.reset.resetting, 1, rte_memory_order_relaxed);
26712790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_DOWN;
267253688fc9SChengwen Feng 		hns3_report_reset_begin(hw);
26732790c646SWei Hu (Xavier) 		ret = hw->reset.ops->stop_service(hns);
267478dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
26752790c646SWei Hu (Xavier) 		if (ret) {
26762790c646SWei Hu (Xavier) 			hns3_warn(hw, "Reset step1 down fail=%d time=%ld.%.6ld",
26772790c646SWei Hu (Xavier) 				  ret, tv.tv_sec, tv.tv_usec);
26782790c646SWei Hu (Xavier) 			return ret;
26792790c646SWei Hu (Xavier) 		}
26802790c646SWei Hu (Xavier) 		hns3_warn(hw, "Reset step1 down success time=%ld.%.6ld",
26812790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
26822790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_PREWAIT;
26832790c646SWei Hu (Xavier) 	}
26842790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_PREWAIT) {
26852790c646SWei Hu (Xavier) 		ret = hw->reset.ops->prepare_reset(hns);
268678dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
26872790c646SWei Hu (Xavier) 		if (ret) {
26882790c646SWei Hu (Xavier) 			hns3_warn(hw,
26892790c646SWei Hu (Xavier) 				  "Reset step2 prepare wait fail=%d time=%ld.%.6ld",
26902790c646SWei Hu (Xavier) 				  ret, tv.tv_sec, tv.tv_usec);
26912790c646SWei Hu (Xavier) 			return ret;
26922790c646SWei Hu (Xavier) 		}
26932790c646SWei Hu (Xavier) 		hns3_warn(hw, "Reset step2 prepare wait success time=%ld.%.6ld",
26942790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
26952790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_REQ_HW_RESET;
26962790c646SWei Hu (Xavier) 		hw->reset.wait_data->result = HNS3_WAIT_UNKNOWN;
26972790c646SWei Hu (Xavier) 	}
26982790c646SWei Hu (Xavier) 	return 0;
26992790c646SWei Hu (Xavier) }
27002790c646SWei Hu (Xavier) 
27012790c646SWei Hu (Xavier) static int
27022790c646SWei Hu (Xavier) hns3_reset_post(struct hns3_adapter *hns)
27032790c646SWei Hu (Xavier) {
2704b25987faSHongbo Zheng #define TIMEOUT_RETRIES_CNT	30
27052790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
27062790c646SWei Hu (Xavier) 	struct timeval tv_delta;
27072790c646SWei Hu (Xavier) 	struct timeval tv;
27082790c646SWei Hu (Xavier) 	int ret = 0;
27092790c646SWei Hu (Xavier) 
27102790c646SWei Hu (Xavier) 	if (hw->adapter_state == HNS3_NIC_CLOSING) {
27112790c646SWei Hu (Xavier) 		hns3_warn(hw, "Don't do reset_post during closing, just uninit cmd");
27122790c646SWei Hu (Xavier) 		hns3_cmd_uninit(hw);
27132790c646SWei Hu (Xavier) 		return -EPERM;
27142790c646SWei Hu (Xavier) 	}
27152790c646SWei Hu (Xavier) 
27162790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_DEV_INIT) {
27172790c646SWei Hu (Xavier) 		rte_spinlock_lock(&hw->lock);
27182790c646SWei Hu (Xavier) 		if (hw->reset.mbuf_deferred_free) {
27192790c646SWei Hu (Xavier) 			hns3_dev_release_mbufs(hns);
27202790c646SWei Hu (Xavier) 			hw->reset.mbuf_deferred_free = false;
27212790c646SWei Hu (Xavier) 		}
27222790c646SWei Hu (Xavier) 		ret = hw->reset.ops->reinit_dev(hns);
27232790c646SWei Hu (Xavier) 		rte_spinlock_unlock(&hw->lock);
272478dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
27252790c646SWei Hu (Xavier) 		if (ret) {
27262790c646SWei Hu (Xavier) 			hns3_warn(hw, "Reset step5 devinit fail=%d retries=%d",
27272790c646SWei Hu (Xavier) 				  ret, hw->reset.retries);
27282790c646SWei Hu (Xavier) 			goto err;
27292790c646SWei Hu (Xavier) 		}
27302790c646SWei Hu (Xavier) 		hns3_warn(hw, "Reset step5 devinit success time=%ld.%.6ld",
27312790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
27322790c646SWei Hu (Xavier) 		hw->reset.retries = 0;
27332790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_RESTORE;
27342790c646SWei Hu (Xavier) 		rte_eal_alarm_set(SWITCH_CONTEXT_US,
27352790c646SWei Hu (Xavier) 				  hw->reset.ops->reset_service, hns);
27362790c646SWei Hu (Xavier) 		return -EAGAIN;
27372790c646SWei Hu (Xavier) 	}
27382790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_RESTORE) {
27392790c646SWei Hu (Xavier) 		rte_spinlock_lock(&hw->lock);
27402790c646SWei Hu (Xavier) 		ret = hw->reset.ops->restore_conf(hns);
27412790c646SWei Hu (Xavier) 		rte_spinlock_unlock(&hw->lock);
274278dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
27432790c646SWei Hu (Xavier) 		if (ret) {
27442790c646SWei Hu (Xavier) 			hns3_warn(hw,
27452790c646SWei Hu (Xavier) 				  "Reset step6 restore fail=%d retries=%d",
27462790c646SWei Hu (Xavier) 				  ret, hw->reset.retries);
27472790c646SWei Hu (Xavier) 			goto err;
27482790c646SWei Hu (Xavier) 		}
27492790c646SWei Hu (Xavier) 		hns3_warn(hw, "Reset step6 restore success time=%ld.%.6ld",
27502790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
27512790c646SWei Hu (Xavier) 		hw->reset.retries = 0;
27522790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_DONE;
27532790c646SWei Hu (Xavier) 	}
27542790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_DONE) {
27552790c646SWei Hu (Xavier) 		/* IMP will wait ready flag before reset */
27562790c646SWei Hu (Xavier) 		hns3_notify_reset_ready(hw, false);
27572790c646SWei Hu (Xavier) 		hns3_clear_reset_level(hw, &hw->reset.pending);
275894cf4db1SDengdui Huang 		hns3_clear_reset_status(hw);
2759e12a0166STyler Retzlaff 		rte_atomic_store_explicit(&hns->hw.reset.resetting, 0, rte_memory_order_relaxed);
27602790c646SWei Hu (Xavier) 		hw->reset.attempts = 0;
27612790c646SWei Hu (Xavier) 		hw->reset.stats.success_cnt++;
27622790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_NONE;
2763c4ae39b2SChengwen Feng 		rte_spinlock_lock(&hw->lock);
27642790c646SWei Hu (Xavier) 		hw->reset.ops->start_service(hns);
2765c4ae39b2SChengwen Feng 		rte_spinlock_unlock(&hw->lock);
276678dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
27672790c646SWei Hu (Xavier) 		timersub(&tv, &hw->reset.start_time, &tv_delta);
2768b80c527aSChengwen Feng 		hns3_warn(hw, "%s reset done fail_cnt:%" PRIu64
2769b80c527aSChengwen Feng 			  " success_cnt:%" PRIu64 " global_cnt:%" PRIu64
2770b80c527aSChengwen Feng 			  " imp_cnt:%" PRIu64 " request_cnt:%" PRIu64
2771b80c527aSChengwen Feng 			  " exec_cnt:%" PRIu64 " merge_cnt:%" PRIu64,
27722790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level],
27732790c646SWei Hu (Xavier) 			  hw->reset.stats.fail_cnt, hw->reset.stats.success_cnt,
27742790c646SWei Hu (Xavier) 			  hw->reset.stats.global_cnt, hw->reset.stats.imp_cnt,
27752790c646SWei Hu (Xavier) 			  hw->reset.stats.request_cnt, hw->reset.stats.exec_cnt,
27762790c646SWei Hu (Xavier) 			  hw->reset.stats.merge_cnt);
27772790c646SWei Hu (Xavier) 		hns3_warn(hw,
277878dbb6f9SChengwen Feng 			  "%s reset done delta %" PRIu64 " ms time=%ld.%.6ld",
27792790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level],
278078dbb6f9SChengwen Feng 			  hns3_clock_calctime_ms(&tv_delta),
27812790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
27822790c646SWei Hu (Xavier) 		hw->reset.level = HNS3_NONE_RESET;
278353688fc9SChengwen Feng 		hns3_report_reset_success(hw);
27842790c646SWei Hu (Xavier) 	}
27852790c646SWei Hu (Xavier) 	return 0;
27862790c646SWei Hu (Xavier) 
27872790c646SWei Hu (Xavier) err:
27882790c646SWei Hu (Xavier) 	if (ret == -ETIME) {
27892790c646SWei Hu (Xavier) 		hw->reset.retries++;
27902790c646SWei Hu (Xavier) 		if (hw->reset.retries < TIMEOUT_RETRIES_CNT) {
27912790c646SWei Hu (Xavier) 			rte_eal_alarm_set(HNS3_RESET_SYNC_US,
27922790c646SWei Hu (Xavier) 					  hw->reset.ops->reset_service, hns);
27932790c646SWei Hu (Xavier) 			return -EAGAIN;
27942790c646SWei Hu (Xavier) 		}
27952790c646SWei Hu (Xavier) 	}
27962790c646SWei Hu (Xavier) 	hw->reset.retries = 0;
27972790c646SWei Hu (Xavier) 	return -EIO;
27982790c646SWei Hu (Xavier) }
27992790c646SWei Hu (Xavier) 
2800f13c07a5SHuisong Li static void
2801f13c07a5SHuisong Li hns3_reset_fail_handle(struct hns3_adapter *hns)
2802f13c07a5SHuisong Li {
2803f13c07a5SHuisong Li 	struct hns3_hw *hw = &hns->hw;
2804f13c07a5SHuisong Li 	struct timeval tv_delta;
2805f13c07a5SHuisong Li 	struct timeval tv;
2806f13c07a5SHuisong Li 
2807f13c07a5SHuisong Li 	hns3_clear_reset_level(hw, &hw->reset.pending);
280894cf4db1SDengdui Huang 	hns3_clear_reset_status(hw);
2809f13c07a5SHuisong Li 	if (hns3_reset_err_handle(hns)) {
2810f13c07a5SHuisong Li 		hw->reset.stage = RESET_STAGE_PREWAIT;
2811f13c07a5SHuisong Li 		hns3_schedule_reset(hns);
2812f13c07a5SHuisong Li 		return;
2813f13c07a5SHuisong Li 	}
2814f13c07a5SHuisong Li 
2815f13c07a5SHuisong Li 	rte_spinlock_lock(&hw->lock);
2816f13c07a5SHuisong Li 	if (hw->reset.mbuf_deferred_free) {
2817f13c07a5SHuisong Li 		hns3_dev_release_mbufs(hns);
2818f13c07a5SHuisong Li 		hw->reset.mbuf_deferred_free = false;
2819f13c07a5SHuisong Li 	}
2820f13c07a5SHuisong Li 	rte_spinlock_unlock(&hw->lock);
2821e12a0166STyler Retzlaff 	rte_atomic_store_explicit(&hns->hw.reset.resetting, 0, rte_memory_order_relaxed);
2822f13c07a5SHuisong Li 	hw->reset.stage = RESET_STAGE_NONE;
2823f13c07a5SHuisong Li 	hns3_clock_gettime(&tv);
2824f13c07a5SHuisong Li 	timersub(&tv, &hw->reset.start_time, &tv_delta);
2825f13c07a5SHuisong Li 	hns3_warn(hw, "%s reset fail delta %" PRIu64 " ms time=%ld.%.6ld",
2826f13c07a5SHuisong Li 		  reset_string[hw->reset.level],
2827f13c07a5SHuisong Li 		  hns3_clock_calctime_ms(&tv_delta),
2828f13c07a5SHuisong Li 		  tv.tv_sec, tv.tv_usec);
2829f13c07a5SHuisong Li 	hw->reset.level = HNS3_NONE_RESET;
283053688fc9SChengwen Feng 	hns3_report_reset_failed(hw);
2831f13c07a5SHuisong Li }
2832f13c07a5SHuisong Li 
28332790c646SWei Hu (Xavier) /*
28342790c646SWei Hu (Xavier)  * There are three scenarios as follows:
28352790c646SWei Hu (Xavier)  * When the reset is not in progress, the reset process starts.
28362790c646SWei Hu (Xavier)  * During the reset process, if the reset level has not changed,
28372790c646SWei Hu (Xavier)  * the reset process continues; otherwise, the reset process is aborted.
28382790c646SWei Hu (Xavier)  *	hw->reset.level   new_level          action
28392790c646SWei Hu (Xavier)  *	HNS3_NONE_RESET	 HNS3_XXXX_RESET    start reset
28402790c646SWei Hu (Xavier)  *	HNS3_XXXX_RESET  HNS3_XXXX_RESET    continue reset
28412790c646SWei Hu (Xavier)  *	HNS3_LOW_RESET   HNS3_HIGH_RESET    abort
28422790c646SWei Hu (Xavier)  */
28432790c646SWei Hu (Xavier) int
28442790c646SWei Hu (Xavier) hns3_reset_process(struct hns3_adapter *hns, enum hns3_reset_level new_level)
28452790c646SWei Hu (Xavier) {
28462790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
28472790c646SWei Hu (Xavier) 	struct timeval tv;
28482790c646SWei Hu (Xavier) 	int ret;
28492790c646SWei Hu (Xavier) 
28502790c646SWei Hu (Xavier) 	if (hw->reset.level == HNS3_NONE_RESET) {
28512790c646SWei Hu (Xavier) 		hw->reset.level = new_level;
28522790c646SWei Hu (Xavier) 		hw->reset.stats.exec_cnt++;
285378dbb6f9SChengwen Feng 		hns3_clock_gettime(&hw->reset.start_time);
28542790c646SWei Hu (Xavier) 		hns3_warn(hw, "Start %s reset time=%ld.%.6ld",
28552790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level],
28562790c646SWei Hu (Xavier) 			  hw->reset.start_time.tv_sec,
28572790c646SWei Hu (Xavier) 			  hw->reset.start_time.tv_usec);
28582790c646SWei Hu (Xavier) 	}
28592790c646SWei Hu (Xavier) 
28602790c646SWei Hu (Xavier) 	if (is_reset_pending(hns)) {
286178dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
28622790c646SWei Hu (Xavier) 		hns3_warn(hw,
28632790c646SWei Hu (Xavier) 			  "%s reset is aborted by high level time=%ld.%.6ld",
28642790c646SWei Hu (Xavier) 			  reset_string[hw->reset.level], tv.tv_sec, tv.tv_usec);
28652790c646SWei Hu (Xavier) 		if (hw->reset.wait_data->result == HNS3_WAIT_REQUEST)
28662790c646SWei Hu (Xavier) 			rte_eal_alarm_cancel(hns3_wait_callback,
28672790c646SWei Hu (Xavier) 					     hw->reset.wait_data);
28682790c646SWei Hu (Xavier) 		goto err;
28692790c646SWei Hu (Xavier) 	}
28702790c646SWei Hu (Xavier) 
28712790c646SWei Hu (Xavier) 	ret = hns3_reset_pre(hns);
28722790c646SWei Hu (Xavier) 	if (ret)
28732790c646SWei Hu (Xavier) 		goto err;
28742790c646SWei Hu (Xavier) 
28752790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_REQ_HW_RESET) {
28762790c646SWei Hu (Xavier) 		ret = hns3_reset_req_hw_reset(hns);
28772790c646SWei Hu (Xavier) 		if (ret == -EAGAIN)
28782790c646SWei Hu (Xavier) 			return ret;
287978dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
28802790c646SWei Hu (Xavier) 		hns3_warn(hw,
28812790c646SWei Hu (Xavier) 			  "Reset step3 request IMP reset success time=%ld.%.6ld",
28822790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
28832790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_WAIT;
28842790c646SWei Hu (Xavier) 		hw->reset.wait_data->result = HNS3_WAIT_UNKNOWN;
28852790c646SWei Hu (Xavier) 	}
28862790c646SWei Hu (Xavier) 	if (hw->reset.stage == RESET_STAGE_WAIT) {
28872790c646SWei Hu (Xavier) 		ret = hw->reset.ops->wait_hardware_ready(hns);
28882790c646SWei Hu (Xavier) 		if (ret)
28892790c646SWei Hu (Xavier) 			goto retry;
289078dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
28912790c646SWei Hu (Xavier) 		hns3_warn(hw, "Reset step4 reset wait success time=%ld.%.6ld",
28922790c646SWei Hu (Xavier) 			  tv.tv_sec, tv.tv_usec);
28932790c646SWei Hu (Xavier) 		hw->reset.stage = RESET_STAGE_DEV_INIT;
28942790c646SWei Hu (Xavier) 	}
28952790c646SWei Hu (Xavier) 
28962790c646SWei Hu (Xavier) 	ret = hns3_reset_post(hns);
28972790c646SWei Hu (Xavier) 	if (ret)
28982790c646SWei Hu (Xavier) 		goto retry;
28992790c646SWei Hu (Xavier) 
29002790c646SWei Hu (Xavier) 	return 0;
29012790c646SWei Hu (Xavier) retry:
29022790c646SWei Hu (Xavier) 	if (ret == -EAGAIN)
29032790c646SWei Hu (Xavier) 		return ret;
29042790c646SWei Hu (Xavier) err:
2905f13c07a5SHuisong Li 	hns3_reset_fail_handle(hns);
29062790c646SWei Hu (Xavier) 
29072790c646SWei Hu (Xavier) 	return -EIO;
29082790c646SWei Hu (Xavier) }
29092790c646SWei Hu (Xavier) 
29102790c646SWei Hu (Xavier) /*
29112790c646SWei Hu (Xavier)  * The reset process can only be terminated after handshake with IMP(step3),
29122790c646SWei Hu (Xavier)  * so that IMP can complete the reset process normally.
29132790c646SWei Hu (Xavier)  */
29142790c646SWei Hu (Xavier) void
29152790c646SWei Hu (Xavier) hns3_reset_abort(struct hns3_adapter *hns)
29162790c646SWei Hu (Xavier) {
29172790c646SWei Hu (Xavier) 	struct hns3_hw *hw = &hns->hw;
29182790c646SWei Hu (Xavier) 	struct timeval tv;
29192790c646SWei Hu (Xavier) 	int i;
29202790c646SWei Hu (Xavier) 
29212790c646SWei Hu (Xavier) 	for (i = 0; i < HNS3_QUIT_RESET_CNT; i++) {
29222790c646SWei Hu (Xavier) 		if (hw->reset.level == HNS3_NONE_RESET)
29232790c646SWei Hu (Xavier) 			break;
29242790c646SWei Hu (Xavier) 		rte_delay_ms(HNS3_QUIT_RESET_DELAY_MS);
29252790c646SWei Hu (Xavier) 	}
29262790c646SWei Hu (Xavier) 
29272790c646SWei Hu (Xavier) 	/* IMP no longer waiting the ready flag */
29282790c646SWei Hu (Xavier) 	hns3_notify_reset_ready(hw, true);
29292790c646SWei Hu (Xavier) 
29302790c646SWei Hu (Xavier) 	rte_eal_alarm_cancel(hw->reset.ops->reset_service, hns);
29312790c646SWei Hu (Xavier) 	rte_eal_alarm_cancel(hns3_wait_callback, hw->reset.wait_data);
29322790c646SWei Hu (Xavier) 
29332790c646SWei Hu (Xavier) 	if (hw->reset.level != HNS3_NONE_RESET) {
293478dbb6f9SChengwen Feng 		hns3_clock_gettime(&tv);
29352790c646SWei Hu (Xavier) 		hns3_err(hw, "Failed to terminate reset: %s time=%ld.%.6ld",
29362790c646SWei Hu (Xavier) 			 reset_string[hw->reset.level], tv.tv_sec, tv.tv_usec);
29372790c646SWei Hu (Xavier) 	}
29382790c646SWei Hu (Xavier) }
29399bc2289fSChengwen Feng 
29409bc2289fSChengwen Feng static void
29419bc2289fSChengwen Feng hns3_report_lse(void *arg)
29429bc2289fSChengwen Feng {
29439bc2289fSChengwen Feng 	struct rte_eth_dev *dev = (struct rte_eth_dev *)arg;
29449bc2289fSChengwen Feng 	struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
29459bc2289fSChengwen Feng 
29469bc2289fSChengwen Feng 	if (hw->adapter_state == HNS3_NIC_STARTED)
29479bc2289fSChengwen Feng 		rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
29489bc2289fSChengwen Feng }
29499bc2289fSChengwen Feng 
29509bc2289fSChengwen Feng void
29519bc2289fSChengwen Feng hns3_start_report_lse(struct rte_eth_dev *dev)
29529bc2289fSChengwen Feng {
29539bc2289fSChengwen Feng #define DELAY_REPORT_LSE_US	1
29549bc2289fSChengwen Feng 	/*
29559bc2289fSChengwen Feng 	 * When this function called, the context may hold hns3_hw.lock, if
29569bc2289fSChengwen Feng 	 * report lse right now, in some application such as bonding, it will
29579bc2289fSChengwen Feng 	 * trigger call driver's ops which may acquire hns3_hw.lock again, so
29589bc2289fSChengwen Feng 	 * lead to deadlock.
29599bc2289fSChengwen Feng 	 * Here we use delay report to avoid the deadlock.
29609bc2289fSChengwen Feng 	 */
29619bc2289fSChengwen Feng 	rte_eal_alarm_set(DELAY_REPORT_LSE_US, hns3_report_lse, dev);
29629bc2289fSChengwen Feng }
29639bc2289fSChengwen Feng 
29649bc2289fSChengwen Feng void
29659bc2289fSChengwen Feng hns3_stop_report_lse(struct rte_eth_dev *dev)
29669bc2289fSChengwen Feng {
29679bc2289fSChengwen Feng 	rte_eal_alarm_cancel(hns3_report_lse, dev);
29689bc2289fSChengwen Feng }
2969