1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(C) 2021 Marvell. 3 */ 4 #include <stdint.h> 5 6 #include <rte_cycles.h> 7 #include <rte_log.h> 8 #include <rte_malloc.h> 9 #include <rte_rawdev.h> 10 11 #include "cnxk_bphy_cgx.h" 12 #include "rte_pmd_bphy.h" 13 14 static int 15 cnxk_bphy_cgx_link_cond(uint16_t dev_id, unsigned int queue, int cond) 16 { 17 struct cnxk_bphy_cgx_msg_link_info link_info; 18 int tries = 10, ret; 19 20 do { 21 ret = rte_pmd_bphy_cgx_get_link_info(dev_id, queue, &link_info); 22 if (ret) 23 return ret; 24 25 if (link_info.link_up == cond) 26 break; 27 28 rte_delay_ms(500); 29 } while (--tries); 30 31 if (tries) 32 return !!cond; 33 34 return -ETIMEDOUT; 35 } 36 37 int 38 cnxk_bphy_cgx_dev_selftest(uint16_t dev_id) 39 { 40 unsigned int queues, i; 41 int ret; 42 43 queues = rte_rawdev_queue_count(dev_id); 44 if (queues == 0) 45 return -ENODEV; 46 47 ret = rte_rawdev_start(dev_id); 48 if (ret) 49 return ret; 50 51 for (i = 0; i < queues; i++) { 52 enum cnxk_bphy_cgx_eth_link_fec fec; 53 unsigned int descs; 54 55 ret = rte_rawdev_queue_conf_get(dev_id, i, &descs, 56 sizeof(descs)); 57 if (ret) 58 break; 59 if (descs != 1) { 60 RTE_LOG(ERR, PMD, "Wrong number of descs reported\n"); 61 ret = -ENODEV; 62 break; 63 } 64 65 RTE_LOG(INFO, PMD, "Testing queue %d\n", i); 66 67 ret = rte_pmd_bphy_cgx_stop_rxtx(dev_id, i); 68 if (ret) { 69 RTE_LOG(ERR, PMD, "Failed to stop rx/tx\n"); 70 break; 71 } 72 73 ret = rte_pmd_bphy_cgx_start_rxtx(dev_id, i); 74 if (ret) { 75 RTE_LOG(ERR, PMD, "Failed to start rx/tx\n"); 76 break; 77 } 78 79 ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, false); 80 if (ret) { 81 RTE_LOG(ERR, PMD, "Failed to set link down\n"); 82 break; 83 } 84 85 ret = cnxk_bphy_cgx_link_cond(dev_id, i, 0); 86 if (ret != 0) 87 RTE_LOG(ERR, PMD, 88 "Timed out waiting for a link down\n"); 89 90 ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, true); 91 if (ret) { 92 RTE_LOG(ERR, PMD, "Failed to set link up\n"); 93 break; 94 } 95 96 ret = cnxk_bphy_cgx_link_cond(dev_id, i, 1); 97 if (ret != 1) 98 RTE_LOG(ERR, PMD, "Timed out waiting for a link up\n"); 99 100 ret = rte_pmd_bphy_cgx_intlbk_enable(dev_id, i); 101 if (ret) { 102 RTE_LOG(ERR, PMD, "Failed to enable internal lbk\n"); 103 break; 104 } 105 106 ret = rte_pmd_bphy_cgx_intlbk_disable(dev_id, i); 107 if (ret) { 108 RTE_LOG(ERR, PMD, "Failed to disable internal lbk\n"); 109 break; 110 } 111 112 ret = rte_pmd_bphy_cgx_ptp_rx_enable(dev_id, i); 113 /* ptp not available on RPM */ 114 if (ret < 0 && ret != -ENOTSUP) { 115 RTE_LOG(ERR, PMD, "Failed to enable ptp\n"); 116 break; 117 } 118 ret = 0; 119 120 ret = rte_pmd_bphy_cgx_ptp_rx_disable(dev_id, i); 121 /* ptp not available on RPM */ 122 if (ret < 0 && ret != -ENOTSUP) { 123 RTE_LOG(ERR, PMD, "Failed to disable ptp\n"); 124 break; 125 } 126 ret = 0; 127 128 ret = rte_pmd_bphy_cgx_get_supported_fec(dev_id, i, &fec); 129 if (ret) { 130 RTE_LOG(ERR, PMD, "Failed to get supported FEC\n"); 131 break; 132 } 133 134 ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec); 135 if (ret) { 136 RTE_LOG(ERR, PMD, "Failed to set FEC to %d\n", fec); 137 break; 138 } 139 140 fec = CNXK_BPHY_CGX_ETH_LINK_FEC_NONE; 141 ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec); 142 if (ret) { 143 RTE_LOG(ERR, PMD, "Failed to disable FEC\n"); 144 break; 145 } 146 } 147 148 rte_rawdev_stop(dev_id); 149 150 return ret; 151 } 152