On 6/2/2024 3:45 AM, Damodharam Ammepalli wrote:
> Update the eth_dev_ops structure with new function vectors
> to get and set number of speed lanes. This will help user to
> configure  the same fixed speed with different number of lanes
> based on the physical carrier type.
> 
> Signed-off-by: Damodharam Ammepalli <damodharam.ammepa...@broadcom.com>
> Reviewed-by: Kalesh AP <kalesh-anakkur.pura...@broadcom.com>
> Reviewed-by: Ajit Khaparde <ajit.khapa...@broadcom.com>
> ---
>  lib/ethdev/ethdev_driver.h | 49 +++++++++++++++++++++++++++++++++++
>  lib/ethdev/rte_ethdev.c    | 26 +++++++++++++++++++
>  lib/ethdev/rte_ethdev.h    | 52 ++++++++++++++++++++++++++++++++++++++
>  lib/ethdev/version.map     |  2 ++
>  4 files changed, 129 insertions(+)
> 
> diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
> index 0dbf2dd6a2..b1f473e4de 100644
> --- a/lib/ethdev/ethdev_driver.h
> +++ b/lib/ethdev/ethdev_driver.h
> @@ -1179,6 +1179,51 @@ typedef int (*eth_rx_descriptor_dump_t)(const struct 
> rte_eth_dev *dev,
>                                       uint16_t queue_id, uint16_t offset,
>                                       uint16_t num, FILE *file);
>  
> +/**
> + * @internal
> + * Get number of current active lanes and max supported lanes
>

There is already a 'eth_speed_lanes_get_capa' dev_ops, why max supported
lanes returned in this call, instead of capa?

> + *
> + * @param dev
> + *   ethdev handle of port.
> + * @param speed_lanes_capa
> + *   Number of active lanes that the link is trained up.
> + *   Max number of lanes supported by HW
> + * @return
> + *   Negative errno value on error, 0 on success.
> + *
> + * @retval 0
> + *   Success, get speed_lanes data success.
>

Success, speed_lanes_capa filled.

> + * @retval -ENOTSUP
> + *   Operation is not supported.
> + * @retval -EIO
> + *   Device is removed.
> + */
> +typedef int (*eth_speed_lanes_get_t)(struct rte_eth_dev *dev,
> +                                  struct rte_eth_speed_lanes_capa 
> *speed_lanes_capa);
> +
> +/**
> + * @internal
> + * Set speed lanes
>

As we are on the subject, we all understand what "speed lane" is in this
context, but I am not sure if the naming is descriptive enough, how this
is referenced in datasheet?

> + *
> + * @param dev
> + *   ethdev handle of port.
> + * @param speed_lanes_capa
> + *   Non-negative number of lanes
> + *
> + * @return
> + *   Negative errno value on error, 0 on success.
> + *
> + * @retval 0
> + *   Success, set lanes success.
> + * @retval -ENOTSUP
> + *   Operation is not supported.
> + * @retval -EINVAL
> + *   Unsupported mode requested.
> + * @retval -EIO
> + *   Device is removed.
> + */
> +typedef int (*eth_speed_lanes_set_t)(struct rte_eth_dev *dev, uint32_t 
> speed_lanes_capa);
> +

These new dev_ops seems inserted in between 'rx_descriptor_dump' &
'tx_descriptor_dump' dev_ops.
Can you please move them just below 'eth_link_update_t'?



