From b7ccfb09da9589da7f62ec5d671044578ec2659a Mon Sep 17 00:00:00 2001 From: "Min Hu (Connor)" Date: Thu, 8 Oct 2020 18:02:54 +0800 Subject: [PATCH] ethdev: introduce FEC API This patch adds Forward error correction(FEC) support for ethdev. Introduce APIs which support query and config FEC information in hardware. Signed-off-by: Min Hu (Connor) Reviewed-by: Wei Hu (Xavier) Reviewed-by: Chengwen Feng Reviewed-by: Chengchang Tang Acked-by: Andrew Rybchenko Reviewed-by: Ajit Khaparde --- doc/guides/rel_notes/release_20_11.rst | 5 ++ lib/librte_ethdev/rte_ethdev.c | 44 ++++++++++ lib/librte_ethdev/rte_ethdev.h | 105 +++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev_driver.h | 88 +++++++++++++++++++ lib/librte_ethdev/rte_ethdev_version.map | 3 + 5 files changed, 245 insertions(+) diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index 02f0eb005d..a1e023a20c 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -55,6 +55,11 @@ New Features Also, make sure to start the actual text at the margin. ======================================================= +* **Added the FEC API, for a generic FEC query and config.** + + Added the FEC API which provides functions for query FEC capabilities and + current FEC mode from device. Also, API for configuring FEC mode is also provided. + * **Updated Broadcom bnxt driver.** Updated the Broadcom bnxt driver with new features and improvements, including: diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 89858ab42e..59beb8aec2 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -3660,6 +3660,50 @@ rte_eth_led_off(uint16_t port_id) return eth_err(port_id, (*dev->dev_ops->dev_led_off)(dev)); } +int +rte_eth_fec_get_capability(uint16_t port_id, + struct rte_eth_fec_capa *speed_fec_capa, + unsigned int num) +{ + struct rte_eth_dev *dev; + int ret; + + if (speed_fec_capa == NULL && num > 0) + return -EINVAL; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fec_get_capability, -ENOTSUP); + ret = (*dev->dev_ops->fec_get_capability)(dev, speed_fec_capa, num); + + return ret; +} + +int +rte_eth_fec_get(uint16_t port_id, uint32_t *fec_capa) +{ + struct rte_eth_dev *dev; + + if (fec_capa == NULL) + return -EINVAL; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fec_get, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->fec_get)(dev, fec_capa)); +} + +int +rte_eth_fec_set(uint16_t port_id, uint32_t fec_capa) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fec_set, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->fec_set)(dev, fec_capa)); +} + /* * Returns index into MAC address array of addr. Use 00:00:00:00:00:00 to find * an empty spot. diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index 15b2f6de5a..3a31f94367 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -1544,6 +1544,29 @@ struct rte_eth_dcb_info { struct rte_eth_dcb_tc_queue_mapping tc_queue; }; +/** + * This enum indicates the possible Forward Error Correction (FEC) modes + * of an ethdev port. + */ +enum rte_eth_fec_mode { + RTE_ETH_FEC_NOFEC = 0, /**< FEC is off */ + RTE_ETH_FEC_AUTO, /**< FEC autonegotiation modes */ + RTE_ETH_FEC_BASER, /**< FEC using common algorithm */ + RTE_ETH_FEC_RS, /**< FEC using RS algorithm */ +}; + +/* Translate from FEC mode to FEC capa */ +#define RTE_ETH_FEC_MODE_TO_CAPA(x) (1U << (x)) + +/* This macro indicates FEC capa mask */ +#define RTE_ETH_FEC_MODE_CAPA_MASK(x) (1U << (RTE_ETH_FEC_ ## x)) + +/* A structure used to get capabilities per link speed */ +struct rte_eth_fec_capa { + uint32_t speed; /**< Link speed (see ETH_SPEED_NUM_*) */ + uint32_t capa; /**< FEC capabilities bitmask */ +}; + #define RTE_ETH_ALL RTE_MAX_ETHPORTS /* Macros to check for valid port */ @@ -3390,6 +3413,88 @@ int rte_eth_led_on(uint16_t port_id); */ int rte_eth_led_off(uint16_t port_id); +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Get Forward Error Correction(FEC) capability. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param speed_fec_capa + * speed_fec_capa is out only with per-speed capabilities. + * If set to NULL, the function returns the required number + * of required array entries. + * @param num + * a number of elements in an speed_fec_capa array. + * + * @return + * - A non-negative value lower or equal to num: success. The return value + * is the number of entries filled in the fec capa array. + * - A non-negative value higher than num: error, the given fec capa array + * is too small. The return value corresponds to the num that should + * be given to succeed. The entries in fec capa array are not valid and + * shall not be used by the caller. + * - (-ENOTSUP) if underlying hardware OR driver doesn't support. + * that operation. + * - (-EIO) if device is removed. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if *num* or *speed_fec_capa* invalid + */ +__rte_experimental +int rte_eth_fec_get_capability(uint16_t port_id, + struct rte_eth_fec_capa *speed_fec_capa, + unsigned int num); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Get current Forward Error Correction(FEC) mode. + * If link is down and AUTO is enabled, AUTO is returned, otherwise, + * configured FEC mode is returned. + * If link is up, current FEC mode is returned. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param fec_capa + * A bitmask of enabled FEC modes. If AUTO bit is set, other + * bits specify FEC modes which may be negotiated. If AUTO + * bit is clear, specify FEC modes to be used (only one valid + * mode per speed may be set). + * @return + * - (0) if successful. + * - (-ENOTSUP) if underlying hardware OR driver doesn't support. + * that operation. + * - (-EIO) if device is removed. + * - (-ENODEV) if *port_id* invalid. + */ +__rte_experimental +int rte_eth_fec_get(uint16_t port_id, uint32_t *fec_capa); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Set Forward Error Correction(FEC) mode. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param fec_capa + * A bitmask of allowed FEC modes. If AUTO bit is set, other + * bits specify FEC modes which may be negotiated. If AUTO + * bit is clear, specify FEC modes to be used (only one valid + * mode per speed may be set). + * @return + * - (0) if successful. + * - (-EINVAL) if the FEC mode is not valid. + * - (-ENOTSUP) if underlying hardware OR driver doesn't support. + * - (-EIO) if device is removed. + * - (-ENODEV) if *port_id* invalid. + */ +__rte_experimental +int rte_eth_fec_set(uint16_t port_id, uint32_t fec_capa); + /** * Get current status of the Ethernet link flow control for Ethernet device * diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index c3062c246c..35cc4fb186 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -574,6 +574,87 @@ typedef int (*eth_tx_hairpin_queue_setup_t) uint16_t nb_tx_desc, const struct rte_eth_hairpin_conf *hairpin_conf); +/** + * @internal + * Get Forward Error Correction(FEC) capability. + * + * @param dev + * ethdev handle of port. + * @param speed_fec_capa + * speed_fec_capa is out only with per-speed capabilities. + * @param num + * a number of elements in an speed_fec_capa array. + * + * @return + * Negative errno value on error, positive value on success. + * + * @retval positive value + * A non-negative value lower or equal to num: success. The return value + * is the number of entries filled in the fec capa array. + * A non-negative value higher than num: error, the given fec capa array + * is too small. The return value corresponds to the num that should + * be given to succeed. The entries in the fec capa array are not valid + * and shall not be used by the caller. + * @retval -ENOTSUP + * Operation is not supported. + * @retval -EIO + * Device is removed. + * @retval -EINVAL + * *num* or *speed_fec_capa* invalid. + */ +typedef int (*eth_fec_get_capability_t)(struct rte_eth_dev *dev, + struct rte_eth_fec_capa *speed_fec_capa, unsigned int num); + +/** + * @internal + * Get Forward Error Correction(FEC) mode. + * + * @param dev + * ethdev handle of port. + * @param fec_capa + * a bitmask of enabled FEC modes. If AUTO bit is set, other + * bits specify FEC modes which may be negotiated. If AUTO + * bit is clear, specify FEC modes to be used (only one valid + * mode per speed may be set). + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, get FEC success. + * @retval -ENOTSUP + * Operation is not supported. + * @retval -EIO + * Device is removed. + */ +typedef int (*eth_fec_get_t)(struct rte_eth_dev *dev, + uint32_t *fec_capa); + +/** + * @internal + * Set Forward Error Correction(FEC) mode. + * + * @param dev + * ethdev handle of port. + * @param fec_capa + * bitmask of allowed FEC modes. It must be only one + * if AUTO is disabled. If AUTO is enabled, other + * bits specify FEC modes which may be negotiated. + * + * @return + * Negative errno value on error, 0 on success. + * + * @retval 0 + * Success, set FEC success. + * @retval -ENOTSUP + * Operation is not supported. + * @retval -EINVAL + * Unsupported FEC mode requested. + * @retval -EIO + * Device is removed. + */ +typedef int (*eth_fec_set_t)(struct rte_eth_dev *dev, uint32_t fec_capa); + /** * @internal A structure containing the functions exported by an Ethernet driver. */ @@ -713,6 +794,13 @@ struct eth_dev_ops { /**< Set up device RX hairpin queue. */ eth_tx_hairpin_queue_setup_t tx_hairpin_queue_setup; /**< Set up device TX hairpin queue. */ + + eth_fec_get_capability_t fec_get_capability; + /**< Get Forward Error Correction(FEC) capability. */ + eth_fec_get_t fec_get; + /**< Get Forward Error Correction(FEC) mode. */ + eth_fec_set_t fec_set; + /**< Set Forward Error Correction(FEC) mode. */ }; /** diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index 4d4263a4af..f8a0945812 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -229,6 +229,9 @@ EXPERIMENTAL { # added in 20.11 rte_eth_link_speed_to_str; rte_eth_link_to_str; + rte_eth_fec_get_capability; + rte_eth_fec_get; + rte_eth_fec_set; }; INTERNAL { -- 2.20.1