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