.. SPDX-License-Identifier: BSD-3-Clause Copyright(c) 2021 Marvell. Marvell CNXK BPHY Driver ======================== CN10K/CN9K Fusion product families offer an internal BPHY unit which provides set of hardware accelerators for performing baseband related operations. Connectivity to the outside world happens through a block called RFOE which is backed by ethernet I/O block called CGX or RPM (depending on the chip version). RFOE stands for Radio Frequency Over Ethernet and provides support for IEEE 1904.3 (RoE) standard. Features -------- The BPHY CGX/RPM implements following features in the rawdev API: - Access to BPHY CGX/RPM via a set of predefined messages - Access to BPHY memory - Custom interrupt handlers Device Setup ------------ The BPHY CGX/RPM devices will need to be bound to a user-space IO driver for use. The script ``dpdk-devbind.py`` script included with DPDK can be used to view the state of the devices and to bind them to a suitable DPDK-supported kernel driver. When querying the status of the devices, they will appear under the category of "Misc (rawdev) devices", i.e. the command ``dpdk-devbind.py --status-dev misc`` can be used to see the state of those devices alone. Before performing actual data transfer one needs to first retrieve number of available queues with ``rte_rawdev_queue_count()`` and capacity of each using ``rte_rawdev_queue_conf_get()``. To perform data transfer use standard ``rte_rawdev_enqueue_buffers()`` and ``rte_rawdev_dequeue_buffers()`` APIs. Not all messages produce sensible responses hence dequeueing is not always necessary. BPHY CGX/RPM PMD ---------------- 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. As for the usage examples please refer to ``cnxk_bphy_cgx_dev_selftest()``. Get link information ~~~~~~~~~~~~~~~~~~~~ Message is used to get information about link state. Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO``. In response one will get message containing payload i.e ``struct cnxk_bphy_cgx_msg_link_info`` filled with information about current link state. Change internal loopback state ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Message is used to enable or disable internal loopback. Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_INTLBK_ENABLE`` or ``CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE``. Former will activate internal loopback while the latter will do the opposite. Change PTP RX state ~~~~~~~~~~~~~~~~~~~ Message is used to enable or disable PTP mode. Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_ENABLE`` or ``CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_DISABLE``. Former will enable PTP while the latter will do the opposite. Set link mode ~~~~~~~~~~~~~ Message is used to change link mode. Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_MODE``. Prior to sending actual message payload i.e ``struct cnxk_bphy_cgx_msg_link_mode`` needs to be filled with relevant information. Change link state ~~~~~~~~~~~~~~~~~ Message is used to set link up or down. Message must have type set to ``CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE``. Prior to sending actual message payload i.e ``struct cnxk_bphy_cgx_msg_set_link_state`` needs to be filled with relevant information. Start or stop RX/TX ~~~~~~~~~~~~~~~~~~~ Message is used to start or stop accepting traffic. 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 do the opposite. BPHY PMD -------- BPHY PMD accepts ``struct cnxk_bphy_irq_msg`` messages which differ by type and payload. Message types along with description are listed below. For some usage examples please refer to ``bphy_rawdev_selftest()``. Initialize or finalize interrupt handling ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Message is used to setup low level interrupt handling. Message must have type set to ``CNXK_BPHY_IRQ_MSG_TYPE_INIT`` or ``CNXK_BPHY_IRQ_MSG_TYPE_FINI``. The former will setup low level interrupt handling while the latter will tear everything down. There are also two convenience functions namely ``rte_pmd_bphy_intr_init()`` and ``rte_pmd_bphy_intr_fini()`` that take care of all details. Register or remove interrupt handler ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Message is used setup custom interrupt handler. Message must have type set to ``CNXK_BPHY_IRQ_MSG_TYPE_REGISTER`` or ``CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER``. The former will register an interrupt handler while the latter will remove it. Prior sending actual message payload i.e ``struct cnxk_bphy_irq_info`` needs to be filled with relevant information. There are also two convenience functions namely ``rte_pmd_bphy_intr_register()`` and ``rte_pmd_bphy_intr_unregister()`` that take care of all details. Get device memory ~~~~~~~~~~~~~~~~~ Message is used to read device MMIO address. Message must have type set to ``CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET``. There's a convenience function ``rte_pmd_bphy_intr_mem_get()`` available that takes care of retrieving that address. Self test --------- On EAL initialization BPHY and 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" for regular, and "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. Selftest rawdev API can be used to verify the BPHY and BPHY CGX/RPM functionality.