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