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