kni: fix ethtool support
[dpdk.git] / drivers / bus / fslmc / portal / dpaa2_hw_dpio.c
index 16313cc..a1a58b9 100644 (file)
@@ -275,6 +275,51 @@ dpaa2_affine_qbman_swp(void)
        }
 }
 
+int
+dpaa2_affine_qbman_swp_sec(void)
+{
+       unsigned int lcore_id = rte_lcore_id();
+       uint64_t tid = syscall(SYS_gettid);
+
+       if (lcore_id == LCORE_ID_ANY)
+               lcore_id = rte_get_master_lcore();
+       /* if the core id is not supported */
+       else if (lcore_id >= RTE_MAX_LCORE)
+               return -1;
+
+       if (dpaa2_io_portal[lcore_id].sec_dpio_dev) {
+               PMD_DRV_LOG(INFO, "DPAA Portal=0x%x (%d) is being shared"
+                           " between thread %lu and current  %lu",
+                           dpaa2_io_portal[lcore_id].sec_dpio_dev,
+                           dpaa2_io_portal[lcore_id].sec_dpio_dev->index,
+                           dpaa2_io_portal[lcore_id].sec_tid,
+                           tid);
+               RTE_PER_LCORE(_dpaa2_io).sec_dpio_dev
+                       = dpaa2_io_portal[lcore_id].sec_dpio_dev;
+               rte_atomic16_inc(&dpaa2_io_portal
+                                [lcore_id].sec_dpio_dev->ref_count);
+               dpaa2_io_portal[lcore_id].sec_tid = tid;
+
+               PMD_DRV_LOG(DEBUG, "Old Portal=0x%x (%d) affined thread - %lu",
+                           dpaa2_io_portal[lcore_id].sec_dpio_dev,
+                           dpaa2_io_portal[lcore_id].sec_dpio_dev->index,
+                           tid);
+               return 0;
+       }
+
+       /* Populate the dpaa2_io_portal structure */
+       dpaa2_io_portal[lcore_id].sec_dpio_dev = dpaa2_get_qbman_swp();
+
+       if (dpaa2_io_portal[lcore_id].sec_dpio_dev) {
+               RTE_PER_LCORE(_dpaa2_io).sec_dpio_dev
+                       = dpaa2_io_portal[lcore_id].sec_dpio_dev;
+               dpaa2_io_portal[lcore_id].sec_tid = tid;
+               return 0;
+       } else {
+               return -1;
+       }
+}
+
 int
 dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
                         struct vfio_device_info *obj_info,
@@ -366,3 +411,35 @@ dpaa2_create_dpio_device(struct fslmc_vfio_device *vdev,
 
        return 0;
 }
+
+void
+dpaa2_free_dq_storage(struct queue_storage_info_t *q_storage)
+{
+       int i = 0;
+
+       for (i = 0; i < NUM_DQS_PER_QUEUE; i++) {
+               if (q_storage->dq_storage[i])
+                       rte_free(q_storage->dq_storage[i]);
+       }
+}
+
+int
+dpaa2_alloc_dq_storage(struct queue_storage_info_t *q_storage)
+{
+       int i = 0;
+
+       for (i = 0; i < NUM_DQS_PER_QUEUE; i++) {
+               q_storage->dq_storage[i] = rte_malloc(NULL,
+                       DPAA2_DQRR_RING_SIZE * sizeof(struct qbman_result),
+                       RTE_CACHE_LINE_SIZE);
+               if (!q_storage->dq_storage[i])
+                       goto fail;
+       }
+       return 0;
+fail:
+       i -= 1;
+       while (i >= 0)
+               rte_free(q_storage->dq_storage[i]);
+
+       return -1;
+}