From patchwork Tue Mar 2 11:43:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 88375 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 13807A054F; Tue, 2 Mar 2021 12:43:30 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F09B022A2D6; Tue, 2 Mar 2021 12:43:29 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 153F622A2C8 for ; Tue, 2 Mar 2021 12:43:28 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@nvidia.com) with SMTP; 2 Mar 2021 13:43:27 +0200 Received: from nvidia.com ([172.27.8.104]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 122BhOQY006574; Tue, 2 Mar 2021 13:43:25 +0200 From: Xueming Li To: Andrew Rybchenko Cc: dev@dpdk.org, Viacheslav Ovsiienko , xuemingl@nvidia.com, Asaf Penso , Thomas Monjalon , Ferruh Yigit , Ray Kinsella , Neil Horman Date: Tue, 2 Mar 2021 19:43:21 +0800 Message-Id: <20210302114322.1378-1-xuemingl@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <1608303356-13089-2-git-send-email-xuemingl@nvidia.com> References: <1608303356-13089-2-git-send-email-xuemingl@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v7 7/9] ethdev: new API to get representor info X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" The NIC can have multiple PCIe links and can be attached to multiple hosts, for example the same single NIC can be shared for multiple server units in the rack. On each PCIe link NIC can provide multiple PFs and VFs/SFs based on these ones. The full representor identifier consists of three indices - controller index, PF index, and VF or SF index (if any). This patch introduces a new API rte_eth_representor_info_get() to retrieve representor corresponding info mapping: - caller controller index and pf index. - supported representor ID ranges. - type, controller, pf and start vf/sf ID of each range. The API is useful to convert representor from devargs to representor ID. New ethdev callback representor_info_get() is added to retrieve info from PMD driver, optional for PMD that doesn't support new devargs representor syntax. Signed-off-by: Xueming Li Acked-by: Andrew Rybchenko --- lib/librte_ethdev/ethdev_driver.h | 7 +++++ lib/librte_ethdev/rte_ethdev.c | 14 +++++++++ lib/librte_ethdev/rte_ethdev.h | 51 +++++++++++++++++++++++++++++++ lib/librte_ethdev/version.map | 3 ++ 4 files changed, 75 insertions(+) diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h index 06ff35266f..7b0f392e34 100644 --- a/lib/librte_ethdev/ethdev_driver.h +++ b/lib/librte_ethdev/ethdev_driver.h @@ -289,6 +289,10 @@ typedef int (*eth_fw_version_get_t)(struct rte_eth_dev *dev, char *fw_version, size_t fw_size); /**< @internal Get firmware information of an Ethernet device. */ +typedef int (*eth_representor_info_get_t)(struct rte_eth_dev *dev, + struct rte_eth_representor_info *info); +/**< @internal Get representor type and ID range. */ + typedef int (*eth_tx_done_cleanup_t)(void *txq, uint32_t free_cnt); /**< @internal Force mbufs to be from TX ring. */ @@ -940,6 +944,9 @@ struct eth_dev_ops { eth_get_monitor_addr_t get_monitor_addr; /**< Get power monitoring condition for Rx queue. */ + + eth_representor_info_get_t representor_info_get; + /**< Get representor info. */ }; /** diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 60889a8663..c88e345e7d 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -3265,6 +3265,20 @@ rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size) fw_version, fw_size)); } +int +rte_eth_representor_info_get(uint16_t port_id, + struct rte_eth_representor_info *info) +{ + 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->representor_info_get, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->representor_info_get)(dev, + info)); +} + int rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info) { diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index 9cd519bf59..a72843c65c 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -1581,6 +1581,38 @@ struct rte_eth_dev_info { void *reserved_ptrs[2]; /**< Reserved for future fields */ }; +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice. + * + * ethernet device representor ID range entry + */ +struct rte_eth_representor_range { + enum rte_eth_representor_type type; /**< Representor type */ + int controller; /**< Controller ID, -1 to ignore */ + int pf; /**< Physical function ID, -1 to ignore */ + __extension__ + union { + int vf; /**< VF start index */ + int sf; /**< SF start index */ + }; + uint16_t id_base; /**< Representor ID start index */ + uint16_t id_end; /**< Representor ID end index */ + char name[RTE_DEV_NAME_MAX_LEN]; /**< Representor name */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice. + * + * Ethernet device representor information + */ +struct rte_eth_representor_info { + uint16_t controller; /**< Controller ID of caller device. */ + uint16_t pf; /**< Physical function ID of caller device. */ + struct rte_eth_representor_range ranges[];/**< Representor ID range. */ +}; + /** * Ethernet device RX queue information structure. * Used to retrieve information about configured queue. @@ -3038,6 +3070,25 @@ int rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr); */ int rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info); +/** + * Retrieve the representor info of the device. + * + * @param port_id + * The port identifier of the device. + * @param info + * A pointer to a representor info structure. + * NULL to return number of range entries and allocate memory + * for next call to store detail. + * @return + * - (-ENOTSUP) if operation is not supported. + * - (-ENODEV) if *port_id* invalid. + * - (-EIO) if device is removed. + * - (>=0) number of representor range entries supported by device. + */ +__rte_experimental +int rte_eth_representor_info_get(uint16_t port_id, + struct rte_eth_representor_info *info); + /** * Retrieve the firmware version of a device. * diff --git a/lib/librte_ethdev/version.map b/lib/librte_ethdev/version.map index a124e1e370..bb6f7436c2 100644 --- a/lib/librte_ethdev/version.map +++ b/lib/librte_ethdev/version.map @@ -243,6 +243,9 @@ EXPERIMENTAL { # added in 21.02 rte_eth_get_monitor_addr; + + # added in 21.05 + rte_eth_representor_info_get; }; INTERNAL {