@@ -23,6 +23,58 @@ static const struct pci_device_id ae_algovf_pci_tbl[] = {
23
23
24
24
MODULE_DEVICE_TABLE (pci , ae_algovf_pci_tbl );
25
25
26
+ static const u32 cmdq_reg_addr_list [] = {HCLGEVF_CMDQ_TX_ADDR_L_REG ,
27
+ HCLGEVF_CMDQ_TX_ADDR_H_REG ,
28
+ HCLGEVF_CMDQ_TX_DEPTH_REG ,
29
+ HCLGEVF_CMDQ_TX_TAIL_REG ,
30
+ HCLGEVF_CMDQ_TX_HEAD_REG ,
31
+ HCLGEVF_CMDQ_RX_ADDR_L_REG ,
32
+ HCLGEVF_CMDQ_RX_ADDR_H_REG ,
33
+ HCLGEVF_CMDQ_RX_DEPTH_REG ,
34
+ HCLGEVF_CMDQ_RX_TAIL_REG ,
35
+ HCLGEVF_CMDQ_RX_HEAD_REG ,
36
+ HCLGEVF_VECTOR0_CMDQ_SRC_REG ,
37
+ HCLGEVF_CMDQ_INTR_STS_REG ,
38
+ HCLGEVF_CMDQ_INTR_EN_REG ,
39
+ HCLGEVF_CMDQ_INTR_GEN_REG };
40
+
41
+ static const u32 common_reg_addr_list [] = {HCLGEVF_MISC_VECTOR_REG_BASE ,
42
+ HCLGEVF_RST_ING ,
43
+ HCLGEVF_GRO_EN_REG };
44
+
45
+ static const u32 ring_reg_addr_list [] = {HCLGEVF_RING_RX_ADDR_L_REG ,
46
+ HCLGEVF_RING_RX_ADDR_H_REG ,
47
+ HCLGEVF_RING_RX_BD_NUM_REG ,
48
+ HCLGEVF_RING_RX_BD_LENGTH_REG ,
49
+ HCLGEVF_RING_RX_MERGE_EN_REG ,
50
+ HCLGEVF_RING_RX_TAIL_REG ,
51
+ HCLGEVF_RING_RX_HEAD_REG ,
52
+ HCLGEVF_RING_RX_FBD_NUM_REG ,
53
+ HCLGEVF_RING_RX_OFFSET_REG ,
54
+ HCLGEVF_RING_RX_FBD_OFFSET_REG ,
55
+ HCLGEVF_RING_RX_STASH_REG ,
56
+ HCLGEVF_RING_RX_BD_ERR_REG ,
57
+ HCLGEVF_RING_TX_ADDR_L_REG ,
58
+ HCLGEVF_RING_TX_ADDR_H_REG ,
59
+ HCLGEVF_RING_TX_BD_NUM_REG ,
60
+ HCLGEVF_RING_TX_PRIORITY_REG ,
61
+ HCLGEVF_RING_TX_TC_REG ,
62
+ HCLGEVF_RING_TX_MERGE_EN_REG ,
63
+ HCLGEVF_RING_TX_TAIL_REG ,
64
+ HCLGEVF_RING_TX_HEAD_REG ,
65
+ HCLGEVF_RING_TX_FBD_NUM_REG ,
66
+ HCLGEVF_RING_TX_OFFSET_REG ,
67
+ HCLGEVF_RING_TX_EBD_NUM_REG ,
68
+ HCLGEVF_RING_TX_EBD_OFFSET_REG ,
69
+ HCLGEVF_RING_TX_BD_ERR_REG ,
70
+ HCLGEVF_RING_EN_REG };
71
+
72
+ static const u32 tqp_intr_reg_addr_list [] = {HCLGEVF_TQP_INTR_CTRL_REG ,
73
+ HCLGEVF_TQP_INTR_GL0_REG ,
74
+ HCLGEVF_TQP_INTR_GL1_REG ,
75
+ HCLGEVF_TQP_INTR_GL2_REG ,
76
+ HCLGEVF_TQP_INTR_RL_REG };
77
+
26
78
static inline struct hclgevf_dev * hclgevf_ae_get_hdev (
27
79
struct hnae3_handle * handle )
28
80
{
@@ -2473,6 +2525,72 @@ static unsigned long hclgevf_ae_dev_reset_cnt(struct hnae3_handle *handle)
2473
2525
return hdev -> reset_count ;
2474
2526
}
2475
2527
2528
+ #define MAX_SEPARATE_NUM 4
2529
+ #define SEPARATOR_VALUE 0xFFFFFFFF
2530
+ #define REG_NUM_PER_LINE 4
2531
+ #define REG_LEN_PER_LINE (REG_NUM_PER_LINE * sizeof(u32))
2532
+
2533
+ static int hclgevf_get_regs_len (struct hnae3_handle * handle )
2534
+ {
2535
+ int cmdq_lines , common_lines , ring_lines , tqp_intr_lines ;
2536
+ struct hclgevf_dev * hdev = hclgevf_ae_get_hdev (handle );
2537
+
2538
+ cmdq_lines = sizeof (cmdq_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
2539
+ common_lines = sizeof (common_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
2540
+ ring_lines = sizeof (ring_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
2541
+ tqp_intr_lines = sizeof (tqp_intr_reg_addr_list ) / REG_LEN_PER_LINE + 1 ;
2542
+
2543
+ return (cmdq_lines + common_lines + ring_lines * hdev -> num_tqps +
2544
+ tqp_intr_lines * (hdev -> num_msi_used - 1 )) * REG_LEN_PER_LINE ;
2545
+ }
2546
+
2547
+ static void hclgevf_get_regs (struct hnae3_handle * handle , u32 * version ,
2548
+ void * data )
2549
+ {
2550
+ struct hclgevf_dev * hdev = hclgevf_ae_get_hdev (handle );
2551
+ int i , j , reg_um , separator_num ;
2552
+ u32 * reg = data ;
2553
+
2554
+ * version = hdev -> fw_version ;
2555
+
2556
+ /* fetching per-VF registers values from VF PCIe register space */
2557
+ reg_um = sizeof (cmdq_reg_addr_list ) / sizeof (u32 );
2558
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
2559
+ for (i = 0 ; i < reg_um ; i ++ )
2560
+ * reg ++ = hclgevf_read_dev (& hdev -> hw , cmdq_reg_addr_list [i ]);
2561
+ for (i = 0 ; i < separator_num ; i ++ )
2562
+ * reg ++ = SEPARATOR_VALUE ;
2563
+
2564
+ reg_um = sizeof (common_reg_addr_list ) / sizeof (u32 );
2565
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
2566
+ for (i = 0 ; i < reg_um ; i ++ )
2567
+ * reg ++ = hclgevf_read_dev (& hdev -> hw , common_reg_addr_list [i ]);
2568
+ for (i = 0 ; i < separator_num ; i ++ )
2569
+ * reg ++ = SEPARATOR_VALUE ;
2570
+
2571
+ reg_um = sizeof (ring_reg_addr_list ) / sizeof (u32 );
2572
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
2573
+ for (j = 0 ; j < hdev -> num_tqps ; j ++ ) {
2574
+ for (i = 0 ; i < reg_um ; i ++ )
2575
+ * reg ++ = hclgevf_read_dev (& hdev -> hw ,
2576
+ ring_reg_addr_list [i ] +
2577
+ 0x200 * j );
2578
+ for (i = 0 ; i < separator_num ; i ++ )
2579
+ * reg ++ = SEPARATOR_VALUE ;
2580
+ }
2581
+
2582
+ reg_um = sizeof (tqp_intr_reg_addr_list ) / sizeof (u32 );
2583
+ separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE ;
2584
+ for (j = 0 ; j < hdev -> num_msi_used - 1 ; j ++ ) {
2585
+ for (i = 0 ; i < reg_um ; i ++ )
2586
+ * reg ++ = hclgevf_read_dev (& hdev -> hw ,
2587
+ tqp_intr_reg_addr_list [i ] +
2588
+ 4 * j );
2589
+ for (i = 0 ; i < separator_num ; i ++ )
2590
+ * reg ++ = SEPARATOR_VALUE ;
2591
+ }
2592
+ }
2593
+
2476
2594
static const struct hnae3_ae_ops hclgevf_ops = {
2477
2595
.init_ae_dev = hclgevf_init_ae_dev ,
2478
2596
.uninit_ae_dev = hclgevf_uninit_ae_dev ,
@@ -2514,6 +2632,8 @@ static const struct hnae3_ae_ops hclgevf_ops = {
2514
2632
.set_default_reset_request = hclgevf_set_def_reset_request ,
2515
2633
.get_channels = hclgevf_get_channels ,
2516
2634
.get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info ,
2635
+ .get_regs_len = hclgevf_get_regs_len ,
2636
+ .get_regs = hclgevf_get_regs ,
2517
2637
.get_status = hclgevf_get_status ,
2518
2638
.get_ksettings_an_result = hclgevf_get_ksettings_an_result ,
2519
2639
.get_media_type = hclgevf_get_media_type ,
0 commit comments