xref: /dpdk/drivers/crypto/ionic/ionic_crypto_vdev.c (revision 4610ac932fcbcc6279095e927390bdf877f728ab)
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