Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : :
5 : : #include <rte_atomic.h>
6 : : #include <bus_pci_driver.h>
7 : : #include <rte_common.h>
8 : : #include <rte_devargs.h>
9 : : #include <rte_eal.h>
10 : : #include <rte_io.h>
11 : : #include <rte_kvargs.h>
12 : : #include <rte_malloc.h>
13 : : #include <rte_mbuf_pool_ops.h>
14 : : #include <rte_pci.h>
15 : :
16 : : #include "roc_api.h"
17 : :
18 : : #define CNXK_NPA_DEV_NAME RTE_STR(cnxk_npa_dev_)
19 : : #define CNXK_NPA_DEV_NAME_LEN (sizeof(CNXK_NPA_DEV_NAME) + PCI_PRI_STR_SIZE)
20 : : #define CNXK_NPA_MAX_POOLS_PARAM "max_pools"
21 : : #define CNXK_NPA_HALO_ENA_PARAM "halo_ena"
22 : :
23 : : static inline uint32_t
24 : : npa_aura_size_to_u32(uint8_t val)
25 : : {
26 : : if (val == NPA_AURA_SZ_0)
27 : : return 128;
28 : : if (val >= NPA_AURA_SZ_MAX)
29 : : return BIT_ULL(20);
30 : :
31 : : return 1 << (val + 6);
32 : : }
33 : :
34 : : static int
35 : 0 : parse_max_pools_handler(const char *key, const char *value, void *extra_args)
36 : : {
37 : : RTE_SET_USED(key);
38 : : uint32_t val;
39 : :
40 : 0 : val = rte_align32pow2(atoi(value));
41 : : if (val < npa_aura_size_to_u32(NPA_AURA_SZ_128))
42 : : val = 128;
43 : : if (val > npa_aura_size_to_u32(NPA_AURA_SZ_1M))
44 : : val = BIT_ULL(20);
45 : :
46 : 0 : *(uint32_t *)extra_args = val;
47 : 0 : return 0;
48 : : }
49 : :
50 : : static int
51 : 0 : parse_halo_ena_handler(const char *key, const char *value, void *extra_args)
52 : : {
53 : : RTE_SET_USED(key);
54 : : uint8_t val;
55 : :
56 : 0 : val = atoi(value);
57 [ # # ]: 0 : if (val != 0 && val != 1)
58 : : return -EINVAL;
59 : :
60 : 0 : *(uint8_t *)extra_args = val;
61 : 0 : return 0;
62 : : }
63 : :
64 : : static int
65 : 0 : cnxk_mempool_plt_parse_devargs(struct rte_pci_device *pci_dev)
66 : : {
67 : 0 : uint32_t max_pools = npa_aura_size_to_u32(NPA_AURA_SZ_128);
68 : 0 : struct rte_devargs *devargs = pci_dev->device.devargs;
69 : : struct rte_kvargs *kvlist;
70 : 0 : uint32_t halo_ena = 0;
71 : :
72 [ # # ]: 0 : if (devargs == NULL)
73 : 0 : goto null_devargs;
74 : 0 : kvlist = rte_kvargs_parse(devargs->args, NULL);
75 [ # # ]: 0 : if (kvlist == NULL)
76 : 0 : goto exit;
77 : :
78 : 0 : rte_kvargs_process(kvlist, CNXK_NPA_MAX_POOLS_PARAM,
79 : : &parse_max_pools_handler, &max_pools);
80 : 0 : rte_kvargs_process(kvlist, CNXK_NPA_HALO_ENA_PARAM,
81 : : &parse_halo_ena_handler, &halo_ena);
82 : 0 : rte_kvargs_free(kvlist);
83 : :
84 : 0 : null_devargs:
85 : 0 : roc_idev_npa_maxpools_set(max_pools);
86 : 0 : roc_idev_npa_halo_ena_set(halo_ena);
87 : 0 : return 0;
88 : : exit:
89 : 0 : return -EINVAL;
90 : : }
91 : :
92 : : static inline char *
93 : 0 : npa_dev_to_name(struct rte_pci_device *pci_dev, char *name)
94 : : {
95 : 0 : snprintf(name, CNXK_NPA_DEV_NAME_LEN, CNXK_NPA_DEV_NAME PCI_PRI_FMT,
96 : 0 : pci_dev->addr.domain, pci_dev->addr.bus, pci_dev->addr.devid,
97 : 0 : pci_dev->addr.function);
98 : :
99 : 0 : return name;
100 : : }
101 : :
102 : : static int
103 : 0 : npa_init(struct rte_pci_device *pci_dev)
104 : : {
105 : : char name[CNXK_NPA_DEV_NAME_LEN];
106 : : const struct rte_memzone *mz;
107 : : struct roc_npa *dev;
108 : : int rc = -ENOMEM;
109 : :
110 : 0 : mz = rte_memzone_reserve_aligned(npa_dev_to_name(pci_dev, name),
111 : : sizeof(*dev), SOCKET_ID_ANY, 0,
112 : : RTE_CACHE_LINE_SIZE);
113 [ # # ]: 0 : if (mz == NULL)
114 : 0 : goto error;
115 : :
116 : 0 : dev = mz->addr;
117 : 0 : dev->pci_dev = pci_dev;
118 : :
119 : 0 : rc = roc_npa_dev_init(dev);
120 [ # # ]: 0 : if (rc)
121 : 0 : goto mz_free;
122 : :
123 : : return 0;
124 : :
125 : : mz_free:
126 : 0 : rte_memzone_free(mz);
127 : 0 : error:
128 : 0 : plt_err("failed to initialize npa device rc=%d", rc);
129 : 0 : return rc;
130 : : }
131 : :
132 : : static int
133 : 0 : npa_fini(struct rte_pci_device *pci_dev)
134 : : {
135 : : char name[CNXK_NPA_DEV_NAME_LEN];
136 : : const struct rte_memzone *mz;
137 : : int rc;
138 : :
139 : 0 : mz = rte_memzone_lookup(npa_dev_to_name(pci_dev, name));
140 [ # # ]: 0 : if (mz == NULL)
141 : : return -EINVAL;
142 : :
143 : 0 : rc = roc_npa_dev_fini(mz->addr);
144 [ # # ]: 0 : if (rc) {
145 [ # # ]: 0 : if (rc != -EAGAIN)
146 : 0 : plt_err("Failed to remove npa dev, rc=%d", rc);
147 : 0 : return rc;
148 : : }
149 : 0 : rte_memzone_free(mz);
150 : :
151 : 0 : return 0;
152 : : }
153 : :
154 : : static int
155 : 0 : npa_remove(struct rte_pci_device *pci_dev)
156 : : {
157 [ # # ]: 0 : if (rte_eal_process_type() != RTE_PROC_PRIMARY)
158 : : return 0;
159 : :
160 : 0 : return npa_fini(pci_dev);
161 : : }
162 : :
163 : : static int
164 : 0 : npa_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
165 : : {
166 : : int rc;
167 : :
168 : : RTE_SET_USED(pci_drv);
169 : :
170 : 0 : rc = roc_plt_init();
171 [ # # ]: 0 : if (rc < 0)
172 : : return rc;
173 : :
174 [ # # ]: 0 : if (rte_eal_process_type() != RTE_PROC_PRIMARY)
175 : : return 0;
176 : :
177 : 0 : return npa_init(pci_dev);
178 : : }
179 : :
180 : : static const struct rte_pci_id npa_pci_map[] = {
181 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN20KA, PCI_DEVID_CNXK_RVU_NPA_PF),
182 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KA, PCI_DEVID_CNXK_RVU_NPA_PF),
183 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KAS, PCI_DEVID_CNXK_RVU_NPA_PF),
184 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KB, PCI_DEVID_CNXK_RVU_NPA_PF),
185 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KA, PCI_DEVID_CNXK_RVU_NPA_PF),
186 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KB, PCI_DEVID_CNXK_RVU_NPA_PF),
187 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_NPA_PF),
188 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_NPA_PF),
189 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_NPA_PF),
190 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_NPA_PF),
191 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_NPA_PF),
192 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF9KA, PCI_DEVID_CNXK_RVU_NPA_PF),
193 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN20KA, PCI_DEVID_CNXK_RVU_NPA_VF),
194 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KA, PCI_DEVID_CNXK_RVU_NPA_VF),
195 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KAS, PCI_DEVID_CNXK_RVU_NPA_VF),
196 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN10KB, PCI_DEVID_CNXK_RVU_NPA_VF),
197 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KA, PCI_DEVID_CNXK_RVU_NPA_VF),
198 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF10KB, PCI_DEVID_CNXK_RVU_NPA_VF),
199 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KA, PCI_DEVID_CNXK_RVU_NPA_VF),
200 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KB, PCI_DEVID_CNXK_RVU_NPA_VF),
201 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KC, PCI_DEVID_CNXK_RVU_NPA_VF),
202 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KD, PCI_DEVID_CNXK_RVU_NPA_VF),
203 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CN9KE, PCI_DEVID_CNXK_RVU_NPA_VF),
204 : : CNXK_PCI_ID(PCI_SUBSYSTEM_DEVID_CNF9KA, PCI_DEVID_CNXK_RVU_NPA_VF),
205 : : {
206 : : .vendor_id = 0,
207 : : },
208 : : };
209 : :
210 : : static struct rte_pci_driver npa_pci = {
211 : : .id_table = npa_pci_map,
212 : : .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
213 : : .probe = npa_probe,
214 : : .remove = npa_remove,
215 : : };
216 : :
217 : 276 : RTE_PMD_REGISTER_PCI(mempool_cnxk, npa_pci);
218 : : RTE_PMD_REGISTER_PCI_TABLE(mempool_cnxk, npa_pci_map);
219 : : RTE_PMD_REGISTER_KMOD_DEP(mempool_cnxk, "vfio-pci");
220 : : RTE_PMD_REGISTER_PARAM_STRING(mempool_cnxk,
221 : : CNXK_NPA_MAX_POOLS_PARAM "=<128-1048576>"
222 : : CNXK_NPA_HALO_ENA_PARAM "=<0-1>");
223 : :
224 : 276 : RTE_INIT(cnxk_mempool_parse_devargs)
225 : : {
226 : 276 : roc_npa_lf_init_cb_register(cnxk_mempool_plt_parse_devargs);
227 : 276 : }
|