New upstream version 18.08
[deb_dpdk.git] / drivers / bus / fslmc / portal / dpaa2_hw_dpci.c
index fb28e49..5ad0374 100644 (file)
@@ -39,13 +39,14 @@ rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
        struct dpci_attr attr;
        struct dpci_rx_queue_cfg rx_queue_cfg;
        struct dpci_rx_queue_attr rx_attr;
+       struct dpci_tx_queue_attr tx_attr;
        int ret, i;
 
        /* Allocate DPAA2 dpci handle */
        dpci_node = rte_malloc(NULL, sizeof(struct dpaa2_dpci_dev), 0);
        if (!dpci_node) {
-               PMD_INIT_LOG(ERR, "Memory allocation failed for DPCI Device");
-               return -1;
+               DPAA2_BUS_ERR("Memory allocation failed for DPCI Device");
+               return -ENOMEM;
        }
 
        /* Open the dpci object */
@@ -53,43 +54,57 @@ rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
        ret = dpci_open(&dpci_node->dpci,
                        CMD_PRI_LOW, dpci_id, &dpci_node->token);
        if (ret) {
-               PMD_INIT_LOG(ERR, "Resource alloc failure with err code: %d",
-                            ret);
-               rte_free(dpci_node);
-               return -1;
+               DPAA2_BUS_ERR("Resource alloc failure with err code: %d", ret);
+               goto err;
        }
 
        /* Get the device attributes */
        ret = dpci_get_attributes(&dpci_node->dpci,
                                  CMD_PRI_LOW, dpci_node->token, &attr);
        if (ret != 0) {
-               PMD_INIT_LOG(ERR, "Reading device failed with err code: %d",
-                            ret);
-               rte_free(dpci_node);
-               return -1;
+               DPAA2_BUS_ERR("Reading device failed with err code: %d", ret);
+               goto err;
        }
 
-       /* Set up the Rx Queue */
-       memset(&rx_queue_cfg, 0, sizeof(struct dpci_rx_queue_cfg));
-       ret = dpci_set_rx_queue(&dpci_node->dpci,
-                               CMD_PRI_LOW,
-                               dpci_node->token,
-                               0, &rx_queue_cfg);
-       if (ret) {
-               PMD_INIT_LOG(ERR, "Setting Rx queue failed with err code: %d",
-                            ret);
-               rte_free(dpci_node);
-               return -1;
+       for (i = 0; i < DPAA2_DPCI_MAX_QUEUES; i++) {
+               struct dpaa2_queue *rxq;
+
+               memset(&rx_queue_cfg, 0, sizeof(struct dpci_rx_queue_cfg));
+               ret = dpci_set_rx_queue(&dpci_node->dpci,
+                                       CMD_PRI_LOW,
+                                       dpci_node->token,
+                                       i, &rx_queue_cfg);
+               if (ret) {
+                       DPAA2_BUS_ERR("Setting Rx queue failed with err code: %d",
+                                     ret);
+                       goto err;
+               }
+
+               /* Allocate DQ storage for the DPCI Rx queues */
+               rxq = &(dpci_node->rx_queue[i]);
+               rxq->q_storage = rte_malloc("dq_storage",
+                                       sizeof(struct queue_storage_info_t),
+                                       RTE_CACHE_LINE_SIZE);
+               if (!rxq->q_storage) {
+                       DPAA2_BUS_ERR("q_storage allocation failed\n");
+                       ret = -ENOMEM;
+                       goto err;
+               }
+
+               memset(rxq->q_storage, 0, sizeof(struct queue_storage_info_t));
+               ret = dpaa2_alloc_dq_storage(rxq->q_storage);
+               if (ret) {
+                       DPAA2_BUS_ERR("dpaa2_alloc_dq_storage failed\n");
+                       goto err;
+               }
        }
 
        /* Enable the device */
        ret = dpci_enable(&dpci_node->dpci,
                          CMD_PRI_LOW, dpci_node->token);
        if (ret != 0) {
-               PMD_INIT_LOG(ERR, "Enabling device failed with err code: %d",
-                            ret);
-               rte_free(dpci_node);
-               return -1;
+               DPAA2_BUS_ERR("Enabling device failed with err code: %d", ret);
+               goto err;
        }
 
        for (i = 0; i < DPAA2_DPCI_MAX_QUEUES; i++) {
@@ -99,14 +114,22 @@ rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
                                        dpci_node->token, i,
                                        &rx_attr);
                if (ret != 0) {
-                       PMD_INIT_LOG(ERR,
-                                    "Reading device failed with err code: %d",
-                               ret);
-                       rte_free(dpci_node);
-                       return -1;
+                       DPAA2_BUS_ERR("Rx queue fetch failed with err code: %d",
+                                     ret);
+                       goto err;
                }
+               dpci_node->rx_queue[i].fqid = rx_attr.fqid;
 
-               dpci_node->queue[i].fqid = rx_attr.fqid;
+               ret = dpci_get_tx_queue(&dpci_node->dpci,
+                                       CMD_PRI_LOW,
+                                       dpci_node->token, i,
+                                       &tx_attr);
+               if (ret != 0) {
+                       DPAA2_BUS_ERR("Reading device failed with err code: %d",
+                                     ret);
+                       goto err;
+               }
+               dpci_node->tx_queue[i].fqid = tx_attr.fqid;
        }
 
        dpci_node->dpci_id = dpci_id;
@@ -114,9 +137,20 @@ rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
 
        TAILQ_INSERT_TAIL(&dpci_dev_list, dpci_node, next);
 
-       RTE_LOG(DEBUG, PMD, "DPAA2: Added [dpci.%d]\n", dpci_id);
-
        return 0;
+
+err:
+       for (i = 0; i < DPAA2_DPCI_MAX_QUEUES; i++) {
+               struct dpaa2_queue *rxq = &(dpci_node->rx_queue[i]);
+
+               if (rxq->q_storage) {
+                       dpaa2_free_dq_storage(rxq->q_storage);
+                       rte_free(rxq->q_storage);
+               }
+       }
+       rte_free(dpci_node);
+
+       return ret;
 }
 
 struct dpaa2_dpci_dev *rte_dpaa2_alloc_dpci_dev(void)