xref: /dpdk/drivers/common/nitrox/nitrox_device.c (revision 024a8abb8966c32beb79f3b772ab5f15225f760b)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4 
5 #include <rte_malloc.h>
6 
7 #include "nitrox_device.h"
8 #include "nitrox_hal.h"
9 #include "nitrox_sym.h"
10 
11 #define PCI_VENDOR_ID_CAVIUM	0x177d
12 #define NITROX_V_PCI_VF_DEV_ID	0x13
13 
14 TAILQ_HEAD(ndev_list, nitrox_device);
15 static struct ndev_list ndev_list = TAILQ_HEAD_INITIALIZER(ndev_list);
16 
17 static struct nitrox_device *
18 ndev_allocate(struct rte_pci_device *pdev)
19 {
20 	struct nitrox_device *ndev;
21 
22 	ndev = rte_zmalloc_socket("nitrox device", sizeof(*ndev),
23 				   RTE_CACHE_LINE_SIZE,
24 				   pdev->device.numa_node);
25 	if (!ndev)
26 		return NULL;
27 
28 	TAILQ_INSERT_TAIL(&ndev_list, ndev, next);
29 	return ndev;
30 }
31 
32 static void
33 ndev_init(struct nitrox_device *ndev, struct rte_pci_device *pdev)
34 {
35 	enum nitrox_vf_mode vf_mode;
36 
37 	ndev->pdev = pdev;
38 	ndev->bar_addr = pdev->mem_resource[0].addr;
39 	vf_mode = vf_get_vf_config_mode(ndev->bar_addr);
40 	ndev->nr_queues = vf_config_mode_to_nr_queues(vf_mode);
41 }
42 
43 static struct nitrox_device *
44 find_ndev(struct rte_pci_device *pdev)
45 {
46 	struct nitrox_device *ndev;
47 
48 	TAILQ_FOREACH(ndev, &ndev_list, next)
49 		if (ndev->pdev == pdev)
50 			return ndev;
51 
52 	return NULL;
53 }
54 
55 static void
56 ndev_release(struct nitrox_device *ndev)
57 {
58 	if (!ndev)
59 		return;
60 
61 	TAILQ_REMOVE(&ndev_list, ndev, next);
62 	rte_free(ndev);
63 }
64 
65 static int
66 nitrox_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
67 		struct rte_pci_device *pdev)
68 {
69 	struct nitrox_device *ndev;
70 	int err;
71 
72 	/* Nitrox CSR space */
73 	if (!pdev->mem_resource[0].addr)
74 		return -EINVAL;
75 
76 	ndev = ndev_allocate(pdev);
77 	if (!ndev)
78 		return -ENOMEM;
79 
80 	ndev_init(ndev, pdev);
81 	err = nitrox_sym_pmd_create(ndev);
82 	if (err) {
83 		ndev_release(ndev);
84 		return err;
85 	}
86 
87 	return 0;
88 }
89 
90 static int
91 nitrox_pci_remove(struct rte_pci_device *pdev)
92 {
93 	struct nitrox_device *ndev;
94 	int err;
95 
96 	ndev = find_ndev(pdev);
97 	if (!ndev)
98 		return -ENODEV;
99 
100 	err = nitrox_sym_pmd_destroy(ndev);
101 	if (err)
102 		return err;
103 
104 	ndev_release(ndev);
105 	return 0;
106 }
107 
108 static struct rte_pci_id pci_id_nitrox_map[] = {
109 	{
110 		/* Nitrox 5 VF */
111 		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, NITROX_V_PCI_VF_DEV_ID)
112 	},
113 	{.device_id = 0},
114 };
115 
116 static struct rte_pci_driver nitrox_pmd = {
117 	.id_table       = pci_id_nitrox_map,
118 	.drv_flags      = RTE_PCI_DRV_NEED_MAPPING,
119 	.probe          = nitrox_pci_probe,
120 	.remove         = nitrox_pci_remove,
121 };
122 
123 __rte_weak int
124 nitrox_sym_pmd_create(struct nitrox_device *ndev)
125 {
126 	RTE_SET_USED(ndev);
127 	return 0;
128 }
129 
130 __rte_weak int
131 nitrox_sym_pmd_destroy(struct nitrox_device *ndev)
132 {
133 	RTE_SET_USED(ndev);
134 	return 0;
135 }
136 
137 RTE_PMD_REGISTER_PCI(nitrox, nitrox_pmd);
138 RTE_PMD_REGISTER_PCI_TABLE(nitrox, pci_id_nitrox_map);
139