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 238290 2012-07-09 10:24:45Z 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 *mdio, int *phyaddr)
284{
285
286 /* XXXJC: this is a board feature, check for chip not proper */
287 if (nlm_is_xlp3xx() || (nlm_is_xlp8xx() && block == 4))
288 *mdio = 0;
289 else
290 *mdio = 1;
291
292 switch (block) {
293 case 0: switch (port) {
294 case 0: *phyaddr = 4; break;
295 case 1: *phyaddr = 7; break;
296 case 2: *phyaddr = 6; break;
297 case 3: *phyaddr = 5; break;
298 }
299 break;

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

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