xref: /dpdk/drivers/common/nitrox/nitrox_device.c (revision b4ce35947b163435c50f8fe2a7d47ace09078e1e)
1024a8abbSNagadheeraj Rottela /* SPDX-License-Identifier: BSD-3-Clause
2024a8abbSNagadheeraj Rottela  * Copyright(C) 2019 Marvell International Ltd.
3024a8abbSNagadheeraj Rottela  */
4024a8abbSNagadheeraj Rottela 
5024a8abbSNagadheeraj Rottela #include <rte_malloc.h>
6024a8abbSNagadheeraj Rottela 
7024a8abbSNagadheeraj Rottela #include "nitrox_device.h"
8024a8abbSNagadheeraj Rottela #include "nitrox_hal.h"
9024a8abbSNagadheeraj Rottela #include "nitrox_sym.h"
10*b4ce3594SNagadheeraj Rottela #include "nitrox_comp.h"
11024a8abbSNagadheeraj Rottela 
12024a8abbSNagadheeraj Rottela #define PCI_VENDOR_ID_CAVIUM	0x177d
13024a8abbSNagadheeraj Rottela #define NITROX_V_PCI_VF_DEV_ID	0x13
14024a8abbSNagadheeraj Rottela 
15024a8abbSNagadheeraj Rottela TAILQ_HEAD(ndev_list, nitrox_device);
16024a8abbSNagadheeraj Rottela static struct ndev_list ndev_list = TAILQ_HEAD_INITIALIZER(ndev_list);
17024a8abbSNagadheeraj Rottela 
18024a8abbSNagadheeraj Rottela static struct nitrox_device *
ndev_allocate(struct rte_pci_device * pdev)19024a8abbSNagadheeraj Rottela ndev_allocate(struct rte_pci_device *pdev)
20024a8abbSNagadheeraj Rottela {
21024a8abbSNagadheeraj Rottela 	struct nitrox_device *ndev;
22024a8abbSNagadheeraj Rottela 
23024a8abbSNagadheeraj Rottela 	ndev = rte_zmalloc_socket("nitrox device", sizeof(*ndev),
24024a8abbSNagadheeraj Rottela 				   RTE_CACHE_LINE_SIZE,
25024a8abbSNagadheeraj Rottela 				   pdev->device.numa_node);
26024a8abbSNagadheeraj Rottela 	if (!ndev)
27024a8abbSNagadheeraj Rottela 		return NULL;
28024a8abbSNagadheeraj Rottela 
29024a8abbSNagadheeraj Rottela 	TAILQ_INSERT_TAIL(&ndev_list, ndev, next);
30024a8abbSNagadheeraj Rottela 	return ndev;
31024a8abbSNagadheeraj Rottela }
32024a8abbSNagadheeraj Rottela 
33024a8abbSNagadheeraj Rottela static void
ndev_init(struct nitrox_device * ndev,struct rte_pci_device * pdev)34024a8abbSNagadheeraj Rottela ndev_init(struct nitrox_device *ndev, struct rte_pci_device *pdev)
35024a8abbSNagadheeraj Rottela {
36024a8abbSNagadheeraj Rottela 	enum nitrox_vf_mode vf_mode;
37024a8abbSNagadheeraj Rottela 
38024a8abbSNagadheeraj Rottela 	ndev->pdev = pdev;
39024a8abbSNagadheeraj Rottela 	ndev->bar_addr = pdev->mem_resource[0].addr;
40024a8abbSNagadheeraj Rottela 	vf_mode = vf_get_vf_config_mode(ndev->bar_addr);
41024a8abbSNagadheeraj Rottela 	ndev->nr_queues = vf_config_mode_to_nr_queues(vf_mode);
42024a8abbSNagadheeraj Rottela }
43024a8abbSNagadheeraj Rottela 
44024a8abbSNagadheeraj Rottela static struct nitrox_device *
find_ndev(struct rte_pci_device * pdev)45024a8abbSNagadheeraj Rottela find_ndev(struct rte_pci_device *pdev)
46024a8abbSNagadheeraj Rottela {
47024a8abbSNagadheeraj Rottela 	struct nitrox_device *ndev;
48024a8abbSNagadheeraj Rottela 
49024a8abbSNagadheeraj Rottela 	TAILQ_FOREACH(ndev, &ndev_list, next)
50024a8abbSNagadheeraj Rottela 		if (ndev->pdev == pdev)
51024a8abbSNagadheeraj Rottela 			return ndev;
52024a8abbSNagadheeraj Rottela 
53024a8abbSNagadheeraj Rottela 	return NULL;
54024a8abbSNagadheeraj Rottela }
55024a8abbSNagadheeraj Rottela 
56024a8abbSNagadheeraj Rottela static void
ndev_release(struct nitrox_device * ndev)57024a8abbSNagadheeraj Rottela ndev_release(struct nitrox_device *ndev)
58024a8abbSNagadheeraj Rottela {
59024a8abbSNagadheeraj Rottela 	if (!ndev)
60024a8abbSNagadheeraj Rottela 		return;
61024a8abbSNagadheeraj Rottela 
62024a8abbSNagadheeraj Rottela 	TAILQ_REMOVE(&ndev_list, ndev, next);
63024a8abbSNagadheeraj Rottela 	rte_free(ndev);
64024a8abbSNagadheeraj Rottela }
65024a8abbSNagadheeraj Rottela 
66024a8abbSNagadheeraj Rottela static int
nitrox_pci_probe(struct rte_pci_driver * pci_drv __rte_unused,struct rte_pci_device * pdev)67024a8abbSNagadheeraj Rottela nitrox_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
68024a8abbSNagadheeraj Rottela 		struct rte_pci_device *pdev)
69024a8abbSNagadheeraj Rottela {
70024a8abbSNagadheeraj Rottela 	struct nitrox_device *ndev;
71*b4ce3594SNagadheeraj Rottela 	int err = -1;
72024a8abbSNagadheeraj Rottela 
73024a8abbSNagadheeraj Rottela 	/* Nitrox CSR space */
74024a8abbSNagadheeraj Rottela 	if (!pdev->mem_resource[0].addr)
75024a8abbSNagadheeraj Rottela 		return -EINVAL;
76024a8abbSNagadheeraj Rottela 
77024a8abbSNagadheeraj Rottela 	ndev = ndev_allocate(pdev);
78024a8abbSNagadheeraj Rottela 	if (!ndev)
79024a8abbSNagadheeraj Rottela 		return -ENOMEM;
80024a8abbSNagadheeraj Rottela 
81024a8abbSNagadheeraj Rottela 	ndev_init(ndev, pdev);
82024a8abbSNagadheeraj Rottela 	err = nitrox_sym_pmd_create(ndev);
83*b4ce3594SNagadheeraj Rottela 	if (err)
84*b4ce3594SNagadheeraj Rottela 		goto sym_pmd_err;
85*b4ce3594SNagadheeraj Rottela 
86*b4ce3594SNagadheeraj Rottela 	err = nitrox_comp_pmd_create(ndev);
87*b4ce3594SNagadheeraj Rottela 	if (err)
88*b4ce3594SNagadheeraj Rottela 		goto comp_pmd_err;
89024a8abbSNagadheeraj Rottela 
90024a8abbSNagadheeraj Rottela 	return 0;
91*b4ce3594SNagadheeraj Rottela 
92*b4ce3594SNagadheeraj Rottela comp_pmd_err:
93*b4ce3594SNagadheeraj Rottela 	nitrox_sym_pmd_destroy(ndev);
94*b4ce3594SNagadheeraj Rottela sym_pmd_err:
95*b4ce3594SNagadheeraj Rottela 	ndev_release(ndev);
96*b4ce3594SNagadheeraj Rottela 	return err;
97024a8abbSNagadheeraj Rottela }
98024a8abbSNagadheeraj Rottela 
99024a8abbSNagadheeraj Rottela static int
nitrox_pci_remove(struct rte_pci_device * pdev)100024a8abbSNagadheeraj Rottela nitrox_pci_remove(struct rte_pci_device *pdev)
101024a8abbSNagadheeraj Rottela {
102024a8abbSNagadheeraj Rottela 	struct nitrox_device *ndev;
103024a8abbSNagadheeraj Rottela 	int err;
104024a8abbSNagadheeraj Rottela 
105024a8abbSNagadheeraj Rottela 	ndev = find_ndev(pdev);
106024a8abbSNagadheeraj Rottela 	if (!ndev)
107024a8abbSNagadheeraj Rottela 		return -ENODEV;
108024a8abbSNagadheeraj Rottela 
109024a8abbSNagadheeraj Rottela 	err = nitrox_sym_pmd_destroy(ndev);
110024a8abbSNagadheeraj Rottela 	if (err)
111024a8abbSNagadheeraj Rottela 		return err;
112024a8abbSNagadheeraj Rottela 
113*b4ce3594SNagadheeraj Rottela 	err = nitrox_comp_pmd_destroy(ndev);
114*b4ce3594SNagadheeraj Rottela 	if (err)
115*b4ce3594SNagadheeraj Rottela 		return err;
116*b4ce3594SNagadheeraj Rottela 
117024a8abbSNagadheeraj Rottela 	ndev_release(ndev);
118024a8abbSNagadheeraj Rottela 	return 0;
119024a8abbSNagadheeraj Rottela }
120024a8abbSNagadheeraj Rottela 
121024a8abbSNagadheeraj Rottela static struct rte_pci_id pci_id_nitrox_map[] = {
122024a8abbSNagadheeraj Rottela 	{
123024a8abbSNagadheeraj Rottela 		/* Nitrox 5 VF */
124024a8abbSNagadheeraj Rottela 		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, NITROX_V_PCI_VF_DEV_ID)
125024a8abbSNagadheeraj Rottela 	},
126024a8abbSNagadheeraj Rottela 	{.device_id = 0},
127024a8abbSNagadheeraj Rottela };
128024a8abbSNagadheeraj Rottela 
129024a8abbSNagadheeraj Rottela static struct rte_pci_driver nitrox_pmd = {
130024a8abbSNagadheeraj Rottela 	.id_table       = pci_id_nitrox_map,
131024a8abbSNagadheeraj Rottela 	.drv_flags      = RTE_PCI_DRV_NEED_MAPPING,
132024a8abbSNagadheeraj Rottela 	.probe          = nitrox_pci_probe,
133024a8abbSNagadheeraj Rottela 	.remove         = nitrox_pci_remove,
134024a8abbSNagadheeraj Rottela };
135024a8abbSNagadheeraj Rottela 
136024a8abbSNagadheeraj Rottela __rte_weak int
nitrox_sym_pmd_create(struct nitrox_device * ndev)137024a8abbSNagadheeraj Rottela nitrox_sym_pmd_create(struct nitrox_device *ndev)
138024a8abbSNagadheeraj Rottela {
139024a8abbSNagadheeraj Rottela 	RTE_SET_USED(ndev);
140024a8abbSNagadheeraj Rottela 	return 0;
141024a8abbSNagadheeraj Rottela }
142024a8abbSNagadheeraj Rottela 
143024a8abbSNagadheeraj Rottela __rte_weak int
nitrox_sym_pmd_destroy(struct nitrox_device * ndev)144024a8abbSNagadheeraj Rottela nitrox_sym_pmd_destroy(struct nitrox_device *ndev)
145024a8abbSNagadheeraj Rottela {
146024a8abbSNagadheeraj Rottela 	RTE_SET_USED(ndev);
147024a8abbSNagadheeraj Rottela 	return 0;
148024a8abbSNagadheeraj Rottela }
149024a8abbSNagadheeraj Rottela 
150*b4ce3594SNagadheeraj Rottela __rte_weak int
nitrox_comp_pmd_create(struct nitrox_device * ndev)151*b4ce3594SNagadheeraj Rottela nitrox_comp_pmd_create(struct nitrox_device *ndev)
152*b4ce3594SNagadheeraj Rottela {
153*b4ce3594SNagadheeraj Rottela 	RTE_SET_USED(ndev);
154*b4ce3594SNagadheeraj Rottela 	return 0;
155*b4ce3594SNagadheeraj Rottela }
156*b4ce3594SNagadheeraj Rottela 
157*b4ce3594SNagadheeraj Rottela __rte_weak int
nitrox_comp_pmd_destroy(struct nitrox_device * ndev)158*b4ce3594SNagadheeraj Rottela nitrox_comp_pmd_destroy(struct nitrox_device *ndev)
159*b4ce3594SNagadheeraj Rottela {
160*b4ce3594SNagadheeraj Rottela 	RTE_SET_USED(ndev);
161*b4ce3594SNagadheeraj Rottela 	return 0;
162*b4ce3594SNagadheeraj Rottela }
163*b4ce3594SNagadheeraj Rottela 
164024a8abbSNagadheeraj Rottela RTE_PMD_REGISTER_PCI(nitrox, nitrox_pmd);
165024a8abbSNagadheeraj Rottela RTE_PMD_REGISTER_PCI_TABLE(nitrox, pci_id_nitrox_map);
166