[Public]

Hi Vanishka,

I believe you were trying to reach out using  email id 
`vipin.vargh...@intel.com`. Please use `vipin.vargh...@amd.com` as I no longer 
have access to intel.com

Snipped

>
>
> From: Vinod Pullabhatla <vinod.pullabha...@nxp.com>
>
> Add support to set Tx rate on DPAA platform through PMD APIs
>
> Signed-off-by: Vinod Pullabhatla <vinod.pullabha...@nxp.com>
> Signed-off-by: Vanshika Shukla <vanshika.shu...@nxp.com>
> ---
>  .mailmap                             |  1 +
>  drivers/net/dpaa/dpaa_flow.c         | 87 +++++++++++++++++++++++++++-
>  drivers/net/dpaa/fmlib/fm_lib.c      | 30 ++++++++++
>  drivers/net/dpaa/fmlib/fm_port_ext.h |  2 +-
>  drivers/net/dpaa/rte_pmd_dpaa.h      | 21 ++++++-
>  5 files changed, 137 insertions(+), 4 deletions(-)
>
> diff --git a/.mailmap b/.mailmap
> index 563f602bcc..d2d9ad2758 100644
> --- a/.mailmap
> +++ b/.mailmap
> @@ -1635,6 +1635,7 @@ Vincent S. Cojot <vco...@redhat.com>  Vinh Tran
> <vinh.t.tra...@gmail.com>  Vipin Padmam Ramesh <vip...@vmware.com>
> Vinod Krishna <vinod.kris...@arm.com>
> +Vinod Pullabhatla <vinod.pullabha...@nxp.com>
>  Vipin Varghese <vipin.vargh...@amd.com> <vipin.vargh...@intel.com>  Vipul
> Ashri <vipul.as...@oracle.com>  Visa Hankala <v...@hankala.org> diff --git
> a/drivers/net/dpaa/dpaa_flow.c b/drivers/net/dpaa/dpaa_flow.c index
> 2a22b23c8f..eb4bbb097c 100644
> --- a/drivers/net/dpaa/dpaa_flow.c
> +++ b/drivers/net/dpaa/dpaa_flow.c
> @@ -1,5 +1,5 @@
>  /* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright 2017-2019,2021-2024 NXP
> + * Copyright 2017-2019,2021-2025 NXP
>   */
>
>  /* System headers */
> @@ -669,6 +669,22 @@ static inline int get_rx_port_type(struct fman_if *fif)
>         return e_FM_PORT_TYPE_DUMMY;
>  }
>
> +static inline int get_tx_port_type(struct fman_if *fif) {
> +       if (fif->mac_type == fman_offline_internal ||
> +           fif->mac_type == fman_onic)
> +               return e_FM_PORT_TYPE_OH_OFFLINE_PARSING;
> +       else if (fif->mac_type == fman_mac_1g)
> +               return e_FM_PORT_TYPE_TX;
> +       else if (fif->mac_type == fman_mac_2_5g)
> +               return e_FM_PORT_TYPE_TX_2_5G;
> +       else if (fif->mac_type == fman_mac_10g)
> +               return e_FM_PORT_TYPE_TX_10G;
> +
> +       DPAA_PMD_ERR("MAC type unsupported");
> +       return e_FM_PORT_TYPE_DUMMY;
> +}
> +
>  static inline int set_fm_port_handle(struct dpaa_if *dpaa_intf,
>                                      uint64_t req_dist_set,
>                                      struct fman_if *fif) @@ -889,9 +905,9 @@ 
> int
> dpaa_fm_init(void)
>         /* FM PCD Enable */
>         ret = fm_pcd_enable(pcd_handle);
>         if (ret) {
> -               fm_close(fman_handle);
>                 fm_pcd_close(pcd_handle);
>                 DPAA_PMD_ERR("fm_pcd_enable: Failed");
> +               fm_close(fman_handle);
>                 return -1;
>         }
>
> @@ -1073,3 +1089,70 @@ int dpaa_port_vsp_cleanup(struct dpaa_if *dpaa_intf,
> struct fman_if *fif)
>
>         return E_OK;
>  }
> +
> +int rte_pmd_dpaa_port_set_rate_limit(uint16_t port_id, uint16_t burst,
> +                                    uint32_t rate) {
> +       t_fm_port_rate_limit port_rate_limit;
> +       bool port_handle_exists = true;
> +       void *handle;
> +       uint32_t ret;
> +       struct rte_eth_dev *dev;
> +       struct dpaa_if *dpaa_intf;
> +       struct fman_if *fif;
> +
> +       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> +       dev = &rte_eth_devices[port_id];
> +       dpaa_intf = dev->data->dev_private;
> +       fif = dev->process_private;
> +
> +       memset(&port_rate_limit, 0, sizeof(port_rate_limit));
> +       port_rate_limit.max_burst_size = burst;
> +       port_rate_limit.rate_limit = rate;
> +
> +       DPAA_PMD_DEBUG("Port:%s: set max Burst =%u max Rate =%u",
> +               dpaa_intf->name, burst, rate);
> +
> +       if (!dpaa_intf->port_handle) {
> +               t_fm_port_params fm_port_params;
> +
> +               /* Memset FM port params */
> +               memset(&fm_port_params, 0, sizeof(fm_port_params));
> +
> +               /* Set FM port params */
> +               fm_port_params.h_fm = fm_open(0);
> +               fm_port_params.port_type = get_tx_port_type(fif);
> +               fm_port_params.port_id = mac_idx[fif->mac_idx];
> +
> +               /* FM PORT Open */
> +               handle = fm_port_open(&fm_port_params);
> +               fm_close(fm_port_params.h_fm);
> +               if (!handle) {
> +                       DPAA_PMD_ERR("Can't open handle %p",
> +                                    fm_info.fman_handle);
> +                       return -ENODEV;
> +               }
> +
> +               port_handle_exists = false;
> +       } else {
> +               handle = dpaa_intf->port_handle;
> +       }
> +
> +       if (burst == 0 || rate == 0)
> +               ret = fm_port_delete_rate_limit(handle);
> +       else
> +               ret = fm_port_set_rate_limit(handle, &port_rate_limit);
> +
> +       if (ret) {
> +               DPAA_PMD_ERR("Failed to %s rate limit ret = %#x.",
> +                       (!burst || !rate) ? "del" : "set", ret);
> +       } else {
> +               DPAA_PMD_DEBUG("Success to %s rate limit,",
> +                       (!burst || !rate) ? "del" : "set");
> +       }
> +
> +       if (!port_handle_exists)
> +               fm_port_close(handle);
> +
> +       return -ret;
> +}
> diff --git a/drivers/net/dpaa/fmlib/fm_lib.c 
> b/drivers/net/dpaa/fmlib/fm_lib.c index
> b35feba004..d34993de38 100644
> --- a/drivers/net/dpaa/fmlib/fm_lib.c
> +++ b/drivers/net/dpaa/fmlib/fm_lib.c
> @@ -558,3 +558,33 @@ get_device_id(t_handle h_dev)
>
>         return (t_handle)p_dev->id;
>  }
> +
> +uint32_t
> +fm_port_delete_rate_limit(t_handle h_fm_port) {
> +       t_device        *p_dev = (t_device *)h_fm_port;
> +
> +       _fml_dbg("Calling...");
> +
> +       if (ioctl(p_dev->fd, FM_PORT_IOC_REMOVE_RATE_LIMIT))
> +               RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
> +
> +       _fml_dbg("Finishing.");
> +
> +       return E_OK;
> +}
> +
> +uint32_t
> +fm_port_set_rate_limit(t_handle h_fm_port, t_fm_port_rate_limit
> +*p_rate_limit) {
> +       t_device        *p_dev = (t_device *)h_fm_port;
> +
> +       _fml_dbg("Calling...");
> +
> +       if (ioctl(p_dev->fd, FM_PORT_IOC_SET_RATE_LIMIT, p_rate_limit))
> +               RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
> +
> +       _fml_dbg("Finishing.");
> +
> +       return E_OK;
> +}
> diff --git a/drivers/net/dpaa/fmlib/fm_port_ext.h
> b/drivers/net/dpaa/fmlib/fm_port_ext.h
> index bb2e00222e..f1cbf37de3 100644
> --- a/drivers/net/dpaa/fmlib/fm_port_ext.h
> +++ b/drivers/net/dpaa/fmlib/fm_port_ext.h
> @@ -274,7 +274,7 @@ typedef struct ioc_fm_port_congestion_groups_t {
>   * @Return     0 on success; error code otherwise.
>   */
>  #define FM_PORT_IOC_SET_RATE_LIMIT \
> -       IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(3),
> ioc_fm_port_rate_limit_t)
> +       _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(3),
> + ioc_fm_port_rate_limit_t)
>
>  /*
>   * @Function     fm_port_delete_rate_limit
> diff --git a/drivers/net/dpaa/rte_pmd_dpaa.h b/drivers/net/dpaa/rte_pmd_dpaa.h
> index ec45633ba2..1a847c4d43 100644
> --- a/drivers/net/dpaa/rte_pmd_dpaa.h
> +++ b/drivers/net/dpaa/rte_pmd_dpaa.h
> @@ -1,5 +1,5 @@
>  /* SPDX-License-Identifier: BSD-3-Clause
> - * Copyright 2018 NXP
> + * Copyright 2018, 2022, 2024 NXP
>   */
>
>  #ifndef _PMD_DPAA_H_
> @@ -31,4 +31,23 @@
>  int
>  rte_pmd_dpaa_set_tx_loopback(uint16_t port, uint8_t on);
>
> +/**
> + * Set TX rate limit
> + *
> + * @param port_id
> + *    The port identifier of the Ethernet device.
> + * @param burst
> + *    Max burst size(KBytes) of the Ethernet device.
> + *    0 - Disable TX rate limit.
> + * @param rate
> + *    Max rate(Kb/sec) of the Ethernet device.
> + *    0 - Disable TX rate limit.
> + * @return
> + *    0 - if successful.
> + *    <0 - if failed, with proper error code.
> + */
> +int
> +rte_pmd_dpaa_port_set_rate_limit(uint16_t port_id, uint16_t burst,
> +                                uint32_t rate);
> +
>  #endif /* _PMD_DPAA_H_ */
> --
> 2.25.1

Reply via email to