Merge tag 'linux-kselftest-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux...
[platform/kernel/linux-rpi.git] / drivers / net / ethernet / hisilicon / hns3 / hns3pf / hclge_err.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /* Copyright (c) 2016-2017 Hisilicon Limited. */
3
4 #include "hclge_err.h"
5
6 static const struct hclge_hw_error hclge_imp_tcm_ecc_int[] = {
7         {
8                 .int_msk = BIT(1),
9                 .msg = "imp_itcm0_ecc_mbit_err",
10                 .reset_level = HNAE3_NONE_RESET
11         }, {
12                 .int_msk = BIT(3),
13                 .msg = "imp_itcm1_ecc_mbit_err",
14                 .reset_level = HNAE3_NONE_RESET
15         }, {
16                 .int_msk = BIT(5),
17                 .msg = "imp_itcm2_ecc_mbit_err",
18                 .reset_level = HNAE3_NONE_RESET
19         }, {
20                 .int_msk = BIT(7),
21                 .msg = "imp_itcm3_ecc_mbit_err",
22                 .reset_level = HNAE3_NONE_RESET
23         }, {
24                 .int_msk = BIT(9),
25                 .msg = "imp_dtcm0_mem0_ecc_mbit_err",
26                 .reset_level = HNAE3_NONE_RESET
27         }, {
28                 .int_msk = BIT(11),
29                 .msg = "imp_dtcm0_mem1_ecc_mbit_err",
30                 .reset_level = HNAE3_NONE_RESET
31         }, {
32                 .int_msk = BIT(13),
33                 .msg = "imp_dtcm1_mem0_ecc_mbit_err",
34                 .reset_level = HNAE3_NONE_RESET
35         }, {
36                 .int_msk = BIT(15),
37                 .msg = "imp_dtcm1_mem1_ecc_mbit_err",
38                 .reset_level = HNAE3_NONE_RESET
39         }, {
40                 .int_msk = BIT(17),
41                 .msg = "imp_itcm4_ecc_mbit_err",
42                 .reset_level = HNAE3_NONE_RESET
43         }, {
44                 /* sentinel */
45         }
46 };
47
48 static const struct hclge_hw_error hclge_cmdq_nic_mem_ecc_int[] = {
49         {
50                 .int_msk = BIT(1),
51                 .msg = "cmdq_nic_rx_depth_ecc_mbit_err",
52                 .reset_level = HNAE3_NONE_RESET
53         }, {
54                 .int_msk = BIT(3),
55                 .msg = "cmdq_nic_tx_depth_ecc_mbit_err",
56                 .reset_level = HNAE3_NONE_RESET
57         }, {
58                 .int_msk = BIT(5),
59                 .msg = "cmdq_nic_rx_tail_ecc_mbit_err",
60                 .reset_level = HNAE3_NONE_RESET
61         }, {
62                 .int_msk = BIT(7),
63                 .msg = "cmdq_nic_tx_tail_ecc_mbit_err",
64                 .reset_level = HNAE3_NONE_RESET
65         }, {
66                 .int_msk = BIT(9),
67                 .msg = "cmdq_nic_rx_head_ecc_mbit_err",
68                 .reset_level = HNAE3_NONE_RESET
69         }, {
70                 .int_msk = BIT(11),
71                 .msg = "cmdq_nic_tx_head_ecc_mbit_err",
72                 .reset_level = HNAE3_NONE_RESET
73         }, {
74                 .int_msk = BIT(13),
75                 .msg = "cmdq_nic_rx_addr_ecc_mbit_err",
76                 .reset_level = HNAE3_NONE_RESET
77         }, {
78                 .int_msk = BIT(15),
79                 .msg = "cmdq_nic_tx_addr_ecc_mbit_err",
80                 .reset_level = HNAE3_NONE_RESET
81         }, {
82                 .int_msk = BIT(17),
83                 .msg = "cmdq_rocee_rx_depth_ecc_mbit_err",
84                 .reset_level = HNAE3_NONE_RESET
85         }, {
86                 .int_msk = BIT(19),
87                 .msg = "cmdq_rocee_tx_depth_ecc_mbit_err",
88                 .reset_level = HNAE3_NONE_RESET
89         }, {
90                 .int_msk = BIT(21),
91                 .msg = "cmdq_rocee_rx_tail_ecc_mbit_err",
92                 .reset_level = HNAE3_NONE_RESET
93         }, {
94                 .int_msk = BIT(23),
95                 .msg = "cmdq_rocee_tx_tail_ecc_mbit_err",
96                 .reset_level = HNAE3_NONE_RESET
97         }, {
98                 .int_msk = BIT(25),
99                 .msg = "cmdq_rocee_rx_head_ecc_mbit_err",
100                 .reset_level = HNAE3_NONE_RESET
101         }, {
102                 .int_msk = BIT(27),
103                 .msg = "cmdq_rocee_tx_head_ecc_mbit_err",
104                 .reset_level = HNAE3_NONE_RESET
105         }, {
106                 .int_msk = BIT(29),
107                 .msg = "cmdq_rocee_rx_addr_ecc_mbit_err",
108                 .reset_level = HNAE3_NONE_RESET
109         }, {
110                 .int_msk = BIT(31),
111                 .msg = "cmdq_rocee_tx_addr_ecc_mbit_err",
112                 .reset_level = HNAE3_NONE_RESET
113         }, {
114                 /* sentinel */
115         }
116 };
117
118 static const struct hclge_hw_error hclge_tqp_int_ecc_int[] = {
119         {
120                 .int_msk = BIT(6),
121                 .msg = "tqp_int_cfg_even_ecc_mbit_err",
122                 .reset_level = HNAE3_NONE_RESET
123         }, {
124                 .int_msk = BIT(7),
125                 .msg = "tqp_int_cfg_odd_ecc_mbit_err",
126                 .reset_level = HNAE3_NONE_RESET
127         }, {
128                 .int_msk = BIT(8),
129                 .msg = "tqp_int_ctrl_even_ecc_mbit_err",
130                 .reset_level = HNAE3_NONE_RESET
131         }, {
132                 .int_msk = BIT(9),
133                 .msg = "tqp_int_ctrl_odd_ecc_mbit_err",
134                 .reset_level = HNAE3_NONE_RESET
135         }, {
136                 .int_msk = BIT(10),
137                 .msg = "tx_que_scan_int_ecc_mbit_err",
138                 .reset_level = HNAE3_NONE_RESET
139         }, {
140                 .int_msk = BIT(11),
141                 .msg = "rx_que_scan_int_ecc_mbit_err",
142                 .reset_level = HNAE3_NONE_RESET
143         }, {
144                 /* sentinel */
145         }
146 };
147
148 static const struct hclge_hw_error hclge_msix_sram_ecc_int[] = {
149         {
150                 .int_msk = BIT(1),
151                 .msg = "msix_nic_ecc_mbit_err",
152                 .reset_level = HNAE3_NONE_RESET
153         }, {
154                 .int_msk = BIT(3),
155                 .msg = "msix_rocee_ecc_mbit_err",
156                 .reset_level = HNAE3_NONE_RESET
157         }, {
158                 /* sentinel */
159         }
160 };
161
162 static const struct hclge_hw_error hclge_igu_int[] = {
163         {
164                 .int_msk = BIT(0),
165                 .msg = "igu_rx_buf0_ecc_mbit_err",
166                 .reset_level = HNAE3_GLOBAL_RESET
167         }, {
168                 .int_msk = BIT(2),
169                 .msg = "igu_rx_buf1_ecc_mbit_err",
170                 .reset_level = HNAE3_GLOBAL_RESET
171         }, {
172                 /* sentinel */
173         }
174 };
175
176 static const struct hclge_hw_error hclge_igu_egu_tnl_int[] = {
177         {
178                 .int_msk = BIT(0),
179                 .msg = "rx_buf_overflow",
180                 .reset_level = HNAE3_GLOBAL_RESET
181         }, {
182                 .int_msk = BIT(1),
183                 .msg = "rx_stp_fifo_overflow",
184                 .reset_level = HNAE3_GLOBAL_RESET
185         }, {
186                 .int_msk = BIT(2),
187                 .msg = "rx_stp_fifo_underflow",
188                 .reset_level = HNAE3_GLOBAL_RESET
189         }, {
190                 .int_msk = BIT(3),
191                 .msg = "tx_buf_overflow",
192                 .reset_level = HNAE3_GLOBAL_RESET
193         }, {
194                 .int_msk = BIT(4),
195                 .msg = "tx_buf_underrun",
196                 .reset_level = HNAE3_GLOBAL_RESET
197         }, {
198                 .int_msk = BIT(5),
199                 .msg = "rx_stp_buf_overflow",
200                 .reset_level = HNAE3_GLOBAL_RESET
201         }, {
202                 /* sentinel */
203         }
204 };
205
206 static const struct hclge_hw_error hclge_ncsi_err_int[] = {
207         {
208                 .int_msk = BIT(1),
209                 .msg = "ncsi_tx_ecc_mbit_err",
210                 .reset_level = HNAE3_NONE_RESET
211         }, {
212                 /* sentinel */
213         }
214 };
215
216 static const struct hclge_hw_error hclge_ppp_mpf_abnormal_int_st1[] = {
217         {
218                 .int_msk = BIT(0),
219                 .msg = "vf_vlan_ad_mem_ecc_mbit_err",
220                 .reset_level = HNAE3_GLOBAL_RESET
221         }, {
222                 .int_msk = BIT(1),
223                 .msg = "umv_mcast_group_mem_ecc_mbit_err",
224                 .reset_level = HNAE3_GLOBAL_RESET
225         }, {
226                 .int_msk = BIT(2),
227                 .msg = "umv_key_mem0_ecc_mbit_err",
228                 .reset_level = HNAE3_GLOBAL_RESET
229         }, {
230                 .int_msk = BIT(3),
231                 .msg = "umv_key_mem1_ecc_mbit_err",
232                 .reset_level = HNAE3_GLOBAL_RESET
233         }, {
234                 .int_msk = BIT(4),
235                 .msg = "umv_key_mem2_ecc_mbit_err",
236                 .reset_level = HNAE3_GLOBAL_RESET
237         }, {
238                 .int_msk = BIT(5),
239                 .msg = "umv_key_mem3_ecc_mbit_err",
240                 .reset_level = HNAE3_GLOBAL_RESET
241         }, {
242                 .int_msk = BIT(6),
243                 .msg = "umv_ad_mem_ecc_mbit_err",
244                 .reset_level = HNAE3_GLOBAL_RESET
245         }, {
246                 .int_msk = BIT(7),
247                 .msg = "rss_tc_mode_mem_ecc_mbit_err",
248                 .reset_level = HNAE3_GLOBAL_RESET
249         }, {
250                 .int_msk = BIT(8),
251                 .msg = "rss_idt_mem0_ecc_mbit_err",
252                 .reset_level = HNAE3_GLOBAL_RESET
253         }, {
254                 .int_msk = BIT(9),
255                 .msg = "rss_idt_mem1_ecc_mbit_err",
256                 .reset_level = HNAE3_GLOBAL_RESET
257         }, {
258                 .int_msk = BIT(10),
259                 .msg = "rss_idt_mem2_ecc_mbit_err",
260                 .reset_level = HNAE3_GLOBAL_RESET
261         }, {
262                 .int_msk = BIT(11),
263                 .msg = "rss_idt_mem3_ecc_mbit_err",
264                 .reset_level = HNAE3_GLOBAL_RESET
265         }, {
266                 .int_msk = BIT(12),
267                 .msg = "rss_idt_mem4_ecc_mbit_err",
268                 .reset_level = HNAE3_GLOBAL_RESET
269         }, {
270                 .int_msk = BIT(13),
271                 .msg = "rss_idt_mem5_ecc_mbit_err",
272                 .reset_level = HNAE3_GLOBAL_RESET
273         }, {
274                 .int_msk = BIT(14),
275                 .msg = "rss_idt_mem6_ecc_mbit_err",
276                 .reset_level = HNAE3_GLOBAL_RESET
277         }, {
278                 .int_msk = BIT(15),
279                 .msg = "rss_idt_mem7_ecc_mbit_err",
280                 .reset_level = HNAE3_GLOBAL_RESET
281         }, {
282                 .int_msk = BIT(16),
283                 .msg = "rss_idt_mem8_ecc_mbit_err",
284                 .reset_level = HNAE3_GLOBAL_RESET
285         }, {
286                 .int_msk = BIT(17),
287                 .msg = "rss_idt_mem9_ecc_mbit_err",
288                 .reset_level = HNAE3_GLOBAL_RESET
289         }, {
290                 .int_msk = BIT(18),
291                 .msg = "rss_idt_mem10_ecc_mbit_err",
292                 .reset_level = HNAE3_GLOBAL_RESET
293         }, {
294                 .int_msk = BIT(19),
295                 .msg = "rss_idt_mem11_ecc_mbit_err",
296                 .reset_level = HNAE3_GLOBAL_RESET
297         }, {
298                 .int_msk = BIT(20),
299                 .msg = "rss_idt_mem12_ecc_mbit_err",
300                 .reset_level = HNAE3_GLOBAL_RESET
301         }, {
302                 .int_msk = BIT(21),
303                 .msg = "rss_idt_mem13_ecc_mbit_err",
304                 .reset_level = HNAE3_GLOBAL_RESET
305         }, {
306                 .int_msk = BIT(22),
307                 .msg = "rss_idt_mem14_ecc_mbit_err",
308                 .reset_level = HNAE3_GLOBAL_RESET
309         }, {
310                 .int_msk = BIT(23),
311                 .msg = "rss_idt_mem15_ecc_mbit_err",
312                 .reset_level = HNAE3_GLOBAL_RESET
313         }, {
314                 .int_msk = BIT(24),
315                 .msg = "port_vlan_mem_ecc_mbit_err",
316                 .reset_level = HNAE3_GLOBAL_RESET
317         }, {
318                 .int_msk = BIT(25),
319                 .msg = "mcast_linear_table_mem_ecc_mbit_err",
320                 .reset_level = HNAE3_GLOBAL_RESET
321         }, {
322                 .int_msk = BIT(26),
323                 .msg = "mcast_result_mem_ecc_mbit_err",
324                 .reset_level = HNAE3_GLOBAL_RESET
325         }, {
326                 .int_msk = BIT(27),
327                 .msg = "flow_director_ad_mem0_ecc_mbit_err",
328                 .reset_level = HNAE3_GLOBAL_RESET
329         }, {
330                 .int_msk = BIT(28),
331                 .msg = "flow_director_ad_mem1_ecc_mbit_err",
332                 .reset_level = HNAE3_GLOBAL_RESET
333         }, {
334                 .int_msk = BIT(29),
335                 .msg = "rx_vlan_tag_memory_ecc_mbit_err",
336                 .reset_level = HNAE3_GLOBAL_RESET
337         }, {
338                 .int_msk = BIT(30),
339                 .msg = "Tx_UP_mapping_config_mem_ecc_mbit_err",
340                 .reset_level = HNAE3_GLOBAL_RESET
341         }, {
342                 /* sentinel */
343         }
344 };
345
346 static const struct hclge_hw_error hclge_ppp_pf_abnormal_int[] = {
347         {
348                 .int_msk = BIT(0),
349                 .msg = "tx_vlan_tag_err",
350                 .reset_level = HNAE3_NONE_RESET
351         }, {
352                 .int_msk = BIT(1),
353                 .msg = "rss_list_tc_unassigned_queue_err",
354                 .reset_level = HNAE3_NONE_RESET
355         }, {
356                 /* sentinel */
357         }
358 };
359
360 static const struct hclge_hw_error hclge_ppp_mpf_abnormal_int_st3[] = {
361         {
362                 .int_msk = BIT(0),
363                 .msg = "hfs_fifo_mem_ecc_mbit_err",
364                 .reset_level = HNAE3_GLOBAL_RESET
365         }, {
366                 .int_msk = BIT(1),
367                 .msg = "rslt_descr_fifo_mem_ecc_mbit_err",
368                 .reset_level = HNAE3_GLOBAL_RESET
369         }, {
370                 .int_msk = BIT(2),
371                 .msg = "tx_vlan_tag_mem_ecc_mbit_err",
372                 .reset_level = HNAE3_GLOBAL_RESET
373         }, {
374                 .int_msk = BIT(3),
375                 .msg = "FD_CN0_memory_ecc_mbit_err",
376                 .reset_level = HNAE3_GLOBAL_RESET
377         }, {
378                 .int_msk = BIT(4),
379                 .msg = "FD_CN1_memory_ecc_mbit_err",
380                 .reset_level = HNAE3_GLOBAL_RESET
381         }, {
382                 .int_msk = BIT(5),
383                 .msg = "GRO_AD_memory_ecc_mbit_err",
384                 .reset_level = HNAE3_GLOBAL_RESET
385         }, {
386                 /* sentinel */
387         }
388 };
389
390 static const struct hclge_hw_error hclge_tm_sch_rint[] = {
391         {
392                 .int_msk = BIT(1),
393                 .msg = "tm_sch_ecc_mbit_err",
394                 .reset_level = HNAE3_GLOBAL_RESET
395         }, {
396                 .int_msk = BIT(2),
397                 .msg = "tm_sch_port_shap_sub_fifo_wr_err",
398                 .reset_level = HNAE3_GLOBAL_RESET
399         }, {
400                 .int_msk = BIT(3),
401                 .msg = "tm_sch_port_shap_sub_fifo_rd_err",
402                 .reset_level = HNAE3_GLOBAL_RESET
403         }, {
404                 .int_msk = BIT(4),
405                 .msg = "tm_sch_pg_pshap_sub_fifo_wr_err",
406                 .reset_level = HNAE3_GLOBAL_RESET
407         }, {
408                 .int_msk = BIT(5),
409                 .msg = "tm_sch_pg_pshap_sub_fifo_rd_err",
410                 .reset_level = HNAE3_GLOBAL_RESET
411         }, {
412                 .int_msk = BIT(6),
413                 .msg = "tm_sch_pg_cshap_sub_fifo_wr_err",
414                 .reset_level = HNAE3_GLOBAL_RESET
415         }, {
416                 .int_msk = BIT(7),
417                 .msg = "tm_sch_pg_cshap_sub_fifo_rd_err",
418                 .reset_level = HNAE3_GLOBAL_RESET
419         }, {
420                 .int_msk = BIT(8),
421                 .msg = "tm_sch_pri_pshap_sub_fifo_wr_err",
422                 .reset_level = HNAE3_GLOBAL_RESET
423         }, {
424                 .int_msk = BIT(9),
425                 .msg = "tm_sch_pri_pshap_sub_fifo_rd_err",
426                 .reset_level = HNAE3_GLOBAL_RESET
427         }, {
428                 .int_msk = BIT(10),
429                 .msg = "tm_sch_pri_cshap_sub_fifo_wr_err",
430                 .reset_level = HNAE3_GLOBAL_RESET
431         }, {
432                 .int_msk = BIT(11),
433                 .msg = "tm_sch_pri_cshap_sub_fifo_rd_err",
434                 .reset_level = HNAE3_GLOBAL_RESET
435         }, {
436                 .int_msk = BIT(12),
437                 .msg = "tm_sch_port_shap_offset_fifo_wr_err",
438                 .reset_level = HNAE3_GLOBAL_RESET
439         }, {
440                 .int_msk = BIT(13),
441                 .msg = "tm_sch_port_shap_offset_fifo_rd_err",
442                 .reset_level = HNAE3_GLOBAL_RESET
443         }, {
444                 .int_msk = BIT(14),
445                 .msg = "tm_sch_pg_pshap_offset_fifo_wr_err",
446                 .reset_level = HNAE3_GLOBAL_RESET
447         }, {
448                 .int_msk = BIT(15),
449                 .msg = "tm_sch_pg_pshap_offset_fifo_rd_err",
450                 .reset_level = HNAE3_GLOBAL_RESET
451         }, {
452                 .int_msk = BIT(16),
453                 .msg = "tm_sch_pg_cshap_offset_fifo_wr_err",
454                 .reset_level = HNAE3_GLOBAL_RESET
455         }, {
456                 .int_msk = BIT(17),
457                 .msg = "tm_sch_pg_cshap_offset_fifo_rd_err",
458                 .reset_level = HNAE3_GLOBAL_RESET
459         }, {
460                 .int_msk = BIT(18),
461                 .msg = "tm_sch_pri_pshap_offset_fifo_wr_err",
462                 .reset_level = HNAE3_GLOBAL_RESET
463         }, {
464                 .int_msk = BIT(19),
465                 .msg = "tm_sch_pri_pshap_offset_fifo_rd_err",
466                 .reset_level = HNAE3_GLOBAL_RESET
467         }, {
468                 .int_msk = BIT(20),
469                 .msg = "tm_sch_pri_cshap_offset_fifo_wr_err",
470                 .reset_level = HNAE3_GLOBAL_RESET
471         }, {
472                 .int_msk = BIT(21),
473                 .msg = "tm_sch_pri_cshap_offset_fifo_rd_err",
474                 .reset_level = HNAE3_GLOBAL_RESET
475         }, {
476                 .int_msk = BIT(22),
477                 .msg = "tm_sch_rq_fifo_wr_err",
478                 .reset_level = HNAE3_GLOBAL_RESET
479         }, {
480                 .int_msk = BIT(23),
481                 .msg = "tm_sch_rq_fifo_rd_err",
482                 .reset_level = HNAE3_GLOBAL_RESET
483         }, {
484                 .int_msk = BIT(24),
485                 .msg = "tm_sch_nq_fifo_wr_err",
486                 .reset_level = HNAE3_GLOBAL_RESET
487         }, {
488                 .int_msk = BIT(25),
489                 .msg = "tm_sch_nq_fifo_rd_err",
490                 .reset_level = HNAE3_GLOBAL_RESET
491         }, {
492                 .int_msk = BIT(26),
493                 .msg = "tm_sch_roce_up_fifo_wr_err",
494                 .reset_level = HNAE3_GLOBAL_RESET
495         }, {
496                 .int_msk = BIT(27),
497                 .msg = "tm_sch_roce_up_fifo_rd_err",
498                 .reset_level = HNAE3_GLOBAL_RESET
499         }, {
500                 .int_msk = BIT(28),
501                 .msg = "tm_sch_rcb_byte_fifo_wr_err",
502                 .reset_level = HNAE3_GLOBAL_RESET
503         }, {
504                 .int_msk = BIT(29),
505                 .msg = "tm_sch_rcb_byte_fifo_rd_err",
506                 .reset_level = HNAE3_GLOBAL_RESET
507         }, {
508                 .int_msk = BIT(30),
509                 .msg = "tm_sch_ssu_byte_fifo_wr_err",
510                 .reset_level = HNAE3_GLOBAL_RESET
511         }, {
512                 .int_msk = BIT(31),
513                 .msg = "tm_sch_ssu_byte_fifo_rd_err",
514                 .reset_level = HNAE3_GLOBAL_RESET
515         }, {
516                 /* sentinel */
517         }
518 };
519
520 static const struct hclge_hw_error hclge_qcn_fifo_rint[] = {
521         {
522                 .int_msk = BIT(0),
523                 .msg = "qcn_shap_gp0_sch_fifo_rd_err",
524                 .reset_level = HNAE3_GLOBAL_RESET
525         }, {
526                 .int_msk = BIT(1),
527                 .msg = "qcn_shap_gp0_sch_fifo_wr_err",
528                 .reset_level = HNAE3_GLOBAL_RESET
529         }, {
530                 .int_msk = BIT(2),
531                 .msg = "qcn_shap_gp1_sch_fifo_rd_err",
532                 .reset_level = HNAE3_GLOBAL_RESET
533         }, {
534                 .int_msk = BIT(3),
535                 .msg = "qcn_shap_gp1_sch_fifo_wr_err",
536                 .reset_level = HNAE3_GLOBAL_RESET
537         }, {
538                 .int_msk = BIT(4),
539                 .msg = "qcn_shap_gp2_sch_fifo_rd_err",
540                 .reset_level = HNAE3_GLOBAL_RESET
541         }, {
542                 .int_msk = BIT(5),
543                 .msg = "qcn_shap_gp2_sch_fifo_wr_err",
544                 .reset_level = HNAE3_GLOBAL_RESET
545         }, {
546                 .int_msk = BIT(6),
547                 .msg = "qcn_shap_gp3_sch_fifo_rd_err",
548                 .reset_level = HNAE3_GLOBAL_RESET
549         }, {
550                 .int_msk = BIT(7),
551                 .msg = "qcn_shap_gp3_sch_fifo_wr_err",
552                 .reset_level = HNAE3_GLOBAL_RESET
553         }, {
554                 .int_msk = BIT(8),
555                 .msg = "qcn_shap_gp0_offset_fifo_rd_err",
556                 .reset_level = HNAE3_GLOBAL_RESET
557         }, {
558                 .int_msk = BIT(9),
559                 .msg = "qcn_shap_gp0_offset_fifo_wr_err",
560                 .reset_level = HNAE3_GLOBAL_RESET
561         }, {
562                 .int_msk = BIT(10),
563                 .msg = "qcn_shap_gp1_offset_fifo_rd_err",
564                 .reset_level = HNAE3_GLOBAL_RESET
565         }, {
566                 .int_msk = BIT(11),
567                 .msg = "qcn_shap_gp1_offset_fifo_wr_err",
568                 .reset_level = HNAE3_GLOBAL_RESET
569         }, {
570                 .int_msk = BIT(12),
571                 .msg = "qcn_shap_gp2_offset_fifo_rd_err",
572                 .reset_level = HNAE3_GLOBAL_RESET
573         }, {
574                 .int_msk = BIT(13),
575                 .msg = "qcn_shap_gp2_offset_fifo_wr_err",
576                 .reset_level = HNAE3_GLOBAL_RESET
577         }, {
578                 .int_msk = BIT(14),
579                 .msg = "qcn_shap_gp3_offset_fifo_rd_err",
580                 .reset_level = HNAE3_GLOBAL_RESET
581         }, {
582                 .int_msk = BIT(15),
583                 .msg = "qcn_shap_gp3_offset_fifo_wr_err",
584                 .reset_level = HNAE3_GLOBAL_RESET
585         }, {
586                 .int_msk = BIT(16),
587                 .msg = "qcn_byte_info_fifo_rd_err",
588                 .reset_level = HNAE3_GLOBAL_RESET
589         }, {
590                 .int_msk = BIT(17),
591                 .msg = "qcn_byte_info_fifo_wr_err",
592                 .reset_level = HNAE3_GLOBAL_RESET
593         }, {
594                 /* sentinel */
595         }
596 };
597
598 static const struct hclge_hw_error hclge_qcn_ecc_rint[] = {
599         {
600                 .int_msk = BIT(1),
601                 .msg = "qcn_byte_mem_ecc_mbit_err",
602                 .reset_level = HNAE3_GLOBAL_RESET
603         }, {
604                 .int_msk = BIT(3),
605                 .msg = "qcn_time_mem_ecc_mbit_err",
606                 .reset_level = HNAE3_GLOBAL_RESET
607         }, {
608                 .int_msk = BIT(5),
609                 .msg = "qcn_fb_mem_ecc_mbit_err",
610                 .reset_level = HNAE3_GLOBAL_RESET
611         }, {
612                 .int_msk = BIT(7),
613                 .msg = "qcn_link_mem_ecc_mbit_err",
614                 .reset_level = HNAE3_GLOBAL_RESET
615         }, {
616                 .int_msk = BIT(9),
617                 .msg = "qcn_rate_mem_ecc_mbit_err",
618                 .reset_level = HNAE3_GLOBAL_RESET
619         }, {
620                 .int_msk = BIT(11),
621                 .msg = "qcn_tmplt_mem_ecc_mbit_err",
622                 .reset_level = HNAE3_GLOBAL_RESET
623         }, {
624                 .int_msk = BIT(13),
625                 .msg = "qcn_shap_cfg_mem_ecc_mbit_err",
626                 .reset_level = HNAE3_GLOBAL_RESET
627         }, {
628                 .int_msk = BIT(15),
629                 .msg = "qcn_gp0_barrel_mem_ecc_mbit_err",
630                 .reset_level = HNAE3_GLOBAL_RESET
631         }, {
632                 .int_msk = BIT(17),
633                 .msg = "qcn_gp1_barrel_mem_ecc_mbit_err",
634                 .reset_level = HNAE3_GLOBAL_RESET
635         }, {
636                 .int_msk = BIT(19),
637                 .msg = "qcn_gp2_barrel_mem_ecc_mbit_err",
638                 .reset_level = HNAE3_GLOBAL_RESET
639         }, {
640                 .int_msk = BIT(21),
641                 .msg = "qcn_gp3_barral_mem_ecc_mbit_err",
642                 .reset_level = HNAE3_GLOBAL_RESET
643         }, {
644                 /* sentinel */
645         }
646 };
647
648 static const struct hclge_hw_error hclge_mac_afifo_tnl_int[] = {
649         {
650                 .int_msk = BIT(0),
651                 .msg = "egu_cge_afifo_ecc_1bit_err",
652                 .reset_level = HNAE3_NONE_RESET
653         }, {
654                 .int_msk = BIT(1),
655                 .msg = "egu_cge_afifo_ecc_mbit_err",
656                 .reset_level = HNAE3_GLOBAL_RESET
657         }, {
658                 .int_msk = BIT(2),
659                 .msg = "egu_lge_afifo_ecc_1bit_err",
660                 .reset_level = HNAE3_NONE_RESET
661         }, {
662                 .int_msk = BIT(3),
663                 .msg = "egu_lge_afifo_ecc_mbit_err",
664                 .reset_level = HNAE3_GLOBAL_RESET
665         }, {
666                 .int_msk = BIT(4),
667                 .msg = "cge_igu_afifo_ecc_1bit_err",
668                 .reset_level = HNAE3_NONE_RESET
669         }, {
670                 .int_msk = BIT(5),
671                 .msg = "cge_igu_afifo_ecc_mbit_err",
672                 .reset_level = HNAE3_GLOBAL_RESET
673         }, {
674                 .int_msk = BIT(6),
675                 .msg = "lge_igu_afifo_ecc_1bit_err",
676                 .reset_level = HNAE3_NONE_RESET
677         }, {
678                 .int_msk = BIT(7),
679                 .msg = "lge_igu_afifo_ecc_mbit_err",
680                 .reset_level = HNAE3_GLOBAL_RESET
681         }, {
682                 .int_msk = BIT(8),
683                 .msg = "cge_igu_afifo_overflow_err",
684                 .reset_level = HNAE3_GLOBAL_RESET
685         }, {
686                 .int_msk = BIT(9),
687                 .msg = "lge_igu_afifo_overflow_err",
688                 .reset_level = HNAE3_GLOBAL_RESET
689         }, {
690                 .int_msk = BIT(10),
691                 .msg = "egu_cge_afifo_underrun_err",
692                 .reset_level = HNAE3_GLOBAL_RESET
693         }, {
694                 .int_msk = BIT(11),
695                 .msg = "egu_lge_afifo_underrun_err",
696                 .reset_level = HNAE3_GLOBAL_RESET
697         }, {
698                 .int_msk = BIT(12),
699                 .msg = "egu_ge_afifo_underrun_err",
700                 .reset_level = HNAE3_GLOBAL_RESET
701         }, {
702                 .int_msk = BIT(13),
703                 .msg = "ge_igu_afifo_overflow_err",
704                 .reset_level = HNAE3_GLOBAL_RESET
705         }, {
706                 /* sentinel */
707         }
708 };
709
710 static const struct hclge_hw_error hclge_ppu_mpf_abnormal_int_st2[] = {
711         {
712                 .int_msk = BIT(13),
713                 .msg = "rpu_rx_pkt_bit32_ecc_mbit_err",
714                 .reset_level = HNAE3_GLOBAL_RESET
715         }, {
716                 .int_msk = BIT(14),
717                 .msg = "rpu_rx_pkt_bit33_ecc_mbit_err",
718                 .reset_level = HNAE3_GLOBAL_RESET
719         }, {
720                 .int_msk = BIT(15),
721                 .msg = "rpu_rx_pkt_bit34_ecc_mbit_err",
722                 .reset_level = HNAE3_GLOBAL_RESET
723         }, {
724                 .int_msk = BIT(16),
725                 .msg = "rpu_rx_pkt_bit35_ecc_mbit_err",
726                 .reset_level = HNAE3_GLOBAL_RESET
727         }, {
728                 .int_msk = BIT(17),
729                 .msg = "rcb_tx_ring_ecc_mbit_err",
730                 .reset_level = HNAE3_GLOBAL_RESET
731         }, {
732                 .int_msk = BIT(18),
733                 .msg = "rcb_rx_ring_ecc_mbit_err",
734                 .reset_level = HNAE3_GLOBAL_RESET
735         }, {
736                 .int_msk = BIT(19),
737                 .msg = "rcb_tx_fbd_ecc_mbit_err",
738                 .reset_level = HNAE3_GLOBAL_RESET
739         }, {
740                 .int_msk = BIT(20),
741                 .msg = "rcb_rx_ebd_ecc_mbit_err",
742                 .reset_level = HNAE3_GLOBAL_RESET
743         }, {
744                 .int_msk = BIT(21),
745                 .msg = "rcb_tso_info_ecc_mbit_err",
746                 .reset_level = HNAE3_GLOBAL_RESET
747         }, {
748                 .int_msk = BIT(22),
749                 .msg = "rcb_tx_int_info_ecc_mbit_err",
750                 .reset_level = HNAE3_GLOBAL_RESET
751         }, {
752                 .int_msk = BIT(23),
753                 .msg = "rcb_rx_int_info_ecc_mbit_err",
754                 .reset_level = HNAE3_GLOBAL_RESET
755         }, {
756                 .int_msk = BIT(24),
757                 .msg = "tpu_tx_pkt_0_ecc_mbit_err",
758                 .reset_level = HNAE3_GLOBAL_RESET
759         }, {
760                 .int_msk = BIT(25),
761                 .msg = "tpu_tx_pkt_1_ecc_mbit_err",
762                 .reset_level = HNAE3_GLOBAL_RESET
763         }, {
764                 .int_msk = BIT(26),
765                 .msg = "rd_bus_err",
766                 .reset_level = HNAE3_GLOBAL_RESET
767         }, {
768                 .int_msk = BIT(27),
769                 .msg = "wr_bus_err",
770                 .reset_level = HNAE3_GLOBAL_RESET
771         }, {
772                 .int_msk = BIT(28),
773                 .msg = "reg_search_miss",
774                 .reset_level = HNAE3_GLOBAL_RESET
775         }, {
776                 .int_msk = BIT(29),
777                 .msg = "rx_q_search_miss",
778                 .reset_level = HNAE3_NONE_RESET
779         }, {
780                 .int_msk = BIT(30),
781                 .msg = "ooo_ecc_err_detect",
782                 .reset_level = HNAE3_NONE_RESET
783         }, {
784                 .int_msk = BIT(31),
785                 .msg = "ooo_ecc_err_multpl",
786                 .reset_level = HNAE3_GLOBAL_RESET
787         }, {
788                 /* sentinel */
789         }
790 };
791
792 static const struct hclge_hw_error hclge_ppu_mpf_abnormal_int_st3[] = {
793         {
794                 .int_msk = BIT(4),
795                 .msg = "gro_bd_ecc_mbit_err",
796                 .reset_level = HNAE3_GLOBAL_RESET
797         }, {
798                 .int_msk = BIT(5),
799                 .msg = "gro_context_ecc_mbit_err",
800                 .reset_level = HNAE3_GLOBAL_RESET
801         }, {
802                 .int_msk = BIT(6),
803                 .msg = "rx_stash_cfg_ecc_mbit_err",
804                 .reset_level = HNAE3_GLOBAL_RESET
805         }, {
806                 .int_msk = BIT(7),
807                 .msg = "axi_rd_fbd_ecc_mbit_err",
808                 .reset_level = HNAE3_GLOBAL_RESET
809         }, {
810                 /* sentinel */
811         }
812 };
813
814 static const struct hclge_hw_error hclge_ppu_pf_abnormal_int[] = {
815         {
816                 .int_msk = BIT(0),
817                 .msg = "over_8bd_no_fe",
818                 .reset_level = HNAE3_FUNC_RESET
819         }, {
820                 .int_msk = BIT(1),
821                 .msg = "tso_mss_cmp_min_err",
822                 .reset_level = HNAE3_NONE_RESET
823         }, {
824                 .int_msk = BIT(2),
825                 .msg = "tso_mss_cmp_max_err",
826                 .reset_level = HNAE3_NONE_RESET
827         }, {
828                 .int_msk = BIT(3),
829                 .msg = "tx_rd_fbd_poison",
830                 .reset_level = HNAE3_FUNC_RESET
831         }, {
832                 .int_msk = BIT(4),
833                 .msg = "rx_rd_ebd_poison",
834                 .reset_level = HNAE3_FUNC_RESET
835         }, {
836                 .int_msk = BIT(5),
837                 .msg = "buf_wait_timeout",
838                 .reset_level = HNAE3_NONE_RESET
839         }, {
840                 /* sentinel */
841         }
842 };
843
844 static const struct hclge_hw_error hclge_ssu_com_err_int[] = {
845         {
846                 .int_msk = BIT(0),
847                 .msg = "buf_sum_err",
848                 .reset_level = HNAE3_NONE_RESET
849         }, {
850                 .int_msk = BIT(1),
851                 .msg = "ppp_mb_num_err",
852                 .reset_level = HNAE3_NONE_RESET
853         }, {
854                 .int_msk = BIT(2),
855                 .msg = "ppp_mbid_err",
856                 .reset_level = HNAE3_GLOBAL_RESET
857         }, {
858                 .int_msk = BIT(3),
859                 .msg = "ppp_rlt_mac_err",
860                 .reset_level = HNAE3_GLOBAL_RESET
861         }, {
862                 .int_msk = BIT(4),
863                 .msg = "ppp_rlt_host_err",
864                 .reset_level = HNAE3_GLOBAL_RESET
865         }, {
866                 .int_msk = BIT(5),
867                 .msg = "cks_edit_position_err",
868                 .reset_level = HNAE3_GLOBAL_RESET
869         }, {
870                 .int_msk = BIT(6),
871                 .msg = "cks_edit_condition_err",
872                 .reset_level = HNAE3_GLOBAL_RESET
873         }, {
874                 .int_msk = BIT(7),
875                 .msg = "vlan_edit_condition_err",
876                 .reset_level = HNAE3_GLOBAL_RESET
877         }, {
878                 .int_msk = BIT(8),
879                 .msg = "vlan_num_ot_err",
880                 .reset_level = HNAE3_GLOBAL_RESET
881         }, {
882                 .int_msk = BIT(9),
883                 .msg = "vlan_num_in_err",
884                 .reset_level = HNAE3_GLOBAL_RESET
885         }, {
886                 /* sentinel */
887         }
888 };
889
890 #define HCLGE_SSU_MEM_ECC_ERR(x) \
891 { \
892         .int_msk = BIT(x), \
893         .msg = "ssu_mem" #x "_ecc_mbit_err", \
894         .reset_level = HNAE3_GLOBAL_RESET \
895 }
896
897 static const struct hclge_hw_error hclge_ssu_mem_ecc_err_int[] = {
898         HCLGE_SSU_MEM_ECC_ERR(0),
899         HCLGE_SSU_MEM_ECC_ERR(1),
900         HCLGE_SSU_MEM_ECC_ERR(2),
901         HCLGE_SSU_MEM_ECC_ERR(3),
902         HCLGE_SSU_MEM_ECC_ERR(4),
903         HCLGE_SSU_MEM_ECC_ERR(5),
904         HCLGE_SSU_MEM_ECC_ERR(6),
905         HCLGE_SSU_MEM_ECC_ERR(7),
906         HCLGE_SSU_MEM_ECC_ERR(8),
907         HCLGE_SSU_MEM_ECC_ERR(9),
908         HCLGE_SSU_MEM_ECC_ERR(10),
909         HCLGE_SSU_MEM_ECC_ERR(11),
910         HCLGE_SSU_MEM_ECC_ERR(12),
911         HCLGE_SSU_MEM_ECC_ERR(13),
912         HCLGE_SSU_MEM_ECC_ERR(14),
913         HCLGE_SSU_MEM_ECC_ERR(15),
914         HCLGE_SSU_MEM_ECC_ERR(16),
915         HCLGE_SSU_MEM_ECC_ERR(17),
916         HCLGE_SSU_MEM_ECC_ERR(18),
917         HCLGE_SSU_MEM_ECC_ERR(19),
918         HCLGE_SSU_MEM_ECC_ERR(20),
919         HCLGE_SSU_MEM_ECC_ERR(21),
920         HCLGE_SSU_MEM_ECC_ERR(22),
921         HCLGE_SSU_MEM_ECC_ERR(23),
922         HCLGE_SSU_MEM_ECC_ERR(24),
923         HCLGE_SSU_MEM_ECC_ERR(25),
924         HCLGE_SSU_MEM_ECC_ERR(26),
925         HCLGE_SSU_MEM_ECC_ERR(27),
926         HCLGE_SSU_MEM_ECC_ERR(28),
927         HCLGE_SSU_MEM_ECC_ERR(29),
928         HCLGE_SSU_MEM_ECC_ERR(30),
929         HCLGE_SSU_MEM_ECC_ERR(31),
930         { /* sentinel */ }
931 };
932
933 static const struct hclge_hw_error hclge_ssu_port_based_err_int[] = {
934         {
935                 .int_msk = BIT(0),
936                 .msg = "roc_pkt_without_key_port",
937                 .reset_level = HNAE3_FUNC_RESET
938         }, {
939                 .int_msk = BIT(1),
940                 .msg = "tpu_pkt_without_key_port",
941                 .reset_level = HNAE3_GLOBAL_RESET
942         }, {
943                 .int_msk = BIT(2),
944                 .msg = "igu_pkt_without_key_port",
945                 .reset_level = HNAE3_GLOBAL_RESET
946         }, {
947                 .int_msk = BIT(3),
948                 .msg = "roc_eof_mis_match_port",
949                 .reset_level = HNAE3_GLOBAL_RESET
950         }, {
951                 .int_msk = BIT(4),
952                 .msg = "tpu_eof_mis_match_port",
953                 .reset_level = HNAE3_GLOBAL_RESET
954         }, {
955                 .int_msk = BIT(5),
956                 .msg = "igu_eof_mis_match_port",
957                 .reset_level = HNAE3_GLOBAL_RESET
958         }, {
959                 .int_msk = BIT(6),
960                 .msg = "roc_sof_mis_match_port",
961                 .reset_level = HNAE3_GLOBAL_RESET
962         }, {
963                 .int_msk = BIT(7),
964                 .msg = "tpu_sof_mis_match_port",
965                 .reset_level = HNAE3_GLOBAL_RESET
966         }, {
967                 .int_msk = BIT(8),
968                 .msg = "igu_sof_mis_match_port",
969                 .reset_level = HNAE3_GLOBAL_RESET
970         }, {
971                 .int_msk = BIT(11),
972                 .msg = "ets_rd_int_rx_port",
973                 .reset_level = HNAE3_GLOBAL_RESET
974         }, {
975                 .int_msk = BIT(12),
976                 .msg = "ets_wr_int_rx_port",
977                 .reset_level = HNAE3_GLOBAL_RESET
978         }, {
979                 .int_msk = BIT(13),
980                 .msg = "ets_rd_int_tx_port",
981                 .reset_level = HNAE3_GLOBAL_RESET
982         }, {
983                 .int_msk = BIT(14),
984                 .msg = "ets_wr_int_tx_port",
985                 .reset_level = HNAE3_GLOBAL_RESET
986         }, {
987                 /* sentinel */
988         }
989 };
990
991 static const struct hclge_hw_error hclge_ssu_fifo_overflow_int[] = {
992         {
993                 .int_msk = BIT(0),
994                 .msg = "ig_mac_inf_int",
995                 .reset_level = HNAE3_GLOBAL_RESET
996         }, {
997                 .int_msk = BIT(1),
998                 .msg = "ig_host_inf_int",
999                 .reset_level = HNAE3_GLOBAL_RESET
1000         }, {
1001                 .int_msk = BIT(2),
1002                 .msg = "ig_roc_buf_int",
1003                 .reset_level = HNAE3_GLOBAL_RESET
1004         }, {
1005                 .int_msk = BIT(3),
1006                 .msg = "ig_host_data_fifo_int",
1007                 .reset_level = HNAE3_GLOBAL_RESET
1008         }, {
1009                 .int_msk = BIT(4),
1010                 .msg = "ig_host_key_fifo_int",
1011                 .reset_level = HNAE3_GLOBAL_RESET
1012         }, {
1013                 .int_msk = BIT(5),
1014                 .msg = "tx_qcn_fifo_int",
1015                 .reset_level = HNAE3_GLOBAL_RESET
1016         }, {
1017                 .int_msk = BIT(6),
1018                 .msg = "rx_qcn_fifo_int",
1019                 .reset_level = HNAE3_GLOBAL_RESET
1020         }, {
1021                 .int_msk = BIT(7),
1022                 .msg = "tx_pf_rd_fifo_int",
1023                 .reset_level = HNAE3_GLOBAL_RESET
1024         }, {
1025                 .int_msk = BIT(8),
1026                 .msg = "rx_pf_rd_fifo_int",
1027                 .reset_level = HNAE3_GLOBAL_RESET
1028         }, {
1029                 .int_msk = BIT(9),
1030                 .msg = "qm_eof_fifo_int",
1031                 .reset_level = HNAE3_GLOBAL_RESET
1032         }, {
1033                 .int_msk = BIT(10),
1034                 .msg = "mb_rlt_fifo_int",
1035                 .reset_level = HNAE3_GLOBAL_RESET
1036         }, {
1037                 .int_msk = BIT(11),
1038                 .msg = "dup_uncopy_fifo_int",
1039                 .reset_level = HNAE3_GLOBAL_RESET
1040         }, {
1041                 .int_msk = BIT(12),
1042                 .msg = "dup_cnt_rd_fifo_int",
1043                 .reset_level = HNAE3_GLOBAL_RESET
1044         }, {
1045                 .int_msk = BIT(13),
1046                 .msg = "dup_cnt_drop_fifo_int",
1047                 .reset_level = HNAE3_GLOBAL_RESET
1048         }, {
1049                 .int_msk = BIT(14),
1050                 .msg = "dup_cnt_wrb_fifo_int",
1051                 .reset_level = HNAE3_GLOBAL_RESET
1052         }, {
1053                 .int_msk = BIT(15),
1054                 .msg = "host_cmd_fifo_int",
1055                 .reset_level = HNAE3_GLOBAL_RESET
1056         }, {
1057                 .int_msk = BIT(16),
1058                 .msg = "mac_cmd_fifo_int",
1059                 .reset_level = HNAE3_GLOBAL_RESET
1060         }, {
1061                 .int_msk = BIT(17),
1062                 .msg = "host_cmd_bitmap_empty_int",
1063                 .reset_level = HNAE3_GLOBAL_RESET
1064         }, {
1065                 .int_msk = BIT(18),
1066                 .msg = "mac_cmd_bitmap_empty_int",
1067                 .reset_level = HNAE3_GLOBAL_RESET
1068         }, {
1069                 .int_msk = BIT(19),
1070                 .msg = "dup_bitmap_empty_int",
1071                 .reset_level = HNAE3_GLOBAL_RESET
1072         }, {
1073                 .int_msk = BIT(20),
1074                 .msg = "out_queue_bitmap_empty_int",
1075                 .reset_level = HNAE3_GLOBAL_RESET
1076         }, {
1077                 .int_msk = BIT(21),
1078                 .msg = "bank2_bitmap_empty_int",
1079                 .reset_level = HNAE3_GLOBAL_RESET
1080         }, {
1081                 .int_msk = BIT(22),
1082                 .msg = "bank1_bitmap_empty_int",
1083                 .reset_level = HNAE3_GLOBAL_RESET
1084         }, {
1085                 .int_msk = BIT(23),
1086                 .msg = "bank0_bitmap_empty_int",
1087                 .reset_level = HNAE3_GLOBAL_RESET
1088         }, {
1089                 /* sentinel */
1090         }
1091 };
1092
1093 static const struct hclge_hw_error hclge_ssu_ets_tcg_int[] = {
1094         {
1095                 .int_msk = BIT(0),
1096                 .msg = "ets_rd_int_rx_tcg",
1097                 .reset_level = HNAE3_GLOBAL_RESET
1098         }, {
1099                 .int_msk = BIT(1),
1100                 .msg = "ets_wr_int_rx_tcg",
1101                 .reset_level = HNAE3_GLOBAL_RESET
1102         }, {
1103                 .int_msk = BIT(2),
1104                 .msg = "ets_rd_int_tx_tcg",
1105                 .reset_level = HNAE3_GLOBAL_RESET
1106         }, {
1107                 .int_msk = BIT(3),
1108                 .msg = "ets_wr_int_tx_tcg",
1109                 .reset_level = HNAE3_GLOBAL_RESET
1110         }, {
1111                 /* sentinel */
1112         }
1113 };
1114
1115 static const struct hclge_hw_error hclge_ssu_port_based_pf_int[] = {
1116         {
1117                 .int_msk = BIT(0),
1118                 .msg = "roc_pkt_without_key_port",
1119                 .reset_level = HNAE3_FUNC_RESET
1120         }, {
1121                 .int_msk = BIT(9),
1122                 .msg = "low_water_line_err_port",
1123                 .reset_level = HNAE3_NONE_RESET
1124         }, {
1125                 .int_msk = BIT(10),
1126                 .msg = "hi_water_line_err_port",
1127                 .reset_level = HNAE3_GLOBAL_RESET
1128         }, {
1129                 /* sentinel */
1130         }
1131 };
1132
1133 static const struct hclge_hw_error hclge_rocee_qmm_ovf_err_int[] = {
1134         {
1135                 .int_msk = 0,
1136                 .msg = "rocee qmm ovf: sgid invalid err"
1137         }, {
1138                 .int_msk = 0x4,
1139                 .msg = "rocee qmm ovf: sgid ovf err"
1140         }, {
1141                 .int_msk = 0x8,
1142                 .msg = "rocee qmm ovf: smac invalid err"
1143         }, {
1144                 .int_msk = 0xC,
1145                 .msg = "rocee qmm ovf: smac ovf err"
1146         }, {
1147                 .int_msk = 0x10,
1148                 .msg = "rocee qmm ovf: cqc invalid err"
1149         }, {
1150                 .int_msk = 0x11,
1151                 .msg = "rocee qmm ovf: cqc ovf err"
1152         }, {
1153                 .int_msk = 0x12,
1154                 .msg = "rocee qmm ovf: cqc hopnum err"
1155         }, {
1156                 .int_msk = 0x13,
1157                 .msg = "rocee qmm ovf: cqc ba0 err"
1158         }, {
1159                 .int_msk = 0x14,
1160                 .msg = "rocee qmm ovf: srqc invalid err"
1161         }, {
1162                 .int_msk = 0x15,
1163                 .msg = "rocee qmm ovf: srqc ovf err"
1164         }, {
1165                 .int_msk = 0x16,
1166                 .msg = "rocee qmm ovf: srqc hopnum err"
1167         }, {
1168                 .int_msk = 0x17,
1169                 .msg = "rocee qmm ovf: srqc ba0 err"
1170         }, {
1171                 .int_msk = 0x18,
1172                 .msg = "rocee qmm ovf: mpt invalid err"
1173         }, {
1174                 .int_msk = 0x19,
1175                 .msg = "rocee qmm ovf: mpt ovf err"
1176         }, {
1177                 .int_msk = 0x1A,
1178                 .msg = "rocee qmm ovf: mpt hopnum err"
1179         }, {
1180                 .int_msk = 0x1B,
1181                 .msg = "rocee qmm ovf: mpt ba0 err"
1182         }, {
1183                 .int_msk = 0x1C,
1184                 .msg = "rocee qmm ovf: qpc invalid err"
1185         }, {
1186                 .int_msk = 0x1D,
1187                 .msg = "rocee qmm ovf: qpc ovf err"
1188         }, {
1189                 .int_msk = 0x1E,
1190                 .msg = "rocee qmm ovf: qpc hopnum err"
1191         }, {
1192                 .int_msk = 0x1F,
1193                 .msg = "rocee qmm ovf: qpc ba0 err"
1194         }, {
1195                 /* sentinel */
1196         }
1197 };
1198
1199 static const struct hclge_hw_module_id hclge_hw_module_id_st[] = {
1200         {
1201                 .module_id = MODULE_NONE,
1202                 .msg = "MODULE_NONE"
1203         }, {
1204                 .module_id = MODULE_BIOS_COMMON,
1205                 .msg = "MODULE_BIOS_COMMON"
1206         }, {
1207                 .module_id = MODULE_GE,
1208                 .msg = "MODULE_GE"
1209         }, {
1210                 .module_id = MODULE_IGU_EGU,
1211                 .msg = "MODULE_IGU_EGU"
1212         }, {
1213                 .module_id = MODULE_LGE,
1214                 .msg = "MODULE_LGE"
1215         }, {
1216                 .module_id = MODULE_NCSI,
1217                 .msg = "MODULE_NCSI"
1218         }, {
1219                 .module_id = MODULE_PPP,
1220                 .msg = "MODULE_PPP"
1221         }, {
1222                 .module_id = MODULE_QCN,
1223                 .msg = "MODULE_QCN"
1224         }, {
1225                 .module_id = MODULE_RCB_RX,
1226                 .msg = "MODULE_RCB_RX"
1227         }, {
1228                 .module_id = MODULE_RTC,
1229                 .msg = "MODULE_RTC"
1230         }, {
1231                 .module_id = MODULE_SSU,
1232                 .msg = "MODULE_SSU"
1233         }, {
1234                 .module_id = MODULE_TM,
1235                 .msg = "MODULE_TM"
1236         }, {
1237                 .module_id = MODULE_RCB_TX,
1238                 .msg = "MODULE_RCB_TX"
1239         }, {
1240                 .module_id = MODULE_TXDMA,
1241                 .msg = "MODULE_TXDMA"
1242         }, {
1243                 .module_id = MODULE_MASTER,
1244                 .msg = "MODULE_MASTER"
1245         }, {
1246                 .module_id = MODULE_ROCEE_TOP,
1247                 .msg = "MODULE_ROCEE_TOP"
1248         }, {
1249                 .module_id = MODULE_ROCEE_TIMER,
1250                 .msg = "MODULE_ROCEE_TIMER"
1251         }, {
1252                 .module_id = MODULE_ROCEE_MDB,
1253                 .msg = "MODULE_ROCEE_MDB"
1254         }, {
1255                 .module_id = MODULE_ROCEE_TSP,
1256                 .msg = "MODULE_ROCEE_TSP"
1257         }, {
1258                 .module_id = MODULE_ROCEE_TRP,
1259                 .msg = "MODULE_ROCEE_TRP"
1260         }, {
1261                 .module_id = MODULE_ROCEE_SCC,
1262                 .msg = "MODULE_ROCEE_SCC"
1263         }, {
1264                 .module_id = MODULE_ROCEE_CAEP,
1265                 .msg = "MODULE_ROCEE_CAEP"
1266         }, {
1267                 .module_id = MODULE_ROCEE_GEN_AC,
1268                 .msg = "MODULE_ROCEE_GEN_AC"
1269         }, {
1270                 .module_id = MODULE_ROCEE_QMM,
1271                 .msg = "MODULE_ROCEE_QMM"
1272         }, {
1273                 .module_id = MODULE_ROCEE_LSAN,
1274                 .msg = "MODULE_ROCEE_LSAN"
1275         }
1276 };
1277
1278 static const struct hclge_hw_type_id hclge_hw_type_id_st[] = {
1279         {
1280                 .type_id = NONE_ERROR,
1281                 .msg = "none_error"
1282         }, {
1283                 .type_id = FIFO_ERROR,
1284                 .msg = "fifo_error"
1285         }, {
1286                 .type_id = MEMORY_ERROR,
1287                 .msg = "memory_error"
1288         }, {
1289                 .type_id = POISON_ERROR,
1290                 .msg = "poison_error"
1291         }, {
1292                 .type_id = MSIX_ECC_ERROR,
1293                 .msg = "msix_ecc_error"
1294         }, {
1295                 .type_id = TQP_INT_ECC_ERROR,
1296                 .msg = "tqp_int_ecc_error"
1297         }, {
1298                 .type_id = PF_ABNORMAL_INT_ERROR,
1299                 .msg = "pf_abnormal_int_error"
1300         }, {
1301                 .type_id = MPF_ABNORMAL_INT_ERROR,
1302                 .msg = "mpf_abnormal_int_error"
1303         }, {
1304                 .type_id = COMMON_ERROR,
1305                 .msg = "common_error"
1306         }, {
1307                 .type_id = PORT_ERROR,
1308                 .msg = "port_error"
1309         }, {
1310                 .type_id = ETS_ERROR,
1311                 .msg = "ets_error"
1312         }, {
1313                 .type_id = NCSI_ERROR,
1314                 .msg = "ncsi_error"
1315         }, {
1316                 .type_id = GLB_ERROR,
1317                 .msg = "glb_error"
1318         }, {
1319                 .type_id = ROCEE_NORMAL_ERR,
1320                 .msg = "rocee_normal_error"
1321         }, {
1322                 .type_id = ROCEE_OVF_ERR,
1323                 .msg = "rocee_ovf_error"
1324         }
1325 };
1326
1327 static void hclge_log_error(struct device *dev, char *reg,
1328                             const struct hclge_hw_error *err,
1329                             u32 err_sts, unsigned long *reset_requests)
1330 {
1331         while (err->msg) {
1332                 if (err->int_msk & err_sts) {
1333                         dev_err(dev, "%s %s found [error status=0x%x]\n",
1334                                 reg, err->msg, err_sts);
1335                         if (err->reset_level &&
1336                             err->reset_level != HNAE3_NONE_RESET)
1337                                 set_bit(err->reset_level, reset_requests);
1338                 }
1339                 err++;
1340         }
1341 }
1342
1343 /* hclge_cmd_query_error: read the error information
1344  * @hdev: pointer to struct hclge_dev
1345  * @desc: descriptor for describing the command
1346  * @cmd:  command opcode
1347  * @flag: flag for extended command structure
1348  *
1349  * This function query the error info from hw register/s using command
1350  */
1351 static int hclge_cmd_query_error(struct hclge_dev *hdev,
1352                                  struct hclge_desc *desc, u32 cmd, u16 flag)
1353 {
1354         struct device *dev = &hdev->pdev->dev;
1355         int desc_num = 1;
1356         int ret;
1357
1358         hclge_cmd_setup_basic_desc(&desc[0], cmd, true);
1359         if (flag) {
1360                 desc[0].flag |= cpu_to_le16(flag);
1361                 hclge_cmd_setup_basic_desc(&desc[1], cmd, true);
1362                 desc_num = 2;
1363         }
1364
1365         ret = hclge_cmd_send(&hdev->hw, &desc[0], desc_num);
1366         if (ret)
1367                 dev_err(dev, "query error cmd failed (%d)\n", ret);
1368
1369         return ret;
1370 }
1371
1372 static int hclge_clear_mac_tnl_int(struct hclge_dev *hdev)
1373 {
1374         struct hclge_desc desc;
1375
1376         hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CLEAR_MAC_TNL_INT, false);
1377         desc.data[0] = cpu_to_le32(HCLGE_MAC_TNL_INT_CLR);
1378
1379         return hclge_cmd_send(&hdev->hw, &desc, 1);
1380 }
1381
1382 static int hclge_config_common_hw_err_int(struct hclge_dev *hdev, bool en)
1383 {
1384         struct device *dev = &hdev->pdev->dev;
1385         struct hclge_desc desc[2];
1386         int ret;
1387
1388         /* configure common error interrupts */
1389         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_COMMON_ECC_INT_CFG, false);
1390         desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
1391         hclge_cmd_setup_basic_desc(&desc[1], HCLGE_COMMON_ECC_INT_CFG, false);
1392
1393         if (en) {
1394                 desc[0].data[0] = cpu_to_le32(HCLGE_IMP_TCM_ECC_ERR_INT_EN);
1395                 desc[0].data[2] = cpu_to_le32(HCLGE_CMDQ_NIC_ECC_ERR_INT_EN |
1396                                         HCLGE_CMDQ_ROCEE_ECC_ERR_INT_EN);
1397                 desc[0].data[3] = cpu_to_le32(HCLGE_IMP_RD_POISON_ERR_INT_EN);
1398                 desc[0].data[4] = cpu_to_le32(HCLGE_TQP_ECC_ERR_INT_EN |
1399                                               HCLGE_MSIX_SRAM_ECC_ERR_INT_EN);
1400                 desc[0].data[5] = cpu_to_le32(HCLGE_IMP_ITCM4_ECC_ERR_INT_EN);
1401         }
1402
1403         desc[1].data[0] = cpu_to_le32(HCLGE_IMP_TCM_ECC_ERR_INT_EN_MASK);
1404         desc[1].data[2] = cpu_to_le32(HCLGE_CMDQ_NIC_ECC_ERR_INT_EN_MASK |
1405                                 HCLGE_CMDQ_ROCEE_ECC_ERR_INT_EN_MASK);
1406         desc[1].data[3] = cpu_to_le32(HCLGE_IMP_RD_POISON_ERR_INT_EN_MASK);
1407         desc[1].data[4] = cpu_to_le32(HCLGE_TQP_ECC_ERR_INT_EN_MASK |
1408                                       HCLGE_MSIX_SRAM_ECC_ERR_INT_EN_MASK);
1409         desc[1].data[5] = cpu_to_le32(HCLGE_IMP_ITCM4_ECC_ERR_INT_EN_MASK);
1410
1411         ret = hclge_cmd_send(&hdev->hw, &desc[0], 2);
1412         if (ret)
1413                 dev_err(dev,
1414                         "fail(%d) to configure common err interrupts\n", ret);
1415
1416         return ret;
1417 }
1418
1419 static int hclge_config_ncsi_hw_err_int(struct hclge_dev *hdev, bool en)
1420 {
1421         struct device *dev = &hdev->pdev->dev;
1422         struct hclge_desc desc;
1423         int ret;
1424
1425         if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
1426                 return 0;
1427
1428         /* configure NCSI error interrupts */
1429         hclge_cmd_setup_basic_desc(&desc, HCLGE_NCSI_INT_EN, false);
1430         if (en)
1431                 desc.data[0] = cpu_to_le32(HCLGE_NCSI_ERR_INT_EN);
1432
1433         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
1434         if (ret)
1435                 dev_err(dev,
1436                         "fail(%d) to configure  NCSI error interrupts\n", ret);
1437
1438         return ret;
1439 }
1440
1441 static int hclge_config_igu_egu_hw_err_int(struct hclge_dev *hdev, bool en)
1442 {
1443         struct device *dev = &hdev->pdev->dev;
1444         struct hclge_desc desc;
1445         int ret;
1446
1447         /* configure IGU,EGU error interrupts */
1448         hclge_cmd_setup_basic_desc(&desc, HCLGE_IGU_COMMON_INT_EN, false);
1449         desc.data[0] = cpu_to_le32(HCLGE_IGU_ERR_INT_TYPE);
1450         if (en)
1451                 desc.data[0] |= cpu_to_le32(HCLGE_IGU_ERR_INT_EN);
1452
1453         desc.data[1] = cpu_to_le32(HCLGE_IGU_ERR_INT_EN_MASK);
1454
1455         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
1456         if (ret) {
1457                 dev_err(dev,
1458                         "fail(%d) to configure IGU common interrupts\n", ret);
1459                 return ret;
1460         }
1461
1462         hclge_cmd_setup_basic_desc(&desc, HCLGE_IGU_EGU_TNL_INT_EN, false);
1463         if (en)
1464                 desc.data[0] = cpu_to_le32(HCLGE_IGU_TNL_ERR_INT_EN);
1465
1466         desc.data[1] = cpu_to_le32(HCLGE_IGU_TNL_ERR_INT_EN_MASK);
1467
1468         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
1469         if (ret) {
1470                 dev_err(dev,
1471                         "fail(%d) to configure IGU-EGU TNL interrupts\n", ret);
1472                 return ret;
1473         }
1474
1475         ret = hclge_config_ncsi_hw_err_int(hdev, en);
1476
1477         return ret;
1478 }
1479
1480 static int hclge_config_ppp_error_interrupt(struct hclge_dev *hdev, u32 cmd,
1481                                             bool en)
1482 {
1483         struct device *dev = &hdev->pdev->dev;
1484         struct hclge_desc desc[2];
1485         int ret;
1486
1487         /* configure PPP error interrupts */
1488         hclge_cmd_setup_basic_desc(&desc[0], cmd, false);
1489         desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
1490         hclge_cmd_setup_basic_desc(&desc[1], cmd, false);
1491
1492         if (cmd == HCLGE_PPP_CMD0_INT_CMD) {
1493                 if (en) {
1494                         desc[0].data[0] =
1495                                 cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT0_EN);
1496                         desc[0].data[1] =
1497                                 cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT1_EN);
1498                         desc[0].data[4] = cpu_to_le32(HCLGE_PPP_PF_ERR_INT_EN);
1499                 }
1500
1501                 desc[1].data[0] =
1502                         cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT0_EN_MASK);
1503                 desc[1].data[1] =
1504                         cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT1_EN_MASK);
1505                 if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
1506                         desc[1].data[2] =
1507                                 cpu_to_le32(HCLGE_PPP_PF_ERR_INT_EN_MASK);
1508         } else if (cmd == HCLGE_PPP_CMD1_INT_CMD) {
1509                 if (en) {
1510                         desc[0].data[0] =
1511                                 cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT2_EN);
1512                         desc[0].data[1] =
1513                                 cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT3_EN);
1514                 }
1515
1516                 desc[1].data[0] =
1517                                 cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT2_EN_MASK);
1518                 desc[1].data[1] =
1519                                 cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT3_EN_MASK);
1520         }
1521
1522         ret = hclge_cmd_send(&hdev->hw, &desc[0], 2);
1523         if (ret)
1524                 dev_err(dev, "fail(%d) to configure PPP error intr\n", ret);
1525
1526         return ret;
1527 }
1528
1529 static int hclge_config_ppp_hw_err_int(struct hclge_dev *hdev, bool en)
1530 {
1531         int ret;
1532
1533         ret = hclge_config_ppp_error_interrupt(hdev, HCLGE_PPP_CMD0_INT_CMD,
1534                                                en);
1535         if (ret)
1536                 return ret;
1537
1538         ret = hclge_config_ppp_error_interrupt(hdev, HCLGE_PPP_CMD1_INT_CMD,
1539                                                en);
1540
1541         return ret;
1542 }
1543
1544 static int hclge_config_tm_hw_err_int(struct hclge_dev *hdev, bool en)
1545 {
1546         struct device *dev = &hdev->pdev->dev;
1547         struct hclge_desc desc;
1548         int ret;
1549
1550         /* configure TM SCH hw errors */
1551         hclge_cmd_setup_basic_desc(&desc, HCLGE_TM_SCH_ECC_INT_EN, false);
1552         if (en)
1553                 desc.data[0] = cpu_to_le32(HCLGE_TM_SCH_ECC_ERR_INT_EN);
1554
1555         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
1556         if (ret) {
1557                 dev_err(dev, "fail(%d) to configure TM SCH errors\n", ret);
1558                 return ret;
1559         }
1560
1561         /* configure TM QCN hw errors */
1562         hclge_cmd_setup_basic_desc(&desc, HCLGE_TM_QCN_MEM_INT_CFG, false);
1563         if (en)
1564                 desc.data[1] = cpu_to_le32(HCLGE_TM_QCN_MEM_ERR_INT_EN);
1565
1566         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
1567         if (ret)
1568                 dev_err(dev,
1569                         "fail(%d) to configure TM QCN mem errors\n", ret);
1570
1571         return ret;
1572 }
1573
1574 static int hclge_config_mac_err_int(struct hclge_dev *hdev, bool en)
1575 {
1576         struct device *dev = &hdev->pdev->dev;
1577         struct hclge_desc desc;
1578         int ret;
1579
1580         /* configure MAC common error interrupts */
1581         hclge_cmd_setup_basic_desc(&desc, HCLGE_MAC_COMMON_INT_EN, false);
1582         if (en)
1583                 desc.data[0] = cpu_to_le32(HCLGE_MAC_COMMON_ERR_INT_EN);
1584
1585         desc.data[1] = cpu_to_le32(HCLGE_MAC_COMMON_ERR_INT_EN_MASK);
1586
1587         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
1588         if (ret)
1589                 dev_err(dev,
1590                         "fail(%d) to configure MAC COMMON error intr\n", ret);
1591
1592         return ret;
1593 }
1594
1595 int hclge_config_mac_tnl_int(struct hclge_dev *hdev, bool en)
1596 {
1597         struct hclge_desc desc;
1598
1599         hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MAC_TNL_INT_EN, false);
1600         if (en)
1601                 desc.data[0] = cpu_to_le32(HCLGE_MAC_TNL_INT_EN);
1602         else
1603                 desc.data[0] = 0;
1604
1605         desc.data[1] = cpu_to_le32(HCLGE_MAC_TNL_INT_EN_MASK);
1606
1607         return hclge_cmd_send(&hdev->hw, &desc, 1);
1608 }
1609
1610 static int hclge_config_ppu_error_interrupts(struct hclge_dev *hdev, u32 cmd,
1611                                              bool en)
1612 {
1613         struct device *dev = &hdev->pdev->dev;
1614         struct hclge_desc desc[2];
1615         int desc_num = 1;
1616         int ret;
1617
1618         /* configure PPU error interrupts */
1619         if (cmd == HCLGE_PPU_MPF_ECC_INT_CMD) {
1620                 hclge_cmd_setup_basic_desc(&desc[0], cmd, false);
1621                 desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
1622                 hclge_cmd_setup_basic_desc(&desc[1], cmd, false);
1623                 if (en) {
1624                         desc[0].data[0] =
1625                                 cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT0_EN);
1626                         desc[0].data[1] =
1627                                 cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT1_EN);
1628                         desc[1].data[3] =
1629                                 cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT3_EN);
1630                         desc[1].data[4] =
1631                                 cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT2_EN);
1632                 }
1633
1634                 desc[1].data[0] =
1635                         cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT0_EN_MASK);
1636                 desc[1].data[1] =
1637                         cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT1_EN_MASK);
1638                 desc[1].data[2] =
1639                         cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT2_EN_MASK);
1640                 desc[1].data[3] |=
1641                         cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT3_EN_MASK);
1642                 desc_num = 2;
1643         } else if (cmd == HCLGE_PPU_MPF_OTHER_INT_CMD) {
1644                 hclge_cmd_setup_basic_desc(&desc[0], cmd, false);
1645                 if (en)
1646                         desc[0].data[0] =
1647                                 cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT2_EN2);
1648
1649                 desc[0].data[2] =
1650                         cpu_to_le32(HCLGE_PPU_MPF_ABNORMAL_INT2_EN2_MASK);
1651         } else if (cmd == HCLGE_PPU_PF_OTHER_INT_CMD) {
1652                 hclge_cmd_setup_basic_desc(&desc[0], cmd, false);
1653                 if (en)
1654                         desc[0].data[0] =
1655                                 cpu_to_le32(HCLGE_PPU_PF_ABNORMAL_INT_EN);
1656
1657                 desc[0].data[2] =
1658                         cpu_to_le32(HCLGE_PPU_PF_ABNORMAL_INT_EN_MASK);
1659         } else {
1660                 dev_err(dev, "Invalid cmd to configure PPU error interrupts\n");
1661                 return -EINVAL;
1662         }
1663
1664         ret = hclge_cmd_send(&hdev->hw, &desc[0], desc_num);
1665
1666         return ret;
1667 }
1668
1669 static int hclge_config_ppu_hw_err_int(struct hclge_dev *hdev, bool en)
1670 {
1671         struct device *dev = &hdev->pdev->dev;
1672         int ret;
1673
1674         ret = hclge_config_ppu_error_interrupts(hdev, HCLGE_PPU_MPF_ECC_INT_CMD,
1675                                                 en);
1676         if (ret) {
1677                 dev_err(dev, "fail(%d) to configure PPU MPF ECC error intr\n",
1678                         ret);
1679                 return ret;
1680         }
1681
1682         ret = hclge_config_ppu_error_interrupts(hdev,
1683                                                 HCLGE_PPU_MPF_OTHER_INT_CMD,
1684                                                 en);
1685         if (ret) {
1686                 dev_err(dev, "fail(%d) to configure PPU MPF other intr\n", ret);
1687                 return ret;
1688         }
1689
1690         ret = hclge_config_ppu_error_interrupts(hdev,
1691                                                 HCLGE_PPU_PF_OTHER_INT_CMD, en);
1692         if (ret)
1693                 dev_err(dev, "fail(%d) to configure PPU PF error interrupts\n",
1694                         ret);
1695         return ret;
1696 }
1697
1698 static int hclge_config_ssu_hw_err_int(struct hclge_dev *hdev, bool en)
1699 {
1700         struct device *dev = &hdev->pdev->dev;
1701         struct hclge_desc desc[2];
1702         int ret;
1703
1704         /* configure SSU ecc error interrupts */
1705         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_SSU_ECC_INT_CMD, false);
1706         desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
1707         hclge_cmd_setup_basic_desc(&desc[1], HCLGE_SSU_ECC_INT_CMD, false);
1708         if (en) {
1709                 desc[0].data[0] = cpu_to_le32(HCLGE_SSU_1BIT_ECC_ERR_INT_EN);
1710                 desc[0].data[1] =
1711                         cpu_to_le32(HCLGE_SSU_MULTI_BIT_ECC_ERR_INT_EN);
1712                 desc[0].data[4] = cpu_to_le32(HCLGE_SSU_BIT32_ECC_ERR_INT_EN);
1713         }
1714
1715         desc[1].data[0] = cpu_to_le32(HCLGE_SSU_1BIT_ECC_ERR_INT_EN_MASK);
1716         desc[1].data[1] = cpu_to_le32(HCLGE_SSU_MULTI_BIT_ECC_ERR_INT_EN_MASK);
1717         desc[1].data[2] = cpu_to_le32(HCLGE_SSU_BIT32_ECC_ERR_INT_EN_MASK);
1718
1719         ret = hclge_cmd_send(&hdev->hw, &desc[0], 2);
1720         if (ret) {
1721                 dev_err(dev,
1722                         "fail(%d) to configure SSU ECC error interrupt\n", ret);
1723                 return ret;
1724         }
1725
1726         /* configure SSU common error interrupts */
1727         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_SSU_COMMON_INT_CMD, false);
1728         desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
1729         hclge_cmd_setup_basic_desc(&desc[1], HCLGE_SSU_COMMON_INT_CMD, false);
1730
1731         if (en) {
1732                 if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
1733                         desc[0].data[0] =
1734                                 cpu_to_le32(HCLGE_SSU_COMMON_INT_EN);
1735                 else
1736                         desc[0].data[0] =
1737                                 cpu_to_le32(HCLGE_SSU_COMMON_INT_EN & ~BIT(5));
1738                 desc[0].data[1] = cpu_to_le32(HCLGE_SSU_PORT_BASED_ERR_INT_EN);
1739                 desc[0].data[2] =
1740                         cpu_to_le32(HCLGE_SSU_FIFO_OVERFLOW_ERR_INT_EN);
1741         }
1742
1743         desc[1].data[0] = cpu_to_le32(HCLGE_SSU_COMMON_INT_EN_MASK |
1744                                 HCLGE_SSU_PORT_BASED_ERR_INT_EN_MASK);
1745         desc[1].data[1] = cpu_to_le32(HCLGE_SSU_FIFO_OVERFLOW_ERR_INT_EN_MASK);
1746
1747         ret = hclge_cmd_send(&hdev->hw, &desc[0], 2);
1748         if (ret)
1749                 dev_err(dev,
1750                         "fail(%d) to configure SSU COMMON error intr\n", ret);
1751
1752         return ret;
1753 }
1754
1755 /* hclge_query_bd_num: query number of buffer descriptors
1756  * @hdev: pointer to struct hclge_dev
1757  * @is_ras: true for ras, false for msix
1758  * @mpf_bd_num: number of main PF interrupt buffer descriptors
1759  * @pf_bd_num: number of not main PF interrupt buffer descriptors
1760  *
1761  * This function querys number of mpf and pf buffer descriptors.
1762  */
1763 static int hclge_query_bd_num(struct hclge_dev *hdev, bool is_ras,
1764                               u32 *mpf_bd_num, u32 *pf_bd_num)
1765 {
1766         struct device *dev = &hdev->pdev->dev;
1767         u32 mpf_min_bd_num, pf_min_bd_num;
1768         enum hclge_opcode_type opcode;
1769         struct hclge_desc desc_bd;
1770         int ret;
1771
1772         if (is_ras) {
1773                 opcode = HCLGE_QUERY_RAS_INT_STS_BD_NUM;
1774                 mpf_min_bd_num = HCLGE_MPF_RAS_INT_MIN_BD_NUM;
1775                 pf_min_bd_num = HCLGE_PF_RAS_INT_MIN_BD_NUM;
1776         } else {
1777                 opcode = HCLGE_QUERY_MSIX_INT_STS_BD_NUM;
1778                 mpf_min_bd_num = HCLGE_MPF_MSIX_INT_MIN_BD_NUM;
1779                 pf_min_bd_num = HCLGE_PF_MSIX_INT_MIN_BD_NUM;
1780         }
1781
1782         hclge_cmd_setup_basic_desc(&desc_bd, opcode, true);
1783         ret = hclge_cmd_send(&hdev->hw, &desc_bd, 1);
1784         if (ret) {
1785                 dev_err(dev, "fail(%d) to query msix int status bd num\n",
1786                         ret);
1787                 return ret;
1788         }
1789
1790         *mpf_bd_num = le32_to_cpu(desc_bd.data[0]);
1791         *pf_bd_num = le32_to_cpu(desc_bd.data[1]);
1792         if (*mpf_bd_num < mpf_min_bd_num || *pf_bd_num < pf_min_bd_num) {
1793                 dev_err(dev, "Invalid bd num: mpf(%u), pf(%u)\n",
1794                         *mpf_bd_num, *pf_bd_num);
1795                 return -EINVAL;
1796         }
1797
1798         return 0;
1799 }
1800
1801 /* hclge_handle_mpf_ras_error: handle all main PF RAS errors
1802  * @hdev: pointer to struct hclge_dev
1803  * @desc: descriptor for describing the command
1804  * @num:  number of extended command structures
1805  *
1806  * This function handles all the main PF RAS errors in the
1807  * hw register/s using command.
1808  */
1809 static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev,
1810                                       struct hclge_desc *desc,
1811                                       int num)
1812 {
1813         struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
1814         struct device *dev = &hdev->pdev->dev;
1815         __le32 *desc_data;
1816         u32 status;
1817         int ret;
1818
1819         /* query all main PF RAS errors */
1820         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_MPF_RAS_INT,
1821                                    true);
1822         ret = hclge_cmd_send(&hdev->hw, &desc[0], num);
1823         if (ret) {
1824                 dev_err(dev, "query all mpf ras int cmd failed (%d)\n", ret);
1825                 return ret;
1826         }
1827
1828         /* log HNS common errors */
1829         status = le32_to_cpu(desc[0].data[0]);
1830         if (status)
1831                 hclge_log_error(dev, "IMP_TCM_ECC_INT_STS",
1832                                 &hclge_imp_tcm_ecc_int[0], status,
1833                                 &ae_dev->hw_err_reset_req);
1834
1835         status = le32_to_cpu(desc[0].data[1]);
1836         if (status)
1837                 hclge_log_error(dev, "CMDQ_MEM_ECC_INT_STS",
1838                                 &hclge_cmdq_nic_mem_ecc_int[0], status,
1839                                 &ae_dev->hw_err_reset_req);
1840
1841         if ((le32_to_cpu(desc[0].data[2])) & BIT(0))
1842                 dev_warn(dev, "imp_rd_data_poison_err found\n");
1843
1844         status = le32_to_cpu(desc[0].data[3]);
1845         if (status)
1846                 hclge_log_error(dev, "TQP_INT_ECC_INT_STS",
1847                                 &hclge_tqp_int_ecc_int[0], status,
1848                                 &ae_dev->hw_err_reset_req);
1849
1850         status = le32_to_cpu(desc[0].data[4]);
1851         if (status)
1852                 hclge_log_error(dev, "MSIX_ECC_INT_STS",
1853                                 &hclge_msix_sram_ecc_int[0], status,
1854                                 &ae_dev->hw_err_reset_req);
1855
1856         /* log SSU(Storage Switch Unit) errors */
1857         desc_data = (__le32 *)&desc[2];
1858         status = le32_to_cpu(*(desc_data + 2));
1859         if (status)
1860                 hclge_log_error(dev, "SSU_ECC_MULTI_BIT_INT_0",
1861                                 &hclge_ssu_mem_ecc_err_int[0], status,
1862                                 &ae_dev->hw_err_reset_req);
1863
1864         status = le32_to_cpu(*(desc_data + 3)) & BIT(0);
1865         if (status) {
1866                 dev_err(dev, "SSU_ECC_MULTI_BIT_INT_1 ssu_mem32_ecc_mbit_err found [error status=0x%x]\n",
1867                         status);
1868                 set_bit(HNAE3_GLOBAL_RESET, &ae_dev->hw_err_reset_req);
1869         }
1870
1871         status = le32_to_cpu(*(desc_data + 4)) & HCLGE_SSU_COMMON_ERR_INT_MASK;
1872         if (status)
1873                 hclge_log_error(dev, "SSU_COMMON_ERR_INT",
1874                                 &hclge_ssu_com_err_int[0], status,
1875                                 &ae_dev->hw_err_reset_req);
1876
1877         /* log IGU(Ingress Unit) errors */
1878         desc_data = (__le32 *)&desc[3];
1879         status = le32_to_cpu(*desc_data) & HCLGE_IGU_INT_MASK;
1880         if (status)
1881                 hclge_log_error(dev, "IGU_INT_STS",
1882                                 &hclge_igu_int[0], status,
1883                                 &ae_dev->hw_err_reset_req);
1884
1885         /* log PPP(Programmable Packet Process) errors */
1886         desc_data = (__le32 *)&desc[4];
1887         status = le32_to_cpu(*(desc_data + 1));
1888         if (status)
1889                 hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST1",
1890                                 &hclge_ppp_mpf_abnormal_int_st1[0], status,
1891                                 &ae_dev->hw_err_reset_req);
1892
1893         status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPP_MPF_INT_ST3_MASK;
1894         if (status)
1895                 hclge_log_error(dev, "PPP_MPF_ABNORMAL_INT_ST3",
1896                                 &hclge_ppp_mpf_abnormal_int_st3[0], status,
1897                                 &ae_dev->hw_err_reset_req);
1898
1899         /* log PPU(RCB) errors */
1900         desc_data = (__le32 *)&desc[5];
1901         status = le32_to_cpu(*(desc_data + 1));
1902         if (status) {
1903                 dev_err(dev,
1904                         "PPU_MPF_ABNORMAL_INT_ST1 rpu_rx_pkt_ecc_mbit_err found\n");
1905                 set_bit(HNAE3_GLOBAL_RESET, &ae_dev->hw_err_reset_req);
1906         }
1907
1908         status = le32_to_cpu(*(desc_data + 2));
1909         if (status)
1910                 hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST2",
1911                                 &hclge_ppu_mpf_abnormal_int_st2[0], status,
1912                                 &ae_dev->hw_err_reset_req);
1913
1914         status = le32_to_cpu(*(desc_data + 3)) & HCLGE_PPU_MPF_INT_ST3_MASK;
1915         if (status)
1916                 hclge_log_error(dev, "PPU_MPF_ABNORMAL_INT_ST3",
1917                                 &hclge_ppu_mpf_abnormal_int_st3[0], status,
1918                                 &ae_dev->hw_err_reset_req);
1919
1920         /* log TM(Traffic Manager) errors */
1921         desc_data = (__le32 *)&desc[6];
1922         status = le32_to_cpu(*desc_data);
1923         if (status)
1924                 hclge_log_error(dev, "TM_SCH_RINT",
1925                                 &hclge_tm_sch_rint[0], status,
1926                                 &ae_dev->hw_err_reset_req);
1927
1928         /* log QCN(Quantized Congestion Control) errors */
1929         desc_data = (__le32 *)&desc[7];
1930         status = le32_to_cpu(*desc_data) & HCLGE_QCN_FIFO_INT_MASK;
1931         if (status)
1932                 hclge_log_error(dev, "QCN_FIFO_RINT",
1933                                 &hclge_qcn_fifo_rint[0], status,
1934                                 &ae_dev->hw_err_reset_req);
1935
1936         status = le32_to_cpu(*(desc_data + 1)) & HCLGE_QCN_ECC_INT_MASK;
1937         if (status)
1938                 hclge_log_error(dev, "QCN_ECC_RINT",
1939                                 &hclge_qcn_ecc_rint[0], status,
1940                                 &ae_dev->hw_err_reset_req);
1941
1942         /* log NCSI errors */
1943         desc_data = (__le32 *)&desc[9];
1944         status = le32_to_cpu(*desc_data) & HCLGE_NCSI_ECC_INT_MASK;
1945         if (status)
1946                 hclge_log_error(dev, "NCSI_ECC_INT_RPT",
1947                                 &hclge_ncsi_err_int[0], status,
1948                                 &ae_dev->hw_err_reset_req);
1949
1950         /* clear all main PF RAS errors */
1951         hclge_cmd_reuse_desc(&desc[0], false);
1952         ret = hclge_cmd_send(&hdev->hw, &desc[0], num);
1953         if (ret)
1954                 dev_err(dev, "clear all mpf ras int cmd failed (%d)\n", ret);
1955
1956         return ret;
1957 }
1958
1959 /* hclge_handle_pf_ras_error: handle all PF RAS errors
1960  * @hdev: pointer to struct hclge_dev
1961  * @desc: descriptor for describing the command
1962  * @num:  number of extended command structures
1963  *
1964  * This function handles all the PF RAS errors in the
1965  * hw register/s using command.
1966  */
1967 static int hclge_handle_pf_ras_error(struct hclge_dev *hdev,
1968                                      struct hclge_desc *desc,
1969                                      int num)
1970 {
1971         struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
1972         struct device *dev = &hdev->pdev->dev;
1973         __le32 *desc_data;
1974         u32 status;
1975         int ret;
1976
1977         /* query all PF RAS errors */
1978         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_PF_RAS_INT,
1979                                    true);
1980         ret = hclge_cmd_send(&hdev->hw, &desc[0], num);
1981         if (ret) {
1982                 dev_err(dev, "query all pf ras int cmd failed (%d)\n", ret);
1983                 return ret;
1984         }
1985
1986         /* log SSU(Storage Switch Unit) errors */
1987         status = le32_to_cpu(desc[0].data[0]);
1988         if (status)
1989                 hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT",
1990                                 &hclge_ssu_port_based_err_int[0], status,
1991                                 &ae_dev->hw_err_reset_req);
1992
1993         status = le32_to_cpu(desc[0].data[1]);
1994         if (status)
1995                 hclge_log_error(dev, "SSU_FIFO_OVERFLOW_INT",
1996                                 &hclge_ssu_fifo_overflow_int[0], status,
1997                                 &ae_dev->hw_err_reset_req);
1998
1999         status = le32_to_cpu(desc[0].data[2]);
2000         if (status)
2001                 hclge_log_error(dev, "SSU_ETS_TCG_INT",
2002                                 &hclge_ssu_ets_tcg_int[0], status,
2003                                 &ae_dev->hw_err_reset_req);
2004
2005         /* log IGU(Ingress Unit) EGU(Egress Unit) TNL errors */
2006         desc_data = (__le32 *)&desc[1];
2007         status = le32_to_cpu(*desc_data) & HCLGE_IGU_EGU_TNL_INT_MASK;
2008         if (status)
2009                 hclge_log_error(dev, "IGU_EGU_TNL_INT_STS",
2010                                 &hclge_igu_egu_tnl_int[0], status,
2011                                 &ae_dev->hw_err_reset_req);
2012
2013         /* log PPU(RCB) errors */
2014         desc_data = (__le32 *)&desc[3];
2015         status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_INT_RAS_MASK;
2016         if (status) {
2017                 hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST0",
2018                                 &hclge_ppu_pf_abnormal_int[0], status,
2019                                 &ae_dev->hw_err_reset_req);
2020                 hclge_report_hw_error(hdev, HNAE3_PPU_POISON_ERROR);
2021         }
2022
2023         /* clear all PF RAS errors */
2024         hclge_cmd_reuse_desc(&desc[0], false);
2025         ret = hclge_cmd_send(&hdev->hw, &desc[0], num);
2026         if (ret)
2027                 dev_err(dev, "clear all pf ras int cmd failed (%d)\n", ret);
2028
2029         return ret;
2030 }
2031
2032 static int hclge_handle_all_ras_errors(struct hclge_dev *hdev)
2033 {
2034         u32 mpf_bd_num, pf_bd_num, bd_num;
2035         struct hclge_desc *desc;
2036         int ret;
2037
2038         /* query the number of registers in the RAS int status */
2039         ret = hclge_query_bd_num(hdev, true, &mpf_bd_num, &pf_bd_num);
2040         if (ret)
2041                 return ret;
2042
2043         bd_num = max_t(u32, mpf_bd_num, pf_bd_num);
2044         desc = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);
2045         if (!desc)
2046                 return -ENOMEM;
2047
2048         /* handle all main PF RAS errors */
2049         ret = hclge_handle_mpf_ras_error(hdev, desc, mpf_bd_num);
2050         if (ret) {
2051                 kfree(desc);
2052                 return ret;
2053         }
2054         memset(desc, 0, bd_num * sizeof(struct hclge_desc));
2055
2056         /* handle all PF RAS errors */
2057         ret = hclge_handle_pf_ras_error(hdev, desc, pf_bd_num);
2058         kfree(desc);
2059
2060         return ret;
2061 }
2062
2063 static int hclge_log_rocee_axi_error(struct hclge_dev *hdev)
2064 {
2065         struct device *dev = &hdev->pdev->dev;
2066         struct hclge_desc desc[3];
2067         int ret;
2068
2069         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_ROCEE_AXI_RAS_INFO_CMD,
2070                                    true);
2071         hclge_cmd_setup_basic_desc(&desc[1], HCLGE_QUERY_ROCEE_AXI_RAS_INFO_CMD,
2072                                    true);
2073         hclge_cmd_setup_basic_desc(&desc[2], HCLGE_QUERY_ROCEE_AXI_RAS_INFO_CMD,
2074                                    true);
2075         desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
2076         desc[1].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
2077
2078         ret = hclge_cmd_send(&hdev->hw, &desc[0], 3);
2079         if (ret) {
2080                 dev_err(dev, "failed(%d) to query ROCEE AXI error sts\n", ret);
2081                 return ret;
2082         }
2083
2084         dev_err(dev, "AXI1: %08X %08X %08X %08X %08X %08X\n",
2085                 le32_to_cpu(desc[0].data[0]), le32_to_cpu(desc[0].data[1]),
2086                 le32_to_cpu(desc[0].data[2]), le32_to_cpu(desc[0].data[3]),
2087                 le32_to_cpu(desc[0].data[4]), le32_to_cpu(desc[0].data[5]));
2088         dev_err(dev, "AXI2: %08X %08X %08X %08X %08X %08X\n",
2089                 le32_to_cpu(desc[1].data[0]), le32_to_cpu(desc[1].data[1]),
2090                 le32_to_cpu(desc[1].data[2]), le32_to_cpu(desc[1].data[3]),
2091                 le32_to_cpu(desc[1].data[4]), le32_to_cpu(desc[1].data[5]));
2092         dev_err(dev, "AXI3: %08X %08X %08X %08X\n",
2093                 le32_to_cpu(desc[2].data[0]), le32_to_cpu(desc[2].data[1]),
2094                 le32_to_cpu(desc[2].data[2]), le32_to_cpu(desc[2].data[3]));
2095
2096         return 0;
2097 }
2098
2099 static int hclge_log_rocee_ecc_error(struct hclge_dev *hdev)
2100 {
2101         struct device *dev = &hdev->pdev->dev;
2102         struct hclge_desc desc[2];
2103         int ret;
2104
2105         ret = hclge_cmd_query_error(hdev, &desc[0],
2106                                     HCLGE_QUERY_ROCEE_ECC_RAS_INFO_CMD,
2107                                     HCLGE_CMD_FLAG_NEXT);
2108         if (ret) {
2109                 dev_err(dev, "failed(%d) to query ROCEE ECC error sts\n", ret);
2110                 return ret;
2111         }
2112
2113         dev_err(dev, "ECC1: %08X %08X %08X %08X %08X %08X\n",
2114                 le32_to_cpu(desc[0].data[0]), le32_to_cpu(desc[0].data[1]),
2115                 le32_to_cpu(desc[0].data[2]), le32_to_cpu(desc[0].data[3]),
2116                 le32_to_cpu(desc[0].data[4]), le32_to_cpu(desc[0].data[5]));
2117         dev_err(dev, "ECC2: %08X %08X %08X\n", le32_to_cpu(desc[1].data[0]),
2118                 le32_to_cpu(desc[1].data[1]), le32_to_cpu(desc[1].data[2]));
2119
2120         return 0;
2121 }
2122
2123 static int hclge_log_rocee_ovf_error(struct hclge_dev *hdev)
2124 {
2125         struct device *dev = &hdev->pdev->dev;
2126         struct hclge_desc desc[2];
2127         int ret;
2128
2129         /* read overflow error status */
2130         ret = hclge_cmd_query_error(hdev, &desc[0], HCLGE_ROCEE_PF_RAS_INT_CMD,
2131                                     0);
2132         if (ret) {
2133                 dev_err(dev, "failed(%d) to query ROCEE OVF error sts\n", ret);
2134                 return ret;
2135         }
2136
2137         /* log overflow error */
2138         if (le32_to_cpu(desc[0].data[0]) & HCLGE_ROCEE_OVF_ERR_INT_MASK) {
2139                 const struct hclge_hw_error *err;
2140                 u32 err_sts;
2141
2142                 err = &hclge_rocee_qmm_ovf_err_int[0];
2143                 err_sts = HCLGE_ROCEE_OVF_ERR_TYPE_MASK &
2144                           le32_to_cpu(desc[0].data[0]);
2145                 while (err->msg) {
2146                         if (err->int_msk == err_sts) {
2147                                 dev_err(dev, "%s [error status=0x%x] found\n",
2148                                         err->msg,
2149                                         le32_to_cpu(desc[0].data[0]));
2150                                 break;
2151                         }
2152                         err++;
2153                 }
2154         }
2155
2156         if (le32_to_cpu(desc[0].data[1]) & HCLGE_ROCEE_OVF_ERR_INT_MASK) {
2157                 dev_err(dev, "ROCEE TSP OVF [error status=0x%x] found\n",
2158                         le32_to_cpu(desc[0].data[1]));
2159         }
2160
2161         if (le32_to_cpu(desc[0].data[2]) & HCLGE_ROCEE_OVF_ERR_INT_MASK) {
2162                 dev_err(dev, "ROCEE SCC OVF [error status=0x%x] found\n",
2163                         le32_to_cpu(desc[0].data[2]));
2164         }
2165
2166         return 0;
2167 }
2168
2169 static enum hnae3_reset_type
2170 hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
2171 {
2172         enum hnae3_reset_type reset_type = HNAE3_NONE_RESET;
2173         struct device *dev = &hdev->pdev->dev;
2174         struct hclge_desc desc[2];
2175         unsigned int status;
2176         int ret;
2177
2178         /* read RAS error interrupt status */
2179         ret = hclge_cmd_query_error(hdev, &desc[0],
2180                                     HCLGE_QUERY_CLEAR_ROCEE_RAS_INT, 0);
2181         if (ret) {
2182                 dev_err(dev, "failed(%d) to query ROCEE RAS INT SRC\n", ret);
2183                 /* reset everything for now */
2184                 return HNAE3_GLOBAL_RESET;
2185         }
2186
2187         status = le32_to_cpu(desc[0].data[0]);
2188         if (status & HCLGE_ROCEE_AXI_ERR_INT_MASK) {
2189                 if (status & HCLGE_ROCEE_RERR_INT_MASK)
2190                         dev_err(dev, "ROCEE RAS AXI rresp error\n");
2191
2192                 if (status & HCLGE_ROCEE_BERR_INT_MASK)
2193                         dev_err(dev, "ROCEE RAS AXI bresp error\n");
2194
2195                 reset_type = HNAE3_FUNC_RESET;
2196
2197                 hclge_report_hw_error(hdev, HNAE3_ROCEE_AXI_RESP_ERROR);
2198
2199                 ret = hclge_log_rocee_axi_error(hdev);
2200                 if (ret)
2201                         return HNAE3_GLOBAL_RESET;
2202         }
2203
2204         if (status & HCLGE_ROCEE_ECC_INT_MASK) {
2205                 dev_err(dev, "ROCEE RAS 2bit ECC error\n");
2206                 reset_type = HNAE3_GLOBAL_RESET;
2207
2208                 ret = hclge_log_rocee_ecc_error(hdev);
2209                 if (ret)
2210                         return HNAE3_GLOBAL_RESET;
2211         }
2212
2213         if (status & HCLGE_ROCEE_OVF_INT_MASK) {
2214                 ret = hclge_log_rocee_ovf_error(hdev);
2215                 if (ret) {
2216                         dev_err(dev, "failed(%d) to process ovf error\n", ret);
2217                         /* reset everything for now */
2218                         return HNAE3_GLOBAL_RESET;
2219                 }
2220         }
2221
2222         /* clear error status */
2223         hclge_cmd_reuse_desc(&desc[0], false);
2224         ret = hclge_cmd_send(&hdev->hw, &desc[0], 1);
2225         if (ret) {
2226                 dev_err(dev, "failed(%d) to clear ROCEE RAS error\n", ret);
2227                 /* reset everything for now */
2228                 return HNAE3_GLOBAL_RESET;
2229         }
2230
2231         return reset_type;
2232 }
2233
2234 int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en)
2235 {
2236         struct device *dev = &hdev->pdev->dev;
2237         struct hclge_desc desc;
2238         int ret;
2239
2240         if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
2241             !hnae3_dev_roce_supported(hdev))
2242                 return 0;
2243
2244         hclge_cmd_setup_basic_desc(&desc, HCLGE_CONFIG_ROCEE_RAS_INT_EN, false);
2245         if (en) {
2246                 /* enable ROCEE hw error interrupts */
2247                 desc.data[0] = cpu_to_le32(HCLGE_ROCEE_RAS_NFE_INT_EN);
2248                 desc.data[1] = cpu_to_le32(HCLGE_ROCEE_RAS_CE_INT_EN);
2249
2250                 hclge_log_and_clear_rocee_ras_error(hdev);
2251         }
2252         desc.data[2] = cpu_to_le32(HCLGE_ROCEE_RAS_NFE_INT_EN_MASK);
2253         desc.data[3] = cpu_to_le32(HCLGE_ROCEE_RAS_CE_INT_EN_MASK);
2254
2255         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
2256         if (ret)
2257                 dev_err(dev, "failed(%d) to config ROCEE RAS interrupt\n", ret);
2258
2259         return ret;
2260 }
2261
2262 static void hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev)
2263 {
2264         struct hclge_dev *hdev = ae_dev->priv;
2265         enum hnae3_reset_type reset_type;
2266
2267         if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
2268                 return;
2269
2270         reset_type = hclge_log_and_clear_rocee_ras_error(hdev);
2271         if (reset_type != HNAE3_NONE_RESET)
2272                 set_bit(reset_type, &ae_dev->hw_err_reset_req);
2273 }
2274
2275 static const struct hclge_hw_blk hw_blk[] = {
2276         {
2277                 .msk = BIT(0),
2278                 .name = "IGU_EGU",
2279                 .config_err_int = hclge_config_igu_egu_hw_err_int,
2280         }, {
2281                 .msk = BIT(1),
2282                 .name = "PPP",
2283                 .config_err_int = hclge_config_ppp_hw_err_int,
2284         }, {
2285                 .msk = BIT(2),
2286                 .name = "SSU",
2287                 .config_err_int = hclge_config_ssu_hw_err_int,
2288         }, {
2289                 .msk = BIT(3),
2290                 .name = "PPU",
2291                 .config_err_int = hclge_config_ppu_hw_err_int,
2292         }, {
2293                 .msk = BIT(4),
2294                 .name = "TM",
2295                 .config_err_int = hclge_config_tm_hw_err_int,
2296         }, {
2297                 .msk = BIT(5),
2298                 .name = "COMMON",
2299                 .config_err_int = hclge_config_common_hw_err_int,
2300         }, {
2301                 .msk = BIT(8),
2302                 .name = "MAC",
2303                 .config_err_int = hclge_config_mac_err_int,
2304         }, {
2305                 /* sentinel */
2306         }
2307 };
2308
2309 static void hclge_config_all_msix_error(struct hclge_dev *hdev, bool enable)
2310 {
2311         u32 reg_val;
2312
2313         reg_val = hclge_read_dev(&hdev->hw, HCLGE_PF_OTHER_INT_REG);
2314
2315         if (enable)
2316                 reg_val |= BIT(HCLGE_VECTOR0_ALL_MSIX_ERR_B);
2317         else
2318                 reg_val &= ~BIT(HCLGE_VECTOR0_ALL_MSIX_ERR_B);
2319
2320         hclge_write_dev(&hdev->hw, HCLGE_PF_OTHER_INT_REG, reg_val);
2321 }
2322
2323 int hclge_config_nic_hw_error(struct hclge_dev *hdev, bool state)
2324 {
2325         const struct hclge_hw_blk *module = hw_blk;
2326         int ret = 0;
2327
2328         hclge_config_all_msix_error(hdev, state);
2329
2330         while (module->name) {
2331                 if (module->config_err_int) {
2332                         ret = module->config_err_int(hdev, state);
2333                         if (ret)
2334                                 return ret;
2335                 }
2336                 module++;
2337         }
2338
2339         return ret;
2340 }
2341
2342 pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
2343 {
2344         struct hclge_dev *hdev = ae_dev->priv;
2345         struct device *dev = &hdev->pdev->dev;
2346         u32 status;
2347
2348         if (!test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state)) {
2349                 dev_err(dev,
2350                         "Can't recover - RAS error reported during dev init\n");
2351                 return PCI_ERS_RESULT_NONE;
2352         }
2353
2354         status = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG);
2355         if (status & HCLGE_RAS_REG_NFE_MASK ||
2356             status & HCLGE_RAS_REG_ROCEE_ERR_MASK)
2357                 ae_dev->hw_err_reset_req = 0;
2358         else
2359                 goto out;
2360
2361         /* Handling Non-fatal HNS RAS errors */
2362         if (status & HCLGE_RAS_REG_NFE_MASK) {
2363                 dev_err(dev,
2364                         "HNS Non-Fatal RAS error(status=0x%x) identified\n",
2365                         status);
2366                 hclge_handle_all_ras_errors(hdev);
2367         }
2368
2369         /* Handling Non-fatal Rocee RAS errors */
2370         if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2 &&
2371             status & HCLGE_RAS_REG_ROCEE_ERR_MASK) {
2372                 dev_err(dev, "ROCEE Non-Fatal RAS error identified\n");
2373                 hclge_handle_rocee_ras_error(ae_dev);
2374         }
2375
2376         if (ae_dev->hw_err_reset_req)
2377                 return PCI_ERS_RESULT_NEED_RESET;
2378
2379 out:
2380         return PCI_ERS_RESULT_RECOVERED;
2381 }
2382
2383 static int hclge_clear_hw_msix_error(struct hclge_dev *hdev,
2384                                      struct hclge_desc *desc, bool is_mpf,
2385                                      u32 bd_num)
2386 {
2387         if (is_mpf)
2388                 desc[0].opcode =
2389                         cpu_to_le16(HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT);
2390         else
2391                 desc[0].opcode = cpu_to_le16(HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT);
2392
2393         desc[0].flag = cpu_to_le16(HCLGE_CMD_FLAG_NO_INTR | HCLGE_CMD_FLAG_IN);
2394
2395         return hclge_cmd_send(&hdev->hw, &desc[0], bd_num);
2396 }
2397
2398 /* hclge_query_8bd_info: query information about over_8bd_nfe_err
2399  * @hdev: pointer to struct hclge_dev
2400  * @vf_id: Index of the virtual function with error
2401  * @q_id: Physical index of the queue with error
2402  *
2403  * This function get specific index of queue and function which causes
2404  * over_8bd_nfe_err by using command. If vf_id is 0, it means error is
2405  * caused by PF instead of VF.
2406  */
2407 static int hclge_query_over_8bd_err_info(struct hclge_dev *hdev, u16 *vf_id,
2408                                          u16 *q_id)
2409 {
2410         struct hclge_query_ppu_pf_other_int_dfx_cmd *req;
2411         struct hclge_desc desc;
2412         int ret;
2413
2414         hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PPU_PF_OTHER_INT_DFX, true);
2415         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
2416         if (ret)
2417                 return ret;
2418
2419         req = (struct hclge_query_ppu_pf_other_int_dfx_cmd *)desc.data;
2420         *vf_id = le16_to_cpu(req->over_8bd_no_fe_vf_id);
2421         *q_id = le16_to_cpu(req->over_8bd_no_fe_qid);
2422
2423         return 0;
2424 }
2425
2426 /* hclge_handle_over_8bd_err: handle MSI-X error named over_8bd_nfe_err
2427  * @hdev: pointer to struct hclge_dev
2428  * @reset_requests: reset level that we need to trigger later
2429  *
2430  * over_8bd_nfe_err is a special MSI-X because it may caused by a VF, in
2431  * that case, we need to trigger VF reset. Otherwise, a PF reset is needed.
2432  */
2433 static void hclge_handle_over_8bd_err(struct hclge_dev *hdev,
2434                                       unsigned long *reset_requests)
2435 {
2436         struct device *dev = &hdev->pdev->dev;
2437         u16 vf_id;
2438         u16 q_id;
2439         int ret;
2440
2441         ret = hclge_query_over_8bd_err_info(hdev, &vf_id, &q_id);
2442         if (ret) {
2443                 dev_err(dev, "fail(%d) to query over_8bd_no_fe info\n",
2444                         ret);
2445                 return;
2446         }
2447
2448         dev_err(dev, "PPU_PF_ABNORMAL_INT_ST over_8bd_no_fe found, vport(%u), queue_id(%u)\n",
2449                 vf_id, q_id);
2450
2451         if (vf_id) {
2452                 if (vf_id >= hdev->num_alloc_vport) {
2453                         dev_err(dev, "invalid vport(%u)\n", vf_id);
2454                         return;
2455                 }
2456
2457                 /* If we need to trigger other reset whose level is higher
2458                  * than HNAE3_VF_FUNC_RESET, no need to trigger a VF reset
2459                  * here.
2460                  */
2461                 if (*reset_requests != 0)
2462                         return;
2463
2464                 ret = hclge_inform_reset_assert_to_vf(&hdev->vport[vf_id]);
2465                 if (ret)
2466                         dev_err(dev, "inform reset to vport(%u) failed %d!\n",
2467                                 vf_id, ret);
2468         } else {
2469                 set_bit(HNAE3_FUNC_RESET, reset_requests);
2470         }
2471 }
2472
2473 /* hclge_handle_mpf_msix_error: handle all main PF MSI-X errors
2474  * @hdev: pointer to struct hclge_dev
2475  * @desc: descriptor for describing the command
2476  * @mpf_bd_num: number of extended command structures
2477  * @reset_requests: record of the reset level that we need
2478  *
2479  * This function handles all the main PF MSI-X errors in the hw register/s
2480  * using command.
2481  */
2482 static int hclge_handle_mpf_msix_error(struct hclge_dev *hdev,
2483                                        struct hclge_desc *desc,
2484                                        int mpf_bd_num,
2485                                        unsigned long *reset_requests)
2486 {
2487         struct device *dev = &hdev->pdev->dev;
2488         __le32 *desc_data;
2489         u32 status;
2490         int ret;
2491         /* query all main PF MSIx errors */
2492         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_ALL_MPF_MSIX_INT,
2493                                    true);
2494         ret = hclge_cmd_send(&hdev->hw, &desc[0], mpf_bd_num);
2495         if (ret) {
2496                 dev_err(dev, "query all mpf msix int cmd failed (%d)\n", ret);
2497                 return ret;
2498         }
2499
2500         /* log MAC errors */
2501         desc_data = (__le32 *)&desc[1];
2502         status = le32_to_cpu(*desc_data);
2503         if (status)
2504                 hclge_log_error(dev, "MAC_AFIFO_TNL_INT_R",
2505                                 &hclge_mac_afifo_tnl_int[0], status,
2506                                 reset_requests);
2507
2508         /* log PPU(RCB) MPF errors */
2509         desc_data = (__le32 *)&desc[5];
2510         status = le32_to_cpu(*(desc_data + 2)) &
2511                         HCLGE_PPU_MPF_INT_ST2_MSIX_MASK;
2512         if (status)
2513                 dev_err(dev, "PPU_MPF_ABNORMAL_INT_ST2 rx_q_search_miss found [dfx status=0x%x\n]",
2514                         status);
2515
2516         /* clear all main PF MSIx errors */
2517         ret = hclge_clear_hw_msix_error(hdev, desc, true, mpf_bd_num);
2518         if (ret)
2519                 dev_err(dev, "clear all mpf msix int cmd failed (%d)\n", ret);
2520
2521         return ret;
2522 }
2523
2524 /* hclge_handle_pf_msix_error: handle all PF MSI-X errors
2525  * @hdev: pointer to struct hclge_dev
2526  * @desc: descriptor for describing the command
2527  * @mpf_bd_num: number of extended command structures
2528  * @reset_requests: record of the reset level that we need
2529  *
2530  * This function handles all the PF MSI-X errors in the hw register/s using
2531  * command.
2532  */
2533 static int hclge_handle_pf_msix_error(struct hclge_dev *hdev,
2534                                       struct hclge_desc *desc,
2535                                       int pf_bd_num,
2536                                       unsigned long *reset_requests)
2537 {
2538         struct device *dev = &hdev->pdev->dev;
2539         __le32 *desc_data;
2540         u32 status;
2541         int ret;
2542
2543         /* query all PF MSIx errors */
2544         hclge_cmd_setup_basic_desc(&desc[0], HCLGE_QUERY_CLEAR_ALL_PF_MSIX_INT,
2545                                    true);
2546         ret = hclge_cmd_send(&hdev->hw, &desc[0], pf_bd_num);
2547         if (ret) {
2548                 dev_err(dev, "query all pf msix int cmd failed (%d)\n", ret);
2549                 return ret;
2550         }
2551
2552         /* log SSU PF errors */
2553         status = le32_to_cpu(desc[0].data[0]) & HCLGE_SSU_PORT_INT_MSIX_MASK;
2554         if (status)
2555                 hclge_log_error(dev, "SSU_PORT_BASED_ERR_INT",
2556                                 &hclge_ssu_port_based_pf_int[0],
2557                                 status, reset_requests);
2558
2559         /* read and log PPP PF errors */
2560         desc_data = (__le32 *)&desc[2];
2561         status = le32_to_cpu(*desc_data);
2562         if (status)
2563                 hclge_log_error(dev, "PPP_PF_ABNORMAL_INT_ST0",
2564                                 &hclge_ppp_pf_abnormal_int[0],
2565                                 status, reset_requests);
2566
2567         /* log PPU(RCB) PF errors */
2568         desc_data = (__le32 *)&desc[3];
2569         status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_INT_MSIX_MASK;
2570         if (status)
2571                 hclge_log_error(dev, "PPU_PF_ABNORMAL_INT_ST",
2572                                 &hclge_ppu_pf_abnormal_int[0],
2573                                 status, reset_requests);
2574
2575         status = le32_to_cpu(*desc_data) & HCLGE_PPU_PF_OVER_8BD_ERR_MASK;
2576         if (status)
2577                 hclge_handle_over_8bd_err(hdev, reset_requests);
2578
2579         /* clear all PF MSIx errors */
2580         ret = hclge_clear_hw_msix_error(hdev, desc, false, pf_bd_num);
2581         if (ret)
2582                 dev_err(dev, "clear all pf msix int cmd failed (%d)\n", ret);
2583
2584         return ret;
2585 }
2586
2587 static int hclge_handle_all_hw_msix_error(struct hclge_dev *hdev,
2588                                           unsigned long *reset_requests)
2589 {
2590         u32 mpf_bd_num, pf_bd_num, bd_num;
2591         struct hclge_desc *desc;
2592         int ret;
2593
2594         /* query the number of bds for the MSIx int status */
2595         ret = hclge_query_bd_num(hdev, false, &mpf_bd_num, &pf_bd_num);
2596         if (ret)
2597                 goto out;
2598
2599         bd_num = max_t(u32, mpf_bd_num, pf_bd_num);
2600         desc = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);
2601         if (!desc)
2602                 return -ENOMEM;
2603
2604         ret = hclge_handle_mpf_msix_error(hdev, desc, mpf_bd_num,
2605                                           reset_requests);
2606         if (ret)
2607                 goto msi_error;
2608
2609         memset(desc, 0, bd_num * sizeof(struct hclge_desc));
2610         ret = hclge_handle_pf_msix_error(hdev, desc, pf_bd_num, reset_requests);
2611         if (ret)
2612                 goto msi_error;
2613
2614         ret = hclge_handle_mac_tnl(hdev);
2615
2616 msi_error:
2617         kfree(desc);
2618 out:
2619         return ret;
2620 }
2621
2622 int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
2623                                unsigned long *reset_requests)
2624 {
2625         struct device *dev = &hdev->pdev->dev;
2626
2627         if (!test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state)) {
2628                 dev_err(dev,
2629                         "failed to handle msix error during dev init\n");
2630                 return -EAGAIN;
2631         }
2632
2633         return hclge_handle_all_hw_msix_error(hdev, reset_requests);
2634 }
2635
2636 int hclge_handle_mac_tnl(struct hclge_dev *hdev)
2637 {
2638         struct hclge_mac_tnl_stats mac_tnl_stats;
2639         struct device *dev = &hdev->pdev->dev;
2640         struct hclge_desc desc;
2641         u32 status;
2642         int ret;
2643
2644         /* query and clear mac tnl interruptions */
2645         hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_MAC_TNL_INT, true);
2646         ret = hclge_cmd_send(&hdev->hw, &desc, 1);
2647         if (ret) {
2648                 dev_err(dev, "failed to query mac tnl int, ret = %d.\n", ret);
2649                 return ret;
2650         }
2651
2652         status = le32_to_cpu(desc.data[0]);
2653         if (status) {
2654                 /* When mac tnl interrupt occurs, we record current time and
2655                  * register status here in a fifo, then clear the status. So
2656                  * that if link status changes suddenly at some time, we can
2657                  * query them by debugfs.
2658                  */
2659                 mac_tnl_stats.time = local_clock();
2660                 mac_tnl_stats.status = status;
2661                 kfifo_put(&hdev->mac_tnl_log, mac_tnl_stats);
2662                 ret = hclge_clear_mac_tnl_int(hdev);
2663                 if (ret)
2664                         dev_err(dev, "failed to clear mac tnl int, ret = %d.\n",
2665                                 ret);
2666         }
2667
2668         return ret;
2669 }
2670
2671 void hclge_handle_all_hns_hw_errors(struct hnae3_ae_dev *ae_dev)
2672 {
2673         struct hclge_dev *hdev = ae_dev->priv;
2674         struct device *dev = &hdev->pdev->dev;
2675         u32 mpf_bd_num, pf_bd_num, bd_num;
2676         struct hclge_desc *desc;
2677         u32 status;
2678         int ret;
2679
2680         ae_dev->hw_err_reset_req = 0;
2681         status = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG);
2682
2683         /* query the number of bds for the MSIx int status */
2684         ret = hclge_query_bd_num(hdev, false, &mpf_bd_num, &pf_bd_num);
2685         if (ret)
2686                 return;
2687
2688         bd_num = max_t(u32, mpf_bd_num, pf_bd_num);
2689         desc = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);
2690         if (!desc)
2691                 return;
2692
2693         /* Clear HNS hw errors reported through msix  */
2694         memset(&desc[0].data[0], 0xFF, mpf_bd_num * sizeof(struct hclge_desc) -
2695                HCLGE_DESC_NO_DATA_LEN);
2696         ret = hclge_clear_hw_msix_error(hdev, desc, true, mpf_bd_num);
2697         if (ret) {
2698                 dev_err(dev, "fail(%d) to clear mpf msix int during init\n",
2699                         ret);
2700                 goto msi_error;
2701         }
2702
2703         memset(&desc[0].data[0], 0xFF, pf_bd_num * sizeof(struct hclge_desc) -
2704                HCLGE_DESC_NO_DATA_LEN);
2705         ret = hclge_clear_hw_msix_error(hdev, desc, false, pf_bd_num);
2706         if (ret) {
2707                 dev_err(dev, "fail(%d) to clear pf msix int during init\n",
2708                         ret);
2709                 goto msi_error;
2710         }
2711
2712         /* Handle Non-fatal HNS RAS errors */
2713         if (status & HCLGE_RAS_REG_NFE_MASK) {
2714                 dev_err(dev, "HNS hw error(RAS) identified during init\n");
2715                 hclge_handle_all_ras_errors(hdev);
2716         }
2717
2718 msi_error:
2719         kfree(desc);
2720 }
2721
2722 bool hclge_find_error_source(struct hclge_dev *hdev)
2723 {
2724         u32 msix_src_flag, hw_err_src_flag;
2725
2726         msix_src_flag = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS) &
2727                         HCLGE_VECTOR0_REG_MSIX_MASK;
2728
2729         hw_err_src_flag = hclge_read_dev(&hdev->hw,
2730                                          HCLGE_RAS_PF_OTHER_INT_STS_REG) &
2731                           HCLGE_RAS_REG_ERR_MASK;
2732
2733         return msix_src_flag || hw_err_src_flag;
2734 }
2735
2736 void hclge_handle_occurred_error(struct hclge_dev *hdev)
2737 {
2738         struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
2739
2740         if (hclge_find_error_source(hdev))
2741                 hclge_handle_error_info_log(ae_dev);
2742 }
2743
2744 static void
2745 hclge_handle_error_type_reg_log(struct device *dev,
2746                                 struct hclge_mod_err_info *mod_info,
2747                                 struct hclge_type_reg_err_info *type_reg_info)
2748 {
2749 #define HCLGE_ERR_TYPE_MASK 0x7F
2750 #define HCLGE_ERR_TYPE_IS_RAS_OFFSET 7
2751
2752         u8 mod_id, total_module, type_id, total_type, i, is_ras;
2753         u8 index_module = MODULE_NONE;
2754         u8 index_type = NONE_ERROR;
2755
2756         mod_id = mod_info->mod_id;
2757         type_id = type_reg_info->type_id & HCLGE_ERR_TYPE_MASK;
2758         is_ras = type_reg_info->type_id >> HCLGE_ERR_TYPE_IS_RAS_OFFSET;
2759
2760         total_module = ARRAY_SIZE(hclge_hw_module_id_st);
2761         total_type = ARRAY_SIZE(hclge_hw_type_id_st);
2762
2763         for (i = 0; i < total_module; i++) {
2764                 if (mod_id == hclge_hw_module_id_st[i].module_id) {
2765                         index_module = i;
2766                         break;
2767                 }
2768         }
2769
2770         for (i = 0; i < total_type; i++) {
2771                 if (type_id == hclge_hw_type_id_st[i].type_id) {
2772                         index_type = i;
2773                         break;
2774                 }
2775         }
2776
2777         if (index_module != MODULE_NONE && index_type != NONE_ERROR)
2778                 dev_err(dev,
2779                         "found %s %s, is %s error.\n",
2780                         hclge_hw_module_id_st[index_module].msg,
2781                         hclge_hw_type_id_st[index_type].msg,
2782                         is_ras ? "ras" : "msix");
2783         else
2784                 dev_err(dev,
2785                         "unknown module[%u] or type[%u].\n", mod_id, type_id);
2786
2787         dev_err(dev, "reg_value:\n");
2788         for (i = 0; i < type_reg_info->reg_num; i++)
2789                 dev_err(dev, "0x%08x\n", type_reg_info->hclge_reg[i]);
2790 }
2791
2792 static void hclge_handle_error_module_log(struct hnae3_ae_dev *ae_dev,
2793                                           const u32 *buf, u32 buf_size)
2794 {
2795         struct hclge_type_reg_err_info *type_reg_info;
2796         struct hclge_dev *hdev = ae_dev->priv;
2797         struct device *dev = &hdev->pdev->dev;
2798         struct hclge_mod_err_info *mod_info;
2799         struct hclge_sum_err_info *sum_info;
2800         u8 mod_num, err_num, i;
2801         u32 offset = 0;
2802
2803         sum_info = (struct hclge_sum_err_info *)&buf[offset++];
2804         if (sum_info->reset_type &&
2805             sum_info->reset_type != HNAE3_NONE_RESET)
2806                 set_bit(sum_info->reset_type, &ae_dev->hw_err_reset_req);
2807         mod_num = sum_info->mod_num;
2808
2809         while (mod_num--) {
2810                 if (offset >= buf_size) {
2811                         dev_err(dev, "The offset(%u) exceeds buf's size(%u).\n",
2812                                 offset, buf_size);
2813                         return;
2814                 }
2815                 mod_info = (struct hclge_mod_err_info *)&buf[offset++];
2816                 err_num = mod_info->err_num;
2817
2818                 for (i = 0; i < err_num; i++) {
2819                         if (offset >= buf_size) {
2820                                 dev_err(dev,
2821                                         "The offset(%u) exceeds buf size(%u).\n",
2822                                         offset, buf_size);
2823                                 return;
2824                         }
2825
2826                         type_reg_info = (struct hclge_type_reg_err_info *)
2827                                             &buf[offset++];
2828                         hclge_handle_error_type_reg_log(dev, mod_info,
2829                                                         type_reg_info);
2830
2831                         offset += type_reg_info->reg_num;
2832                 }
2833         }
2834 }
2835
2836 static int hclge_query_all_err_bd_num(struct hclge_dev *hdev, u32 *bd_num)
2837 {
2838         struct device *dev = &hdev->pdev->dev;
2839         struct hclge_desc desc_bd;
2840         int ret;
2841
2842         hclge_cmd_setup_basic_desc(&desc_bd, HCLGE_QUERY_ALL_ERR_BD_NUM, true);
2843         ret = hclge_cmd_send(&hdev->hw, &desc_bd, 1);
2844         if (ret) {
2845                 dev_err(dev, "failed to query error bd_num, ret = %d.\n", ret);
2846                 return ret;
2847         }
2848
2849         *bd_num = le32_to_cpu(desc_bd.data[0]);
2850         if (!(*bd_num)) {
2851                 dev_err(dev, "The value of bd_num is 0!\n");
2852                 return -EINVAL;
2853         }
2854
2855         return 0;
2856 }
2857
2858 static int hclge_query_all_err_info(struct hclge_dev *hdev,
2859                                     struct hclge_desc *desc, u32 bd_num)
2860 {
2861         struct device *dev = &hdev->pdev->dev;
2862         int ret;
2863
2864         hclge_cmd_setup_basic_desc(desc, HCLGE_QUERY_ALL_ERR_INFO, true);
2865         ret = hclge_cmd_send(&hdev->hw, desc, bd_num);
2866         if (ret)
2867                 dev_err(dev, "failed to query error info, ret = %d.\n", ret);
2868
2869         return ret;
2870 }
2871
2872 int hclge_handle_error_info_log(struct hnae3_ae_dev *ae_dev)
2873 {
2874         u32 bd_num, desc_len, buf_len, buf_size, i;
2875         struct hclge_dev *hdev = ae_dev->priv;
2876         struct hclge_desc *desc;
2877         __le32 *desc_data;
2878         u32 *buf;
2879         int ret;
2880
2881         ret = hclge_query_all_err_bd_num(hdev, &bd_num);
2882         if (ret)
2883                 goto out;
2884
2885         desc_len = bd_num * sizeof(struct hclge_desc);
2886         desc = kzalloc(desc_len, GFP_KERNEL);
2887         if (!desc) {
2888                 ret = -ENOMEM;
2889                 goto out;
2890         }
2891
2892         ret = hclge_query_all_err_info(hdev, desc, bd_num);
2893         if (ret)
2894                 goto err_desc;
2895
2896         buf_len = bd_num * sizeof(struct hclge_desc) - HCLGE_DESC_NO_DATA_LEN;
2897         buf_size = buf_len / sizeof(u32);
2898
2899         desc_data = kzalloc(buf_len, GFP_KERNEL);
2900         if (!desc_data) {
2901                 ret = -ENOMEM;
2902                 goto err_desc;
2903         }
2904
2905         buf = kzalloc(buf_len, GFP_KERNEL);
2906         if (!buf) {
2907                 ret = -ENOMEM;
2908                 goto err_buf_alloc;
2909         }
2910
2911         memcpy(desc_data, &desc[0].data[0], buf_len);
2912         for (i = 0; i < buf_size; i++)
2913                 buf[i] = le32_to_cpu(desc_data[i]);
2914
2915         hclge_handle_error_module_log(ae_dev, buf, buf_size);
2916         kfree(buf);
2917
2918 err_buf_alloc:
2919         kfree(desc_data);
2920 err_desc:
2921         kfree(desc);
2922 out:
2923         return ret;
2924 }