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