Sync some patchs from upstreaming, includind some bugfixes, hns3 pmd flow rule priority feature, hns3 pmd outer VLAN flow match feature, and support dump reigser names and filter. This patch set is modified as follows: - net/hns3: fix cannot fully use hardware flow director table - net/hns3: fix error code for repeatedly create counter - net/hns3: support flow rule priority - common/nfp: use new kvargs process API - net/tap: use new kvargs process API - net/sfc: use new kvargs process API - kvargs: rework process API - net/hns3: fix variable type - net/hns3: fix pointer offset - net/hns3: fix error log - net/hns3: support filtering registers by module names - net/hns3: support reporting names of registers - net/hns3: refactor register dump - net/hns3: remove separators between register module - net/hns3: fix dump counter of registers - net/hns3: remove some basic address dump - telemetry: register command with private argument - ethdev: fix race on ports in telemetry endpoints - ethdev: add telemetry command for registers - ethdev: add report of register names and filter - net/hns3: support outer VLAN flow match - net/hns3: register VLAN flow match mode parameter - net/hns3: support general tunnel flow match - net/hns3: restrict tunnel flow rule to one header - net/hns3: remove ROH devices - net/hns3: dump queue head and tail pointer info - dmadev: fix potential null pointer access - net/hns3: verify reset type from firmware - ethdev: verify queue ID in Tx done cleanup Signed-off-by: Dengdui Huang <huangdengdui@huawei.com> (cherry picked from commit a1c828e1eb9cf716187d2a7656023e95bdce9b55)
192 lines
6.2 KiB
Diff
192 lines
6.2 KiB
Diff
From cdb9ef406cbbb4abf95667b9e616ae2309b90aa9 Mon Sep 17 00:00:00 2001
|
|
From: Jie Hai <haijie1@huawei.com>
|
|
Date: Thu, 26 Sep 2024 20:42:42 +0800
|
|
Subject: ethdev: add report of register names and filter
|
|
|
|
[ upstream commit 083db2ed9e9ea321f37fb49a9ea118446c04a782 ]
|
|
|
|
This patch adds "filter" and "names" fields to "rte_dev_reg_info"
|
|
structure. Names of registers in data fields can be reported and
|
|
the registers can be filtered by their module names.
|
|
|
|
The new API rte_eth_dev_get_reg_info_ext() is added to support
|
|
reporting names and filtering by modules. And the original API
|
|
rte_eth_dev_get_reg_info() does not use the names and filter fields.
|
|
A local variable is used in rte_eth_dev_get_reg_info for
|
|
compatibility. If the drivers does not report the names, set them
|
|
to "index_XXX", which means the location in the register table.
|
|
|
|
Signed-off-by: Jie Hai <haijie1@huawei.com>
|
|
Acked-by: Huisong Li <lihuisong@huawei.com>
|
|
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
|
|
Reviewed-by: Ferruh Yigit <ferruh.yigit@amd.com>
|
|
---
|
|
lib/ethdev/ethdev_trace.h | 2 ++
|
|
lib/ethdev/rte_dev_info.h | 11 +++++++++++
|
|
lib/ethdev/rte_ethdev.c | 38 ++++++++++++++++++++++++++++++++++++++
|
|
lib/ethdev/rte_ethdev.h | 29 +++++++++++++++++++++++++++++
|
|
lib/ethdev/version.map | 1 +
|
|
5 files changed, 81 insertions(+)
|
|
|
|
diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h
|
|
index 1b1ae0cfe8..c327f97763 100644
|
|
--- a/lib/ethdev/ethdev_trace.h
|
|
+++ b/lib/ethdev/ethdev_trace.h
|
|
@@ -1152,6 +1152,8 @@ RTE_TRACE_POINT(
|
|
rte_trace_point_emit_u32(info->length);
|
|
rte_trace_point_emit_u32(info->width);
|
|
rte_trace_point_emit_u32(info->version);
|
|
+ rte_trace_point_emit_ptr(info->names);
|
|
+ rte_trace_point_emit_ptr(info->filter);
|
|
rte_trace_point_emit_int(ret);
|
|
)
|
|
|
|
diff --git a/lib/ethdev/rte_dev_info.h b/lib/ethdev/rte_dev_info.h
|
|
index 67cf0ae526..26b777f983 100644
|
|
--- a/lib/ethdev/rte_dev_info.h
|
|
+++ b/lib/ethdev/rte_dev_info.h
|
|
@@ -11,6 +11,11 @@ extern "C" {
|
|
|
|
#include <stdint.h>
|
|
|
|
+#define RTE_ETH_REG_NAME_SIZE 64
|
|
+struct rte_eth_reg_name {
|
|
+ char name[RTE_ETH_REG_NAME_SIZE];
|
|
+};
|
|
+
|
|
/*
|
|
* Placeholder for accessing device registers
|
|
*/
|
|
@@ -20,6 +25,12 @@ struct rte_dev_reg_info {
|
|
uint32_t length; /**< Number of registers to fetch */
|
|
uint32_t width; /**< Size of device register */
|
|
uint32_t version; /**< Device version */
|
|
+ /**
|
|
+ * Name of target module, filter for target subset of registers.
|
|
+ * This field could affects register selection for data/length/names.
|
|
+ */
|
|
+ const char *filter;
|
|
+ struct rte_eth_reg_name *names; /**< Registers name saver */
|
|
};
|
|
|
|
/*
|
|
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
|
|
index 8438f2a776..cfb4cfbb8b 100644
|
|
--- a/lib/ethdev/rte_ethdev.c
|
|
+++ b/lib/ethdev/rte_ethdev.c
|
|
@@ -6388,8 +6388,37 @@ rte_eth_read_clock(uint16_t port_id, uint64_t *clock)
|
|
|
|
int
|
|
rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
|
|
+{
|
|
+ struct rte_dev_reg_info reg_info = { 0 };
|
|
+ int ret;
|
|
+
|
|
+ if (info == NULL) {
|
|
+ RTE_ETHDEV_LOG(ERR,
|
|
+ "Cannot get ethdev port %u register info to NULL",
|
|
+ port_id);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ reg_info.length = info->length;
|
|
+ reg_info.data = info->data;
|
|
+
|
|
+ ret = rte_eth_dev_get_reg_info_ext(port_id, ®_info);
|
|
+ if (ret != 0)
|
|
+ return ret;
|
|
+
|
|
+ info->length = reg_info.length;
|
|
+ info->width = reg_info.width;
|
|
+ info->version = reg_info.version;
|
|
+ info->offset = reg_info.offset;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int
|
|
+rte_eth_dev_get_reg_info_ext(uint16_t port_id, struct rte_dev_reg_info *info)
|
|
{
|
|
struct rte_eth_dev *dev;
|
|
+ uint32_t i;
|
|
int ret;
|
|
|
|
RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
|
|
@@ -6402,12 +6431,21 @@ rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ if (info->names != NULL && info->length != 0)
|
|
+ memset(info->names, 0, sizeof(struct rte_eth_reg_name) * info->length);
|
|
+
|
|
if (*dev->dev_ops->get_reg == NULL)
|
|
return -ENOTSUP;
|
|
ret = eth_err(port_id, (*dev->dev_ops->get_reg)(dev, info));
|
|
|
|
rte_ethdev_trace_get_reg_info(port_id, info, ret);
|
|
|
|
+ /* Report the default names if drivers not report. */
|
|
+ if (ret == 0 && info->names != NULL && strlen(info->names[0].name) == 0) {
|
|
+ for (i = 0; i < info->length; i++)
|
|
+ snprintf(info->names[i].name, RTE_ETH_REG_NAME_SIZE,
|
|
+ "index_%u", info->offset + i);
|
|
+ }
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
|
|
index b95ae691ce..480a04b668 100644
|
|
--- a/lib/ethdev/rte_ethdev.h
|
|
+++ b/lib/ethdev/rte_ethdev.h
|
|
@@ -5057,6 +5057,35 @@ __rte_experimental
|
|
int rte_eth_get_monitor_addr(uint16_t port_id, uint16_t queue_id,
|
|
struct rte_power_monitor_cond *pmc);
|
|
|
|
+/**
|
|
+ * Retrieve the filtered device registers (values and names) and
|
|
+ * register attributes (number of registers and register size)
|
|
+ *
|
|
+ * @param port_id
|
|
+ * The port identifier of the Ethernet device.
|
|
+ * @param info
|
|
+ * Pointer to rte_dev_reg_info structure to fill in.
|
|
+ * - If info->filter is NULL, return info for all registers (seen as filter
|
|
+ * none).
|
|
+ * - If info->filter is not NULL, return error if the driver does not support
|
|
+ * filter. Fill the length field with filtered register number.
|
|
+ * - If info->data is NULL, the function fills in the width and length fields.
|
|
+ * - If info->data is not NULL, ethdev considers there are enough spaces to
|
|
+ * store the registers, and the values of registers with the filter string
|
|
+ * as the module name are put into the buffer pointed at by info->data.
|
|
+ * - If info->names is not NULL, drivers should fill it or the ethdev fills it
|
|
+ * with default names.
|
|
+ * @return
|
|
+ * - (0) if successful.
|
|
+ * - (-ENOTSUP) if hardware doesn't support.
|
|
+ * - (-EINVAL) if bad parameter.
|
|
+ * - (-ENODEV) if *port_id* invalid.
|
|
+ * - (-EIO) if device is removed.
|
|
+ * - others depends on the specific operations implementation.
|
|
+ */
|
|
+__rte_experimental
|
|
+int rte_eth_dev_get_reg_info_ext(uint16_t port_id, struct rte_dev_reg_info *info);
|
|
+
|
|
/**
|
|
* Retrieve device registers and register attributes (number of registers and
|
|
* register size)
|
|
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
|
|
index a050baab0f..60f787bbb9 100644
|
|
--- a/lib/ethdev/version.map
|
|
+++ b/lib/ethdev/version.map
|
|
@@ -319,6 +319,7 @@ EXPERIMENTAL {
|
|
|
|
# added in 24.03
|
|
rte_eth_find_rss_algo;
|
|
+ rte_eth_dev_get_reg_info_ext;
|
|
};
|
|
|
|
INTERNAL {
|
|
--
|
|
2.20.1.windows.1
|
|
|