From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 768C3A04C0; Tue, 29 Sep 2020 03:06:23 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0E4A91D936; Tue, 29 Sep 2020 03:06:21 +0200 (CEST) Received: from huawei.com (szxga06-in.huawei.com [45.249.212.32]) by dpdk.org (Postfix) with ESMTP id 572091D936 for ; Tue, 29 Sep 2020 03:06:19 +0200 (CEST) Received: from DGGEMS412-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id B44EE32CF6F6C1ADA7D1; Tue, 29 Sep 2020 09:06:16 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS412-HUB.china.huawei.com (10.3.19.212) with Microsoft SMTP Server id 14.3.487.0; Tue, 29 Sep 2020 09:06:09 +0800 From: "Min Hu (Connor)" To: CC: , , , , Date: Tue, 29 Sep 2020 09:03:37 +0800 Message-ID: <1601341419-15870-2-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1601341419-15870-1-git-send-email-humin29@huawei.com> References: <1599534347-20430-1-git-send-email-humin29@huawei.com> <1601341419-15870-1-git-send-email-humin29@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH V15 1/3] ethdev: introduce FEC API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- v14->v15: change mode to fec_capa in fec set API. --- v13->v14: change mode to fec_capa. fix comment about API. --- v12->v13: change fec get capa API. fix comment styles. --- v10->v11: allow to report capabilities per link speed. specify what should be reported if link is down when get FEC. change mode to capa bitmask. --- v9->v10: add macro RTE_ETH_FEC_MODE_CAPA_MASK(x) to indicate different FEC mode capa. --- v8->v9: added reviewed-by and acked-by. --- v7->v8: put AUTO just after NOFEC in rte_fec_mode definition. --- v6->v7: deleted RTE_ETH_FEC_NUM to prevent ABI breakage. add new macro to indicate translation from fec mode to capa. --- v5->v6: modified release notes. deleted check duplicated for FEC API fixed code styles according to DPDK coding style. added _eth prefix. --- v4->v5: Modifies FEC capa definitions using macros. Add RTE_ prefix for public FEC mode enum. add release notes about FEC for dpdk20_11. --- v2->v3: add function return value "-ENOTSUP" for API. --- 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 c6642f5..1f04bd5 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -78,6 +78,11 @@ New Features ``--portmask=N`` where N represents the hexadecimal bitmask of ports used. +* **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. + Removed Items ------------- diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index dfe5c1b..ca596c1 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -3679,6 +3679,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 645a186..7938202 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 */ @@ -3397,6 +3420,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 * * @param port_id diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index 23cc1e0..f147a67 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -575,6 +575,87 @@ typedef int (*eth_tx_hairpin_queue_setup_t) 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. */ struct eth_dev_ops { @@ -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 c95ef51..b9ace3a 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.7.4