1 /* SPDX-License-Identifier: BSD-3-Clause
9 #include <rte_bus_vdev.h>
10 #include <rte_atomic.h>
11 #include <rte_interrupts.h>
12 #include <rte_branch_prediction.h>
13 #include <rte_lcore.h>
15 #include <rte_rawdev.h>
16 #include <rte_rawdev_pmd.h>
18 #include <portal/dpaa2_hw_pvt.h>
19 #include <portal/dpaa2_hw_dpio.h>
20 #include "dpaa2_cmdif_logs.h"
22 /* Dynamic log type identifier */
23 int dpaa2_cmdif_logtype;
25 /* CMDIF driver name */
26 #define DPAA2_CMDIF_PMD_NAME dpaa2_dpci
28 /* CMDIF driver object */
29 static struct rte_vdev_driver dpaa2_cmdif_drv;
31 static const struct rte_rawdev_ops dpaa2_cmdif_ops;
34 dpaa2_cmdif_create(const char *name,
35 struct rte_vdev_device *vdev,
38 struct rte_rawdev *rawdev;
39 struct dpaa2_dpci_dev *cidev;
41 /* Allocate device structure */
42 rawdev = rte_rawdev_pmd_allocate(name, sizeof(struct dpaa2_dpci_dev),
45 DPAA2_CMDIF_ERR("Unable to allocate rawdevice");
49 rawdev->dev_ops = &dpaa2_cmdif_ops;
50 rawdev->device = &vdev->device;
51 rawdev->driver_name = vdev->device.driver->name;
53 /* For secondary processes, the primary has done all the work */
54 if (rte_eal_process_type() != RTE_PROC_PRIMARY)
57 cidev = rte_dpaa2_alloc_dpci_dev();
59 DPAA2_CMDIF_ERR("Unable to allocate CI device");
60 rte_rawdev_pmd_release(rawdev);
64 rawdev->dev_private = cidev;
70 dpaa2_cmdif_destroy(const char *name)
73 struct rte_rawdev *rdev;
75 rdev = rte_rawdev_pmd_get_named_dev(name);
77 DPAA2_CMDIF_ERR("Invalid device name (%s)", name);
81 /* The primary process will only free the DPCI device */
82 if (rte_eal_process_type() == RTE_PROC_PRIMARY)
83 rte_dpaa2_free_dpci_dev(rdev->dev_private);
85 ret = rte_rawdev_pmd_release(rdev);
87 DPAA2_CMDIF_DEBUG("Device cleanup failed");
93 dpaa2_cmdif_probe(struct rte_vdev_device *vdev)
98 name = rte_vdev_device_name(vdev);
100 DPAA2_CMDIF_INFO("Init %s on NUMA node %d", name, rte_socket_id());
102 ret = dpaa2_cmdif_create(name, vdev, rte_socket_id());
108 dpaa2_cmdif_remove(struct rte_vdev_device *vdev)
113 name = rte_vdev_device_name(vdev);
115 DPAA2_CMDIF_INFO("Closing %s on NUMA node %d", name, rte_socket_id());
117 ret = dpaa2_cmdif_destroy(name);
122 static struct rte_vdev_driver dpaa2_cmdif_drv = {
123 .probe = dpaa2_cmdif_probe,
124 .remove = dpaa2_cmdif_remove
127 RTE_PMD_REGISTER_VDEV(DPAA2_CMDIF_PMD_NAME, dpaa2_cmdif_drv);
129 RTE_INIT(dpaa2_cmdif_init_log);
132 dpaa2_cmdif_init_log(void)
134 dpaa2_cmdif_logtype = rte_log_register("pmd.raw.dpaa2.cmdif");
135 if (dpaa2_cmdif_logtype >= 0)
136 rte_log_set_level(dpaa2_cmdif_logtype, RTE_LOG_INFO);