New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / cxgbe / cxgbevf_main.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Chelsio Communications.
3  * All rights reserved.
4  */
5
6 #include <rte_ethdev_driver.h>
7 #include <rte_ethdev_pci.h>
8 #include <rte_malloc.h>
9
10 #include "common.h"
11 #include "t4_regs.h"
12 #include "t4_msg.h"
13 #include "cxgbe.h"
14
15 /*
16  * Figure out how many Ports and Queue Sets we can support.  This depends on
17  * knowing our Virtual Function Resources and may be called a second time if
18  * we fall back from MSI-X to MSI Interrupt Mode.
19  */
20 static void size_nports_qsets(struct adapter *adapter)
21 {
22         struct vf_resources *vfres = &adapter->params.vfres;
23         unsigned int pmask_nports;
24
25         /*
26          * The number of "ports" which we support is equal to the number of
27          * Virtual Interfaces with which we've been provisioned.
28          */
29         adapter->params.nports = vfres->nvi;
30         if (adapter->params.nports > MAX_NPORTS) {
31                 dev_warn(adapter->pdev_dev, "only using %d of %d maximum"
32                          " allowed virtual interfaces\n", MAX_NPORTS,
33                          adapter->params.nports);
34                 adapter->params.nports = MAX_NPORTS;
35         }
36
37         /*
38          * We may have been provisioned with more VIs than the number of
39          * ports we're allowed to access (our Port Access Rights Mask).
40          * This is obviously a configuration conflict but we don't want to
41          * do anything silly just because of that.
42          */
43         pmask_nports = hweight32(adapter->params.vfres.pmask);
44         if (pmask_nports < adapter->params.nports) {
45                 dev_warn(adapter->pdev_dev, "only using %d of %d provissioned"
46                          " virtual interfaces; limited by Port Access Rights"
47                          " mask %#x\n", pmask_nports, adapter->params.nports,
48                          adapter->params.vfres.pmask);
49                 adapter->params.nports = pmask_nports;
50         }
51
52         configure_max_ethqsets(adapter);
53         if (adapter->sge.max_ethqsets < adapter->params.nports) {
54                 dev_warn(adapter->pdev_dev, "only using %d of %d available"
55                          " virtual interfaces (too few Queue Sets)\n",
56                          adapter->sge.max_ethqsets, adapter->params.nports);
57                 adapter->params.nports = adapter->sge.max_ethqsets;
58         }
59 }
60
61 void cxgbevf_stats_get(struct port_info *pi, struct port_stats *stats)
62 {
63         t4vf_get_port_stats(pi->adapter, pi->pidx, stats);
64 }
65
66 static int adap_init0vf(struct adapter *adapter)
67 {
68         u32 param, val = 0;
69         int err;
70
71         err = t4vf_fw_reset(adapter);
72         if (err < 0) {
73                 dev_err(adapter->pdev_dev, "FW reset failed: err=%d\n", err);
74                 return err;
75         }
76
77         /*
78          * Grab basic operational parameters.  These will predominantly have
79          * been set up by the Physical Function Driver or will be hard coded
80          * into the adapter.  We just have to live with them ...  Note that
81          * we _must_ get our VPD parameters before our SGE parameters because
82          * we need to know the adapter's core clock from the VPD in order to
83          * properly decode the SGE Timer Values.
84          */
85         err = t4vf_get_dev_params(adapter);
86         if (err) {
87                 dev_err(adapter->pdev_dev, "unable to retrieve adapter"
88                         " device parameters: err=%d\n", err);
89                 return err;
90         }
91
92         err = t4vf_get_vpd_params(adapter);
93         if (err) {
94                 dev_err(adapter->pdev_dev, "unable to retrieve adapter"
95                         " VPD parameters: err=%d\n", err);
96                 return err;
97         }
98
99         adapter->pf = t4vf_get_pf_from_vf(adapter);
100         err = t4vf_sge_init(adapter);
101         if (err) {
102                 dev_err(adapter->pdev_dev, "error in sge init\n");
103                 return err;
104         }
105
106         err = t4vf_get_rss_glb_config(adapter);
107         if (err) {
108                 dev_err(adapter->pdev_dev, "unable to retrieve adapter"
109                         " RSS parameters: err=%d\n", err);
110                 return err;
111         }
112         if (adapter->params.rss.mode !=
113             FW_RSS_GLB_CONFIG_CMD_MODE_BASICVIRTUAL) {
114                 dev_err(adapter->pdev_dev, "unable to operate with global RSS"
115                         " mode %d\n", adapter->params.rss.mode);
116                 return -EINVAL;
117         }
118
119         /* If we're running on newer firmware, let it know that we're
120          * prepared to deal with encapsulated CPL messages.  Older
121          * firmware won't understand this and we'll just get
122          * unencapsulated messages ...
123          */
124         param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) |
125                 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_CPLFW4MSG_ENCAP);
126         val = 1;
127         t4vf_set_params(adapter, 1, &param, &val);
128
129         /*
130          * Grab our Virtual Interface resource allocation, extract the
131          * features that we're interested in and do a bit of sanity testing on
132          * what we discover.
133          */
134         err = t4vf_get_vfres(adapter);
135         if (err) {
136                 dev_err(adapter->pdev_dev, "unable to get virtual interface"
137                         " resources: err=%d\n", err);
138                 return err;
139         }
140
141         /*
142          * Check for various parameter sanity issues.
143          */
144         if (adapter->params.vfres.pmask == 0) {
145                 dev_err(adapter->pdev_dev, "no port access configured\n"
146                         "usable!\n");
147                 return -EINVAL;
148         }
149         if (adapter->params.vfres.nvi == 0) {
150                 dev_err(adapter->pdev_dev, "no virtual interfaces configured/"
151                         "usable!\n");
152                 return -EINVAL;
153         }
154
155         /*
156          * Initialize nports and max_ethqsets now that we have our Virtual
157          * Function Resources.
158          */
159         size_nports_qsets(adapter);
160         adapter->flags |= FW_OK;
161         return 0;
162 }
163
164 int cxgbevf_probe(struct adapter *adapter)
165 {
166         struct port_info *pi;
167         unsigned int pmask;
168         int err = 0;
169         int i;
170
171         t4_os_lock_init(&adapter->mbox_lock);
172         TAILQ_INIT(&adapter->mbox_list);
173         err = t4vf_prep_adapter(adapter);
174         if (err)
175                 return err;
176
177         if (!is_t4(adapter->params.chip)) {
178                 adapter->bar2 = (void *)adapter->pdev->mem_resource[2].addr;
179                 if (!adapter->bar2) {
180                         dev_err(adapter, "cannot map device bar2 region\n");
181                         err = -ENOMEM;
182                         return err;
183                 }
184         }
185
186         err = adap_init0vf(adapter);
187         if (err) {
188                 dev_err(adapter, "%s: Adapter initialization failed, error %d\n",
189                                 __func__, err);
190                 goto out_free;
191         }
192
193         pmask = adapter->params.vfres.pmask;
194         for_each_port(adapter, i) {
195                 const unsigned int numa_node = rte_socket_id();
196                 char name[RTE_ETH_NAME_MAX_LEN];
197                 struct rte_eth_dev *eth_dev;
198                 int port_id;
199
200                 if (pmask == 0)
201                         break;
202                 port_id = ffs(pmask) - 1;
203                 pmask &= ~(1 << port_id);
204
205                 snprintf(name, sizeof(name), "%s_%d",
206                          adapter->pdev->device.name, i);
207
208                 if (i == 0) {
209                         /* First port is already allocated by DPDK */
210                         eth_dev = adapter->eth_dev;
211                         goto allocate_mac;
212                 }
213
214                 /*
215                  * now do all data allocation - for eth_dev structure,
216                  * and internal (private) data for the remaining ports
217                  */
218
219                 /* reserve an ethdev entry */
220                 eth_dev = rte_eth_dev_allocate(name);
221                 if (!eth_dev) {
222                         err = -ENOMEM;
223                         goto out_free;
224                 }
225                 eth_dev->data->dev_private =
226                         rte_zmalloc_socket(name, sizeof(struct port_info),
227                                            RTE_CACHE_LINE_SIZE, numa_node);
228                 if (!eth_dev->data->dev_private)
229                         goto out_free;
230
231 allocate_mac:
232                 pi = (struct port_info *)eth_dev->data->dev_private;
233                 adapter->port[i] = pi;
234                 pi->eth_dev = eth_dev;
235                 pi->adapter = adapter;
236                 pi->xact_addr_filt = -1;
237                 pi->port_id = port_id;
238                 pi->pidx = i;
239
240                 pi->eth_dev->device = &adapter->pdev->device;
241                 pi->eth_dev->dev_ops = adapter->eth_dev->dev_ops;
242                 pi->eth_dev->tx_pkt_burst = adapter->eth_dev->tx_pkt_burst;
243                 pi->eth_dev->rx_pkt_burst = adapter->eth_dev->rx_pkt_burst;
244
245                 rte_eth_copy_pci_info(pi->eth_dev, adapter->pdev);
246                 pi->eth_dev->data->mac_addrs = rte_zmalloc(name,
247                                                            ETHER_ADDR_LEN, 0);
248                 if (!pi->eth_dev->data->mac_addrs) {
249                         dev_err(adapter, "%s: Mem allocation failed for storing mac addr, aborting\n",
250                                 __func__);
251                         err = -ENOMEM;
252                         goto out_free;
253                 }
254
255                 if (i > 0) {
256                         /* First port will be notified by upper layer */
257                         rte_eth_dev_probing_finish(eth_dev);
258                 }
259         }
260
261         if (adapter->flags & FW_OK) {
262                 err = t4vf_port_init(adapter);
263                 if (err) {
264                         dev_err(adapter, "%s: t4_port_init failed with err %d\n",
265                                 __func__, err);
266                         goto out_free;
267                 }
268         }
269
270         cfg_queues(adapter->eth_dev);
271         print_adapter_info(adapter);
272         print_port_info(adapter);
273
274         err = init_rss(adapter);
275         if (err)
276                 goto out_free;
277         return 0;
278
279 out_free:
280         for_each_port(adapter, i) {
281                 pi = adap2pinfo(adapter, i);
282                 if (pi->viid != 0)
283                         t4_free_vi(adapter, adapter->mbox, adapter->pf,
284                                    0, pi->viid);
285                 rte_eth_dev_release_port(pi->eth_dev);
286         }
287         return -err;
288 }