net/liquidio: add API to setup mbox registers
authorShijith Thotton <shijith.thotton@caviumnetworks.com>
Sat, 25 Mar 2017 06:24:21 +0000 (11:54 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 4 Apr 2017 16:59:48 +0000 (18:59 +0200)
Map and initialize mbox registers.

Signed-off-by: Shijith Thotton <shijith.thotton@caviumnetworks.com>
Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Signed-off-by: Derek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: Venkat Koppula <venkat.koppula@caviumnetworks.com>
Signed-off-by: Srisivasubramanian S <ssrinivasan@caviumnetworks.com>
Signed-off-by: Mallesham Jatharakonda <mjatharakonda@oneconvergence.com>
drivers/net/liquidio/base/lio_23xx_vf.c
drivers/net/liquidio/lio_ethdev.c
drivers/net/liquidio/lio_struct.h

index f61f185..70faa9b 100644 (file)
@@ -38,6 +38,7 @@
 #include "lio_logs.h"
 #include "lio_23xx_vf.h"
 #include "lio_23xx_reg.h"
+#include "lio_mbox.h"
 
 static int
 cn23xx_vf_reset_io_queues(struct lio_device *lio_dev, uint32_t num_queues)
@@ -197,6 +198,63 @@ cn23xx_vf_setup_device_regs(struct lio_device *lio_dev)
        return 0;
 }
 
+static void
+cn23xx_vf_free_mbox(struct lio_device *lio_dev)
+{
+       PMD_INIT_FUNC_TRACE();
+
+       rte_free(lio_dev->mbox[0]);
+       lio_dev->mbox[0] = NULL;
+
+       rte_free(lio_dev->mbox);
+       lio_dev->mbox = NULL;
+}
+
+static int
+cn23xx_vf_setup_mbox(struct lio_device *lio_dev)
+{
+       struct lio_mbox *mbox;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (lio_dev->mbox == NULL) {
+               lio_dev->mbox = rte_zmalloc(NULL, sizeof(void *), 0);
+               if (lio_dev->mbox == NULL)
+                       return -ENOMEM;
+       }
+
+       mbox = rte_zmalloc(NULL, sizeof(struct lio_mbox), 0);
+       if (mbox == NULL) {
+               rte_free(lio_dev->mbox);
+               lio_dev->mbox = NULL;
+               return -ENOMEM;
+       }
+
+       rte_spinlock_init(&mbox->lock);
+
+       mbox->lio_dev = lio_dev;
+
+       mbox->q_no = 0;
+
+       mbox->state = LIO_MBOX_STATE_IDLE;
+
+       /* VF mbox interrupt reg */
+       mbox->mbox_int_reg = (uint8_t *)lio_dev->hw_addr +
+                               CN23XX_VF_SLI_PKT_MBOX_INT(0);
+       /* VF reads from SIG0 reg */
+       mbox->mbox_read_reg = (uint8_t *)lio_dev->hw_addr +
+                               CN23XX_SLI_PKT_PF_VF_MBOX_SIG(0, 0);
+       /* VF writes into SIG1 reg */
+       mbox->mbox_write_reg = (uint8_t *)lio_dev->hw_addr +
+                               CN23XX_SLI_PKT_PF_VF_MBOX_SIG(0, 1);
+
+       lio_dev->mbox[0] = mbox;
+
+       rte_write64(LIO_PFVFSIG, mbox->mbox_read_reg);
+
+       return 0;
+}
+
 int
 cn23xx_vf_setup_device(struct lio_device *lio_dev)
 {
@@ -221,6 +279,9 @@ cn23xx_vf_setup_device(struct lio_device *lio_dev)
        if (lio_dev->default_config == NULL)
                return -1;
 
+       lio_dev->fn_list.setup_mbox             = cn23xx_vf_setup_mbox;
+       lio_dev->fn_list.free_mbox              = cn23xx_vf_free_mbox;
+
        lio_dev->fn_list.setup_device_regs      = cn23xx_vf_setup_device_regs;
 
        return 0;
index 34b7b54..5ee1bb5 100644 (file)
@@ -86,14 +86,19 @@ lio_first_time_init(struct lio_device *lio_dev,
                return -1;
        }
 
+       if (lio_dev->fn_list.setup_mbox(lio_dev)) {
+               lio_dev_err(lio_dev, "Mailbox setup failed\n");
+               goto error;
+       }
+
        if (cn23xx_vf_set_io_queues_off(lio_dev)) {
                lio_dev_err(lio_dev, "Setting io queues off failed\n");
-               return -1;
+               goto error;
        }
 
        if (lio_dev->fn_list.setup_device_regs(lio_dev)) {
                lio_dev_err(lio_dev, "Failed to configure device registers\n");
-               return -1;
+               goto error;
        }
 
        dpdk_queues = (int)lio_dev->sriov_info.rings_per_vf;
@@ -102,6 +107,12 @@ lio_first_time_init(struct lio_device *lio_dev,
        lio_dev->max_rx_queues = dpdk_queues;
 
        return 0;
+
+error:
+       if (lio_dev->mbox[0])
+               lio_dev->fn_list.free_mbox(lio_dev);
+
+       return -1;
 }
 
 static int
index 0af4fe3..01b5716 100644 (file)
@@ -45,6 +45,9 @@
 
 struct lio_device;
 struct lio_fn_list {
+       int (*setup_mbox)(struct lio_device *);
+       void (*free_mbox)(struct lio_device *);
+
        int (*setup_device_regs)(struct lio_device *);
 };