@@ -85,6 +85,30 @@ static const struct hclge_hw_error hclge_tqp_int_ecc_int[] = {
85
85
{ /* sentinel */ }
86
86
};
87
87
88
+ static const struct hclge_hw_error hclge_igu_com_err_int [] = {
89
+ { .int_msk = BIT (0 ), .msg = "igu_rx_buf0_ecc_mbit_err" },
90
+ { .int_msk = BIT (1 ), .msg = "igu_rx_buf0_ecc_1bit_err" },
91
+ { .int_msk = BIT (2 ), .msg = "igu_rx_buf1_ecc_mbit_err" },
92
+ { .int_msk = BIT (3 ), .msg = "igu_rx_buf1_ecc_1bit_err" },
93
+ { /* sentinel */ }
94
+ };
95
+
96
+ static const struct hclge_hw_error hclge_igu_egu_tnl_err_int [] = {
97
+ { .int_msk = BIT (0 ), .msg = "rx_buf_overflow" },
98
+ { .int_msk = BIT (1 ), .msg = "rx_stp_fifo_overflow" },
99
+ { .int_msk = BIT (2 ), .msg = "rx_stp_fifo_undeflow" },
100
+ { .int_msk = BIT (3 ), .msg = "tx_buf_overflow" },
101
+ { .int_msk = BIT (4 ), .msg = "tx_buf_underrun" },
102
+ { .int_msk = BIT (5 ), .msg = "rx_stp_buf_overflow" },
103
+ { /* sentinel */ }
104
+ };
105
+
106
+ static const struct hclge_hw_error hclge_ncsi_err_int [] = {
107
+ { .int_msk = BIT (0 ), .msg = "ncsi_tx_ecc_1bit_err" },
108
+ { .int_msk = BIT (1 ), .msg = "ncsi_tx_ecc_mbit_err" },
109
+ { /* sentinel */ }
110
+ };
111
+
88
112
static void hclge_log_error (struct device * dev ,
89
113
const struct hclge_hw_error * err_list ,
90
114
u32 err_sts )
@@ -229,6 +253,75 @@ static int hclge_enable_common_error(struct hclge_dev *hdev, bool en)
229
253
return ret ;
230
254
}
231
255
256
+ static int hclge_enable_ncsi_error (struct hclge_dev * hdev , bool en )
257
+ {
258
+ struct device * dev = & hdev -> pdev -> dev ;
259
+ struct hclge_desc desc ;
260
+ int ret ;
261
+
262
+ if (hdev -> pdev -> revision < 0x21 )
263
+ return 0 ;
264
+
265
+ /* enable/disable NCSI error interrupts */
266
+ hclge_cmd_setup_basic_desc (& desc , HCLGE_NCSI_INT_EN , false);
267
+ if (en )
268
+ desc .data [0 ] = cpu_to_le32 (HCLGE_NCSI_ERR_INT_EN );
269
+ else
270
+ desc .data [0 ] = 0 ;
271
+
272
+ ret = hclge_cmd_send (& hdev -> hw , & desc , 1 );
273
+ if (ret )
274
+ dev_err (dev ,
275
+ "failed(%d) to enable/disable NCSI error interrupts\n" ,
276
+ ret );
277
+
278
+ return ret ;
279
+ }
280
+
281
+ static int hclge_enable_igu_egu_error (struct hclge_dev * hdev , bool en )
282
+ {
283
+ struct device * dev = & hdev -> pdev -> dev ;
284
+ struct hclge_desc desc ;
285
+ int ret ;
286
+
287
+ /* enable/disable error interrupts */
288
+ hclge_cmd_setup_basic_desc (& desc , HCLGE_IGU_COMMON_INT_EN , false);
289
+ if (en )
290
+ desc .data [0 ] = cpu_to_le32 (HCLGE_IGU_ERR_INT_EN );
291
+ else
292
+ desc .data [0 ] = 0 ;
293
+ desc .data [1 ] = cpu_to_le32 (HCLGE_IGU_ERR_INT_EN_MASK );
294
+
295
+ ret = hclge_cmd_send (& hdev -> hw , & desc , 1 );
296
+ if (ret ) {
297
+ dev_err (dev ,
298
+ "failed(%d) to enable/disable IGU common interrupts\n" ,
299
+ ret );
300
+ return ret ;
301
+ }
302
+
303
+ hclge_cmd_setup_basic_desc (& desc , HCLGE_IGU_EGU_TNL_INT_EN , false);
304
+ if (en )
305
+ desc .data [0 ] = cpu_to_le32 (HCLGE_IGU_TNL_ERR_INT_EN );
306
+ else
307
+ desc .data [0 ] = 0 ;
308
+ desc .data [1 ] = cpu_to_le32 (HCLGE_IGU_TNL_ERR_INT_EN_MASK );
309
+
310
+ ret = hclge_cmd_send (& hdev -> hw , & desc , 1 );
311
+ if (ret ) {
312
+ dev_err (dev ,
313
+ "failed(%d) to enable/disable IGU-EGU TNL interrupts\n" ,
314
+ ret );
315
+ return ret ;
316
+ }
317
+
318
+ ret = hclge_enable_ncsi_error (hdev , en );
319
+ if (ret )
320
+ dev_err (dev , "fail(%d) to en/disable err int\n" , ret );
321
+
322
+ return ret ;
323
+ }
324
+
232
325
static void hclge_process_common_error (struct hclge_dev * hdev ,
233
326
enum hclge_err_int_type type )
234
327
{
@@ -285,7 +378,104 @@ static void hclge_process_common_error(struct hclge_dev *hdev,
285
378
ret );
286
379
}
287
380
381
+ static void hclge_process_ncsi_error (struct hclge_dev * hdev ,
382
+ enum hclge_err_int_type type )
383
+ {
384
+ struct device * dev = & hdev -> pdev -> dev ;
385
+ struct hclge_desc desc_rd ;
386
+ struct hclge_desc desc_wr ;
387
+ u32 err_sts ;
388
+ int ret ;
389
+
390
+ if (hdev -> pdev -> revision < 0x21 )
391
+ return ;
392
+
393
+ /* read NCSI error status */
394
+ ret = hclge_cmd_query_error (hdev , & desc_rd , HCLGE_NCSI_INT_QUERY ,
395
+ 0 , 1 , HCLGE_NCSI_ERR_INT_TYPE );
396
+ if (ret ) {
397
+ dev_err (dev ,
398
+ "failed(=%d) to query NCSI error interrupt status\n" ,
399
+ ret );
400
+ return ;
401
+ }
402
+
403
+ /* log err */
404
+ err_sts = le32_to_cpu (desc_rd .data [0 ]);
405
+ hclge_log_error (dev , & hclge_ncsi_err_int [0 ], err_sts );
406
+
407
+ /* clear err int */
408
+ ret = hclge_cmd_clear_error (hdev , & desc_wr , & desc_rd ,
409
+ HCLGE_NCSI_INT_CLR , 0 );
410
+ if (ret )
411
+ dev_err (dev , "failed(=%d) to clear NCSI intrerrupt status\n" ,
412
+ ret );
413
+ }
414
+
415
+ static void hclge_process_igu_egu_error (struct hclge_dev * hdev ,
416
+ enum hclge_err_int_type int_type )
417
+ {
418
+ struct device * dev = & hdev -> pdev -> dev ;
419
+ struct hclge_desc desc_rd ;
420
+ struct hclge_desc desc_wr ;
421
+ u32 err_sts ;
422
+ int ret ;
423
+
424
+ /* read IGU common err sts */
425
+ ret = hclge_cmd_query_error (hdev , & desc_rd ,
426
+ HCLGE_IGU_COMMON_INT_QUERY ,
427
+ 0 , 1 , int_type );
428
+ if (ret ) {
429
+ dev_err (dev , "failed(=%d) to query IGU common int status\n" ,
430
+ ret );
431
+ return ;
432
+ }
433
+
434
+ /* log err */
435
+ err_sts = le32_to_cpu (desc_rd .data [0 ]) &
436
+ HCLGE_IGU_COM_INT_MASK ;
437
+ hclge_log_error (dev , & hclge_igu_com_err_int [0 ], err_sts );
438
+
439
+ /* clear err int */
440
+ ret = hclge_cmd_clear_error (hdev , & desc_wr , & desc_rd ,
441
+ HCLGE_IGU_COMMON_INT_CLR , 0 );
442
+ if (ret ) {
443
+ dev_err (dev , "failed(=%d) to clear IGU common int status\n" ,
444
+ ret );
445
+ return ;
446
+ }
447
+
448
+ /* read IGU-EGU TNL err sts */
449
+ ret = hclge_cmd_query_error (hdev , & desc_rd ,
450
+ HCLGE_IGU_EGU_TNL_INT_QUERY ,
451
+ 0 , 1 , int_type );
452
+ if (ret ) {
453
+ dev_err (dev , "failed(=%d) to query IGU-EGU TNL int status\n" ,
454
+ ret );
455
+ return ;
456
+ }
457
+
458
+ /* log err */
459
+ err_sts = le32_to_cpu (desc_rd .data [0 ]) &
460
+ HCLGE_IGU_EGU_TNL_INT_MASK ;
461
+ hclge_log_error (dev , & hclge_igu_egu_tnl_err_int [0 ], err_sts );
462
+
463
+ /* clear err int */
464
+ ret = hclge_cmd_clear_error (hdev , & desc_wr , & desc_rd ,
465
+ HCLGE_IGU_EGU_TNL_INT_CLR , 0 );
466
+ if (ret ) {
467
+ dev_err (dev , "failed(=%d) to clear IGU-EGU TNL int status\n" ,
468
+ ret );
469
+ return ;
470
+ }
471
+
472
+ hclge_process_ncsi_error (hdev , HCLGE_ERR_INT_RAS_NFE );
473
+ }
474
+
288
475
static const struct hclge_hw_blk hw_blk [] = {
476
+ { .msk = BIT (0 ), .name = "IGU_EGU" ,
477
+ .enable_error = hclge_enable_igu_egu_error ,
478
+ .process_error = hclge_process_igu_egu_error , },
289
479
{ .msk = BIT (5 ), .name = "COMMON" ,
290
480
.enable_error = hclge_enable_common_error ,
291
481
.process_error = hclge_process_common_error , },
0 commit comments