board.c revision 214107
1202375Srdivacky/********************************************************************* 2198892Srdivacky * 3198892Srdivacky * Copyright 2003-2006 Raza Microelectronics, Inc. (RMI). All rights 4198892Srdivacky * reserved. 5198892Srdivacky * 6198892Srdivacky * Redistribution and use in source and binary forms, with or without 7198892Srdivacky * modification, are permitted provided that the following conditions 8198892Srdivacky * are met: 9198892Srdivacky * 10198892Srdivacky * 1. Redistributions of source code must retain the above copyright 11198892Srdivacky * notice, this list of conditions and the following disclaimer. 12198892Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 13198892Srdivacky * notice, this list of conditions and the following disclaimer in 14198892Srdivacky * the documentation and/or other materials provided with the 15198892Srdivacky * distribution. 16198892Srdivacky * 17198892Srdivacky * THIS SOFTWARE IS PROVIDED BY Raza Microelectronics, Inc. ``AS IS'' AND 18198892Srdivacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19198892Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20198892Srdivacky * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RMI OR CONTRIBUTORS BE LIABLE 21198892Srdivacky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22239462Sdim * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23198892Srdivacky * SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, OR BUSINESS 24198892Srdivacky * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25198892Srdivacky * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26198892Srdivacky * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27249423Sdim * THE POSSIBILITY OF SUCH DAMAGE. 28249423Sdim * 29249423Sdim * *****************************RMI_2**********************************/ 30198892Srdivacky#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 31198892Srdivacky__FBSDID("$FreeBSD: head/sys/mips/rmi/board.c 214107 2010-10-20 09:50:11Z jchandra $"); 32199989Srdivacky#include <sys/param.h> 33198892Srdivacky#include <sys/systm.h> 34199989Srdivacky#include <sys/bus.h> 35207618Srdivacky#include <sys/kernel.h> 36207618Srdivacky#include <sys/lock.h> 37199989Srdivacky#include <sys/mutex.h> 38199989Srdivacky 39207618Srdivacky#include <machine/cpufunc.h> 40207618Srdivacky#include <mips/rmi/msgring.h> 41198892Srdivacky#include <mips/rmi/rmi_boot_info.h> 42200581Srdivacky#include <mips/rmi/board.h> 43200581Srdivacky#include <mips/rmi/pic.h> 44212904Sdim 45212904Sdimstruct stn_cc *xlr_core_cc_configs[] = { &cc_table_cpu_0, &cc_table_cpu_1, 46212904Sdim &cc_table_cpu_2, &cc_table_cpu_3, &cc_table_cpu_4, &cc_table_cpu_5, 47212904Sdim &cc_table_cpu_6, &cc_table_cpu_7}; 48212904Sdim 49200581Srdivackystruct stn_cc *xls_core_cc_configs[] = { &xls_cc_table_cpu_0, &xls_cc_table_cpu_1, 50200581Srdivacky &xls_cc_table_cpu_2, &xls_cc_table_cpu_3 }; 51200581Srdivacky 52200581Srdivackystruct xlr_board_info xlr_board_info; 53198892Srdivacky 54200581Srdivackystatic int 55200581Srdivackyxlr_pcmcia_present(void) 56200581Srdivacky{ 57200581Srdivacky xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_GPIO_OFFSET); 58198892Srdivacky uint32_t resetconf; 59198892Srdivacky 60212904Sdim resetconf = xlr_read_reg(mmio, 21); 61198892Srdivacky return ((resetconf & 0x4000) != 0); 62198892Srdivacky} 63198892Srdivacky 64198892Srdivackystatic void 65198892Srdivackyxlr_chip_specific_overrides(struct xlr_board_info* board) 66198892Srdivacky{ 67198892Srdivacky struct xlr_gmac_block_t *blk0, *blk1, *blk2; 68199481Srdivacky uint32_t chipid; 69199481Srdivacky uint32_t revision; 70199481Srdivacky 71199481Srdivacky blk0 = &board->gmac_block[0]; 72198892Srdivacky blk1 = &board->gmac_block[1]; 73200581Srdivacky blk2 = &board->gmac_block[2]; 74199481Srdivacky 75198892Srdivacky chipid = xlr_processor_id(); 76198892Srdivacky revision = xlr_revision(); 77198892Srdivacky 78198892Srdivacky if (revision == 0x04) { /* B2 */ 79198892Srdivacky switch (chipid) { 80198892Srdivacky case 0x07: /* XLR 508 */ 81198892Srdivacky case 0x08: /* XLR 516 */ 82198892Srdivacky case 0x09: /* XLR 532 */ 83202375Srdivacky /* NA[12] not available */ 84198892Srdivacky memset(blk1, 0, sizeof(*blk1)); 85198892Srdivacky memset(blk2, 0, sizeof(*blk2)); 86198892Srdivacky break; 87202375Srdivacky case 0x06: /* XLR 308 */ 88198892Srdivacky /* NA0 has 3 ports */ 89198892Srdivacky blk0->gmac_port[3].valid = 0; 90198892Srdivacky blk0->num_ports--; 91198892Srdivacky /* NA[12] not available */ 92198892Srdivacky memset(blk1, 0, sizeof(*blk1)); 93198892Srdivacky memset(blk2, 0, sizeof(*blk2)); 94202375Srdivacky break; 95198892Srdivacky default: 96198892Srdivacky break; 97198892Srdivacky } 98198892Srdivacky } else if (revision == 0x91) { /* C4 */ 99198892Srdivacky switch (chipid) { 100198892Srdivacky case 0x0B: /* XLR 508 */ 101198892Srdivacky case 0x0A: /* XLR 516 */ 102198892Srdivacky case 0x08: /* XLR 532 */ 103198892Srdivacky /* NA[12] not available */ 104198892Srdivacky memset(blk1, 0, sizeof(*blk1)); 105198892Srdivacky memset(blk2, 0, sizeof(*blk2)); 106198892Srdivacky break; 107198892Srdivacky case 0x0F: /* XLR 308 */ 108198892Srdivacky /* NA0 has 3 ports */ 109198892Srdivacky blk0->gmac_port[3].valid = 0; 110198892Srdivacky blk0->num_ports--; 111198892Srdivacky /* NA[12] not available */ 112198892Srdivacky memset(blk1, 0, sizeof(*blk1)); 113198892Srdivacky memset(blk2, 0, sizeof(*blk2)); 114198892Srdivacky break; 115198892Srdivacky default: 116199481Srdivacky break; 117224145Sdim } 118224145Sdim } else { /* other pre-production silicon */ 119198892Srdivacky switch (chipid) { 120198892Srdivacky /* XLR 5xx */ 121210299Sed case 0x0B: 122198892Srdivacky case 0x0A: 123224145Sdim case 0x07: 124199989Srdivacky case 0x08: 125199481Srdivacky case 0x09: 126199481Srdivacky /* NA[12] not available */ 127199481Srdivacky memset(blk1, 0, sizeof(*blk1)); 128199481Srdivacky memset(blk2, 0, sizeof(*blk2)); 129199481Srdivacky break; 130199481Srdivacky /* XLR 3xx */ 131199481Srdivacky case 0x0F: 132199481Srdivacky case 0x06: 133199481Srdivacky /* NA0 has 3 ports */ 134202375Srdivacky blk0->gmac_port[3].valid = 0; 135201360Srdivacky blk0->num_ports--; 136202375Srdivacky /* NA[12] not available */ 137199481Srdivacky memset(blk1, 0, sizeof(*blk1)); 138201360Srdivacky memset(blk2, 0, sizeof(*blk2)); 139201360Srdivacky break; 140198892Srdivacky default: 141198892Srdivacky break; 142198892Srdivacky } 143198892Srdivacky } 144198892Srdivacky} 145198892Srdivacky 146198892Srdivackystatic void 147198892Srdivackyxlr_board_specific_overrides(struct xlr_board_info* board) 148200581Srdivacky{ 149198892Srdivacky struct xlr_gmac_block_t *blk1, *blk2; 150234353Sdim 151212904Sdim blk1 = &board->gmac_block[1]; 152212904Sdim blk2 = &board->gmac_block[2]; 153198892Srdivacky 154249423Sdim switch (xlr_boot1_info.board_major_version) { 155210299Sed case RMI_XLR_BOARD_ARIZONA_I: 156198892Srdivacky /* ATX-I has SPI-4, not XGMAC */ 157210299Sed blk1->type = XLR_SPI4; 158198892Srdivacky blk1->enabled = 0; /* nlge does not 159239462Sdim support SPI-4 */ 160239462Sdim blk2->type = XLR_SPI4; 161218893Sdim blk2->enabled = 0; 162218893Sdim break; 163218893Sdim 164198892Srdivacky case RMI_XLR_BOARD_ARIZONA_II: 165210299Sed /* XGMII_A --> VSC7281, XGMII_B --> VSC7281 */ 166198892Srdivacky blk1->enabled = 1; 167198892Srdivacky blk1->num_ports = 1; 168198892Srdivacky blk1->gmac_port[0].valid = 1; 169198892Srdivacky 170198892Srdivacky blk2->enabled = 1; 171198892Srdivacky blk2->num_ports = 1; 172234353Sdim blk2->gmac_port[0].valid = 1; 173198892Srdivacky default: 174198892Srdivacky break; 175239462Sdim } 176239462Sdim} 177198892Srdivacky 178198892Srdivackystatic int 179198892Srdivackyquad0_xaui(void) 180198892Srdivacky{ 181198892Srdivacky xlr_reg_t *gpio_mmio = 182198892Srdivacky (unsigned int *)(DEFAULT_XLR_IO_BASE + XLR_IO_GPIO_OFFSET); 183198892Srdivacky uint32_t bit24; 184198892Srdivacky 185198892Srdivacky bit24 = (xlr_read_reg(gpio_mmio, 0x15) >> 24) & 0x1; 186198892Srdivacky return (bit24); 187198892Srdivacky} 188198892Srdivacky 189198892Srdivackystatic int 190207618Srdivackyquad1_xaui(void) 191198892Srdivacky{ 192198892Srdivacky xlr_reg_t *gpio_mmio = 193198892Srdivacky (unsigned int *)(DEFAULT_XLR_IO_BASE + XLR_IO_GPIO_OFFSET); 194198892Srdivacky uint32_t bit25; 195198892Srdivacky 196198892Srdivacky bit25 = (xlr_read_reg(gpio_mmio, 0x15) >> 25) & 0x1; 197198892Srdivacky return (bit25); 198201360Srdivacky} 199198892Srdivacky 200201360Srdivackystatic void 201198892Srdivackyxls_chip_specific_overrides(struct xlr_board_info* board) 202212904Sdim{ 203200581Srdivacky struct xlr_gmac_block_t *blk0, *blk1; 204198892Srdivacky uint32_t chipid; 205198892Srdivacky 206198892Srdivacky blk0 = &board->gmac_block[0]; 207198892Srdivacky blk1 = &board->gmac_block[1]; 208198892Srdivacky chipid = xlr_processor_id(); 209198892Srdivacky 210198892Srdivacky switch (chipid) { 211198892Srdivacky case 0x8E: /* XLS208 */ 212202375Srdivacky case 0x8F: /* XLS204 */ 213198892Srdivacky /* NA1 is not available */ 214198892Srdivacky memset(blk1, 0, sizeof(*blk1)); 215202375Srdivacky break; 216202375Srdivacky case 0xCE: /* XLS108 */ 217198892Srdivacky case 0xCF: /* XLS104 */ 218198892Srdivacky /* NA0 has 3 ports */ 219198892Srdivacky blk0->gmac_port[3].valid = 0; 220201360Srdivacky blk0->num_ports--; 221198892Srdivacky /* NA1 is not available */ 222198892Srdivacky memset(blk1, 0, sizeof(*blk1)); 223198892Srdivacky break; 224207618Srdivacky default: 225198892Srdivacky break; 226198892Srdivacky } 227198892Srdivacky} 228198892Srdivacky 229198892Srdivackystatic void 230198892Srdivackyxls_board_specific_overrides(struct xlr_board_info* board) 231198892Srdivacky{ 232198892Srdivacky struct xlr_gmac_block_t *blk0, *blk1; 233198892Srdivacky int i; 234198892Srdivacky 235198892Srdivacky blk0 = &board->gmac_block[0]; 236198892Srdivacky blk1 = &board->gmac_block[1]; 237198892Srdivacky 238198892Srdivacky switch (xlr_boot1_info.board_major_version) { 239198892Srdivacky case RMI_XLR_BOARD_ARIZONA_VI: 240198892Srdivacky blk0->mode = XLR_PORT0_RGMII; 241198892Srdivacky blk0->gmac_port[0].type = XLR_RGMII; 242198892Srdivacky blk0->gmac_port[0].phy_addr = 0; 243198892Srdivacky blk0->gmac_port[0].mii_addr = XLR_IO_GMAC_4_OFFSET; 244198892Srdivacky /* Because of the Octal PHY, SGMII Quad1 is MII is also bound 245198892Srdivacky * to the PHY attached to SGMII0_MDC/MDIO/MDINT. */ 246198892Srdivacky for (i = 0; i < 4; i++) { 247202375Srdivacky blk1->gmac_port[i].mii_addr = XLR_IO_GMAC_0_OFFSET; 248198892Srdivacky blk1->gmac_port[i].serdes_addr = XLR_IO_GMAC_0_OFFSET; 249198892Srdivacky } 250263508Sdim blk1->gmac_port[1].mii_addr = XLR_IO_GMAC_0_OFFSET; 251263508Sdim blk1->gmac_port[2].mii_addr = XLR_IO_GMAC_0_OFFSET; 252239462Sdim blk1->gmac_port[3].mii_addr = XLR_IO_GMAC_0_OFFSET; 253198892Srdivacky 254198892Srdivacky blk1->gmac_port[1].serdes_addr = XLR_IO_GMAC_0_OFFSET; 255198892Srdivacky blk1->gmac_port[2].serdes_addr = XLR_IO_GMAC_0_OFFSET; 256198892Srdivacky blk1->gmac_port[3].serdes_addr = XLR_IO_GMAC_0_OFFSET; 257199989Srdivacky 258199989Srdivacky /* RGMII MDIO interrupt is thru NA1 and SGMII MDIO 259207618Srdivacky * interrupts for ports in blk1 are from NA0 */ 260199989Srdivacky blk0->gmac_port[0].mdint_id = 1; 261207618Srdivacky 262198892Srdivacky blk1->gmac_port[0].mdint_id = 0; 263199481Srdivacky blk1->gmac_port[1].mdint_id = 0; 264198892Srdivacky blk1->gmac_port[2].mdint_id = 0; 265199989Srdivacky blk1->gmac_port[3].mdint_id = 0; 266198892Srdivacky 267199989Srdivacky /* If we have a 4xx lite chip, don't enable the 268198892Srdivacky * GMACs which are disabled in hardware */ 269198892Srdivacky if (xlr_is_xls4xx_lite()) { 270198892Srdivacky xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_GPIO_OFFSET); 271198892Srdivacky uint32_t tmp; 272198892Srdivacky 273199481Srdivacky /* Port 6 & 7 are not enabled on the condor 4xx, figure 274199481Srdivacky * this out from the GPIO fuse bank */ 275207618Srdivacky tmp = xlr_read_reg(mmio, 35); 276207618Srdivacky if ((tmp & (3 << 28)) != 0) { 277199481Srdivacky blk1->enabled = 0x3; 278199481Srdivacky blk1->gmac_port[2].valid = 0; 279199481Srdivacky blk1->gmac_port[3].valid = 0; 280207618Srdivacky blk1->num_ports = 2; 281199481Srdivacky } 282207618Srdivacky } 283199481Srdivacky break; 284199481Srdivacky 285199481Srdivacky case RMI_XLR_BOARD_ARIZONA_VIII: 286199481Srdivacky if (blk1->enabled) { 287199481Srdivacky /* There is just one Octal PHY on the board and it is 288199481Srdivacky * connected to the MII interface for NA Quad 0. */ 289199481Srdivacky for (i = 0; i < 4; i++) { 290199481Srdivacky blk1->gmac_port[i].mii_addr = 291199481Srdivacky XLR_IO_GMAC_0_OFFSET; 292199481Srdivacky blk1->gmac_port[i].mdint_id = 0; 293199481Srdivacky } 294199481Srdivacky } 295199481Srdivacky break; 296199481Srdivacky 297199481Srdivacky case RMI_XLR_BOARD_ARIZONA_XI: 298198892Srdivacky case RMI_XLR_BOARD_ARIZONA_XII: 299202375Srdivacky if (quad0_xaui()) { /* GMAC ports 0-3 are set to XAUI */ 300202375Srdivacky /* only GMAC0 is active i.e, the 0-th port on this quad. 301199989Srdivacky * Disable all the other 7 possible ports. */ 302212904Sdim for (i = 1; i < MAX_NA_PORTS; i++) { 303212904Sdim memset(&blk0->gmac_port[i], 0, 304202375Srdivacky sizeof(blk0->gmac_port[i])); 305198892Srdivacky } 306198892Srdivacky /* Setup for XAUI on N/w Acc0: gmac0 */ 307198892Srdivacky blk0->type = XLR_XGMAC; 308198892Srdivacky blk0->mode = XLR_XAUI; 309198892Srdivacky blk0->num_ports = 1; 310198892Srdivacky blk0->gmac_port[0].type = XLR_XAUI; 311198892Srdivacky blk1->gmac_port[0].phy_addr = 16; 312199989Srdivacky blk0->gmac_port[0].tx_bucket_id = blk0->station_txbase; 313201360Srdivacky /* Other addresses etc need not be modified as XAUI_0 314201360Srdivacky * shares its addresses with SGMII GMAC_0, which was 315198892Srdivacky * set in the caller. */ 316198892Srdivacky } 317239462Sdim else { 318239462Sdim blk0->num_ports = 1; /* only 1 RGMII port */ 319198892Srdivacky blk0->mode = XLR_PORT0_RGMII; 320198892Srdivacky blk0->gmac_port[0].type = XLR_RGMII; 321198892Srdivacky blk0->gmac_port[0].phy_addr = 0; 322198892Srdivacky blk0->gmac_port[0].mii_addr = XLR_IO_GMAC_0_OFFSET; 323198892Srdivacky } 324199989Srdivacky 325201360Srdivacky if (quad1_xaui()) { /* GMAC ports 4-7 are used for XAUI */ 326201360Srdivacky /* only GMAC4 is active i.e, the 0-th port on this quad. 327198892Srdivacky * Disable all the other 7 possible ports. */ 328198892Srdivacky for (i = 1; i < MAX_NA_PORTS; i++) { 329198892Srdivacky memset(&blk1->gmac_port[i], 0, 330199989Srdivacky sizeof(blk1->gmac_port[i])); 331201360Srdivacky } 332198892Srdivacky /* Setup for XAUI on N/w Acc1: gmac4 */ 333198892Srdivacky blk1->type = XLR_XGMAC; 334202375Srdivacky blk1->mode = XLR_XAUI; 335202375Srdivacky blk1->num_ports = 1; 336207618Srdivacky /* XAUI and SGMII ports share FMN buckets on N/w Acc 1; 337212904Sdim so, station_txbase, station_rfr need not be 338202375Srdivacky patched up. */ 339198892Srdivacky blk1->gmac_port[0].type = XLR_XAUI; 340198892Srdivacky blk1->gmac_port[0].phy_addr = 16; 341198892Srdivacky blk1->gmac_port[0].tx_bucket_id = blk1->station_txbase; 342221345Sdim /* Other addresses etc need not be modified as XAUI_1 343198892Srdivacky * shares its addresses with SGMII GMAC_4, which was 344198892Srdivacky * set in the caller. */ 345198892Srdivacky } 346198892Srdivacky break; 347198892Srdivacky 348198892Srdivacky default: 349198892Srdivacky break; 350198892Srdivacky } 351202375Srdivacky} 352199989Srdivacky 353198892Srdivacky/* 354198892Srdivacky * All our knowledge of chip and board that cannot be detected by probing 355201360Srdivacky * at run-time goes here 356198892Srdivacky */ 357198892Srdivackyint 358198892Srdivackyxlr_board_info_setup() 359198892Srdivacky{ 360198892Srdivacky struct xlr_gmac_block_t *blk0, *blk1, *blk2; 361198892Srdivacky int i; 362202375Srdivacky 363198892Srdivacky /* This setup code is long'ish because the same base driver 364198892Srdivacky * (if_nlge.c) is used for different: 365198892Srdivacky * - CPUs (XLR/XLS) 366198892Srdivacky * - boards (for each CPU, multiple board configs are possible 367234353Sdim * and available). 368210299Sed * 369201360Srdivacky * At the time of writing, there are atleast 12 boards, 4 with XLR 370198892Srdivacky * and 8 with XLS. This means that the base driver needs to work with 371198892Srdivacky * 12 different configurations, with varying levels of differences. 372198892Srdivacky * To accomodate the different configs, the xlr_board_info struct 373198892Srdivacky * has various attributes for paramters that could be different. 374198892Srdivacky * These attributes are setup here and can be used directly in the 375239462Sdim * base driver. 376239462Sdim * It was seen that the setup code is not entirely trivial and 377198892Srdivacky * it is possible to organize it in different ways. In the following, 378198892Srdivacky * we choose an approach that sacrifices code-compactness/speed for 379202375Srdivacky * readability. This is because configuration code executes once 380198892Srdivacky * per reboot and hence has a minimal performance impact. 381198892Srdivacky * On the other hand, driver debugging/enhancements require 382198892Srdivacky * that different engineers can quickly comprehend the setup 383202375Srdivacky * sequence. Hence, readability is seen as the key requirement for 384198892Srdivacky * this code. It is for the reader to decide how much of this 385198892Srdivacky * requirement is met with the current code organization !! 386198892Srdivacky * 387239462Sdim * The initialization is organized thus: 388198892Srdivacky * 389198892Srdivacky * if (CPU is XLS) { 390198892Srdivacky * // initialize per XLS architecture 391198892Srdivacky * // default inits (per chip spec) 392201360Srdivacky * // chip-specific overrides 393198892Srdivacky * // board-specific overrides 394198892Srdivacky * } else if (CPU is XLR) { 395198892Srdivacky * // initialize per XLR architecture 396198892Srdivacky * // default inits (per chip spec) 397198892Srdivacky * // chip-specific overrides 398198892Srdivacky * // board-specific overrides 399198892Srdivacky * } 400198892Srdivacky * 401199989Srdivacky * For each CPU family, all the default initializations 402203954Srdivacky * are done for a fully-loaded device of that family. 403199989Srdivacky * This configuration is then adjusted for the actual 404198892Srdivacky * chip id. This is followed up with board specific 405199989Srdivacky * overrides. 406239462Sdim */ 407239462Sdim 408198892Srdivacky /* start with a clean slate */ 409198892Srdivacky memset(&xlr_board_info, 0, sizeof(xlr_board_info)); 410198892Srdivacky xlr_board_info.ata = xlr_pcmcia_present(); 411198892Srdivacky 412207618Srdivacky blk0 = &xlr_board_info.gmac_block[0]; 413201360Srdivacky blk1 = &xlr_board_info.gmac_block[1]; 414202375Srdivacky blk2 = &xlr_board_info.gmac_block[2]; 415198892Srdivacky 416198892Srdivacky if (xlr_is_xls()) { 417210299Sed xlr_board_info.is_xls = 1; 418210299Sed xlr_board_info.nr_cpus = 8; 419210299Sed xlr_board_info.usb = 1; 420210299Sed /* Board version 8 has NAND flash */ 421210299Sed xlr_board_info.cfi = 422210299Sed (xlr_boot1_info.board_major_version != RMI_XLR_BOARD_ARIZONA_VIII); 423210299Sed xlr_board_info.pci_irq = 0; 424210299Sed xlr_board_info.credit_configs = xls_core_cc_configs; 425210299Sed xlr_board_info.bucket_sizes = &xls_bucket_sizes; 426210299Sed xlr_board_info.gmacports = MAX_NA_PORTS; 427210299Sed 428210299Sed /* ---------------- Network Acc 0 ---------------- */ 429210299Sed 430210299Sed blk0->type = XLR_GMAC; 431210299Sed blk0->enabled = 0xf; 432210299Sed blk0->credit_config = &xls_cc_table_gmac0; 433234353Sdim blk0->station_id = MSGRNG_STNID_GMAC; 434234353Sdim blk0->station_txbase = MSGRNG_STNID_GMACTX0; 435210299Sed blk0->station_rfr = MSGRNG_STNID_GMACRFR_0; 436210299Sed blk0->mode = XLR_SGMII; 437198892Srdivacky blk0->baseaddr = XLR_IO_GMAC_0_OFFSET; 438198892Srdivacky blk0->baseirq = PIC_GMAC_0_IRQ; 439198892Srdivacky blk0->baseinst = 0; 440198892Srdivacky 441198892Srdivacky /* By default, assume SGMII is setup. But this can change based 442198892Srdivacky on board-specific or setting-specific info. */ 443198892Srdivacky for (i = 0; i < 4; i++) { 444198892Srdivacky blk0->gmac_port[i].valid = 1; 445202375Srdivacky blk0->gmac_port[i].instance = i + blk0->baseinst; 446202375Srdivacky blk0->gmac_port[i].type = XLR_SGMII; 447202375Srdivacky blk0->gmac_port[i].phy_addr = i + 16; 448198892Srdivacky blk0->gmac_port[i].tx_bucket_id = 449198892Srdivacky blk0->station_txbase + i; 450198892Srdivacky blk0->gmac_port[i].mdint_id = 0; 451198892Srdivacky blk0->num_ports++; 452198892Srdivacky blk0->gmac_port[i].base_addr = XLR_IO_GMAC_0_OFFSET + i * 0x1000; 453210299Sed blk0->gmac_port[i].mii_addr = XLR_IO_GMAC_0_OFFSET; 454201360Srdivacky blk0->gmac_port[i].pcs_addr = XLR_IO_GMAC_0_OFFSET; 455198892Srdivacky blk0->gmac_port[i].serdes_addr = XLR_IO_GMAC_0_OFFSET; 456198892Srdivacky } 457198892Srdivacky 458198892Srdivacky /* ---------------- Network Acc 1 ---------------- */ 459198892Srdivacky blk1->type = XLR_GMAC; 460198892Srdivacky blk1->enabled = 0xf; 461239462Sdim blk1->credit_config = &xls_cc_table_gmac1; 462198892Srdivacky blk1->station_id = MSGRNG_STNID_GMAC1; 463198892Srdivacky blk1->station_txbase = MSGRNG_STNID_GMAC1_TX0; 464198892Srdivacky blk1->station_rfr = MSGRNG_STNID_GMAC1_FR_0; 465202375Srdivacky blk1->mode = XLR_SGMII; 466201360Srdivacky blk1->baseaddr = XLR_IO_GMAC_4_OFFSET; 467198892Srdivacky blk1->baseirq = PIC_XGS_0_IRQ; 468198892Srdivacky blk1->baseinst = 4; 469198892Srdivacky 470203954Srdivacky for (i = 0; i < 4; i++) { 471201360Srdivacky blk1->gmac_port[i].valid = 1; 472198892Srdivacky blk1->gmac_port[i].instance = i + blk1->baseinst; 473198892Srdivacky blk1->gmac_port[i].type = XLR_SGMII; 474198892Srdivacky blk1->gmac_port[i].phy_addr = i + 20; 475198892Srdivacky blk1->gmac_port[i].tx_bucket_id = 476198892Srdivacky blk1->station_txbase + i; 477198892Srdivacky blk1->gmac_port[i].mdint_id = 1; 478198892Srdivacky blk1->num_ports++; 479202375Srdivacky blk1->gmac_port[i].base_addr = XLR_IO_GMAC_4_OFFSET + i * 0x1000; 480198892Srdivacky blk1->gmac_port[i].mii_addr = XLR_IO_GMAC_4_OFFSET; 481201360Srdivacky blk1->gmac_port[i].pcs_addr = XLR_IO_GMAC_4_OFFSET; 482198892Srdivacky blk1->gmac_port[i].serdes_addr = XLR_IO_GMAC_0_OFFSET; 483198892Srdivacky } 484201360Srdivacky 485198892Srdivacky /* ---------------- Network Acc 2 ---------------- */ 486198892Srdivacky xlr_board_info.gmac_block[2].enabled = 0; /* disabled on XLS */ 487198892Srdivacky 488202375Srdivacky xls_chip_specific_overrides(&xlr_board_info); 489201360Srdivacky xls_board_specific_overrides(&xlr_board_info); 490198892Srdivacky 491198892Srdivacky } else { /* XLR */ 492198892Srdivacky xlr_board_info.is_xls = 0; 493198892Srdivacky xlr_board_info.nr_cpus = 32; 494198892Srdivacky xlr_board_info.usb = 0; 495198892Srdivacky xlr_board_info.cfi = 1; 496198892Srdivacky xlr_board_info.pci_irq = 0; 497198892Srdivacky xlr_board_info.credit_configs = xlr_core_cc_configs; 498198892Srdivacky xlr_board_info.bucket_sizes = &bucket_sizes; 499198892Srdivacky xlr_board_info.gmacports = 4; 500202375Srdivacky 501198892Srdivacky /* ---------------- GMAC0 ---------------- */ 502198892Srdivacky blk0->type = XLR_GMAC; 503198892Srdivacky blk0->enabled = 0xf; 504198892Srdivacky blk0->credit_config = &cc_table_gmac; 505202375Srdivacky blk0->station_id = MSGRNG_STNID_GMAC; 506202375Srdivacky blk0->station_txbase = MSGRNG_STNID_GMACTX0; 507202375Srdivacky blk0->station_rfr = MSGRNG_STNID_GMACRFR_0; 508198892Srdivacky blk0->mode = XLR_RGMII; 509198892Srdivacky blk0->baseaddr = XLR_IO_GMAC_0_OFFSET; 510198892Srdivacky blk0->baseirq = PIC_GMAC_0_IRQ; 511198892Srdivacky blk0->baseinst = 0; 512198892Srdivacky 513198892Srdivacky /* first, do the common/easy stuff for all the ports */ 514198892Srdivacky for (i = 0; i < 4; i++) { 515198892Srdivacky blk0->gmac_port[i].valid = 1; 516198892Srdivacky blk0->gmac_port[i].instance = i + blk0->baseinst; 517198892Srdivacky blk0->gmac_port[i].type = XLR_RGMII; 518198892Srdivacky blk0->gmac_port[i].phy_addr = i; 519201360Srdivacky blk0->gmac_port[i].tx_bucket_id = 520198892Srdivacky blk0->station_txbase + i; 521202375Srdivacky blk0->gmac_port[i].mdint_id = 0; 522198892Srdivacky blk0->gmac_port[i].base_addr = XLR_IO_GMAC_0_OFFSET + i * 0x1000; 523202375Srdivacky blk0->gmac_port[i].mii_addr = XLR_IO_GMAC_0_OFFSET; 524198892Srdivacky /* RGMII ports, no PCS/SERDES */ 525198892Srdivacky blk0->num_ports++; 526198953Srdivacky } 527198953Srdivacky 528198953Srdivacky /* ---------------- XGMAC0 ---------------- */ 529212904Sdim blk1->type = XLR_XGMAC; 530212904Sdim blk1->mode = XLR_XGMII; 531202375Srdivacky blk1->enabled = 0; 532198892Srdivacky blk1->credit_config = &cc_table_xgs_0; 533198892Srdivacky blk1->station_txbase = MSGRNG_STNID_XGS0_TX; 534199481Srdivacky blk1->station_rfr = MSGRNG_STNID_XMAC0RFR; 535199481Srdivacky blk1->station_id = MSGRNG_STNID_XGS0FR; 536199481Srdivacky blk1->baseaddr = XLR_IO_XGMAC_0_OFFSET; 537198892Srdivacky blk1->baseirq = PIC_XGS_0_IRQ; 538199481Srdivacky blk1->baseinst = 4; 539198892Srdivacky 540198892Srdivacky blk1->gmac_port[0].type = XLR_XGMII; 541198892Srdivacky blk1->gmac_port[0].instance = 0; 542198892Srdivacky blk1->gmac_port[0].phy_addr = 0; 543198892Srdivacky blk1->gmac_port[0].base_addr = XLR_IO_XGMAC_0_OFFSET; 544198892Srdivacky blk1->gmac_port[0].mii_addr = XLR_IO_XGMAC_0_OFFSET; 545198892Srdivacky blk1->gmac_port[0].tx_bucket_id = blk1->station_txbase; 546202375Srdivacky blk1->gmac_port[0].mdint_id = 1; 547202375Srdivacky 548198892Srdivacky /* ---------------- XGMAC1 ---------------- */ 549198892Srdivacky blk2->type = XLR_XGMAC; 550198892Srdivacky blk2->mode = XLR_XGMII; 551198892Srdivacky blk2->enabled = 0; 552198892Srdivacky blk2->credit_config = &cc_table_xgs_1; 553198892Srdivacky blk2->station_txbase = MSGRNG_STNID_XGS1_TX; 554198892Srdivacky blk2->station_rfr = MSGRNG_STNID_XMAC1RFR; 555198892Srdivacky blk2->station_id = MSGRNG_STNID_XGS1FR; 556198892Srdivacky blk2->baseaddr = XLR_IO_XGMAC_1_OFFSET; 557201360Srdivacky blk2->baseirq = PIC_XGS_1_IRQ; 558202375Srdivacky blk2->baseinst = 5; 559198892Srdivacky 560198892Srdivacky blk2->gmac_port[0].type = XLR_XGMII; 561198892Srdivacky blk2->gmac_port[0].instance = 0; 562201360Srdivacky blk2->gmac_port[0].phy_addr = 0; 563198892Srdivacky blk2->gmac_port[0].base_addr = XLR_IO_XGMAC_1_OFFSET; 564201360Srdivacky blk2->gmac_port[0].mii_addr = XLR_IO_XGMAC_1_OFFSET; 565201360Srdivacky blk2->gmac_port[0].tx_bucket_id = blk2->station_txbase; 566198892Srdivacky blk2->gmac_port[0].mdint_id = 2; 567198892Srdivacky 568198892Srdivacky /* Done with default setup. Now handle chip and board-specific 569198892Srdivacky variations. */ 570198892Srdivacky xlr_chip_specific_overrides(&xlr_board_info); 571198892Srdivacky xlr_board_specific_overrides(&xlr_board_info); 572198892Srdivacky } 573198892Srdivacky return 0; 574198892Srdivacky} 575198892Srdivacky