@@ -263,6 +263,80 @@ static const struct hclge_hw_error hclge_ppu_pf_abnormal_int[] = {
263
263
{ /* sentinel */ }
264
264
};
265
265
266
+ static const struct hclge_hw_error hclge_ssu_com_err_int [] = {
267
+ { .int_msk = BIT (0 ), .msg = "buf_sum_err" },
268
+ { .int_msk = BIT (1 ), .msg = "ppp_mb_num_err" },
269
+ { .int_msk = BIT (2 ), .msg = "ppp_mbid_err" },
270
+ { .int_msk = BIT (3 ), .msg = "ppp_rlt_mac_err" },
271
+ { .int_msk = BIT (4 ), .msg = "ppp_rlt_host_err" },
272
+ { .int_msk = BIT (5 ), .msg = "cks_edit_position_err" },
273
+ { .int_msk = BIT (6 ), .msg = "cks_edit_condition_err" },
274
+ { .int_msk = BIT (7 ), .msg = "vlan_edit_condition_err" },
275
+ { .int_msk = BIT (8 ), .msg = "vlan_num_ot_err" },
276
+ { .int_msk = BIT (9 ), .msg = "vlan_num_in_err" },
277
+ { /* sentinel */ }
278
+ };
279
+
280
+ static const struct hclge_hw_error hclge_ssu_port_based_err_int [] = {
281
+ { .int_msk = BIT (0 ), .msg = "roc_pkt_without_key_port" },
282
+ { .int_msk = BIT (1 ), .msg = "tpu_pkt_without_key_port" },
283
+ { .int_msk = BIT (2 ), .msg = "igu_pkt_without_key_port" },
284
+ { .int_msk = BIT (3 ), .msg = "roc_eof_mis_match_port" },
285
+ { .int_msk = BIT (4 ), .msg = "tpu_eof_mis_match_port" },
286
+ { .int_msk = BIT (5 ), .msg = "igu_eof_mis_match_port" },
287
+ { .int_msk = BIT (6 ), .msg = "roc_sof_mis_match_port" },
288
+ { .int_msk = BIT (7 ), .msg = "tpu_sof_mis_match_port" },
289
+ { .int_msk = BIT (8 ), .msg = "igu_sof_mis_match_port" },
290
+ { .int_msk = BIT (11 ), .msg = "ets_rd_int_rx_port" },
291
+ { .int_msk = BIT (12 ), .msg = "ets_wr_int_rx_port" },
292
+ { .int_msk = BIT (13 ), .msg = "ets_rd_int_tx_port" },
293
+ { .int_msk = BIT (14 ), .msg = "ets_wr_int_tx_port" },
294
+ { /* sentinel */ }
295
+ };
296
+
297
+ static const struct hclge_hw_error hclge_ssu_fifo_overflow_int [] = {
298
+ { .int_msk = BIT (0 ), .msg = "ig_mac_inf_int" },
299
+ { .int_msk = BIT (1 ), .msg = "ig_host_inf_int" },
300
+ { .int_msk = BIT (2 ), .msg = "ig_roc_buf_int" },
301
+ { .int_msk = BIT (3 ), .msg = "ig_host_data_fifo_int" },
302
+ { .int_msk = BIT (4 ), .msg = "ig_host_key_fifo_int" },
303
+ { .int_msk = BIT (5 ), .msg = "tx_qcn_fifo_int" },
304
+ { .int_msk = BIT (6 ), .msg = "rx_qcn_fifo_int" },
305
+ { .int_msk = BIT (7 ), .msg = "tx_pf_rd_fifo_int" },
306
+ { .int_msk = BIT (8 ), .msg = "rx_pf_rd_fifo_int" },
307
+ { .int_msk = BIT (9 ), .msg = "qm_eof_fifo_int" },
308
+ { .int_msk = BIT (10 ), .msg = "mb_rlt_fifo_int" },
309
+ { .int_msk = BIT (11 ), .msg = "dup_uncopy_fifo_int" },
310
+ { .int_msk = BIT (12 ), .msg = "dup_cnt_rd_fifo_int" },
311
+ { .int_msk = BIT (13 ), .msg = "dup_cnt_drop_fifo_int" },
312
+ { .int_msk = BIT (14 ), .msg = "dup_cnt_wrb_fifo_int" },
313
+ { .int_msk = BIT (15 ), .msg = "host_cmd_fifo_int" },
314
+ { .int_msk = BIT (16 ), .msg = "mac_cmd_fifo_int" },
315
+ { .int_msk = BIT (17 ), .msg = "host_cmd_bitmap_empty_int" },
316
+ { .int_msk = BIT (18 ), .msg = "mac_cmd_bitmap_empty_int" },
317
+ { .int_msk = BIT (19 ), .msg = "dup_bitmap_empty_int" },
318
+ { .int_msk = BIT (20 ), .msg = "out_queue_bitmap_empty_int" },
319
+ { .int_msk = BIT (21 ), .msg = "bank2_bitmap_empty_int" },
320
+ { .int_msk = BIT (22 ), .msg = "bank1_bitmap_empty_int" },
321
+ { .int_msk = BIT (23 ), .msg = "bank0_bitmap_empty_int" },
322
+ { /* sentinel */ }
323
+ };
324
+
325
+ static const struct hclge_hw_error hclge_ssu_ets_tcg_int [] = {
326
+ { .int_msk = BIT (0 ), .msg = "ets_rd_int_rx_tcg" },
327
+ { .int_msk = BIT (1 ), .msg = "ets_wr_int_rx_tcg" },
328
+ { .int_msk = BIT (2 ), .msg = "ets_rd_int_tx_tcg" },
329
+ { .int_msk = BIT (3 ), .msg = "ets_wr_int_tx_tcg" },
330
+ { /* sentinel */ }
331
+ };
332
+
333
+ static const struct hclge_hw_error hclge_ssu_port_based_pf_int [] = {
334
+ { .int_msk = BIT (0 ), .msg = "roc_pkt_without_key_port" },
335
+ { .int_msk = BIT (9 ), .msg = "low_water_line_err_port" },
336
+ { .int_msk = BIT (10 ), .msg = "hi_water_line_err_port" },
337
+ { /* sentinel */ }
338
+ };
339
+
266
340
static void hclge_log_error (struct device * dev , char * reg ,
267
341
const struct hclge_hw_error * err ,
268
342
u32 err_sts )
@@ -606,6 +680,63 @@ static int hclge_config_ppu_hw_err_int(struct hclge_dev *hdev, bool en)
606
680
return ret ;
607
681
}
608
682
683
+ static int hclge_config_ssu_hw_err_int (struct hclge_dev * hdev , bool en )
684
+ {
685
+ struct device * dev = & hdev -> pdev -> dev ;
686
+ struct hclge_desc desc [2 ];
687
+ int ret ;
688
+
689
+ /* configure SSU ecc error interrupts */
690
+ hclge_cmd_setup_basic_desc (& desc [0 ], HCLGE_SSU_ECC_INT_CMD , false);
691
+ desc [0 ].flag |= cpu_to_le16 (HCLGE_CMD_FLAG_NEXT );
692
+ hclge_cmd_setup_basic_desc (& desc [1 ], HCLGE_SSU_ECC_INT_CMD , false);
693
+ if (en ) {
694
+ desc [0 ].data [0 ] = cpu_to_le32 (HCLGE_SSU_1BIT_ECC_ERR_INT_EN );
695
+ desc [0 ].data [1 ] =
696
+ cpu_to_le32 (HCLGE_SSU_MULTI_BIT_ECC_ERR_INT_EN );
697
+ desc [0 ].data [4 ] = cpu_to_le32 (HCLGE_SSU_BIT32_ECC_ERR_INT_EN );
698
+ }
699
+
700
+ desc [1 ].data [0 ] = cpu_to_le32 (HCLGE_SSU_1BIT_ECC_ERR_INT_EN_MASK );
701
+ desc [1 ].data [1 ] = cpu_to_le32 (HCLGE_SSU_MULTI_BIT_ECC_ERR_INT_EN_MASK );
702
+ desc [1 ].data [2 ] = cpu_to_le32 (HCLGE_SSU_BIT32_ECC_ERR_INT_EN_MASK );
703
+
704
+ ret = hclge_cmd_send (& hdev -> hw , & desc [0 ], 2 );
705
+ if (ret ) {
706
+ dev_err (dev ,
707
+ "fail(%d) to configure SSU ECC error interrupt\n" , ret );
708
+ return ret ;
709
+ }
710
+
711
+ /* configure SSU common error interrupts */
712
+ hclge_cmd_setup_basic_desc (& desc [0 ], HCLGE_SSU_COMMON_INT_CMD , false);
713
+ desc [0 ].flag |= cpu_to_le16 (HCLGE_CMD_FLAG_NEXT );
714
+ hclge_cmd_setup_basic_desc (& desc [1 ], HCLGE_SSU_COMMON_INT_CMD , false);
715
+
716
+ if (en ) {
717
+ if (hdev -> pdev -> revision >= 0x21 )
718
+ desc [0 ].data [0 ] =
719
+ cpu_to_le32 (HCLGE_SSU_COMMON_INT_EN );
720
+ else
721
+ desc [0 ].data [0 ] =
722
+ cpu_to_le32 (HCLGE_SSU_COMMON_INT_EN & ~BIT (5 ));
723
+ desc [0 ].data [1 ] = cpu_to_le32 (HCLGE_SSU_PORT_BASED_ERR_INT_EN );
724
+ desc [0 ].data [2 ] =
725
+ cpu_to_le32 (HCLGE_SSU_FIFO_OVERFLOW_ERR_INT_EN );
726
+ }
727
+
728
+ desc [1 ].data [0 ] = cpu_to_le32 (HCLGE_SSU_COMMON_INT_EN_MASK |
729
+ HCLGE_SSU_PORT_BASED_ERR_INT_EN_MASK );
730
+ desc [1 ].data [1 ] = cpu_to_le32 (HCLGE_SSU_FIFO_OVERFLOW_ERR_INT_EN_MASK );
731
+
732
+ ret = hclge_cmd_send (& hdev -> hw , & desc [0 ], 2 );
733
+ if (ret )
734
+ dev_err (dev ,
735
+ "fail(%d) to configure SSU COMMON error intr\n" , ret );
736
+
737
+ return ret ;
738
+ }
739
+
609
740
#define HCLGE_SET_DEFAULT_RESET_REQUEST (reset_type ) \
610
741
do { \
611
742
if (ae_dev->ops->set_default_reset_request) \
@@ -676,6 +807,27 @@ static int hclge_handle_mpf_ras_error(struct hclge_dev *hdev,
676
807
HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_CORE_RESET );
677
808
}
678
809
810
+ /* log SSU(Storage Switch Unit) errors */
811
+ desc_data = (__le32 * )& desc [2 ];
812
+ status = le32_to_cpu (* (desc_data + 2 ));
813
+ if (status ) {
814
+ dev_warn (dev , "SSU_ECC_MULTI_BIT_INT_0 ssu_ecc_mbit_int[31:0]\n" );
815
+ HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_CORE_RESET );
816
+ }
817
+
818
+ status = le32_to_cpu (* (desc_data + 3 )) & BIT (0 );
819
+ if (status ) {
820
+ dev_warn (dev , "SSU_ECC_MULTI_BIT_INT_1 ssu_ecc_mbit_int[32]\n" );
821
+ HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_CORE_RESET );
822
+ }
823
+
824
+ status = le32_to_cpu (* (desc_data + 4 )) & HCLGE_SSU_COMMON_ERR_INT_MASK ;
825
+ if (status ) {
826
+ hclge_log_error (dev , "SSU_COMMON_ERR_INT" ,
827
+ & hclge_ssu_com_err_int [0 ], status );
828
+ HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_GLOBAL_RESET );
829
+ }
830
+
679
831
/* log IGU(Ingress Unit) errors */
680
832
desc_data = (__le32 * )& desc [3 ];
681
833
status = le32_to_cpu (* desc_data ) & HCLGE_IGU_INT_MASK ;
@@ -775,6 +927,7 @@ static int hclge_handle_pf_ras_error(struct hclge_dev *hdev,
775
927
struct hclge_desc * desc ,
776
928
int num )
777
929
{
930
+ struct hnae3_ae_dev * ae_dev = hdev -> ae_dev ;
778
931
struct device * dev = & hdev -> pdev -> dev ;
779
932
__le32 * desc_data ;
780
933
u32 status ;
@@ -791,6 +944,28 @@ static int hclge_handle_pf_ras_error(struct hclge_dev *hdev,
791
944
return ret ;
792
945
}
793
946
947
+ /* log SSU(Storage Switch Unit) errors */
948
+ status = le32_to_cpu (desc [0 ].data [0 ]);
949
+ if (status ) {
950
+ hclge_log_error (dev , "SSU_PORT_BASED_ERR_INT" ,
951
+ & hclge_ssu_port_based_err_int [0 ], status );
952
+ HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_GLOBAL_RESET );
953
+ }
954
+
955
+ status = le32_to_cpu (desc [0 ].data [1 ]);
956
+ if (status ) {
957
+ hclge_log_error (dev , "SSU_FIFO_OVERFLOW_INT" ,
958
+ & hclge_ssu_fifo_overflow_int [0 ], status );
959
+ HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_GLOBAL_RESET );
960
+ }
961
+
962
+ status = le32_to_cpu (desc [0 ].data [2 ]);
963
+ if (status ) {
964
+ hclge_log_error (dev , "SSU_ETS_TCG_INT" ,
965
+ & hclge_ssu_ets_tcg_int [0 ], status );
966
+ HCLGE_SET_DEFAULT_RESET_REQUEST (HNAE3_GLOBAL_RESET );
967
+ }
968
+
794
969
/* log IGU(Ingress Unit) EGU(Egress Unit) TNL errors */
795
970
desc_data = (__le32 * )& desc [1 ];
796
971
status = le32_to_cpu (* desc_data ) & HCLGE_IGU_EGU_TNL_INT_MASK ;
@@ -857,6 +1032,10 @@ static const struct hclge_hw_blk hw_blk[] = {
857
1032
.msk = BIT (1 ), .name = "PPP" ,
858
1033
.config_err_int = hclge_config_ppp_hw_err_int ,
859
1034
},
1035
+ {
1036
+ .msk = BIT (2 ), .name = "SSU" ,
1037
+ .config_err_int = hclge_config_ssu_hw_err_int ,
1038
+ },
860
1039
{
861
1040
.msk = BIT (3 ), .name = "PPU" ,
862
1041
.config_err_int = hclge_config_ppu_hw_err_int ,
@@ -1009,6 +1188,14 @@ int hclge_handle_hw_msix_error(struct hclge_dev *hdev,
1009
1188
goto msi_error ;
1010
1189
}
1011
1190
1191
+ /* log SSU PF errors */
1192
+ status = le32_to_cpu (desc [0 ].data [0 ]) & HCLGE_SSU_PORT_INT_MSIX_MASK ;
1193
+ if (status ) {
1194
+ hclge_log_error (dev , "SSU_PORT_BASED_ERR_INT" ,
1195
+ & hclge_ssu_port_based_pf_int [0 ], status );
1196
+ set_bit (HNAE3_GLOBAL_RESET , reset_requests );
1197
+ }
1198
+
1012
1199
/* read and log PPP PF errors */
1013
1200
desc_data = (__le32 * )& desc [2 ];
1014
1201
status = le32_to_cpu (* desc_data );
0 commit comments