1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2021-2024 Advanced Micro Devices, Inc. 3 */ 4 5 #include <stdint.h> 6 #include <errno.h> 7 8 #include <rte_errno.h> 9 #include <rte_common.h> 10 #include <rte_log.h> 11 #include <rte_eal.h> 12 #include <bus_vdev_driver.h> 13 #include <rte_dev.h> 14 #include <rte_string_fns.h> 15 16 #include "ionic_crypto.h" 17 18 #define IOCPT_VDEV_DEV_BAR 0 19 #define IOCPT_VDEV_INTR_CTL_BAR 1 20 #define IOCPT_VDEV_INTR_CFG_BAR 2 21 #define IOCPT_VDEV_DB_BAR 3 22 #define IOCPT_VDEV_BARS_MAX 4 23 24 #define IOCPT_VDEV_DEV_INFO_REGS_OFFSET 0x0000 25 #define IOCPT_VDEV_DEV_CMD_REGS_OFFSET 0x0800 26 27 static int 28 iocpt_vdev_setup_bars(struct iocpt_dev *dev) 29 { 30 IOCPT_PRINT_CALL(); 31 32 dev->name = rte_vdev_device_name(dev->bus_dev); 33 34 return 0; 35 } 36 37 static void 38 iocpt_vdev_unmap_bars(struct iocpt_dev *dev) 39 { 40 struct iocpt_dev_bars *bars = &dev->bars; 41 uint32_t i; 42 43 for (i = 0; i < IOCPT_VDEV_BARS_MAX; i++) 44 ionic_uio_rel_rsrc(dev->name, i, &bars->bar[i]); 45 } 46 47 static uint8_t iocpt_vdev_driver_id; 48 static const struct iocpt_dev_intf iocpt_vdev_intf = { 49 .setup_bars = iocpt_vdev_setup_bars, 50 .unmap_bars = iocpt_vdev_unmap_bars, 51 }; 52 53 static int 54 iocpt_vdev_probe(struct rte_vdev_device *vdev) 55 { 56 struct iocpt_dev_bars bars = {}; 57 const char *name = rte_vdev_device_name(vdev); 58 unsigned int i; 59 60 IOCPT_PRINT(NOTICE, "Initializing device %s%s", name, 61 rte_eal_process_type() == RTE_PROC_SECONDARY ? 62 " [SECONDARY]" : ""); 63 64 ionic_uio_scan_mcrypt_devices(); 65 66 for (i = 0; i < IOCPT_VDEV_BARS_MAX; i++) 67 ionic_uio_get_rsrc(name, i, &bars.bar[i]); 68 69 bars.num_bars = IOCPT_VDEV_BARS_MAX; 70 71 return iocpt_probe((void *)vdev, &vdev->device, 72 &bars, &iocpt_vdev_intf, 73 iocpt_vdev_driver_id, rte_socket_id()); 74 } 75 76 static int 77 iocpt_vdev_remove(struct rte_vdev_device *vdev) 78 { 79 return iocpt_remove(&vdev->device); 80 } 81 82 static struct rte_vdev_driver rte_vdev_iocpt_pmd = { 83 .probe = iocpt_vdev_probe, 84 .remove = iocpt_vdev_remove, 85 }; 86 87 static struct cryptodev_driver rte_vdev_iocpt_drv; 88 89 RTE_PMD_REGISTER_VDEV(crypto_ionic, rte_vdev_iocpt_pmd); 90 RTE_PMD_REGISTER_CRYPTO_DRIVER(rte_vdev_iocpt_drv, rte_vdev_iocpt_pmd.driver, 91 iocpt_vdev_driver_id); 92