1c147eae0SHemant Agrawal /*- 2c147eae0SHemant Agrawal * BSD LICENSE 3c147eae0SHemant Agrawal * 4c147eae0SHemant Agrawal * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. 5fcee050aSShreyansh Jain * Copyright 2016 NXP. 6c147eae0SHemant Agrawal * 7c147eae0SHemant Agrawal * Redistribution and use in source and binary forms, with or without 8c147eae0SHemant Agrawal * modification, are permitted provided that the following conditions 9c147eae0SHemant Agrawal * are met: 10c147eae0SHemant Agrawal * 11c147eae0SHemant Agrawal * * Redistributions of source code must retain the above copyright 12c147eae0SHemant Agrawal * notice, this list of conditions and the following disclaimer. 13c147eae0SHemant Agrawal * * Redistributions in binary form must reproduce the above copyright 14c147eae0SHemant Agrawal * notice, this list of conditions and the following disclaimer in 15c147eae0SHemant Agrawal * the documentation and/or other materials provided with the 16c147eae0SHemant Agrawal * distribution. 17c147eae0SHemant Agrawal * * Neither the name of Freescale Semiconductor, Inc nor the names of its 18c147eae0SHemant Agrawal * contributors may be used to endorse or promote products derived 19c147eae0SHemant Agrawal * from this software without specific prior written permission. 20c147eae0SHemant Agrawal * 21c147eae0SHemant Agrawal * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22c147eae0SHemant Agrawal * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23c147eae0SHemant Agrawal * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24c147eae0SHemant Agrawal * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25c147eae0SHemant Agrawal * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26c147eae0SHemant Agrawal * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27c147eae0SHemant Agrawal * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28c147eae0SHemant Agrawal * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29c147eae0SHemant Agrawal * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30c147eae0SHemant Agrawal * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31c147eae0SHemant Agrawal * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32c147eae0SHemant Agrawal */ 33c147eae0SHemant Agrawal 34c147eae0SHemant Agrawal #include <time.h> 35c147eae0SHemant Agrawal #include <net/if.h> 36c147eae0SHemant Agrawal 37c147eae0SHemant Agrawal #include <rte_mbuf.h> 38c147eae0SHemant Agrawal #include <rte_ethdev.h> 39c147eae0SHemant Agrawal #include <rte_malloc.h> 40c147eae0SHemant Agrawal #include <rte_memcpy.h> 41c147eae0SHemant Agrawal #include <rte_string_fns.h> 42c147eae0SHemant Agrawal #include <rte_cycles.h> 43c147eae0SHemant Agrawal #include <rte_kvargs.h> 44c147eae0SHemant Agrawal #include <rte_dev.h> 45c147eae0SHemant Agrawal #include <rte_fslmc.h> 46c147eae0SHemant Agrawal 47d401ead1SHemant Agrawal #include <fslmc_logs.h> 48c147eae0SHemant Agrawal #include <fslmc_vfio.h> 493e5a335dSHemant Agrawal #include <dpaa2_hw_pvt.h> 50bee61d86SHemant Agrawal #include <dpaa2_hw_mempool.h> 513cf50ff5SHemant Agrawal #include <dpaa2_hw_dpio.h> 52748eccb9SHemant Agrawal #include <mc/fsl_dpmng.h> 53c147eae0SHemant Agrawal #include "dpaa2_ethdev.h" 54c147eae0SHemant Agrawal 55c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd; 56d4984046SHemant Agrawal static int dpaa2_dev_uninit(struct rte_eth_dev *eth_dev); 57*c5acbb5eSHemant Agrawal static int dpaa2_dev_link_update(struct rte_eth_dev *dev, 58*c5acbb5eSHemant Agrawal int wait_to_complete); 59a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_up(struct rte_eth_dev *dev); 60a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_down(struct rte_eth_dev *dev); 61e1640849SHemant Agrawal static int dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu); 62c147eae0SHemant Agrawal 63c56c86ffSHemant Agrawal /** 64c56c86ffSHemant Agrawal * Atomically reads the link status information from global 65c56c86ffSHemant Agrawal * structure rte_eth_dev. 66c56c86ffSHemant Agrawal * 67c56c86ffSHemant Agrawal * @param dev 68c56c86ffSHemant Agrawal * - Pointer to the structure rte_eth_dev to read from. 69c56c86ffSHemant Agrawal * - Pointer to the buffer to be saved with the link status. 70c56c86ffSHemant Agrawal * 71c56c86ffSHemant Agrawal * @return 72c56c86ffSHemant Agrawal * - On success, zero. 73c56c86ffSHemant Agrawal * - On failure, negative value. 74c56c86ffSHemant Agrawal */ 75c56c86ffSHemant Agrawal static inline int 76c56c86ffSHemant Agrawal dpaa2_dev_atomic_read_link_status(struct rte_eth_dev *dev, 77c56c86ffSHemant Agrawal struct rte_eth_link *link) 78c56c86ffSHemant Agrawal { 79c56c86ffSHemant Agrawal struct rte_eth_link *dst = link; 80c56c86ffSHemant Agrawal struct rte_eth_link *src = &dev->data->dev_link; 81c56c86ffSHemant Agrawal 82c56c86ffSHemant Agrawal if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst, 83c56c86ffSHemant Agrawal *(uint64_t *)src) == 0) 84c56c86ffSHemant Agrawal return -1; 85c56c86ffSHemant Agrawal 86c56c86ffSHemant Agrawal return 0; 87c56c86ffSHemant Agrawal } 88c56c86ffSHemant Agrawal 89c56c86ffSHemant Agrawal /** 90c56c86ffSHemant Agrawal * Atomically writes the link status information into global 91c56c86ffSHemant Agrawal * structure rte_eth_dev. 92c56c86ffSHemant Agrawal * 93c56c86ffSHemant Agrawal * @param dev 94c56c86ffSHemant Agrawal * - Pointer to the structure rte_eth_dev to read from. 95c56c86ffSHemant Agrawal * - Pointer to the buffer to be saved with the link status. 96c56c86ffSHemant Agrawal * 97c56c86ffSHemant Agrawal * @return 98c56c86ffSHemant Agrawal * - On success, zero. 99c56c86ffSHemant Agrawal * - On failure, negative value. 100c56c86ffSHemant Agrawal */ 101c56c86ffSHemant Agrawal static inline int 102c56c86ffSHemant Agrawal dpaa2_dev_atomic_write_link_status(struct rte_eth_dev *dev, 103c56c86ffSHemant Agrawal struct rte_eth_link *link) 104c56c86ffSHemant Agrawal { 105c56c86ffSHemant Agrawal struct rte_eth_link *dst = &dev->data->dev_link; 106c56c86ffSHemant Agrawal struct rte_eth_link *src = link; 107c56c86ffSHemant Agrawal 108c56c86ffSHemant Agrawal if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst, 109c56c86ffSHemant Agrawal *(uint64_t *)src) == 0) 110c56c86ffSHemant Agrawal return -1; 111c56c86ffSHemant Agrawal 112c56c86ffSHemant Agrawal return 0; 113c56c86ffSHemant Agrawal } 114c56c86ffSHemant Agrawal 1153ce294f2SHemant Agrawal static int 1163ce294f2SHemant Agrawal dpaa2_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) 1173ce294f2SHemant Agrawal { 1183ce294f2SHemant Agrawal int ret; 1193ce294f2SHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 1203ce294f2SHemant Agrawal struct fsl_mc_io *dpni = priv->hw; 1213ce294f2SHemant Agrawal 1223ce294f2SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1233ce294f2SHemant Agrawal 1243ce294f2SHemant Agrawal if (dpni == NULL) { 125645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1263ce294f2SHemant Agrawal return -1; 1273ce294f2SHemant Agrawal } 1283ce294f2SHemant Agrawal 1293ce294f2SHemant Agrawal if (on) 1303ce294f2SHemant Agrawal ret = dpni_add_vlan_id(dpni, CMD_PRI_LOW, 1313ce294f2SHemant Agrawal priv->token, vlan_id); 1323ce294f2SHemant Agrawal else 1333ce294f2SHemant Agrawal ret = dpni_remove_vlan_id(dpni, CMD_PRI_LOW, 1343ce294f2SHemant Agrawal priv->token, vlan_id); 1353ce294f2SHemant Agrawal 1363ce294f2SHemant Agrawal if (ret < 0) 1373ce294f2SHemant Agrawal PMD_DRV_LOG(ERR, "ret = %d Unable to add/rem vlan %d hwid =%d", 1383ce294f2SHemant Agrawal ret, vlan_id, priv->hw_id); 1393ce294f2SHemant Agrawal 1403ce294f2SHemant Agrawal return ret; 1413ce294f2SHemant Agrawal } 1423ce294f2SHemant Agrawal 1433ce294f2SHemant Agrawal static void 1443ce294f2SHemant Agrawal dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask) 1453ce294f2SHemant Agrawal { 1463ce294f2SHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 1473ce294f2SHemant Agrawal struct fsl_mc_io *dpni = priv->hw; 1483ce294f2SHemant Agrawal int ret; 1493ce294f2SHemant Agrawal 1503ce294f2SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1513ce294f2SHemant Agrawal 1523ce294f2SHemant Agrawal if (mask & ETH_VLAN_FILTER_MASK) { 1533ce294f2SHemant Agrawal if (dev->data->dev_conf.rxmode.hw_vlan_filter) 1543ce294f2SHemant Agrawal ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW, 1553ce294f2SHemant Agrawal priv->token, true); 1563ce294f2SHemant Agrawal else 1573ce294f2SHemant Agrawal ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW, 1583ce294f2SHemant Agrawal priv->token, false); 1593ce294f2SHemant Agrawal if (ret < 0) 160645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to set vlan filter = %d\n", 1613ce294f2SHemant Agrawal ret); 1623ce294f2SHemant Agrawal } 1633ce294f2SHemant Agrawal } 1643ce294f2SHemant Agrawal 165748eccb9SHemant Agrawal static int 166748eccb9SHemant Agrawal dpaa2_fw_version_get(struct rte_eth_dev *dev, 167748eccb9SHemant Agrawal char *fw_version, 168748eccb9SHemant Agrawal size_t fw_size) 169748eccb9SHemant Agrawal { 170748eccb9SHemant Agrawal int ret; 171748eccb9SHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 172748eccb9SHemant Agrawal struct fsl_mc_io *dpni = priv->hw; 173748eccb9SHemant Agrawal struct mc_soc_version mc_plat_info = {0}; 174748eccb9SHemant Agrawal struct mc_version mc_ver_info = {0}; 175748eccb9SHemant Agrawal 176748eccb9SHemant Agrawal PMD_INIT_FUNC_TRACE(); 177748eccb9SHemant Agrawal 178748eccb9SHemant Agrawal if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info)) 179748eccb9SHemant Agrawal RTE_LOG(WARNING, PMD, "\tmc_get_soc_version failed\n"); 180748eccb9SHemant Agrawal 181748eccb9SHemant Agrawal if (mc_get_version(dpni, CMD_PRI_LOW, &mc_ver_info)) 182748eccb9SHemant Agrawal RTE_LOG(WARNING, PMD, "\tmc_get_version failed\n"); 183748eccb9SHemant Agrawal 184748eccb9SHemant Agrawal ret = snprintf(fw_version, fw_size, 185748eccb9SHemant Agrawal "%x-%d.%d.%d", 186748eccb9SHemant Agrawal mc_plat_info.svr, 187748eccb9SHemant Agrawal mc_ver_info.major, 188748eccb9SHemant Agrawal mc_ver_info.minor, 189748eccb9SHemant Agrawal mc_ver_info.revision); 190748eccb9SHemant Agrawal 191748eccb9SHemant Agrawal ret += 1; /* add the size of '\0' */ 192748eccb9SHemant Agrawal if (fw_size < (uint32_t)ret) 193748eccb9SHemant Agrawal return ret; 194748eccb9SHemant Agrawal else 195748eccb9SHemant Agrawal return 0; 196748eccb9SHemant Agrawal } 197748eccb9SHemant Agrawal 1983e5a335dSHemant Agrawal static void 1993e5a335dSHemant Agrawal dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) 2003e5a335dSHemant Agrawal { 2013e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 2023e5a335dSHemant Agrawal 2033e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 2043e5a335dSHemant Agrawal 2053e5a335dSHemant Agrawal dev_info->if_index = priv->hw_id; 2063e5a335dSHemant Agrawal 20733fad432SHemant Agrawal dev_info->max_mac_addrs = priv->max_mac_filters; 208bee61d86SHemant Agrawal dev_info->max_rx_pktlen = DPAA2_MAX_RX_PKT_LEN; 209bee61d86SHemant Agrawal dev_info->min_rx_bufsize = DPAA2_MIN_RX_BUF_SIZE; 2103e5a335dSHemant Agrawal dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues; 2113e5a335dSHemant Agrawal dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues; 212ef18dafeSHemant Agrawal dev_info->rx_offload_capa = 213ef18dafeSHemant Agrawal DEV_RX_OFFLOAD_IPV4_CKSUM | 214ef18dafeSHemant Agrawal DEV_RX_OFFLOAD_UDP_CKSUM | 215ef18dafeSHemant Agrawal DEV_RX_OFFLOAD_TCP_CKSUM | 216ef18dafeSHemant Agrawal DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM; 217ef18dafeSHemant Agrawal dev_info->tx_offload_capa = 218ef18dafeSHemant Agrawal DEV_TX_OFFLOAD_IPV4_CKSUM | 219ef18dafeSHemant Agrawal DEV_TX_OFFLOAD_UDP_CKSUM | 220ef18dafeSHemant Agrawal DEV_TX_OFFLOAD_TCP_CKSUM | 221ef18dafeSHemant Agrawal DEV_TX_OFFLOAD_SCTP_CKSUM | 222ef18dafeSHemant Agrawal DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM; 2233e5a335dSHemant Agrawal dev_info->speed_capa = ETH_LINK_SPEED_1G | 2243e5a335dSHemant Agrawal ETH_LINK_SPEED_2_5G | 2253e5a335dSHemant Agrawal ETH_LINK_SPEED_10G; 2263e5a335dSHemant Agrawal } 2273e5a335dSHemant Agrawal 2283e5a335dSHemant Agrawal static int 2293e5a335dSHemant Agrawal dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev) 2303e5a335dSHemant Agrawal { 2313e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 2323e5a335dSHemant Agrawal uint16_t dist_idx; 2333e5a335dSHemant Agrawal uint32_t vq_id; 2343e5a335dSHemant Agrawal struct dpaa2_queue *mc_q, *mcq; 2353e5a335dSHemant Agrawal uint32_t tot_queues; 2363e5a335dSHemant Agrawal int i; 2373e5a335dSHemant Agrawal struct dpaa2_queue *dpaa2_q; 2383e5a335dSHemant Agrawal 2393e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 2403e5a335dSHemant Agrawal 2413e5a335dSHemant Agrawal tot_queues = priv->nb_rx_queues + priv->nb_tx_queues; 2423e5a335dSHemant Agrawal mc_q = rte_malloc(NULL, sizeof(struct dpaa2_queue) * tot_queues, 2433e5a335dSHemant Agrawal RTE_CACHE_LINE_SIZE); 2443e5a335dSHemant Agrawal if (!mc_q) { 2453e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "malloc failed for rx/tx queues\n"); 2463e5a335dSHemant Agrawal return -1; 2473e5a335dSHemant Agrawal } 2483e5a335dSHemant Agrawal 2493e5a335dSHemant Agrawal for (i = 0; i < priv->nb_rx_queues; i++) { 2503e5a335dSHemant Agrawal mc_q->dev = dev; 2513e5a335dSHemant Agrawal priv->rx_vq[i] = mc_q++; 2523e5a335dSHemant Agrawal dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i]; 2533e5a335dSHemant Agrawal dpaa2_q->q_storage = rte_malloc("dq_storage", 2543e5a335dSHemant Agrawal sizeof(struct queue_storage_info_t), 2553e5a335dSHemant Agrawal RTE_CACHE_LINE_SIZE); 2563e5a335dSHemant Agrawal if (!dpaa2_q->q_storage) 2573e5a335dSHemant Agrawal goto fail; 2583e5a335dSHemant Agrawal 2593e5a335dSHemant Agrawal memset(dpaa2_q->q_storage, 0, 2603e5a335dSHemant Agrawal sizeof(struct queue_storage_info_t)); 2613cf50ff5SHemant Agrawal if (dpaa2_alloc_dq_storage(dpaa2_q->q_storage)) 2623cf50ff5SHemant Agrawal goto fail; 2633e5a335dSHemant Agrawal } 2643e5a335dSHemant Agrawal 2653e5a335dSHemant Agrawal for (i = 0; i < priv->nb_tx_queues; i++) { 2663e5a335dSHemant Agrawal mc_q->dev = dev; 2677ae777d0SHemant Agrawal mc_q->flow_id = 0xffff; 2683e5a335dSHemant Agrawal priv->tx_vq[i] = mc_q++; 2697ae777d0SHemant Agrawal dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i]; 2707ae777d0SHemant Agrawal dpaa2_q->cscn = rte_malloc(NULL, 2717ae777d0SHemant Agrawal sizeof(struct qbman_result), 16); 2727ae777d0SHemant Agrawal if (!dpaa2_q->cscn) 2737ae777d0SHemant Agrawal goto fail_tx; 2743e5a335dSHemant Agrawal } 2753e5a335dSHemant Agrawal 2763e5a335dSHemant Agrawal vq_id = 0; 277599017a2SHemant Agrawal for (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) { 2783e5a335dSHemant Agrawal mcq = (struct dpaa2_queue *)priv->rx_vq[vq_id]; 2793e5a335dSHemant Agrawal mcq->tc_index = DPAA2_DEF_TC; 2803e5a335dSHemant Agrawal mcq->flow_id = dist_idx; 2813e5a335dSHemant Agrawal vq_id++; 2823e5a335dSHemant Agrawal } 2833e5a335dSHemant Agrawal 2843e5a335dSHemant Agrawal return 0; 2857ae777d0SHemant Agrawal fail_tx: 2867ae777d0SHemant Agrawal i -= 1; 2877ae777d0SHemant Agrawal while (i >= 0) { 2887ae777d0SHemant Agrawal dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i]; 2897ae777d0SHemant Agrawal rte_free(dpaa2_q->cscn); 2907ae777d0SHemant Agrawal priv->tx_vq[i--] = NULL; 2917ae777d0SHemant Agrawal } 2927ae777d0SHemant Agrawal i = priv->nb_rx_queues; 2933e5a335dSHemant Agrawal fail: 2943e5a335dSHemant Agrawal i -= 1; 2953e5a335dSHemant Agrawal mc_q = priv->rx_vq[0]; 2963e5a335dSHemant Agrawal while (i >= 0) { 2973e5a335dSHemant Agrawal dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i]; 2983cf50ff5SHemant Agrawal dpaa2_free_dq_storage(dpaa2_q->q_storage); 2993e5a335dSHemant Agrawal rte_free(dpaa2_q->q_storage); 3003e5a335dSHemant Agrawal priv->rx_vq[i--] = NULL; 3013e5a335dSHemant Agrawal } 3023e5a335dSHemant Agrawal rte_free(mc_q); 3033e5a335dSHemant Agrawal return -1; 3043e5a335dSHemant Agrawal } 3053e5a335dSHemant Agrawal 3063e5a335dSHemant Agrawal static int 3073e5a335dSHemant Agrawal dpaa2_eth_dev_configure(struct rte_eth_dev *dev) 3083e5a335dSHemant Agrawal { 3093e5a335dSHemant Agrawal struct rte_eth_dev_data *data = dev->data; 3103e5a335dSHemant Agrawal struct rte_eth_conf *eth_conf = &data->dev_conf; 31189c2ea8fSHemant Agrawal int ret; 3123e5a335dSHemant Agrawal 3133e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 3143e5a335dSHemant Agrawal 315e1640849SHemant Agrawal if (eth_conf->rxmode.jumbo_frame == 1) { 316e1640849SHemant Agrawal if (eth_conf->rxmode.max_rx_pkt_len <= DPAA2_MAX_RX_PKT_LEN) { 317e1640849SHemant Agrawal ret = dpaa2_dev_mtu_set(dev, 318e1640849SHemant Agrawal eth_conf->rxmode.max_rx_pkt_len); 319e1640849SHemant Agrawal if (ret) { 320e1640849SHemant Agrawal PMD_INIT_LOG(ERR, 321e1640849SHemant Agrawal "unable to set mtu. check config\n"); 322e1640849SHemant Agrawal return ret; 323e1640849SHemant Agrawal } 324e1640849SHemant Agrawal } else { 325e1640849SHemant Agrawal return -1; 326e1640849SHemant Agrawal } 327e1640849SHemant Agrawal } 328e1640849SHemant Agrawal 3293e5a335dSHemant Agrawal /* Check for correct configuration */ 3303e5a335dSHemant Agrawal if (eth_conf->rxmode.mq_mode != ETH_MQ_RX_RSS && 3313e5a335dSHemant Agrawal data->nb_rx_queues > 1) { 3323e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Distribution is not enabled, " 3333e5a335dSHemant Agrawal "but Rx queues more than 1\n"); 3343e5a335dSHemant Agrawal return -1; 3353e5a335dSHemant Agrawal } 3363e5a335dSHemant Agrawal 33789c2ea8fSHemant Agrawal if (eth_conf->rxmode.mq_mode == ETH_MQ_RX_RSS) { 33889c2ea8fSHemant Agrawal /* Return in case number of Rx queues is 1 */ 33989c2ea8fSHemant Agrawal if (data->nb_rx_queues == 1) 34089c2ea8fSHemant Agrawal return 0; 34189c2ea8fSHemant Agrawal ret = dpaa2_setup_flow_dist(dev, 34289c2ea8fSHemant Agrawal eth_conf->rx_adv_conf.rss_conf.rss_hf); 34389c2ea8fSHemant Agrawal if (ret) { 34489c2ea8fSHemant Agrawal PMD_INIT_LOG(ERR, "unable to set flow distribution." 34589c2ea8fSHemant Agrawal "please check queue config\n"); 34689c2ea8fSHemant Agrawal return ret; 34789c2ea8fSHemant Agrawal } 34889c2ea8fSHemant Agrawal } 349*c5acbb5eSHemant Agrawal 350*c5acbb5eSHemant Agrawal /* update the current status */ 351*c5acbb5eSHemant Agrawal dpaa2_dev_link_update(dev, 0); 352*c5acbb5eSHemant Agrawal 3533e5a335dSHemant Agrawal return 0; 3543e5a335dSHemant Agrawal } 3553e5a335dSHemant Agrawal 3563e5a335dSHemant Agrawal /* Function to setup RX flow information. It contains traffic class ID, 3573e5a335dSHemant Agrawal * flow ID, destination configuration etc. 3583e5a335dSHemant Agrawal */ 3593e5a335dSHemant Agrawal static int 3603e5a335dSHemant Agrawal dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev, 3613e5a335dSHemant Agrawal uint16_t rx_queue_id, 3623e5a335dSHemant Agrawal uint16_t nb_rx_desc __rte_unused, 3633e5a335dSHemant Agrawal unsigned int socket_id __rte_unused, 3643e5a335dSHemant Agrawal const struct rte_eth_rxconf *rx_conf __rte_unused, 3653e5a335dSHemant Agrawal struct rte_mempool *mb_pool) 3663e5a335dSHemant Agrawal { 3673e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 3683e5a335dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 36930db823eSHemant Agrawal struct mc_soc_version mc_plat_info = {0}; 3703e5a335dSHemant Agrawal struct dpaa2_queue *dpaa2_q; 3713e5a335dSHemant Agrawal struct dpni_queue cfg; 3723e5a335dSHemant Agrawal uint8_t options = 0; 3733e5a335dSHemant Agrawal uint8_t flow_id; 374bee61d86SHemant Agrawal uint32_t bpid; 3753e5a335dSHemant Agrawal int ret; 3763e5a335dSHemant Agrawal 3773e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 3783e5a335dSHemant Agrawal 3793e5a335dSHemant Agrawal PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p", 3803e5a335dSHemant Agrawal dev, rx_queue_id, mb_pool, rx_conf); 3813e5a335dSHemant Agrawal 382bee61d86SHemant Agrawal if (!priv->bp_list || priv->bp_list->mp != mb_pool) { 383bee61d86SHemant Agrawal bpid = mempool_to_bpid(mb_pool); 384bee61d86SHemant Agrawal ret = dpaa2_attach_bp_list(priv, 385bee61d86SHemant Agrawal rte_dpaa2_bpid_info[bpid].bp_list); 386bee61d86SHemant Agrawal if (ret) 387bee61d86SHemant Agrawal return ret; 388bee61d86SHemant Agrawal } 3893e5a335dSHemant Agrawal dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id]; 3903e5a335dSHemant Agrawal dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */ 3913e5a335dSHemant Agrawal 392599017a2SHemant Agrawal /*Get the flow id from given VQ id*/ 393599017a2SHemant Agrawal flow_id = rx_queue_id % priv->nb_rx_queues; 3943e5a335dSHemant Agrawal memset(&cfg, 0, sizeof(struct dpni_queue)); 3953e5a335dSHemant Agrawal 3963e5a335dSHemant Agrawal options = options | DPNI_QUEUE_OPT_USER_CTX; 3973e5a335dSHemant Agrawal cfg.user_context = (uint64_t)(dpaa2_q); 3983e5a335dSHemant Agrawal 39937529eceSHemant Agrawal /*if ls2088 or rev2 device, enable the stashing */ 40030db823eSHemant Agrawal 40130db823eSHemant Agrawal if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info)) 40230db823eSHemant Agrawal PMD_INIT_LOG(ERR, "\tmc_get_soc_version failed\n"); 40330db823eSHemant Agrawal 40430db823eSHemant Agrawal if ((mc_plat_info.svr & 0xffff0000) != SVR_LS2080A) { 40537529eceSHemant Agrawal options |= DPNI_QUEUE_OPT_FLC; 40637529eceSHemant Agrawal cfg.flc.stash_control = true; 40737529eceSHemant Agrawal cfg.flc.value &= 0xFFFFFFFFFFFFFFC0; 40837529eceSHemant Agrawal /* 00 00 00 - last 6 bit represent annotation, context stashing, 40937529eceSHemant Agrawal * data stashing setting 01 01 00 (0x14) to enable 4109464dbe9SHemant Agrawal * 1 line data, 1 line annotation 41137529eceSHemant Agrawal */ 41237529eceSHemant Agrawal cfg.flc.value |= 0x14; 41337529eceSHemant Agrawal } 4143e5a335dSHemant Agrawal ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_RX, 4153e5a335dSHemant Agrawal dpaa2_q->tc_index, flow_id, options, &cfg); 4163e5a335dSHemant Agrawal if (ret) { 4173e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Error in setting the rx flow: = %d\n", ret); 4183e5a335dSHemant Agrawal return -1; 4193e5a335dSHemant Agrawal } 4203e5a335dSHemant Agrawal 42123d6a87eSHemant Agrawal if (!(priv->flags & DPAA2_RX_TAILDROP_OFF)) { 42223d6a87eSHemant Agrawal struct dpni_taildrop taildrop; 42323d6a87eSHemant Agrawal 42423d6a87eSHemant Agrawal taildrop.enable = 1; 42523d6a87eSHemant Agrawal /*enabling per rx queue congestion control */ 42623d6a87eSHemant Agrawal taildrop.threshold = CONG_THRESHOLD_RX_Q; 42723d6a87eSHemant Agrawal taildrop.units = DPNI_CONGESTION_UNIT_BYTES; 428d47f0292SHemant Agrawal taildrop.oal = CONG_RX_OAL; 42923d6a87eSHemant Agrawal PMD_INIT_LOG(DEBUG, "Enabling Early Drop on queue = %d", 43023d6a87eSHemant Agrawal rx_queue_id); 43123d6a87eSHemant Agrawal ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token, 43223d6a87eSHemant Agrawal DPNI_CP_QUEUE, DPNI_QUEUE_RX, 43323d6a87eSHemant Agrawal dpaa2_q->tc_index, flow_id, &taildrop); 43423d6a87eSHemant Agrawal if (ret) { 43523d6a87eSHemant Agrawal PMD_INIT_LOG(ERR, "Error in setting the rx flow" 43623d6a87eSHemant Agrawal " err : = %d\n", ret); 43723d6a87eSHemant Agrawal return -1; 43823d6a87eSHemant Agrawal } 43923d6a87eSHemant Agrawal } 44023d6a87eSHemant Agrawal 4413e5a335dSHemant Agrawal dev->data->rx_queues[rx_queue_id] = dpaa2_q; 4423e5a335dSHemant Agrawal return 0; 4433e5a335dSHemant Agrawal } 4443e5a335dSHemant Agrawal 4453e5a335dSHemant Agrawal static int 4463e5a335dSHemant Agrawal dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev, 4473e5a335dSHemant Agrawal uint16_t tx_queue_id, 4483e5a335dSHemant Agrawal uint16_t nb_tx_desc __rte_unused, 4493e5a335dSHemant Agrawal unsigned int socket_id __rte_unused, 4503e5a335dSHemant Agrawal const struct rte_eth_txconf *tx_conf __rte_unused) 4513e5a335dSHemant Agrawal { 4523e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 4533e5a335dSHemant Agrawal struct dpaa2_queue *dpaa2_q = (struct dpaa2_queue *) 4543e5a335dSHemant Agrawal priv->tx_vq[tx_queue_id]; 4553e5a335dSHemant Agrawal struct fsl_mc_io *dpni = priv->hw; 4563e5a335dSHemant Agrawal struct dpni_queue tx_conf_cfg; 4573e5a335dSHemant Agrawal struct dpni_queue tx_flow_cfg; 4583e5a335dSHemant Agrawal uint8_t options = 0, flow_id; 4593e5a335dSHemant Agrawal uint32_t tc_id; 4603e5a335dSHemant Agrawal int ret; 4613e5a335dSHemant Agrawal 4623e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 4633e5a335dSHemant Agrawal 4643e5a335dSHemant Agrawal /* Return if queue already configured */ 4657ae777d0SHemant Agrawal if (dpaa2_q->flow_id != 0xffff) 4663e5a335dSHemant Agrawal return 0; 4673e5a335dSHemant Agrawal 4683e5a335dSHemant Agrawal memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue)); 4693e5a335dSHemant Agrawal memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue)); 4703e5a335dSHemant Agrawal 471ef18dafeSHemant Agrawal tc_id = tx_queue_id; 472ef18dafeSHemant Agrawal flow_id = 0; 4733e5a335dSHemant Agrawal 4743e5a335dSHemant Agrawal ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX, 4753e5a335dSHemant Agrawal tc_id, flow_id, options, &tx_flow_cfg); 4763e5a335dSHemant Agrawal if (ret) { 4773e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Error in setting the tx flow: " 4783e5a335dSHemant Agrawal "tc_id=%d, flow =%d ErrorCode = %x\n", 4793e5a335dSHemant Agrawal tc_id, flow_id, -ret); 4803e5a335dSHemant Agrawal return -1; 4813e5a335dSHemant Agrawal } 4823e5a335dSHemant Agrawal 4833e5a335dSHemant Agrawal dpaa2_q->flow_id = flow_id; 4843e5a335dSHemant Agrawal 4853e5a335dSHemant Agrawal if (tx_queue_id == 0) { 4863e5a335dSHemant Agrawal /*Set tx-conf and error configuration*/ 4873e5a335dSHemant Agrawal ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW, 4883e5a335dSHemant Agrawal priv->token, 4893e5a335dSHemant Agrawal DPNI_CONF_DISABLE); 4903e5a335dSHemant Agrawal if (ret) { 4913e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Error in set tx conf mode settings" 4923e5a335dSHemant Agrawal " ErrorCode = %x", ret); 4933e5a335dSHemant Agrawal return -1; 4943e5a335dSHemant Agrawal } 4953e5a335dSHemant Agrawal } 4963e5a335dSHemant Agrawal dpaa2_q->tc_index = tc_id; 4973e5a335dSHemant Agrawal 498a0840963SHemant Agrawal if (!(priv->flags & DPAA2_TX_CGR_OFF)) { 4997ae777d0SHemant Agrawal struct dpni_congestion_notification_cfg cong_notif_cfg; 5007ae777d0SHemant Agrawal 50129dfa62fSHemant Agrawal cong_notif_cfg.units = DPNI_CONGESTION_UNIT_FRAMES; 5027ae777d0SHemant Agrawal cong_notif_cfg.threshold_entry = CONG_ENTER_TX_THRESHOLD; 5037ae777d0SHemant Agrawal /* Notify that the queue is not congested when the data in 5047ae777d0SHemant Agrawal * the queue is below this thershold. 5057ae777d0SHemant Agrawal */ 5067ae777d0SHemant Agrawal cong_notif_cfg.threshold_exit = CONG_EXIT_TX_THRESHOLD; 5077ae777d0SHemant Agrawal cong_notif_cfg.message_ctx = 0; 5087ae777d0SHemant Agrawal cong_notif_cfg.message_iova = (uint64_t)dpaa2_q->cscn; 5097ae777d0SHemant Agrawal cong_notif_cfg.dest_cfg.dest_type = DPNI_DEST_NONE; 5107ae777d0SHemant Agrawal cong_notif_cfg.notification_mode = 5117ae777d0SHemant Agrawal DPNI_CONG_OPT_WRITE_MEM_ON_ENTER | 5127ae777d0SHemant Agrawal DPNI_CONG_OPT_WRITE_MEM_ON_EXIT | 5137ae777d0SHemant Agrawal DPNI_CONG_OPT_COHERENT_WRITE; 5147ae777d0SHemant Agrawal 5157ae777d0SHemant Agrawal ret = dpni_set_congestion_notification(dpni, CMD_PRI_LOW, 5167ae777d0SHemant Agrawal priv->token, 5177ae777d0SHemant Agrawal DPNI_QUEUE_TX, 5187ae777d0SHemant Agrawal tc_id, 5197ae777d0SHemant Agrawal &cong_notif_cfg); 5207ae777d0SHemant Agrawal if (ret) { 5217ae777d0SHemant Agrawal PMD_INIT_LOG(ERR, 5227ae777d0SHemant Agrawal "Error in setting tx congestion notification: = %d", 5237ae777d0SHemant Agrawal -ret); 5247ae777d0SHemant Agrawal return -ret; 5257ae777d0SHemant Agrawal } 5267ae777d0SHemant Agrawal } 5273e5a335dSHemant Agrawal dev->data->tx_queues[tx_queue_id] = dpaa2_q; 5283e5a335dSHemant Agrawal return 0; 5293e5a335dSHemant Agrawal } 5303e5a335dSHemant Agrawal 5313e5a335dSHemant Agrawal static void 5323e5a335dSHemant Agrawal dpaa2_dev_rx_queue_release(void *q __rte_unused) 5333e5a335dSHemant Agrawal { 5343e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 5353e5a335dSHemant Agrawal } 5363e5a335dSHemant Agrawal 5373e5a335dSHemant Agrawal static void 5383e5a335dSHemant Agrawal dpaa2_dev_tx_queue_release(void *q __rte_unused) 5393e5a335dSHemant Agrawal { 5403e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 5413e5a335dSHemant Agrawal } 5423e5a335dSHemant Agrawal 543a5fc38d4SHemant Agrawal static const uint32_t * 544a5fc38d4SHemant Agrawal dpaa2_supported_ptypes_get(struct rte_eth_dev *dev) 545a5fc38d4SHemant Agrawal { 546a5fc38d4SHemant Agrawal static const uint32_t ptypes[] = { 547a5fc38d4SHemant Agrawal /*todo -= add more types */ 548a5fc38d4SHemant Agrawal RTE_PTYPE_L2_ETHER, 549a5fc38d4SHemant Agrawal RTE_PTYPE_L3_IPV4, 550a5fc38d4SHemant Agrawal RTE_PTYPE_L3_IPV4_EXT, 551a5fc38d4SHemant Agrawal RTE_PTYPE_L3_IPV6, 552a5fc38d4SHemant Agrawal RTE_PTYPE_L3_IPV6_EXT, 553a5fc38d4SHemant Agrawal RTE_PTYPE_L4_TCP, 554a5fc38d4SHemant Agrawal RTE_PTYPE_L4_UDP, 555a5fc38d4SHemant Agrawal RTE_PTYPE_L4_SCTP, 556a5fc38d4SHemant Agrawal RTE_PTYPE_L4_ICMP, 557a5fc38d4SHemant Agrawal RTE_PTYPE_UNKNOWN 558a5fc38d4SHemant Agrawal }; 559a5fc38d4SHemant Agrawal 5605c6942fdSHemant Agrawal if (dev->rx_pkt_burst == dpaa2_dev_prefetch_rx) 561a5fc38d4SHemant Agrawal return ptypes; 562a5fc38d4SHemant Agrawal return NULL; 563a5fc38d4SHemant Agrawal } 564a5fc38d4SHemant Agrawal 565*c5acbb5eSHemant Agrawal /** 566*c5acbb5eSHemant Agrawal * Dpaa2 link Interrupt handler 567*c5acbb5eSHemant Agrawal * 568*c5acbb5eSHemant Agrawal * @param param 569*c5acbb5eSHemant Agrawal * The address of parameter (struct rte_eth_dev *) regsitered before. 570*c5acbb5eSHemant Agrawal * 571*c5acbb5eSHemant Agrawal * @return 572*c5acbb5eSHemant Agrawal * void 573*c5acbb5eSHemant Agrawal */ 574*c5acbb5eSHemant Agrawal static void 575*c5acbb5eSHemant Agrawal dpaa2_interrupt_handler(void *param) 576*c5acbb5eSHemant Agrawal { 577*c5acbb5eSHemant Agrawal struct rte_eth_dev *dev = param; 578*c5acbb5eSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 579*c5acbb5eSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 580*c5acbb5eSHemant Agrawal int ret; 581*c5acbb5eSHemant Agrawal int irq_index = DPNI_IRQ_INDEX; 582*c5acbb5eSHemant Agrawal unsigned int status = 0, clear = 0; 583*c5acbb5eSHemant Agrawal 584*c5acbb5eSHemant Agrawal PMD_INIT_FUNC_TRACE(); 585*c5acbb5eSHemant Agrawal 586*c5acbb5eSHemant Agrawal if (dpni == NULL) { 587*c5acbb5eSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL"); 588*c5acbb5eSHemant Agrawal return; 589*c5acbb5eSHemant Agrawal } 590*c5acbb5eSHemant Agrawal 591*c5acbb5eSHemant Agrawal ret = dpni_get_irq_status(dpni, CMD_PRI_LOW, priv->token, 592*c5acbb5eSHemant Agrawal irq_index, &status); 593*c5acbb5eSHemant Agrawal if (unlikely(ret)) { 594*c5acbb5eSHemant Agrawal RTE_LOG(ERR, PMD, "Can't get irq status (err %d)", ret); 595*c5acbb5eSHemant Agrawal clear = 0xffffffff; 596*c5acbb5eSHemant Agrawal goto out; 597*c5acbb5eSHemant Agrawal } 598*c5acbb5eSHemant Agrawal 599*c5acbb5eSHemant Agrawal if (status & DPNI_IRQ_EVENT_LINK_CHANGED) { 600*c5acbb5eSHemant Agrawal clear = DPNI_IRQ_EVENT_LINK_CHANGED; 601*c5acbb5eSHemant Agrawal dpaa2_dev_link_update(dev, 0); 602*c5acbb5eSHemant Agrawal /* calling all the apps registered for link status event */ 603*c5acbb5eSHemant Agrawal _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, 604*c5acbb5eSHemant Agrawal NULL, NULL); 605*c5acbb5eSHemant Agrawal } 606*c5acbb5eSHemant Agrawal out: 607*c5acbb5eSHemant Agrawal ret = dpni_clear_irq_status(dpni, CMD_PRI_LOW, priv->token, 608*c5acbb5eSHemant Agrawal irq_index, clear); 609*c5acbb5eSHemant Agrawal if (unlikely(ret)) 610*c5acbb5eSHemant Agrawal RTE_LOG(ERR, PMD, "Can't clear irq status (err %d)", ret); 611*c5acbb5eSHemant Agrawal } 612*c5acbb5eSHemant Agrawal 613*c5acbb5eSHemant Agrawal static int 614*c5acbb5eSHemant Agrawal dpaa2_eth_setup_irqs(struct rte_eth_dev *dev, int enable) 615*c5acbb5eSHemant Agrawal { 616*c5acbb5eSHemant Agrawal int err = 0; 617*c5acbb5eSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 618*c5acbb5eSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 619*c5acbb5eSHemant Agrawal int irq_index = DPNI_IRQ_INDEX; 620*c5acbb5eSHemant Agrawal unsigned int mask = DPNI_IRQ_EVENT_LINK_CHANGED; 621*c5acbb5eSHemant Agrawal 622*c5acbb5eSHemant Agrawal PMD_INIT_FUNC_TRACE(); 623*c5acbb5eSHemant Agrawal 624*c5acbb5eSHemant Agrawal err = dpni_set_irq_mask(dpni, CMD_PRI_LOW, priv->token, 625*c5acbb5eSHemant Agrawal irq_index, mask); 626*c5acbb5eSHemant Agrawal if (err < 0) { 627*c5acbb5eSHemant Agrawal PMD_INIT_LOG(ERR, "Error: dpni_set_irq_mask():%d (%s)", err, 628*c5acbb5eSHemant Agrawal strerror(-err)); 629*c5acbb5eSHemant Agrawal return err; 630*c5acbb5eSHemant Agrawal } 631*c5acbb5eSHemant Agrawal 632*c5acbb5eSHemant Agrawal err = dpni_set_irq_enable(dpni, CMD_PRI_LOW, priv->token, 633*c5acbb5eSHemant Agrawal irq_index, enable); 634*c5acbb5eSHemant Agrawal if (err < 0) 635*c5acbb5eSHemant Agrawal PMD_INIT_LOG(ERR, "Error: dpni_set_irq_enable():%d (%s)", err, 636*c5acbb5eSHemant Agrawal strerror(-err)); 637*c5acbb5eSHemant Agrawal 638*c5acbb5eSHemant Agrawal return err; 639*c5acbb5eSHemant Agrawal } 640*c5acbb5eSHemant Agrawal 6413e5a335dSHemant Agrawal static int 6423e5a335dSHemant Agrawal dpaa2_dev_start(struct rte_eth_dev *dev) 6433e5a335dSHemant Agrawal { 644*c5acbb5eSHemant Agrawal struct rte_device *rdev = dev->device; 645*c5acbb5eSHemant Agrawal struct rte_dpaa2_device *dpaa2_dev; 6463e5a335dSHemant Agrawal struct rte_eth_dev_data *data = dev->data; 6473e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = data->dev_private; 6483e5a335dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 6493e5a335dSHemant Agrawal struct dpni_queue cfg; 650ef18dafeSHemant Agrawal struct dpni_error_cfg err_cfg; 6513e5a335dSHemant Agrawal uint16_t qdid; 6523e5a335dSHemant Agrawal struct dpni_queue_id qid; 6533e5a335dSHemant Agrawal struct dpaa2_queue *dpaa2_q; 6543e5a335dSHemant Agrawal int ret, i; 655*c5acbb5eSHemant Agrawal struct rte_intr_handle *intr_handle; 656*c5acbb5eSHemant Agrawal 657*c5acbb5eSHemant Agrawal dpaa2_dev = container_of(rdev, struct rte_dpaa2_device, device); 658*c5acbb5eSHemant Agrawal intr_handle = &dpaa2_dev->intr_handle; 6593e5a335dSHemant Agrawal 6603e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 6613e5a335dSHemant Agrawal 6623e5a335dSHemant Agrawal ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token); 6633e5a335dSHemant Agrawal if (ret) { 6643e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Failure %d in enabling dpni %d device\n", 6653e5a335dSHemant Agrawal ret, priv->hw_id); 6663e5a335dSHemant Agrawal return ret; 6673e5a335dSHemant Agrawal } 6683e5a335dSHemant Agrawal 669a1f3a12cSHemant Agrawal /* Power up the phy. Needed to make the link go Up */ 670a1f3a12cSHemant Agrawal dpaa2_dev_set_link_up(dev); 671a1f3a12cSHemant Agrawal 6723e5a335dSHemant Agrawal ret = dpni_get_qdid(dpni, CMD_PRI_LOW, priv->token, 6733e5a335dSHemant Agrawal DPNI_QUEUE_TX, &qdid); 6743e5a335dSHemant Agrawal if (ret) { 6753e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Error to get qdid:ErrorCode = %d\n", ret); 6763e5a335dSHemant Agrawal return ret; 6773e5a335dSHemant Agrawal } 6783e5a335dSHemant Agrawal priv->qdid = qdid; 6793e5a335dSHemant Agrawal 6803e5a335dSHemant Agrawal for (i = 0; i < data->nb_rx_queues; i++) { 6813e5a335dSHemant Agrawal dpaa2_q = (struct dpaa2_queue *)data->rx_queues[i]; 6823e5a335dSHemant Agrawal ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token, 6833e5a335dSHemant Agrawal DPNI_QUEUE_RX, dpaa2_q->tc_index, 6843e5a335dSHemant Agrawal dpaa2_q->flow_id, &cfg, &qid); 6853e5a335dSHemant Agrawal if (ret) { 6863e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Error to get flow " 6873e5a335dSHemant Agrawal "information Error code = %d\n", ret); 6883e5a335dSHemant Agrawal return ret; 6893e5a335dSHemant Agrawal } 6903e5a335dSHemant Agrawal dpaa2_q->fqid = qid.fqid; 6913e5a335dSHemant Agrawal } 6923e5a335dSHemant Agrawal 693ef18dafeSHemant Agrawal ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token, 694ef18dafeSHemant Agrawal DPNI_OFF_RX_L3_CSUM, true); 695ef18dafeSHemant Agrawal if (ret) { 696ef18dafeSHemant Agrawal PMD_INIT_LOG(ERR, "Error to set RX l3 csum:Error = %d\n", ret); 697ef18dafeSHemant Agrawal return ret; 698ef18dafeSHemant Agrawal } 699ef18dafeSHemant Agrawal 700ef18dafeSHemant Agrawal ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token, 701ef18dafeSHemant Agrawal DPNI_OFF_RX_L4_CSUM, true); 702ef18dafeSHemant Agrawal if (ret) { 703ef18dafeSHemant Agrawal PMD_INIT_LOG(ERR, "Error to get RX l4 csum:Error = %d\n", ret); 704ef18dafeSHemant Agrawal return ret; 705ef18dafeSHemant Agrawal } 706ef18dafeSHemant Agrawal 707ef18dafeSHemant Agrawal ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token, 708ef18dafeSHemant Agrawal DPNI_OFF_TX_L3_CSUM, true); 709ef18dafeSHemant Agrawal if (ret) { 710ef18dafeSHemant Agrawal PMD_INIT_LOG(ERR, "Error to set TX l3 csum:Error = %d\n", ret); 711ef18dafeSHemant Agrawal return ret; 712ef18dafeSHemant Agrawal } 713ef18dafeSHemant Agrawal 714ef18dafeSHemant Agrawal ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token, 715ef18dafeSHemant Agrawal DPNI_OFF_TX_L4_CSUM, true); 716ef18dafeSHemant Agrawal if (ret) { 717ef18dafeSHemant Agrawal PMD_INIT_LOG(ERR, "Error to get TX l4 csum:Error = %d\n", ret); 718ef18dafeSHemant Agrawal return ret; 719ef18dafeSHemant Agrawal } 720ef18dafeSHemant Agrawal 721ef18dafeSHemant Agrawal /*checksum errors, send them to normal path and set it in annotation */ 722ef18dafeSHemant Agrawal err_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE; 723ef18dafeSHemant Agrawal 724ef18dafeSHemant Agrawal err_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE; 725ef18dafeSHemant Agrawal err_cfg.set_frame_annotation = true; 726ef18dafeSHemant Agrawal 727ef18dafeSHemant Agrawal ret = dpni_set_errors_behavior(dpni, CMD_PRI_LOW, 728ef18dafeSHemant Agrawal priv->token, &err_cfg); 729ef18dafeSHemant Agrawal if (ret) { 730ef18dafeSHemant Agrawal PMD_INIT_LOG(ERR, "Error to dpni_set_errors_behavior:" 731ef18dafeSHemant Agrawal "code = %d\n", ret); 732ef18dafeSHemant Agrawal return ret; 733ef18dafeSHemant Agrawal } 7343ce294f2SHemant Agrawal /* VLAN Offload Settings */ 7353ce294f2SHemant Agrawal if (priv->max_vlan_filters) 7363ce294f2SHemant Agrawal dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK); 737ef18dafeSHemant Agrawal 738*c5acbb5eSHemant Agrawal /* if the interrupts were configured on this devices*/ 739*c5acbb5eSHemant Agrawal if (intr_handle && (intr_handle->fd) && 740*c5acbb5eSHemant Agrawal (dev->data->dev_conf.intr_conf.lsc != 0)) { 741*c5acbb5eSHemant Agrawal /* Registering LSC interrupt handler */ 742*c5acbb5eSHemant Agrawal rte_intr_callback_register(intr_handle, 743*c5acbb5eSHemant Agrawal dpaa2_interrupt_handler, 744*c5acbb5eSHemant Agrawal (void *)dev); 745*c5acbb5eSHemant Agrawal 746*c5acbb5eSHemant Agrawal /* enable vfio intr/eventfd mapping 747*c5acbb5eSHemant Agrawal * Interrupt index 0 is required, so we can not use 748*c5acbb5eSHemant Agrawal * rte_intr_enable. 749*c5acbb5eSHemant Agrawal */ 750*c5acbb5eSHemant Agrawal rte_dpaa2_intr_enable(intr_handle, DPNI_IRQ_INDEX); 751*c5acbb5eSHemant Agrawal 752*c5acbb5eSHemant Agrawal /* enable dpni_irqs */ 753*c5acbb5eSHemant Agrawal dpaa2_eth_setup_irqs(dev, 1); 754*c5acbb5eSHemant Agrawal } 755*c5acbb5eSHemant Agrawal 7563e5a335dSHemant Agrawal return 0; 7573e5a335dSHemant Agrawal } 7583e5a335dSHemant Agrawal 7593e5a335dSHemant Agrawal /** 7603e5a335dSHemant Agrawal * This routine disables all traffic on the adapter by issuing a 7613e5a335dSHemant Agrawal * global reset on the MAC. 7623e5a335dSHemant Agrawal */ 7633e5a335dSHemant Agrawal static void 7643e5a335dSHemant Agrawal dpaa2_dev_stop(struct rte_eth_dev *dev) 7653e5a335dSHemant Agrawal { 7663e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 7673e5a335dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 7683e5a335dSHemant Agrawal int ret; 769c56c86ffSHemant Agrawal struct rte_eth_link link; 770*c5acbb5eSHemant Agrawal struct rte_intr_handle *intr_handle = dev->intr_handle; 7713e5a335dSHemant Agrawal 7723e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 7733e5a335dSHemant Agrawal 774*c5acbb5eSHemant Agrawal /* reset interrupt callback */ 775*c5acbb5eSHemant Agrawal if (intr_handle && (intr_handle->fd) && 776*c5acbb5eSHemant Agrawal (dev->data->dev_conf.intr_conf.lsc != 0)) { 777*c5acbb5eSHemant Agrawal /*disable dpni irqs */ 778*c5acbb5eSHemant Agrawal dpaa2_eth_setup_irqs(dev, 0); 779*c5acbb5eSHemant Agrawal 780*c5acbb5eSHemant Agrawal /* disable vfio intr before callback unregister */ 781*c5acbb5eSHemant Agrawal rte_dpaa2_intr_disable(intr_handle, DPNI_IRQ_INDEX); 782*c5acbb5eSHemant Agrawal 783*c5acbb5eSHemant Agrawal /* Unregistering LSC interrupt handler */ 784*c5acbb5eSHemant Agrawal rte_intr_callback_unregister(intr_handle, 785*c5acbb5eSHemant Agrawal dpaa2_interrupt_handler, 786*c5acbb5eSHemant Agrawal (void *)dev); 787*c5acbb5eSHemant Agrawal } 788*c5acbb5eSHemant Agrawal 789a1f3a12cSHemant Agrawal dpaa2_dev_set_link_down(dev); 790a1f3a12cSHemant Agrawal 7913e5a335dSHemant Agrawal ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token); 7923e5a335dSHemant Agrawal if (ret) { 7933e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Failure (ret %d) in disabling dpni %d dev\n", 7943e5a335dSHemant Agrawal ret, priv->hw_id); 7953e5a335dSHemant Agrawal return; 7963e5a335dSHemant Agrawal } 797c56c86ffSHemant Agrawal 798c56c86ffSHemant Agrawal /* clear the recorded link status */ 799c56c86ffSHemant Agrawal memset(&link, 0, sizeof(link)); 800c56c86ffSHemant Agrawal dpaa2_dev_atomic_write_link_status(dev, &link); 8013e5a335dSHemant Agrawal } 8023e5a335dSHemant Agrawal 8033e5a335dSHemant Agrawal static void 8043e5a335dSHemant Agrawal dpaa2_dev_close(struct rte_eth_dev *dev) 8053e5a335dSHemant Agrawal { 8067ae777d0SHemant Agrawal struct rte_eth_dev_data *data = dev->data; 8073e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 8083e5a335dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 8097ae777d0SHemant Agrawal int i, ret; 810a1f3a12cSHemant Agrawal struct rte_eth_link link; 8117ae777d0SHemant Agrawal struct dpaa2_queue *dpaa2_q; 8123e5a335dSHemant Agrawal 8133e5a335dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 8143e5a335dSHemant Agrawal 8157ae777d0SHemant Agrawal for (i = 0; i < data->nb_tx_queues; i++) { 8167ae777d0SHemant Agrawal dpaa2_q = (struct dpaa2_queue *)data->tx_queues[i]; 8177ae777d0SHemant Agrawal if (!dpaa2_q->cscn) { 8187ae777d0SHemant Agrawal rte_free(dpaa2_q->cscn); 8197ae777d0SHemant Agrawal dpaa2_q->cscn = NULL; 8207ae777d0SHemant Agrawal } 8217ae777d0SHemant Agrawal } 8227ae777d0SHemant Agrawal 8233e5a335dSHemant Agrawal /* Clean the device first */ 8243e5a335dSHemant Agrawal ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token); 8253e5a335dSHemant Agrawal if (ret) { 8263e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "Failure cleaning dpni device with" 8273e5a335dSHemant Agrawal " error code %d\n", ret); 8283e5a335dSHemant Agrawal return; 8293e5a335dSHemant Agrawal } 830a1f3a12cSHemant Agrawal 831a1f3a12cSHemant Agrawal memset(&link, 0, sizeof(link)); 832a1f3a12cSHemant Agrawal dpaa2_dev_atomic_write_link_status(dev, &link); 8333e5a335dSHemant Agrawal } 8343e5a335dSHemant Agrawal 835c0e5c69aSHemant Agrawal static void 836c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_enable( 837c0e5c69aSHemant Agrawal struct rte_eth_dev *dev) 838c0e5c69aSHemant Agrawal { 839c0e5c69aSHemant Agrawal int ret; 840c0e5c69aSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 841c0e5c69aSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 842c0e5c69aSHemant Agrawal 843c0e5c69aSHemant Agrawal PMD_INIT_FUNC_TRACE(); 844c0e5c69aSHemant Agrawal 845c0e5c69aSHemant Agrawal if (dpni == NULL) { 846645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 847c0e5c69aSHemant Agrawal return; 848c0e5c69aSHemant Agrawal } 849c0e5c69aSHemant Agrawal 850c0e5c69aSHemant Agrawal ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, true); 851c0e5c69aSHemant Agrawal if (ret < 0) 852645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to enable U promisc mode %d\n", ret); 8535d5aeeedSHemant Agrawal 8545d5aeeedSHemant Agrawal ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true); 8555d5aeeedSHemant Agrawal if (ret < 0) 856645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to enable M promisc mode %d\n", ret); 857c0e5c69aSHemant Agrawal } 858c0e5c69aSHemant Agrawal 859c0e5c69aSHemant Agrawal static void 860c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_disable( 861c0e5c69aSHemant Agrawal struct rte_eth_dev *dev) 862c0e5c69aSHemant Agrawal { 863c0e5c69aSHemant Agrawal int ret; 864c0e5c69aSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 865c0e5c69aSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 866c0e5c69aSHemant Agrawal 867c0e5c69aSHemant Agrawal PMD_INIT_FUNC_TRACE(); 868c0e5c69aSHemant Agrawal 869c0e5c69aSHemant Agrawal if (dpni == NULL) { 870645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 871c0e5c69aSHemant Agrawal return; 872c0e5c69aSHemant Agrawal } 873c0e5c69aSHemant Agrawal 874c0e5c69aSHemant Agrawal ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, false); 875c0e5c69aSHemant Agrawal if (ret < 0) 876645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to disable U promisc mode %d\n", ret); 8775d5aeeedSHemant Agrawal 8785d5aeeedSHemant Agrawal if (dev->data->all_multicast == 0) { 8795d5aeeedSHemant Agrawal ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, 8805d5aeeedSHemant Agrawal priv->token, false); 8815d5aeeedSHemant Agrawal if (ret < 0) 882645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, 883645bd25aSHemant Agrawal "Unable to disable M promisc mode %d\n", 8845d5aeeedSHemant Agrawal ret); 8855d5aeeedSHemant Agrawal } 8865d5aeeedSHemant Agrawal } 8875d5aeeedSHemant Agrawal 8885d5aeeedSHemant Agrawal static void 8895d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_enable( 8905d5aeeedSHemant Agrawal struct rte_eth_dev *dev) 8915d5aeeedSHemant Agrawal { 8925d5aeeedSHemant Agrawal int ret; 8935d5aeeedSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 8945d5aeeedSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 8955d5aeeedSHemant Agrawal 8965d5aeeedSHemant Agrawal PMD_INIT_FUNC_TRACE(); 8975d5aeeedSHemant Agrawal 8985d5aeeedSHemant Agrawal if (dpni == NULL) { 899645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 9005d5aeeedSHemant Agrawal return; 9015d5aeeedSHemant Agrawal } 9025d5aeeedSHemant Agrawal 9035d5aeeedSHemant Agrawal ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true); 9045d5aeeedSHemant Agrawal if (ret < 0) 905645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to enable multicast mode %d\n", ret); 9065d5aeeedSHemant Agrawal } 9075d5aeeedSHemant Agrawal 9085d5aeeedSHemant Agrawal static void 9095d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev) 9105d5aeeedSHemant Agrawal { 9115d5aeeedSHemant Agrawal int ret; 9125d5aeeedSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 9135d5aeeedSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 9145d5aeeedSHemant Agrawal 9155d5aeeedSHemant Agrawal PMD_INIT_FUNC_TRACE(); 9165d5aeeedSHemant Agrawal 9175d5aeeedSHemant Agrawal if (dpni == NULL) { 918645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 9195d5aeeedSHemant Agrawal return; 9205d5aeeedSHemant Agrawal } 9215d5aeeedSHemant Agrawal 9225d5aeeedSHemant Agrawal /* must remain on for all promiscuous */ 9235d5aeeedSHemant Agrawal if (dev->data->promiscuous == 1) 9245d5aeeedSHemant Agrawal return; 9255d5aeeedSHemant Agrawal 9265d5aeeedSHemant Agrawal ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, false); 9275d5aeeedSHemant Agrawal if (ret < 0) 928645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to disable multicast mode %d\n", ret); 929c0e5c69aSHemant Agrawal } 930e31d4d21SHemant Agrawal 931e31d4d21SHemant Agrawal static int 932e31d4d21SHemant Agrawal dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) 933e31d4d21SHemant Agrawal { 934e31d4d21SHemant Agrawal int ret; 935e31d4d21SHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 936e31d4d21SHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 937e31d4d21SHemant Agrawal uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; 938e31d4d21SHemant Agrawal 939e31d4d21SHemant Agrawal PMD_INIT_FUNC_TRACE(); 940e31d4d21SHemant Agrawal 941e31d4d21SHemant Agrawal if (dpni == NULL) { 942645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 943e31d4d21SHemant Agrawal return -EINVAL; 944e31d4d21SHemant Agrawal } 945e31d4d21SHemant Agrawal 946e31d4d21SHemant Agrawal /* check that mtu is within the allowed range */ 947e31d4d21SHemant Agrawal if ((mtu < ETHER_MIN_MTU) || (frame_size > DPAA2_MAX_RX_PKT_LEN)) 948e31d4d21SHemant Agrawal return -EINVAL; 949e31d4d21SHemant Agrawal 950e1640849SHemant Agrawal if (frame_size > ETHER_MAX_LEN) 951e1640849SHemant Agrawal dev->data->dev_conf.rxmode.jumbo_frame = 1; 952e1640849SHemant Agrawal else 953e1640849SHemant Agrawal dev->data->dev_conf.rxmode.jumbo_frame = 0; 954e1640849SHemant Agrawal 955e31d4d21SHemant Agrawal /* Set the Max Rx frame length as 'mtu' + 956e31d4d21SHemant Agrawal * Maximum Ethernet header length 957e31d4d21SHemant Agrawal */ 958e31d4d21SHemant Agrawal ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW, priv->token, 959e31d4d21SHemant Agrawal mtu + ETH_VLAN_HLEN); 960e31d4d21SHemant Agrawal if (ret) { 961e31d4d21SHemant Agrawal PMD_DRV_LOG(ERR, "setting the max frame length failed"); 962e31d4d21SHemant Agrawal return -1; 963e31d4d21SHemant Agrawal } 964e31d4d21SHemant Agrawal PMD_DRV_LOG(INFO, "MTU is configured %d for the device\n", mtu); 965e31d4d21SHemant Agrawal return 0; 966e31d4d21SHemant Agrawal } 967e31d4d21SHemant Agrawal 968b4d97b7dSHemant Agrawal static int 969b4d97b7dSHemant Agrawal dpaa2_dev_add_mac_addr(struct rte_eth_dev *dev, 970b4d97b7dSHemant Agrawal struct ether_addr *addr, 971b4d97b7dSHemant Agrawal __rte_unused uint32_t index, 972b4d97b7dSHemant Agrawal __rte_unused uint32_t pool) 973b4d97b7dSHemant Agrawal { 974b4d97b7dSHemant Agrawal int ret; 975b4d97b7dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 976b4d97b7dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 977b4d97b7dSHemant Agrawal 978b4d97b7dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 979b4d97b7dSHemant Agrawal 980b4d97b7dSHemant Agrawal if (dpni == NULL) { 981645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 982b4d97b7dSHemant Agrawal return -1; 983b4d97b7dSHemant Agrawal } 984b4d97b7dSHemant Agrawal 985b4d97b7dSHemant Agrawal ret = dpni_add_mac_addr(dpni, CMD_PRI_LOW, 986b4d97b7dSHemant Agrawal priv->token, addr->addr_bytes); 987b4d97b7dSHemant Agrawal if (ret) 988645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, 989645bd25aSHemant Agrawal "error: Adding the MAC ADDR failed: err = %d\n", ret); 990b4d97b7dSHemant Agrawal return 0; 991b4d97b7dSHemant Agrawal } 992b4d97b7dSHemant Agrawal 993b4d97b7dSHemant Agrawal static void 994b4d97b7dSHemant Agrawal dpaa2_dev_remove_mac_addr(struct rte_eth_dev *dev, 995b4d97b7dSHemant Agrawal uint32_t index) 996b4d97b7dSHemant Agrawal { 997b4d97b7dSHemant Agrawal int ret; 998b4d97b7dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 999b4d97b7dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 1000b4d97b7dSHemant Agrawal struct rte_eth_dev_data *data = dev->data; 1001b4d97b7dSHemant Agrawal struct ether_addr *macaddr; 1002b4d97b7dSHemant Agrawal 1003b4d97b7dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 1004b4d97b7dSHemant Agrawal 1005b4d97b7dSHemant Agrawal macaddr = &data->mac_addrs[index]; 1006b4d97b7dSHemant Agrawal 1007b4d97b7dSHemant Agrawal if (dpni == NULL) { 1008645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1009b4d97b7dSHemant Agrawal return; 1010b4d97b7dSHemant Agrawal } 1011b4d97b7dSHemant Agrawal 1012b4d97b7dSHemant Agrawal ret = dpni_remove_mac_addr(dpni, CMD_PRI_LOW, 1013b4d97b7dSHemant Agrawal priv->token, macaddr->addr_bytes); 1014b4d97b7dSHemant Agrawal if (ret) 1015645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, 1016645bd25aSHemant Agrawal "error: Removing the MAC ADDR failed: err = %d\n", ret); 1017b4d97b7dSHemant Agrawal } 1018b4d97b7dSHemant Agrawal 1019b4d97b7dSHemant Agrawal static void 1020b4d97b7dSHemant Agrawal dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev, 1021b4d97b7dSHemant Agrawal struct ether_addr *addr) 1022b4d97b7dSHemant Agrawal { 1023b4d97b7dSHemant Agrawal int ret; 1024b4d97b7dSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 1025b4d97b7dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 1026b4d97b7dSHemant Agrawal 1027b4d97b7dSHemant Agrawal PMD_INIT_FUNC_TRACE(); 1028b4d97b7dSHemant Agrawal 1029b4d97b7dSHemant Agrawal if (dpni == NULL) { 1030645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1031b4d97b7dSHemant Agrawal return; 1032b4d97b7dSHemant Agrawal } 1033b4d97b7dSHemant Agrawal 1034b4d97b7dSHemant Agrawal ret = dpni_set_primary_mac_addr(dpni, CMD_PRI_LOW, 1035b4d97b7dSHemant Agrawal priv->token, addr->addr_bytes); 1036b4d97b7dSHemant Agrawal 1037b4d97b7dSHemant Agrawal if (ret) 1038645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, 1039645bd25aSHemant Agrawal "error: Setting the MAC ADDR failed %d\n", ret); 1040b4d97b7dSHemant Agrawal } 1041b0aa5459SHemant Agrawal static 1042b0aa5459SHemant Agrawal void dpaa2_dev_stats_get(struct rte_eth_dev *dev, 1043b0aa5459SHemant Agrawal struct rte_eth_stats *stats) 1044b0aa5459SHemant Agrawal { 1045b0aa5459SHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 1046b0aa5459SHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 1047b0aa5459SHemant Agrawal int32_t retcode; 1048b0aa5459SHemant Agrawal uint8_t page0 = 0, page1 = 1, page2 = 2; 1049b0aa5459SHemant Agrawal union dpni_statistics value; 1050b0aa5459SHemant Agrawal 1051b0aa5459SHemant Agrawal memset(&value, 0, sizeof(union dpni_statistics)); 1052b0aa5459SHemant Agrawal 1053b0aa5459SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1054b0aa5459SHemant Agrawal 1055b0aa5459SHemant Agrawal if (!dpni) { 1056645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1057b0aa5459SHemant Agrawal return; 1058b0aa5459SHemant Agrawal } 1059b0aa5459SHemant Agrawal 1060b0aa5459SHemant Agrawal if (!stats) { 1061645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "stats is NULL\n"); 1062b0aa5459SHemant Agrawal return; 1063b0aa5459SHemant Agrawal } 1064b0aa5459SHemant Agrawal 1065b0aa5459SHemant Agrawal /*Get Counters from page_0*/ 1066b0aa5459SHemant Agrawal retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token, 106716bbc98aSShreyansh Jain page0, 0, &value); 1068b0aa5459SHemant Agrawal if (retcode) 1069b0aa5459SHemant Agrawal goto err; 1070b0aa5459SHemant Agrawal 1071b0aa5459SHemant Agrawal stats->ipackets = value.page_0.ingress_all_frames; 1072b0aa5459SHemant Agrawal stats->ibytes = value.page_0.ingress_all_bytes; 1073b0aa5459SHemant Agrawal 1074b0aa5459SHemant Agrawal /*Get Counters from page_1*/ 1075b0aa5459SHemant Agrawal retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token, 107616bbc98aSShreyansh Jain page1, 0, &value); 1077b0aa5459SHemant Agrawal if (retcode) 1078b0aa5459SHemant Agrawal goto err; 1079b0aa5459SHemant Agrawal 1080b0aa5459SHemant Agrawal stats->opackets = value.page_1.egress_all_frames; 1081b0aa5459SHemant Agrawal stats->obytes = value.page_1.egress_all_bytes; 1082b0aa5459SHemant Agrawal 1083b0aa5459SHemant Agrawal /*Get Counters from page_2*/ 1084b0aa5459SHemant Agrawal retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token, 108516bbc98aSShreyansh Jain page2, 0, &value); 1086b0aa5459SHemant Agrawal if (retcode) 1087b0aa5459SHemant Agrawal goto err; 1088b0aa5459SHemant Agrawal 1089b4d97b7dSHemant Agrawal /* Ingress drop frame count due to configured rules */ 1090b4d97b7dSHemant Agrawal stats->ierrors = value.page_2.ingress_filtered_frames; 1091b4d97b7dSHemant Agrawal /* Ingress drop frame count due to error */ 1092b4d97b7dSHemant Agrawal stats->ierrors += value.page_2.ingress_discarded_frames; 1093b4d97b7dSHemant Agrawal 1094b0aa5459SHemant Agrawal stats->oerrors = value.page_2.egress_discarded_frames; 1095b0aa5459SHemant Agrawal stats->imissed = value.page_2.ingress_nobuffer_discards; 1096b0aa5459SHemant Agrawal 1097b0aa5459SHemant Agrawal return; 1098b0aa5459SHemant Agrawal 1099b0aa5459SHemant Agrawal err: 1100b0aa5459SHemant Agrawal RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode); 1101b0aa5459SHemant Agrawal return; 1102b0aa5459SHemant Agrawal }; 1103b0aa5459SHemant Agrawal 1104b0aa5459SHemant Agrawal static 1105b0aa5459SHemant Agrawal void dpaa2_dev_stats_reset(struct rte_eth_dev *dev) 1106b0aa5459SHemant Agrawal { 1107b0aa5459SHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 1108b0aa5459SHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 1109b0aa5459SHemant Agrawal int32_t retcode; 1110b0aa5459SHemant Agrawal 1111b0aa5459SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1112b0aa5459SHemant Agrawal 1113b0aa5459SHemant Agrawal if (dpni == NULL) { 1114645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1115b0aa5459SHemant Agrawal return; 1116b0aa5459SHemant Agrawal } 1117b0aa5459SHemant Agrawal 1118b0aa5459SHemant Agrawal retcode = dpni_reset_statistics(dpni, CMD_PRI_LOW, priv->token); 1119b0aa5459SHemant Agrawal if (retcode) 1120b0aa5459SHemant Agrawal goto error; 1121b0aa5459SHemant Agrawal 1122b0aa5459SHemant Agrawal return; 1123b0aa5459SHemant Agrawal 1124b0aa5459SHemant Agrawal error: 1125b0aa5459SHemant Agrawal RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode); 1126b0aa5459SHemant Agrawal return; 1127b0aa5459SHemant Agrawal }; 1128b0aa5459SHemant Agrawal 1129c56c86ffSHemant Agrawal /* return 0 means link status changed, -1 means not changed */ 1130c56c86ffSHemant Agrawal static int 1131c56c86ffSHemant Agrawal dpaa2_dev_link_update(struct rte_eth_dev *dev, 1132c56c86ffSHemant Agrawal int wait_to_complete __rte_unused) 1133c56c86ffSHemant Agrawal { 1134c56c86ffSHemant Agrawal int ret; 1135c56c86ffSHemant Agrawal struct dpaa2_dev_priv *priv = dev->data->dev_private; 1136c56c86ffSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 1137c56c86ffSHemant Agrawal struct rte_eth_link link, old; 1138c56c86ffSHemant Agrawal struct dpni_link_state state = {0}; 1139c56c86ffSHemant Agrawal 1140c56c86ffSHemant Agrawal PMD_INIT_FUNC_TRACE(); 1141c56c86ffSHemant Agrawal 1142c56c86ffSHemant Agrawal if (dpni == NULL) { 1143645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1144c56c86ffSHemant Agrawal return 0; 1145c56c86ffSHemant Agrawal } 1146c56c86ffSHemant Agrawal memset(&old, 0, sizeof(old)); 1147c56c86ffSHemant Agrawal dpaa2_dev_atomic_read_link_status(dev, &old); 1148c56c86ffSHemant Agrawal 1149c56c86ffSHemant Agrawal ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state); 1150c56c86ffSHemant Agrawal if (ret < 0) { 1151645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret); 1152c56c86ffSHemant Agrawal return -1; 1153c56c86ffSHemant Agrawal } 1154c56c86ffSHemant Agrawal 1155c56c86ffSHemant Agrawal if ((old.link_status == state.up) && (old.link_speed == state.rate)) { 1156c56c86ffSHemant Agrawal RTE_LOG(DEBUG, PMD, "No change in status\n"); 1157c56c86ffSHemant Agrawal return -1; 1158c56c86ffSHemant Agrawal } 1159c56c86ffSHemant Agrawal 1160c56c86ffSHemant Agrawal memset(&link, 0, sizeof(struct rte_eth_link)); 1161c56c86ffSHemant Agrawal link.link_status = state.up; 1162c56c86ffSHemant Agrawal link.link_speed = state.rate; 1163c56c86ffSHemant Agrawal 1164c56c86ffSHemant Agrawal if (state.options & DPNI_LINK_OPT_HALF_DUPLEX) 1165c56c86ffSHemant Agrawal link.link_duplex = ETH_LINK_HALF_DUPLEX; 1166c56c86ffSHemant Agrawal else 1167c56c86ffSHemant Agrawal link.link_duplex = ETH_LINK_FULL_DUPLEX; 1168c56c86ffSHemant Agrawal 1169c56c86ffSHemant Agrawal dpaa2_dev_atomic_write_link_status(dev, &link); 1170c56c86ffSHemant Agrawal 1171c56c86ffSHemant Agrawal if (link.link_status) 1172c56c86ffSHemant Agrawal PMD_DRV_LOG(INFO, "Port %d Link is Up\n", dev->data->port_id); 1173c56c86ffSHemant Agrawal else 1174c56c86ffSHemant Agrawal PMD_DRV_LOG(INFO, "Port %d Link is Down\n", dev->data->port_id); 1175c56c86ffSHemant Agrawal return 0; 1176c56c86ffSHemant Agrawal } 1177c56c86ffSHemant Agrawal 1178a1f3a12cSHemant Agrawal /** 1179a1f3a12cSHemant Agrawal * Toggle the DPNI to enable, if not already enabled. 1180a1f3a12cSHemant Agrawal * This is not strictly PHY up/down - it is more of logical toggling. 1181a1f3a12cSHemant Agrawal */ 1182a1f3a12cSHemant Agrawal static int 1183a1f3a12cSHemant Agrawal dpaa2_dev_set_link_up(struct rte_eth_dev *dev) 1184a1f3a12cSHemant Agrawal { 1185a1f3a12cSHemant Agrawal int ret = -EINVAL; 1186a1f3a12cSHemant Agrawal struct dpaa2_dev_priv *priv; 1187a1f3a12cSHemant Agrawal struct fsl_mc_io *dpni; 1188a1f3a12cSHemant Agrawal int en = 0; 1189a1f3a12cSHemant Agrawal 1190a1f3a12cSHemant Agrawal PMD_INIT_FUNC_TRACE(); 1191a1f3a12cSHemant Agrawal 1192a1f3a12cSHemant Agrawal priv = dev->data->dev_private; 1193a1f3a12cSHemant Agrawal dpni = (struct fsl_mc_io *)priv->hw; 1194a1f3a12cSHemant Agrawal 1195a1f3a12cSHemant Agrawal if (dpni == NULL) { 1196645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "DPNI is NULL\n"); 1197a1f3a12cSHemant Agrawal return ret; 1198a1f3a12cSHemant Agrawal } 1199a1f3a12cSHemant Agrawal 1200a1f3a12cSHemant Agrawal /* Check if DPNI is currently enabled */ 1201a1f3a12cSHemant Agrawal ret = dpni_is_enabled(dpni, CMD_PRI_LOW, priv->token, &en); 1202a1f3a12cSHemant Agrawal if (ret) { 1203a1f3a12cSHemant Agrawal /* Unable to obtain dpni status; Not continuing */ 1204a1f3a12cSHemant Agrawal PMD_DRV_LOG(ERR, "Interface Link UP failed (%d)", ret); 1205a1f3a12cSHemant Agrawal return -EINVAL; 1206a1f3a12cSHemant Agrawal } 1207a1f3a12cSHemant Agrawal 1208a1f3a12cSHemant Agrawal /* Enable link if not already enabled */ 1209a1f3a12cSHemant Agrawal if (!en) { 1210a1f3a12cSHemant Agrawal ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token); 1211a1f3a12cSHemant Agrawal if (ret) { 1212a1f3a12cSHemant Agrawal PMD_DRV_LOG(ERR, "Interface Link UP failed (%d)", ret); 1213a1f3a12cSHemant Agrawal return -EINVAL; 1214a1f3a12cSHemant Agrawal } 1215a1f3a12cSHemant Agrawal } 1216a1f3a12cSHemant Agrawal /* changing tx burst function to start enqueues */ 1217a1f3a12cSHemant Agrawal dev->tx_pkt_burst = dpaa2_dev_tx; 1218a1f3a12cSHemant Agrawal dev->data->dev_link.link_status = 1; 1219a1f3a12cSHemant Agrawal 1220a1f3a12cSHemant Agrawal PMD_DRV_LOG(INFO, "Port %d Link UP successful", dev->data->port_id); 1221a1f3a12cSHemant Agrawal return ret; 1222a1f3a12cSHemant Agrawal } 1223a1f3a12cSHemant Agrawal 1224a1f3a12cSHemant Agrawal /** 1225a1f3a12cSHemant Agrawal * Toggle the DPNI to disable, if not already disabled. 1226a1f3a12cSHemant Agrawal * This is not strictly PHY up/down - it is more of logical toggling. 1227a1f3a12cSHemant Agrawal */ 1228a1f3a12cSHemant Agrawal static int 1229a1f3a12cSHemant Agrawal dpaa2_dev_set_link_down(struct rte_eth_dev *dev) 1230a1f3a12cSHemant Agrawal { 1231a1f3a12cSHemant Agrawal int ret = -EINVAL; 1232a1f3a12cSHemant Agrawal struct dpaa2_dev_priv *priv; 1233a1f3a12cSHemant Agrawal struct fsl_mc_io *dpni; 1234a1f3a12cSHemant Agrawal int dpni_enabled = 0; 1235a1f3a12cSHemant Agrawal int retries = 10; 1236a1f3a12cSHemant Agrawal 1237a1f3a12cSHemant Agrawal PMD_INIT_FUNC_TRACE(); 1238a1f3a12cSHemant Agrawal 1239a1f3a12cSHemant Agrawal priv = dev->data->dev_private; 1240a1f3a12cSHemant Agrawal dpni = (struct fsl_mc_io *)priv->hw; 1241a1f3a12cSHemant Agrawal 1242a1f3a12cSHemant Agrawal if (dpni == NULL) { 1243645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Device has not yet been configured\n"); 1244a1f3a12cSHemant Agrawal return ret; 1245a1f3a12cSHemant Agrawal } 1246a1f3a12cSHemant Agrawal 1247a1f3a12cSHemant Agrawal /*changing tx burst function to avoid any more enqueues */ 1248a1f3a12cSHemant Agrawal dev->tx_pkt_burst = dummy_dev_tx; 1249a1f3a12cSHemant Agrawal 1250a1f3a12cSHemant Agrawal /* Loop while dpni_disable() attempts to drain the egress FQs 1251a1f3a12cSHemant Agrawal * and confirm them back to us. 1252a1f3a12cSHemant Agrawal */ 1253a1f3a12cSHemant Agrawal do { 1254a1f3a12cSHemant Agrawal ret = dpni_disable(dpni, 0, priv->token); 1255a1f3a12cSHemant Agrawal if (ret) { 1256a1f3a12cSHemant Agrawal PMD_DRV_LOG(ERR, "dpni disable failed (%d)", ret); 1257a1f3a12cSHemant Agrawal return ret; 1258a1f3a12cSHemant Agrawal } 1259a1f3a12cSHemant Agrawal ret = dpni_is_enabled(dpni, 0, priv->token, &dpni_enabled); 1260a1f3a12cSHemant Agrawal if (ret) { 1261a1f3a12cSHemant Agrawal PMD_DRV_LOG(ERR, "dpni_is_enabled failed (%d)", ret); 1262a1f3a12cSHemant Agrawal return ret; 1263a1f3a12cSHemant Agrawal } 1264a1f3a12cSHemant Agrawal if (dpni_enabled) 1265a1f3a12cSHemant Agrawal /* Allow the MC some slack */ 1266a1f3a12cSHemant Agrawal rte_delay_us(100 * 1000); 1267a1f3a12cSHemant Agrawal } while (dpni_enabled && --retries); 1268a1f3a12cSHemant Agrawal 1269a1f3a12cSHemant Agrawal if (!retries) { 1270a1f3a12cSHemant Agrawal PMD_DRV_LOG(WARNING, "Retry count exceeded disabling DPNI\n"); 1271a1f3a12cSHemant Agrawal /* todo- we may have to manually cleanup queues. 1272a1f3a12cSHemant Agrawal */ 1273a1f3a12cSHemant Agrawal } else { 1274a1f3a12cSHemant Agrawal PMD_DRV_LOG(INFO, "Port %d Link DOWN successful", 1275a1f3a12cSHemant Agrawal dev->data->port_id); 1276a1f3a12cSHemant Agrawal } 1277a1f3a12cSHemant Agrawal 1278a1f3a12cSHemant Agrawal dev->data->dev_link.link_status = 0; 1279a1f3a12cSHemant Agrawal 1280a1f3a12cSHemant Agrawal return ret; 1281a1f3a12cSHemant Agrawal } 1282a1f3a12cSHemant Agrawal 1283977d0006SHemant Agrawal static int 1284977d0006SHemant Agrawal dpaa2_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) 1285977d0006SHemant Agrawal { 1286977d0006SHemant Agrawal int ret = -EINVAL; 1287977d0006SHemant Agrawal struct dpaa2_dev_priv *priv; 1288977d0006SHemant Agrawal struct fsl_mc_io *dpni; 1289977d0006SHemant Agrawal struct dpni_link_state state = {0}; 1290977d0006SHemant Agrawal 1291977d0006SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1292977d0006SHemant Agrawal 1293977d0006SHemant Agrawal priv = dev->data->dev_private; 1294977d0006SHemant Agrawal dpni = (struct fsl_mc_io *)priv->hw; 1295977d0006SHemant Agrawal 1296977d0006SHemant Agrawal if (dpni == NULL || fc_conf == NULL) { 1297645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "device not configured\n"); 1298977d0006SHemant Agrawal return ret; 1299977d0006SHemant Agrawal } 1300977d0006SHemant Agrawal 1301977d0006SHemant Agrawal ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state); 1302977d0006SHemant Agrawal if (ret) { 1303645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret); 1304977d0006SHemant Agrawal return ret; 1305977d0006SHemant Agrawal } 1306977d0006SHemant Agrawal 1307977d0006SHemant Agrawal memset(fc_conf, 0, sizeof(struct rte_eth_fc_conf)); 1308977d0006SHemant Agrawal if (state.options & DPNI_LINK_OPT_PAUSE) { 1309977d0006SHemant Agrawal /* DPNI_LINK_OPT_PAUSE set 1310977d0006SHemant Agrawal * if ASYM_PAUSE not set, 1311977d0006SHemant Agrawal * RX Side flow control (handle received Pause frame) 1312977d0006SHemant Agrawal * TX side flow control (send Pause frame) 1313977d0006SHemant Agrawal * if ASYM_PAUSE set, 1314977d0006SHemant Agrawal * RX Side flow control (handle received Pause frame) 1315977d0006SHemant Agrawal * No TX side flow control (send Pause frame disabled) 1316977d0006SHemant Agrawal */ 1317977d0006SHemant Agrawal if (!(state.options & DPNI_LINK_OPT_ASYM_PAUSE)) 1318977d0006SHemant Agrawal fc_conf->mode = RTE_FC_FULL; 1319977d0006SHemant Agrawal else 1320977d0006SHemant Agrawal fc_conf->mode = RTE_FC_RX_PAUSE; 1321977d0006SHemant Agrawal } else { 1322977d0006SHemant Agrawal /* DPNI_LINK_OPT_PAUSE not set 1323977d0006SHemant Agrawal * if ASYM_PAUSE set, 1324977d0006SHemant Agrawal * TX side flow control (send Pause frame) 1325977d0006SHemant Agrawal * No RX side flow control (No action on pause frame rx) 1326977d0006SHemant Agrawal * if ASYM_PAUSE not set, 1327977d0006SHemant Agrawal * Flow control disabled 1328977d0006SHemant Agrawal */ 1329977d0006SHemant Agrawal if (state.options & DPNI_LINK_OPT_ASYM_PAUSE) 1330977d0006SHemant Agrawal fc_conf->mode = RTE_FC_TX_PAUSE; 1331977d0006SHemant Agrawal else 1332977d0006SHemant Agrawal fc_conf->mode = RTE_FC_NONE; 1333977d0006SHemant Agrawal } 1334977d0006SHemant Agrawal 1335977d0006SHemant Agrawal return ret; 1336977d0006SHemant Agrawal } 1337977d0006SHemant Agrawal 1338977d0006SHemant Agrawal static int 1339977d0006SHemant Agrawal dpaa2_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) 1340977d0006SHemant Agrawal { 1341977d0006SHemant Agrawal int ret = -EINVAL; 1342977d0006SHemant Agrawal struct dpaa2_dev_priv *priv; 1343977d0006SHemant Agrawal struct fsl_mc_io *dpni; 1344977d0006SHemant Agrawal struct dpni_link_state state = {0}; 1345977d0006SHemant Agrawal struct dpni_link_cfg cfg = {0}; 1346977d0006SHemant Agrawal 1347977d0006SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1348977d0006SHemant Agrawal 1349977d0006SHemant Agrawal priv = dev->data->dev_private; 1350977d0006SHemant Agrawal dpni = (struct fsl_mc_io *)priv->hw; 1351977d0006SHemant Agrawal 1352977d0006SHemant Agrawal if (dpni == NULL) { 1353645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "dpni is NULL\n"); 1354977d0006SHemant Agrawal return ret; 1355977d0006SHemant Agrawal } 1356977d0006SHemant Agrawal 1357977d0006SHemant Agrawal /* It is necessary to obtain the current state before setting fc_conf 1358977d0006SHemant Agrawal * as MC would return error in case rate, autoneg or duplex values are 1359977d0006SHemant Agrawal * different. 1360977d0006SHemant Agrawal */ 1361977d0006SHemant Agrawal ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state); 1362977d0006SHemant Agrawal if (ret) { 1363645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Unable to get link state (err=%d)\n", ret); 1364977d0006SHemant Agrawal return -1; 1365977d0006SHemant Agrawal } 1366977d0006SHemant Agrawal 1367977d0006SHemant Agrawal /* Disable link before setting configuration */ 1368977d0006SHemant Agrawal dpaa2_dev_set_link_down(dev); 1369977d0006SHemant Agrawal 1370977d0006SHemant Agrawal /* Based on fc_conf, update cfg */ 1371977d0006SHemant Agrawal cfg.rate = state.rate; 1372977d0006SHemant Agrawal cfg.options = state.options; 1373977d0006SHemant Agrawal 1374977d0006SHemant Agrawal /* update cfg with fc_conf */ 1375977d0006SHemant Agrawal switch (fc_conf->mode) { 1376977d0006SHemant Agrawal case RTE_FC_FULL: 1377977d0006SHemant Agrawal /* Full flow control; 1378977d0006SHemant Agrawal * OPT_PAUSE set, ASYM_PAUSE not set 1379977d0006SHemant Agrawal */ 1380977d0006SHemant Agrawal cfg.options |= DPNI_LINK_OPT_PAUSE; 1381977d0006SHemant Agrawal cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE; 1382f090a4c3SHemant Agrawal break; 1383977d0006SHemant Agrawal case RTE_FC_TX_PAUSE: 1384977d0006SHemant Agrawal /* Enable RX flow control 1385977d0006SHemant Agrawal * OPT_PAUSE not set; 1386977d0006SHemant Agrawal * ASYM_PAUSE set; 1387977d0006SHemant Agrawal */ 1388977d0006SHemant Agrawal cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE; 1389977d0006SHemant Agrawal cfg.options &= ~DPNI_LINK_OPT_PAUSE; 1390977d0006SHemant Agrawal break; 1391977d0006SHemant Agrawal case RTE_FC_RX_PAUSE: 1392977d0006SHemant Agrawal /* Enable TX Flow control 1393977d0006SHemant Agrawal * OPT_PAUSE set 1394977d0006SHemant Agrawal * ASYM_PAUSE set 1395977d0006SHemant Agrawal */ 1396977d0006SHemant Agrawal cfg.options |= DPNI_LINK_OPT_PAUSE; 1397977d0006SHemant Agrawal cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE; 1398977d0006SHemant Agrawal break; 1399977d0006SHemant Agrawal case RTE_FC_NONE: 1400977d0006SHemant Agrawal /* Disable Flow control 1401977d0006SHemant Agrawal * OPT_PAUSE not set 1402977d0006SHemant Agrawal * ASYM_PAUSE not set 1403977d0006SHemant Agrawal */ 1404977d0006SHemant Agrawal cfg.options &= ~DPNI_LINK_OPT_PAUSE; 1405977d0006SHemant Agrawal cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE; 1406977d0006SHemant Agrawal break; 1407977d0006SHemant Agrawal default: 1408645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, "Incorrect Flow control flag (%d)\n", 1409977d0006SHemant Agrawal fc_conf->mode); 1410977d0006SHemant Agrawal return -1; 1411977d0006SHemant Agrawal } 1412977d0006SHemant Agrawal 1413977d0006SHemant Agrawal ret = dpni_set_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg); 1414977d0006SHemant Agrawal if (ret) 1415645bd25aSHemant Agrawal RTE_LOG(ERR, PMD, 1416645bd25aSHemant Agrawal "Unable to set Link configuration (err=%d)\n", 1417977d0006SHemant Agrawal ret); 1418977d0006SHemant Agrawal 1419977d0006SHemant Agrawal /* Enable link */ 1420977d0006SHemant Agrawal dpaa2_dev_set_link_up(dev); 1421977d0006SHemant Agrawal 1422977d0006SHemant Agrawal return ret; 1423977d0006SHemant Agrawal } 1424977d0006SHemant Agrawal 14253e5a335dSHemant Agrawal static struct eth_dev_ops dpaa2_ethdev_ops = { 14263e5a335dSHemant Agrawal .dev_configure = dpaa2_eth_dev_configure, 14273e5a335dSHemant Agrawal .dev_start = dpaa2_dev_start, 14283e5a335dSHemant Agrawal .dev_stop = dpaa2_dev_stop, 14293e5a335dSHemant Agrawal .dev_close = dpaa2_dev_close, 1430c0e5c69aSHemant Agrawal .promiscuous_enable = dpaa2_dev_promiscuous_enable, 1431c0e5c69aSHemant Agrawal .promiscuous_disable = dpaa2_dev_promiscuous_disable, 14325d5aeeedSHemant Agrawal .allmulticast_enable = dpaa2_dev_allmulticast_enable, 14335d5aeeedSHemant Agrawal .allmulticast_disable = dpaa2_dev_allmulticast_disable, 1434a1f3a12cSHemant Agrawal .dev_set_link_up = dpaa2_dev_set_link_up, 1435a1f3a12cSHemant Agrawal .dev_set_link_down = dpaa2_dev_set_link_down, 1436c56c86ffSHemant Agrawal .link_update = dpaa2_dev_link_update, 1437b0aa5459SHemant Agrawal .stats_get = dpaa2_dev_stats_get, 1438b0aa5459SHemant Agrawal .stats_reset = dpaa2_dev_stats_reset, 1439748eccb9SHemant Agrawal .fw_version_get = dpaa2_fw_version_get, 14403e5a335dSHemant Agrawal .dev_infos_get = dpaa2_dev_info_get, 1441a5fc38d4SHemant Agrawal .dev_supported_ptypes_get = dpaa2_supported_ptypes_get, 1442e31d4d21SHemant Agrawal .mtu_set = dpaa2_dev_mtu_set, 14433ce294f2SHemant Agrawal .vlan_filter_set = dpaa2_vlan_filter_set, 14443ce294f2SHemant Agrawal .vlan_offload_set = dpaa2_vlan_offload_set, 14453e5a335dSHemant Agrawal .rx_queue_setup = dpaa2_dev_rx_queue_setup, 14463e5a335dSHemant Agrawal .rx_queue_release = dpaa2_dev_rx_queue_release, 14473e5a335dSHemant Agrawal .tx_queue_setup = dpaa2_dev_tx_queue_setup, 14483e5a335dSHemant Agrawal .tx_queue_release = dpaa2_dev_tx_queue_release, 1449977d0006SHemant Agrawal .flow_ctrl_get = dpaa2_flow_ctrl_get, 1450977d0006SHemant Agrawal .flow_ctrl_set = dpaa2_flow_ctrl_set, 1451b4d97b7dSHemant Agrawal .mac_addr_add = dpaa2_dev_add_mac_addr, 1452b4d97b7dSHemant Agrawal .mac_addr_remove = dpaa2_dev_remove_mac_addr, 1453b4d97b7dSHemant Agrawal .mac_addr_set = dpaa2_dev_set_mac_addr, 14543e5a335dSHemant Agrawal }; 14553e5a335dSHemant Agrawal 1456c147eae0SHemant Agrawal static int 1457c147eae0SHemant Agrawal dpaa2_dev_init(struct rte_eth_dev *eth_dev) 1458c147eae0SHemant Agrawal { 14593e5a335dSHemant Agrawal struct rte_device *dev = eth_dev->device; 14603e5a335dSHemant Agrawal struct rte_dpaa2_device *dpaa2_dev; 14613e5a335dSHemant Agrawal struct fsl_mc_io *dpni_dev; 14623e5a335dSHemant Agrawal struct dpni_attr attr; 14633e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = eth_dev->data->dev_private; 1464bee61d86SHemant Agrawal struct dpni_buffer_layout layout; 1465599017a2SHemant Agrawal int ret, hw_id; 14663e5a335dSHemant Agrawal 1467d401ead1SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1468d401ead1SHemant Agrawal 1469c147eae0SHemant Agrawal /* For secondary processes, the primary has done all the work */ 1470c147eae0SHemant Agrawal if (rte_eal_process_type() != RTE_PROC_PRIMARY) 1471c147eae0SHemant Agrawal return 0; 1472c147eae0SHemant Agrawal 14733e5a335dSHemant Agrawal dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device); 14743e5a335dSHemant Agrawal 14753e5a335dSHemant Agrawal hw_id = dpaa2_dev->object_id; 14763e5a335dSHemant Agrawal 1477d4984046SHemant Agrawal dpni_dev = rte_malloc(NULL, sizeof(struct fsl_mc_io), 0); 14783e5a335dSHemant Agrawal if (!dpni_dev) { 14793e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "malloc failed for dpni device\n"); 14803e5a335dSHemant Agrawal return -1; 14813e5a335dSHemant Agrawal } 14823e5a335dSHemant Agrawal 14833e5a335dSHemant Agrawal dpni_dev->regs = rte_mcp_ptr_list[0]; 14843e5a335dSHemant Agrawal ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token); 14853e5a335dSHemant Agrawal if (ret) { 1486d4984046SHemant Agrawal PMD_INIT_LOG(ERR, 1487d4984046SHemant Agrawal "Failure in opening dpni@%d with err code %d\n", 1488d4984046SHemant Agrawal hw_id, ret); 1489d4984046SHemant Agrawal rte_free(dpni_dev); 14903e5a335dSHemant Agrawal return -1; 14913e5a335dSHemant Agrawal } 14923e5a335dSHemant Agrawal 14933e5a335dSHemant Agrawal /* Clean the device first */ 14943e5a335dSHemant Agrawal ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token); 14953e5a335dSHemant Agrawal if (ret) { 1496d4984046SHemant Agrawal PMD_INIT_LOG(ERR, 1497d4984046SHemant Agrawal "Failure cleaning dpni@%d with err code %d\n", 1498d4984046SHemant Agrawal hw_id, ret); 1499d4984046SHemant Agrawal goto init_err; 15003e5a335dSHemant Agrawal } 15013e5a335dSHemant Agrawal 15023e5a335dSHemant Agrawal ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr); 15033e5a335dSHemant Agrawal if (ret) { 1504d4984046SHemant Agrawal PMD_INIT_LOG(ERR, 1505d4984046SHemant Agrawal "Failure in get dpni@%d attribute, err code %d\n", 1506d4984046SHemant Agrawal hw_id, ret); 1507d4984046SHemant Agrawal goto init_err; 15083e5a335dSHemant Agrawal } 15093e5a335dSHemant Agrawal 151016bbc98aSShreyansh Jain priv->num_rx_tc = attr.num_rx_tcs; 151189c2ea8fSHemant Agrawal 151216bbc98aSShreyansh Jain /* Resetting the "num_rx_queues" to equal number of queues in first TC 1513599017a2SHemant Agrawal * as only one TC is supported on Rx Side. Once Multiple TCs will be 1514599017a2SHemant Agrawal * in use for Rx processing then this will be changed or removed. 151589c2ea8fSHemant Agrawal */ 1516599017a2SHemant Agrawal priv->nb_rx_queues = attr.num_queues; 151789c2ea8fSHemant Agrawal 151816bbc98aSShreyansh Jain /* Using number of TX queues as number of TX TCs */ 151916bbc98aSShreyansh Jain priv->nb_tx_queues = attr.num_tx_tcs; 1520ef18dafeSHemant Agrawal 152116bbc98aSShreyansh Jain PMD_DRV_LOG(DEBUG, "RX-TC= %d, nb_rx_queues= %d, nb_tx_queues=%d", 152216bbc98aSShreyansh Jain priv->num_tc, priv->nb_rx_queues, priv->nb_tx_queues); 15233e5a335dSHemant Agrawal 15243e5a335dSHemant Agrawal priv->hw = dpni_dev; 15253e5a335dSHemant Agrawal priv->hw_id = hw_id; 152633fad432SHemant Agrawal priv->options = attr.options; 152733fad432SHemant Agrawal priv->max_mac_filters = attr.mac_filter_entries; 152833fad432SHemant Agrawal priv->max_vlan_filters = attr.vlan_filter_entries; 15293e5a335dSHemant Agrawal priv->flags = 0; 15303e5a335dSHemant Agrawal 15313e5a335dSHemant Agrawal /* Allocate memory for hardware structure for queues */ 15323e5a335dSHemant Agrawal ret = dpaa2_alloc_rx_tx_queues(eth_dev); 15333e5a335dSHemant Agrawal if (ret) { 15343e5a335dSHemant Agrawal PMD_INIT_LOG(ERR, "dpaa2_alloc_rx_tx_queuesFailed\n"); 1535d4984046SHemant Agrawal goto init_err; 15363e5a335dSHemant Agrawal } 15373e5a335dSHemant Agrawal 153833fad432SHemant Agrawal /* Allocate memory for storing MAC addresses */ 153933fad432SHemant Agrawal eth_dev->data->mac_addrs = rte_zmalloc("dpni", 154033fad432SHemant Agrawal ETHER_ADDR_LEN * attr.mac_filter_entries, 0); 154133fad432SHemant Agrawal if (eth_dev->data->mac_addrs == NULL) { 1542d4984046SHemant Agrawal PMD_INIT_LOG(ERR, 1543d4984046SHemant Agrawal "Failed to allocate %d bytes needed to store MAC addresses", 154433fad432SHemant Agrawal ETHER_ADDR_LEN * attr.mac_filter_entries); 1545d4984046SHemant Agrawal ret = -ENOMEM; 1546d4984046SHemant Agrawal goto init_err; 154733fad432SHemant Agrawal } 154833fad432SHemant Agrawal 154933fad432SHemant Agrawal ret = dpni_get_primary_mac_addr(dpni_dev, CMD_PRI_LOW, 155033fad432SHemant Agrawal priv->token, 155133fad432SHemant Agrawal (uint8_t *)(eth_dev->data->mac_addrs[0].addr_bytes)); 155233fad432SHemant Agrawal if (ret) { 1553d4984046SHemant Agrawal PMD_INIT_LOG(ERR, "DPNI get mac address failed:Err Code = %d\n", 1554d4984046SHemant Agrawal ret); 1555d4984046SHemant Agrawal goto init_err; 155633fad432SHemant Agrawal } 155733fad432SHemant Agrawal 1558bee61d86SHemant Agrawal /* ... tx buffer layout ... */ 1559bee61d86SHemant Agrawal memset(&layout, 0, sizeof(struct dpni_buffer_layout)); 1560bee61d86SHemant Agrawal layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS; 1561bee61d86SHemant Agrawal layout.pass_frame_status = 1; 1562bee61d86SHemant Agrawal ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token, 1563bee61d86SHemant Agrawal DPNI_QUEUE_TX, &layout); 1564bee61d86SHemant Agrawal if (ret) { 1565d4984046SHemant Agrawal PMD_INIT_LOG(ERR, "Error (%d) in setting tx buffer layout", 1566d4984046SHemant Agrawal ret); 1567d4984046SHemant Agrawal goto init_err; 1568bee61d86SHemant Agrawal } 1569bee61d86SHemant Agrawal 1570bee61d86SHemant Agrawal /* ... tx-conf and error buffer layout ... */ 1571bee61d86SHemant Agrawal memset(&layout, 0, sizeof(struct dpni_buffer_layout)); 1572bee61d86SHemant Agrawal layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS; 1573bee61d86SHemant Agrawal layout.pass_frame_status = 1; 1574bee61d86SHemant Agrawal ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token, 1575bee61d86SHemant Agrawal DPNI_QUEUE_TX_CONFIRM, &layout); 1576bee61d86SHemant Agrawal if (ret) { 1577d4984046SHemant Agrawal PMD_INIT_LOG(ERR, "Error (%d) in setting tx-conf buffer layout", 1578d4984046SHemant Agrawal ret); 1579d4984046SHemant Agrawal goto init_err; 1580bee61d86SHemant Agrawal } 1581bee61d86SHemant Agrawal 15823e5a335dSHemant Agrawal eth_dev->dev_ops = &dpaa2_ethdev_ops; 1583*c5acbb5eSHemant Agrawal eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; 1584c147eae0SHemant Agrawal 15855c6942fdSHemant Agrawal eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx; 1586cd9935ceSHemant Agrawal eth_dev->tx_pkt_burst = dpaa2_dev_tx; 15871261cd68SHemant Agrawal rte_fslmc_vfio_dmamap(); 15881261cd68SHemant Agrawal 1589c147eae0SHemant Agrawal return 0; 1590d4984046SHemant Agrawal init_err: 1591d4984046SHemant Agrawal dpaa2_dev_uninit(eth_dev); 1592d4984046SHemant Agrawal return ret; 1593c147eae0SHemant Agrawal } 1594c147eae0SHemant Agrawal 1595c147eae0SHemant Agrawal static int 15963e5a335dSHemant Agrawal dpaa2_dev_uninit(struct rte_eth_dev *eth_dev) 1597c147eae0SHemant Agrawal { 15983e5a335dSHemant Agrawal struct dpaa2_dev_priv *priv = eth_dev->data->dev_private; 15993e5a335dSHemant Agrawal struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; 16003e5a335dSHemant Agrawal int i, ret; 16013e5a335dSHemant Agrawal struct dpaa2_queue *dpaa2_q; 16023e5a335dSHemant Agrawal 1603d401ead1SHemant Agrawal PMD_INIT_FUNC_TRACE(); 1604d401ead1SHemant Agrawal 1605c147eae0SHemant Agrawal if (rte_eal_process_type() != RTE_PROC_PRIMARY) 1606e729ec76SHemant Agrawal return 0; 1607c147eae0SHemant Agrawal 16083e5a335dSHemant Agrawal if (!dpni) { 16093e5a335dSHemant Agrawal PMD_INIT_LOG(WARNING, "Already closed or not started"); 16103e5a335dSHemant Agrawal return -1; 16113e5a335dSHemant Agrawal } 16123e5a335dSHemant Agrawal 16133e5a335dSHemant Agrawal dpaa2_dev_close(eth_dev); 16143e5a335dSHemant Agrawal 16153e5a335dSHemant Agrawal if (priv->rx_vq[0]) { 16163e5a335dSHemant Agrawal /* cleaning up queue storage */ 16173e5a335dSHemant Agrawal for (i = 0; i < priv->nb_rx_queues; i++) { 16183e5a335dSHemant Agrawal dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i]; 16193e5a335dSHemant Agrawal if (dpaa2_q->q_storage) 16203e5a335dSHemant Agrawal rte_free(dpaa2_q->q_storage); 16213e5a335dSHemant Agrawal } 16223e5a335dSHemant Agrawal /*free the all queue memory */ 16233e5a335dSHemant Agrawal rte_free(priv->rx_vq[0]); 16243e5a335dSHemant Agrawal priv->rx_vq[0] = NULL; 16253e5a335dSHemant Agrawal } 16263e5a335dSHemant Agrawal 1627d4984046SHemant Agrawal /* free memory for storing MAC addresses */ 162833fad432SHemant Agrawal if (eth_dev->data->mac_addrs) { 162933fad432SHemant Agrawal rte_free(eth_dev->data->mac_addrs); 163033fad432SHemant Agrawal eth_dev->data->mac_addrs = NULL; 163133fad432SHemant Agrawal } 16323e5a335dSHemant Agrawal 16333e5a335dSHemant Agrawal /* Close the device at underlying layer*/ 16343e5a335dSHemant Agrawal ret = dpni_close(dpni, CMD_PRI_LOW, priv->token); 16353e5a335dSHemant Agrawal if (ret) { 1636d4984046SHemant Agrawal PMD_INIT_LOG(ERR, 1637d4984046SHemant Agrawal "Failure closing dpni device with err code %d\n", 1638d4984046SHemant Agrawal ret); 16393e5a335dSHemant Agrawal } 16403e5a335dSHemant Agrawal 16413e5a335dSHemant Agrawal /* Free the allocated memory for ethernet private data and dpni*/ 16423e5a335dSHemant Agrawal priv->hw = NULL; 1643d4984046SHemant Agrawal rte_free(dpni); 16443e5a335dSHemant Agrawal 16453e5a335dSHemant Agrawal eth_dev->dev_ops = NULL; 1646cd9935ceSHemant Agrawal eth_dev->rx_pkt_burst = NULL; 1647cd9935ceSHemant Agrawal eth_dev->tx_pkt_burst = NULL; 16483e5a335dSHemant Agrawal 1649c147eae0SHemant Agrawal return 0; 1650c147eae0SHemant Agrawal } 1651c147eae0SHemant Agrawal 1652c147eae0SHemant Agrawal static int 165355fd2703SHemant Agrawal rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv, 1654c147eae0SHemant Agrawal struct rte_dpaa2_device *dpaa2_dev) 1655c147eae0SHemant Agrawal { 1656c147eae0SHemant Agrawal struct rte_eth_dev *eth_dev; 1657c147eae0SHemant Agrawal int diag; 1658c147eae0SHemant Agrawal 1659c147eae0SHemant Agrawal if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 1660e729ec76SHemant Agrawal eth_dev = rte_eth_dev_allocate(dpaa2_dev->device.name); 1661e729ec76SHemant Agrawal if (!eth_dev) 1662e729ec76SHemant Agrawal return -ENODEV; 1663c147eae0SHemant Agrawal eth_dev->data->dev_private = rte_zmalloc( 1664c147eae0SHemant Agrawal "ethdev private structure", 1665c147eae0SHemant Agrawal sizeof(struct dpaa2_dev_priv), 1666c147eae0SHemant Agrawal RTE_CACHE_LINE_SIZE); 1667c147eae0SHemant Agrawal if (eth_dev->data->dev_private == NULL) { 1668d401ead1SHemant Agrawal PMD_INIT_LOG(CRIT, "Cannot allocate memzone for" 1669c147eae0SHemant Agrawal " private port data\n"); 1670c147eae0SHemant Agrawal rte_eth_dev_release_port(eth_dev); 1671c147eae0SHemant Agrawal return -ENOMEM; 1672c147eae0SHemant Agrawal } 1673e729ec76SHemant Agrawal } else { 1674e729ec76SHemant Agrawal eth_dev = rte_eth_dev_attach_secondary(dpaa2_dev->device.name); 1675e729ec76SHemant Agrawal if (!eth_dev) 1676e729ec76SHemant Agrawal return -ENODEV; 1677c147eae0SHemant Agrawal } 1678e729ec76SHemant Agrawal 1679c147eae0SHemant Agrawal eth_dev->device = &dpaa2_dev->device; 168055fd2703SHemant Agrawal eth_dev->device->driver = &dpaa2_drv->driver; 168155fd2703SHemant Agrawal 1682c147eae0SHemant Agrawal dpaa2_dev->eth_dev = eth_dev; 1683c147eae0SHemant Agrawal eth_dev->data->rx_mbuf_alloc_failed = 0; 1684c147eae0SHemant Agrawal 1685c147eae0SHemant Agrawal /* Invoke PMD device initialization function */ 1686c147eae0SHemant Agrawal diag = dpaa2_dev_init(eth_dev); 1687c147eae0SHemant Agrawal if (diag == 0) 1688c147eae0SHemant Agrawal return 0; 1689c147eae0SHemant Agrawal 1690c147eae0SHemant Agrawal if (rte_eal_process_type() == RTE_PROC_PRIMARY) 1691c147eae0SHemant Agrawal rte_free(eth_dev->data->dev_private); 1692c147eae0SHemant Agrawal rte_eth_dev_release_port(eth_dev); 1693c147eae0SHemant Agrawal return diag; 1694c147eae0SHemant Agrawal } 1695c147eae0SHemant Agrawal 1696c147eae0SHemant Agrawal static int 1697c147eae0SHemant Agrawal rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev) 1698c147eae0SHemant Agrawal { 1699c147eae0SHemant Agrawal struct rte_eth_dev *eth_dev; 1700c147eae0SHemant Agrawal 1701c147eae0SHemant Agrawal eth_dev = dpaa2_dev->eth_dev; 1702c147eae0SHemant Agrawal dpaa2_dev_uninit(eth_dev); 1703c147eae0SHemant Agrawal 1704c147eae0SHemant Agrawal if (rte_eal_process_type() == RTE_PROC_PRIMARY) 1705c147eae0SHemant Agrawal rte_free(eth_dev->data->dev_private); 1706c147eae0SHemant Agrawal rte_eth_dev_release_port(eth_dev); 1707c147eae0SHemant Agrawal 1708c147eae0SHemant Agrawal return 0; 1709c147eae0SHemant Agrawal } 1710c147eae0SHemant Agrawal 1711c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd = { 1712bad555dfSShreyansh Jain .drv_type = DPAA2_ETH, 1713c147eae0SHemant Agrawal .probe = rte_dpaa2_probe, 1714c147eae0SHemant Agrawal .remove = rte_dpaa2_remove, 1715c147eae0SHemant Agrawal }; 1716c147eae0SHemant Agrawal 1717c147eae0SHemant Agrawal RTE_PMD_REGISTER_DPAA2(net_dpaa2, rte_dpaa2_pmd); 1718