1*4610ac93SAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause 2*4610ac93SAndrew Boyer * Copyright 2021-2024 Advanced Micro Devices, Inc. 3*4610ac93SAndrew Boyer */ 4*4610ac93SAndrew Boyer 5*4610ac93SAndrew Boyer #include <inttypes.h> 6*4610ac93SAndrew Boyer 7*4610ac93SAndrew Boyer #include <rte_common.h> 8*4610ac93SAndrew Boyer #include <rte_malloc.h> 9*4610ac93SAndrew Boyer #include <rte_bitops.h> 10*4610ac93SAndrew Boyer 11*4610ac93SAndrew Boyer #include "ionic_crypto.h" 12*4610ac93SAndrew Boyer 13*4610ac93SAndrew Boyer static int 14*4610ac93SAndrew Boyer iocpt_init(struct iocpt_dev *dev) 15*4610ac93SAndrew Boyer { 16*4610ac93SAndrew Boyer dev->state |= IOCPT_DEV_F_INITED; 17*4610ac93SAndrew Boyer 18*4610ac93SAndrew Boyer return 0; 19*4610ac93SAndrew Boyer } 20*4610ac93SAndrew Boyer 21*4610ac93SAndrew Boyer void 22*4610ac93SAndrew Boyer iocpt_configure(struct iocpt_dev *dev) 23*4610ac93SAndrew Boyer { 24*4610ac93SAndrew Boyer RTE_SET_USED(dev); 25*4610ac93SAndrew Boyer } 26*4610ac93SAndrew Boyer 27*4610ac93SAndrew Boyer void 28*4610ac93SAndrew Boyer iocpt_deinit(struct iocpt_dev *dev) 29*4610ac93SAndrew Boyer { 30*4610ac93SAndrew Boyer IOCPT_PRINT_CALL(); 31*4610ac93SAndrew Boyer 32*4610ac93SAndrew Boyer if (!(dev->state & IOCPT_DEV_F_INITED)) 33*4610ac93SAndrew Boyer return; 34*4610ac93SAndrew Boyer 35*4610ac93SAndrew Boyer dev->state &= ~IOCPT_DEV_F_INITED; 36*4610ac93SAndrew Boyer } 37*4610ac93SAndrew Boyer 38*4610ac93SAndrew Boyer static int 39*4610ac93SAndrew Boyer iocpt_devargs(struct rte_devargs *devargs, struct iocpt_dev *dev) 40*4610ac93SAndrew Boyer { 41*4610ac93SAndrew Boyer RTE_SET_USED(devargs); 42*4610ac93SAndrew Boyer RTE_SET_USED(dev); 43*4610ac93SAndrew Boyer 44*4610ac93SAndrew Boyer return 0; 45*4610ac93SAndrew Boyer } 46*4610ac93SAndrew Boyer 47*4610ac93SAndrew Boyer int 48*4610ac93SAndrew Boyer iocpt_probe(void *bus_dev, struct rte_device *rte_dev, 49*4610ac93SAndrew Boyer struct iocpt_dev_bars *bars, const struct iocpt_dev_intf *intf, 50*4610ac93SAndrew Boyer uint8_t driver_id, uint8_t socket_id) 51*4610ac93SAndrew Boyer { 52*4610ac93SAndrew Boyer struct rte_cryptodev_pmd_init_params init_params = { 53*4610ac93SAndrew Boyer "iocpt", 54*4610ac93SAndrew Boyer sizeof(struct iocpt_dev), 55*4610ac93SAndrew Boyer socket_id, 56*4610ac93SAndrew Boyer RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS 57*4610ac93SAndrew Boyer }; 58*4610ac93SAndrew Boyer struct rte_cryptodev *cdev; 59*4610ac93SAndrew Boyer struct iocpt_dev *dev; 60*4610ac93SAndrew Boyer uint32_t i; 61*4610ac93SAndrew Boyer int err; 62*4610ac93SAndrew Boyer 63*4610ac93SAndrew Boyer if (rte_eal_process_type() != RTE_PROC_PRIMARY) { 64*4610ac93SAndrew Boyer IOCPT_PRINT(ERR, "Multi-process not supported"); 65*4610ac93SAndrew Boyer err = -EPERM; 66*4610ac93SAndrew Boyer goto err; 67*4610ac93SAndrew Boyer } 68*4610ac93SAndrew Boyer 69*4610ac93SAndrew Boyer cdev = rte_cryptodev_pmd_create(rte_dev->name, rte_dev, &init_params); 70*4610ac93SAndrew Boyer if (cdev == NULL) { 71*4610ac93SAndrew Boyer IOCPT_PRINT(ERR, "Out of memory"); 72*4610ac93SAndrew Boyer err = -ENOMEM; 73*4610ac93SAndrew Boyer goto err; 74*4610ac93SAndrew Boyer } 75*4610ac93SAndrew Boyer 76*4610ac93SAndrew Boyer dev = cdev->data->dev_private; 77*4610ac93SAndrew Boyer dev->crypto_dev = cdev; 78*4610ac93SAndrew Boyer dev->bus_dev = bus_dev; 79*4610ac93SAndrew Boyer dev->intf = intf; 80*4610ac93SAndrew Boyer dev->driver_id = driver_id; 81*4610ac93SAndrew Boyer dev->socket_id = socket_id; 82*4610ac93SAndrew Boyer 83*4610ac93SAndrew Boyer for (i = 0; i < bars->num_bars; i++) { 84*4610ac93SAndrew Boyer struct ionic_dev_bar *bar = &bars->bar[i]; 85*4610ac93SAndrew Boyer 86*4610ac93SAndrew Boyer IOCPT_PRINT(DEBUG, 87*4610ac93SAndrew Boyer "bar[%u] = { .va = %p, .pa = %#jx, .len = %lu }", 88*4610ac93SAndrew Boyer i, bar->vaddr, bar->bus_addr, bar->len); 89*4610ac93SAndrew Boyer if (bar->vaddr == NULL) { 90*4610ac93SAndrew Boyer IOCPT_PRINT(ERR, "Null bar found, aborting"); 91*4610ac93SAndrew Boyer err = -EFAULT; 92*4610ac93SAndrew Boyer goto err_destroy_crypto_dev; 93*4610ac93SAndrew Boyer } 94*4610ac93SAndrew Boyer 95*4610ac93SAndrew Boyer dev->bars.bar[i].vaddr = bar->vaddr; 96*4610ac93SAndrew Boyer dev->bars.bar[i].bus_addr = bar->bus_addr; 97*4610ac93SAndrew Boyer dev->bars.bar[i].len = bar->len; 98*4610ac93SAndrew Boyer } 99*4610ac93SAndrew Boyer dev->bars.num_bars = bars->num_bars; 100*4610ac93SAndrew Boyer 101*4610ac93SAndrew Boyer err = iocpt_devargs(rte_dev->devargs, dev); 102*4610ac93SAndrew Boyer if (err != 0) { 103*4610ac93SAndrew Boyer IOCPT_PRINT(ERR, "Cannot parse device arguments"); 104*4610ac93SAndrew Boyer goto err_destroy_crypto_dev; 105*4610ac93SAndrew Boyer } 106*4610ac93SAndrew Boyer 107*4610ac93SAndrew Boyer err = iocpt_setup_bars(dev); 108*4610ac93SAndrew Boyer if (err != 0) { 109*4610ac93SAndrew Boyer IOCPT_PRINT(ERR, "Cannot setup BARs: %d, aborting", err); 110*4610ac93SAndrew Boyer goto err_destroy_crypto_dev; 111*4610ac93SAndrew Boyer } 112*4610ac93SAndrew Boyer 113*4610ac93SAndrew Boyer err = iocpt_init(dev); 114*4610ac93SAndrew Boyer if (err != 0) { 115*4610ac93SAndrew Boyer IOCPT_PRINT(ERR, "Cannot init device: %d, aborting", err); 116*4610ac93SAndrew Boyer goto err_destroy_crypto_dev; 117*4610ac93SAndrew Boyer } 118*4610ac93SAndrew Boyer 119*4610ac93SAndrew Boyer return 0; 120*4610ac93SAndrew Boyer 121*4610ac93SAndrew Boyer err_destroy_crypto_dev: 122*4610ac93SAndrew Boyer rte_cryptodev_pmd_destroy(cdev); 123*4610ac93SAndrew Boyer err: 124*4610ac93SAndrew Boyer return err; 125*4610ac93SAndrew Boyer } 126*4610ac93SAndrew Boyer 127*4610ac93SAndrew Boyer int 128*4610ac93SAndrew Boyer iocpt_remove(struct rte_device *rte_dev) 129*4610ac93SAndrew Boyer { 130*4610ac93SAndrew Boyer struct rte_cryptodev *cdev; 131*4610ac93SAndrew Boyer struct iocpt_dev *dev; 132*4610ac93SAndrew Boyer 133*4610ac93SAndrew Boyer cdev = rte_cryptodev_pmd_get_named_dev(rte_dev->name); 134*4610ac93SAndrew Boyer if (cdev == NULL) { 135*4610ac93SAndrew Boyer IOCPT_PRINT(DEBUG, "Cannot find device %s", rte_dev->name); 136*4610ac93SAndrew Boyer return -ENODEV; 137*4610ac93SAndrew Boyer } 138*4610ac93SAndrew Boyer 139*4610ac93SAndrew Boyer dev = cdev->data->dev_private; 140*4610ac93SAndrew Boyer 141*4610ac93SAndrew Boyer iocpt_deinit(dev); 142*4610ac93SAndrew Boyer 143*4610ac93SAndrew Boyer rte_cryptodev_pmd_destroy(cdev); 144*4610ac93SAndrew Boyer 145*4610ac93SAndrew Boyer return 0; 146*4610ac93SAndrew Boyer } 147*4610ac93SAndrew Boyer 148*4610ac93SAndrew Boyer RTE_LOG_REGISTER_DEFAULT(iocpt_logtype, NOTICE); 149