From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CD3BCA054F; Tue, 2 Mar 2021 12:56:10 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5C2454014E; Tue, 2 Mar 2021 12:56:10 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 563D140142 for ; Tue, 2 Mar 2021 12:56:09 +0100 (CET) Received: from [192.168.38.17] (aros.oktetlabs.ru [192.168.38.17]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id D2D7C7F40D; Tue, 2 Mar 2021 14:56:08 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru D2D7C7F40D DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1614686168; bh=dU8V46MDuA6I1O1s7JR4VBtpLwU1qM/rZ1b5rFb49HY=; h=Subject:To:Cc:References:From:Date:In-Reply-To; b=TSzz4Du6Y4SEs2OwFJcNWoz2ruaCndzq3uaa8L1InBYA1ei39iulUkO42sGkb0gYc 1O+LqdYZc6/ZSo78TwFHCl16sQNgreQbf7YsIJmtu0zGENzp+H4EX2D0GBY1ibI2ry QPljz9ql2nqntLZJRu6g210S7OsdUp+EwUJbQM5E= To: Xueming Li Cc: dev@dpdk.org, Viacheslav Ovsiienko , Asaf Penso , Thomas Monjalon , Ferruh Yigit , Ray Kinsella , Neil Horman References: <1608303356-13089-2-git-send-email-xuemingl@nvidia.com> <20210302114322.1378-1-xuemingl@nvidia.com> From: Andrew Rybchenko Organization: OKTET Labs Message-ID: Date: Tue, 2 Mar 2021 14:56:08 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <20210302114322.1378-1-xuemingl@nvidia.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [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" On 3/2/21 2:43 PM, Xueming Li wrote: > 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 LGTM, except style nitpicking, see below. Just be consistent. 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. */ > + Here the snippet is added after FW version get. > 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. */ Here at the end. > }; > > /** > 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)); > +} > + Here after FW version get again. > 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. */ > +}; > + I'd put it just before rte_eth_representor_info_get(). > /** > * 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); > + Here you add it *before* FW version get. > /** > * 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 { >