]> git.ipfire.org Git - people/arne_f/kernel.git/blame - drivers/net/ethernet/mellanox/mlx5/core/main.c
net/mlx5: Decrease default mr cache size
[people/arne_f/kernel.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
CommitLineData
e126ba97 1/*
302bdf68 2 * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
e126ba97
EC
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32
adec640e 33#include <linux/highmem.h>
e126ba97
EC
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/errno.h>
37#include <linux/pci.h>
38#include <linux/dma-mapping.h>
39#include <linux/slab.h>
40#include <linux/io-mapping.h>
db058a18 41#include <linux/interrupt.h>
e3297246 42#include <linux/delay.h>
e126ba97
EC
43#include <linux/mlx5/driver.h>
44#include <linux/mlx5/cq.h>
45#include <linux/mlx5/qp.h>
46#include <linux/mlx5/srq.h>
47#include <linux/debugfs.h>
f66f049f 48#include <linux/kmod.h>
b775516b 49#include <linux/mlx5/mlx5_ifc.h>
c85023e1 50#include <linux/mlx5/vport.h>
5a7b27eb
MG
51#ifdef CONFIG_RFS_ACCEL
52#include <linux/cpu_rmap.h>
53#endif
feae9087 54#include <net/devlink.h>
e126ba97 55#include "mlx5_core.h"
86d722ad 56#include "fs_core.h"
eeb66cdb 57#include "lib/mpfs.h"
073bb189 58#include "eswitch.h"
52ec462e 59#include "lib/mlx5.h"
e29341fb 60#include "fpga/core.h"
bebb23e6 61#include "accel/ipsec.h"
e126ba97 62
e126ba97 63MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
4ae6c18c 64MODULE_DESCRIPTION("Mellanox Connect-IB, ConnectX-4 core driver");
e126ba97
EC
65MODULE_LICENSE("Dual BSD/GPL");
66MODULE_VERSION(DRIVER_VERSION);
67
f663ad98
KH
68unsigned int mlx5_core_debug_mask;
69module_param_named(debug_mask, mlx5_core_debug_mask, uint, 0644);
e126ba97
EC
70MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0");
71
9603b61d 72#define MLX5_DEFAULT_PROF 2
f663ad98
KH
73static unsigned int prof_sel = MLX5_DEFAULT_PROF;
74module_param_named(prof_sel, prof_sel, uint, 0444);
9603b61d
JM
75MODULE_PARM_DESC(prof_sel, "profile selector. Valid range 0 - 2");
76
f91e6d89
EBE
77enum {
78 MLX5_ATOMIC_REQ_MODE_BE = 0x0,
79 MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS = 0x1,
80};
81
9603b61d
JM
82static struct mlx5_profile profile[] = {
83 [0] = {
84 .mask = 0,
85 },
86 [1] = {
87 .mask = MLX5_PROF_MASK_QP_SIZE,
88 .log_max_qp = 12,
89 },
90 [2] = {
91 .mask = MLX5_PROF_MASK_QP_SIZE |
92 MLX5_PROF_MASK_MR_CACHE,
5f40b4ed 93 .log_max_qp = 18,
9603b61d
JM
94 .mr_cache[0] = {
95 .size = 500,
96 .limit = 250
97 },
98 .mr_cache[1] = {
99 .size = 500,
100 .limit = 250
101 },
102 .mr_cache[2] = {
103 .size = 500,
104 .limit = 250
105 },
106 .mr_cache[3] = {
107 .size = 500,
108 .limit = 250
109 },
110 .mr_cache[4] = {
111 .size = 500,
112 .limit = 250
113 },
114 .mr_cache[5] = {
115 .size = 500,
116 .limit = 250
117 },
118 .mr_cache[6] = {
119 .size = 500,
120 .limit = 250
121 },
122 .mr_cache[7] = {
123 .size = 500,
124 .limit = 250
125 },
126 .mr_cache[8] = {
127 .size = 500,
128 .limit = 250
129 },
130 .mr_cache[9] = {
131 .size = 500,
132 .limit = 250
133 },
134 .mr_cache[10] = {
135 .size = 500,
136 .limit = 250
137 },
138 .mr_cache[11] = {
139 .size = 500,
140 .limit = 250
141 },
142 .mr_cache[12] = {
143 .size = 64,
144 .limit = 32
145 },
146 .mr_cache[13] = {
147 .size = 32,
148 .limit = 16
149 },
150 .mr_cache[14] = {
151 .size = 16,
152 .limit = 8
153 },
154 .mr_cache[15] = {
155 .size = 8,
156 .limit = 4
157 },
158 },
159};
e126ba97 160
6c780a02
EC
161#define FW_INIT_TIMEOUT_MILI 2000
162#define FW_INIT_WAIT_MS 2
163#define FW_PRE_INIT_TIMEOUT_MILI 10000
e3297246
EC
164
165static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili)
166{
167 unsigned long end = jiffies + msecs_to_jiffies(max_wait_mili);
168 int err = 0;
169
170 while (fw_initializing(dev)) {
171 if (time_after(jiffies, end)) {
172 err = -EBUSY;
173 break;
174 }
175 msleep(FW_INIT_WAIT_MS);
176 }
177
178 return err;
179}
180
012e50e1
HN
181static void mlx5_set_driver_version(struct mlx5_core_dev *dev)
182{
183 int driver_ver_sz = MLX5_FLD_SZ_BYTES(set_driver_version_in,
184 driver_version);
185 u8 in[MLX5_ST_SZ_BYTES(set_driver_version_in)] = {0};
186 u8 out[MLX5_ST_SZ_BYTES(set_driver_version_out)] = {0};
187 int remaining_size = driver_ver_sz;
188 char *string;
189
190 if (!MLX5_CAP_GEN(dev, driver_version))
191 return;
192
193 string = MLX5_ADDR_OF(set_driver_version_in, in, driver_version);
194
195 strncpy(string, "Linux", remaining_size);
196
197 remaining_size = max_t(int, 0, driver_ver_sz - strlen(string));
198 strncat(string, ",", remaining_size);
199
200 remaining_size = max_t(int, 0, driver_ver_sz - strlen(string));
201 strncat(string, DRIVER_NAME, remaining_size);
202
203 remaining_size = max_t(int, 0, driver_ver_sz - strlen(string));
204 strncat(string, ",", remaining_size);
205
206 remaining_size = max_t(int, 0, driver_ver_sz - strlen(string));
207 strncat(string, DRIVER_VERSION, remaining_size);
208
209 /*Send the command*/
210 MLX5_SET(set_driver_version_in, in, opcode,
211 MLX5_CMD_OP_SET_DRIVER_VERSION);
212
213 mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
214}
215
e126ba97
EC
216static int set_dma_caps(struct pci_dev *pdev)
217{
218 int err;
219
220 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
221 if (err) {
1a91de28 222 dev_warn(&pdev->dev, "Warning: couldn't set 64-bit PCI DMA mask\n");
e126ba97
EC
223 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
224 if (err) {
1a91de28 225 dev_err(&pdev->dev, "Can't set PCI DMA mask, aborting\n");
e126ba97
EC
226 return err;
227 }
228 }
229
230 err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
231 if (err) {
232 dev_warn(&pdev->dev,
1a91de28 233 "Warning: couldn't set 64-bit consistent PCI DMA mask\n");
e126ba97
EC
234 err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
235 if (err) {
236 dev_err(&pdev->dev,
1a91de28 237 "Can't set consistent PCI DMA mask, aborting\n");
e126ba97
EC
238 return err;
239 }
240 }
241
242 dma_set_max_seg_size(&pdev->dev, 2u * 1024 * 1024 * 1024);
243 return err;
244}
245
89d44f0a
MD
246static int mlx5_pci_enable_device(struct mlx5_core_dev *dev)
247{
248 struct pci_dev *pdev = dev->pdev;
249 int err = 0;
250
251 mutex_lock(&dev->pci_status_mutex);
252 if (dev->pci_status == MLX5_PCI_STATUS_DISABLED) {
253 err = pci_enable_device(pdev);
254 if (!err)
255 dev->pci_status = MLX5_PCI_STATUS_ENABLED;
256 }
257 mutex_unlock(&dev->pci_status_mutex);
258
259 return err;
260}
261
262static void mlx5_pci_disable_device(struct mlx5_core_dev *dev)
263{
264 struct pci_dev *pdev = dev->pdev;
265
266 mutex_lock(&dev->pci_status_mutex);
267 if (dev->pci_status == MLX5_PCI_STATUS_ENABLED) {
268 pci_disable_device(pdev);
269 dev->pci_status = MLX5_PCI_STATUS_DISABLED;
270 }
271 mutex_unlock(&dev->pci_status_mutex);
272}
273
e126ba97
EC
274static int request_bar(struct pci_dev *pdev)
275{
276 int err = 0;
277
278 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
1a91de28 279 dev_err(&pdev->dev, "Missing registers BAR, aborting\n");
e126ba97
EC
280 return -ENODEV;
281 }
282
283 err = pci_request_regions(pdev, DRIVER_NAME);
284 if (err)
285 dev_err(&pdev->dev, "Couldn't get PCI resources, aborting\n");
286
287 return err;
288}
289
290static void release_bar(struct pci_dev *pdev)
291{
292 pci_release_regions(pdev);
293}
294
78249c42 295static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev)
e126ba97 296{
db058a18
SM
297 struct mlx5_priv *priv = &dev->priv;
298 struct mlx5_eq_table *table = &priv->eq_table;
938fe83c 299 int num_eqs = 1 << MLX5_CAP_GEN(dev, log_max_eq);
e126ba97 300 int nvec;
e126ba97 301
938fe83c
SM
302 nvec = MLX5_CAP_GEN(dev, num_ports) * num_online_cpus() +
303 MLX5_EQ_VEC_COMP_BASE;
e126ba97
EC
304 nvec = min_t(int, nvec, num_eqs);
305 if (nvec <= MLX5_EQ_VEC_COMP_BASE)
306 return -ENOMEM;
307
db058a18 308 priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL);
78249c42 309 if (!priv->irq_info)
db058a18 310 goto err_free_msix;
e126ba97 311
8f5bbb29 312 nvec = pci_alloc_irq_vectors(dev->pdev,
78249c42 313 MLX5_EQ_VEC_COMP_BASE + 1, nvec,
8f5bbb29 314 PCI_IRQ_MSIX);
f3c9407b
AG
315 if (nvec < 0)
316 return nvec;
e126ba97 317
f3c9407b 318 table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE;
e126ba97
EC
319
320 return 0;
db058a18
SM
321
322err_free_msix:
323 kfree(priv->irq_info);
db058a18 324 return -ENOMEM;
e126ba97
EC
325}
326
78249c42 327static void mlx5_free_irq_vectors(struct mlx5_core_dev *dev)
e126ba97 328{
db058a18 329 struct mlx5_priv *priv = &dev->priv;
e126ba97 330
78249c42 331 pci_free_irq_vectors(dev->pdev);
db058a18 332 kfree(priv->irq_info);
e126ba97
EC
333}
334
bd10838a 335struct mlx5_reg_host_endianness {
e126ba97
EC
336 u8 he;
337 u8 rsvd[15];
338};
339
87b8de49
EC
340#define CAP_MASK(pos, size) ((u64)((1 << (size)) - 1) << (pos))
341
342enum {
c7a08ac7
EC
343 MLX5_CAP_BITS_RW_MASK = CAP_MASK(MLX5_CAP_OFF_CMDIF_CSUM, 2) |
344 MLX5_DEV_CAP_FLAG_DCT,
87b8de49
EC
345};
346
2974ab6e 347static u16 to_fw_pkey_sz(struct mlx5_core_dev *dev, u32 size)
c7a08ac7
EC
348{
349 switch (size) {
350 case 128:
351 return 0;
352 case 256:
353 return 1;
354 case 512:
355 return 2;
356 case 1024:
357 return 3;
358 case 2048:
359 return 4;
360 case 4096:
361 return 5;
362 default:
2974ab6e 363 mlx5_core_warn(dev, "invalid pkey table size %d\n", size);
c7a08ac7
EC
364 return 0;
365 }
366}
367
b06e7de8
LR
368static int mlx5_core_get_caps_mode(struct mlx5_core_dev *dev,
369 enum mlx5_cap_type cap_type,
370 enum mlx5_cap_mode cap_mode)
c7a08ac7 371{
b775516b
EC
372 u8 in[MLX5_ST_SZ_BYTES(query_hca_cap_in)];
373 int out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
938fe83c
SM
374 void *out, *hca_caps;
375 u16 opmod = (cap_type << 1) | (cap_mode & 0x01);
e126ba97
EC
376 int err;
377
b775516b
EC
378 memset(in, 0, sizeof(in));
379 out = kzalloc(out_sz, GFP_KERNEL);
c7a08ac7 380 if (!out)
e126ba97 381 return -ENOMEM;
938fe83c 382
b775516b
EC
383 MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
384 MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
385 err = mlx5_cmd_exec(dev, in, sizeof(in), out, out_sz);
c7a08ac7 386 if (err) {
938fe83c
SM
387 mlx5_core_warn(dev,
388 "QUERY_HCA_CAP : type(%x) opmode(%x) Failed(%d)\n",
389 cap_type, cap_mode, err);
e126ba97
EC
390 goto query_ex;
391 }
c7a08ac7 392
938fe83c
SM
393 hca_caps = MLX5_ADDR_OF(query_hca_cap_out, out, capability);
394
395 switch (cap_mode) {
396 case HCA_CAP_OPMOD_GET_MAX:
701052c5 397 memcpy(dev->caps.hca_max[cap_type], hca_caps,
938fe83c
SM
398 MLX5_UN_SZ_BYTES(hca_cap_union));
399 break;
400 case HCA_CAP_OPMOD_GET_CUR:
701052c5 401 memcpy(dev->caps.hca_cur[cap_type], hca_caps,
938fe83c
SM
402 MLX5_UN_SZ_BYTES(hca_cap_union));
403 break;
404 default:
405 mlx5_core_warn(dev,
406 "Tried to query dev cap type(%x) with wrong opmode(%x)\n",
407 cap_type, cap_mode);
408 err = -EINVAL;
409 break;
410 }
c7a08ac7
EC
411query_ex:
412 kfree(out);
413 return err;
414}
415
b06e7de8
LR
416int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type)
417{
418 int ret;
419
420 ret = mlx5_core_get_caps_mode(dev, cap_type, HCA_CAP_OPMOD_GET_CUR);
421 if (ret)
422 return ret;
423 return mlx5_core_get_caps_mode(dev, cap_type, HCA_CAP_OPMOD_GET_MAX);
424}
425
f91e6d89 426static int set_caps(struct mlx5_core_dev *dev, void *in, int in_sz, int opmod)
c7a08ac7 427{
c4f287c4 428 u32 out[MLX5_ST_SZ_DW(set_hca_cap_out)] = {0};
e126ba97 429
b775516b 430 MLX5_SET(set_hca_cap_in, in, opcode, MLX5_CMD_OP_SET_HCA_CAP);
f91e6d89 431 MLX5_SET(set_hca_cap_in, in, op_mod, opmod << 1);
c4f287c4 432 return mlx5_cmd_exec(dev, in, in_sz, out, sizeof(out));
c7a08ac7
EC
433}
434
f91e6d89
EBE
435static int handle_hca_cap_atomic(struct mlx5_core_dev *dev)
436{
437 void *set_ctx;
438 void *set_hca_cap;
439 int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
440 int req_endianness;
441 int err;
442
443 if (MLX5_CAP_GEN(dev, atomic)) {
b06e7de8 444 err = mlx5_core_get_caps(dev, MLX5_CAP_ATOMIC);
f91e6d89
EBE
445 if (err)
446 return err;
447 } else {
448 return 0;
449 }
450
451 req_endianness =
452 MLX5_CAP_ATOMIC(dev,
bd10838a 453 supported_atomic_req_8B_endianness_mode_1);
f91e6d89
EBE
454
455 if (req_endianness != MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS)
456 return 0;
457
458 set_ctx = kzalloc(set_sz, GFP_KERNEL);
459 if (!set_ctx)
460 return -ENOMEM;
461
462 set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
463
464 /* Set requestor to host endianness */
bd10838a 465 MLX5_SET(atomic_caps, set_hca_cap, atomic_req_8B_endianness_mode,
f91e6d89
EBE
466 MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS);
467
468 err = set_caps(dev, set_ctx, set_sz, MLX5_SET_HCA_CAP_OP_MOD_ATOMIC);
469
470 kfree(set_ctx);
471 return err;
472}
473
c7a08ac7
EC
474static int handle_hca_cap(struct mlx5_core_dev *dev)
475{
b775516b 476 void *set_ctx = NULL;
c7a08ac7 477 struct mlx5_profile *prof = dev->profile;
c7a08ac7 478 int err = -ENOMEM;
b775516b 479 int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
938fe83c 480 void *set_hca_cap;
c7a08ac7 481
b775516b 482 set_ctx = kzalloc(set_sz, GFP_KERNEL);
c7a08ac7 483 if (!set_ctx)
e126ba97 484 goto query_ex;
e126ba97 485
b06e7de8 486 err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL);
e126ba97
EC
487 if (err)
488 goto query_ex;
489
938fe83c
SM
490 set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx,
491 capability);
701052c5 492 memcpy(set_hca_cap, dev->caps.hca_cur[MLX5_CAP_GENERAL],
938fe83c
SM
493 MLX5_ST_SZ_BYTES(cmd_hca_cap));
494
495 mlx5_core_dbg(dev, "Current Pkey table size %d Setting new size %d\n",
707c4602 496 mlx5_to_sw_pkey_sz(MLX5_CAP_GEN(dev, pkey_table_size)),
938fe83c 497 128);
c7a08ac7 498 /* we limit the size of the pkey table to 128 entries for now */
938fe83c 499 MLX5_SET(cmd_hca_cap, set_hca_cap, pkey_table_size,
2974ab6e 500 to_fw_pkey_sz(dev, 128));
c7a08ac7 501
883371c4
NO
502 /* Check log_max_qp from HCA caps to set in current profile */
503 if (MLX5_CAP_GEN_MAX(dev, log_max_qp) < profile[prof_sel].log_max_qp) {
504 mlx5_core_warn(dev, "log_max_qp value in current profile is %d, changing it to HCA capability limit (%d)\n",
505 profile[prof_sel].log_max_qp,
506 MLX5_CAP_GEN_MAX(dev, log_max_qp));
507 profile[prof_sel].log_max_qp = MLX5_CAP_GEN_MAX(dev, log_max_qp);
508 }
c7a08ac7 509 if (prof->mask & MLX5_PROF_MASK_QP_SIZE)
938fe83c
SM
510 MLX5_SET(cmd_hca_cap, set_hca_cap, log_max_qp,
511 prof->log_max_qp);
c7a08ac7 512
938fe83c
SM
513 /* disable cmdif checksum */
514 MLX5_SET(cmd_hca_cap, set_hca_cap, cmdif_checksum, 0);
c7a08ac7 515
91828bd8
MD
516 /* Enable 4K UAR only when HCA supports it and page size is bigger
517 * than 4K.
518 */
519 if (MLX5_CAP_GEN_MAX(dev, uar_4k) && PAGE_SIZE > 4096)
f502d834
EC
520 MLX5_SET(cmd_hca_cap, set_hca_cap, uar_4k, 1);
521
fe1e1876
CS
522 MLX5_SET(cmd_hca_cap, set_hca_cap, log_uar_page_sz, PAGE_SHIFT - 12);
523
f32f5bd2
DJ
524 if (MLX5_CAP_GEN_MAX(dev, cache_line_128byte))
525 MLX5_SET(cmd_hca_cap,
526 set_hca_cap,
527 cache_line_128byte,
528 cache_line_size() == 128 ? 1 : 0);
529
f91e6d89
EBE
530 err = set_caps(dev, set_ctx, set_sz,
531 MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
c7a08ac7 532
e126ba97 533query_ex:
e126ba97 534 kfree(set_ctx);
e126ba97
EC
535 return err;
536}
537
538static int set_hca_ctrl(struct mlx5_core_dev *dev)
539{
bd10838a
OG
540 struct mlx5_reg_host_endianness he_in;
541 struct mlx5_reg_host_endianness he_out;
e126ba97
EC
542 int err;
543
fc50db98
EC
544 if (!mlx5_core_is_pf(dev))
545 return 0;
546
e126ba97
EC
547 memset(&he_in, 0, sizeof(he_in));
548 he_in.he = MLX5_SET_HOST_ENDIANNESS;
549 err = mlx5_core_access_reg(dev, &he_in, sizeof(he_in),
550 &he_out, sizeof(he_out),
551 MLX5_REG_HOST_ENDIANNESS, 0, 1);
552 return err;
553}
554
c85023e1
HN
555static int mlx5_core_set_hca_defaults(struct mlx5_core_dev *dev)
556{
557 int ret = 0;
558
559 /* Disable local_lb by default */
2ac1797d 560 if (MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH)
c85023e1
HN
561 ret = mlx5_nic_vport_update_local_lb(dev, false);
562
563 return ret;
564}
565
0b107106 566int mlx5_core_enable_hca(struct mlx5_core_dev *dev, u16 func_id)
cd23b14b 567{
c4f287c4
SM
568 u32 out[MLX5_ST_SZ_DW(enable_hca_out)] = {0};
569 u32 in[MLX5_ST_SZ_DW(enable_hca_in)] = {0};
cd23b14b 570
0b107106
EC
571 MLX5_SET(enable_hca_in, in, opcode, MLX5_CMD_OP_ENABLE_HCA);
572 MLX5_SET(enable_hca_in, in, function_id, func_id);
c4f287c4 573 return mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
cd23b14b
EC
574}
575
0b107106 576int mlx5_core_disable_hca(struct mlx5_core_dev *dev, u16 func_id)
cd23b14b 577{
c4f287c4
SM
578 u32 out[MLX5_ST_SZ_DW(disable_hca_out)] = {0};
579 u32 in[MLX5_ST_SZ_DW(disable_hca_in)] = {0};
cd23b14b 580
0b107106
EC
581 MLX5_SET(disable_hca_in, in, opcode, MLX5_CMD_OP_DISABLE_HCA);
582 MLX5_SET(disable_hca_in, in, function_id, func_id);
c4f287c4 583 return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
cd23b14b
EC
584}
585
a5a1d1c2 586u64 mlx5_read_internal_timer(struct mlx5_core_dev *dev)
b0844444
EBE
587{
588 u32 timer_h, timer_h1, timer_l;
589
590 timer_h = ioread32be(&dev->iseg->internal_timer_h);
591 timer_l = ioread32be(&dev->iseg->internal_timer_l);
592 timer_h1 = ioread32be(&dev->iseg->internal_timer_h);
593 if (timer_h != timer_h1) /* wrap around */
594 timer_l = ioread32be(&dev->iseg->internal_timer_l);
595
a5a1d1c2 596 return (u64)timer_l | (u64)timer_h1 << 32;
b0844444
EBE
597}
598
8f5bbb29
SM
599static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
600{
601 struct mlx5_priv *priv = &mdev->priv;
17c8a0d7
SM
602 int vecidx = MLX5_EQ_VEC_COMP_BASE + i;
603 int irq = pci_irq_vector(mdev->pdev, vecidx);
8f5bbb29 604
17c8a0d7 605 if (!zalloc_cpumask_var(&priv->irq_info[vecidx].mask, GFP_KERNEL)) {
8f5bbb29
SM
606 mlx5_core_warn(mdev, "zalloc_cpumask_var failed");
607 return -ENOMEM;
608 }
609
610 cpumask_set_cpu(cpumask_local_spread(i, priv->numa_node),
17c8a0d7 611 priv->irq_info[vecidx].mask);
8f5bbb29
SM
612
613 if (IS_ENABLED(CONFIG_SMP) &&
17c8a0d7 614 irq_set_affinity_hint(irq, priv->irq_info[vecidx].mask))
8f5bbb29
SM
615 mlx5_core_warn(mdev, "irq_set_affinity_hint failed, irq 0x%.4x", irq);
616
617 return 0;
618}
619
620static void mlx5_irq_clear_affinity_hint(struct mlx5_core_dev *mdev, int i)
621{
17c8a0d7 622 int vecidx = MLX5_EQ_VEC_COMP_BASE + i;
8f5bbb29 623 struct mlx5_priv *priv = &mdev->priv;
17c8a0d7 624 int irq = pci_irq_vector(mdev->pdev, vecidx);
8f5bbb29
SM
625
626 irq_set_affinity_hint(irq, NULL);
17c8a0d7 627 free_cpumask_var(priv->irq_info[vecidx].mask);
8f5bbb29
SM
628}
629
630static int mlx5_irq_set_affinity_hints(struct mlx5_core_dev *mdev)
631{
632 int err;
633 int i;
634
635 for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++) {
636 err = mlx5_irq_set_affinity_hint(mdev, i);
637 if (err)
638 goto err_out;
639 }
640
641 return 0;
642
643err_out:
644 for (i--; i >= 0; i--)
645 mlx5_irq_clear_affinity_hint(mdev, i);
646
647 return err;
648}
649
650static void mlx5_irq_clear_affinity_hints(struct mlx5_core_dev *mdev)
651{
652 int i;
653
654 for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++)
655 mlx5_irq_clear_affinity_hint(mdev, i);
656}
657
0b6e26ce
DT
658int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,
659 unsigned int *irqn)
233d05d2
SM
660{
661 struct mlx5_eq_table *table = &dev->priv.eq_table;
662 struct mlx5_eq *eq, *n;
663 int err = -ENOENT;
664
665 spin_lock(&table->lock);
666 list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
667 if (eq->index == vector) {
668 *eqn = eq->eqn;
669 *irqn = eq->irqn;
670 err = 0;
671 break;
672 }
673 }
674 spin_unlock(&table->lock);
675
676 return err;
677}
678EXPORT_SYMBOL(mlx5_vector2eqn);
679
94c6825e
MB
680struct mlx5_eq *mlx5_eqn2eq(struct mlx5_core_dev *dev, int eqn)
681{
682 struct mlx5_eq_table *table = &dev->priv.eq_table;
683 struct mlx5_eq *eq;
684
685 spin_lock(&table->lock);
686 list_for_each_entry(eq, &table->comp_eqs_list, list)
687 if (eq->eqn == eqn) {
688 spin_unlock(&table->lock);
689 return eq;
690 }
691
692 spin_unlock(&table->lock);
693
694 return ERR_PTR(-ENOENT);
695}
696
233d05d2
SM
697static void free_comp_eqs(struct mlx5_core_dev *dev)
698{
699 struct mlx5_eq_table *table = &dev->priv.eq_table;
700 struct mlx5_eq *eq, *n;
701
5a7b27eb
MG
702#ifdef CONFIG_RFS_ACCEL
703 if (dev->rmap) {
704 free_irq_cpu_rmap(dev->rmap);
705 dev->rmap = NULL;
706 }
707#endif
233d05d2
SM
708 spin_lock(&table->lock);
709 list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
710 list_del(&eq->list);
711 spin_unlock(&table->lock);
712 if (mlx5_destroy_unmap_eq(dev, eq))
713 mlx5_core_warn(dev, "failed to destroy EQ 0x%x\n",
714 eq->eqn);
715 kfree(eq);
716 spin_lock(&table->lock);
717 }
718 spin_unlock(&table->lock);
719}
720
721static int alloc_comp_eqs(struct mlx5_core_dev *dev)
722{
723 struct mlx5_eq_table *table = &dev->priv.eq_table;
db058a18 724 char name[MLX5_MAX_IRQ_NAME];
233d05d2
SM
725 struct mlx5_eq *eq;
726 int ncomp_vec;
727 int nent;
728 int err;
729 int i;
730
731 INIT_LIST_HEAD(&table->comp_eqs_list);
732 ncomp_vec = table->num_comp_vectors;
733 nent = MLX5_COMP_EQ_SIZE;
5a7b27eb
MG
734#ifdef CONFIG_RFS_ACCEL
735 dev->rmap = alloc_irq_cpu_rmap(ncomp_vec);
736 if (!dev->rmap)
737 return -ENOMEM;
738#endif
233d05d2
SM
739 for (i = 0; i < ncomp_vec; i++) {
740 eq = kzalloc(sizeof(*eq), GFP_KERNEL);
741 if (!eq) {
742 err = -ENOMEM;
743 goto clean;
744 }
745
5a7b27eb 746#ifdef CONFIG_RFS_ACCEL
78249c42
SG
747 irq_cpu_rmap_add(dev->rmap, pci_irq_vector(dev->pdev,
748 MLX5_EQ_VEC_COMP_BASE + i));
5a7b27eb 749#endif
db058a18 750 snprintf(name, MLX5_MAX_IRQ_NAME, "mlx5_comp%d", i);
233d05d2
SM
751 err = mlx5_create_map_eq(dev, eq,
752 i + MLX5_EQ_VEC_COMP_BASE, nent, 0,
01187175 753 name, MLX5_EQ_TYPE_COMP);
233d05d2
SM
754 if (err) {
755 kfree(eq);
756 goto clean;
757 }
758 mlx5_core_dbg(dev, "allocated completion EQN %d\n", eq->eqn);
759 eq->index = i;
760 spin_lock(&table->lock);
761 list_add_tail(&eq->list, &table->comp_eqs_list);
762 spin_unlock(&table->lock);
763 }
764
765 return 0;
766
767clean:
768 free_comp_eqs(dev);
769 return err;
770}
771
f62b8bb8
AV
772static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
773{
c4f287c4
SM
774 u32 query_in[MLX5_ST_SZ_DW(query_issi_in)] = {0};
775 u32 query_out[MLX5_ST_SZ_DW(query_issi_out)] = {0};
f62b8bb8 776 u32 sup_issi;
c4f287c4 777 int err;
f62b8bb8
AV
778
779 MLX5_SET(query_issi_in, query_in, opcode, MLX5_CMD_OP_QUERY_ISSI);
c4f287c4
SM
780 err = mlx5_cmd_exec(dev, query_in, sizeof(query_in),
781 query_out, sizeof(query_out));
f62b8bb8 782 if (err) {
c4f287c4
SM
783 u32 syndrome;
784 u8 status;
785
786 mlx5_cmd_mbox_status(query_out, &status, &syndrome);
f9c14e46
KH
787 if (!status || syndrome == MLX5_DRIVER_SYND) {
788 mlx5_core_err(dev, "Failed to query ISSI err(%d) status(%d) synd(%d)\n",
789 err, status, syndrome);
790 return err;
f62b8bb8
AV
791 }
792
f9c14e46
KH
793 mlx5_core_warn(dev, "Query ISSI is not supported by FW, ISSI is 0\n");
794 dev->issi = 0;
795 return 0;
f62b8bb8
AV
796 }
797
798 sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0);
799
800 if (sup_issi & (1 << 1)) {
c4f287c4
SM
801 u32 set_in[MLX5_ST_SZ_DW(set_issi_in)] = {0};
802 u32 set_out[MLX5_ST_SZ_DW(set_issi_out)] = {0};
f62b8bb8
AV
803
804 MLX5_SET(set_issi_in, set_in, opcode, MLX5_CMD_OP_SET_ISSI);
805 MLX5_SET(set_issi_in, set_in, current_issi, 1);
c4f287c4
SM
806 err = mlx5_cmd_exec(dev, set_in, sizeof(set_in),
807 set_out, sizeof(set_out));
f62b8bb8 808 if (err) {
f9c14e46
KH
809 mlx5_core_err(dev, "Failed to set ISSI to 1 err(%d)\n",
810 err);
f62b8bb8
AV
811 return err;
812 }
813
814 dev->issi = 1;
815
816 return 0;
e74a1db0 817 } else if (sup_issi & (1 << 0) || !sup_issi) {
f62b8bb8
AV
818 return 0;
819 }
820
9eb78923 821 return -EOPNOTSUPP;
f62b8bb8 822}
f62b8bb8 823
a31208b1
MD
824static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
825{
826 struct pci_dev *pdev = dev->pdev;
827 int err = 0;
e126ba97 828
e126ba97
EC
829 pci_set_drvdata(dev->pdev, dev);
830 strncpy(priv->name, dev_name(&pdev->dev), MLX5_MAX_NAME_LEN);
831 priv->name[MLX5_MAX_NAME_LEN - 1] = 0;
832
833 mutex_init(&priv->pgdir_mutex);
834 INIT_LIST_HEAD(&priv->pgdir_list);
835 spin_lock_init(&priv->mkey_lock);
836
311c7c71
SM
837 mutex_init(&priv->alloc_mutex);
838
839 priv->numa_node = dev_to_node(&dev->pdev->dev);
840
e126ba97 841 priv->dbg_root = debugfs_create_dir(dev_name(&pdev->dev), mlx5_debugfs_root);
f8ce0220
JM
842 if (!priv->dbg_root) {
843 dev_err(&pdev->dev, "Cannot create debugfs dir, aborting\n");
e126ba97 844 return -ENOMEM;
f8ce0220 845 }
e126ba97 846
89d44f0a 847 err = mlx5_pci_enable_device(dev);
e126ba97 848 if (err) {
1a91de28 849 dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
e126ba97
EC
850 goto err_dbg;
851 }
852
853 err = request_bar(pdev);
854 if (err) {
1a91de28 855 dev_err(&pdev->dev, "error requesting BARs, aborting\n");
e126ba97
EC
856 goto err_disable;
857 }
858
859 pci_set_master(pdev);
860
861 err = set_dma_caps(pdev);
862 if (err) {
863 dev_err(&pdev->dev, "Failed setting DMA capabilities mask, aborting\n");
864 goto err_clr_master;
865 }
866
867 dev->iseg_base = pci_resource_start(dev->pdev, 0);
868 dev->iseg = ioremap(dev->iseg_base, sizeof(*dev->iseg));
869 if (!dev->iseg) {
870 err = -ENOMEM;
871 dev_err(&pdev->dev, "Failed mapping initialization segment, aborting\n");
872 goto err_clr_master;
873 }
a31208b1
MD
874
875 return 0;
876
877err_clr_master:
878 pci_clear_master(dev->pdev);
879 release_bar(dev->pdev);
880err_disable:
89d44f0a 881 mlx5_pci_disable_device(dev);
a31208b1
MD
882
883err_dbg:
884 debugfs_remove(priv->dbg_root);
885 return err;
886}
887
888static void mlx5_pci_close(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
889{
890 iounmap(dev->iseg);
891 pci_clear_master(dev->pdev);
892 release_bar(dev->pdev);
89d44f0a 893 mlx5_pci_disable_device(dev);
f8ce0220 894 debugfs_remove_recursive(priv->dbg_root);
a31208b1
MD
895}
896
59211bd3
MHY
897static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
898{
899 struct pci_dev *pdev = dev->pdev;
900 int err;
901
59211bd3
MHY
902 err = mlx5_query_board_id(dev);
903 if (err) {
904 dev_err(&pdev->dev, "query board id failed\n");
905 goto out;
906 }
907
908 err = mlx5_eq_init(dev);
909 if (err) {
910 dev_err(&pdev->dev, "failed to initialize eq\n");
911 goto out;
912 }
913
59211bd3
MHY
914 err = mlx5_init_cq_table(dev);
915 if (err) {
916 dev_err(&pdev->dev, "failed to initialize cq table\n");
917 goto err_eq_cleanup;
918 }
919
920 mlx5_init_qp_table(dev);
921
922 mlx5_init_srq_table(dev);
923
924 mlx5_init_mkey_table(dev);
925
52ec462e
IT
926 mlx5_init_reserved_gids(dev);
927
59211bd3
MHY
928 err = mlx5_init_rl_table(dev);
929 if (err) {
930 dev_err(&pdev->dev, "Failed to init rate limiting\n");
931 goto err_tables_cleanup;
932 }
933
eeb66cdb
SM
934 err = mlx5_mpfs_init(dev);
935 if (err) {
936 dev_err(&pdev->dev, "Failed to init l2 table %d\n", err);
937 goto err_rl_cleanup;
938 }
939
c2d6e31a
MHY
940 err = mlx5_eswitch_init(dev);
941 if (err) {
942 dev_err(&pdev->dev, "Failed to init eswitch %d\n", err);
eeb66cdb 943 goto err_mpfs_cleanup;
c2d6e31a 944 }
c2d6e31a
MHY
945
946 err = mlx5_sriov_init(dev);
947 if (err) {
948 dev_err(&pdev->dev, "Failed to init sriov %d\n", err);
949 goto err_eswitch_cleanup;
950 }
951
9410733c
IT
952 err = mlx5_fpga_init(dev);
953 if (err) {
954 dev_err(&pdev->dev, "Failed to init fpga device %d\n", err);
955 goto err_sriov_cleanup;
956 }
957
59211bd3
MHY
958 return 0;
959
9410733c
IT
960err_sriov_cleanup:
961 mlx5_sriov_cleanup(dev);
c2d6e31a 962err_eswitch_cleanup:
c2d6e31a 963 mlx5_eswitch_cleanup(dev->priv.eswitch);
eeb66cdb 964err_mpfs_cleanup:
eeb66cdb 965 mlx5_mpfs_cleanup(dev);
c2d6e31a 966err_rl_cleanup:
c2d6e31a 967 mlx5_cleanup_rl_table(dev);
59211bd3
MHY
968err_tables_cleanup:
969 mlx5_cleanup_mkey_table(dev);
970 mlx5_cleanup_srq_table(dev);
971 mlx5_cleanup_qp_table(dev);
972 mlx5_cleanup_cq_table(dev);
973
974err_eq_cleanup:
975 mlx5_eq_cleanup(dev);
976
977out:
978 return err;
979}
980
981static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
982{
9410733c 983 mlx5_fpga_cleanup(dev);
c2d6e31a 984 mlx5_sriov_cleanup(dev);
c2d6e31a 985 mlx5_eswitch_cleanup(dev->priv.eswitch);
eeb66cdb 986 mlx5_mpfs_cleanup(dev);
59211bd3 987 mlx5_cleanup_rl_table(dev);
52ec462e 988 mlx5_cleanup_reserved_gids(dev);
59211bd3
MHY
989 mlx5_cleanup_mkey_table(dev);
990 mlx5_cleanup_srq_table(dev);
991 mlx5_cleanup_qp_table(dev);
992 mlx5_cleanup_cq_table(dev);
993 mlx5_eq_cleanup(dev);
994}
995
996static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
997 bool boot)
a31208b1
MD
998{
999 struct pci_dev *pdev = dev->pdev;
1000 int err;
1001
89d44f0a 1002 mutex_lock(&dev->intf_state_mutex);
5fc7197d 1003 if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
89d44f0a
MD
1004 dev_warn(&dev->pdev->dev, "%s: interface is up, NOP\n",
1005 __func__);
1006 goto out;
1007 }
1008
e126ba97
EC
1009 dev_info(&pdev->dev, "firmware version: %d.%d.%d\n", fw_rev_maj(dev),
1010 fw_rev_min(dev), fw_rev_sub(dev));
1011
89d44f0a
MD
1012 /* on load removing any previous indication of internal error, device is
1013 * up
1014 */
1015 dev->state = MLX5_DEVICE_STATE_UP;
1016
6c780a02
EC
1017 /* wait for firmware to accept initialization segments configurations
1018 */
1019 err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI);
1020 if (err) {
1021 dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n",
1022 FW_PRE_INIT_TIMEOUT_MILI);
8ce59b16 1023 goto out_err;
6c780a02
EC
1024 }
1025
e126ba97
EC
1026 err = mlx5_cmd_init(dev);
1027 if (err) {
1028 dev_err(&pdev->dev, "Failed initializing command interface, aborting\n");
89d44f0a 1029 goto out_err;
e126ba97
EC
1030 }
1031
e3297246
EC
1032 err = wait_fw_init(dev, FW_INIT_TIMEOUT_MILI);
1033 if (err) {
1034 dev_err(&dev->pdev->dev, "Firmware over %d MS in initializing state, aborting\n",
1035 FW_INIT_TIMEOUT_MILI);
55378a23 1036 goto err_cmd_cleanup;
e3297246
EC
1037 }
1038
0b107106 1039 err = mlx5_core_enable_hca(dev, 0);
cd23b14b
EC
1040 if (err) {
1041 dev_err(&pdev->dev, "enable hca failed\n");
59211bd3 1042 goto err_cmd_cleanup;
cd23b14b
EC
1043 }
1044
f62b8bb8
AV
1045 err = mlx5_core_set_issi(dev);
1046 if (err) {
1047 dev_err(&pdev->dev, "failed to set issi\n");
1048 goto err_disable_hca;
1049 }
f62b8bb8 1050
cd23b14b
EC
1051 err = mlx5_satisfy_startup_pages(dev, 1);
1052 if (err) {
1053 dev_err(&pdev->dev, "failed to allocate boot pages\n");
1054 goto err_disable_hca;
1055 }
1056
e126ba97
EC
1057 err = set_hca_ctrl(dev);
1058 if (err) {
1059 dev_err(&pdev->dev, "set_hca_ctrl failed\n");
cd23b14b 1060 goto reclaim_boot_pages;
e126ba97
EC
1061 }
1062
1063 err = handle_hca_cap(dev);
1064 if (err) {
1065 dev_err(&pdev->dev, "handle_hca_cap failed\n");
cd23b14b 1066 goto reclaim_boot_pages;
e126ba97
EC
1067 }
1068
f91e6d89
EBE
1069 err = handle_hca_cap_atomic(dev);
1070 if (err) {
1071 dev_err(&pdev->dev, "handle_hca_cap_atomic failed\n");
1072 goto reclaim_boot_pages;
e126ba97
EC
1073 }
1074
cd23b14b 1075 err = mlx5_satisfy_startup_pages(dev, 0);
e126ba97 1076 if (err) {
cd23b14b
EC
1077 dev_err(&pdev->dev, "failed to allocate init pages\n");
1078 goto reclaim_boot_pages;
e126ba97
EC
1079 }
1080
1081 err = mlx5_pagealloc_start(dev);
1082 if (err) {
1083 dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n");
cd23b14b 1084 goto reclaim_boot_pages;
e126ba97
EC
1085 }
1086
1087 err = mlx5_cmd_init_hca(dev);
1088 if (err) {
1089 dev_err(&pdev->dev, "init hca failed\n");
1090 goto err_pagealloc_stop;
1091 }
1092
012e50e1
HN
1093 mlx5_set_driver_version(dev);
1094
e126ba97
EC
1095 mlx5_start_health_poll(dev);
1096
bba1574c
DJ
1097 err = mlx5_query_hca_caps(dev);
1098 if (err) {
1099 dev_err(&pdev->dev, "query hca failed\n");
1100 goto err_stop_poll;
1101 }
1102
59211bd3
MHY
1103 if (boot && mlx5_init_once(dev, priv)) {
1104 dev_err(&pdev->dev, "sw objs init failed\n");
e126ba97
EC
1105 goto err_stop_poll;
1106 }
1107
78249c42 1108 err = mlx5_alloc_irq_vectors(dev);
e126ba97 1109 if (err) {
78249c42 1110 dev_err(&pdev->dev, "alloc irq vectors failed\n");
59211bd3 1111 goto err_cleanup_once;
e126ba97
EC
1112 }
1113
01187175
EC
1114 dev->priv.uar = mlx5_get_uars_page(dev);
1115 if (!dev->priv.uar) {
e126ba97 1116 dev_err(&pdev->dev, "Failed allocating uar, aborting\n");
59211bd3 1117 goto err_disable_msix;
e126ba97
EC
1118 }
1119
1120 err = mlx5_start_eqs(dev);
1121 if (err) {
1122 dev_err(&pdev->dev, "Failed to start pages and async EQs\n");
9410733c 1123 goto err_put_uars;
e126ba97
EC
1124 }
1125
233d05d2
SM
1126 err = alloc_comp_eqs(dev);
1127 if (err) {
1128 dev_err(&pdev->dev, "Failed to alloc completion EQs\n");
1129 goto err_stop_eqs;
1130 }
1131
8f5bbb29
SM
1132 err = mlx5_irq_set_affinity_hints(dev);
1133 if (err) {
1134 dev_err(&pdev->dev, "Failed to alloc affinity hint cpumask\n");
1135 goto err_affinity_hints;
1136 }
1137
86d722ad 1138 err = mlx5_init_fs(dev);
59211bd3 1139 if (err) {
86d722ad 1140 dev_err(&pdev->dev, "Failed to init flow steering\n");
c85023e1 1141 goto err_fs;
59211bd3 1142 }
e126ba97 1143
c85023e1 1144 err = mlx5_core_set_hca_defaults(dev);
86d722ad 1145 if (err) {
c85023e1 1146 dev_err(&pdev->dev, "Failed to set hca defaults\n");
86d722ad
MG
1147 goto err_fs;
1148 }
1466cc5b 1149
c2d6e31a 1150 err = mlx5_sriov_attach(dev);
fc50db98
EC
1151 if (err) {
1152 dev_err(&pdev->dev, "sriov init failed %d\n", err);
1153 goto err_sriov;
1154 }
1155
e29341fb
IT
1156 err = mlx5_fpga_device_start(dev);
1157 if (err) {
1158 dev_err(&pdev->dev, "fpga device start failed %d\n", err);
52ec462e 1159 goto err_fpga_start;
e29341fb 1160 }
bebb23e6
IT
1161 err = mlx5_accel_ipsec_init(dev);
1162 if (err) {
1163 dev_err(&pdev->dev, "IPSec device start failed %d\n", err);
1164 goto err_ipsec_start;
1165 }
e29341fb 1166
737a234b
MHY
1167 if (mlx5_device_registered(dev)) {
1168 mlx5_attach_device(dev);
1169 } else {
1170 err = mlx5_register_device(dev);
1171 if (err) {
1172 dev_err(&pdev->dev, "mlx5_register_device failed %d\n", err);
1173 goto err_reg_dev;
1174 }
a31208b1
MD
1175 }
1176
5fc7197d 1177 set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
89d44f0a
MD
1178out:
1179 mutex_unlock(&dev->intf_state_mutex);
1180
e126ba97
EC
1181 return 0;
1182
59211bd3 1183err_reg_dev:
bebb23e6
IT
1184 mlx5_accel_ipsec_cleanup(dev);
1185err_ipsec_start:
52ec462e
IT
1186 mlx5_fpga_device_stop(dev);
1187
1188err_fpga_start:
c2d6e31a 1189 mlx5_sriov_detach(dev);
fc50db98 1190
59211bd3 1191err_sriov:
86d722ad 1192 mlx5_cleanup_fs(dev);
59211bd3 1193
86d722ad 1194err_fs:
8f5bbb29
SM
1195 mlx5_irq_clear_affinity_hints(dev);
1196
1197err_affinity_hints:
db058a18
SM
1198 free_comp_eqs(dev);
1199
233d05d2
SM
1200err_stop_eqs:
1201 mlx5_stop_eqs(dev);
1202
5fe9dec0 1203err_put_uars:
01187175 1204 mlx5_put_uars_page(dev, priv->uar);
e126ba97 1205
59211bd3 1206err_disable_msix:
78249c42 1207 mlx5_free_irq_vectors(dev);
e126ba97 1208
59211bd3
MHY
1209err_cleanup_once:
1210 if (boot)
1211 mlx5_cleanup_once(dev);
1212
e126ba97 1213err_stop_poll:
47f74ff0 1214 mlx5_stop_health_poll(dev, boot);
1bde6e30
EC
1215 if (mlx5_cmd_teardown_hca(dev)) {
1216 dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
89d44f0a 1217 goto out_err;
1bde6e30 1218 }
e126ba97
EC
1219
1220err_pagealloc_stop:
1221 mlx5_pagealloc_stop(dev);
1222
cd23b14b 1223reclaim_boot_pages:
e126ba97
EC
1224 mlx5_reclaim_startup_pages(dev);
1225
cd23b14b 1226err_disable_hca:
0b107106 1227 mlx5_core_disable_hca(dev, 0);
cd23b14b 1228
59211bd3 1229err_cmd_cleanup:
e126ba97
EC
1230 mlx5_cmd_cleanup(dev);
1231
89d44f0a
MD
1232out_err:
1233 dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
1234 mutex_unlock(&dev->intf_state_mutex);
1235
e126ba97
EC
1236 return err;
1237}
e126ba97 1238
59211bd3
MHY
1239static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
1240 bool cleanup)
e126ba97 1241{
89d44f0a 1242 int err = 0;
e126ba97 1243
5e44fca5 1244 if (cleanup)
2a0165a0 1245 mlx5_drain_health_recovery(dev);
689a248d 1246
89d44f0a 1247 mutex_lock(&dev->intf_state_mutex);
b3cb5388 1248 if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
89d44f0a
MD
1249 dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n",
1250 __func__);
59211bd3
MHY
1251 if (cleanup)
1252 mlx5_cleanup_once(dev);
89d44f0a
MD
1253 goto out;
1254 }
6b6adee3 1255
9ade8c7c 1256 clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
9ade8c7c 1257
737a234b
MHY
1258 if (mlx5_device_registered(dev))
1259 mlx5_detach_device(dev);
1260
bebb23e6 1261 mlx5_accel_ipsec_cleanup(dev);
52ec462e
IT
1262 mlx5_fpga_device_stop(dev);
1263
c2d6e31a 1264 mlx5_sriov_detach(dev);
86d722ad 1265 mlx5_cleanup_fs(dev);
8f5bbb29 1266 mlx5_irq_clear_affinity_hints(dev);
233d05d2 1267 free_comp_eqs(dev);
e126ba97 1268 mlx5_stop_eqs(dev);
01187175 1269 mlx5_put_uars_page(dev, priv->uar);
78249c42 1270 mlx5_free_irq_vectors(dev);
59211bd3
MHY
1271 if (cleanup)
1272 mlx5_cleanup_once(dev);
47f74ff0 1273 mlx5_stop_health_poll(dev, cleanup);
ac6ea6e8
EC
1274 err = mlx5_cmd_teardown_hca(dev);
1275 if (err) {
1bde6e30 1276 dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
ac6ea6e8 1277 goto out;
1bde6e30 1278 }
e126ba97
EC
1279 mlx5_pagealloc_stop(dev);
1280 mlx5_reclaim_startup_pages(dev);
0b107106 1281 mlx5_core_disable_hca(dev, 0);
e126ba97 1282 mlx5_cmd_cleanup(dev);
9603b61d 1283
ac6ea6e8 1284out:
89d44f0a 1285 mutex_unlock(&dev->intf_state_mutex);
ac6ea6e8 1286 return err;
9603b61d 1287}
64613d94 1288
9603b61d
JM
1289struct mlx5_core_event_handler {
1290 void (*event)(struct mlx5_core_dev *dev,
1291 enum mlx5_dev_event event,
1292 void *data);
1293};
1294
feae9087 1295static const struct devlink_ops mlx5_devlink_ops = {
e80541ec 1296#ifdef CONFIG_MLX5_ESWITCH
feae9087
OG
1297 .eswitch_mode_set = mlx5_devlink_eswitch_mode_set,
1298 .eswitch_mode_get = mlx5_devlink_eswitch_mode_get,
bffaa916
RD
1299 .eswitch_inline_mode_set = mlx5_devlink_eswitch_inline_mode_set,
1300 .eswitch_inline_mode_get = mlx5_devlink_eswitch_inline_mode_get,
7768d197
RD
1301 .eswitch_encap_mode_set = mlx5_devlink_eswitch_encap_mode_set,
1302 .eswitch_encap_mode_get = mlx5_devlink_eswitch_encap_mode_get,
feae9087
OG
1303#endif
1304};
f66f049f 1305
59211bd3 1306#define MLX5_IB_MOD "mlx5_ib"
9603b61d
JM
1307static int init_one(struct pci_dev *pdev,
1308 const struct pci_device_id *id)
1309{
1310 struct mlx5_core_dev *dev;
feae9087 1311 struct devlink *devlink;
9603b61d
JM
1312 struct mlx5_priv *priv;
1313 int err;
1314
feae9087
OG
1315 devlink = devlink_alloc(&mlx5_devlink_ops, sizeof(*dev));
1316 if (!devlink) {
9603b61d
JM
1317 dev_err(&pdev->dev, "kzalloc failed\n");
1318 return -ENOMEM;
1319 }
feae9087
OG
1320
1321 dev = devlink_priv(devlink);
9603b61d 1322 priv = &dev->priv;
fc50db98 1323 priv->pci_dev_data = id->driver_data;
9603b61d
JM
1324
1325 pci_set_drvdata(pdev, dev);
1326
0e97a340
HN
1327 dev->pdev = pdev;
1328 dev->event = mlx5_core_event;
9603b61d 1329 dev->profile = &profile[prof_sel];
9603b61d 1330
364d1798
EC
1331 INIT_LIST_HEAD(&priv->ctx_list);
1332 spin_lock_init(&priv->ctx_lock);
89d44f0a
MD
1333 mutex_init(&dev->pci_status_mutex);
1334 mutex_init(&dev->intf_state_mutex);
d9aaed83 1335
97834eba
ES
1336 INIT_LIST_HEAD(&priv->waiting_events_list);
1337 priv->is_accum_events = false;
1338
d9aaed83
AK
1339#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1340 err = init_srcu_struct(&priv->pfault_srcu);
1341 if (err) {
1342 dev_err(&pdev->dev, "init_srcu_struct failed with error code %d\n",
1343 err);
1344 goto clean_dev;
1345 }
1346#endif
01187175
EC
1347 mutex_init(&priv->bfregs.reg_head.lock);
1348 mutex_init(&priv->bfregs.wc_head.lock);
1349 INIT_LIST_HEAD(&priv->bfregs.reg_head.list);
1350 INIT_LIST_HEAD(&priv->bfregs.wc_head.list);
1351
a31208b1 1352 err = mlx5_pci_init(dev, priv);
9603b61d 1353 if (err) {
a31208b1 1354 dev_err(&pdev->dev, "mlx5_pci_init failed with error code %d\n", err);
d9aaed83 1355 goto clean_srcu;
9603b61d
JM
1356 }
1357
ac6ea6e8
EC
1358 err = mlx5_health_init(dev);
1359 if (err) {
1360 dev_err(&pdev->dev, "mlx5_health_init failed with error code %d\n", err);
1361 goto close_pci;
1362 }
1363
59211bd3
MHY
1364 mlx5_pagealloc_init(dev);
1365
1366 err = mlx5_load_one(dev, priv, true);
9603b61d 1367 if (err) {
a31208b1 1368 dev_err(&pdev->dev, "mlx5_load_one failed with error code %d\n", err);
ac6ea6e8 1369 goto clean_health;
9603b61d 1370 }
59211bd3 1371
f82eed45 1372 request_module_nowait(MLX5_IB_MOD);
9603b61d 1373
feae9087
OG
1374 err = devlink_register(devlink, &pdev->dev);
1375 if (err)
1376 goto clean_load;
1377
5d47f6c8 1378 pci_save_state(pdev);
9603b61d
JM
1379 return 0;
1380
feae9087 1381clean_load:
59211bd3 1382 mlx5_unload_one(dev, priv, true);
ac6ea6e8 1383clean_health:
59211bd3 1384 mlx5_pagealloc_cleanup(dev);
ac6ea6e8 1385 mlx5_health_cleanup(dev);
a31208b1
MD
1386close_pci:
1387 mlx5_pci_close(dev, priv);
d9aaed83
AK
1388clean_srcu:
1389#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1390 cleanup_srcu_struct(&priv->pfault_srcu);
a31208b1 1391clean_dev:
d9aaed83 1392#endif
feae9087 1393 devlink_free(devlink);
a31208b1 1394
9603b61d
JM
1395 return err;
1396}
a31208b1 1397
9603b61d
JM
1398static void remove_one(struct pci_dev *pdev)
1399{
1400 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
feae9087 1401 struct devlink *devlink = priv_to_devlink(dev);
a31208b1 1402 struct mlx5_priv *priv = &dev->priv;
9603b61d 1403
feae9087 1404 devlink_unregister(devlink);
737a234b
MHY
1405 mlx5_unregister_device(dev);
1406
59211bd3 1407 if (mlx5_unload_one(dev, priv, true)) {
a31208b1 1408 dev_err(&dev->pdev->dev, "mlx5_unload_one failed\n");
ac6ea6e8 1409 mlx5_health_cleanup(dev);
a31208b1
MD
1410 return;
1411 }
737a234b 1412
59211bd3 1413 mlx5_pagealloc_cleanup(dev);
ac6ea6e8 1414 mlx5_health_cleanup(dev);
a31208b1 1415 mlx5_pci_close(dev, priv);
d9aaed83
AK
1416#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1417 cleanup_srcu_struct(&priv->pfault_srcu);
1418#endif
feae9087 1419 devlink_free(devlink);
9603b61d
JM
1420}
1421
89d44f0a
MD
1422static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
1423 pci_channel_state_t state)
1424{
1425 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1426 struct mlx5_priv *priv = &dev->priv;
1427
1428 dev_info(&pdev->dev, "%s was called\n", __func__);
04c0c1ab 1429
8812c24d 1430 mlx5_enter_error_state(dev, false);
59211bd3 1431 mlx5_unload_one(dev, priv, false);
5d47f6c8 1432 /* In case of kernel call drain the health wq */
05ac2c0b 1433 if (state) {
5e44fca5 1434 mlx5_drain_health_wq(dev);
05ac2c0b
MHY
1435 mlx5_pci_disable_device(dev);
1436 }
1437
89d44f0a
MD
1438 return state == pci_channel_io_perm_failure ?
1439 PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
1440}
1441
d57847dc
DJ
1442/* wait for the device to show vital signs by waiting
1443 * for the health counter to start counting.
89d44f0a 1444 */
d57847dc 1445static int wait_vital(struct pci_dev *pdev)
89d44f0a
MD
1446{
1447 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1448 struct mlx5_core_health *health = &dev->priv.health;
1449 const int niter = 100;
d57847dc 1450 u32 last_count = 0;
89d44f0a 1451 u32 count;
89d44f0a
MD
1452 int i;
1453
89d44f0a
MD
1454 for (i = 0; i < niter; i++) {
1455 count = ioread32be(health->health_counter);
1456 if (count && count != 0xffffffff) {
d57847dc
DJ
1457 if (last_count && last_count != count) {
1458 dev_info(&pdev->dev, "Counter value 0x%x after %d iterations\n", count, i);
1459 return 0;
1460 }
1461 last_count = count;
89d44f0a
MD
1462 }
1463 msleep(50);
1464 }
1465
d57847dc 1466 return -ETIMEDOUT;
89d44f0a
MD
1467}
1468
1061c90f 1469static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev)
89d44f0a
MD
1470{
1471 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
89d44f0a
MD
1472 int err;
1473
1474 dev_info(&pdev->dev, "%s was called\n", __func__);
1475
1061c90f 1476 err = mlx5_pci_enable_device(dev);
d57847dc 1477 if (err) {
1061c90f
MHY
1478 dev_err(&pdev->dev, "%s: mlx5_pci_enable_device failed with error code: %d\n"
1479 , __func__, err);
1480 return PCI_ERS_RESULT_DISCONNECT;
1481 }
1482
1483 pci_set_master(pdev);
1484 pci_restore_state(pdev);
5d47f6c8 1485 pci_save_state(pdev);
1061c90f
MHY
1486
1487 if (wait_vital(pdev)) {
d57847dc 1488 dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__);
1061c90f 1489 return PCI_ERS_RESULT_DISCONNECT;
d57847dc 1490 }
89d44f0a 1491
1061c90f
MHY
1492 return PCI_ERS_RESULT_RECOVERED;
1493}
1494
1061c90f
MHY
1495static void mlx5_pci_resume(struct pci_dev *pdev)
1496{
1497 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1498 struct mlx5_priv *priv = &dev->priv;
1499 int err;
1500
1501 dev_info(&pdev->dev, "%s was called\n", __func__);
1502
59211bd3 1503 err = mlx5_load_one(dev, priv, false);
89d44f0a
MD
1504 if (err)
1505 dev_err(&pdev->dev, "%s: mlx5_load_one failed with error code: %d\n"
1506 , __func__, err);
1507 else
1508 dev_info(&pdev->dev, "%s: device recovered\n", __func__);
1509}
1510
1511static const struct pci_error_handlers mlx5_err_handler = {
1512 .error_detected = mlx5_pci_err_detected,
1513 .slot_reset = mlx5_pci_slot_reset,
1514 .resume = mlx5_pci_resume
1515};
1516
8812c24d
MD
1517static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
1518{
1519 int ret;
1520
1521 if (!MLX5_CAP_GEN(dev, force_teardown)) {
1522 mlx5_core_dbg(dev, "force teardown is not supported in the firmware\n");
1523 return -EOPNOTSUPP;
1524 }
1525
1526 if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) {
1527 mlx5_core_dbg(dev, "Device in internal error state, giving up\n");
1528 return -EAGAIN;
1529 }
1530
d2aa060d
HN
1531 /* Panic tear down fw command will stop the PCI bus communication
1532 * with the HCA, so the health polll is no longer needed.
1533 */
1534 mlx5_drain_health_wq(dev);
47f74ff0 1535 mlx5_stop_health_poll(dev, false);
d2aa060d 1536
8812c24d
MD
1537 ret = mlx5_cmd_force_teardown_hca(dev);
1538 if (ret) {
1539 mlx5_core_dbg(dev, "Firmware couldn't do fast unload error: %d\n", ret);
d2aa060d 1540 mlx5_start_health_poll(dev);
8812c24d
MD
1541 return ret;
1542 }
1543
1544 mlx5_enter_error_state(dev, true);
1545
1546 return 0;
1547}
1548
5fc7197d
MD
1549static void shutdown(struct pci_dev *pdev)
1550{
1551 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1552 struct mlx5_priv *priv = &dev->priv;
8812c24d 1553 int err;
5fc7197d
MD
1554
1555 dev_info(&pdev->dev, "Shutdown was called\n");
8812c24d
MD
1556 err = mlx5_try_fast_unload(dev);
1557 if (err)
1558 mlx5_unload_one(dev, priv, false);
5fc7197d
MD
1559 mlx5_pci_disable_device(dev);
1560}
1561
9603b61d 1562static const struct pci_device_id mlx5_core_pci_table[] = {
bbad7c21 1563 { PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_CONNECTIB) },
fc50db98 1564 { PCI_VDEVICE(MELLANOX, 0x1012), MLX5_PCI_DEV_IS_VF}, /* Connect-IB VF */
bbad7c21 1565 { PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_CONNECTX4) },
fc50db98 1566 { PCI_VDEVICE(MELLANOX, 0x1014), MLX5_PCI_DEV_IS_VF}, /* ConnectX-4 VF */
bbad7c21 1567 { PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_CONNECTX4_LX) },
fc50db98 1568 { PCI_VDEVICE(MELLANOX, 0x1016), MLX5_PCI_DEV_IS_VF}, /* ConnectX-4LX VF */
7092fe86 1569 { PCI_VDEVICE(MELLANOX, 0x1017) }, /* ConnectX-5, PCIe 3.0 */
64dbbdfe 1570 { PCI_VDEVICE(MELLANOX, 0x1018), MLX5_PCI_DEV_IS_VF}, /* ConnectX-5 VF */
d0dd989f
MD
1571 { PCI_VDEVICE(MELLANOX, 0x1019) }, /* ConnectX-5 Ex */
1572 { PCI_VDEVICE(MELLANOX, 0x101a), MLX5_PCI_DEV_IS_VF}, /* ConnectX-5 Ex VF */
1573 { PCI_VDEVICE(MELLANOX, 0x101b) }, /* ConnectX-6 */
1574 { PCI_VDEVICE(MELLANOX, 0x101c), MLX5_PCI_DEV_IS_VF}, /* ConnectX-6 VF */
2e9d3e83
NO
1575 { PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */
1576 { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */
9603b61d
JM
1577 { 0, }
1578};
1579
1580MODULE_DEVICE_TABLE(pci, mlx5_core_pci_table);
1581
04c0c1ab
MHY
1582void mlx5_disable_device(struct mlx5_core_dev *dev)
1583{
1584 mlx5_pci_err_detected(dev->pdev, 0);
1585}
1586
1587void mlx5_recover_device(struct mlx5_core_dev *dev)
1588{
1589 mlx5_pci_disable_device(dev);
1590 if (mlx5_pci_slot_reset(dev->pdev) == PCI_ERS_RESULT_RECOVERED)
1591 mlx5_pci_resume(dev->pdev);
1592}
1593
9603b61d
JM
1594static struct pci_driver mlx5_core_driver = {
1595 .name = DRIVER_NAME,
1596 .id_table = mlx5_core_pci_table,
1597 .probe = init_one,
89d44f0a 1598 .remove = remove_one,
5fc7197d 1599 .shutdown = shutdown,
fc50db98
EC
1600 .err_handler = &mlx5_err_handler,
1601 .sriov_configure = mlx5_core_sriov_configure,
9603b61d 1602};
e126ba97 1603
f663ad98
KH
1604static void mlx5_core_verify_params(void)
1605{
1606 if (prof_sel >= ARRAY_SIZE(profile)) {
1607 pr_warn("mlx5_core: WARNING: Invalid module parameter prof_sel %d, valid range 0-%zu, changing back to default(%d)\n",
1608 prof_sel,
1609 ARRAY_SIZE(profile) - 1,
1610 MLX5_DEFAULT_PROF);
1611 prof_sel = MLX5_DEFAULT_PROF;
1612 }
1613}
1614
e126ba97
EC
1615static int __init init(void)
1616{
1617 int err;
1618
f663ad98 1619 mlx5_core_verify_params();
e126ba97 1620 mlx5_register_debugfs();
e126ba97 1621
9603b61d
JM
1622 err = pci_register_driver(&mlx5_core_driver);
1623 if (err)
ac6ea6e8 1624 goto err_debug;
9603b61d 1625
f62b8bb8
AV
1626#ifdef CONFIG_MLX5_CORE_EN
1627 mlx5e_init();
1628#endif
1629
e126ba97
EC
1630 return 0;
1631
e126ba97
EC
1632err_debug:
1633 mlx5_unregister_debugfs();
1634 return err;
1635}
1636
1637static void __exit cleanup(void)
1638{
f62b8bb8
AV
1639#ifdef CONFIG_MLX5_CORE_EN
1640 mlx5e_cleanup();
1641#endif
9603b61d 1642 pci_unregister_driver(&mlx5_core_driver);
e126ba97
EC
1643 mlx5_unregister_debugfs();
1644}
1645
1646module_init(init);
1647module_exit(cleanup);