raw/cnxk_bphy: support CGX self test
Add support for performing selftest operation. Signed-off-by: Tomasz Duszynski <tduszynski@marvell.com> Signed-off-by: Jakub Palider <jpalider@marvell.com> Reviewed-by: Jerin Jacob <jerinj@marvell.com>
This commit is contained in:
parent
ee9978857f
commit
4d2b226726
@ -38,7 +38,8 @@ To perform data transfer use standard ``rte_rawdev_enqueue_buffers()`` and
|
|||||||
responses hence dequeueing is not always necessary.
|
responses hence dequeueing is not always necessary.
|
||||||
|
|
||||||
BPHY CGX/RPM PMD accepts ``struct cnxk_bphy_cgx_msg`` messages which differ by type and payload.
|
BPHY CGX/RPM PMD accepts ``struct cnxk_bphy_cgx_msg`` messages which differ by type and payload.
|
||||||
Message types along with description are listed below.
|
Message types along with description are listed below. As for the usage examples please refer to
|
||||||
|
``cnxk_bphy_cgx_dev_selftest()``.
|
||||||
|
|
||||||
Get link information
|
Get link information
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -93,3 +94,19 @@ Message is used to start or stop accepting traffic.
|
|||||||
Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_START_RXTX`` or
|
Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_START_RXTX`` or
|
||||||
``CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX``. Former will enable traffic while the latter will
|
``CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX``. Former will enable traffic while the latter will
|
||||||
do the opposite.
|
do the opposite.
|
||||||
|
|
||||||
|
Self test
|
||||||
|
---------
|
||||||
|
|
||||||
|
On EAL initialization, BPHY CGX/RPM devices will be probed and populated into
|
||||||
|
the raw devices. The rawdev ID of the device can be obtained using invocation
|
||||||
|
of ``rte_rawdev_get_dev_id("NAME:x")`` from the test application, where:
|
||||||
|
|
||||||
|
- NAME is the desired subsystem: use "BPHY_CGX" for
|
||||||
|
RFOE module,
|
||||||
|
- x is the device's bus id specified in "bus:device.func" (BDF) format.
|
||||||
|
|
||||||
|
Use this identifier for further rawdev function calls.
|
||||||
|
|
||||||
|
The driver's selftest rawdev API can be used to verify the BPHY CGX/RPM
|
||||||
|
functionality.
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include <roc_api.h>
|
#include <roc_api.h>
|
||||||
|
|
||||||
|
#include "cnxk_bphy_cgx.h"
|
||||||
#include "rte_pmd_bphy.h"
|
#include "rte_pmd_bphy.h"
|
||||||
|
|
||||||
struct cnxk_bphy_cgx_queue {
|
struct cnxk_bphy_cgx_queue {
|
||||||
@ -196,6 +197,7 @@ static const struct rte_rawdev_ops cnxk_bphy_cgx_rawdev_ops = {
|
|||||||
.enqueue_bufs = cnxk_bphy_cgx_enqueue_bufs,
|
.enqueue_bufs = cnxk_bphy_cgx_enqueue_bufs,
|
||||||
.dequeue_bufs = cnxk_bphy_cgx_dequeue_bufs,
|
.dequeue_bufs = cnxk_bphy_cgx_dequeue_bufs,
|
||||||
.queue_count = cnxk_bphy_cgx_queue_count,
|
.queue_count = cnxk_bphy_cgx_queue_count,
|
||||||
|
.dev_selftest = cnxk_bphy_cgx_dev_selftest,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
10
drivers/raw/cnxk_bphy/cnxk_bphy_cgx.h
Normal file
10
drivers/raw/cnxk_bphy/cnxk_bphy_cgx.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
* Copyright(C) 2021 Marvell.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CNXK_BPHY_CGX_H_
|
||||||
|
#define _CNXK_BPHY_CGX_H_
|
||||||
|
|
||||||
|
int cnxk_bphy_cgx_dev_selftest(uint16_t dev_id);
|
||||||
|
|
||||||
|
#endif /* _CNXK_BPHY_CGX_H_ */
|
206
drivers/raw/cnxk_bphy/cnxk_bphy_cgx_test.c
Normal file
206
drivers/raw/cnxk_bphy/cnxk_bphy_cgx_test.c
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
/* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
* Copyright(C) 2021 Marvell.
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <rte_cycles.h>
|
||||||
|
#include <rte_log.h>
|
||||||
|
#include <rte_malloc.h>
|
||||||
|
#include <rte_rawdev.h>
|
||||||
|
|
||||||
|
#include "cnxk_bphy_cgx.h"
|
||||||
|
#include "rte_pmd_bphy.h"
|
||||||
|
|
||||||
|
static int
|
||||||
|
cnxk_bphy_cgx_enq_msg(uint16_t dev_id, unsigned int queue, void *msg)
|
||||||
|
{
|
||||||
|
struct rte_rawdev_buf *bufs[1];
|
||||||
|
struct rte_rawdev_buf buf;
|
||||||
|
void *q;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
q = (void *)(size_t)queue;
|
||||||
|
buf.buf_addr = msg;
|
||||||
|
bufs[0] = &buf;
|
||||||
|
|
||||||
|
ret = rte_rawdev_enqueue_buffers(dev_id, bufs, 1, q);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret != 1)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cnxk_bphy_cgx_deq_msg(uint16_t dev_id, unsigned int queue, void **msg)
|
||||||
|
{
|
||||||
|
struct rte_rawdev_buf *bufs[1];
|
||||||
|
struct rte_rawdev_buf buf;
|
||||||
|
void *q;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
q = (void *)(size_t)queue;
|
||||||
|
bufs[0] = &buf;
|
||||||
|
|
||||||
|
ret = rte_rawdev_dequeue_buffers(dev_id, bufs, 1, q);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret != 1)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
*msg = buf.buf_addr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cnxk_bphy_cgx_link_cond(uint16_t dev_id, unsigned int queue, int cond)
|
||||||
|
{
|
||||||
|
int tries = 10, ret;
|
||||||
|
|
||||||
|
do {
|
||||||
|
struct cnxk_bphy_cgx_msg_link_info *link_info = NULL;
|
||||||
|
struct cnxk_bphy_cgx_msg msg;
|
||||||
|
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, queue, &msg);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = cnxk_bphy_cgx_deq_msg(dev_id, queue, (void **)&link_info);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (link_info->link_up == cond) {
|
||||||
|
rte_free(link_info);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rte_free(link_info);
|
||||||
|
rte_delay_ms(500);
|
||||||
|
} while (--tries);
|
||||||
|
|
||||||
|
if (tries)
|
||||||
|
return !!cond;
|
||||||
|
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cnxk_bphy_cgx_dev_selftest(uint16_t dev_id)
|
||||||
|
{
|
||||||
|
unsigned int queues, i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
queues = rte_rawdev_queue_count(dev_id);
|
||||||
|
if (queues == 0)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
ret = rte_rawdev_start(dev_id);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for (i = 0; i < queues; i++) {
|
||||||
|
struct cnxk_bphy_cgx_msg_set_link_state link_state;
|
||||||
|
struct cnxk_bphy_cgx_msg msg;
|
||||||
|
unsigned int descs;
|
||||||
|
|
||||||
|
ret = rte_rawdev_queue_conf_get(dev_id, i, &descs,
|
||||||
|
sizeof(descs));
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
if (descs != 1) {
|
||||||
|
RTE_LOG(ERR, PMD, "Wrong number of descs reported\n");
|
||||||
|
ret = -ENODEV;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTE_LOG(INFO, PMD, "Testing queue %d\n", i);
|
||||||
|
|
||||||
|
/* stop rx/tx */
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
if (ret) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to stop rx/tx\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start rx/tx */
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_START_RXTX;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
if (ret) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to start rx/tx\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set link down */
|
||||||
|
link_state.state = false;
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE;
|
||||||
|
msg.data = &link_state;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
if (ret) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to set link down\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = cnxk_bphy_cgx_link_cond(dev_id, i, 0);
|
||||||
|
if (ret != 0)
|
||||||
|
RTE_LOG(ERR, PMD,
|
||||||
|
"Timed out waiting for a link down\n");
|
||||||
|
|
||||||
|
/* set link up */
|
||||||
|
link_state.state = true;
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE;
|
||||||
|
msg.data = &link_state;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
if (ret) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to set link up\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = cnxk_bphy_cgx_link_cond(dev_id, i, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
RTE_LOG(ERR, PMD, "Timed out waiting for a link up\n");
|
||||||
|
|
||||||
|
/* enable internal loopback */
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_INTLBK_ENABLE;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
if (ret) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to enable internal lbk\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable internal loopback */
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
if (ret) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to disable internal lbk\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable ptp */
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_ENABLE;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
/* ptp not available on RPM */
|
||||||
|
if (ret < 0 && ret != -ENOTSUP) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to enable ptp\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
/* disable ptp */
|
||||||
|
msg.type = CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_DISABLE;
|
||||||
|
ret = cnxk_bphy_cgx_enq_msg(dev_id, i, &msg);
|
||||||
|
/* ptp not available on RPM */
|
||||||
|
if (ret < 0 && ret != -ENOTSUP) {
|
||||||
|
RTE_LOG(ERR, PMD, "Failed to disable ptp\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rte_rawdev_stop(dev_id);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
@ -5,5 +5,6 @@
|
|||||||
deps += ['bus_pci', 'common_cnxk', 'rawdev']
|
deps += ['bus_pci', 'common_cnxk', 'rawdev']
|
||||||
sources = files(
|
sources = files(
|
||||||
'cnxk_bphy_cgx.c',
|
'cnxk_bphy_cgx.c',
|
||||||
|
'cnxk_bphy_cgx_test.c',
|
||||||
)
|
)
|
||||||
headers = files('rte_pmd_bphy.h')
|
headers = files('rte_pmd_bphy.h')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user