Deleted Added
sdiff udiff text old ( 238290 ) new ( 255368 )
full compact
1/*-
2 * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
3 * reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *

--- 14 unchanged lines hidden (view full) ---

23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26 * THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * NETLOGIC_BSD */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/mips/nlm/board.c 255368 2013-09-07 18:26:16Z jchandra $");
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/bus.h>
35#include <sys/kernel.h>
36#include <sys/lock.h>
37#include <sys/mutex.h>
38
39#include <net/ethernet.h>

--- 235 unchanged lines hidden (view full) ---

275 * 0 2 6 0
276 * 0 3 5 0
277 * 1 0 8 0
278 * 1 1 11 0
279 * 1 2 10 0
280 * 1 3 9 0
281 */
282static void
283nlm_board_get_phyaddr(int block, int port, int *phyaddr)
284{
285 switch (block) {
286 case 0: switch (port) {
287 case 0: *phyaddr = 4; break;
288 case 1: *phyaddr = 7; break;
289 case 2: *phyaddr = 6; break;
290 case 3: *phyaddr = 5; break;
291 }
292 break;

--- 72 unchanged lines hidden (view full) ---

365 printf(" Netlogic %s %s [%x]\n", chip, revstr, procid);
366}
367
368/*
369 * All our knowledge of chip and board that cannot be detected by probing
370 * at run-time goes here
371 */
372static int
373nlm_setup_xlp_board(int node)
374{
375 struct xlp_board_info *boardp;
376 struct xlp_node_info *nodep;
377 struct xlp_nae_ivars *naep;
378 struct xlp_block_ivars *blockp;
379 struct xlp_port_ivars *portp;
380 uint64_t cpldbase, nae_pcibase;
381 int block, port, rv, dbtype, usecpld = 0, evp = 0, svp = 0;
382 uint8_t *b;
383
384 /* start with a clean slate */
385 boardp = &xlp_board_info;
386 if (boardp->nodemask == 0)
387 memset(boardp, 0, sizeof(xlp_board_info));
388 boardp->nodemask |= (1 << node);
389 nlm_print_processor_info();
390
391 b = board_eeprom_buf;
392 rv = nlm_board_eeprom_read(node, EEPROM_I2CBUS, EEPROM_I2CADDR, 0, b,
393 EEPROM_SIZE);
394 if (rv == 0) {
395 board_eeprom_set = 1;
396 printf("Board info (EEPROM on i2c@%d at %#X):\n",
397 EEPROM_I2CBUS, EEPROM_I2CADDR);
398 printf(" Model: %7.7s %2.2s\n", &b[16], &b[24]);
399 printf(" Serial #: %3.3s-%2.2s\n", &b[27], &b[31]);
400 printf(" MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
401 b[2], b[3], b[4], b[5], b[6], b[7]);
402 } else
403 printf("Board Info: Error on EEPROM read (i2c@%d %#X).\n",
404 EEPROM_I2CBUS, EEPROM_I2CADDR);
405
406 nae_pcibase = nlm_get_nae_pcibase(node);
407 nodep = &boardp->nodes[node];
408 naep = &nodep->nae_ivars;
409 naep->node = node;
410
411 /* frequency at which network block runs */
412 naep->freq = 500;
413
414 /* CRC16 polynomial used for flow table generation */
415 naep->flow_crc_poly = 0xffff;
416 naep->hw_parser_en = 1;
417 naep->prepad_en = 1;
418 naep->prepad_size = 3; /* size in 16 byte units */
419 naep->ieee_1588_en = 1;
420
421 naep->ilmask = 0x0; /* set this based on daughter card */
422 naep->xauimask = 0x0; /* set this based on daughter card */
423 naep->sgmiimask = 0x0; /* set this based on daughter card */
424 naep->nblocks = nae_num_complex(nae_pcibase);
425 if (strncmp(&b[16], "PCIE", 4) == 0) {
426 usecpld = 0; /* XLP PCIe card */
427 /* Broadcom's XLP PCIe card has the following
428 * blocks fixed.
429 * blk 0-XAUI, 1-XAUI, 4-SGMII(one port) */
430 naep->blockmask = 0x13;
431 } else if (strncmp(&b[16], "MB-EVP", 6) == 0) {
432 usecpld = 1; /* XLP non-PCIe card which has CPLD */
433 evp = 1;
434 naep->blockmask = (1 << naep->nblocks) - 1;
435 } else if ((strncmp(&b[16], "MB-S", 4) == 0) ||
436 (strncmp(&b[16], "MB_S", 4) == 0)) {
437 usecpld = 1; /* XLP non-PCIe card which has CPLD */
438 svp = 1;
439 /* 3xx chip reports one block extra which is a bug */
440 naep->nblocks = naep->nblocks - 1;
441 naep->blockmask = (1 << naep->nblocks) - 1;
442 } else {
443 printf("ERROR!!! Board type:%7s didn't match any board"
444 " type we support\n", &b[16]);
445 return (-1);
446 }
447 cpldbase = nlm_board_cpld_base(node, XLP_EVB_CPLD_CHIPSELECT);
448
449 /* pretty print network config */
450 printf("Network config");
451 if (usecpld)
452 printf("(from CPLD@%d):\n", XLP_EVB_CPLD_CHIPSELECT);
453 else
454 printf("(defaults):\n");
455 printf(" NAE@%d Blocks: ", node);
456 for (block = 0; block < naep->nblocks; block++) {
457 char *s = "???";
458
459 if ((naep->blockmask & (1 << block)) == 0)
460 continue;
461 blockp = &naep->block_ivars[block];
462 blockp->block = block;
463 if (usecpld)
464 dbtype = nlm_board_cpld_dboard_type(cpldbase, block);
465 else
466 dbtype = DCARD_XAUI; /* default XAUI */
467
468 /* XLP PCIe cards */
469 if ((!evp && !svp) && ((block == 2) || (block == 3)))
470 dbtype = DCARD_NOT_PRSNT;
471
472 if (block == 4) {
473 /* management block 4 on 8xx or XLP PCIe */
474 blockp->type = SGMIIC;
475 if (evp)
476 blockp->portmask = 0x3;
477 else
478 blockp->portmask = 0x1;
479 naep->sgmiimask |= (1 << block);
480 } else {
481 switch (dbtype) {
482 case DCARD_ILAKEN:
483 blockp->type = ILC;
484 blockp->portmask = 0x1;
485 naep->ilmask |= (1 << block);
486 break;
487 case DCARD_SGMII:
488 blockp->type = SGMIIC;
489 blockp->portmask = 0xf;
490 naep->sgmiimask |= (1 << block);
491 break;
492 case DCARD_XAUI:
493 blockp->type = XAUIC;
494 blockp->portmask = 0x1;
495 naep->xauimask |= (1 << block);
496 break;
497 default: /* DCARD_NOT_PRSNT */
498 blockp->type = UNKNOWN;
499 blockp->portmask = 0;
500 break;
501 }
502 }
503 if (blockp->type != UNKNOWN) {
504 for (port = 0; port < PORTS_PER_CMPLX; port++) {
505 if ((blockp->portmask & (1 << port)) == 0)
506 continue;
507 portp = &blockp->port_ivars[port];
508 nlm_board_get_phyaddr(block, port,
509 &portp->phy_addr);
510 if (svp || (block == 4))
511 portp->mdio_bus = 0;
512 else
513 portp->mdio_bus = 1;
514 portp->port = port;
515 portp->block = block;
516 portp->node = node;
517 portp->type = blockp->type;
518 nlm_setup_port_defaults(portp);
519 }
520 }
521 switch (blockp->type) {
522 case SGMIIC : s = "SGMII"; break;
523 case XAUIC : s = "XAUI"; break;
524 case ILC : s = "IL"; break;
525 }
526 printf(" [%d %s]", block, s);
527 }
528 printf("\n");
529 return (0);
530}
531
532int nlm_board_info_setup(void)
533{
534 if (nlm_setup_xlp_board(0) != 0)
535 return (-1);
536 return (0);
537}