net/hns3: refactor multi-process initialization
[dpdk.git] / drivers / raw / cnxk_bphy / cnxk_bphy.c
index 030beff..349d551 100644 (file)
@@ -45,6 +45,7 @@ static int
 bphy_rawdev_selftest(uint16_t dev_id)
 {
        unsigned int i, queues, descs;
+       uint16_t pf_func;
        uint64_t max_irq;
        int ret;
 
@@ -68,6 +69,14 @@ bphy_rawdev_selftest(uint16_t dev_id)
                goto err_desc;
        }
 
+       ret = rte_pmd_bphy_npa_pf_func_get(dev_id, &pf_func);
+       if (ret || pf_func == 0)
+               plt_warn("NPA pf_func is invalid");
+
+       ret = rte_pmd_bphy_sso_pf_func_get(dev_id, &pf_func);
+       if (ret || pf_func == 0)
+               plt_warn("SSO pf_func is invalid");
+
        ret = rte_pmd_bphy_intr_init(dev_id);
        if (ret) {
                plt_err("intr init failed");
@@ -149,7 +158,7 @@ err_desc:
 static void
 bphy_rawdev_get_name(char *name, struct rte_pci_device *pci_dev)
 {
-       snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "BPHY:%x:%02x.%x",
+       snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "BPHY:%02x:%02x.%x",
                 pci_dev->addr.bus, pci_dev->addr.devid,
                 pci_dev->addr.function);
 }
@@ -161,9 +170,13 @@ cnxk_bphy_irq_enqueue_bufs(struct rte_rawdev *dev,
 {
        struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
        struct cnxk_bphy_irq_msg *msg = buffers[0]->buf_addr;
+       struct bphy_irq_queue *qp = &bphy_dev->queues[0];
        unsigned int queue = (size_t)context;
        struct cnxk_bphy_irq_info *info;
-       int ret = 0;
+       struct cnxk_bphy_mem *mem;
+       uint16_t *pf_func;
+       void *rsp = NULL;
+       int ret;
 
        if (queue >= RTE_DIM(bphy_dev->queues))
                return -EINVAL;
@@ -174,6 +187,8 @@ cnxk_bphy_irq_enqueue_bufs(struct rte_rawdev *dev,
        switch (msg->type) {
        case CNXK_BPHY_IRQ_MSG_TYPE_INIT:
                ret = cnxk_bphy_intr_init(dev->dev_id);
+               if (ret)
+                       return ret;
                break;
        case CNXK_BPHY_IRQ_MSG_TYPE_FINI:
                cnxk_bphy_intr_fini(dev->dev_id);
@@ -183,19 +198,49 @@ cnxk_bphy_irq_enqueue_bufs(struct rte_rawdev *dev,
                ret = cnxk_bphy_intr_register(dev->dev_id, info->irq_num,
                                              info->handler, info->data,
                                              info->cpu);
+               if (ret)
+                       return ret;
                break;
        case CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER:
                info = (struct cnxk_bphy_irq_info *)msg->data;
                cnxk_bphy_intr_unregister(dev->dev_id, info->irq_num);
                break;
        case CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET:
-               bphy_dev->queues[queue].rsp = &bphy_dev->mem;
+               mem = rte_zmalloc(NULL, sizeof(*mem), 0);
+               if (!mem)
+                       return -ENOMEM;
+
+               *mem = bphy_dev->mem;
+               rsp = mem;
+               break;
+       case CNXK_BPHY_MSG_TYPE_NPA_PF_FUNC:
+               pf_func = rte_malloc(NULL, sizeof(*pf_func), 0);
+               if (!pf_func)
+                       return -ENOMEM;
+
+               *pf_func = roc_bphy_npa_pf_func_get();
+               rsp = pf_func;
+               break;
+       case CNXK_BPHY_MSG_TYPE_SSO_PF_FUNC:
+               pf_func = rte_malloc(NULL, sizeof(*pf_func), 0);
+               if (!pf_func)
+                       return -ENOMEM;
+
+               *pf_func = roc_bphy_sso_pf_func_get();
+               rsp = pf_func;
                break;
        default:
-               ret = -EINVAL;
+               return -EINVAL;
        }
 
-       return ret;
+       /* get rid of last response if any */
+       if (qp->rsp) {
+               RTE_LOG(WARNING, PMD, "Previous response got overwritten\n");
+               rte_free(qp->rsp);
+       }
+       qp->rsp = rsp;
+
+       return 1;
 }
 
 static int
@@ -205,6 +250,7 @@ cnxk_bphy_irq_dequeue_bufs(struct rte_rawdev *dev,
 {
        struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
        unsigned int queue = (size_t)context;
+       struct bphy_irq_queue *qp;
 
        if (queue >= RTE_DIM(bphy_dev->queues))
                return -EINVAL;
@@ -212,7 +258,13 @@ cnxk_bphy_irq_dequeue_bufs(struct rte_rawdev *dev,
        if (count == 0)
                return 0;
 
-       buffers[0]->buf_addr = bphy_dev->queues[queue].rsp;
+       qp = &bphy_dev->queues[queue];
+       if (qp->rsp) {
+               buffers[0]->buf_addr = qp->rsp;
+               qp->rsp = NULL;
+
+               return 1;
+       }
 
        return 0;
 }
@@ -289,6 +341,13 @@ bphy_rawdev_probe(struct rte_pci_driver *pci_drv,
        bphy_dev = (struct bphy_device *)bphy_rawdev->dev_private;
        bphy_dev->mem.res0 = pci_dev->mem_resource[0];
        bphy_dev->mem.res2 = pci_dev->mem_resource[2];
+       bphy_dev->bphy.pci_dev = pci_dev;
+
+       ret = roc_bphy_dev_init(&bphy_dev->bphy);
+       if (ret) {
+               rte_rawdev_pmd_release(bphy_rawdev);
+               return ret;
+       }
 
        return 0;
 }
@@ -297,6 +356,7 @@ static int
 bphy_rawdev_remove(struct rte_pci_device *pci_dev)
 {
        char name[RTE_RAWDEV_NAME_MAX_LEN];
+       struct bphy_device *bphy_dev;
        struct rte_rawdev *rawdev;
 
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
@@ -307,13 +367,15 @@ bphy_rawdev_remove(struct rte_pci_device *pci_dev)
                return -EINVAL;
        }
 
+       bphy_rawdev_get_name(name, pci_dev);
        rawdev = rte_rawdev_pmd_get_named_dev(name);
        if (rawdev == NULL) {
                plt_err("invalid device name (%s)", name);
                return -EINVAL;
        }
 
-       bphy_rawdev_get_name(name, pci_dev);
+       bphy_dev = (struct bphy_device *)rawdev->dev_private;
+       roc_bphy_dev_fini(&bphy_dev->bphy);
 
        return rte_rawdev_pmd_release(rawdev);
 }