1 /* bnx2x_init.h: Broadcom Everest network driver.
2 * Structures and macroes needed during the initialization.
4 * Copyright (c) 2007-2009 Broadcom Corporation
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation.
10 * Maintained by: Eilon Greenstein <eilong@broadcom.com>
11 * Written by: Eliezer Tamir
12 * Modified by: Vladislav Zolotarov <vladz@broadcom.com>
18 /* RAM0 size in bytes */
19 #define STORM_INTMEM_SIZE_E1 0x5800
20 #define STORM_INTMEM_SIZE_E1H 0x10000
21 #define STORM_INTMEM_SIZE(bp) ((CHIP_IS_E1(bp) ? STORM_INTMEM_SIZE_E1 : \
22 STORM_INTMEM_SIZE_E1H) / 4)
25 /* Init operation types and structures */
26 /* Common for both E1 and E1H */
27 #define OP_RD 0x1 /* read single register */
28 #define OP_WR 0x2 /* write single register */
29 #define OP_IW 0x3 /* write single register using mailbox */
30 #define OP_SW 0x4 /* copy a string to the device */
31 #define OP_SI 0x5 /* copy a string using mailbox */
32 #define OP_ZR 0x6 /* clear memory */
33 #define OP_ZP 0x7 /* unzip then copy with DMAE */
34 #define OP_WR_64 0x8 /* write 64 bit pattern */
35 #define OP_WB 0x9 /* copy a string using DMAE */
37 /* FPGA and EMUL specific operations */
38 #define OP_WR_EMUL 0xa /* write single register on Emulation */
39 #define OP_WR_FPGA 0xb /* write single register on FPGA */
40 #define OP_WR_ASIC 0xc /* write single register on ASIC */
43 /* Never reorder stages !!! */
44 #define COMMON_STAGE 0
54 #define FUNC7_STAGE 10
55 #define STAGE_IDX_MAX 11
61 /* Indices of blocks */
85 #define TIMERS_BLOCK 23
97 #define MISC_AEU_BLOCK 35
98 #define PGLUE_B_BLOCK 36
101 #define QM_4PORT_BLOCK 39
102 #define XSEM_4PORT_BLOCK 40
105 /* Returns the index of start or end of a specific block stage in ops array*/
106 #define BLOCK_OPS_IDX(block, stage, end) \
107 (2*(((block)*STAGE_IDX_MAX) + (stage)) + (end))
128 struct op_string_write
{
131 #ifdef __LITTLE_ENDIAN
134 #else /* __BIG_ENDIAN */
148 struct op_write write
;
149 struct op_string_write str_wr
;
154 #define INITOP_SET 0 /* set the HW directly */
155 #define INITOP_CLEAR 1 /* clear the HW directly */
156 #define INITOP_INIT 2 /* set the init-value array */
158 /****************************************************************************
160 ****************************************************************************/
162 dma_addr_t page_mapping
;
167 struct ilt_client_info
{
173 #define ILT_CLIENT_SKIP_INIT 0x1
174 #define ILT_CLIENT_SKIP_MEM 0x2
179 struct ilt_line
*lines
;
180 struct ilt_client_info clients
[4];
181 #define ILT_CLIENT_CDU 0
182 #define ILT_CLIENT_QM 1
183 #define ILT_CLIENT_SRC 2
184 #define ILT_CLIENT_TM 3
187 /****************************************************************************
189 ****************************************************************************/
195 /****************************************************************************
196 * Parity configuration
197 ****************************************************************************/
198 #define BLOCK_PRTY_INFO(block, en_mask, m1, m1h, m2) \
200 block##_REG_##block##_PRTY_MASK, \
201 block##_REG_##block##_PRTY_STS_CLR, \
202 en_mask, {m1, m1h, m2}, #block \
205 #define BLOCK_PRTY_INFO_0(block, en_mask, m1, m1h, m2) \
207 block##_REG_##block##_PRTY_MASK_0, \
208 block##_REG_##block##_PRTY_STS_CLR_0, \
209 en_mask, {m1, m1h, m2}, #block"_0" \
212 #define BLOCK_PRTY_INFO_1(block, en_mask, m1, m1h, m2) \
214 block##_REG_##block##_PRTY_MASK_1, \
215 block##_REG_##block##_PRTY_STS_CLR_1, \
216 en_mask, {m1, m1h, m2}, #block"_1" \
219 static const struct {
222 u32 en_mask
; /* Mask to enable parity attentions */
227 } reg_mask
; /* Register mask (all valid bits) */
228 char name
[7]; /* Block's longest name is 6 characters long
231 } bnx2x_blocks_parity_data
[] = {
233 /* REG_WR(bp, PXP_REG_PXP_PRTY_MASK, 0x80000); */
235 /* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_0, 0xfff40020); */
237 /* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_1, 0x20); */
238 /* REG_WR(bp, HC_REG_HC_PRTY_MASK, 0x0); */
239 /* REG_WR(bp, MISC_REG_MISC_PRTY_MASK, 0x0); */
241 /* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't
242 * want to handle "system kill" flow at the moment.
244 BLOCK_PRTY_INFO(PXP
, 0x3ffffff, 0x3ffffff, 0x3ffffff, 0x3ffffff),
245 BLOCK_PRTY_INFO_0(PXP2
, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff),
246 BLOCK_PRTY_INFO_1(PXP2
, 0x7ff, 0x7f, 0x7f, 0x7ff),
247 BLOCK_PRTY_INFO(HC
, 0x7, 0x7, 0x7, 0),
248 BLOCK_PRTY_INFO(IGU
, 0x7ff, 0, 0, 0x7ff),
249 BLOCK_PRTY_INFO(MISC
, 0x1, 0x1, 0x1, 0x1),
250 BLOCK_PRTY_INFO(QM
, 0, 0x1ff, 0xfff, 0xfff),
251 BLOCK_PRTY_INFO(DORQ
, 0, 0x3, 0x3, 0x3),
252 {GRCBASE_UPB
+ PB_REG_PB_PRTY_MASK
,
253 GRCBASE_UPB
+ PB_REG_PB_PRTY_STS_CLR
, 0,
254 {0xf, 0xf, 0xf}, "UPB"},
255 {GRCBASE_XPB
+ PB_REG_PB_PRTY_MASK
,
256 GRCBASE_XPB
+ PB_REG_PB_PRTY_STS_CLR
, 0,
257 {0xf, 0xf, 0xf}, "XPB"},
258 BLOCK_PRTY_INFO(SRC
, 0x4, 0x7, 0x7, 0x7),
259 BLOCK_PRTY_INFO(CDU
, 0, 0x1f, 0x1f, 0x1f),
260 BLOCK_PRTY_INFO(CFC
, 0, 0xf, 0xf, 0xf),
261 BLOCK_PRTY_INFO(DBG
, 0, 0x1, 0x1, 0x1),
262 BLOCK_PRTY_INFO(DMAE
, 0, 0xf, 0xf, 0xf),
263 BLOCK_PRTY_INFO(BRB1
, 0, 0xf, 0xf, 0xf),
264 BLOCK_PRTY_INFO(PRS
, (1<<6), 0xff, 0xff, 0xff),
265 BLOCK_PRTY_INFO(TSDM
, 0x18, 0x7ff, 0x7ff, 0x7ff),
266 BLOCK_PRTY_INFO(CSDM
, 0x8, 0x7ff, 0x7ff, 0x7ff),
267 BLOCK_PRTY_INFO(USDM
, 0x38, 0x7ff, 0x7ff, 0x7ff),
268 BLOCK_PRTY_INFO(XSDM
, 0x8, 0x7ff, 0x7ff, 0x7ff),
269 BLOCK_PRTY_INFO_0(TSEM
, 0, 0xffffffff, 0xffffffff, 0xffffffff),
270 BLOCK_PRTY_INFO_1(TSEM
, 0, 0x3, 0x1f, 0x3f),
271 BLOCK_PRTY_INFO_0(USEM
, 0, 0xffffffff, 0xffffffff, 0xffffffff),
272 BLOCK_PRTY_INFO_1(USEM
, 0, 0x3, 0x1f, 0x1f),
273 BLOCK_PRTY_INFO_0(CSEM
, 0, 0xffffffff, 0xffffffff, 0xffffffff),
274 BLOCK_PRTY_INFO_1(CSEM
, 0, 0x3, 0x1f, 0x1f),
275 BLOCK_PRTY_INFO_0(XSEM
, 0, 0xffffffff, 0xffffffff, 0xffffffff),
276 BLOCK_PRTY_INFO_1(XSEM
, 0, 0x3, 0x1f, 0x3f),
280 /* [28] MCP Latched rom_parity
281 * [29] MCP Latched ump_rx_parity
282 * [30] MCP Latched ump_tx_parity
283 * [31] MCP Latched scpad_parity
285 #define MISC_AEU_ENABLE_MCP_PRTY_BITS \
286 (AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | \
287 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | \
288 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY | \
289 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY)
291 /* Below registers control the MCP parity attention output. When
292 * MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are
293 * enabled, when cleared - disabled.
295 static const u32 mcp_attn_ctl_regs
[] = {
296 MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0
,
297 MISC_REG_AEU_ENABLE4_NIG_0
,
298 MISC_REG_AEU_ENABLE4_PXP_0
,
299 MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0
,
300 MISC_REG_AEU_ENABLE4_NIG_1
,
301 MISC_REG_AEU_ENABLE4_PXP_1
304 static inline void bnx2x_set_mcp_parity(struct bnx2x
*bp
, u8 enable
)
309 for (i
= 0; i
< ARRAY_SIZE(mcp_attn_ctl_regs
); i
++) {
310 reg_val
= REG_RD(bp
, mcp_attn_ctl_regs
[i
]);
313 reg_val
|= MISC_AEU_ENABLE_MCP_PRTY_BITS
;
315 reg_val
&= ~MISC_AEU_ENABLE_MCP_PRTY_BITS
;
317 REG_WR(bp
, mcp_attn_ctl_regs
[i
], reg_val
);
321 static inline u32
bnx2x_parity_reg_mask(struct bnx2x
*bp
, int idx
)
324 return bnx2x_blocks_parity_data
[idx
].reg_mask
.e1
;
325 else if (CHIP_IS_E1H(bp
))
326 return bnx2x_blocks_parity_data
[idx
].reg_mask
.e1h
;
328 return bnx2x_blocks_parity_data
[idx
].reg_mask
.e2
;
331 static inline void bnx2x_disable_blocks_parity(struct bnx2x
*bp
)
335 for (i
= 0; i
< ARRAY_SIZE(bnx2x_blocks_parity_data
); i
++) {
336 u32 dis_mask
= bnx2x_parity_reg_mask(bp
, i
);
339 REG_WR(bp
, bnx2x_blocks_parity_data
[i
].mask_addr
,
341 DP(NETIF_MSG_HW
, "Setting parity mask "
342 "for %s to\t\t0x%x\n",
343 bnx2x_blocks_parity_data
[i
].name
, dis_mask
);
347 /* Disable MCP parity attentions */
348 bnx2x_set_mcp_parity(bp
, false);
352 * Clear the parity error status registers.
354 static inline void bnx2x_clear_blocks_parity(struct bnx2x
*bp
)
357 u32 reg_val
, mcp_aeu_bits
=
358 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY
|
359 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY
|
360 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY
|
361 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY
;
363 /* Clear SEM_FAST parities */
364 REG_WR(bp
, XSEM_REG_FAST_MEMORY
+ SEM_FAST_REG_PARITY_RST
, 0x1);
365 REG_WR(bp
, TSEM_REG_FAST_MEMORY
+ SEM_FAST_REG_PARITY_RST
, 0x1);
366 REG_WR(bp
, USEM_REG_FAST_MEMORY
+ SEM_FAST_REG_PARITY_RST
, 0x1);
367 REG_WR(bp
, CSEM_REG_FAST_MEMORY
+ SEM_FAST_REG_PARITY_RST
, 0x1);
369 for (i
= 0; i
< ARRAY_SIZE(bnx2x_blocks_parity_data
); i
++) {
370 u32 reg_mask
= bnx2x_parity_reg_mask(bp
, i
);
373 reg_val
= REG_RD(bp
, bnx2x_blocks_parity_data
[i
].
375 if (reg_val
& reg_mask
)
377 "Parity errors in %s: 0x%x\n",
378 bnx2x_blocks_parity_data
[i
].name
,
383 /* Check if there were parity attentions in MCP */
384 reg_val
= REG_RD(bp
, MISC_REG_AEU_AFTER_INVERT_4_MCP
);
385 if (reg_val
& mcp_aeu_bits
)
386 DP(NETIF_MSG_HW
, "Parity error in MCP: 0x%x\n",
387 reg_val
& mcp_aeu_bits
);
389 /* Clear parity attentions in MCP:
390 * [7] clears Latched rom_parity
391 * [8] clears Latched ump_rx_parity
392 * [9] clears Latched ump_tx_parity
393 * [10] clears Latched scpad_parity (both ports)
395 REG_WR(bp
, MISC_REG_AEU_CLR_LATCH_SIGNAL
, 0x780);
398 static inline void bnx2x_enable_blocks_parity(struct bnx2x
*bp
)
402 for (i
= 0; i
< ARRAY_SIZE(bnx2x_blocks_parity_data
); i
++) {
403 u32 reg_mask
= bnx2x_parity_reg_mask(bp
, i
);
406 REG_WR(bp
, bnx2x_blocks_parity_data
[i
].mask_addr
,
407 bnx2x_blocks_parity_data
[i
].en_mask
& reg_mask
);
410 /* Enable MCP parity attentions */
411 bnx2x_set_mcp_parity(bp
, true);
415 #endif /* BNX2X_INIT_H */