193cc4f0dSTal Shnaiderman /* SPDX-License-Identifier: BSD-3-Clause 293cc4f0dSTal Shnaiderman * Copyright 2020 Mellanox Technologies, Ltd 393cc4f0dSTal Shnaiderman */ 493cc4f0dSTal Shnaiderman #include <stdio.h> 593cc4f0dSTal Shnaiderman 693cc4f0dSTal Shnaiderman #include <rte_errno.h> 793cc4f0dSTal Shnaiderman #include <rte_ether.h> 893cc4f0dSTal Shnaiderman #include <rte_ethdev_driver.h> 993cc4f0dSTal Shnaiderman #include <rte_interrupts.h> 1093cc4f0dSTal Shnaiderman 1193cc4f0dSTal Shnaiderman #include <mlx5_glue.h> 1293cc4f0dSTal Shnaiderman #include <mlx5_devx_cmds.h> 1393cc4f0dSTal Shnaiderman #include <mlx5_common.h> 1493cc4f0dSTal Shnaiderman #include <mlx5_win_ext.h> 1593cc4f0dSTal Shnaiderman #include <mlx5_malloc.h> 1693cc4f0dSTal Shnaiderman #include <mlx5.h> 1799d7c45cSTal Shnaiderman #include <mlx5_utils.h> 1893cc4f0dSTal Shnaiderman 1993cc4f0dSTal Shnaiderman /** 2093cc4f0dSTal Shnaiderman * Get MAC address by querying netdevice. 2193cc4f0dSTal Shnaiderman * 2293cc4f0dSTal Shnaiderman * @param[in] dev 2393cc4f0dSTal Shnaiderman * Pointer to Ethernet device. 2493cc4f0dSTal Shnaiderman * @param[out] mac 2593cc4f0dSTal Shnaiderman * MAC address output buffer. 2693cc4f0dSTal Shnaiderman * 2793cc4f0dSTal Shnaiderman * @return 2893cc4f0dSTal Shnaiderman * 0 on success, a negative errno value otherwise and rte_errno is set. 2993cc4f0dSTal Shnaiderman */ 3093cc4f0dSTal Shnaiderman int 3193cc4f0dSTal Shnaiderman mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[RTE_ETHER_ADDR_LEN]) 3293cc4f0dSTal Shnaiderman { 3393cc4f0dSTal Shnaiderman struct mlx5_priv *priv; 3493cc4f0dSTal Shnaiderman mlx5_context_st *context_obj; 3593cc4f0dSTal Shnaiderman 3693cc4f0dSTal Shnaiderman if (!dev) { 3793cc4f0dSTal Shnaiderman rte_errno = EINVAL; 3893cc4f0dSTal Shnaiderman return -rte_errno; 3993cc4f0dSTal Shnaiderman } 4093cc4f0dSTal Shnaiderman priv = dev->data->dev_private; 4193cc4f0dSTal Shnaiderman context_obj = (mlx5_context_st *)priv->sh->ctx; 4293cc4f0dSTal Shnaiderman memcpy(mac, context_obj->mlx5_dev.eth_mac, RTE_ETHER_ADDR_LEN); 4393cc4f0dSTal Shnaiderman return 0; 4493cc4f0dSTal Shnaiderman } 45b653ce1dSOphir Munk 46b653ce1dSOphir Munk /** 47*07cae8ffSTal Shnaiderman * Get device MTU. 48*07cae8ffSTal Shnaiderman * 49*07cae8ffSTal Shnaiderman * @param dev 50*07cae8ffSTal Shnaiderman * Pointer to Ethernet device. 51*07cae8ffSTal Shnaiderman * @param[out] mtu 52*07cae8ffSTal Shnaiderman * MTU value output buffer. 53*07cae8ffSTal Shnaiderman * 54*07cae8ffSTal Shnaiderman * @return 55*07cae8ffSTal Shnaiderman * 0 on success, a negative errno value otherwise and rte_errno is set. 56*07cae8ffSTal Shnaiderman */ 57*07cae8ffSTal Shnaiderman int 58*07cae8ffSTal Shnaiderman mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu) 59*07cae8ffSTal Shnaiderman { 60*07cae8ffSTal Shnaiderman struct mlx5_priv *priv; 61*07cae8ffSTal Shnaiderman mlx5_context_st *context_obj; 62*07cae8ffSTal Shnaiderman 63*07cae8ffSTal Shnaiderman if (!dev) { 64*07cae8ffSTal Shnaiderman rte_errno = EINVAL; 65*07cae8ffSTal Shnaiderman return -rte_errno; 66*07cae8ffSTal Shnaiderman } 67*07cae8ffSTal Shnaiderman priv = dev->data->dev_private; 68*07cae8ffSTal Shnaiderman context_obj = (mlx5_context_st *)priv->sh->ctx; 69*07cae8ffSTal Shnaiderman *mtu = context_obj->mlx5_dev.mtu_bytes; 70*07cae8ffSTal Shnaiderman return 0; 71*07cae8ffSTal Shnaiderman } 72*07cae8ffSTal Shnaiderman 73*07cae8ffSTal Shnaiderman /** 74b653ce1dSOphir Munk * Set device MTU. 75b653ce1dSOphir Munk * 76b653ce1dSOphir Munk * @param dev 77b653ce1dSOphir Munk * Pointer to Ethernet device. 78b653ce1dSOphir Munk * @param mtu 79b653ce1dSOphir Munk * MTU value to set. 80b653ce1dSOphir Munk * 81b653ce1dSOphir Munk * @return 82b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise and rte_errno is set. 83b653ce1dSOphir Munk */ 84b653ce1dSOphir Munk int 85b653ce1dSOphir Munk mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) 86b653ce1dSOphir Munk { 87b653ce1dSOphir Munk RTE_SET_USED(dev); 88b653ce1dSOphir Munk RTE_SET_USED(mtu); 89b653ce1dSOphir Munk return -ENOTSUP; 90b653ce1dSOphir Munk } 91b653ce1dSOphir Munk 92b653ce1dSOphir Munk /* 93b653ce1dSOphir Munk * Unregister callback handler safely. The handler may be active 94b653ce1dSOphir Munk * while we are trying to unregister it, in this case code -EAGAIN 95b653ce1dSOphir Munk * is returned by rte_intr_callback_unregister(). This routine checks 96b653ce1dSOphir Munk * the return code and tries to unregister handler again. 97b653ce1dSOphir Munk * 98b653ce1dSOphir Munk * @param handle 99b653ce1dSOphir Munk * interrupt handle 100b653ce1dSOphir Munk * @param cb_fn 101b653ce1dSOphir Munk * pointer to callback routine 102b653ce1dSOphir Munk * @cb_arg 103b653ce1dSOphir Munk * opaque callback parameter 104b653ce1dSOphir Munk */ 105b653ce1dSOphir Munk void 106b653ce1dSOphir Munk mlx5_intr_callback_unregister(const struct rte_intr_handle *handle, 107b653ce1dSOphir Munk rte_intr_callback_fn cb_fn, void *cb_arg) 108b653ce1dSOphir Munk { 109b653ce1dSOphir Munk RTE_SET_USED(handle); 110b653ce1dSOphir Munk RTE_SET_USED(cb_fn); 111b653ce1dSOphir Munk RTE_SET_USED(cb_arg); 112b653ce1dSOphir Munk } 113b653ce1dSOphir Munk 114b653ce1dSOphir Munk /** 115b653ce1dSOphir Munk * DPDK callback to get flow control status. 116b653ce1dSOphir Munk * 117b653ce1dSOphir Munk * @param dev 118b653ce1dSOphir Munk * Pointer to Ethernet device structure. 119b653ce1dSOphir Munk * @param[out] fc_conf 120b653ce1dSOphir Munk * Flow control output buffer. 121b653ce1dSOphir Munk * 122b653ce1dSOphir Munk * @return 123b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise and rte_errno is set. 124b653ce1dSOphir Munk */ 125b653ce1dSOphir Munk int 126b653ce1dSOphir Munk mlx5_dev_get_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) 127b653ce1dSOphir Munk { 128b653ce1dSOphir Munk RTE_SET_USED(dev); 129b653ce1dSOphir Munk RTE_SET_USED(fc_conf); 130b653ce1dSOphir Munk return -ENOTSUP; 131b653ce1dSOphir Munk } 132b653ce1dSOphir Munk 133b653ce1dSOphir Munk /** 134b653ce1dSOphir Munk * DPDK callback to modify flow control parameters. 135b653ce1dSOphir Munk * 136b653ce1dSOphir Munk * @param dev 137b653ce1dSOphir Munk * Pointer to Ethernet device structure. 138b653ce1dSOphir Munk * @param[in] fc_conf 139b653ce1dSOphir Munk * Flow control parameters. 140b653ce1dSOphir Munk * 141b653ce1dSOphir Munk * @return 142b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise and rte_errno is set. 143b653ce1dSOphir Munk */ 144b653ce1dSOphir Munk int 145b653ce1dSOphir Munk mlx5_dev_set_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) 146b653ce1dSOphir Munk { 147b653ce1dSOphir Munk RTE_SET_USED(dev); 148b653ce1dSOphir Munk RTE_SET_USED(fc_conf); 149b653ce1dSOphir Munk return -ENOTSUP; 150b653ce1dSOphir Munk } 151b653ce1dSOphir Munk 152b653ce1dSOphir Munk /** 153b653ce1dSOphir Munk * Query the number of statistics provided by ETHTOOL. 154b653ce1dSOphir Munk * 155b653ce1dSOphir Munk * @param dev 156b653ce1dSOphir Munk * Pointer to Ethernet device. 157b653ce1dSOphir Munk * 158b653ce1dSOphir Munk * @return 159b653ce1dSOphir Munk * Number of statistics on success, negative errno value otherwise and 160b653ce1dSOphir Munk * rte_errno is set. 161b653ce1dSOphir Munk */ 162b653ce1dSOphir Munk int 163b653ce1dSOphir Munk mlx5_os_get_stats_n(struct rte_eth_dev *dev) 164b653ce1dSOphir Munk { 165b653ce1dSOphir Munk RTE_SET_USED(dev); 166b653ce1dSOphir Munk return -ENOTSUP; 167b653ce1dSOphir Munk } 168b653ce1dSOphir Munk 169b653ce1dSOphir Munk /** 170b653ce1dSOphir Munk * Init the structures to read device counters. 171b653ce1dSOphir Munk * 172b653ce1dSOphir Munk * @param dev 173b653ce1dSOphir Munk * Pointer to Ethernet device. 174b653ce1dSOphir Munk */ 175b653ce1dSOphir Munk void 176b653ce1dSOphir Munk mlx5_os_stats_init(struct rte_eth_dev *dev) 177b653ce1dSOphir Munk { 178b653ce1dSOphir Munk RTE_SET_USED(dev); 179b653ce1dSOphir Munk } 180b653ce1dSOphir Munk 181b653ce1dSOphir Munk /** 182b653ce1dSOphir Munk * Read device counters table. 183b653ce1dSOphir Munk * 184b653ce1dSOphir Munk * @param dev 185b653ce1dSOphir Munk * Pointer to Ethernet device. 186b653ce1dSOphir Munk * @param[out] stats 187b653ce1dSOphir Munk * Counters table output buffer. 188b653ce1dSOphir Munk * 189b653ce1dSOphir Munk * @return 190b653ce1dSOphir Munk * 0 on success and stats is filled, negative errno value otherwise and 191b653ce1dSOphir Munk * rte_errno is set. 192b653ce1dSOphir Munk */ 193b653ce1dSOphir Munk int 194b653ce1dSOphir Munk mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats) 195b653ce1dSOphir Munk { 196b653ce1dSOphir Munk RTE_SET_USED(dev); 197b653ce1dSOphir Munk RTE_SET_USED(stats); 198b653ce1dSOphir Munk return -ENOTSUP; 199b653ce1dSOphir Munk } 200b653ce1dSOphir Munk 201b653ce1dSOphir Munk /** 2026fbd7370STal Shnaiderman * DPDK callback to retrieve physical link information. 2036fbd7370STal Shnaiderman * 2046fbd7370STal Shnaiderman * @param dev 2056fbd7370STal Shnaiderman * Pointer to Ethernet device structure. 2066fbd7370STal Shnaiderman * @param wait_to_complete 2076fbd7370STal Shnaiderman * Wait for request completion. 2086fbd7370STal Shnaiderman * 2096fbd7370STal Shnaiderman * @return 2106fbd7370STal Shnaiderman * 0 if link status was not updated, positive if it was, a negative errno 2116fbd7370STal Shnaiderman * value otherwise and rte_errno is set. 2126fbd7370STal Shnaiderman */ 2136fbd7370STal Shnaiderman int 2146fbd7370STal Shnaiderman mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete) 2156fbd7370STal Shnaiderman { 2166fbd7370STal Shnaiderman RTE_SET_USED(wait_to_complete); 2176fbd7370STal Shnaiderman struct mlx5_priv *priv; 2186fbd7370STal Shnaiderman mlx5_context_st *context_obj; 2196fbd7370STal Shnaiderman struct rte_eth_link dev_link; 2206fbd7370STal Shnaiderman int ret; 2216fbd7370STal Shnaiderman 2226fbd7370STal Shnaiderman ret = 0; 2236fbd7370STal Shnaiderman if (!dev) { 2246fbd7370STal Shnaiderman rte_errno = EINVAL; 2256fbd7370STal Shnaiderman return -rte_errno; 2266fbd7370STal Shnaiderman } 2276fbd7370STal Shnaiderman priv = dev->data->dev_private; 2286fbd7370STal Shnaiderman context_obj = (mlx5_context_st *)priv->sh->ctx; 2296fbd7370STal Shnaiderman dev_link.link_speed = context_obj->mlx5_dev.link_speed / (1024 * 1024); 2306fbd7370STal Shnaiderman dev_link.link_status = 2316fbd7370STal Shnaiderman (context_obj->mlx5_dev.link_state == 1 && !mlx5_is_removed(dev)) 2326fbd7370STal Shnaiderman ? 1 : 0; 2336fbd7370STal Shnaiderman dev_link.link_duplex = 1; 2346fbd7370STal Shnaiderman if (dev->data->dev_link.link_speed != dev_link.link_speed || 2356fbd7370STal Shnaiderman dev->data->dev_link.link_duplex != dev_link.link_duplex || 2366fbd7370STal Shnaiderman dev->data->dev_link.link_autoneg != dev_link.link_autoneg || 2376fbd7370STal Shnaiderman dev->data->dev_link.link_status != dev_link.link_status) 2386fbd7370STal Shnaiderman ret = 1; 2396fbd7370STal Shnaiderman else 2406fbd7370STal Shnaiderman ret = 0; 2416fbd7370STal Shnaiderman dev->data->dev_link = dev_link; 2426fbd7370STal Shnaiderman return ret; 2436fbd7370STal Shnaiderman } 2446fbd7370STal Shnaiderman 2456fbd7370STal Shnaiderman /** 246b653ce1dSOphir Munk * DPDK callback to bring the link DOWN. 247b653ce1dSOphir Munk * 248b653ce1dSOphir Munk * @param dev 249b653ce1dSOphir Munk * Pointer to Ethernet device structure. 250b653ce1dSOphir Munk * 251b653ce1dSOphir Munk * @return 252b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise 253b653ce1dSOphir Munk */ 254b653ce1dSOphir Munk int 255b653ce1dSOphir Munk mlx5_set_link_down(struct rte_eth_dev *dev) 256b653ce1dSOphir Munk { 257b653ce1dSOphir Munk RTE_SET_USED(dev); 258b653ce1dSOphir Munk return -ENOTSUP; 259b653ce1dSOphir Munk } 260b653ce1dSOphir Munk 261b653ce1dSOphir Munk /** 262b653ce1dSOphir Munk * DPDK callback to bring the link UP. 263b653ce1dSOphir Munk * 264b653ce1dSOphir Munk * @param dev 265b653ce1dSOphir Munk * Pointer to Ethernet device structure. 266b653ce1dSOphir Munk * 267b653ce1dSOphir Munk * @return 268b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise 269b653ce1dSOphir Munk */ 270b653ce1dSOphir Munk int 271b653ce1dSOphir Munk mlx5_set_link_up(struct rte_eth_dev *dev) 272b653ce1dSOphir Munk { 273b653ce1dSOphir Munk RTE_SET_USED(dev); 274b653ce1dSOphir Munk return -ENOTSUP; 275b653ce1dSOphir Munk } 276b653ce1dSOphir Munk 277b653ce1dSOphir Munk /** 278b653ce1dSOphir Munk * DPDK callback to retrieve plug-in module EEPROM information (type and size). 279b653ce1dSOphir Munk * 280b653ce1dSOphir Munk * @param dev 281b653ce1dSOphir Munk * Pointer to Ethernet device structure. 282b653ce1dSOphir Munk * @param[out] modinfo 283b653ce1dSOphir Munk * Storage for plug-in module EEPROM information. 284b653ce1dSOphir Munk * 285b653ce1dSOphir Munk * @return 286b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise and rte_errno is set. 287b653ce1dSOphir Munk */ 288b653ce1dSOphir Munk int 289b653ce1dSOphir Munk mlx5_get_module_info(struct rte_eth_dev *dev, 290b653ce1dSOphir Munk struct rte_eth_dev_module_info *modinfo) 291b653ce1dSOphir Munk { 292b653ce1dSOphir Munk RTE_SET_USED(dev); 293b653ce1dSOphir Munk RTE_SET_USED(modinfo); 294b653ce1dSOphir Munk return -ENOTSUP; 295b653ce1dSOphir Munk } 296b653ce1dSOphir Munk 297b653ce1dSOphir Munk /** 298b653ce1dSOphir Munk * DPDK callback to retrieve plug-in module EEPROM data. 299b653ce1dSOphir Munk * 300b653ce1dSOphir Munk * @param dev 301b653ce1dSOphir Munk * Pointer to Ethernet device structure. 302b653ce1dSOphir Munk * @param[out] info 303b653ce1dSOphir Munk * Storage for plug-in module EEPROM data. 304b653ce1dSOphir Munk * 305b653ce1dSOphir Munk * @return 306b653ce1dSOphir Munk * 0 on success, a negative errno value otherwise and rte_errno is set. 307b653ce1dSOphir Munk */ 308b653ce1dSOphir Munk int mlx5_get_module_eeprom(struct rte_eth_dev *dev, 309b653ce1dSOphir Munk struct rte_dev_eeprom_info *info) 310b653ce1dSOphir Munk { 311b653ce1dSOphir Munk RTE_SET_USED(dev); 312b653ce1dSOphir Munk RTE_SET_USED(info); 313b653ce1dSOphir Munk return -ENOTSUP; 314b653ce1dSOphir Munk } 31599d7c45cSTal Shnaiderman 31699d7c45cSTal Shnaiderman /** 31799d7c45cSTal Shnaiderman * Get device current raw clock counter 31899d7c45cSTal Shnaiderman * 31999d7c45cSTal Shnaiderman * @param dev 32099d7c45cSTal Shnaiderman * Pointer to Ethernet device structure. 32199d7c45cSTal Shnaiderman * @param[out] time 32299d7c45cSTal Shnaiderman * Current raw clock counter of the device. 32399d7c45cSTal Shnaiderman * 32499d7c45cSTal Shnaiderman * @return 32599d7c45cSTal Shnaiderman * 0 if the clock has correctly been read 32699d7c45cSTal Shnaiderman * The value of errno in case of error 32799d7c45cSTal Shnaiderman */ 32899d7c45cSTal Shnaiderman int 32999d7c45cSTal Shnaiderman mlx5_read_clock(struct rte_eth_dev *dev, uint64_t *clock) 33099d7c45cSTal Shnaiderman { 33199d7c45cSTal Shnaiderman int err; 33299d7c45cSTal Shnaiderman struct mlx5_devx_clock mlx5_clock; 33399d7c45cSTal Shnaiderman struct mlx5_priv *priv = dev->data->dev_private; 33499d7c45cSTal Shnaiderman mlx5_context_st *context_obj = (mlx5_context_st *)priv->sh->ctx; 33599d7c45cSTal Shnaiderman 33699d7c45cSTal Shnaiderman err = mlx5_glue->query_rt_values(context_obj, &mlx5_clock); 33799d7c45cSTal Shnaiderman if (err != 0) { 33899d7c45cSTal Shnaiderman DRV_LOG(WARNING, "Could not query the clock"); 33999d7c45cSTal Shnaiderman return err; 34099d7c45cSTal Shnaiderman } 34199d7c45cSTal Shnaiderman *clock = *(uint64_t volatile *)mlx5_clock.p_iseg_internal_timer; 34299d7c45cSTal Shnaiderman return 0; 34399d7c45cSTal Shnaiderman } 344