raw/cnxk_bphy: fix device lookup
[dpdk.git] / drivers / raw / cnxk_bphy / rte_pmd_bphy.h
index fed7916..d459c3a 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef _CNXK_BPHY_H_
 #define _CNXK_BPHY_H_
 
+#include "cnxk_bphy_irq.h"
+
 enum cnxk_bphy_cgx_msg_type {
        CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO,
        CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE,
@@ -15,6 +17,8 @@ enum cnxk_bphy_cgx_msg_type {
        CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE,
        CNXK_BPHY_CGX_MSG_TYPE_START_RXTX,
        CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX,
+       CNXK_BPHY_CGX_MSG_TYPE_GET_SUPPORTED_FEC,
+       CNXK_BPHY_CGX_MSG_TYPE_SET_FEC,
 };
 
 enum cnxk_bphy_cgx_eth_link_speed {
@@ -101,4 +105,131 @@ struct cnxk_bphy_cgx_msg {
        void *data;
 };
 
+#define cnxk_bphy_mem      bphy_mem
+#define CNXK_BPHY_DEF_QUEUE 0
+
+enum cnxk_bphy_irq_msg_type {
+       CNXK_BPHY_IRQ_MSG_TYPE_INIT,
+       CNXK_BPHY_IRQ_MSG_TYPE_FINI,
+       CNXK_BPHY_IRQ_MSG_TYPE_REGISTER,
+       CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER,
+       CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET,
+};
+
+struct cnxk_bphy_irq_msg {
+       enum cnxk_bphy_irq_msg_type type;
+       /*
+        * The data field, depending on message type, may point to
+        * - (enq) full struct cnxk_bphy_irq_info for registration request
+        * - (enq) struct cnxk_bphy_irq_info with irq_num set for unregistration
+        * - (deq) struct cnxk_bphy_mem for memory range request response
+        * - (xxx) NULL
+        */
+       void *data;
+};
+
+struct cnxk_bphy_irq_info {
+       int irq_num;
+       cnxk_bphy_intr_handler_t handler;
+       void *data;
+       int cpu;
+};
+
+static __rte_always_inline int
+rte_pmd_bphy_intr_init(uint16_t dev_id)
+{
+       struct cnxk_bphy_irq_msg msg = {
+               .type = CNXK_BPHY_IRQ_MSG_TYPE_INIT,
+       };
+       struct rte_rawdev_buf *bufs[1];
+       struct rte_rawdev_buf buf;
+
+       buf.buf_addr = &msg;
+       bufs[0] = &buf;
+
+       return rte_rawdev_enqueue_buffers(dev_id, bufs, 1, CNXK_BPHY_DEF_QUEUE);
+}
+
+static __rte_always_inline void
+rte_pmd_bphy_intr_fini(uint16_t dev_id)
+{
+       struct cnxk_bphy_irq_msg msg = {
+               .type = CNXK_BPHY_IRQ_MSG_TYPE_FINI,
+       };
+       struct rte_rawdev_buf *bufs[1];
+       struct rte_rawdev_buf buf;
+
+       buf.buf_addr = &msg;
+       bufs[0] = &buf;
+
+       rte_rawdev_enqueue_buffers(dev_id, bufs, 1, CNXK_BPHY_DEF_QUEUE);
+}
+
+static __rte_always_inline int
+rte_pmd_bphy_intr_register(uint16_t dev_id, int irq_num,
+                          cnxk_bphy_intr_handler_t handler, void *data,
+                          int cpu)
+{
+       struct cnxk_bphy_irq_info info = {
+               .irq_num = irq_num,
+               .handler = handler,
+               .data = data,
+               .cpu = cpu,
+       };
+       struct cnxk_bphy_irq_msg msg = {
+               .type = CNXK_BPHY_IRQ_MSG_TYPE_REGISTER,
+               .data = &info
+       };
+       struct rte_rawdev_buf *bufs[1];
+       struct rte_rawdev_buf buf;
+
+       buf.buf_addr = &msg;
+       bufs[0] = &buf;
+
+       return rte_rawdev_enqueue_buffers(dev_id, bufs, 1, CNXK_BPHY_DEF_QUEUE);
+}
+
+static __rte_always_inline void
+rte_pmd_bphy_intr_unregister(uint16_t dev_id, int irq_num)
+{
+       struct cnxk_bphy_irq_info info = {
+               .irq_num = irq_num,
+       };
+       struct cnxk_bphy_irq_msg msg = {
+               .type = CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER,
+               .data = &info
+       };
+       struct rte_rawdev_buf *bufs[1];
+       struct rte_rawdev_buf buf;
+
+       buf.buf_addr = &msg;
+       bufs[0] = &buf;
+
+       rte_rawdev_enqueue_buffers(dev_id, bufs, 1, 0);
+}
+
+static __rte_always_inline struct cnxk_bphy_mem *
+rte_pmd_bphy_intr_mem_get(uint16_t dev_id)
+{
+       struct cnxk_bphy_irq_msg msg = {
+               .type = CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET,
+       };
+       struct rte_rawdev_buf *bufs[1];
+       struct rte_rawdev_buf buf;
+       int ret;
+
+       buf.buf_addr = &msg;
+       bufs[0] = &buf;
+
+       ret = rte_rawdev_enqueue_buffers(dev_id, bufs, 1, CNXK_BPHY_DEF_QUEUE);
+       if (ret)
+               return NULL;
+
+       ret = rte_rawdev_dequeue_buffers(dev_id, bufs, 1, CNXK_BPHY_DEF_QUEUE);
+       if (ret)
+               return NULL;
+
+       return buf.buf_addr;
+}
+
 #endif /* _CNXK_BPHY_H_ */