1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2022 HiSilicon Limited
5 #include <rte_kvargs.h>
6 #include <rte_bus_pci.h>
7 #include <ethdev_pci.h>
10 #include "hns3_common.h"
11 #include "hns3_logs.h"
12 #include "hns3_regs.h"
13 #include "hns3_rxtx.h"
16 get_adapter_state_name(uint32_t state)
18 static const char * const state_name[] = {
32 if (state < RTE_DIM(state_name))
33 return state_name[state];
39 get_io_func_hint_name(uint32_t hint)
42 case HNS3_IO_FUNC_HINT_NONE:
44 case HNS3_IO_FUNC_HINT_VEC:
46 case HNS3_IO_FUNC_HINT_SVE:
48 case HNS3_IO_FUNC_HINT_SIMPLE:
50 case HNS3_IO_FUNC_HINT_COMMON:
58 get_dev_mac_info(FILE *file, struct hns3_adapter *hns)
60 struct hns3_hw *hw = &hns->hw;
61 struct hns3_pf *pf = &hns->pf;
63 fprintf(file, " - MAC Info:\n");
65 "\t -- query_type=%u\n"
66 "\t -- supported_speed=0x%x\n"
67 "\t -- advertising=0x%x\n"
68 "\t -- lp_advertising=0x%x\n"
69 "\t -- support_autoneg=%s\n"
70 "\t -- support_fc_autoneg=%s\n",
72 hw->mac.supported_speed,
74 hw->mac.lp_advertising,
75 hw->mac.support_autoneg != 0 ? "Yes" : "No",
76 pf->support_fc_autoneg ? "Yes" : "No");
80 get_dev_feature_capability(FILE *file, struct hns3_hw *hw)
82 const char * const caps_name[] = {
91 "RXD Advanced Layout",
99 fprintf(file, " - Dev Capability:\n");
100 for (i = 0; i < RTE_DIM(caps_name); i++)
101 fprintf(file, "\t -- support %s: %s\n", caps_name[i],
102 hw->capability & BIT(i) ? "yes" : "no");
106 get_fdir_tuple_name(uint32_t index)
108 static const char * const tuple_name[] = {
111 "outer_vlan_1st_tag",
112 "outer_vlan_2nd_tag",
140 if (index < RTE_DIM(tuple_name))
141 return tuple_name[index];
147 get_fdir_basic_info(FILE *file, struct hns3_pf *pf)
149 #define TMPBUF_SIZE 2048
150 #define PERLINE_TUPLE_NAMES 4
151 struct hns3_fd_cfg *fdcfg = &pf->fdir.fd_cfg;
152 char tmpbuf[TMPBUF_SIZE] = {0};
153 uint32_t i, count = 0;
155 fprintf(file, " - Fdir Info:\n");
157 "\t -- mode=%u max_key_len=%u rule_num:%u cnt_num:%u\n"
158 "\t -- key_sel=%u tuple_active=0x%x meta_data_active=0x%x\n"
159 "\t -- ipv6_word_en: in_s=%u in_d=%u out_s=%u out_d=%u\n"
160 "\t -- active_tuples:\n",
161 fdcfg->fd_mode, fdcfg->max_key_length,
162 fdcfg->rule_num[HNS3_FD_STAGE_1],
163 fdcfg->cnt_num[HNS3_FD_STAGE_1],
164 fdcfg->key_cfg[HNS3_FD_STAGE_1].key_sel,
165 fdcfg->key_cfg[HNS3_FD_STAGE_1].tuple_active,
166 fdcfg->key_cfg[HNS3_FD_STAGE_1].meta_data_active,
167 fdcfg->key_cfg[HNS3_FD_STAGE_1].inner_sipv6_word_en,
168 fdcfg->key_cfg[HNS3_FD_STAGE_1].inner_dipv6_word_en,
169 fdcfg->key_cfg[HNS3_FD_STAGE_1].outer_sipv6_word_en,
170 fdcfg->key_cfg[HNS3_FD_STAGE_1].outer_dipv6_word_en);
172 for (i = 0; i < MAX_TUPLE; i++) {
173 if (!(fdcfg->key_cfg[HNS3_FD_STAGE_1].tuple_active & BIT(i)))
175 if (count % PERLINE_TUPLE_NAMES == 0)
176 fprintf(file, "\t ");
177 fprintf(file, " %s", get_fdir_tuple_name(i));
179 if (count % PERLINE_TUPLE_NAMES == 0)
182 if (count % PERLINE_TUPLE_NAMES)
185 fprintf(file, "%s", tmpbuf);
189 get_device_basic_info(FILE *file, struct rte_eth_dev *dev)
191 struct hns3_adapter *hns = dev->data->dev_private;
192 struct hns3_hw *hw = &hns->hw;
195 " - Device Base Info:\n"
197 "\t -- adapter_state=%s\n"
198 "\t -- nb_rx_queues=%u nb_tx_queues=%u\n"
199 "\t -- total_tqps_num=%u tqps_num=%u intr_tqps_num=%u\n"
200 "\t -- rss_size_max=%u alloc_rss_size=%u tx_qnum_per_tc=%u\n"
201 "\t -- min_tx_pkt_len=%u intr_mapping_mode=%u vlan_mode=%u\n"
202 "\t -- tso_mode=%u max_non_tso_bd_num=%u\n"
203 "\t -- max_tm_rate=%u Mbps\n"
204 "\t -- set link down: %s\n"
205 "\t -- rx_func_hint=%s tx_func_hint=%s\n"
206 "\t -- dev_flags: lsc=%d\n"
207 "\t -- intr_conf: lsc=%u rxq=%u\n",
209 get_adapter_state_name(hw->adapter_state),
210 dev->data->nb_rx_queues, dev->data->nb_tx_queues,
211 hw->total_tqps_num, hw->tqps_num, hw->intr_tqps_num,
212 hw->rss_size_max, hw->alloc_rss_size, hw->tx_qnum_per_tc,
213 hw->min_tx_pkt_len, hw->intr.mapping_mode, hw->vlan_mode,
214 hw->tso_mode, hw->max_non_tso_bd_num,
216 hw->set_link_down ? "Yes" : "No",
217 get_io_func_hint_name(hns->rx_func_hint),
218 get_io_func_hint_name(hns->tx_func_hint),
219 !!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC),
220 dev->data->dev_conf.intr_conf.lsc,
221 dev->data->dev_conf.intr_conf.rxq);
225 * Note: caller must make sure queue_id < nb_queues
226 * nb_queues = RTE_MAX(eth_dev->data->nb_rx_queues,
227 * eth_dev->data->nb_tx_queues)
229 static struct hns3_rx_queue *
230 get_rx_queue(struct rte_eth_dev *dev, unsigned int queue_id)
232 struct hns3_adapter *hns = dev->data->dev_private;
233 struct hns3_hw *hw = &hns->hw;
237 if (queue_id < dev->data->nb_rx_queues) {
238 rx_queues = dev->data->rx_queues;
242 * For kunpeng930, fake queue is not exist. But since the queues
243 * are usually accessd in pairs, this branch may still exist.
245 if (hns3_dev_get_support(hw, INDEP_TXRX))
248 rx_queues = hw->fkq_data.rx_queues;
249 offset = queue_id - dev->data->nb_rx_queues;
252 if (rx_queues != NULL && rx_queues[offset] != NULL)
253 return rx_queues[offset];
255 hns3_err(hw, "Detect rx_queues is NULL!\n");
260 * Note: caller must make sure queue_id < nb_queues
261 * nb_queues = RTE_MAX(eth_dev->data->nb_rx_queues,
262 * eth_dev->data->nb_tx_queues)
264 static struct hns3_tx_queue *
265 get_tx_queue(struct rte_eth_dev *dev, unsigned int queue_id)
267 struct hns3_adapter *hns = dev->data->dev_private;
268 struct hns3_hw *hw = &hns->hw;
272 if (queue_id < dev->data->nb_tx_queues) {
273 tx_queues = dev->data->tx_queues;
277 * For kunpeng930, fake queue is not exist. But since the queues
278 * are usually accessd in pairs, this branch may still exist.
280 if (hns3_dev_get_support(hw, INDEP_TXRX))
282 tx_queues = hw->fkq_data.tx_queues;
283 offset = queue_id - dev->data->nb_tx_queues;
286 if (tx_queues != NULL && tx_queues[offset] != NULL)
287 return tx_queues[offset];
289 hns3_err(hw, "Detect tx_queues is NULL!\n");
294 get_rxtx_fake_queue_info(FILE *file, struct rte_eth_dev *dev)
296 struct hns3_adapter *hns = dev->data->dev_private;
297 struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns);
298 struct hns3_rx_queue *rxq;
299 struct hns3_tx_queue *txq;
300 unsigned int queue_id;
302 if (dev->data->nb_rx_queues != dev->data->nb_tx_queues &&
303 !hns3_dev_get_support(hw, INDEP_TXRX)) {
304 queue_id = RTE_MIN(dev->data->nb_rx_queues,
305 dev->data->nb_tx_queues);
306 rxq = get_rx_queue(dev, queue_id);
309 txq = get_tx_queue(dev, queue_id);
313 "\t -- first fake_queue rxtx info:\n"
314 "\t rx: port=%u nb_desc=%u free_thresh=%u\n"
315 "\t tx: port=%u nb_desc=%u\n",
316 rxq->port_id, rxq->nb_rx_desc, rxq->rx_free_thresh,
317 txq->port_id, txq->nb_tx_desc);
322 get_queue_enable_state(struct hns3_hw *hw, uint32_t *queue_state,
323 uint32_t nb_queues, bool is_rxq)
325 #define STATE_SIZE (sizeof(*queue_state) * CHAR_BIT)
326 uint32_t queue_en_reg;
331 queue_en_reg = is_rxq ? HNS3_RING_RX_EN_REG : HNS3_RING_TX_EN_REG;
332 for (i = 0; i < nb_queues; i++) {
333 reg_offset = hns3_get_tqp_reg_offset(i);
334 state = hns3_read_dev(hw, reg_offset + HNS3_RING_EN_REG);
335 if (hns3_dev_get_support(hw, INDEP_TXRX))
336 state = state && hns3_read_dev(hw, reg_offset +
338 hns3_set_bit(queue_state[i / STATE_SIZE],
339 i % STATE_SIZE, state);
344 print_queue_state_perline(FILE *file, const uint32_t *queue_state,
345 uint32_t nb_queues, uint32_t line_num)
347 #define NUM_QUEUE_PER_LINE (sizeof(*queue_state) * CHAR_BIT)
348 uint32_t qid = line_num * NUM_QUEUE_PER_LINE;
351 for (j = 0; j < NUM_QUEUE_PER_LINE; j++) {
352 fprintf(file, "%1lx", hns3_get_bit(queue_state[line_num], j));
354 if (qid % CHAR_BIT == CHAR_BIT - 1) {
356 j == NUM_QUEUE_PER_LINE - 1 ? "\n" : ":");
359 if (qid >= nb_queues) {
367 display_queue_enable_state(FILE *file, const uint32_t *queue_state,
368 uint32_t nb_queues, bool is_rxq)
370 #define NUM_QUEUE_PER_LINE (sizeof(*queue_state) * CHAR_BIT)
373 if (nb_queues == 0) {
374 fprintf(file, "\t %s queue number is 0\n",
375 is_rxq ? "Rx" : "Tx");
379 fprintf(file, "\t %s queue id | enable state bitMap\n",
380 is_rxq ? "rx" : "tx");
382 for (i = 0; i < (nb_queues - 1) / NUM_QUEUE_PER_LINE + 1; i++) {
383 uint32_t line_end = (i + 1) * NUM_QUEUE_PER_LINE - 1;
384 uint32_t line_start = i * NUM_QUEUE_PER_LINE;
385 fprintf(file, "\t %04u - %04u | ", line_start,
386 nb_queues - 1 > line_end ? line_end : nb_queues - 1);
389 print_queue_state_perline(file, queue_state, nb_queues, i);
394 get_rxtx_queue_enable_state(FILE *file, struct rte_eth_dev *dev)
396 #define MAX_TQP_NUM 1280
397 #define QUEUE_BITMAP_SIZE (MAX_TQP_NUM / 32)
398 struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
399 uint32_t rx_queue_state[QUEUE_BITMAP_SIZE] = {0};
400 uint32_t tx_queue_state[QUEUE_BITMAP_SIZE] = {0};
401 uint32_t nb_rx_queues;
402 uint32_t nb_tx_queues;
404 nb_rx_queues = dev->data->nb_rx_queues;
405 nb_tx_queues = dev->data->nb_tx_queues;
407 fprintf(file, "\t -- enable state:\n");
408 get_queue_enable_state(hw, rx_queue_state, nb_rx_queues, true);
409 display_queue_enable_state(file, rx_queue_state, nb_rx_queues,
412 get_queue_enable_state(hw, tx_queue_state, nb_tx_queues, false);
413 display_queue_enable_state(file, tx_queue_state, nb_tx_queues,
418 get_rxtx_queue_info(FILE *file, struct rte_eth_dev *dev)
420 struct hns3_rx_queue *rxq;
421 struct hns3_tx_queue *txq;
422 unsigned int queue_id = 0;
424 rxq = get_rx_queue(dev, queue_id);
427 txq = get_tx_queue(dev, queue_id);
430 fprintf(file, " - Rx/Tx Queue Info:\n");
432 "\t -- nb_rx_queues=%u nb_tx_queues=%u, "
433 "first queue rxtx info:\n"
434 "\t rx: port=%u nb_desc=%u free_thresh=%u\n"
435 "\t tx: port=%u nb_desc=%u\n"
436 "\t -- tx push: %s\n",
437 dev->data->nb_rx_queues,
438 dev->data->nb_tx_queues,
439 rxq->port_id, rxq->nb_rx_desc, rxq->rx_free_thresh,
440 txq->port_id, txq->nb_tx_desc,
441 txq->tx_push_enable ? "enabled" : "disabled");
443 get_rxtx_fake_queue_info(file, dev);
444 get_rxtx_queue_enable_state(file, dev);
448 get_vlan_filter_cfg(FILE *file, struct hns3_hw *hw)
450 #define HNS3_FILTER_TYPE_VF 0
451 #define HNS3_FILTER_TYPE_PORT 1
452 #define HNS3_FILTER_FE_NIC_INGRESS_B BIT(0)
453 #define HNS3_FILTER_FE_NIC_EGRESS_B BIT(1)
454 struct hns3_vlan_filter_ctrl_cmd *req;
455 struct hns3_cmd_desc desc;
459 static const uint32_t vlan_filter_type[] = {
460 HNS3_FILTER_TYPE_PORT,
464 for (i = 0; i < RTE_DIM(vlan_filter_type); i++) {
465 hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_VLAN_FILTER_CTRL,
467 req = (struct hns3_vlan_filter_ctrl_cmd *)desc.data;
468 req->vlan_type = vlan_filter_type[i];
469 req->vf_id = HNS3_PF_FUNC_ID;
470 ret = hns3_cmd_send(hw, &desc, 1);
473 "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!",
474 ret, 1, rte_le_to_cpu_16(desc.opcode));
478 "\t -- %s VLAN filter configuration\n"
479 "\t nic_ingress :%s\n"
480 "\t nic_egress :%s\n",
481 req->vlan_type == HNS3_FILTER_TYPE_PORT ?
483 req->vlan_fe & HNS3_FILTER_FE_NIC_INGRESS_B ?
484 "Enable" : "Disable",
485 req->vlan_fe & HNS3_FILTER_FE_NIC_EGRESS_B ?
486 "Enable" : "Disable");
493 get_vlan_rx_offload_cfg(FILE *file, struct hns3_hw *hw)
495 struct hns3_vport_vtag_rx_cfg_cmd *req;
496 struct hns3_cmd_desc desc;
501 hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_VLAN_PORT_RX_CFG, true);
502 req = (struct hns3_vport_vtag_rx_cfg_cmd *)desc.data;
503 vport_id = HNS3_PF_FUNC_ID;
504 req->vf_offset = vport_id / HNS3_VF_NUM_PER_CMD;
505 bitmap = 1 << (vport_id % HNS3_VF_NUM_PER_BYTE);
506 req->vf_bitmap[req->vf_offset] = bitmap;
509 * current version VF is not supported when PF is driven by DPDK driver,
510 * just need to configure rx parameters for PF vport.
512 ret = hns3_cmd_send(hw, &desc, 1);
515 "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!",
516 ret, 1, rte_le_to_cpu_16(desc.opcode));
521 "\t -- RX VLAN configuration\n"
522 "\t vlan1_strip_en :%s\n"
523 "\t vlan2_strip_en :%s\n"
524 "\t vlan1_vlan_prionly :%s\n"
525 "\t vlan2_vlan_prionly :%s\n"
526 "\t vlan1_strip_discard :%s\n"
527 "\t vlan2_strip_discard :%s\n",
528 hns3_get_bit(req->vport_vlan_cfg,
529 HNS3_REM_TAG1_EN_B) ? "Enable" : "Disable",
530 hns3_get_bit(req->vport_vlan_cfg,
531 HNS3_REM_TAG2_EN_B) ? "Enable" : "Disable",
532 hns3_get_bit(req->vport_vlan_cfg,
533 HNS3_SHOW_TAG1_EN_B) ? "Enable" : "Disable",
534 hns3_get_bit(req->vport_vlan_cfg,
535 HNS3_SHOW_TAG2_EN_B) ? "Enable" : "Disable",
536 hns3_get_bit(req->vport_vlan_cfg,
537 HNS3_DISCARD_TAG1_EN_B) ? "Enable" : "Disable",
538 hns3_get_bit(req->vport_vlan_cfg,
539 HNS3_DISCARD_TAG2_EN_B) ? "Enable" : "Disable");
545 parse_tx_vlan_cfg(FILE *file, struct hns3_vport_vtag_tx_cfg_cmd *req)
547 #define VLAN_VID_MASK 0x0fff
548 #define VLAN_PRIO_SHIFT 13
551 "\t -- TX VLAN configuration\n"
552 "\t accept_tag1 :%s\n"
553 "\t accept_untag1 :%s\n"
554 "\t insert_tag1_en :%s\n"
555 "\t default_vlan_tag1 = %d, qos = %d\n"
556 "\t accept_tag2 :%s\n"
557 "\t accept_untag2 :%s\n"
558 "\t insert_tag2_en :%s\n"
559 "\t default_vlan_tag2 = %d, qos = %d\n"
560 "\t vlan_shift_mode :%s\n",
561 hns3_get_bit(req->vport_vlan_cfg,
562 HNS3_ACCEPT_TAG1_B) ? "Enable" : "Disable",
563 hns3_get_bit(req->vport_vlan_cfg,
564 HNS3_ACCEPT_UNTAG1_B) ? "Enable" : "Disable",
565 hns3_get_bit(req->vport_vlan_cfg,
566 HNS3_PORT_INS_TAG1_EN_B) ? "Enable" : "Disable",
567 req->def_vlan_tag1 & VLAN_VID_MASK,
568 req->def_vlan_tag1 >> VLAN_PRIO_SHIFT,
569 hns3_get_bit(req->vport_vlan_cfg,
570 HNS3_ACCEPT_TAG2_B) ? "Enable" : "Disable",
571 hns3_get_bit(req->vport_vlan_cfg,
572 HNS3_ACCEPT_UNTAG2_B) ? "Enable" : "Disable",
573 hns3_get_bit(req->vport_vlan_cfg,
574 HNS3_PORT_INS_TAG2_EN_B) ? "Enable" : "Disable",
575 req->def_vlan_tag2 & VLAN_VID_MASK,
576 req->def_vlan_tag2 >> VLAN_PRIO_SHIFT,
577 hns3_get_bit(req->vport_vlan_cfg,
578 HNS3_TAG_SHIFT_MODE_EN_B) ? "Enable" :
583 get_vlan_tx_offload_cfg(FILE *file, struct hns3_hw *hw)
585 struct hns3_vport_vtag_tx_cfg_cmd *req;
586 struct hns3_cmd_desc desc;
591 hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_VLAN_PORT_TX_CFG, true);
592 req = (struct hns3_vport_vtag_tx_cfg_cmd *)desc.data;
593 vport_id = HNS3_PF_FUNC_ID;
594 req->vf_offset = vport_id / HNS3_VF_NUM_PER_CMD;
595 bitmap = 1 << (vport_id % HNS3_VF_NUM_PER_BYTE);
596 req->vf_bitmap[req->vf_offset] = bitmap;
598 * current version VF is not supported when PF is driven by DPDK driver,
599 * just need to configure tx parameters for PF vport.
601 ret = hns3_cmd_send(hw, &desc, 1);
604 "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!",
605 ret, 1, rte_le_to_cpu_16(desc.opcode));
609 parse_tx_vlan_cfg(file, req);
615 get_port_pvid_info(FILE *file, struct hns3_hw *hw)
617 fprintf(file, "\t -- pvid status: %s\n",
618 hw->port_base_vlan_cfg.state ? "on" : "off");
622 get_vlan_config_info(FILE *file, struct hns3_hw *hw)
626 fprintf(file, " - VLAN Config Info:\n");
627 ret = get_vlan_filter_cfg(file, hw);
631 ret = get_vlan_rx_offload_cfg(file, hw);
635 ret = get_vlan_tx_offload_cfg(file, hw);
639 get_port_pvid_info(file, hw);
643 hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file)
645 struct hns3_adapter *hns = dev->data->dev_private;
646 struct hns3_hw *hw = &hns->hw;
648 get_device_basic_info(file, dev);
649 get_dev_feature_capability(file, hw);
651 /* VF only supports dumping basic info and feaure capability */
655 get_dev_mac_info(file, hns);
656 get_rxtx_queue_info(file, dev);
657 get_vlan_config_info(file, hw);
658 get_fdir_basic_info(file, &hns->pf);