Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'hns3-ethtool'

Jijie Shao says:

====================
hns3: refactor registers information for ethtool -d

refactor registers information for ethtool -d
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+875 -681
+2 -2
drivers/net/ethernet/hisilicon/hns3/Makefile
··· 17 17 18 18 obj-$(CONFIG_HNS3_HCLGEVF) += hclgevf.o 19 19 20 - hclgevf-objs = hns3vf/hclgevf_main.o hns3vf/hclgevf_mbx.o hns3vf/hclgevf_devlink.o \ 20 + hclgevf-objs = hns3vf/hclgevf_main.o hns3vf/hclgevf_mbx.o hns3vf/hclgevf_devlink.o hns3vf/hclgevf_regs.o \ 21 21 hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o 22 22 23 23 obj-$(CONFIG_HNS3_HCLGE) += hclge.o 24 - hclge-objs = hns3pf/hclge_main.o hns3pf/hclge_mdio.o hns3pf/hclge_tm.o \ 24 + hclge-objs = hns3pf/hclge_main.o hns3pf/hclge_mdio.o hns3pf/hclge_tm.o hns3pf/hclge_regs.o \ 25 25 hns3pf/hclge_mbx.o hns3pf/hclge_err.o hns3pf/hclge_debugfs.o hns3pf/hclge_ptp.o hns3pf/hclge_devlink.o \ 26 26 hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o 27 27
+1
drivers/net/ethernet/hisilicon/hns3/hnae3.h
··· 382 382 u16 umv_size; 383 383 u16 mc_mac_size; 384 384 u32 mac_stats_num; 385 + u8 tnl_num; 385 386 }; 386 387 387 388 struct hnae3_client_ops {
+3 -1
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
··· 826 826 u8 rsv0[2]; 827 827 __le16 umv_size; 828 828 __le16 mc_mac_size; 829 - u8 rsv1[12]; 829 + u8 rsv1[6]; 830 + u8 tnl_num; 831 + u8 rsv2[5]; 830 832 }; 831 833 832 834 /* mac speed type defined in firmware command */
+1
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
··· 7 7 #include "hclge_debugfs.h" 8 8 #include "hclge_err.h" 9 9 #include "hclge_main.h" 10 + #include "hclge_regs.h" 10 11 #include "hclge_tm.h" 11 12 #include "hnae3.h" 12 13
+3 -557
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
··· 20 20 #include "hclge_main.h" 21 21 #include "hclge_mbx.h" 22 22 #include "hclge_mdio.h" 23 + #include "hclge_regs.h" 23 24 #include "hclge_tm.h" 24 25 #include "hclge_err.h" 25 26 #include "hnae3.h" ··· 40 39 #define HCLGE_RESET_SYNC_TIME 100 41 40 #define HCLGE_PF_RESET_SYNC_TIME 20 42 41 #define HCLGE_PF_RESET_SYNC_CNT 1500 43 - 44 - /* Get DFX BD number offset */ 45 - #define HCLGE_DFX_BIOS_BD_OFFSET 1 46 - #define HCLGE_DFX_SSU_0_BD_OFFSET 2 47 - #define HCLGE_DFX_SSU_1_BD_OFFSET 3 48 - #define HCLGE_DFX_IGU_BD_OFFSET 4 49 - #define HCLGE_DFX_RPU_0_BD_OFFSET 5 50 - #define HCLGE_DFX_RPU_1_BD_OFFSET 6 51 - #define HCLGE_DFX_NCSI_BD_OFFSET 7 52 - #define HCLGE_DFX_RTC_BD_OFFSET 8 53 - #define HCLGE_DFX_PPP_BD_OFFSET 9 54 - #define HCLGE_DFX_RCB_BD_OFFSET 10 55 - #define HCLGE_DFX_TQP_BD_OFFSET 11 56 - #define HCLGE_DFX_SSU_2_BD_OFFSET 12 57 42 58 43 #define HCLGE_LINK_STATUS_MS 10 59 44 ··· 80 93 }; 81 94 82 95 MODULE_DEVICE_TABLE(pci, ae_algo_pci_tbl); 83 - 84 - static const u32 cmdq_reg_addr_list[] = {HCLGE_COMM_NIC_CSQ_BASEADDR_L_REG, 85 - HCLGE_COMM_NIC_CSQ_BASEADDR_H_REG, 86 - HCLGE_COMM_NIC_CSQ_DEPTH_REG, 87 - HCLGE_COMM_NIC_CSQ_TAIL_REG, 88 - HCLGE_COMM_NIC_CSQ_HEAD_REG, 89 - HCLGE_COMM_NIC_CRQ_BASEADDR_L_REG, 90 - HCLGE_COMM_NIC_CRQ_BASEADDR_H_REG, 91 - HCLGE_COMM_NIC_CRQ_DEPTH_REG, 92 - HCLGE_COMM_NIC_CRQ_TAIL_REG, 93 - HCLGE_COMM_NIC_CRQ_HEAD_REG, 94 - HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, 95 - HCLGE_COMM_CMDQ_INTR_STS_REG, 96 - HCLGE_COMM_CMDQ_INTR_EN_REG, 97 - HCLGE_COMM_CMDQ_INTR_GEN_REG}; 98 - 99 - static const u32 common_reg_addr_list[] = {HCLGE_MISC_VECTOR_REG_BASE, 100 - HCLGE_PF_OTHER_INT_REG, 101 - HCLGE_MISC_RESET_STS_REG, 102 - HCLGE_MISC_VECTOR_INT_STS, 103 - HCLGE_GLOBAL_RESET_REG, 104 - HCLGE_FUN_RST_ING, 105 - HCLGE_GRO_EN_REG}; 106 - 107 - static const u32 ring_reg_addr_list[] = {HCLGE_RING_RX_ADDR_L_REG, 108 - HCLGE_RING_RX_ADDR_H_REG, 109 - HCLGE_RING_RX_BD_NUM_REG, 110 - HCLGE_RING_RX_BD_LENGTH_REG, 111 - HCLGE_RING_RX_MERGE_EN_REG, 112 - HCLGE_RING_RX_TAIL_REG, 113 - HCLGE_RING_RX_HEAD_REG, 114 - HCLGE_RING_RX_FBD_NUM_REG, 115 - HCLGE_RING_RX_OFFSET_REG, 116 - HCLGE_RING_RX_FBD_OFFSET_REG, 117 - HCLGE_RING_RX_STASH_REG, 118 - HCLGE_RING_RX_BD_ERR_REG, 119 - HCLGE_RING_TX_ADDR_L_REG, 120 - HCLGE_RING_TX_ADDR_H_REG, 121 - HCLGE_RING_TX_BD_NUM_REG, 122 - HCLGE_RING_TX_PRIORITY_REG, 123 - HCLGE_RING_TX_TC_REG, 124 - HCLGE_RING_TX_MERGE_EN_REG, 125 - HCLGE_RING_TX_TAIL_REG, 126 - HCLGE_RING_TX_HEAD_REG, 127 - HCLGE_RING_TX_FBD_NUM_REG, 128 - HCLGE_RING_TX_OFFSET_REG, 129 - HCLGE_RING_TX_EBD_NUM_REG, 130 - HCLGE_RING_TX_EBD_OFFSET_REG, 131 - HCLGE_RING_TX_BD_ERR_REG, 132 - HCLGE_RING_EN_REG}; 133 - 134 - static const u32 tqp_intr_reg_addr_list[] = {HCLGE_TQP_INTR_CTRL_REG, 135 - HCLGE_TQP_INTR_GL0_REG, 136 - HCLGE_TQP_INTR_GL1_REG, 137 - HCLGE_TQP_INTR_GL2_REG, 138 - HCLGE_TQP_INTR_RL_REG}; 139 96 140 97 static const char hns3_nic_test_strs[][ETH_GSTRING_LEN] = { 141 98 "External Loopback test", ··· 304 373 .mac_addr = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e}, 305 374 .i_port_bitmap = 0x1, 306 375 }, 307 - }; 308 - 309 - static const u32 hclge_dfx_bd_offset_list[] = { 310 - HCLGE_DFX_BIOS_BD_OFFSET, 311 - HCLGE_DFX_SSU_0_BD_OFFSET, 312 - HCLGE_DFX_SSU_1_BD_OFFSET, 313 - HCLGE_DFX_IGU_BD_OFFSET, 314 - HCLGE_DFX_RPU_0_BD_OFFSET, 315 - HCLGE_DFX_RPU_1_BD_OFFSET, 316 - HCLGE_DFX_NCSI_BD_OFFSET, 317 - HCLGE_DFX_RTC_BD_OFFSET, 318 - HCLGE_DFX_PPP_BD_OFFSET, 319 - HCLGE_DFX_RCB_BD_OFFSET, 320 - HCLGE_DFX_TQP_BD_OFFSET, 321 - HCLGE_DFX_SSU_2_BD_OFFSET 322 - }; 323 - 324 - static const enum hclge_opcode_type hclge_dfx_reg_opcode_list[] = { 325 - HCLGE_OPC_DFX_BIOS_COMMON_REG, 326 - HCLGE_OPC_DFX_SSU_REG_0, 327 - HCLGE_OPC_DFX_SSU_REG_1, 328 - HCLGE_OPC_DFX_IGU_EGU_REG, 329 - HCLGE_OPC_DFX_RPU_REG_0, 330 - HCLGE_OPC_DFX_RPU_REG_1, 331 - HCLGE_OPC_DFX_NCSI_REG, 332 - HCLGE_OPC_DFX_RTC_REG, 333 - HCLGE_OPC_DFX_PPP_REG, 334 - HCLGE_OPC_DFX_RCB_REG, 335 - HCLGE_OPC_DFX_TQP_REG, 336 - HCLGE_OPC_DFX_SSU_REG_2 337 376 }; 338 377 339 378 static const struct key_info meta_data_key_info[] = { ··· 1326 1425 ae_dev->dev_specs.max_frm_size = HCLGE_MAC_MAX_FRAME; 1327 1426 ae_dev->dev_specs.max_qset_num = HCLGE_MAX_QSET_NUM; 1328 1427 ae_dev->dev_specs.umv_size = HCLGE_DEFAULT_UMV_SPACE_PER_PF; 1428 + ae_dev->dev_specs.tnl_num = 0; 1329 1429 } 1330 1430 1331 1431 static void hclge_parse_dev_specs(struct hclge_dev *hdev, ··· 1350 1448 ae_dev->dev_specs.max_frm_size = le16_to_cpu(req1->max_frm_size); 1351 1449 ae_dev->dev_specs.umv_size = le16_to_cpu(req1->umv_size); 1352 1450 ae_dev->dev_specs.mc_mac_size = le16_to_cpu(req1->mc_mac_size); 1451 + ae_dev->dev_specs.tnl_num = req1->tnl_num; 1353 1452 } 1354 1453 1355 1454 static void hclge_check_dev_specs(struct hclge_dev *hdev) ··· 12284 12381 cur_tqps, kinfo->rss_size * kinfo->tc_info.num_tc); 12285 12382 12286 12383 return ret; 12287 - } 12288 - 12289 - static int hclge_get_regs_num(struct hclge_dev *hdev, u32 *regs_num_32_bit, 12290 - u32 *regs_num_64_bit) 12291 - { 12292 - struct hclge_desc desc; 12293 - u32 total_num; 12294 - int ret; 12295 - 12296 - hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_REG_NUM, true); 12297 - ret = hclge_cmd_send(&hdev->hw, &desc, 1); 12298 - if (ret) { 12299 - dev_err(&hdev->pdev->dev, 12300 - "Query register number cmd failed, ret = %d.\n", ret); 12301 - return ret; 12302 - } 12303 - 12304 - *regs_num_32_bit = le32_to_cpu(desc.data[0]); 12305 - *regs_num_64_bit = le32_to_cpu(desc.data[1]); 12306 - 12307 - total_num = *regs_num_32_bit + *regs_num_64_bit; 12308 - if (!total_num) 12309 - return -EINVAL; 12310 - 12311 - return 0; 12312 - } 12313 - 12314 - static int hclge_get_32_bit_regs(struct hclge_dev *hdev, u32 regs_num, 12315 - void *data) 12316 - { 12317 - #define HCLGE_32_BIT_REG_RTN_DATANUM 8 12318 - #define HCLGE_32_BIT_DESC_NODATA_LEN 2 12319 - 12320 - struct hclge_desc *desc; 12321 - u32 *reg_val = data; 12322 - __le32 *desc_data; 12323 - int nodata_num; 12324 - int cmd_num; 12325 - int i, k, n; 12326 - int ret; 12327 - 12328 - if (regs_num == 0) 12329 - return 0; 12330 - 12331 - nodata_num = HCLGE_32_BIT_DESC_NODATA_LEN; 12332 - cmd_num = DIV_ROUND_UP(regs_num + nodata_num, 12333 - HCLGE_32_BIT_REG_RTN_DATANUM); 12334 - desc = kcalloc(cmd_num, sizeof(struct hclge_desc), GFP_KERNEL); 12335 - if (!desc) 12336 - return -ENOMEM; 12337 - 12338 - hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_32_BIT_REG, true); 12339 - ret = hclge_cmd_send(&hdev->hw, desc, cmd_num); 12340 - if (ret) { 12341 - dev_err(&hdev->pdev->dev, 12342 - "Query 32 bit register cmd failed, ret = %d.\n", ret); 12343 - kfree(desc); 12344 - return ret; 12345 - } 12346 - 12347 - for (i = 0; i < cmd_num; i++) { 12348 - if (i == 0) { 12349 - desc_data = (__le32 *)(&desc[i].data[0]); 12350 - n = HCLGE_32_BIT_REG_RTN_DATANUM - nodata_num; 12351 - } else { 12352 - desc_data = (__le32 *)(&desc[i]); 12353 - n = HCLGE_32_BIT_REG_RTN_DATANUM; 12354 - } 12355 - for (k = 0; k < n; k++) { 12356 - *reg_val++ = le32_to_cpu(*desc_data++); 12357 - 12358 - regs_num--; 12359 - if (!regs_num) 12360 - break; 12361 - } 12362 - } 12363 - 12364 - kfree(desc); 12365 - return 0; 12366 - } 12367 - 12368 - static int hclge_get_64_bit_regs(struct hclge_dev *hdev, u32 regs_num, 12369 - void *data) 12370 - { 12371 - #define HCLGE_64_BIT_REG_RTN_DATANUM 4 12372 - #define HCLGE_64_BIT_DESC_NODATA_LEN 1 12373 - 12374 - struct hclge_desc *desc; 12375 - u64 *reg_val = data; 12376 - __le64 *desc_data; 12377 - int nodata_len; 12378 - int cmd_num; 12379 - int i, k, n; 12380 - int ret; 12381 - 12382 - if (regs_num == 0) 12383 - return 0; 12384 - 12385 - nodata_len = HCLGE_64_BIT_DESC_NODATA_LEN; 12386 - cmd_num = DIV_ROUND_UP(regs_num + nodata_len, 12387 - HCLGE_64_BIT_REG_RTN_DATANUM); 12388 - desc = kcalloc(cmd_num, sizeof(struct hclge_desc), GFP_KERNEL); 12389 - if (!desc) 12390 - return -ENOMEM; 12391 - 12392 - hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_64_BIT_REG, true); 12393 - ret = hclge_cmd_send(&hdev->hw, desc, cmd_num); 12394 - if (ret) { 12395 - dev_err(&hdev->pdev->dev, 12396 - "Query 64 bit register cmd failed, ret = %d.\n", ret); 12397 - kfree(desc); 12398 - return ret; 12399 - } 12400 - 12401 - for (i = 0; i < cmd_num; i++) { 12402 - if (i == 0) { 12403 - desc_data = (__le64 *)(&desc[i].data[0]); 12404 - n = HCLGE_64_BIT_REG_RTN_DATANUM - nodata_len; 12405 - } else { 12406 - desc_data = (__le64 *)(&desc[i]); 12407 - n = HCLGE_64_BIT_REG_RTN_DATANUM; 12408 - } 12409 - for (k = 0; k < n; k++) { 12410 - *reg_val++ = le64_to_cpu(*desc_data++); 12411 - 12412 - regs_num--; 12413 - if (!regs_num) 12414 - break; 12415 - } 12416 - } 12417 - 12418 - kfree(desc); 12419 - return 0; 12420 - } 12421 - 12422 - #define MAX_SEPARATE_NUM 4 12423 - #define SEPARATOR_VALUE 0xFDFCFBFA 12424 - #define REG_NUM_PER_LINE 4 12425 - #define REG_LEN_PER_LINE (REG_NUM_PER_LINE * sizeof(u32)) 12426 - #define REG_SEPARATOR_LINE 1 12427 - #define REG_NUM_REMAIN_MASK 3 12428 - 12429 - int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev, struct hclge_desc *desc) 12430 - { 12431 - int i; 12432 - 12433 - /* initialize command BD except the last one */ 12434 - for (i = 0; i < HCLGE_GET_DFX_REG_TYPE_CNT - 1; i++) { 12435 - hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, 12436 - true); 12437 - desc[i].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT); 12438 - } 12439 - 12440 - /* initialize the last command BD */ 12441 - hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, true); 12442 - 12443 - return hclge_cmd_send(&hdev->hw, desc, HCLGE_GET_DFX_REG_TYPE_CNT); 12444 - } 12445 - 12446 - static int hclge_get_dfx_reg_bd_num(struct hclge_dev *hdev, 12447 - int *bd_num_list, 12448 - u32 type_num) 12449 - { 12450 - u32 entries_per_desc, desc_index, index, offset, i; 12451 - struct hclge_desc desc[HCLGE_GET_DFX_REG_TYPE_CNT]; 12452 - int ret; 12453 - 12454 - ret = hclge_query_bd_num_cmd_send(hdev, desc); 12455 - if (ret) { 12456 - dev_err(&hdev->pdev->dev, 12457 - "Get dfx bd num fail, status is %d.\n", ret); 12458 - return ret; 12459 - } 12460 - 12461 - entries_per_desc = ARRAY_SIZE(desc[0].data); 12462 - for (i = 0; i < type_num; i++) { 12463 - offset = hclge_dfx_bd_offset_list[i]; 12464 - index = offset % entries_per_desc; 12465 - desc_index = offset / entries_per_desc; 12466 - bd_num_list[i] = le32_to_cpu(desc[desc_index].data[index]); 12467 - } 12468 - 12469 - return ret; 12470 - } 12471 - 12472 - static int hclge_dfx_reg_cmd_send(struct hclge_dev *hdev, 12473 - struct hclge_desc *desc_src, int bd_num, 12474 - enum hclge_opcode_type cmd) 12475 - { 12476 - struct hclge_desc *desc = desc_src; 12477 - int i, ret; 12478 - 12479 - hclge_cmd_setup_basic_desc(desc, cmd, true); 12480 - for (i = 0; i < bd_num - 1; i++) { 12481 - desc->flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT); 12482 - desc++; 12483 - hclge_cmd_setup_basic_desc(desc, cmd, true); 12484 - } 12485 - 12486 - desc = desc_src; 12487 - ret = hclge_cmd_send(&hdev->hw, desc, bd_num); 12488 - if (ret) 12489 - dev_err(&hdev->pdev->dev, 12490 - "Query dfx reg cmd(0x%x) send fail, status is %d.\n", 12491 - cmd, ret); 12492 - 12493 - return ret; 12494 - } 12495 - 12496 - static int hclge_dfx_reg_fetch_data(struct hclge_desc *desc_src, int bd_num, 12497 - void *data) 12498 - { 12499 - int entries_per_desc, reg_num, separator_num, desc_index, index, i; 12500 - struct hclge_desc *desc = desc_src; 12501 - u32 *reg = data; 12502 - 12503 - entries_per_desc = ARRAY_SIZE(desc->data); 12504 - reg_num = entries_per_desc * bd_num; 12505 - separator_num = REG_NUM_PER_LINE - (reg_num & REG_NUM_REMAIN_MASK); 12506 - for (i = 0; i < reg_num; i++) { 12507 - index = i % entries_per_desc; 12508 - desc_index = i / entries_per_desc; 12509 - *reg++ = le32_to_cpu(desc[desc_index].data[index]); 12510 - } 12511 - for (i = 0; i < separator_num; i++) 12512 - *reg++ = SEPARATOR_VALUE; 12513 - 12514 - return reg_num + separator_num; 12515 - } 12516 - 12517 - static int hclge_get_dfx_reg_len(struct hclge_dev *hdev, int *len) 12518 - { 12519 - u32 dfx_reg_type_num = ARRAY_SIZE(hclge_dfx_bd_offset_list); 12520 - int data_len_per_desc, bd_num, i; 12521 - int *bd_num_list; 12522 - u32 data_len; 12523 - int ret; 12524 - 12525 - bd_num_list = kcalloc(dfx_reg_type_num, sizeof(int), GFP_KERNEL); 12526 - if (!bd_num_list) 12527 - return -ENOMEM; 12528 - 12529 - ret = hclge_get_dfx_reg_bd_num(hdev, bd_num_list, dfx_reg_type_num); 12530 - if (ret) { 12531 - dev_err(&hdev->pdev->dev, 12532 - "Get dfx reg bd num fail, status is %d.\n", ret); 12533 - goto out; 12534 - } 12535 - 12536 - data_len_per_desc = sizeof_field(struct hclge_desc, data); 12537 - *len = 0; 12538 - for (i = 0; i < dfx_reg_type_num; i++) { 12539 - bd_num = bd_num_list[i]; 12540 - data_len = data_len_per_desc * bd_num; 12541 - *len += (data_len / REG_LEN_PER_LINE + 1) * REG_LEN_PER_LINE; 12542 - } 12543 - 12544 - out: 12545 - kfree(bd_num_list); 12546 - return ret; 12547 - } 12548 - 12549 - static int hclge_get_dfx_reg(struct hclge_dev *hdev, void *data) 12550 - { 12551 - u32 dfx_reg_type_num = ARRAY_SIZE(hclge_dfx_bd_offset_list); 12552 - int bd_num, bd_num_max, buf_len, i; 12553 - struct hclge_desc *desc_src; 12554 - int *bd_num_list; 12555 - u32 *reg = data; 12556 - int ret; 12557 - 12558 - bd_num_list = kcalloc(dfx_reg_type_num, sizeof(int), GFP_KERNEL); 12559 - if (!bd_num_list) 12560 - return -ENOMEM; 12561 - 12562 - ret = hclge_get_dfx_reg_bd_num(hdev, bd_num_list, dfx_reg_type_num); 12563 - if (ret) { 12564 - dev_err(&hdev->pdev->dev, 12565 - "Get dfx reg bd num fail, status is %d.\n", ret); 12566 - goto out; 12567 - } 12568 - 12569 - bd_num_max = bd_num_list[0]; 12570 - for (i = 1; i < dfx_reg_type_num; i++) 12571 - bd_num_max = max_t(int, bd_num_max, bd_num_list[i]); 12572 - 12573 - buf_len = sizeof(*desc_src) * bd_num_max; 12574 - desc_src = kzalloc(buf_len, GFP_KERNEL); 12575 - if (!desc_src) { 12576 - ret = -ENOMEM; 12577 - goto out; 12578 - } 12579 - 12580 - for (i = 0; i < dfx_reg_type_num; i++) { 12581 - bd_num = bd_num_list[i]; 12582 - ret = hclge_dfx_reg_cmd_send(hdev, desc_src, bd_num, 12583 - hclge_dfx_reg_opcode_list[i]); 12584 - if (ret) { 12585 - dev_err(&hdev->pdev->dev, 12586 - "Get dfx reg fail, status is %d.\n", ret); 12587 - break; 12588 - } 12589 - 12590 - reg += hclge_dfx_reg_fetch_data(desc_src, bd_num, reg); 12591 - } 12592 - 12593 - kfree(desc_src); 12594 - out: 12595 - kfree(bd_num_list); 12596 - return ret; 12597 - } 12598 - 12599 - static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data, 12600 - struct hnae3_knic_private_info *kinfo) 12601 - { 12602 - #define HCLGE_RING_REG_OFFSET 0x200 12603 - #define HCLGE_RING_INT_REG_OFFSET 0x4 12604 - 12605 - int i, j, reg_num, separator_num; 12606 - int data_num_sum; 12607 - u32 *reg = data; 12608 - 12609 - /* fetching per-PF registers valus from PF PCIe register space */ 12610 - reg_num = ARRAY_SIZE(cmdq_reg_addr_list); 12611 - separator_num = MAX_SEPARATE_NUM - (reg_num & REG_NUM_REMAIN_MASK); 12612 - for (i = 0; i < reg_num; i++) 12613 - *reg++ = hclge_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); 12614 - for (i = 0; i < separator_num; i++) 12615 - *reg++ = SEPARATOR_VALUE; 12616 - data_num_sum = reg_num + separator_num; 12617 - 12618 - reg_num = ARRAY_SIZE(common_reg_addr_list); 12619 - separator_num = MAX_SEPARATE_NUM - (reg_num & REG_NUM_REMAIN_MASK); 12620 - for (i = 0; i < reg_num; i++) 12621 - *reg++ = hclge_read_dev(&hdev->hw, common_reg_addr_list[i]); 12622 - for (i = 0; i < separator_num; i++) 12623 - *reg++ = SEPARATOR_VALUE; 12624 - data_num_sum += reg_num + separator_num; 12625 - 12626 - reg_num = ARRAY_SIZE(ring_reg_addr_list); 12627 - separator_num = MAX_SEPARATE_NUM - (reg_num & REG_NUM_REMAIN_MASK); 12628 - for (j = 0; j < kinfo->num_tqps; j++) { 12629 - for (i = 0; i < reg_num; i++) 12630 - *reg++ = hclge_read_dev(&hdev->hw, 12631 - ring_reg_addr_list[i] + 12632 - HCLGE_RING_REG_OFFSET * j); 12633 - for (i = 0; i < separator_num; i++) 12634 - *reg++ = SEPARATOR_VALUE; 12635 - } 12636 - data_num_sum += (reg_num + separator_num) * kinfo->num_tqps; 12637 - 12638 - reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list); 12639 - separator_num = MAX_SEPARATE_NUM - (reg_num & REG_NUM_REMAIN_MASK); 12640 - for (j = 0; j < hdev->num_msi_used - 1; j++) { 12641 - for (i = 0; i < reg_num; i++) 12642 - *reg++ = hclge_read_dev(&hdev->hw, 12643 - tqp_intr_reg_addr_list[i] + 12644 - HCLGE_RING_INT_REG_OFFSET * j); 12645 - for (i = 0; i < separator_num; i++) 12646 - *reg++ = SEPARATOR_VALUE; 12647 - } 12648 - data_num_sum += (reg_num + separator_num) * (hdev->num_msi_used - 1); 12649 - 12650 - return data_num_sum; 12651 - } 12652 - 12653 - static int hclge_get_regs_len(struct hnae3_handle *handle) 12654 - { 12655 - int cmdq_lines, common_lines, ring_lines, tqp_intr_lines; 12656 - struct hnae3_knic_private_info *kinfo = &handle->kinfo; 12657 - struct hclge_vport *vport = hclge_get_vport(handle); 12658 - struct hclge_dev *hdev = vport->back; 12659 - int regs_num_32_bit, regs_num_64_bit, dfx_regs_len; 12660 - int regs_lines_32_bit, regs_lines_64_bit; 12661 - int ret; 12662 - 12663 - ret = hclge_get_regs_num(hdev, &regs_num_32_bit, &regs_num_64_bit); 12664 - if (ret) { 12665 - dev_err(&hdev->pdev->dev, 12666 - "Get register number failed, ret = %d.\n", ret); 12667 - return ret; 12668 - } 12669 - 12670 - ret = hclge_get_dfx_reg_len(hdev, &dfx_regs_len); 12671 - if (ret) { 12672 - dev_err(&hdev->pdev->dev, 12673 - "Get dfx reg len failed, ret = %d.\n", ret); 12674 - return ret; 12675 - } 12676 - 12677 - cmdq_lines = sizeof(cmdq_reg_addr_list) / REG_LEN_PER_LINE + 12678 - REG_SEPARATOR_LINE; 12679 - common_lines = sizeof(common_reg_addr_list) / REG_LEN_PER_LINE + 12680 - REG_SEPARATOR_LINE; 12681 - ring_lines = sizeof(ring_reg_addr_list) / REG_LEN_PER_LINE + 12682 - REG_SEPARATOR_LINE; 12683 - tqp_intr_lines = sizeof(tqp_intr_reg_addr_list) / REG_LEN_PER_LINE + 12684 - REG_SEPARATOR_LINE; 12685 - regs_lines_32_bit = regs_num_32_bit * sizeof(u32) / REG_LEN_PER_LINE + 12686 - REG_SEPARATOR_LINE; 12687 - regs_lines_64_bit = regs_num_64_bit * sizeof(u64) / REG_LEN_PER_LINE + 12688 - REG_SEPARATOR_LINE; 12689 - 12690 - return (cmdq_lines + common_lines + ring_lines * kinfo->num_tqps + 12691 - tqp_intr_lines * (hdev->num_msi_used - 1) + regs_lines_32_bit + 12692 - regs_lines_64_bit) * REG_LEN_PER_LINE + dfx_regs_len; 12693 - } 12694 - 12695 - static void hclge_get_regs(struct hnae3_handle *handle, u32 *version, 12696 - void *data) 12697 - { 12698 - struct hnae3_knic_private_info *kinfo = &handle->kinfo; 12699 - struct hclge_vport *vport = hclge_get_vport(handle); 12700 - struct hclge_dev *hdev = vport->back; 12701 - u32 regs_num_32_bit, regs_num_64_bit; 12702 - int i, reg_num, separator_num, ret; 12703 - u32 *reg = data; 12704 - 12705 - *version = hdev->fw_version; 12706 - 12707 - ret = hclge_get_regs_num(hdev, &regs_num_32_bit, &regs_num_64_bit); 12708 - if (ret) { 12709 - dev_err(&hdev->pdev->dev, 12710 - "Get register number failed, ret = %d.\n", ret); 12711 - return; 12712 - } 12713 - 12714 - reg += hclge_fetch_pf_reg(hdev, reg, kinfo); 12715 - 12716 - ret = hclge_get_32_bit_regs(hdev, regs_num_32_bit, reg); 12717 - if (ret) { 12718 - dev_err(&hdev->pdev->dev, 12719 - "Get 32 bit register failed, ret = %d.\n", ret); 12720 - return; 12721 - } 12722 - reg_num = regs_num_32_bit; 12723 - reg += reg_num; 12724 - separator_num = MAX_SEPARATE_NUM - (reg_num & REG_NUM_REMAIN_MASK); 12725 - for (i = 0; i < separator_num; i++) 12726 - *reg++ = SEPARATOR_VALUE; 12727 - 12728 - ret = hclge_get_64_bit_regs(hdev, regs_num_64_bit, reg); 12729 - if (ret) { 12730 - dev_err(&hdev->pdev->dev, 12731 - "Get 64 bit register failed, ret = %d.\n", ret); 12732 - return; 12733 - } 12734 - reg_num = regs_num_64_bit * 2; 12735 - reg += reg_num; 12736 - separator_num = MAX_SEPARATE_NUM - (reg_num & REG_NUM_REMAIN_MASK); 12737 - for (i = 0; i < separator_num; i++) 12738 - *reg++ = SEPARATOR_VALUE; 12739 - 12740 - ret = hclge_get_dfx_reg(hdev, reg); 12741 - if (ret) 12742 - dev_err(&hdev->pdev->dev, 12743 - "Get dfx register failed, ret = %d.\n", ret); 12744 12384 } 12745 12385 12746 12386 static int hclge_set_led_status(struct hclge_dev *hdev, u8 locate_led_status)
-2
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
··· 1142 1142 u16 state, 1143 1143 struct hclge_vlan_info *vlan_info); 1144 1144 void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time); 1145 - int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev, 1146 - struct hclge_desc *desc); 1147 1145 void hclge_report_hw_error(struct hclge_dev *hdev, 1148 1146 enum hnae3_hw_error_type type); 1149 1147 int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len);
+668
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // Copyright (c) 2023 Hisilicon Limited. 3 + 4 + #include "hclge_cmd.h" 5 + #include "hclge_main.h" 6 + #include "hclge_regs.h" 7 + #include "hnae3.h" 8 + 9 + static const u32 cmdq_reg_addr_list[] = {HCLGE_COMM_NIC_CSQ_BASEADDR_L_REG, 10 + HCLGE_COMM_NIC_CSQ_BASEADDR_H_REG, 11 + HCLGE_COMM_NIC_CSQ_DEPTH_REG, 12 + HCLGE_COMM_NIC_CSQ_TAIL_REG, 13 + HCLGE_COMM_NIC_CSQ_HEAD_REG, 14 + HCLGE_COMM_NIC_CRQ_BASEADDR_L_REG, 15 + HCLGE_COMM_NIC_CRQ_BASEADDR_H_REG, 16 + HCLGE_COMM_NIC_CRQ_DEPTH_REG, 17 + HCLGE_COMM_NIC_CRQ_TAIL_REG, 18 + HCLGE_COMM_NIC_CRQ_HEAD_REG, 19 + HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, 20 + HCLGE_COMM_CMDQ_INTR_STS_REG, 21 + HCLGE_COMM_CMDQ_INTR_EN_REG, 22 + HCLGE_COMM_CMDQ_INTR_GEN_REG}; 23 + 24 + static const u32 common_reg_addr_list[] = {HCLGE_MISC_VECTOR_REG_BASE, 25 + HCLGE_PF_OTHER_INT_REG, 26 + HCLGE_MISC_RESET_STS_REG, 27 + HCLGE_MISC_VECTOR_INT_STS, 28 + HCLGE_GLOBAL_RESET_REG, 29 + HCLGE_FUN_RST_ING, 30 + HCLGE_GRO_EN_REG}; 31 + 32 + static const u32 ring_reg_addr_list[] = {HCLGE_RING_RX_ADDR_L_REG, 33 + HCLGE_RING_RX_ADDR_H_REG, 34 + HCLGE_RING_RX_BD_NUM_REG, 35 + HCLGE_RING_RX_BD_LENGTH_REG, 36 + HCLGE_RING_RX_MERGE_EN_REG, 37 + HCLGE_RING_RX_TAIL_REG, 38 + HCLGE_RING_RX_HEAD_REG, 39 + HCLGE_RING_RX_FBD_NUM_REG, 40 + HCLGE_RING_RX_OFFSET_REG, 41 + HCLGE_RING_RX_FBD_OFFSET_REG, 42 + HCLGE_RING_RX_STASH_REG, 43 + HCLGE_RING_RX_BD_ERR_REG, 44 + HCLGE_RING_TX_ADDR_L_REG, 45 + HCLGE_RING_TX_ADDR_H_REG, 46 + HCLGE_RING_TX_BD_NUM_REG, 47 + HCLGE_RING_TX_PRIORITY_REG, 48 + HCLGE_RING_TX_TC_REG, 49 + HCLGE_RING_TX_MERGE_EN_REG, 50 + HCLGE_RING_TX_TAIL_REG, 51 + HCLGE_RING_TX_HEAD_REG, 52 + HCLGE_RING_TX_FBD_NUM_REG, 53 + HCLGE_RING_TX_OFFSET_REG, 54 + HCLGE_RING_TX_EBD_NUM_REG, 55 + HCLGE_RING_TX_EBD_OFFSET_REG, 56 + HCLGE_RING_TX_BD_ERR_REG, 57 + HCLGE_RING_EN_REG}; 58 + 59 + static const u32 tqp_intr_reg_addr_list[] = {HCLGE_TQP_INTR_CTRL_REG, 60 + HCLGE_TQP_INTR_GL0_REG, 61 + HCLGE_TQP_INTR_GL1_REG, 62 + HCLGE_TQP_INTR_GL2_REG, 63 + HCLGE_TQP_INTR_RL_REG}; 64 + 65 + /* Get DFX BD number offset */ 66 + #define HCLGE_DFX_BIOS_BD_OFFSET 1 67 + #define HCLGE_DFX_SSU_0_BD_OFFSET 2 68 + #define HCLGE_DFX_SSU_1_BD_OFFSET 3 69 + #define HCLGE_DFX_IGU_BD_OFFSET 4 70 + #define HCLGE_DFX_RPU_0_BD_OFFSET 5 71 + #define HCLGE_DFX_RPU_1_BD_OFFSET 6 72 + #define HCLGE_DFX_NCSI_BD_OFFSET 7 73 + #define HCLGE_DFX_RTC_BD_OFFSET 8 74 + #define HCLGE_DFX_PPP_BD_OFFSET 9 75 + #define HCLGE_DFX_RCB_BD_OFFSET 10 76 + #define HCLGE_DFX_TQP_BD_OFFSET 11 77 + #define HCLGE_DFX_SSU_2_BD_OFFSET 12 78 + 79 + static const u32 hclge_dfx_bd_offset_list[] = { 80 + HCLGE_DFX_BIOS_BD_OFFSET, 81 + HCLGE_DFX_SSU_0_BD_OFFSET, 82 + HCLGE_DFX_SSU_1_BD_OFFSET, 83 + HCLGE_DFX_IGU_BD_OFFSET, 84 + HCLGE_DFX_RPU_0_BD_OFFSET, 85 + HCLGE_DFX_RPU_1_BD_OFFSET, 86 + HCLGE_DFX_NCSI_BD_OFFSET, 87 + HCLGE_DFX_RTC_BD_OFFSET, 88 + HCLGE_DFX_PPP_BD_OFFSET, 89 + HCLGE_DFX_RCB_BD_OFFSET, 90 + HCLGE_DFX_TQP_BD_OFFSET, 91 + HCLGE_DFX_SSU_2_BD_OFFSET 92 + }; 93 + 94 + static const enum hclge_opcode_type hclge_dfx_reg_opcode_list[] = { 95 + HCLGE_OPC_DFX_BIOS_COMMON_REG, 96 + HCLGE_OPC_DFX_SSU_REG_0, 97 + HCLGE_OPC_DFX_SSU_REG_1, 98 + HCLGE_OPC_DFX_IGU_EGU_REG, 99 + HCLGE_OPC_DFX_RPU_REG_0, 100 + HCLGE_OPC_DFX_RPU_REG_1, 101 + HCLGE_OPC_DFX_NCSI_REG, 102 + HCLGE_OPC_DFX_RTC_REG, 103 + HCLGE_OPC_DFX_PPP_REG, 104 + HCLGE_OPC_DFX_RCB_REG, 105 + HCLGE_OPC_DFX_TQP_REG, 106 + HCLGE_OPC_DFX_SSU_REG_2 107 + }; 108 + 109 + enum hclge_reg_tag { 110 + HCLGE_REG_TAG_CMDQ = 0, 111 + HCLGE_REG_TAG_COMMON, 112 + HCLGE_REG_TAG_RING, 113 + HCLGE_REG_TAG_TQP_INTR, 114 + HCLGE_REG_TAG_QUERY_32_BIT, 115 + HCLGE_REG_TAG_QUERY_64_BIT, 116 + HCLGE_REG_TAG_DFX_BIOS_COMMON, 117 + HCLGE_REG_TAG_DFX_SSU_0, 118 + HCLGE_REG_TAG_DFX_SSU_1, 119 + HCLGE_REG_TAG_DFX_IGU_EGU, 120 + HCLGE_REG_TAG_DFX_RPU_0, 121 + HCLGE_REG_TAG_DFX_RPU_1, 122 + HCLGE_REG_TAG_DFX_NCSI, 123 + HCLGE_REG_TAG_DFX_RTC, 124 + HCLGE_REG_TAG_DFX_PPP, 125 + HCLGE_REG_TAG_DFX_RCB, 126 + HCLGE_REG_TAG_DFX_TQP, 127 + HCLGE_REG_TAG_DFX_SSU_2, 128 + HCLGE_REG_TAG_RPU_TNL, 129 + }; 130 + 131 + #pragma pack(4) 132 + struct hclge_reg_tlv { 133 + u16 tag; 134 + u16 len; 135 + }; 136 + 137 + struct hclge_reg_header { 138 + u64 magic_number; 139 + u8 is_vf; 140 + u8 rsv[7]; 141 + }; 142 + 143 + #pragma pack() 144 + 145 + #define HCLGE_REG_TLV_SIZE sizeof(struct hclge_reg_tlv) 146 + #define HCLGE_REG_HEADER_SIZE sizeof(struct hclge_reg_header) 147 + #define HCLGE_REG_TLV_SPACE (sizeof(struct hclge_reg_tlv) / sizeof(u32)) 148 + #define HCLGE_REG_HEADER_SPACE (sizeof(struct hclge_reg_header) / sizeof(u32)) 149 + #define HCLGE_REG_MAGIC_NUMBER 0x686e733372656773 /* meaning is hns3regs */ 150 + 151 + #define HCLGE_REG_RPU_TNL_ID_0 1 152 + 153 + static u32 hclge_reg_get_header(void *data) 154 + { 155 + struct hclge_reg_header *header = data; 156 + 157 + header->magic_number = HCLGE_REG_MAGIC_NUMBER; 158 + header->is_vf = 0x0; 159 + 160 + return HCLGE_REG_HEADER_SPACE; 161 + } 162 + 163 + static u32 hclge_reg_get_tlv(u32 tag, u32 regs_num, void *data) 164 + { 165 + struct hclge_reg_tlv *tlv = data; 166 + 167 + tlv->tag = tag; 168 + tlv->len = regs_num * sizeof(u32) + HCLGE_REG_TLV_SIZE; 169 + 170 + return HCLGE_REG_TLV_SPACE; 171 + } 172 + 173 + static int hclge_get_32_bit_regs(struct hclge_dev *hdev, u32 regs_num, 174 + void *data) 175 + { 176 + #define HCLGE_32_BIT_REG_RTN_DATANUM 8 177 + #define HCLGE_32_BIT_DESC_NODATA_LEN 2 178 + 179 + struct hclge_desc *desc; 180 + u32 *reg_val = data; 181 + __le32 *desc_data; 182 + int nodata_num; 183 + int cmd_num; 184 + int i, k, n; 185 + int ret; 186 + 187 + if (regs_num == 0) 188 + return 0; 189 + 190 + nodata_num = HCLGE_32_BIT_DESC_NODATA_LEN; 191 + cmd_num = DIV_ROUND_UP(regs_num + nodata_num, 192 + HCLGE_32_BIT_REG_RTN_DATANUM); 193 + desc = kcalloc(cmd_num, sizeof(struct hclge_desc), GFP_KERNEL); 194 + if (!desc) 195 + return -ENOMEM; 196 + 197 + hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_32_BIT_REG, true); 198 + ret = hclge_cmd_send(&hdev->hw, desc, cmd_num); 199 + if (ret) { 200 + dev_err(&hdev->pdev->dev, 201 + "Query 32 bit register cmd failed, ret = %d.\n", ret); 202 + kfree(desc); 203 + return ret; 204 + } 205 + 206 + for (i = 0; i < cmd_num; i++) { 207 + if (i == 0) { 208 + desc_data = (__le32 *)(&desc[i].data[0]); 209 + n = HCLGE_32_BIT_REG_RTN_DATANUM - nodata_num; 210 + } else { 211 + desc_data = (__le32 *)(&desc[i]); 212 + n = HCLGE_32_BIT_REG_RTN_DATANUM; 213 + } 214 + for (k = 0; k < n; k++) { 215 + *reg_val++ = le32_to_cpu(*desc_data++); 216 + 217 + regs_num--; 218 + if (!regs_num) 219 + break; 220 + } 221 + } 222 + 223 + kfree(desc); 224 + return 0; 225 + } 226 + 227 + static int hclge_get_64_bit_regs(struct hclge_dev *hdev, u32 regs_num, 228 + void *data) 229 + { 230 + #define HCLGE_64_BIT_REG_RTN_DATANUM 4 231 + #define HCLGE_64_BIT_DESC_NODATA_LEN 1 232 + 233 + struct hclge_desc *desc; 234 + u64 *reg_val = data; 235 + __le64 *desc_data; 236 + int nodata_len; 237 + int cmd_num; 238 + int i, k, n; 239 + int ret; 240 + 241 + if (regs_num == 0) 242 + return 0; 243 + 244 + nodata_len = HCLGE_64_BIT_DESC_NODATA_LEN; 245 + cmd_num = DIV_ROUND_UP(regs_num + nodata_len, 246 + HCLGE_64_BIT_REG_RTN_DATANUM); 247 + desc = kcalloc(cmd_num, sizeof(struct hclge_desc), GFP_KERNEL); 248 + if (!desc) 249 + return -ENOMEM; 250 + 251 + hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_64_BIT_REG, true); 252 + ret = hclge_cmd_send(&hdev->hw, desc, cmd_num); 253 + if (ret) { 254 + dev_err(&hdev->pdev->dev, 255 + "Query 64 bit register cmd failed, ret = %d.\n", ret); 256 + kfree(desc); 257 + return ret; 258 + } 259 + 260 + for (i = 0; i < cmd_num; i++) { 261 + if (i == 0) { 262 + desc_data = (__le64 *)(&desc[i].data[0]); 263 + n = HCLGE_64_BIT_REG_RTN_DATANUM - nodata_len; 264 + } else { 265 + desc_data = (__le64 *)(&desc[i]); 266 + n = HCLGE_64_BIT_REG_RTN_DATANUM; 267 + } 268 + for (k = 0; k < n; k++) { 269 + *reg_val++ = le64_to_cpu(*desc_data++); 270 + 271 + regs_num--; 272 + if (!regs_num) 273 + break; 274 + } 275 + } 276 + 277 + kfree(desc); 278 + return 0; 279 + } 280 + 281 + int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev, struct hclge_desc *desc) 282 + { 283 + int i; 284 + 285 + /* initialize command BD except the last one */ 286 + for (i = 0; i < HCLGE_GET_DFX_REG_TYPE_CNT - 1; i++) { 287 + hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, 288 + true); 289 + desc[i].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT); 290 + } 291 + 292 + /* initialize the last command BD */ 293 + hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_BD_NUM, true); 294 + 295 + return hclge_cmd_send(&hdev->hw, desc, HCLGE_GET_DFX_REG_TYPE_CNT); 296 + } 297 + 298 + static int hclge_get_dfx_reg_bd_num(struct hclge_dev *hdev, 299 + int *bd_num_list, 300 + u32 type_num) 301 + { 302 + u32 entries_per_desc, desc_index, index, offset, i; 303 + struct hclge_desc desc[HCLGE_GET_DFX_REG_TYPE_CNT]; 304 + int ret; 305 + 306 + ret = hclge_query_bd_num_cmd_send(hdev, desc); 307 + if (ret) { 308 + dev_err(&hdev->pdev->dev, 309 + "Get dfx bd num fail, status is %d.\n", ret); 310 + return ret; 311 + } 312 + 313 + entries_per_desc = ARRAY_SIZE(desc[0].data); 314 + for (i = 0; i < type_num; i++) { 315 + offset = hclge_dfx_bd_offset_list[i]; 316 + index = offset % entries_per_desc; 317 + desc_index = offset / entries_per_desc; 318 + bd_num_list[i] = le32_to_cpu(desc[desc_index].data[index]); 319 + } 320 + 321 + return ret; 322 + } 323 + 324 + static int hclge_dfx_reg_cmd_send(struct hclge_dev *hdev, 325 + struct hclge_desc *desc_src, int bd_num, 326 + enum hclge_opcode_type cmd) 327 + { 328 + struct hclge_desc *desc = desc_src; 329 + int i, ret; 330 + 331 + hclge_cmd_setup_basic_desc(desc, cmd, true); 332 + for (i = 0; i < bd_num - 1; i++) { 333 + desc->flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT); 334 + desc++; 335 + hclge_cmd_setup_basic_desc(desc, cmd, true); 336 + } 337 + 338 + desc = desc_src; 339 + ret = hclge_cmd_send(&hdev->hw, desc, bd_num); 340 + if (ret) 341 + dev_err(&hdev->pdev->dev, 342 + "Query dfx reg cmd(0x%x) send fail, status is %d.\n", 343 + cmd, ret); 344 + 345 + return ret; 346 + } 347 + 348 + /* tnl_id = 0 means get sum of all tnl reg's value */ 349 + static int hclge_dfx_reg_rpu_tnl_cmd_send(struct hclge_dev *hdev, u32 tnl_id, 350 + struct hclge_desc *desc, int bd_num) 351 + { 352 + int i, ret; 353 + 354 + for (i = 0; i < bd_num; i++) { 355 + hclge_cmd_setup_basic_desc(&desc[i], HCLGE_OPC_DFX_RPU_REG_0, 356 + true); 357 + if (i != bd_num - 1) 358 + desc[i].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT); 359 + } 360 + 361 + desc[0].data[0] = cpu_to_le32(tnl_id); 362 + ret = hclge_cmd_send(&hdev->hw, desc, bd_num); 363 + if (ret) 364 + dev_err(&hdev->pdev->dev, 365 + "failed to query dfx rpu tnl reg, ret = %d\n", 366 + ret); 367 + return ret; 368 + } 369 + 370 + static int hclge_dfx_reg_fetch_data(struct hclge_desc *desc_src, int bd_num, 371 + void *data) 372 + { 373 + int entries_per_desc, reg_num, desc_index, index, i; 374 + struct hclge_desc *desc = desc_src; 375 + u32 *reg = data; 376 + 377 + entries_per_desc = ARRAY_SIZE(desc->data); 378 + reg_num = entries_per_desc * bd_num; 379 + for (i = 0; i < reg_num; i++) { 380 + index = i % entries_per_desc; 381 + desc_index = i / entries_per_desc; 382 + *reg++ = le32_to_cpu(desc[desc_index].data[index]); 383 + } 384 + 385 + return reg_num; 386 + } 387 + 388 + static int hclge_get_dfx_reg_len(struct hclge_dev *hdev, int *len) 389 + { 390 + u32 dfx_reg_type_num = ARRAY_SIZE(hclge_dfx_bd_offset_list); 391 + struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev); 392 + int data_len_per_desc; 393 + int *bd_num_list; 394 + int ret; 395 + u32 i; 396 + 397 + bd_num_list = kcalloc(dfx_reg_type_num, sizeof(int), GFP_KERNEL); 398 + if (!bd_num_list) 399 + return -ENOMEM; 400 + 401 + ret = hclge_get_dfx_reg_bd_num(hdev, bd_num_list, dfx_reg_type_num); 402 + if (ret) { 403 + dev_err(&hdev->pdev->dev, 404 + "Get dfx reg bd num fail, status is %d.\n", ret); 405 + goto out; 406 + } 407 + 408 + data_len_per_desc = sizeof_field(struct hclge_desc, data); 409 + *len = 0; 410 + for (i = 0; i < dfx_reg_type_num; i++) 411 + *len += bd_num_list[i] * data_len_per_desc + HCLGE_REG_TLV_SIZE; 412 + 413 + /** 414 + * the num of dfx_rpu_0 is reused by each dfx_rpu_tnl 415 + * HCLGE_DFX_BD_OFFSET is starting at 1, but the array subscript is 416 + * starting at 0, so offset need '- 1'. 417 + */ 418 + *len += (bd_num_list[HCLGE_DFX_RPU_0_BD_OFFSET - 1] * data_len_per_desc + 419 + HCLGE_REG_TLV_SIZE) * ae_dev->dev_specs.tnl_num; 420 + 421 + out: 422 + kfree(bd_num_list); 423 + return ret; 424 + } 425 + 426 + static int hclge_get_dfx_rpu_tnl_reg(struct hclge_dev *hdev, u32 *reg, 427 + struct hclge_desc *desc_src, 428 + int bd_num) 429 + { 430 + struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev); 431 + int ret = 0; 432 + u8 i; 433 + 434 + for (i = HCLGE_REG_RPU_TNL_ID_0; i <= ae_dev->dev_specs.tnl_num; i++) { 435 + ret = hclge_dfx_reg_rpu_tnl_cmd_send(hdev, i, desc_src, bd_num); 436 + if (ret) 437 + break; 438 + 439 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_RPU_TNL, 440 + ARRAY_SIZE(desc_src->data) * bd_num, 441 + reg); 442 + reg += hclge_dfx_reg_fetch_data(desc_src, bd_num, reg); 443 + } 444 + 445 + return ret; 446 + } 447 + 448 + static int hclge_get_dfx_reg(struct hclge_dev *hdev, void *data) 449 + { 450 + u32 dfx_reg_type_num = ARRAY_SIZE(hclge_dfx_bd_offset_list); 451 + int bd_num, bd_num_max, buf_len; 452 + struct hclge_desc *desc_src; 453 + int *bd_num_list; 454 + u32 *reg = data; 455 + int ret; 456 + u32 i; 457 + 458 + bd_num_list = kcalloc(dfx_reg_type_num, sizeof(int), GFP_KERNEL); 459 + if (!bd_num_list) 460 + return -ENOMEM; 461 + 462 + ret = hclge_get_dfx_reg_bd_num(hdev, bd_num_list, dfx_reg_type_num); 463 + if (ret) { 464 + dev_err(&hdev->pdev->dev, 465 + "Get dfx reg bd num fail, status is %d.\n", ret); 466 + goto out; 467 + } 468 + 469 + bd_num_max = bd_num_list[0]; 470 + for (i = 1; i < dfx_reg_type_num; i++) 471 + bd_num_max = max_t(int, bd_num_max, bd_num_list[i]); 472 + 473 + buf_len = sizeof(*desc_src) * bd_num_max; 474 + desc_src = kzalloc(buf_len, GFP_KERNEL); 475 + if (!desc_src) { 476 + ret = -ENOMEM; 477 + goto out; 478 + } 479 + 480 + for (i = 0; i < dfx_reg_type_num; i++) { 481 + bd_num = bd_num_list[i]; 482 + ret = hclge_dfx_reg_cmd_send(hdev, desc_src, bd_num, 483 + hclge_dfx_reg_opcode_list[i]); 484 + if (ret) { 485 + dev_err(&hdev->pdev->dev, 486 + "Get dfx reg fail, status is %d.\n", ret); 487 + goto free; 488 + } 489 + 490 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_DFX_BIOS_COMMON + i, 491 + ARRAY_SIZE(desc_src->data) * bd_num, 492 + reg); 493 + reg += hclge_dfx_reg_fetch_data(desc_src, bd_num, reg); 494 + } 495 + 496 + /** 497 + * HCLGE_DFX_BD_OFFSET is starting at 1, but the array subscript is 498 + * starting at 0, so offset need '- 1'. 499 + */ 500 + bd_num = bd_num_list[HCLGE_DFX_RPU_0_BD_OFFSET - 1]; 501 + ret = hclge_get_dfx_rpu_tnl_reg(hdev, reg, desc_src, bd_num); 502 + 503 + free: 504 + kfree(desc_src); 505 + out: 506 + kfree(bd_num_list); 507 + return ret; 508 + } 509 + 510 + static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data, 511 + struct hnae3_knic_private_info *kinfo) 512 + { 513 + #define HCLGE_RING_REG_OFFSET 0x200 514 + #define HCLGE_RING_INT_REG_OFFSET 0x4 515 + 516 + int i, j, reg_num; 517 + int data_num_sum; 518 + u32 *reg = data; 519 + 520 + /* fetching per-PF registers valus from PF PCIe register space */ 521 + reg_num = ARRAY_SIZE(cmdq_reg_addr_list); 522 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_CMDQ, reg_num, reg); 523 + for (i = 0; i < reg_num; i++) 524 + *reg++ = hclge_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); 525 + data_num_sum = reg_num + HCLGE_REG_TLV_SPACE; 526 + 527 + reg_num = ARRAY_SIZE(common_reg_addr_list); 528 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_COMMON, reg_num, reg); 529 + for (i = 0; i < reg_num; i++) 530 + *reg++ = hclge_read_dev(&hdev->hw, common_reg_addr_list[i]); 531 + data_num_sum += reg_num + HCLGE_REG_TLV_SPACE; 532 + 533 + reg_num = ARRAY_SIZE(ring_reg_addr_list); 534 + for (j = 0; j < kinfo->num_tqps; j++) { 535 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_RING, reg_num, reg); 536 + for (i = 0; i < reg_num; i++) 537 + *reg++ = hclge_read_dev(&hdev->hw, 538 + ring_reg_addr_list[i] + 539 + HCLGE_RING_REG_OFFSET * j); 540 + } 541 + data_num_sum += (reg_num + HCLGE_REG_TLV_SPACE) * kinfo->num_tqps; 542 + 543 + reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list); 544 + for (j = 0; j < hdev->num_msi_used - 1; j++) { 545 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_TQP_INTR, reg_num, reg); 546 + for (i = 0; i < reg_num; i++) 547 + *reg++ = hclge_read_dev(&hdev->hw, 548 + tqp_intr_reg_addr_list[i] + 549 + HCLGE_RING_INT_REG_OFFSET * j); 550 + } 551 + data_num_sum += (reg_num + HCLGE_REG_TLV_SPACE) * 552 + (hdev->num_msi_used - 1); 553 + 554 + return data_num_sum; 555 + } 556 + 557 + static int hclge_get_regs_num(struct hclge_dev *hdev, u32 *regs_num_32_bit, 558 + u32 *regs_num_64_bit) 559 + { 560 + struct hclge_desc desc; 561 + u32 total_num; 562 + int ret; 563 + 564 + hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_REG_NUM, true); 565 + ret = hclge_cmd_send(&hdev->hw, &desc, 1); 566 + if (ret) { 567 + dev_err(&hdev->pdev->dev, 568 + "Query register number cmd failed, ret = %d.\n", ret); 569 + return ret; 570 + } 571 + 572 + *regs_num_32_bit = le32_to_cpu(desc.data[0]); 573 + *regs_num_64_bit = le32_to_cpu(desc.data[1]); 574 + 575 + total_num = *regs_num_32_bit + *regs_num_64_bit; 576 + if (!total_num) 577 + return -EINVAL; 578 + 579 + return 0; 580 + } 581 + 582 + int hclge_get_regs_len(struct hnae3_handle *handle) 583 + { 584 + struct hnae3_knic_private_info *kinfo = &handle->kinfo; 585 + struct hclge_vport *vport = hclge_get_vport(handle); 586 + int regs_num_32_bit, regs_num_64_bit, dfx_regs_len; 587 + int cmdq_len, common_len, ring_len, tqp_intr_len; 588 + int regs_len_32_bit, regs_len_64_bit; 589 + struct hclge_dev *hdev = vport->back; 590 + int ret; 591 + 592 + ret = hclge_get_regs_num(hdev, &regs_num_32_bit, &regs_num_64_bit); 593 + if (ret) { 594 + dev_err(&hdev->pdev->dev, 595 + "Get register number failed, ret = %d.\n", ret); 596 + return ret; 597 + } 598 + 599 + ret = hclge_get_dfx_reg_len(hdev, &dfx_regs_len); 600 + if (ret) { 601 + dev_err(&hdev->pdev->dev, 602 + "Get dfx reg len failed, ret = %d.\n", ret); 603 + return ret; 604 + } 605 + 606 + cmdq_len = HCLGE_REG_TLV_SIZE + sizeof(cmdq_reg_addr_list); 607 + common_len = HCLGE_REG_TLV_SIZE + sizeof(common_reg_addr_list); 608 + ring_len = HCLGE_REG_TLV_SIZE + sizeof(ring_reg_addr_list); 609 + tqp_intr_len = HCLGE_REG_TLV_SIZE + sizeof(tqp_intr_reg_addr_list); 610 + regs_len_32_bit = HCLGE_REG_TLV_SIZE + regs_num_32_bit * sizeof(u32); 611 + regs_len_64_bit = HCLGE_REG_TLV_SIZE + regs_num_64_bit * sizeof(u64); 612 + 613 + /* return the total length of all register values */ 614 + return HCLGE_REG_HEADER_SIZE + cmdq_len + common_len + ring_len * 615 + kinfo->num_tqps + tqp_intr_len * (hdev->num_msi_used - 1) + 616 + regs_len_32_bit + regs_len_64_bit + dfx_regs_len; 617 + } 618 + 619 + void hclge_get_regs(struct hnae3_handle *handle, u32 *version, 620 + void *data) 621 + { 622 + #define HCLGE_REG_64_BIT_SPACE_MULTIPLE 2 623 + 624 + struct hnae3_knic_private_info *kinfo = &handle->kinfo; 625 + struct hclge_vport *vport = hclge_get_vport(handle); 626 + struct hclge_dev *hdev = vport->back; 627 + u32 regs_num_32_bit, regs_num_64_bit; 628 + u32 *reg = data; 629 + int ret; 630 + 631 + *version = hdev->fw_version; 632 + 633 + ret = hclge_get_regs_num(hdev, &regs_num_32_bit, &regs_num_64_bit); 634 + if (ret) { 635 + dev_err(&hdev->pdev->dev, 636 + "Get register number failed, ret = %d.\n", ret); 637 + return; 638 + } 639 + 640 + reg += hclge_reg_get_header(reg); 641 + reg += hclge_fetch_pf_reg(hdev, reg, kinfo); 642 + 643 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_QUERY_32_BIT, 644 + regs_num_32_bit, reg); 645 + ret = hclge_get_32_bit_regs(hdev, regs_num_32_bit, reg); 646 + if (ret) { 647 + dev_err(&hdev->pdev->dev, 648 + "Get 32 bit register failed, ret = %d.\n", ret); 649 + return; 650 + } 651 + reg += regs_num_32_bit; 652 + 653 + reg += hclge_reg_get_tlv(HCLGE_REG_TAG_QUERY_64_BIT, 654 + regs_num_64_bit * 655 + HCLGE_REG_64_BIT_SPACE_MULTIPLE, reg); 656 + ret = hclge_get_64_bit_regs(hdev, regs_num_64_bit, reg); 657 + if (ret) { 658 + dev_err(&hdev->pdev->dev, 659 + "Get 64 bit register failed, ret = %d.\n", ret); 660 + return; 661 + } 662 + reg += regs_num_64_bit * HCLGE_REG_64_BIT_SPACE_MULTIPLE; 663 + 664 + ret = hclge_get_dfx_reg(hdev, reg); 665 + if (ret) 666 + dev_err(&hdev->pdev->dev, 667 + "Get dfx register failed, ret = %d.\n", ret); 668 + }
+17
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + // Copyright (c) 2023 Hisilicon Limited. 3 + 4 + #ifndef __HCLGE_REGS_H 5 + #define __HCLGE_REGS_H 6 + #include <linux/types.h> 7 + #include "hclge_comm_cmd.h" 8 + 9 + struct hnae3_handle; 10 + struct hclge_dev; 11 + 12 + int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev, 13 + struct hclge_desc *desc); 14 + int hclge_get_regs_len(struct hnae3_handle *handle); 15 + void hclge_get_regs(struct hnae3_handle *handle, u32 *version, 16 + void *data); 17 + #endif
+2 -119
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
··· 6 6 #include <net/rtnetlink.h> 7 7 #include "hclgevf_cmd.h" 8 8 #include "hclgevf_main.h" 9 + #include "hclgevf_regs.h" 9 10 #include "hclge_mbx.h" 10 11 #include "hnae3.h" 11 12 #include "hclgevf_devlink.h" ··· 34 33 35 34 MODULE_DEVICE_TABLE(pci, ae_algovf_pci_tbl); 36 35 37 - static const u32 cmdq_reg_addr_list[] = {HCLGE_COMM_NIC_CSQ_BASEADDR_L_REG, 38 - HCLGE_COMM_NIC_CSQ_BASEADDR_H_REG, 39 - HCLGE_COMM_NIC_CSQ_DEPTH_REG, 40 - HCLGE_COMM_NIC_CSQ_TAIL_REG, 41 - HCLGE_COMM_NIC_CSQ_HEAD_REG, 42 - HCLGE_COMM_NIC_CRQ_BASEADDR_L_REG, 43 - HCLGE_COMM_NIC_CRQ_BASEADDR_H_REG, 44 - HCLGE_COMM_NIC_CRQ_DEPTH_REG, 45 - HCLGE_COMM_NIC_CRQ_TAIL_REG, 46 - HCLGE_COMM_NIC_CRQ_HEAD_REG, 47 - HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, 48 - HCLGE_COMM_VECTOR0_CMDQ_STATE_REG, 49 - HCLGE_COMM_CMDQ_INTR_EN_REG, 50 - HCLGE_COMM_CMDQ_INTR_GEN_REG}; 51 - 52 - static const u32 common_reg_addr_list[] = {HCLGEVF_MISC_VECTOR_REG_BASE, 53 - HCLGEVF_RST_ING, 54 - HCLGEVF_GRO_EN_REG}; 55 - 56 - static const u32 ring_reg_addr_list[] = {HCLGEVF_RING_RX_ADDR_L_REG, 57 - HCLGEVF_RING_RX_ADDR_H_REG, 58 - HCLGEVF_RING_RX_BD_NUM_REG, 59 - HCLGEVF_RING_RX_BD_LENGTH_REG, 60 - HCLGEVF_RING_RX_MERGE_EN_REG, 61 - HCLGEVF_RING_RX_TAIL_REG, 62 - HCLGEVF_RING_RX_HEAD_REG, 63 - HCLGEVF_RING_RX_FBD_NUM_REG, 64 - HCLGEVF_RING_RX_OFFSET_REG, 65 - HCLGEVF_RING_RX_FBD_OFFSET_REG, 66 - HCLGEVF_RING_RX_STASH_REG, 67 - HCLGEVF_RING_RX_BD_ERR_REG, 68 - HCLGEVF_RING_TX_ADDR_L_REG, 69 - HCLGEVF_RING_TX_ADDR_H_REG, 70 - HCLGEVF_RING_TX_BD_NUM_REG, 71 - HCLGEVF_RING_TX_PRIORITY_REG, 72 - HCLGEVF_RING_TX_TC_REG, 73 - HCLGEVF_RING_TX_MERGE_EN_REG, 74 - HCLGEVF_RING_TX_TAIL_REG, 75 - HCLGEVF_RING_TX_HEAD_REG, 76 - HCLGEVF_RING_TX_FBD_NUM_REG, 77 - HCLGEVF_RING_TX_OFFSET_REG, 78 - HCLGEVF_RING_TX_EBD_NUM_REG, 79 - HCLGEVF_RING_TX_EBD_OFFSET_REG, 80 - HCLGEVF_RING_TX_BD_ERR_REG, 81 - HCLGEVF_RING_EN_REG}; 82 - 83 - static const u32 tqp_intr_reg_addr_list[] = {HCLGEVF_TQP_INTR_CTRL_REG, 84 - HCLGEVF_TQP_INTR_GL0_REG, 85 - HCLGEVF_TQP_INTR_GL1_REG, 86 - HCLGEVF_TQP_INTR_GL2_REG, 87 - HCLGEVF_TQP_INTR_RL_REG}; 88 - 89 36 /* hclgevf_cmd_send - send command to command queue 90 37 * @hw: pointer to the hw struct 91 38 * @desc: prefilled descriptor for describing the command ··· 60 111 spin_unlock(&cmdq->crq.lock); 61 112 } 62 113 63 - static struct hclgevf_dev *hclgevf_ae_get_hdev(struct hnae3_handle *handle) 114 + struct hclgevf_dev *hclgevf_ae_get_hdev(struct hnae3_handle *handle) 64 115 { 65 116 if (!handle->client) 66 117 return container_of(handle, struct hclgevf_dev, nic); ··· 3205 3256 3206 3257 *supported = hdev->hw.mac.supported; 3207 3258 *advertising = hdev->hw.mac.advertising; 3208 - } 3209 - 3210 - #define MAX_SEPARATE_NUM 4 3211 - #define SEPARATOR_VALUE 0xFDFCFBFA 3212 - #define REG_NUM_PER_LINE 4 3213 - #define REG_LEN_PER_LINE (REG_NUM_PER_LINE * sizeof(u32)) 3214 - 3215 - static int hclgevf_get_regs_len(struct hnae3_handle *handle) 3216 - { 3217 - int cmdq_lines, common_lines, ring_lines, tqp_intr_lines; 3218 - struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); 3219 - 3220 - cmdq_lines = sizeof(cmdq_reg_addr_list) / REG_LEN_PER_LINE + 1; 3221 - common_lines = sizeof(common_reg_addr_list) / REG_LEN_PER_LINE + 1; 3222 - ring_lines = sizeof(ring_reg_addr_list) / REG_LEN_PER_LINE + 1; 3223 - tqp_intr_lines = sizeof(tqp_intr_reg_addr_list) / REG_LEN_PER_LINE + 1; 3224 - 3225 - return (cmdq_lines + common_lines + ring_lines * hdev->num_tqps + 3226 - tqp_intr_lines * (hdev->num_msi_used - 1)) * REG_LEN_PER_LINE; 3227 - } 3228 - 3229 - static void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, 3230 - void *data) 3231 - { 3232 - struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); 3233 - int i, j, reg_um, separator_num; 3234 - u32 *reg = data; 3235 - 3236 - *version = hdev->fw_version; 3237 - 3238 - /* fetching per-VF registers values from VF PCIe register space */ 3239 - reg_um = sizeof(cmdq_reg_addr_list) / sizeof(u32); 3240 - separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE; 3241 - for (i = 0; i < reg_um; i++) 3242 - *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); 3243 - for (i = 0; i < separator_num; i++) 3244 - *reg++ = SEPARATOR_VALUE; 3245 - 3246 - reg_um = sizeof(common_reg_addr_list) / sizeof(u32); 3247 - separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE; 3248 - for (i = 0; i < reg_um; i++) 3249 - *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); 3250 - for (i = 0; i < separator_num; i++) 3251 - *reg++ = SEPARATOR_VALUE; 3252 - 3253 - reg_um = sizeof(ring_reg_addr_list) / sizeof(u32); 3254 - separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE; 3255 - for (j = 0; j < hdev->num_tqps; j++) { 3256 - for (i = 0; i < reg_um; i++) 3257 - *reg++ = hclgevf_read_dev(&hdev->hw, 3258 - ring_reg_addr_list[i] + 3259 - HCLGEVF_TQP_REG_SIZE * j); 3260 - for (i = 0; i < separator_num; i++) 3261 - *reg++ = SEPARATOR_VALUE; 3262 - } 3263 - 3264 - reg_um = sizeof(tqp_intr_reg_addr_list) / sizeof(u32); 3265 - separator_num = MAX_SEPARATE_NUM - reg_um % REG_NUM_PER_LINE; 3266 - for (j = 0; j < hdev->num_msi_used - 1; j++) { 3267 - for (i = 0; i < reg_um; i++) 3268 - *reg++ = hclgevf_read_dev(&hdev->hw, 3269 - tqp_intr_reg_addr_list[i] + 3270 - 4 * j); 3271 - for (i = 0; i < separator_num; i++) 3272 - *reg++ = SEPARATOR_VALUE; 3273 - } 3274 3259 } 3275 3260 3276 3261 void hclgevf_update_port_base_vlan_info(struct hclgevf_dev *hdev, u16 state,
+1
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
··· 294 294 void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev); 295 295 void hclgevf_update_port_base_vlan_info(struct hclgevf_dev *hdev, u16 state, 296 296 struct hclge_mbx_port_base_vlan *port_base_vlan); 297 + struct hclgevf_dev *hclgevf_ae_get_hdev(struct hnae3_handle *handle); 297 298 #endif
+164
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // Copyright (c) 2023 Hisilicon Limited. 3 + 4 + #include "hclgevf_main.h" 5 + #include "hclgevf_regs.h" 6 + #include "hnae3.h" 7 + 8 + static const u32 cmdq_reg_addr_list[] = {HCLGE_COMM_NIC_CSQ_BASEADDR_L_REG, 9 + HCLGE_COMM_NIC_CSQ_BASEADDR_H_REG, 10 + HCLGE_COMM_NIC_CSQ_DEPTH_REG, 11 + HCLGE_COMM_NIC_CSQ_TAIL_REG, 12 + HCLGE_COMM_NIC_CSQ_HEAD_REG, 13 + HCLGE_COMM_NIC_CRQ_BASEADDR_L_REG, 14 + HCLGE_COMM_NIC_CRQ_BASEADDR_H_REG, 15 + HCLGE_COMM_NIC_CRQ_DEPTH_REG, 16 + HCLGE_COMM_NIC_CRQ_TAIL_REG, 17 + HCLGE_COMM_NIC_CRQ_HEAD_REG, 18 + HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, 19 + HCLGE_COMM_VECTOR0_CMDQ_STATE_REG, 20 + HCLGE_COMM_CMDQ_INTR_EN_REG, 21 + HCLGE_COMM_CMDQ_INTR_GEN_REG}; 22 + 23 + static const u32 common_reg_addr_list[] = {HCLGEVF_MISC_VECTOR_REG_BASE, 24 + HCLGEVF_RST_ING, 25 + HCLGEVF_GRO_EN_REG}; 26 + 27 + static const u32 ring_reg_addr_list[] = {HCLGEVF_RING_RX_ADDR_L_REG, 28 + HCLGEVF_RING_RX_ADDR_H_REG, 29 + HCLGEVF_RING_RX_BD_NUM_REG, 30 + HCLGEVF_RING_RX_BD_LENGTH_REG, 31 + HCLGEVF_RING_RX_MERGE_EN_REG, 32 + HCLGEVF_RING_RX_TAIL_REG, 33 + HCLGEVF_RING_RX_HEAD_REG, 34 + HCLGEVF_RING_RX_FBD_NUM_REG, 35 + HCLGEVF_RING_RX_OFFSET_REG, 36 + HCLGEVF_RING_RX_FBD_OFFSET_REG, 37 + HCLGEVF_RING_RX_STASH_REG, 38 + HCLGEVF_RING_RX_BD_ERR_REG, 39 + HCLGEVF_RING_TX_ADDR_L_REG, 40 + HCLGEVF_RING_TX_ADDR_H_REG, 41 + HCLGEVF_RING_TX_BD_NUM_REG, 42 + HCLGEVF_RING_TX_PRIORITY_REG, 43 + HCLGEVF_RING_TX_TC_REG, 44 + HCLGEVF_RING_TX_MERGE_EN_REG, 45 + HCLGEVF_RING_TX_TAIL_REG, 46 + HCLGEVF_RING_TX_HEAD_REG, 47 + HCLGEVF_RING_TX_FBD_NUM_REG, 48 + HCLGEVF_RING_TX_OFFSET_REG, 49 + HCLGEVF_RING_TX_EBD_NUM_REG, 50 + HCLGEVF_RING_TX_EBD_OFFSET_REG, 51 + HCLGEVF_RING_TX_BD_ERR_REG, 52 + HCLGEVF_RING_EN_REG}; 53 + 54 + static const u32 tqp_intr_reg_addr_list[] = {HCLGEVF_TQP_INTR_CTRL_REG, 55 + HCLGEVF_TQP_INTR_GL0_REG, 56 + HCLGEVF_TQP_INTR_GL1_REG, 57 + HCLGEVF_TQP_INTR_GL2_REG, 58 + HCLGEVF_TQP_INTR_RL_REG}; 59 + 60 + enum hclgevf_reg_tag { 61 + HCLGEVF_REG_TAG_CMDQ = 0, 62 + HCLGEVF_REG_TAG_COMMON, 63 + HCLGEVF_REG_TAG_RING, 64 + HCLGEVF_REG_TAG_TQP_INTR, 65 + }; 66 + 67 + #pragma pack(4) 68 + struct hclgevf_reg_tlv { 69 + u16 tag; 70 + u16 len; 71 + }; 72 + 73 + struct hclgevf_reg_header { 74 + u64 magic_number; 75 + u8 is_vf; 76 + u8 rsv[7]; 77 + }; 78 + 79 + #pragma pack() 80 + 81 + #define HCLGEVF_REG_TLV_SIZE sizeof(struct hclgevf_reg_tlv) 82 + #define HCLGEVF_REG_HEADER_SIZE sizeof(struct hclgevf_reg_header) 83 + #define HCLGEVF_REG_TLV_SPACE (sizeof(struct hclgevf_reg_tlv) / sizeof(u32)) 84 + #define HCLGEVF_REG_HEADER_SPACE (sizeof(struct hclgevf_reg_header) / sizeof(u32)) 85 + #define HCLGEVF_REG_MAGIC_NUMBER 0x686e733372656773 /* meaning is hns3regs */ 86 + 87 + static u32 hclgevf_reg_get_header(void *data) 88 + { 89 + struct hclgevf_reg_header *header = data; 90 + 91 + header->magic_number = HCLGEVF_REG_MAGIC_NUMBER; 92 + header->is_vf = 0x1; 93 + 94 + return HCLGEVF_REG_HEADER_SPACE; 95 + } 96 + 97 + static u32 hclgevf_reg_get_tlv(u32 tag, u32 regs_num, void *data) 98 + { 99 + struct hclgevf_reg_tlv *tlv = data; 100 + 101 + tlv->tag = tag; 102 + tlv->len = regs_num * sizeof(u32) + HCLGEVF_REG_TLV_SIZE; 103 + 104 + return HCLGEVF_REG_TLV_SPACE; 105 + } 106 + 107 + int hclgevf_get_regs_len(struct hnae3_handle *handle) 108 + { 109 + struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); 110 + int cmdq_len, common_len, ring_len, tqp_intr_len; 111 + 112 + cmdq_len = HCLGEVF_REG_TLV_SIZE + sizeof(cmdq_reg_addr_list); 113 + common_len = HCLGEVF_REG_TLV_SIZE + sizeof(common_reg_addr_list); 114 + ring_len = HCLGEVF_REG_TLV_SIZE + sizeof(ring_reg_addr_list); 115 + tqp_intr_len = HCLGEVF_REG_TLV_SIZE + sizeof(tqp_intr_reg_addr_list); 116 + 117 + /* return the total length of all register values */ 118 + return HCLGEVF_REG_HEADER_SIZE + cmdq_len + common_len + 119 + tqp_intr_len * (hdev->num_msi_used - 1) + 120 + ring_len * hdev->num_tqps; 121 + } 122 + 123 + void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, 124 + void *data) 125 + { 126 + #define HCLGEVF_RING_REG_OFFSET 0x200 127 + #define HCLGEVF_RING_INT_REG_OFFSET 0x4 128 + 129 + struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); 130 + int i, j, reg_um; 131 + u32 *reg = data; 132 + 133 + *version = hdev->fw_version; 134 + reg += hclgevf_reg_get_header(reg); 135 + 136 + /* fetching per-VF registers values from VF PCIe register space */ 137 + reg_um = sizeof(cmdq_reg_addr_list) / sizeof(u32); 138 + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); 139 + for (i = 0; i < reg_um; i++) 140 + *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); 141 + 142 + reg_um = sizeof(common_reg_addr_list) / sizeof(u32); 143 + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); 144 + for (i = 0; i < reg_um; i++) 145 + *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); 146 + 147 + reg_um = sizeof(ring_reg_addr_list) / sizeof(u32); 148 + for (j = 0; j < hdev->num_tqps; j++) { 149 + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); 150 + for (i = 0; i < reg_um; i++) 151 + *reg++ = hclgevf_read_dev(&hdev->hw, 152 + ring_reg_addr_list[i] + 153 + HCLGEVF_RING_REG_OFFSET * j); 154 + } 155 + 156 + reg_um = sizeof(tqp_intr_reg_addr_list) / sizeof(u32); 157 + for (j = 0; j < hdev->num_msi_used - 1; j++) { 158 + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg); 159 + for (i = 0; i < reg_um; i++) 160 + *reg++ = hclgevf_read_dev(&hdev->hw, 161 + tqp_intr_reg_addr_list[i] + 162 + HCLGEVF_RING_INT_REG_OFFSET * j); 163 + } 164 + }
+13
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* Copyright (c) 2023 Hisilicon Limited. */ 3 + 4 + #ifndef __HCLGEVF_REGS_H 5 + #define __HCLGEVF_REGS_H 6 + #include <linux/types.h> 7 + 8 + struct hnae3_handle; 9 + 10 + int hclgevf_get_regs_len(struct hnae3_handle *handle); 11 + void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, 12 + void *data); 13 + #endif