1bfe2ae49SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause 2bfe2ae49SAnoob Joseph * Copyright(c) 2018 Cavium, Inc 3bfe2ae49SAnoob Joseph */ 4bfe2ae49SAnoob Joseph 50dc1cffaSAnkur Dwivedi #include <rte_alarm.h> 60dc1cffaSAnkur Dwivedi #include <rte_bus_pci.h> 7bfe2ae49SAnoob Joseph #include <rte_cryptodev.h> 8*0906b99fSMurthy NSSR #include <rte_cryptodev_pmd.h> 90dc1cffaSAnkur Dwivedi #include <rte_malloc.h> 100dc1cffaSAnkur Dwivedi 110dc1cffaSAnkur Dwivedi #include "cpt_pmd_logs.h" 12273487f7SAnoob Joseph #include "cpt_pmd_ops_helper.h" 13bfe2ae49SAnoob Joseph 14bfe2ae49SAnoob Joseph #include "otx_cryptodev.h" 15*0906b99fSMurthy NSSR #include "otx_cryptodev_capabilities.h" 160dc1cffaSAnkur Dwivedi #include "otx_cryptodev_hw_access.h" 17bfe2ae49SAnoob Joseph #include "otx_cryptodev_ops.h" 18bfe2ae49SAnoob Joseph 19273487f7SAnoob Joseph static int otx_cryptodev_probe_count; 20273487f7SAnoob Joseph static rte_spinlock_t otx_probe_count_lock = RTE_SPINLOCK_INITIALIZER; 21273487f7SAnoob Joseph 22273487f7SAnoob Joseph static struct rte_mempool *otx_cpt_meta_pool; 23273487f7SAnoob Joseph static int otx_cpt_op_mlen; 24273487f7SAnoob Joseph static int otx_cpt_op_sb_mlen; 25273487f7SAnoob Joseph 26273487f7SAnoob Joseph /* 27273487f7SAnoob Joseph * Initializes global variables used by fast-path code 28273487f7SAnoob Joseph * 29273487f7SAnoob Joseph * @return 30273487f7SAnoob Joseph * - 0 on success, errcode on error 31273487f7SAnoob Joseph */ 32273487f7SAnoob Joseph static int 33273487f7SAnoob Joseph init_global_resources(void) 34273487f7SAnoob Joseph { 35273487f7SAnoob Joseph /* Get meta len for scatter gather mode */ 36273487f7SAnoob Joseph otx_cpt_op_mlen = cpt_pmd_ops_helper_get_mlen_sg_mode(); 37273487f7SAnoob Joseph 38273487f7SAnoob Joseph /* Extra 4B saved for future considerations */ 39273487f7SAnoob Joseph otx_cpt_op_mlen += 4 * sizeof(uint64_t); 40273487f7SAnoob Joseph 41273487f7SAnoob Joseph otx_cpt_meta_pool = rte_mempool_create("cpt_metabuf-pool", 4096 * 16, 42273487f7SAnoob Joseph otx_cpt_op_mlen, 512, 0, 43273487f7SAnoob Joseph NULL, NULL, NULL, NULL, 44273487f7SAnoob Joseph SOCKET_ID_ANY, 0); 45273487f7SAnoob Joseph if (!otx_cpt_meta_pool) { 46273487f7SAnoob Joseph CPT_LOG_ERR("cpt metabuf pool not created"); 47273487f7SAnoob Joseph return -ENOMEM; 48273487f7SAnoob Joseph } 49273487f7SAnoob Joseph 50273487f7SAnoob Joseph /* Get meta len for direct mode */ 51273487f7SAnoob Joseph otx_cpt_op_sb_mlen = cpt_pmd_ops_helper_get_mlen_direct_mode(); 52273487f7SAnoob Joseph 53273487f7SAnoob Joseph /* Extra 4B saved for future considerations */ 54273487f7SAnoob Joseph otx_cpt_op_sb_mlen += 4 * sizeof(uint64_t); 55273487f7SAnoob Joseph 56273487f7SAnoob Joseph return 0; 57273487f7SAnoob Joseph } 58273487f7SAnoob Joseph 59273487f7SAnoob Joseph void 60273487f7SAnoob Joseph cleanup_global_resources(void) 61273487f7SAnoob Joseph { 62273487f7SAnoob Joseph /* Take lock */ 63273487f7SAnoob Joseph rte_spinlock_lock(&otx_probe_count_lock); 64273487f7SAnoob Joseph 65273487f7SAnoob Joseph /* Decrement the cryptodev count */ 66273487f7SAnoob Joseph otx_cryptodev_probe_count--; 67273487f7SAnoob Joseph 68273487f7SAnoob Joseph /* Free buffers */ 69273487f7SAnoob Joseph if (otx_cpt_meta_pool && otx_cryptodev_probe_count == 0) 70273487f7SAnoob Joseph rte_mempool_free(otx_cpt_meta_pool); 71273487f7SAnoob Joseph 72273487f7SAnoob Joseph /* Free lock */ 73273487f7SAnoob Joseph rte_spinlock_unlock(&otx_probe_count_lock); 74273487f7SAnoob Joseph } 75273487f7SAnoob Joseph 760dc1cffaSAnkur Dwivedi /* Alarm routines */ 770dc1cffaSAnkur Dwivedi 780dc1cffaSAnkur Dwivedi static void 790dc1cffaSAnkur Dwivedi otx_cpt_alarm_cb(void *arg) 800dc1cffaSAnkur Dwivedi { 810dc1cffaSAnkur Dwivedi struct cpt_vf *cptvf = arg; 820dc1cffaSAnkur Dwivedi otx_cpt_poll_misc(cptvf); 830dc1cffaSAnkur Dwivedi rte_eal_alarm_set(CPT_INTR_POLL_INTERVAL_MS * 1000, 840dc1cffaSAnkur Dwivedi otx_cpt_alarm_cb, cptvf); 850dc1cffaSAnkur Dwivedi } 860dc1cffaSAnkur Dwivedi 870dc1cffaSAnkur Dwivedi static int 880dc1cffaSAnkur Dwivedi otx_cpt_periodic_alarm_start(void *arg) 890dc1cffaSAnkur Dwivedi { 900dc1cffaSAnkur Dwivedi return rte_eal_alarm_set(CPT_INTR_POLL_INTERVAL_MS * 1000, 910dc1cffaSAnkur Dwivedi otx_cpt_alarm_cb, arg); 920dc1cffaSAnkur Dwivedi } 930dc1cffaSAnkur Dwivedi 94273487f7SAnoob Joseph static int 95273487f7SAnoob Joseph otx_cpt_periodic_alarm_stop(void *arg) 96273487f7SAnoob Joseph { 97273487f7SAnoob Joseph return rte_eal_alarm_cancel(otx_cpt_alarm_cb, arg); 98273487f7SAnoob Joseph } 99273487f7SAnoob Joseph 100*0906b99fSMurthy NSSR /* PMD ops */ 101*0906b99fSMurthy NSSR 102*0906b99fSMurthy NSSR static int 103*0906b99fSMurthy NSSR otx_cpt_dev_config(struct rte_cryptodev *dev __rte_unused, 104*0906b99fSMurthy NSSR struct rte_cryptodev_config *config __rte_unused) 105*0906b99fSMurthy NSSR { 106*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 107*0906b99fSMurthy NSSR return 0; 108*0906b99fSMurthy NSSR } 109*0906b99fSMurthy NSSR 110*0906b99fSMurthy NSSR static int 111*0906b99fSMurthy NSSR otx_cpt_dev_start(struct rte_cryptodev *c_dev) 112*0906b99fSMurthy NSSR { 113*0906b99fSMurthy NSSR void *cptvf = c_dev->data->dev_private; 114*0906b99fSMurthy NSSR 115*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 116*0906b99fSMurthy NSSR 117*0906b99fSMurthy NSSR return otx_cpt_start_device(cptvf); 118*0906b99fSMurthy NSSR } 119*0906b99fSMurthy NSSR 120*0906b99fSMurthy NSSR static void 121*0906b99fSMurthy NSSR otx_cpt_dev_stop(struct rte_cryptodev *c_dev) 122*0906b99fSMurthy NSSR { 123*0906b99fSMurthy NSSR void *cptvf = c_dev->data->dev_private; 124*0906b99fSMurthy NSSR 125*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 126*0906b99fSMurthy NSSR 127*0906b99fSMurthy NSSR otx_cpt_stop_device(cptvf); 128*0906b99fSMurthy NSSR } 129*0906b99fSMurthy NSSR 130*0906b99fSMurthy NSSR static int 131*0906b99fSMurthy NSSR otx_cpt_dev_close(struct rte_cryptodev *c_dev) 132*0906b99fSMurthy NSSR { 133*0906b99fSMurthy NSSR void *cptvf = c_dev->data->dev_private; 134*0906b99fSMurthy NSSR 135*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 136*0906b99fSMurthy NSSR 137*0906b99fSMurthy NSSR otx_cpt_periodic_alarm_stop(cptvf); 138*0906b99fSMurthy NSSR otx_cpt_deinit_device(cptvf); 139*0906b99fSMurthy NSSR 140*0906b99fSMurthy NSSR return 0; 141*0906b99fSMurthy NSSR } 142*0906b99fSMurthy NSSR 143*0906b99fSMurthy NSSR static void 144*0906b99fSMurthy NSSR otx_cpt_dev_info_get(struct rte_cryptodev *dev, struct rte_cryptodev_info *info) 145*0906b99fSMurthy NSSR { 146*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 147*0906b99fSMurthy NSSR if (info != NULL) { 148*0906b99fSMurthy NSSR info->max_nb_queue_pairs = CPT_NUM_QS_PER_VF; 149*0906b99fSMurthy NSSR info->feature_flags = dev->feature_flags; 150*0906b99fSMurthy NSSR info->capabilities = otx_get_capabilities(); 151*0906b99fSMurthy NSSR info->sym.max_nb_sessions = 0; 152*0906b99fSMurthy NSSR info->driver_id = otx_cryptodev_driver_id; 153*0906b99fSMurthy NSSR info->min_mbuf_headroom_req = OTX_CPT_MIN_HEADROOM_REQ; 154*0906b99fSMurthy NSSR info->min_mbuf_tailroom_req = OTX_CPT_MIN_TAILROOM_REQ; 155*0906b99fSMurthy NSSR } 156*0906b99fSMurthy NSSR } 157*0906b99fSMurthy NSSR 158*0906b99fSMurthy NSSR static void 159*0906b99fSMurthy NSSR otx_cpt_stats_get(struct rte_cryptodev *dev __rte_unused, 160*0906b99fSMurthy NSSR struct rte_cryptodev_stats *stats __rte_unused) 161*0906b99fSMurthy NSSR { 162*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 163*0906b99fSMurthy NSSR } 164*0906b99fSMurthy NSSR 165*0906b99fSMurthy NSSR static void 166*0906b99fSMurthy NSSR otx_cpt_stats_reset(struct rte_cryptodev *dev __rte_unused) 167*0906b99fSMurthy NSSR { 168*0906b99fSMurthy NSSR CPT_PMD_INIT_FUNC_TRACE(); 169*0906b99fSMurthy NSSR } 170*0906b99fSMurthy NSSR 171*0906b99fSMurthy NSSR static struct rte_cryptodev_ops cptvf_ops = { 172*0906b99fSMurthy NSSR /* Device related operations */ 173*0906b99fSMurthy NSSR .dev_configure = otx_cpt_dev_config, 174*0906b99fSMurthy NSSR .dev_start = otx_cpt_dev_start, 175*0906b99fSMurthy NSSR .dev_stop = otx_cpt_dev_stop, 176*0906b99fSMurthy NSSR .dev_close = otx_cpt_dev_close, 177*0906b99fSMurthy NSSR .dev_infos_get = otx_cpt_dev_info_get, 178*0906b99fSMurthy NSSR 179*0906b99fSMurthy NSSR .stats_get = otx_cpt_stats_get, 180*0906b99fSMurthy NSSR .stats_reset = otx_cpt_stats_reset, 181*0906b99fSMurthy NSSR .queue_pair_setup = NULL, 182*0906b99fSMurthy NSSR .queue_pair_release = NULL, 183*0906b99fSMurthy NSSR .queue_pair_count = NULL, 184*0906b99fSMurthy NSSR 185*0906b99fSMurthy NSSR /* Crypto related operations */ 186*0906b99fSMurthy NSSR .sym_session_get_size = NULL, 187*0906b99fSMurthy NSSR .sym_session_configure = NULL, 188*0906b99fSMurthy NSSR .sym_session_clear = NULL 189*0906b99fSMurthy NSSR }; 190*0906b99fSMurthy NSSR 191273487f7SAnoob Joseph static void 192273487f7SAnoob Joseph otx_cpt_common_vars_init(struct cpt_vf *cptvf) 193273487f7SAnoob Joseph { 194273487f7SAnoob Joseph cptvf->meta_info.cptvf_meta_pool = otx_cpt_meta_pool; 195273487f7SAnoob Joseph cptvf->meta_info.cptvf_op_mlen = otx_cpt_op_mlen; 196273487f7SAnoob Joseph cptvf->meta_info.cptvf_op_sb_mlen = otx_cpt_op_sb_mlen; 197273487f7SAnoob Joseph } 198273487f7SAnoob Joseph 199bfe2ae49SAnoob Joseph int 200bfe2ae49SAnoob Joseph otx_cpt_dev_create(struct rte_cryptodev *c_dev) 201bfe2ae49SAnoob Joseph { 2020dc1cffaSAnkur Dwivedi struct rte_pci_device *pdev = RTE_DEV_TO_PCI(c_dev->device); 2030dc1cffaSAnkur Dwivedi struct cpt_vf *cptvf = NULL; 2040dc1cffaSAnkur Dwivedi void *reg_base; 2050dc1cffaSAnkur Dwivedi char dev_name[32]; 2060dc1cffaSAnkur Dwivedi int ret; 2070dc1cffaSAnkur Dwivedi 2080dc1cffaSAnkur Dwivedi if (pdev->mem_resource[0].phys_addr == 0ULL) 2090dc1cffaSAnkur Dwivedi return -EIO; 2100dc1cffaSAnkur Dwivedi 2110dc1cffaSAnkur Dwivedi /* for secondary processes, we don't initialise any further as primary 2120dc1cffaSAnkur Dwivedi * has already done this work. 2130dc1cffaSAnkur Dwivedi */ 2140dc1cffaSAnkur Dwivedi if (rte_eal_process_type() != RTE_PROC_PRIMARY) 215bfe2ae49SAnoob Joseph return 0; 2160dc1cffaSAnkur Dwivedi 2170dc1cffaSAnkur Dwivedi cptvf = rte_zmalloc_socket("otx_cryptodev_private_mem", 2180dc1cffaSAnkur Dwivedi sizeof(struct cpt_vf), RTE_CACHE_LINE_SIZE, 2190dc1cffaSAnkur Dwivedi rte_socket_id()); 2200dc1cffaSAnkur Dwivedi 2210dc1cffaSAnkur Dwivedi if (cptvf == NULL) { 2220dc1cffaSAnkur Dwivedi CPT_LOG_ERR("Cannot allocate memory for device private data"); 2230dc1cffaSAnkur Dwivedi return -ENOMEM; 2240dc1cffaSAnkur Dwivedi } 2250dc1cffaSAnkur Dwivedi 2260dc1cffaSAnkur Dwivedi snprintf(dev_name, 32, "%02x:%02x.%x", 2270dc1cffaSAnkur Dwivedi pdev->addr.bus, pdev->addr.devid, pdev->addr.function); 2280dc1cffaSAnkur Dwivedi 2290dc1cffaSAnkur Dwivedi reg_base = pdev->mem_resource[0].addr; 2300dc1cffaSAnkur Dwivedi if (!reg_base) { 2310dc1cffaSAnkur Dwivedi CPT_LOG_ERR("Failed to map BAR0 of %s", dev_name); 2320dc1cffaSAnkur Dwivedi ret = -ENODEV; 2330dc1cffaSAnkur Dwivedi goto fail; 2340dc1cffaSAnkur Dwivedi } 2350dc1cffaSAnkur Dwivedi 2360dc1cffaSAnkur Dwivedi ret = otx_cpt_hw_init(cptvf, pdev, reg_base, dev_name); 2370dc1cffaSAnkur Dwivedi if (ret) { 2380dc1cffaSAnkur Dwivedi CPT_LOG_ERR("Failed to init cptvf %s", dev_name); 2390dc1cffaSAnkur Dwivedi ret = -EIO; 2400dc1cffaSAnkur Dwivedi goto fail; 2410dc1cffaSAnkur Dwivedi } 2420dc1cffaSAnkur Dwivedi 2430dc1cffaSAnkur Dwivedi /* Start off timer for mailbox interrupts */ 2440dc1cffaSAnkur Dwivedi otx_cpt_periodic_alarm_start(cptvf); 2450dc1cffaSAnkur Dwivedi 246273487f7SAnoob Joseph rte_spinlock_lock(&otx_probe_count_lock); 247273487f7SAnoob Joseph if (!otx_cryptodev_probe_count) { 248273487f7SAnoob Joseph ret = init_global_resources(); 249273487f7SAnoob Joseph if (ret) { 250273487f7SAnoob Joseph rte_spinlock_unlock(&otx_probe_count_lock); 251273487f7SAnoob Joseph goto init_fail; 252273487f7SAnoob Joseph } 253273487f7SAnoob Joseph } 254273487f7SAnoob Joseph otx_cryptodev_probe_count++; 255273487f7SAnoob Joseph rte_spinlock_unlock(&otx_probe_count_lock); 256273487f7SAnoob Joseph 257273487f7SAnoob Joseph /* Initialize data path variables used by common code */ 258273487f7SAnoob Joseph otx_cpt_common_vars_init(cptvf); 259273487f7SAnoob Joseph 260*0906b99fSMurthy NSSR c_dev->dev_ops = &cptvf_ops; 2610dc1cffaSAnkur Dwivedi 2620dc1cffaSAnkur Dwivedi c_dev->enqueue_burst = NULL; 2630dc1cffaSAnkur Dwivedi c_dev->dequeue_burst = NULL; 2640dc1cffaSAnkur Dwivedi 2650dc1cffaSAnkur Dwivedi c_dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO | 2660dc1cffaSAnkur Dwivedi RTE_CRYPTODEV_FF_HW_ACCELERATED | 2670dc1cffaSAnkur Dwivedi RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING | 2680dc1cffaSAnkur Dwivedi RTE_CRYPTODEV_FF_IN_PLACE_SGL | 2690dc1cffaSAnkur Dwivedi RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT | 2700dc1cffaSAnkur Dwivedi RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT; 2710dc1cffaSAnkur Dwivedi 2720dc1cffaSAnkur Dwivedi /* Save dev private data */ 2730dc1cffaSAnkur Dwivedi c_dev->data->dev_private = cptvf; 2740dc1cffaSAnkur Dwivedi 2750dc1cffaSAnkur Dwivedi return 0; 2760dc1cffaSAnkur Dwivedi 277273487f7SAnoob Joseph init_fail: 278273487f7SAnoob Joseph otx_cpt_periodic_alarm_stop(cptvf); 279273487f7SAnoob Joseph otx_cpt_deinit_device(cptvf); 280273487f7SAnoob Joseph 2810dc1cffaSAnkur Dwivedi fail: 2820dc1cffaSAnkur Dwivedi if (cptvf) { 2830dc1cffaSAnkur Dwivedi /* Free private data allocated */ 2840dc1cffaSAnkur Dwivedi rte_free(cptvf); 2850dc1cffaSAnkur Dwivedi } 2860dc1cffaSAnkur Dwivedi 2870dc1cffaSAnkur Dwivedi return ret; 288bfe2ae49SAnoob Joseph } 289