From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 1BC9B2E8B for ; Fri, 8 Sep 2017 11:21:30 +0200 (CEST) Received: from 6wind.com (unknown [10.16.0.189]) by proxy.6wind.com (Postfix) with SMTP id 725D0CE025; Fri, 8 Sep 2017 11:17:44 +0200 (CEST) Received: by 6wind.com (sSMTP sendmail emulation); Fri, 08 Sep 2017 11:21:15 +0200 From: Ivan Boule To: thomas@monjalon.net Cc: dev@dpdk.org Date: Fri, 8 Sep 2017 11:21:09 +0200 Message-Id: <1504862469-931-1-git-send-email-ivan.boule@6wind.com> X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [RFC] ethdev: add administrative information in per-port info 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: , X-List-Received-Date: Fri, 08 Sep 2017 09:21:30 -0000 To help administrative tasks on DPDK ports, add in the data structure rte_eth_dev_info the following per-port information to be supplied by the dev_infos_get() function exported by a Poll Mode Driver: - the set of supported link modes, - the set of advertised link modes, - the type of port connector, - autonegotiation enabled or not. Set new administrative fields to a default value in rte_eth_dev_info_get() before invoking the dev_infos_get() function exported by a PMD, if any. Once this API change is accepted, the dev_infos_get() function of PMDs will be updated accordingly to set these new fields, along with the port_infos_display() function of the testpmd to display them. Signed-off-by: Ivan Boule --- lib/librte_ether/rte_ethdev.c | 1 + lib/librte_ether/rte_ethdev.h | 112 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 0597641..4ca51e1 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1897,6 +1897,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info) memset(dev_info, 0, sizeof(struct rte_eth_dev_info)); dev_info->rx_desc_lim = lim; dev_info->tx_desc_lim = lim; + dev_info->connector = RTE_ETH_CONNECTOR_OTHER; RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get); (*dev->dev_ops->dev_infos_get)(dev, dev_info); diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 0adf327..ac49380 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -935,6 +935,113 @@ struct rte_pci_device; /** * Ethernet device information */ + +/* Types of port connector. */ +#define RTE_ETH_CONNECTOR_TP 0x00 /**< Twisted Pair */ +#define RTE_ETH_CONNECTOR_AUI 0x01 /**< Attachment Unit Interface */ +#define RTE_ETH_CONNECTOR_MII 0x02 /**< Media-Independent Interface */ +#define RTE_ETH_CONNECTOR_FIBRE 0x03 /**< Fiber */ +#define RTE_ETH_CONNECTOR_DA 0x05 /**< Direct Attach */ +#define RTE_ETH_CONNECTOR_NONE 0xef +#define RTE_ETH_CONNECTOR_OTHER 0xff + +/* Link modes. */ +#define RTE_ETH_LINK_MODE_10baseT_Half_BIT 0 +#define RTE_ETH_LINK_MODE_10baseT_Full_BIT 1 +#define RTE_ETH_LINK_MODE_100baseT_Half_BIT 2 +#define RTE_ETH_LINK_MODE_100baseT_Full_BIT 3 +#define RTE_ETH_LINK_MODE_1000baseT_Half_BIT 4 +#define RTE_ETH_LINK_MODE_1000baseT_Full_BIT 5 +#define RTE_ETH_LINK_MODE_Autoneg_BIT 6 +#define RTE_ETH_LINK_MODE_TP_BIT 7 +#define RTE_ETH_LINK_MODE_AUI_BIT 8 +#define RTE_ETH_LINK_MODE_MII_BIT 9 +#define RTE_ETH_LINK_MODE_FIBRE_BIT 10 +#define RTE_ETH_LINK_MODE_BNC_BIT 11 +#define RTE_ETH_LINK_MODE_10000baseT_Full_BIT 12 +#define RTE_ETH_LINK_MODE_Pause_BIT 13 +#define RTE_ETH_LINK_MODE_Asym_Pause_BIT 14 +#define RTE_ETH_LINK_MODE_2500baseX_Full_BIT 15 +#define RTE_ETH_LINK_MODE_Backplane_BIT 16 +#define RTE_ETH_LINK_MODE_1000baseKX_Full_BIT 17 +#define RTE_ETH_LINK_MODE_10000baseKX4_Full_BIT 18 +#define RTE_ETH_LINK_MODE_10000baseKR_Full_BIT 19 +#define RTE_ETH_LINK_MODE_10000baseR_FEC_BIT 20 +#define RTE_ETH_LINK_MODE_20000baseMLD2_Full_BIT 21 +#define RTE_ETH_LINK_MODE_20000baseKR2_Full_BIT 22 +#define RTE_ETH_LINK_MODE_40000baseKR4_Full_BIT 23 +#define RTE_ETH_LINK_MODE_40000baseCR4_Full_BIT 24 +#define RTE_ETH_LINK_MODE_40000baseSR4_Full_BIT 25 +#define RTE_ETH_LINK_MODE_40000baseLR4_Full_BIT 26 +#define RTE_ETH_LINK_MODE_56000baseKR4_Full_BIT 27 +#define RTE_ETH_LINK_MODE_56000baseCR4_Full_BIT 28 +#define RTE_ETH_LINK_MODE_56000baseSR4_Full_BIT 29 +#define RTE_ETH_LINK_MODE_56000baseLR4_Full_BIT 30 +#define RTE_ETH_LINK_MODE_25000baseCR_Full_BIT 31 +#define RTE_ETH_LINK_MODE_25000baseKR_Full_BIT 32 +#define RTE_ETH_LINK_MODE_25000baseSR_Full_BIT 33 +#define RTE_ETH_LINK_MODE_50000baseCR2_Full_BIT 34 +#define RTE_ETH_LINK_MODE_50000baseKR2_Full_BIT 35 +#define RTE_ETH_LINK_MODE_100000baseKR4_Full_BIT 36 +#define RTE_ETH_LINK_MODE_100000baseSR4_Full_BIT 37 +#define RTE_ETH_LINK_MODE_100000baseCR4_Full_BIT 38 +#define RTE_ETH_LINK_MODE_100000baseLR4_ER4_Full_BIT 39 +#define RTE_ETH_LINK_MODE_50000baseSR2_Full_BIT 40 +#define RTE_ETH_LINK_MODE_1000baseX_Full_BIT 41 +#define RTE_ETH_LINK_MODE_10000baseCR_Full_BIT 42 +#define RTE_ETH_LINK_MODE_10000baseSR_Full_BIT 43 +#define RTE_ETH_LINK_MODE_10000baseLR_Full_BIT 44 +#define RTE_ETH_LINK_MODE_10000baseLRM_Full_BIT 45 +#define RTE_ETH_LINK_MODE_10000baseER_Full_BIT 46 +#define RTE_ETH_LINK_MODE_2500baseT_Full_BIT 47 +#define RTE_ETH_LINK_MODE_5000baseT_Full_BIT 48 + +#define RTE_ETH_LINK_MODE_BIT(link_mode_base_name) \ + (RTE_ETH_LINK_MODE_ ## link_mode_base_name ## _BIT) + +/** + * Provide a set of inline functions to make PMDs and DPDK applications + * independent of the actual layout of the bitmaps used to represent + * the set of supported link modes and the set of advertised link modes. + * Hence, if more then 64 bits (say 70 bits for instance) are needed for + * new link modes: + * 1) the "rte_eth_link_modes" data structure can be modified as follows: + * struct rte_eth_link_modes { + * uint16_t bitmap[5]; + * }; + * 2) the rte_eth_link_mode_ functions below can be adapted to compute from + * the link mode bit the corresponding index of the 16-bit entry in the + * bitmap array and, within it, the appropriate bit to set/reset/get/test. + */ +struct rte_eth_link_modes { + uint64_t bitmap64; /**< Link modes bitmap (RTE_ETH_LINK_MODE_) */ +}; + +static inline void +rte_eth_link_mode_zero(struct rte_eth_link_modes *lk_modes) +{ + lk_modes->bitmap64 = 0; +} + +static inline void +rte_eth_link_mode_set(struct rte_eth_link_modes *lk_modes, int lk_mode_bit) +{ + lk_modes->bitmap64 |= (1ULL << lk_mode_bit); +} + +static inline void +rte_eth_link_mode_reset(struct rte_eth_link_modes *lk_modes, int lk_mode_bit) +{ + lk_modes->bitmap64 &= ~(1ULL << lk_mode_bit); +} + +static inline int +rte_eth_link_mode_is_set(struct rte_eth_link_modes *lk_modes, int lk_mode_bit) +{ + return ((uint64_t)(lk_modes->bitmap64 & (1ULL << lk_mode_bit)) == + (uint64_t) (1ULL << lk_mode_bit)); +} + struct rte_eth_dev_info { struct rte_pci_device *pci_dev; /**< Device PCI information. */ const char *driver_name; /**< Device Driver name. */ @@ -967,6 +1074,11 @@ struct rte_eth_dev_info { /** Configured number of rx/tx queues */ uint16_t nb_rx_queues; /**< Number of RX queues. */ uint16_t nb_tx_queues; /**< Number of TX queues. */ + /** Information useful for administrative purposes. */ + struct rte_eth_link_modes supported_modes; /**< Supported link modes */ + struct rte_eth_link_modes advertised_modes; /**< Advertised " */ + uint8_t connector; /**< RTE_ETH_CONNECTOR_ */ + uint8_t autoneg_enabled : 1; /**< autonegotiation enabled (1) or not */ }; /** -- 2.1.4