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