crypto/caam_jr: introduce basic driver
[dpdk.git] / drivers / crypto / caam_jr / caam_jr.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2017-2018 NXP
3  */
4
5 #include <fcntl.h>
6 #include <unistd.h>
7 #include <sched.h>
8 #include <net/if.h>
9
10 #include <rte_byteorder.h>
11 #include <rte_common.h>
12 #include <rte_cryptodev_pmd.h>
13 #include <rte_crypto.h>
14 #include <rte_cryptodev.h>
15 #include <rte_bus_vdev.h>
16 #include <rte_malloc.h>
17 #include <rte_security_driver.h>
18 #include <rte_hexdump.h>
19
20 #include <caam_jr_log.h>
21
22 #define CRYPTODEV_NAME_CAAM_JR_PMD      crypto_caam_jr
23 static uint8_t cryptodev_driver_id;
24 int caam_jr_logtype;
25
26 /*
27  * @brief Release the resources used by the SEC user space driver.
28  *
29  * Reset and release SEC's job rings indicated by the User Application at
30  * init_job_ring() and free any memory allocated internally.
31  * Call once during application tear down.
32  *
33  * @note In case there are any descriptors in-flight (descriptors received by
34  * SEC driver for processing and for which no response was yet provided to UA),
35  * the descriptors are discarded without any notifications to User Application.
36  *
37  * @retval ::0                  is returned for a successful execution
38  * @retval ::-1         is returned if SEC driver release is in progress
39  */
40 static int
41 caam_jr_dev_uninit(struct rte_cryptodev *dev)
42 {
43         if (dev == NULL)
44                 return -ENODEV;
45
46         CAAM_JR_INFO("Closing crypto device %s", dev->data->name);
47
48         return 0;
49 }
50
51 static int
52 caam_jr_dev_init(const char *name,
53                  struct rte_vdev_device *vdev,
54                  struct rte_cryptodev_pmd_init_params *init_params)
55 {
56         struct rte_cryptodev *dev;
57
58         PMD_INIT_FUNC_TRACE();
59
60         dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
61         if (dev == NULL) {
62                 CAAM_JR_ERR("failed to create cryptodev vdev");
63                 goto cleanup;
64         }
65
66         dev->driver_id = cryptodev_driver_id;
67         dev->dev_ops = NULL;
68
69         /* For secondary processes, we don't initialise any further as primary
70          * has already done this work. Only check we don't need a different
71          * RX function
72          */
73         if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
74                 CAAM_JR_WARN("Device already init by primary process");
75                 return 0;
76         }
77
78         RTE_LOG(INFO, PMD, "%s cryptodev init\n", dev->data->name);
79
80         return 0;
81
82 cleanup:
83         CAAM_JR_ERR("driver %s: cryptodev_caam_jr_create failed",
84                         init_params->name);
85
86         return -ENXIO;
87 }
88
89 /** Initialise CAAM JR crypto device */
90 static int
91 cryptodev_caam_jr_probe(struct rte_vdev_device *vdev)
92 {
93         struct rte_cryptodev_pmd_init_params init_params = {
94                 "",
95                 128,
96                 rte_socket_id(),
97                 RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS
98         };
99         const char *name;
100         const char *input_args;
101
102         name = rte_vdev_device_name(vdev);
103         if (name == NULL)
104                 return -EINVAL;
105
106         input_args = rte_vdev_device_args(vdev);
107         rte_cryptodev_pmd_parse_input_args(&init_params, input_args);
108
109         return caam_jr_dev_init(name, vdev, &init_params);
110 }
111
112 /** Uninitialise CAAM JR crypto device */
113 static int
114 cryptodev_caam_jr_remove(struct rte_vdev_device *vdev)
115 {
116         struct rte_cryptodev *cryptodev;
117         const char *name;
118
119         name = rte_vdev_device_name(vdev);
120         if (name == NULL)
121                 return -EINVAL;
122
123         cryptodev = rte_cryptodev_pmd_get_named_dev(name);
124         if (cryptodev == NULL)
125                 return -ENODEV;
126
127         caam_jr_dev_uninit(cryptodev);
128
129         return rte_cryptodev_pmd_destroy(cryptodev);
130 }
131
132 static struct rte_vdev_driver cryptodev_caam_jr_drv = {
133         .probe = cryptodev_caam_jr_probe,
134         .remove = cryptodev_caam_jr_remove
135 };
136
137 static struct cryptodev_driver caam_jr_crypto_drv;
138
139 RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_CAAM_JR_PMD, cryptodev_caam_jr_drv);
140 RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_CAAM_JR_PMD,
141         "max_nb_queue_pairs=<int>"
142         "socket_id=<int>");
143 RTE_PMD_REGISTER_CRYPTO_DRIVER(caam_jr_crypto_drv, cryptodev_caam_jr_drv.driver,
144                 cryptodev_driver_id);
145
146 RTE_INIT(caam_jr_init_log)
147 {
148         caam_jr_logtype = rte_log_register("pmd.crypto.caam");
149         if (caam_jr_logtype >= 0)
150                 rte_log_set_level(caam_jr_logtype, RTE_LOG_NOTICE);
151 }