compress/octeontx: introduce octeontx zip PMD
[dpdk.git] / drivers / compress / octeontx / otx_zip_pmd.c
diff --git a/drivers/compress/octeontx/otx_zip_pmd.c b/drivers/compress/octeontx/otx_zip_pmd.c
new file mode 100644 (file)
index 0000000..4d92c9d
--- /dev/null
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Cavium, Inc
+ */
+
+#include <string.h>
+
+#include <rte_byteorder.h>
+#include <rte_common.h>
+#include <rte_cpuflags.h>
+#include <rte_malloc.h>
+
+#include "otx_zip.h"
+
+struct rte_compressdev_ops octtx_zip_pmd_ops = {
+
+};
+
+static int
+zip_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+       struct rte_pci_device *pci_dev)
+{
+       int ret = 0;
+       char compressdev_name[RTE_COMPRESSDEV_NAME_MAX_LEN];
+       struct rte_compressdev *compressdev;
+       struct rte_compressdev_pmd_init_params init_params = {
+               "",
+               rte_socket_id(),
+       };
+
+       ZIP_PMD_INFO("vendor_id=0x%x device_id=0x%x",
+                       (unsigned int)pci_dev->id.vendor_id,
+                       (unsigned int)pci_dev->id.device_id);
+
+       rte_pci_device_name(&pci_dev->addr, compressdev_name,
+                           sizeof(compressdev_name));
+
+       compressdev = rte_compressdev_pmd_create(compressdev_name,
+               &pci_dev->device, sizeof(struct zip_vf), &init_params);
+       if (compressdev == NULL) {
+               ZIP_PMD_ERR("driver %s: create failed", init_params.name);
+               return -ENODEV;
+       }
+
+       /*
+        * create only if proc_type is primary.
+        */
+       if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+               /*  create vf dev with given pmd dev id */
+               ret = zipvf_create(compressdev);
+               if (ret < 0) {
+                       ZIP_PMD_ERR("Device creation failed");
+                       rte_compressdev_pmd_destroy(compressdev);
+                       return ret;
+               }
+       }
+
+       compressdev->dev_ops = &octtx_zip_pmd_ops;
+       /* register rx/tx burst functions for data path */
+       compressdev->feature_flags = RTE_COMPDEV_FF_HW_ACCELERATED;
+       return ret;
+}
+
+static int
+zip_pci_remove(struct rte_pci_device *pci_dev)
+{
+       struct rte_compressdev *compressdev;
+       char compressdev_name[RTE_COMPRESSDEV_NAME_MAX_LEN];
+
+       if (pci_dev == NULL) {
+               ZIP_PMD_ERR(" Invalid PCI Device\n");
+               return -EINVAL;
+       }
+       rte_pci_device_name(&pci_dev->addr, compressdev_name,
+                       sizeof(compressdev_name));
+
+       compressdev = rte_compressdev_pmd_get_named_dev(compressdev_name);
+       if (compressdev == NULL)
+               return -ENODEV;
+
+       if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+               if (zipvf_destroy(compressdev) < 0)
+                       return -ENODEV;
+       }
+       return rte_compressdev_pmd_destroy(compressdev);
+}
+
+static struct rte_pci_id pci_id_octtx_zipvf_table[] = {
+       {
+               RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
+                       PCI_DEVICE_ID_OCTEONTX_ZIPVF),
+       },
+       {
+               .device_id = 0
+       },
+};
+
+/**
+ * Structure that represents a PCI driver
+ */
+static struct rte_pci_driver octtx_zip_pmd = {
+       .id_table    = pci_id_octtx_zipvf_table,
+       .drv_flags   = RTE_PCI_DRV_NEED_MAPPING,
+       .probe       = zip_pci_probe,
+       .remove      = zip_pci_remove,
+};
+
+RTE_PMD_REGISTER_PCI(COMPRESSDEV_NAME_ZIP_PMD, octtx_zip_pmd);
+RTE_PMD_REGISTER_PCI_TABLE(COMPRESSDEV_NAME_ZIP_PMD, pci_id_octtx_zipvf_table);
+
+RTE_INIT(octtx_zip_init_log);
+
+static void
+octtx_zip_init_log(void)
+{
+       octtx_zip_logtype_driver = rte_log_register("pmd.compress.octeontx");
+       if (octtx_zip_logtype_driver >= 0)
+               rte_log_set_level(octtx_zip_logtype_driver, RTE_LOG_INFO);
+}