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