>  /**
>   * @internal
>   * Dump Tx descriptor info to a file.
> @@ -1474,6 +1519,10 @@ struct eth_dev_ops {
>       eth_count_aggr_ports_t count_aggr_ports;
>       /** Map a Tx queue with an aggregated port of the DPDK port */
>       eth_map_aggr_tx_affinity_t map_aggr_tx_affinity;
> +     /** Get number of speed lanes supported and active lanes */
> +     eth_speed_lanes_get_t speed_lanes_get;
> +     /** Set number of speed lanes */
> +     eth_speed_lanes_set_t speed_lanes_set;
>  };
>  
>  /**
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index f1c658f49e..45e2f7645b 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -7008,4 +7008,30 @@ int rte_eth_dev_map_aggr_tx_affinity(uint16_t port_id, 
> uint16_t tx_queue_id,
>       return ret;
>  }
>  
> +int
> +rte_eth_speed_lanes_get(uint16_t port_id, struct rte_eth_speed_lanes_capa 
> *capa)
> +{
> +     struct rte_eth_dev *dev;
> +
> +     RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> +     dev = &rte_eth_devices[port_id];
> +
> +     if (*dev->dev_ops->speed_lanes_get == NULL)
> +             return -ENOTSUP;
> +     return eth_err(port_id, (*dev->dev_ops->speed_lanes_get)(dev, capa));
>

Shouldn't we verify if 'capa' is not NULL in API?

> +}
> +
> +int
> +rte_eth_speed_lanes_set(uint16_t port_id, uint32_t speed_lanes_capa)
> +{
> +     struct rte_eth_dev *dev;
> +
> +     RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> +     dev = &rte_eth_devices[port_id];
> +
> +     if (*dev->dev_ops->speed_lanes_set == NULL)
> +             return -ENOTSUP;
> +     return eth_err(port_id, (*dev->dev_ops->speed_lanes_set)(dev, 
> speed_lanes_capa));
> +}
> +
>  RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO);
> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
> index 147257d6a2..caae1f27c6 100644
> --- a/lib/ethdev/rte_ethdev.h
> +++ b/lib/ethdev/rte_ethdev.h
> @@ -1997,6 +1997,12 @@ struct rte_eth_fec_capa {
>       uint32_t capa;  /**< FEC capabilities bitmask */
>  };
>  
> +/* A structure used to get and set lanes capabilities per link speed */
> +struct rte_eth_speed_lanes_capa {
> +     uint32_t active_lanes;
> +     uint32_t max_lanes_cap;
> +};
> +
>  #define RTE_ETH_ALL RTE_MAX_ETHPORTS
>  
>  /* Macros to check for valid port */
> @@ -6917,6 +6923,52 @@ rte_eth_tx_queue_count(uint16_t port_id, uint16_t 
> queue_id)
>       return rc;
>  }
>  
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
> + *
> + * Get maximum speed lanes supported by the NIC.
>

Isn't this API to get the current lane number?

> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @param speed_lanes_capa
> + *   speed_lanes_capa is out only with max speed lanes capabilities.
> + *   If set to NULL, then its assumed zero or not supported.
>

Why NULL 'capa' is supported?

> + *
> + * @return
> + *   - A non-negative value of active lanes that currently link is up with.
> + *   - A non-negative value that this HW scales up to for all speeds.
>

Isn't the return value only for status, error or success, and data
stored in 'capa' pointer?


> + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support.
> + *     that operation.
> + *   - (-EIO) if device is removed.
> + *   - (-ENODEV)  if *port_id* invalid.
> + *   - (-EINVAL)  if *speed_lanes_capa* invalid
>

This is 'get' function, how 'speed_lanes_capa' can be invalid?

> + */
> +__rte_experimental
> +int rte_eth_speed_lanes_get(uint16_t port_id, struct 
> rte_eth_speed_lanes_capa *capa);
> +
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
> + *
> + * Set speed lanes supported by the NIC.
>

Should we document somewhere that this is only for the case Auto
Negotiation (AN) is disabled, otherwise AN will figure out the lanes.

> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @param speed_lanes
> + *   speed_lanes a non-zero value of number lanes for this speeds.
>

Please reword 'this speeds'

> + *
> + * @return
> + *  - (>=0) valid input and supported by driver or hardware.
>

Lanes set successfully?


> + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support.
> + *     that operation.
> + *   - (-EIO) if device is removed.
> + *   - (-ENODEV)  if *port_id* invalid.
> + *   - (-EINVAL)  if *speed_lanes* invalid
> + */
> +__rte_experimental
> +int rte_eth_speed_lanes_set(uint16_t port_id, uint32_t speed_lanes_capa);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
> index 79f6f5293b..9c27980f3a 100644
> --- a/lib/ethdev/version.map
> +++ b/lib/ethdev/version.map
> @@ -325,6 +325,8 @@ EXPERIMENTAL {
>       rte_flow_template_table_resizable;
>       rte_flow_template_table_resize;
>       rte_flow_template_table_resize_complete;
> +     rte_eth_speed_lanes_get;
> +     rte_eth_speed_lanes_set;
>

Please follow the syntax in the file, add "# added in 24.07" comment and
add new APIs under it alphabetically sorted way.

Reply via email to