xref: /openbmc/linux/drivers/net/ethernet/sfc/ef100.c (revision 31e67366)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /****************************************************************************
3  * Driver for Solarflare network controllers and boards
4  * Copyright 2005-2018 Solarflare Communications Inc.
5  * Copyright 2019-2020 Xilinx Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License version 2 as published
9  * by the Free Software Foundation, incorporated herein by reference.
10  */
11 
12 #include "net_driver.h"
13 #include <linux/module.h>
14 #include <linux/aer.h>
15 #include "efx_common.h"
16 #include "efx_channels.h"
17 #include "io.h"
18 #include "ef100_nic.h"
19 #include "ef100_netdev.h"
20 #include "ef100_regs.h"
21 #include "ef100.h"
22 
23 #define EFX_EF100_PCI_DEFAULT_BAR	2
24 
25 /* Number of bytes at start of vendor specified extended capability that indicate
26  * that the capability is vendor specified. i.e. offset from value returned by
27  * pci_find_next_ext_capability() to beginning of vendor specified capability
28  * header.
29  */
30 #define PCI_EXT_CAP_HDR_LENGTH  4
31 
32 /* Expected size of a Xilinx continuation address table entry. */
33 #define ESE_GZ_CFGBAR_CONT_CAP_MIN_LENGTH      16
34 
35 struct ef100_func_ctl_window {
36 	bool valid;
37 	unsigned int bar;
38 	u64 offset;
39 };
40 
41 static int ef100_pci_walk_xilinx_table(struct efx_nic *efx, u64 offset,
42 				       struct ef100_func_ctl_window *result);
43 
44 /* Number of bytes to offset when reading bit position x with dword accessors. */
45 #define ROUND_DOWN_TO_DWORD(x) (((x) & (~31)) >> 3)
46 
47 #define EXTRACT_BITS(x, lbn, width) \
48 	(((x) >> ((lbn) & 31)) & ((1ull << (width)) - 1))
49 
50 static u32 _ef100_pci_get_bar_bits_with_width(struct efx_nic *efx,
51 					      int structure_start,
52 					      int lbn, int width)
53 {
54 	efx_dword_t dword;
55 
56 	efx_readd(efx, &dword, structure_start + ROUND_DOWN_TO_DWORD(lbn));
57 
58 	return EXTRACT_BITS(le32_to_cpu(dword.u32[0]), lbn, width);
59 }
60 
61 #define ef100_pci_get_bar_bits(efx, entry_location, bitdef)	\
62 	_ef100_pci_get_bar_bits_with_width(efx, entry_location,	\
63 		ESF_GZ_CFGBAR_ ## bitdef ## _LBN,		\
64 		ESF_GZ_CFGBAR_ ## bitdef ## _WIDTH)
65 
66 static int ef100_pci_parse_ef100_entry(struct efx_nic *efx, int entry_location,
67 				       struct ef100_func_ctl_window *result)
68 {
69 	u64 offset = ef100_pci_get_bar_bits(efx, entry_location, EF100_FUNC_CTL_WIN_OFF) <<
70 					ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT;
71 	u32 bar = ef100_pci_get_bar_bits(efx, entry_location, EF100_BAR);
72 
73 	netif_dbg(efx, probe, efx->net_dev,
74 		  "Found EF100 function control window bar=%d offset=0x%llx\n",
75 		  bar, offset);
76 
77 	if (result->valid) {
78 		netif_err(efx, probe, efx->net_dev,
79 			  "Duplicated EF100 table entry.\n");
80 		return -EINVAL;
81 	}
82 
83 	if (bar == ESE_GZ_CFGBAR_EF100_BAR_NUM_EXPANSION_ROM ||
84 	    bar == ESE_GZ_CFGBAR_EF100_BAR_NUM_INVALID) {
85 		netif_err(efx, probe, efx->net_dev,
86 			  "Bad BAR value of %d in Xilinx capabilities EF100 entry.\n",
87 			  bar);
88 		return -EINVAL;
89 	}
90 
91 	result->bar = bar;
92 	result->offset = offset;
93 	result->valid = true;
94 	return 0;
95 }
96 
97 static bool ef100_pci_does_bar_overflow(struct efx_nic *efx, int bar,
98 					u64 next_entry)
99 {
100 	return next_entry + ESE_GZ_CFGBAR_ENTRY_HEADER_SIZE >
101 					pci_resource_len(efx->pci_dev, bar);
102 }
103 
104 /* Parse a Xilinx capabilities table entry describing a continuation to a new
105  * sub-table.
106  */
107 static int ef100_pci_parse_continue_entry(struct efx_nic *efx, int entry_location,
108 					  struct ef100_func_ctl_window *result)
109 {
110 	unsigned int previous_bar;
111 	efx_oword_t entry;
112 	u64 offset;
113 	int rc = 0;
114 	u32 bar;
115 
116 	efx_reado(efx, &entry, entry_location);
117 
118 	bar = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_CONT_CAP_BAR);
119 
120 	offset = EFX_OWORD_FIELD64(entry, ESF_GZ_CFGBAR_CONT_CAP_OFFSET) <<
121 		ESE_GZ_CONT_CAP_OFFSET_BYTES_SHIFT;
122 
123 	previous_bar = efx->mem_bar;
124 
125 	if (bar == ESE_GZ_VSEC_BAR_NUM_EXPANSION_ROM ||
126 	    bar == ESE_GZ_VSEC_BAR_NUM_INVALID) {
127 		netif_err(efx, probe, efx->net_dev,
128 			  "Bad BAR value of %d in Xilinx capabilities sub-table.\n",
129 			  bar);
130 		return -EINVAL;
131 	}
132 
133 	if (bar != previous_bar) {
134 		efx_fini_io(efx);
135 
136 		if (ef100_pci_does_bar_overflow(efx, bar, offset)) {
137 			netif_err(efx, probe, efx->net_dev,
138 				  "Xilinx table will overrun BAR[%d] offset=0x%llx\n",
139 				  bar, offset);
140 			return -EINVAL;
141 		}
142 
143 		/* Temporarily map new BAR. */
144 		rc = efx_init_io(efx, bar,
145 				 (dma_addr_t)DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
146 				 pci_resource_len(efx->pci_dev, bar));
147 		if (rc) {
148 			netif_err(efx, probe, efx->net_dev,
149 				  "Mapping new BAR for Xilinx table failed, rc=%d\n", rc);
150 			return rc;
151 		}
152 	}
153 
154 	rc = ef100_pci_walk_xilinx_table(efx, offset, result);
155 	if (rc)
156 		return rc;
157 
158 	if (bar != previous_bar) {
159 		efx_fini_io(efx);
160 
161 		/* Put old BAR back. */
162 		rc = efx_init_io(efx, previous_bar,
163 				 (dma_addr_t)DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
164 				 pci_resource_len(efx->pci_dev, previous_bar));
165 		if (rc) {
166 			netif_err(efx, probe, efx->net_dev,
167 				  "Putting old BAR back failed, rc=%d\n", rc);
168 			return rc;
169 		}
170 	}
171 
172 	return 0;
173 }
174 
175 /* Iterate over the Xilinx capabilities table in the currently mapped BAR and
176  * call ef100_pci_parse_ef100_entry() on any EF100 entries and
177  * ef100_pci_parse_continue_entry() on any table continuations.
178  */
179 static int ef100_pci_walk_xilinx_table(struct efx_nic *efx, u64 offset,
180 				       struct ef100_func_ctl_window *result)
181 {
182 	u64 current_entry = offset;
183 	int rc = 0;
184 
185 	while (true) {
186 		u32 id = ef100_pci_get_bar_bits(efx, current_entry, ENTRY_FORMAT);
187 		u32 last = ef100_pci_get_bar_bits(efx, current_entry, ENTRY_LAST);
188 		u32 rev = ef100_pci_get_bar_bits(efx, current_entry, ENTRY_REV);
189 		u32 entry_size;
190 
191 		if (id == ESE_GZ_CFGBAR_ENTRY_LAST)
192 			return 0;
193 
194 		entry_size = ef100_pci_get_bar_bits(efx, current_entry, ENTRY_SIZE);
195 
196 		netif_dbg(efx, probe, efx->net_dev,
197 			  "Seen Xilinx table entry 0x%x size 0x%x at 0x%llx in BAR[%d]\n",
198 			  id, entry_size, current_entry, efx->mem_bar);
199 
200 		if (entry_size < sizeof(u32) * 2) {
201 			netif_err(efx, probe, efx->net_dev,
202 				  "Xilinx table entry too short len=0x%x\n", entry_size);
203 			return -EINVAL;
204 		}
205 
206 		switch (id) {
207 		case ESE_GZ_CFGBAR_ENTRY_EF100:
208 			if (rev != ESE_GZ_CFGBAR_ENTRY_REV_EF100 ||
209 			    entry_size < ESE_GZ_CFGBAR_ENTRY_SIZE_EF100) {
210 				netif_err(efx, probe, efx->net_dev,
211 					  "Bad length or rev for EF100 entry in Xilinx capabilities table. entry_size=%d rev=%d.\n",
212 					  entry_size, rev);
213 				return -EINVAL;
214 			}
215 
216 			rc = ef100_pci_parse_ef100_entry(efx, current_entry,
217 							 result);
218 			if (rc)
219 				return rc;
220 			break;
221 		case ESE_GZ_CFGBAR_ENTRY_CONT_CAP_ADDR:
222 			if (rev != 0 || entry_size < ESE_GZ_CFGBAR_CONT_CAP_MIN_LENGTH) {
223 				netif_err(efx, probe, efx->net_dev,
224 					  "Bad length or rev for continue entry in Xilinx capabilities table. entry_size=%d rev=%d.\n",
225 					  entry_size, rev);
226 				return -EINVAL;
227 			}
228 
229 			rc = ef100_pci_parse_continue_entry(efx, current_entry, result);
230 			if (rc)
231 				return rc;
232 			break;
233 		default:
234 			/* Ignore unknown table entries. */
235 			break;
236 		}
237 
238 		if (last)
239 			return 0;
240 
241 		current_entry += entry_size;
242 
243 		if (ef100_pci_does_bar_overflow(efx, efx->mem_bar, current_entry)) {
244 			netif_err(efx, probe, efx->net_dev,
245 				  "Xilinx table overrun at position=0x%llx.\n",
246 				  current_entry);
247 			return -EINVAL;
248 		}
249 	}
250 }
251 
252 static int _ef100_pci_get_config_bits_with_width(struct efx_nic *efx,
253 						 int structure_start, int lbn,
254 						 int width, u32 *result)
255 {
256 	int rc, pos = structure_start + ROUND_DOWN_TO_DWORD(lbn);
257 	u32 temp;
258 
259 	rc = pci_read_config_dword(efx->pci_dev, pos, &temp);
260 	if (rc) {
261 		netif_err(efx, probe, efx->net_dev,
262 			  "Failed to read PCI config dword at %d\n",
263 			  pos);
264 		return rc;
265 	}
266 
267 	*result = EXTRACT_BITS(temp, lbn, width);
268 
269 	return 0;
270 }
271 
272 #define ef100_pci_get_config_bits(efx, entry_location, bitdef, result)	\
273 	_ef100_pci_get_config_bits_with_width(efx, entry_location,	\
274 		 ESF_GZ_VSEC_ ## bitdef ## _LBN,			\
275 		 ESF_GZ_VSEC_ ## bitdef ## _WIDTH, result)
276 
277 /* Call ef100_pci_walk_xilinx_table() for the Xilinx capabilities table pointed
278  * to by this PCI_EXT_CAP_ID_VNDR.
279  */
280 static int ef100_pci_parse_xilinx_cap(struct efx_nic *efx, int vndr_cap,
281 				      bool has_offset_hi,
282 				      struct ef100_func_ctl_window *result)
283 {
284 	u32 offset_high = 0;
285 	u32 offset_lo = 0;
286 	u64 offset = 0;
287 	u32 bar = 0;
288 	int rc = 0;
289 
290 	rc = ef100_pci_get_config_bits(efx, vndr_cap, TBL_BAR, &bar);
291 	if (rc) {
292 		netif_err(efx, probe, efx->net_dev,
293 			  "Failed to read ESF_GZ_VSEC_TBL_BAR, rc=%d\n",
294 			  rc);
295 		return rc;
296 	}
297 
298 	if (bar == ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_EXPANSION_ROM ||
299 	    bar == ESE_GZ_CFGBAR_CONT_CAP_BAR_NUM_INVALID) {
300 		netif_err(efx, probe, efx->net_dev,
301 			  "Bad BAR value of %d in Xilinx capabilities sub-table.\n",
302 			  bar);
303 		return -EINVAL;
304 	}
305 
306 	rc = ef100_pci_get_config_bits(efx, vndr_cap, TBL_OFF_LO, &offset_lo);
307 	if (rc) {
308 		netif_err(efx, probe, efx->net_dev,
309 			  "Failed to read ESF_GZ_VSEC_TBL_OFF_LO, rc=%d\n",
310 			  rc);
311 		return rc;
312 	}
313 
314 	/* Get optional extension to 64bit offset. */
315 	if (has_offset_hi) {
316 		rc = ef100_pci_get_config_bits(efx, vndr_cap, TBL_OFF_HI, &offset_high);
317 		if (rc) {
318 			netif_err(efx, probe, efx->net_dev,
319 				  "Failed to read ESF_GZ_VSEC_TBL_OFF_HI, rc=%d\n",
320 				  rc);
321 			return rc;
322 		}
323 	}
324 
325 	offset = (((u64)offset_lo) << ESE_GZ_VSEC_TBL_OFF_LO_BYTES_SHIFT) |
326 		 (((u64)offset_high) << ESE_GZ_VSEC_TBL_OFF_HI_BYTES_SHIFT);
327 
328 	if (offset > pci_resource_len(efx->pci_dev, bar) - sizeof(u32) * 2) {
329 		netif_err(efx, probe, efx->net_dev,
330 			  "Xilinx table will overrun BAR[%d] offset=0x%llx\n",
331 			  bar, offset);
332 		return -EINVAL;
333 	}
334 
335 	/* Temporarily map BAR. */
336 	rc = efx_init_io(efx, bar,
337 			 (dma_addr_t)DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
338 			 pci_resource_len(efx->pci_dev, bar));
339 	if (rc) {
340 		netif_err(efx, probe, efx->net_dev,
341 			  "efx_init_io failed, rc=%d\n", rc);
342 		return rc;
343 	}
344 
345 	rc = ef100_pci_walk_xilinx_table(efx, offset, result);
346 
347 	/* Unmap temporarily mapped BAR. */
348 	efx_fini_io(efx);
349 	return rc;
350 }
351 
352 /* Call ef100_pci_parse_ef100_entry() for each Xilinx PCI_EXT_CAP_ID_VNDR
353  * capability.
354  */
355 static int ef100_pci_find_func_ctrl_window(struct efx_nic *efx,
356 					   struct ef100_func_ctl_window *result)
357 {
358 	int num_xilinx_caps = 0;
359 	int cap = 0;
360 
361 	result->valid = false;
362 
363 	while ((cap = pci_find_next_ext_capability(efx->pci_dev, cap, PCI_EXT_CAP_ID_VNDR)) != 0) {
364 		int vndr_cap = cap + PCI_EXT_CAP_HDR_LENGTH;
365 		u32 vsec_ver = 0;
366 		u32 vsec_len = 0;
367 		u32 vsec_id = 0;
368 		int rc = 0;
369 
370 		num_xilinx_caps++;
371 
372 		rc = ef100_pci_get_config_bits(efx, vndr_cap, ID, &vsec_id);
373 		if (rc) {
374 			netif_err(efx, probe, efx->net_dev,
375 				  "Failed to read ESF_GZ_VSEC_ID, rc=%d\n",
376 				  rc);
377 			return rc;
378 		}
379 
380 		rc = ef100_pci_get_config_bits(efx, vndr_cap, VER, &vsec_ver);
381 		if (rc) {
382 			netif_err(efx, probe, efx->net_dev,
383 				  "Failed to read ESF_GZ_VSEC_VER, rc=%d\n",
384 				  rc);
385 			return rc;
386 		}
387 
388 		/* Get length of whole capability - i.e. starting at cap */
389 		rc = ef100_pci_get_config_bits(efx, vndr_cap, LEN, &vsec_len);
390 		if (rc) {
391 			netif_err(efx, probe, efx->net_dev,
392 				  "Failed to read ESF_GZ_VSEC_LEN, rc=%d\n",
393 				  rc);
394 			return rc;
395 		}
396 
397 		if (vsec_id == ESE_GZ_XILINX_VSEC_ID &&
398 		    vsec_ver == ESE_GZ_VSEC_VER_XIL_CFGBAR &&
399 		    vsec_len >= ESE_GZ_VSEC_LEN_MIN) {
400 			bool has_offset_hi = (vsec_len >= ESE_GZ_VSEC_LEN_HIGH_OFFT);
401 
402 			rc = ef100_pci_parse_xilinx_cap(efx, vndr_cap,
403 							has_offset_hi, result);
404 			if (rc)
405 				return rc;
406 		}
407 	}
408 
409 	if (num_xilinx_caps && !result->valid) {
410 		netif_err(efx, probe, efx->net_dev,
411 			  "Seen %d Xilinx tables, but no EF100 entry.\n",
412 			  num_xilinx_caps);
413 		return -EINVAL;
414 	}
415 
416 	return 0;
417 }
418 
419 /* Final NIC shutdown
420  * This is called only at module unload (or hotplug removal).  A PF can call
421  * this on its VFs to ensure they are unbound first.
422  */
423 static void ef100_pci_remove(struct pci_dev *pci_dev)
424 {
425 	struct efx_nic *efx;
426 
427 	efx = pci_get_drvdata(pci_dev);
428 	if (!efx)
429 		return;
430 
431 	rtnl_lock();
432 	dev_close(efx->net_dev);
433 	rtnl_unlock();
434 
435 	/* Unregistering our netdev notifier triggers unbinding of TC indirect
436 	 * blocks, so we have to do it before PCI removal.
437 	 */
438 	unregister_netdevice_notifier(&efx->netdev_notifier);
439 	ef100_remove(efx);
440 	efx_fini_io(efx);
441 	netif_dbg(efx, drv, efx->net_dev, "shutdown successful\n");
442 
443 	pci_set_drvdata(pci_dev, NULL);
444 	efx_fini_struct(efx);
445 	free_netdev(efx->net_dev);
446 
447 	pci_disable_pcie_error_reporting(pci_dev);
448 };
449 
450 static int ef100_pci_probe(struct pci_dev *pci_dev,
451 			   const struct pci_device_id *entry)
452 {
453 	struct ef100_func_ctl_window fcw = { 0 };
454 	struct net_device *net_dev;
455 	struct efx_nic *efx;
456 	int rc;
457 
458 	/* Allocate and initialise a struct net_device and struct efx_nic */
459 	net_dev = alloc_etherdev_mq(sizeof(*efx), EFX_MAX_CORE_TX_QUEUES);
460 	if (!net_dev)
461 		return -ENOMEM;
462 	efx = netdev_priv(net_dev);
463 	efx->type = (const struct efx_nic_type *)entry->driver_data;
464 
465 	pci_set_drvdata(pci_dev, efx);
466 	SET_NETDEV_DEV(net_dev, &pci_dev->dev);
467 	rc = efx_init_struct(efx, pci_dev, net_dev);
468 	if (rc)
469 		goto fail;
470 
471 	efx->vi_stride = EF100_DEFAULT_VI_STRIDE;
472 	netif_info(efx, probe, efx->net_dev,
473 		   "Solarflare EF100 NIC detected\n");
474 
475 	rc = ef100_pci_find_func_ctrl_window(efx, &fcw);
476 	if (rc) {
477 		netif_err(efx, probe, efx->net_dev,
478 			  "Error looking for ef100 function control window, rc=%d\n",
479 			  rc);
480 		goto fail;
481 	}
482 
483 	if (!fcw.valid) {
484 		/* Extended capability not found - use defaults. */
485 		fcw.bar = EFX_EF100_PCI_DEFAULT_BAR;
486 		fcw.offset = 0;
487 		fcw.valid = true;
488 	}
489 
490 	if (fcw.offset > pci_resource_len(efx->pci_dev, fcw.bar) - ESE_GZ_FCW_LEN) {
491 		netif_err(efx, probe, efx->net_dev,
492 			  "Func control window overruns BAR\n");
493 		rc = -EIO;
494 		goto fail;
495 	}
496 
497 	/* Set up basic I/O (BAR mappings etc) */
498 	rc = efx_init_io(efx, fcw.bar,
499 			 (dma_addr_t)DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
500 			 pci_resource_len(efx->pci_dev, fcw.bar));
501 	if (rc)
502 		goto fail;
503 
504 	efx->reg_base = fcw.offset;
505 
506 	efx->netdev_notifier.notifier_call = ef100_netdev_event;
507 	rc = register_netdevice_notifier(&efx->netdev_notifier);
508 	if (rc) {
509 		netif_err(efx, probe, efx->net_dev,
510 			  "Failed to register netdevice notifier, rc=%d\n", rc);
511 		goto fail;
512 	}
513 
514 	rc = efx->type->probe(efx);
515 	if (rc)
516 		goto fail;
517 
518 	netif_dbg(efx, probe, efx->net_dev, "initialisation successful\n");
519 
520 	return 0;
521 
522 fail:
523 	ef100_pci_remove(pci_dev);
524 	return rc;
525 }
526 
527 /* PCI device ID table */
528 static const struct pci_device_id ef100_pci_table[] = {
529 	{PCI_DEVICE(PCI_VENDOR_ID_XILINX, 0x0100),  /* Riverhead PF */
530 		.driver_data = (unsigned long) &ef100_pf_nic_type },
531 	{PCI_DEVICE(PCI_VENDOR_ID_XILINX, 0x1100),  /* Riverhead VF */
532 		.driver_data = (unsigned long) &ef100_vf_nic_type },
533 	{0}                     /* end of list */
534 };
535 
536 struct pci_driver ef100_pci_driver = {
537 	.name           = "sfc_ef100",
538 	.id_table       = ef100_pci_table,
539 	.probe          = ef100_pci_probe,
540 	.remove         = ef100_pci_remove,
541 	.err_handler    = &efx_err_handlers,
542 };
543 
544 MODULE_DEVICE_TABLE(pci, ef100_pci_table);
545