[PATCH v4 1/7] ethdev: support report register names and filter
Jie Hai
haijie1 at huawei.com
Wed Mar 6 08:22:01 CET 2024
Hi, fengchengwen,
On 2024/2/26 16:01, fengchengwen wrote:
> Hi Jie,
>
> On 2024/2/26 11:07, Jie Hai wrote:
>> 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 names.
>>
>> The new API rte_eth_dev_get_reg_info_ext() is added to support
>> reporting names and filtering by names. And the original API
>> rte_eth_dev_get_reg_info() does not use the name 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 "offset_XXX".
>>
>> Signed-off-by: Jie Hai <haijie1 at huawei.com>
>> ---
>> doc/guides/rel_notes/release_24_03.rst | 8 ++++++
>> lib/ethdev/rte_dev_info.h | 11 +++++++++
>> lib/ethdev/rte_ethdev.c | 34 ++++++++++++++++++++++++++
>> lib/ethdev/rte_ethdev.h | 28 +++++++++++++++++++++
>> lib/ethdev/version.map | 1 +
>> 5 files changed, 82 insertions(+)
>>
>> diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst
>> index 32d0ad8cf6a7..fa46da427dca 100644
>> --- a/doc/guides/rel_notes/release_24_03.rst
>> +++ b/doc/guides/rel_notes/release_24_03.rst
>> @@ -132,6 +132,11 @@ New Features
>> to support TLS v1.2, TLS v1.3 and DTLS v1.2.
>> * Added PMD API to allow raw submission of instructions to CPT.
>>
>> + * **Added support for dumping registers with names and filter.**
>> +
>> + * Added new API functions ``rte_eth_dev_get_reg_info_ext()`` to and filter
>> + the registers by their names and get the information of registers(names,
>> + values and other attributes).
>>
>> Removed Items
>> -------------
>> @@ -197,6 +202,9 @@ ABI Changes
>>
>> * No ABI change that would break compatibility with 23.11.
>>
>> +* ethdev: Added ``filter`` and ``names`` fields to ``rte_dev_reg_info``
>> + structure for reporting names of registers and filtering them by names.
>> +
>>
>> Known Issues
>> ------------
>> diff --git a/lib/ethdev/rte_dev_info.h b/lib/ethdev/rte_dev_info.h
>> index 67cf0ae52668..0ad4a43b9526 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 128
>
> Almost all stats name size is 64, why not keep consistent?
>
will correct.
>> +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 */
>> + /**
>> + * 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 f1c658f49e80..9ef50c633ce3 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_LINE(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);
>> @@ -6408,6 +6437,11 @@ rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
>>
>> rte_ethdev_trace_get_reg_info(port_id, info, ret);
>>
>> + /* Report the default names if drivers not report. */
>> + if (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,
>> + "offset_%x", info->offset + i * info->width);
>
> %x has no prefix "0x", may lead to confused.
> How about use %u ?
>
That sounds better.
> Another question, if app don't zero names' memory, then its value is random, so it will not enter this logic.
> Suggest memset item[0]'s name memory before invoke PMD ops.
>
>> return ret;
>> }
>>
>> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
>> index ed27360447a3..09e2d5fdb49b 100644
>> --- a/lib/ethdev/rte_ethdev.h
>> +++ b/lib/ethdev/rte_ethdev.h
>> @@ -5066,6 +5066,34 @@ __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 not NULL and the driver does not support names or
>> + * filter, return error. If info->filter is NULL, return info for all
>> + * registers (seen as filter none).
>> + * If info->data is NULL, the function fills in the width and length fields.
>> + * If non-NULL, ethdev considers there are enough spaces to store the
>> + * registers, and the values of registers whose name contains the filter
>> + * string are put into the buffer pointed at by the data field. Do the same
>> + * for the names of registers if info->names is not NULL. If drivers do not
>> + * report names, default names are given by ethdev.
>
> It's a little hard to understand. Suggest use '-' for each field, just like rte_eth_remove_tx_callback
>
I will try.
>> + * @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 17e4eac8a4cc..c41a64e404db 100644
>> --- a/lib/ethdev/version.map
>> +++ b/lib/ethdev/version.map
>> @@ -325,6 +325,7 @@ EXPERIMENTAL {
>> rte_flow_template_table_resizable;
>> rte_flow_template_table_resize;
>> rte_flow_template_table_resize_complete;
>> + rte_eth_dev_get_reg_info_ext;
>
> should place with alphabetical order.
>
> Thanks
Ok.
>
>> };
>>
>> INTERNAL {
>>
> .
Thanks,
Jie Hai
More information about the dev
mailing list