@@ -48,6 +48,62 @@ static const struct pci_device_id ae_algo_pci_tbl[] = {
48
48
49
49
MODULE_DEVICE_TABLE (pci , ae_algo_pci_tbl );
50
50
51
+ static const u32 cmdq_reg_addr_list [] = {HCLGE_CMDQ_TX_ADDR_L_REG ,
52
+ HCLGE_CMDQ_TX_ADDR_H_REG ,
53
+ HCLGE_CMDQ_TX_DEPTH_REG ,
54
+ HCLGE_CMDQ_TX_TAIL_REG ,
55
+ HCLGE_CMDQ_TX_HEAD_REG ,
56
+ HCLGE_CMDQ_RX_ADDR_L_REG ,
57
+ HCLGE_CMDQ_RX_ADDR_H_REG ,
58
+ HCLGE_CMDQ_RX_DEPTH_REG ,
59
+ HCLGE_CMDQ_RX_TAIL_REG ,
60
+ HCLGE_CMDQ_RX_HEAD_REG ,
61
+ HCLGE_VECTOR0_CMDQ_SRC_REG ,
62
+ HCLGE_CMDQ_INTR_STS_REG ,
63
+ HCLGE_CMDQ_INTR_EN_REG ,
64
+ HCLGE_CMDQ_INTR_GEN_REG };
65
+
66
+ static const u32 common_reg_addr_list [] = {HCLGE_MISC_VECTOR_REG_BASE ,
67
+ HCLGE_VECTOR0_OTER_EN_REG ,
68
+ HCLGE_MISC_RESET_STS_REG ,
69
+ HCLGE_MISC_VECTOR_INT_STS ,
70
+ HCLGE_GLOBAL_RESET_REG ,
71
+ HCLGE_FUN_RST_ING ,
72
+ HCLGE_GRO_EN_REG };
73
+
74
+ static const u32 ring_reg_addr_list [] = {HCLGE_RING_RX_ADDR_L_REG ,
75
+ HCLGE_RING_RX_ADDR_H_REG ,
76
+ HCLGE_RING_RX_BD_NUM_REG ,
77
+ HCLGE_RING_RX_BD_LENGTH_REG ,
78
+ HCLGE_RING_RX_MERGE_EN_REG ,
79
+ HCLGE_RING_RX_TAIL_REG ,
80
+ HCLGE_RING_RX_HEAD_REG ,
81
+ HCLGE_RING_RX_FBD_NUM_REG ,
82
+ HCLGE_RING_RX_OFFSET_REG ,
83
+ HCLGE_RING_RX_FBD_OFFSET_REG ,
84
+ HCLGE_RING_RX_STASH_REG ,
85
+ HCLGE_RING_RX_BD_ERR_REG ,
86
+ HCLGE_RING_TX_ADDR_L_REG ,
87
+ HCLGE_RING_TX_ADDR_H_REG ,
88
+ HCLGE_RING_TX_BD_NUM_REG ,
89
+ HCLGE_RING_TX_PRIORITY_REG ,
90
+ HCLGE_RING_TX_TC_REG ,
91
+ HCLGE_RING_TX_MERGE_EN_REG ,
92
+ HCLGE_RING_TX_TAIL_REG ,
93
+ HCLGE_RING_TX_HEAD_REG ,
94
+ HCLGE_RING_TX_FBD_NUM_REG ,
95
+ HCLGE_RING_TX_OFFSET_REG ,
96
+ HCLGE_RING_TX_EBD_NUM_REG ,
97
+ HCLGE_RING_TX_EBD_OFFSET_REG ,
98
+ HCLGE_RING_TX_BD_ERR_REG ,
99
+ HCLGE_RING_EN_REG };
100
+
101
+ static const u32 tqp_intr_reg_addr_list [] = {HCLGE_TQP_INTR_CTRL_REG ,
102
+ HCLGE_TQP_INTR_GL0_REG ,
103
+ HCLGE_TQP_INTR_GL1_REG ,
104
+ HCLGE_TQP_INTR_GL2_REG ,
105
+ HCLGE_TQP_INTR_RL_REG };
106
+
51
107
static const char hns3_nic_test_strs [][ETH_GSTRING_LEN ] = {
52
108
"App Loopback test" ,
53
109
"Serdes serial Loopback test" ,
@@ -7637,8 +7693,15 @@ static int hclge_get_64_bit_regs(struct hclge_dev *hdev, u32 regs_num,
7637
7693
return 0 ;
7638
7694
}
7639
7695
7696
+ #define MAX_SEPARATE_NUM 4
7697
+ #define SEPARATOR_VALUE 0xFFFFFFFF
7698
+ #define REG_NUM_PER_LINE 4
7699
+ #define REG_LEN_PER_LINE (REG_NUM_PER_LINE * sizeof(u32))
7700
+
7640
7701
static int hclge_get_regs_len (struct hnae3_handle * handle )
7641
7702
{
7703
+ int cmdq_lines , common_lines , ring_lines , tqp_intr_lines ;
7704
+ struct hnae3_knic_private_info * kinfo = & handle -> kinfo ;
7642
7705
struct hclge_vport * vport = hclge_get_vport (handle );
7643
7706
struct hclge_dev * hdev = vport -> back ;
7644
7707
u32 regs_num_32_bit , regs_num_64_bit ;
@@ -7651,15 +7714,25 @@ static int hclge_get_regs_len(struct hnae3_handle *handle)
7651
7714
return - EOPNOTSUPP ;
7652
7715
}
7653
7716
7654
- return regs_num_32_bit * sizeof (u32 ) + regs_num_64_bit * sizeof (u64 );
7717
+ cmdq_lines = sizeof (cmdq_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
7718
+ common_lines = sizeof (common_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
7719
+ ring_lines = sizeof (ring_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
7720
+ tqp_intr_lines = sizeof (tqp_intr_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
7721
+
7722
+ return (cmdq_lines + common_lines + ring_lines * kinfo -> num_tqps +
7723
+ tqp_intr_lines * (hdev -> num_msi_used - 1 )) * REG_LEN_PER_LINE +
7724
+ regs_num_32_bit * sizeof (u32 ) + regs_num_64_bit * sizeof (u64 );
7655
7725
}
7656
7726
7657
7727
static void hclge_get_regs (struct hnae3_handle * handle , u32 * version ,
7658
7728
void * data )
7659
7729
{
7730
+ struct hnae3_knic_private_info * kinfo = & handle -> kinfo ;
7660
7731
struct hclge_vport * vport = hclge_get_vport (handle );
7661
7732
struct hclge_dev * hdev = vport -> back ;
7662
7733
u32 regs_num_32_bit , regs_num_64_bit ;
7734
+ int i , j , reg_um , separator_num ;
7735
+ u32 * reg = data ;
7663
7736
int ret ;
7664
7737
7665
7738
* version = hdev -> fw_version ;
@@ -7671,16 +7744,53 @@ static void hclge_get_regs(struct hnae3_handle *handle, u32 *version,
7671
7744
return ;
7672
7745
}
7673
7746
7674
- ret = hclge_get_32_bit_regs (hdev , regs_num_32_bit , data );
7747
+ /* fetching per-PF registers valus from PF PCIe register space */
7748
+ reg_um = sizeof (cmdq_reg_addr_list ) / sizeof (u32 );
7749
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
7750
+ for (i = 0 ; i < reg_um ; i ++ )
7751
+ * reg ++ = hclge_read_dev (& hdev -> hw , cmdq_reg_addr_list [i ]);
7752
+ for (i = 0 ; i < separator_num ; i ++ )
7753
+ * reg ++ = SEPARATOR_VALUE ;
7754
+
7755
+ reg_um = sizeof (common_reg_addr_list ) / sizeof (u32 );
7756
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
7757
+ for (i = 0 ; i < reg_um ; i ++ )
7758
+ * reg ++ = hclge_read_dev (& hdev -> hw , common_reg_addr_list [i ]);
7759
+ for (i = 0 ; i < separator_num ; i ++ )
7760
+ * reg ++ = SEPARATOR_VALUE ;
7761
+
7762
+ reg_um = sizeof (ring_reg_addr_list ) / sizeof (u32 );
7763
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
7764
+ for (j = 0 ; j < kinfo -> num_tqps ; j ++ ) {
7765
+ for (i = 0 ; i < reg_um ; i ++ )
7766
+ * reg ++ = hclge_read_dev (& hdev -> hw ,
7767
+ ring_reg_addr_list [i ] +
7768
+ 0x200 * j );
7769
+ for (i = 0 ; i < separator_num ; i ++ )
7770
+ * reg ++ = SEPARATOR_VALUE ;
7771
+ }
7772
+
7773
+ reg_um = sizeof (tqp_intr_reg_addr_list ) / sizeof (u32 );
7774
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
7775
+ for (j = 0 ; j < hdev -> num_msi_used - 1 ; j ++ ) {
7776
+ for (i = 0 ; i < reg_um ; i ++ )
7777
+ * reg ++ = hclge_read_dev (& hdev -> hw ,
7778
+ tqp_intr_reg_addr_list [i ] +
7779
+ 4 * j );
7780
+ for (i = 0 ; i < separator_num ; i ++ )
7781
+ * reg ++ = SEPARATOR_VALUE ;
7782
+ }
7783
+
7784
+ /* fetching PF common registers values from firmware */
7785
+ ret = hclge_get_32_bit_regs (hdev , regs_num_32_bit , reg );
7675
7786
if (ret ) {
7676
7787
dev_err (& hdev -> pdev -> dev ,
7677
7788
"Get 32 bit register failed, ret = %d.\n" , ret );
7678
7789
return ;
7679
7790
}
7680
7791
7681
- data = (u32 * )data + regs_num_32_bit ;
7682
- ret = hclge_get_64_bit_regs (hdev , regs_num_64_bit ,
7683
- data );
7792
+ reg += regs_num_32_bit ;
7793
+ ret = hclge_get_64_bit_regs (hdev , regs_num_64_bit , reg );
7684
7794
if (ret )
7685
7795
dev_err (& hdev -> pdev -> dev ,
7686
7796
"Get 64 bit register failed, ret = %d.\n" , ret );
0 commit comments