xref: /dpdk/drivers/raw/cnxk_bphy/cnxk_bphy_cgx_test.c (revision dc348f2e81a94dd3b8a32c2f882483227796905d)
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