dpdk/drivers/crypto/cnxk/cn9k_cryptodev.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(C) 2021 Marvell.
   3 */
   4
   5#include <rte_bus_pci.h>
   6#include <rte_common.h>
   7#include <rte_crypto.h>
   8#include <rte_cryptodev.h>
   9#include <rte_cryptodev_pmd.h>
  10#include <rte_dev.h>
  11#include <rte_pci.h>
  12
  13#include "cn9k_cryptodev.h"
  14#include "cn9k_cryptodev_ops.h"
  15#include "cnxk_cryptodev.h"
  16#include "cnxk_cryptodev_capabilities.h"
  17
  18#include "roc_api.h"
  19
  20uint8_t cn9k_cryptodev_driver_id;
  21
  22static struct rte_pci_id pci_id_cpt_table[] = {
  23        {
  24                RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
  25                               PCI_DEVID_CN9K_RVU_CPT_VF)
  26        },
  27        /* sentinel */
  28        {
  29                .device_id = 0
  30        },
  31};
  32
  33static int
  34cn9k_cpt_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
  35                   struct rte_pci_device *pci_dev)
  36{
  37        struct rte_cryptodev_pmd_init_params init_params = {
  38                .name = "",
  39                .socket_id = rte_socket_id(),
  40                .private_data_size = sizeof(struct cnxk_cpt_vf)
  41        };
  42        char name[RTE_CRYPTODEV_NAME_MAX_LEN];
  43        struct rte_cryptodev *dev;
  44        struct roc_cpt *roc_cpt;
  45        struct cnxk_cpt_vf *vf;
  46        int rc;
  47
  48        rc = roc_plt_init();
  49        if (rc < 0) {
  50                plt_err("Failed to initialize platform model");
  51                return rc;
  52        }
  53
  54        rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
  55
  56        dev = rte_cryptodev_pmd_create(name, &pci_dev->device, &init_params);
  57        if (dev == NULL) {
  58                rc = -ENODEV;
  59                goto exit;
  60        }
  61
  62        /* Get private data space allocated */
  63        vf = dev->data->dev_private;
  64
  65        roc_cpt = &vf->cpt;
  66
  67        if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
  68                roc_cpt->pci_dev = pci_dev;
  69                rc = roc_cpt_dev_init(roc_cpt);
  70                if (rc) {
  71                        plt_err("Failed to initialize roc cpt rc=%d", rc);
  72                        goto pmd_destroy;
  73                }
  74
  75                rc = cnxk_cpt_eng_grp_add(roc_cpt);
  76                if (rc) {
  77                        plt_err("Failed to add engine group rc=%d", rc);
  78                        goto dev_fini;
  79                }
  80        }
  81
  82        dev->dev_ops = &cn9k_cpt_ops;
  83        dev->driver_id = cn9k_cryptodev_driver_id;
  84        dev->feature_flags = cnxk_cpt_default_ff_get();
  85
  86        cnxk_cpt_caps_populate(vf);
  87
  88        cn9k_cpt_set_enqdeq_fns(dev);
  89
  90        return 0;
  91
  92dev_fini:
  93        if (rte_eal_process_type() == RTE_PROC_PRIMARY)
  94                roc_cpt_dev_fini(roc_cpt);
  95pmd_destroy:
  96        rte_cryptodev_pmd_destroy(dev);
  97exit:
  98        plt_err("Could not create device (vendor_id: 0x%x device_id: 0x%x)",
  99                pci_dev->id.vendor_id, pci_dev->id.device_id);
 100        return rc;
 101}
 102
 103static int
 104cn9k_cpt_pci_remove(struct rte_pci_device *pci_dev)
 105{
 106        char name[RTE_CRYPTODEV_NAME_MAX_LEN];
 107        struct rte_cryptodev *dev;
 108        struct cnxk_cpt_vf *vf;
 109        int ret;
 110
 111        if (pci_dev == NULL)
 112                return -EINVAL;
 113
 114        rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 115
 116        dev = rte_cryptodev_pmd_get_named_dev(name);
 117        if (dev == NULL)
 118                return -ENODEV;
 119
 120        if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
 121                vf = dev->data->dev_private;
 122                ret = roc_cpt_dev_fini(&vf->cpt);
 123                if (ret)
 124                        return ret;
 125        }
 126
 127        return rte_cryptodev_pmd_destroy(dev);
 128}
 129
 130static struct rte_pci_driver cn9k_cryptodev_pmd = {
 131        .id_table = pci_id_cpt_table,
 132        .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
 133        .probe = cn9k_cpt_pci_probe,
 134        .remove = cn9k_cpt_pci_remove,
 135};
 136
 137static struct cryptodev_driver cn9k_cryptodev_drv;
 138
 139RTE_PMD_REGISTER_PCI(CRYPTODEV_NAME_CN9K_PMD, cn9k_cryptodev_pmd);
 140RTE_PMD_REGISTER_PCI_TABLE(CRYPTODEV_NAME_CN9K_PMD, pci_id_cpt_table);
 141RTE_PMD_REGISTER_KMOD_DEP(CRYPTODEV_NAME_CN9K_PMD, "vfio-pci");
 142RTE_PMD_REGISTER_CRYPTO_DRIVER(cn9k_cryptodev_drv, cn9k_cryptodev_pmd.driver,
 143                               cn9k_cryptodev_driver_id);
 144