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