Commit 78175470 authored by Yu Zhang's avatar Yu Zhang Committed by JiangShui
Browse files

hns3 udma: support dfx function of query stats of TX and RX packets.

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I85R2F


CVE: NA

---------------------------------------------------------------------

This patch supports dfx function of query stats of TX and RX packets.

Signed-off-by: default avatarYu Zhang <zhangyu709@huawei.com>
parent b21b2454
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -134,6 +134,11 @@ struct udma_query_oor_cmq {
#define SPEED_100G  100000
#define SPEED_200G  200000

#define UDMA_QUERY_COUNTER 8
#define UDMA_QX_RESP 1
#define UDMA_TX_RESP 3
#define UDMA_TX_ERR_RESP 4

/* Fields of UDMA_OPC_EXT_CFG */
#define EXT_CFG_VF_ID CMQ_REQ_FIELD_LOC(31, 0)
#define EXT_CFG_QP_PI_INDEX CMQ_REQ_FIELD_LOC(45, 32)
@@ -242,6 +247,7 @@ enum udma_opcode_type {
	UDMA_OPC_CFG_GMV_TBL				= 0xA140,
	UDMA_OPC_CFG_POE_ADDR				= 0x801B,
	UDMA_OPC_CFG_POE_ATTR				= 0x801C,
	UDMA_OPC_QUERY_COUNTER				= 0x8206,
	UDMA_OPC_QUERY_PORT_INFO			= 0x7104,
};

@@ -514,4 +520,20 @@ struct udma_port_info_cmq {
	uint8_t rsv[19];
};

struct udma_rx_cnt_cmd_data {
	uint64_t rsv;
	uint64_t pkt_rx_cnt;
	uint64_t err_pkt_rx_cnt;
};

struct udma_tx_cnt_cmd_data {
	uint64_t rsv[2];
	uint64_t pkt_tx_cnt;
};

struct udma_tx_err_cnt_cmd_data {
	uint64_t err_pkt_tx_cnt;
	uint64_t rsv[2];
};

#endif /* _UDMA_HW_H */
+50 −0
Original line number Diff line number Diff line
@@ -260,6 +260,55 @@ static int udma_mmap(struct ubcore_ucontext *uctx, struct vm_area_struct *vma)

	return 0;
}

static int udma_query_stats(const struct ubcore_device *dev, struct ubcore_stats_key *key,
			    struct ubcore_stats_val *val)
{
	struct ubcore_stats_com_val *com_val = (struct ubcore_stats_com_val *)val->addr;
	struct udma_cmq_desc desc[UDMA_QUERY_COUNTER];
	struct udma_dev *udma_dev = to_udma_dev(dev);
	struct udma_tx_err_cnt_cmd_data *resp_tx_err;
	struct udma_rx_cnt_cmd_data *resp_rx;
	struct udma_tx_cnt_cmd_data *resp_tx;
	int ret;
	int i;

	if (val->len != sizeof(struct ubcore_stats_com_val)) {
		dev_err(udma_dev->dev, "The val len is err.\n");
		return -EINVAL;
	}

	for (i = 0; i < UDMA_QUERY_COUNTER; i++) {
		udma_cmq_setup_basic_desc(&desc[i], UDMA_OPC_QUERY_COUNTER, true);
		if (i < (UDMA_QUERY_COUNTER - 1))
			desc[i].flag |= cpu_to_le16(UDMA_CMD_FLAG_NEXT);
		else
			desc[i].flag &= ~cpu_to_le16(UDMA_CMD_FLAG_NEXT);
	}

	ret = udma_cmq_send(udma_dev, desc, UDMA_QUERY_COUNTER);
	if (ret) {
		dev_err(udma_dev->dev, "Failed to query stats, ret = %d.\n", ret);
		return ret;
	}

	resp_rx = (struct udma_rx_cnt_cmd_data *)desc[UDMA_QX_RESP].data;
	resp_tx = (struct udma_tx_cnt_cmd_data *)desc[UDMA_TX_RESP].data;
	resp_tx_err = (struct udma_tx_err_cnt_cmd_data *)desc[UDMA_TX_ERR_RESP].data;

	com_val->tx_pkt = resp_tx->pkt_tx_cnt;
	com_val->tx_pkt_err = resp_tx_err->err_pkt_tx_cnt;

	com_val->rx_pkt = resp_rx->pkt_rx_cnt;
	com_val->rx_pkt_err = resp_rx->err_pkt_rx_cnt;

	/* tx_bytes and rx_bytes are not support now */
	com_val->tx_bytes = 0;
	com_val->rx_bytes = 0;

	return ret;
}

static uint16_t query_congest_alg(uint8_t udma_cc_caps)
{
	uint16_t ubcore_cc_alg = 0;
@@ -862,6 +911,7 @@ static struct ubcore_ops g_udma_dev_ops = {
	.modify_tp = udma_modify_tp,
	.destroy_tp = udma_destroy_tp,
	.user_ctl = udma_user_ctl,
	.query_stats = udma_query_stats,
};

static void udma_cleanup_uar_table(struct udma_dev *dev)