net/mlx5: add flow action functions to glue
[dpdk.git] / drivers / bus / fslmc / portal / dpaa2_hw_dpci.c
index b60a745..5ad0374 100644 (file)
@@ -1,33 +1,7 @@
-/*-
- *   BSD LICENSE
+/* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017 NXP.
+ *   Copyright 2017 NXP
  *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Freescale Semiconductor, Inc nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include <unistd.h>
@@ -44,7 +18,7 @@
 #include <rte_cycles.h>
 #include <rte_kvargs.h>
 #include <rte_dev.h>
-#include <rte_ethdev.h>
+#include <rte_ethdev_driver.h>
 
 #include <fslmc_logs.h>
 #include <rte_fslmc.h>
@@ -65,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 */
@@ -79,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++) {
@@ -125,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;
@@ -140,9 +137,20 @@ rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
 
        TAILQ_INSERT_TAIL(&dpci_dev_list, dpci_node, next);
 
-       PMD_INIT_LOG(DEBUG, "DPAA2: Added [dpci.%d]", 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)