raw/ioat: probe idxd vdev
[dpdk.git] / drivers / raw / ioat / ioat_common.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2020 Intel Corporation
3  */
4
5 #include <rte_rawdev_pmd.h>
6 #include <rte_memzone.h>
7 #include <rte_common.h>
8
9 #include "ioat_private.h"
10
11 int
12 idxd_rawdev_close(struct rte_rawdev *dev __rte_unused)
13 {
14         return 0;
15 }
16
17 int
18 idxd_rawdev_create(const char *name, struct rte_device *dev,
19                    const struct idxd_rawdev *base_idxd,
20                    const struct rte_rawdev_ops *ops)
21 {
22         struct idxd_rawdev *idxd;
23         struct rte_rawdev *rawdev = NULL;
24         const struct rte_memzone *mz = NULL;
25         char mz_name[RTE_MEMZONE_NAMESIZE];
26         int ret = 0;
27
28         if (!name) {
29                 IOAT_PMD_ERR("Invalid name of the device!");
30                 ret = -EINVAL;
31                 goto cleanup;
32         }
33
34         /* Allocate device structure */
35         rawdev = rte_rawdev_pmd_allocate(name, sizeof(struct idxd_rawdev),
36                                          dev->numa_node);
37         if (rawdev == NULL) {
38                 IOAT_PMD_ERR("Unable to allocate raw device");
39                 ret = -ENOMEM;
40                 goto cleanup;
41         }
42
43         snprintf(mz_name, sizeof(mz_name), "rawdev%u_private", rawdev->dev_id);
44         mz = rte_memzone_reserve(mz_name, sizeof(struct idxd_rawdev),
45                         dev->numa_node, RTE_MEMZONE_IOVA_CONTIG);
46         if (mz == NULL) {
47                 IOAT_PMD_ERR("Unable to reserve memzone for private data\n");
48                 ret = -ENOMEM;
49                 goto cleanup;
50         }
51         rawdev->dev_private = mz->addr;
52         rawdev->dev_ops = ops;
53         rawdev->device = dev;
54         rawdev->driver_name = IOAT_PMD_RAWDEV_NAME_STR;
55
56         idxd = rawdev->dev_private;
57         *idxd = *base_idxd; /* copy over the main fields already passed in */
58         idxd->rawdev = rawdev;
59         idxd->mz = mz;
60
61         return 0;
62
63 cleanup:
64         if (rawdev)
65                 rte_rawdev_pmd_release(rawdev);
66
67         return ret;
68 }