1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
6 #include <rte_cycles.h>
8 #include <rte_malloc.h>
9 #include <rte_rawdev.h>
11 #include "cnxk_bphy_cgx.h"
12 #include "rte_pmd_bphy.h"
15 cnxk_bphy_cgx_enq_msg(uint16_t dev_id, unsigned int queue, void *msg)
17 struct rte_rawdev_buf *bufs[1];
18 struct rte_rawdev_buf buf;
22 q = (void *)(size_t)queue;
26 ret = rte_rawdev_enqueue_buffers(dev_id, bufs, 1, q);
36 cnxk_bphy_cgx_deq_msg(uint16_t dev_id, unsigned int queue, void **msg)
38 struct rte_rawdev_buf *bufs[1];
39 struct rte_rawdev_buf buf;
43 q = (void *)(size_t)queue;
46 ret = rte_rawdev_dequeue_buffers(dev_id, bufs, 1, q);
58 cnxk_bphy_cgx_link_cond(uint16_t dev_id, unsigned int queue, int cond)
63 struct cnxk_bphy_cgx_msg_link_info *link_info = NULL;
64 struct cnxk_bphy_cgx_msg msg;
66 msg.type = CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO;
67 ret = cnxk_bphy_cgx_enq_msg(dev_id, queue, &msg);
71 ret = cnxk_bphy_cgx_deq_msg(dev_id, queue, (void **)&link_info);
75 if (link_info->link_up == cond) {
91 cnxk_bphy_cgx_get_supported_fec(uint16_t dev_id, unsigned int queue,
92 enum cnxk_bphy_cgx_eth_link_fec *fec)
94 struct cnxk_bphy_cgx_msg msg = {
95 .type = CNXK_BPHY_CGX_MSG_TYPE_GET_SUPPORTED_FEC,
99 ret = cnxk_bphy_cgx_enq_msg(dev_id, queue, &msg);
103 return cnxk_bphy_cgx_deq_msg(dev_id, queue, (void **)&fec);
107 cnxk_bphy_cgx_dev_selftest(uint16_t dev_id)
109 unsigned int queues, i;
112 queues = rte_rawdev_queue_count(dev_id);
116 ret = rte_rawdev_start(dev_id);
120 for (i = 0; i < queues; i++) {
121 struct cnxk_bphy_cgx_msg_set_link_state link_state;
122 enum cnxk_bphy_cgx_eth_link_fec fec;
123 struct cnxk_bphy_cgx_msg msg;
126 ret = rte_rawdev_queue_conf_get(dev_id, i, &descs,
131 RTE_LOG(ERR, PMD, "Wrong number of descs reported\n");
136 RTE_LOG(INFO, PMD, "Testing queue %d\n", i);
139 msg.type = CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX;
140 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
142 RTE_LOG(ERR, PMD, "Failed to stop rx/tx\n");
147 msg.type = CNXK_BPHY_CGX_MSG_TYPE_START_RXTX;
148 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
150 RTE_LOG(ERR, PMD, "Failed to start rx/tx\n");
155 link_state.state = false;
156 msg.type = CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE;
157 msg.data = &link_state;
158 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
160 RTE_LOG(ERR, PMD, "Failed to set link down\n");
164 ret = cnxk_bphy_cgx_link_cond(dev_id, i, 0);
167 "Timed out waiting for a link down\n");
170 link_state.state = true;
171 msg.type = CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE;
172 msg.data = &link_state;
173 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
175 RTE_LOG(ERR, PMD, "Failed to set link up\n");
179 ret = cnxk_bphy_cgx_link_cond(dev_id, i, 1);
181 RTE_LOG(ERR, PMD, "Timed out waiting for a link up\n");
183 /* enable internal loopback */
184 msg.type = CNXK_BPHY_CGX_MSG_TYPE_INTLBK_ENABLE;
185 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
187 RTE_LOG(ERR, PMD, "Failed to enable internal lbk\n");
191 /* disable internal loopback */
192 msg.type = CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE;
193 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
195 RTE_LOG(ERR, PMD, "Failed to disable internal lbk\n");
200 msg.type = CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_ENABLE;
201 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
202 /* ptp not available on RPM */
203 if (ret < 0 && ret != -ENOTSUP) {
204 RTE_LOG(ERR, PMD, "Failed to enable ptp\n");
210 msg.type = CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_DISABLE;
211 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
212 /* ptp not available on RPM */
213 if (ret < 0 && ret != -ENOTSUP) {
214 RTE_LOG(ERR, PMD, "Failed to disable ptp\n");
219 ret = cnxk_bphy_cgx_get_supported_fec(dev_id, i, &fec);
221 RTE_LOG(ERR, PMD, "Failed to get supported FEC\n");
225 /* set supported fec */
226 msg.type = CNXK_BPHY_CGX_MSG_TYPE_SET_FEC;
228 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
230 RTE_LOG(ERR, PMD, "Failed to set FEC to %d\n", fec);
235 fec = CNXK_BPHY_CGX_ETH_LINK_FEC_NONE;
236 msg.type = CNXK_BPHY_CGX_MSG_TYPE_SET_FEC;
238 ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
240 RTE_LOG(ERR, PMD, "Failed to disable FEC\n");
245 rte_rawdev_stop(dev_id);