xref: /dpdk/drivers/crypto/ionic/ionic_crypto_main.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 <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