1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
9 #include <rte_bus_pci.h>
10 #include <rte_common.h>
12 #include <rte_lcore.h>
14 #include <rte_rawdev.h>
15 #include <rte_rawdev_pmd.h>
17 #include <otx2_common.h>
19 static const struct rte_pci_id pci_dma_map[] = {
21 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
22 PCI_DEVID_OCTEONTX2_DPI_VF)
30 otx2_dpi_rawdev_probe(struct rte_pci_driver *pci_drv __rte_unused,
31 struct rte_pci_device *pci_dev)
33 char name[RTE_RAWDEV_NAME_MAX_LEN];
34 struct rte_rawdev *rawdev;
36 /* For secondary processes, the primary has done all the work */
37 if (rte_eal_process_type() != RTE_PROC_PRIMARY)
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);
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);
51 /* Allocate device structure */
52 rawdev = rte_rawdev_pmd_allocate(name, 0, rte_socket_id());
54 otx2_err("Rawdev allocation failed");
58 rawdev->device = &pci_dev->device;
59 rawdev->driver_name = pci_dev->driver->driver.name;
65 otx2_dpi_rawdev_remove(struct rte_pci_device *pci_dev)
67 char name[RTE_RAWDEV_NAME_MAX_LEN];
68 struct rte_rawdev *rawdev;
70 if (pci_dev == NULL) {
71 otx2_dpi_dbg("Invalid pci_dev of the device!");
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);
80 rawdev = rte_rawdev_pmd_get_named_dev(name);
82 otx2_dpi_dbg("Invalid device name (%s)", name);
86 /* rte_rawdev_close is called by pmd_release */
87 return rte_rawdev_pmd_release(rawdev);
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,
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");