raw/octeontx2_dma: add build infra and device probe
[dpdk.git] / drivers / raw / octeontx2_dma / otx2_dpi_rawdev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #include <string.h>
6 #include <unistd.h>
7
8 #include <rte_bus.h>
9 #include <rte_bus_pci.h>
10 #include <rte_common.h>
11 #include <rte_eal.h>
12 #include <rte_lcore.h>
13 #include <rte_pci.h>
14 #include <rte_rawdev.h>
15 #include <rte_rawdev_pmd.h>
16
17 #include <otx2_common.h>
18
19 static const struct rte_pci_id pci_dma_map[] = {
20         {
21                 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
22                                PCI_DEVID_OCTEONTX2_DPI_VF)
23         },
24         {
25                 .vendor_id = 0,
26         },
27 };
28
29 static int
30 otx2_dpi_rawdev_probe(struct rte_pci_driver *pci_drv __rte_unused,
31                       struct rte_pci_device *pci_dev)
32 {
33         char name[RTE_RAWDEV_NAME_MAX_LEN];
34         struct rte_rawdev *rawdev;
35
36         /* For secondary processes, the primary has done all the work */
37         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
38                 return 0;
39
40         if (pci_dev->mem_resource[0].addr == NULL) {
41                 otx2_dpi_dbg("Empty bars %p %p", pci_dev->mem_resource[0].addr,
42                              pci_dev->mem_resource[2].addr);
43                 return -ENODEV;
44         }
45
46         memset(name, 0, sizeof(name));
47         snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "DPI:%x:%02x.%x",
48                  pci_dev->addr.bus, pci_dev->addr.devid,
49                  pci_dev->addr.function);
50
51         /* Allocate device structure */
52         rawdev = rte_rawdev_pmd_allocate(name, 0, rte_socket_id());
53         if (rawdev == NULL) {
54                 otx2_err("Rawdev allocation failed");
55                 return -EINVAL;
56         }
57
58         rawdev->device = &pci_dev->device;
59         rawdev->driver_name = pci_dev->driver->driver.name;
60
61         return 0;
62 }
63
64 static int
65 otx2_dpi_rawdev_remove(struct rte_pci_device *pci_dev)
66 {
67         char name[RTE_RAWDEV_NAME_MAX_LEN];
68         struct rte_rawdev *rawdev;
69
70         if (pci_dev == NULL) {
71                 otx2_dpi_dbg("Invalid pci_dev of the device!");
72                 return -EINVAL;
73         }
74
75         memset(name, 0, sizeof(name));
76         snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "DPI:%x:%02x.%x",
77                  pci_dev->addr.bus, pci_dev->addr.devid,
78                  pci_dev->addr.function);
79
80         rawdev = rte_rawdev_pmd_get_named_dev(name);
81         if (rawdev == NULL) {
82                 otx2_dpi_dbg("Invalid device name (%s)", name);
83                 return -EINVAL;
84         }
85
86         /* rte_rawdev_close is called by pmd_release */
87         return rte_rawdev_pmd_release(rawdev);
88 }
89
90 static struct rte_pci_driver rte_dpi_rawdev_pmd = {
91         .id_table  = pci_dma_map,
92         .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
93         .probe     = otx2_dpi_rawdev_probe,
94         .remove    = otx2_dpi_rawdev_remove,
95 };
96
97 RTE_PMD_REGISTER_PCI(dpi_rawdev_pci_driver, rte_dpi_rawdev_pmd);
98 RTE_PMD_REGISTER_PCI_TABLE(dpi_rawdev_pci_driver, pci_dma_map);
99 RTE_PMD_REGISTER_KMOD_DEP(dpi_rawdev_pci_driver, "vfio-pci");