1a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir/* bnx2x_init.h: Broadcom Everest network driver.
294a78b79cb5f14c09a42522738d6694c6a1cdd20Vladislav Zolotarov *               Structures and macroes needed during the initialization.
3a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir *
485b26ea18ee63be83d65ec6db72ad7857980a04bAriel Elior * Copyright (c) 2007-2012 Broadcom Corporation
5a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir *
6a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir * This program is free software; you can redistribute it and/or modify
7a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir * it under the terms of the GNU General Public License as published by
8a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir * the Free Software Foundation.
9a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir *
1024e3fcefb9cc61acce59ed54c00c4e4c32537de7Eilon Greenstein * Maintained by: Eilon Greenstein <eilong@broadcom.com>
1124e3fcefb9cc61acce59ed54c00c4e4c32537de7Eilon Greenstein * Written by: Eliezer Tamir
1294a78b79cb5f14c09a42522738d6694c6a1cdd20Vladislav Zolotarov * Modified by: Vladislav Zolotarov <vladz@broadcom.com>
13a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir */
14a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
15a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir#ifndef BNX2X_INIT_H
16a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir#define BNX2X_INIT_H
17a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
18a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir/* Init operation types and structures */
19619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovenum {
20619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_RD = 0x1,	/* read a single register */
21619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_WR,		/* write a single register */
22619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_SW,		/* copy a string to the device */
23619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_ZR,		/* clear memory */
24619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_ZP,		/* unzip then copy with DMAE */
25619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_WR_64,	/* write 64 bit pattern */
26619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_WB,		/* copy a string using DMAE */
27619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_WB_ZR,	/* Clear a string using DMAE or indirect-wr */
28619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	/* Skip the following ops if all of the init modes don't match */
29619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_IF_MODE_OR,
30619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	/* Skip the following ops if any of the init modes don't match */
31619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_IF_MODE_AND,
32619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	OP_MAX
33619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov};
34573f203574581faaf80ca4fc079d33452327fc3bEilon Greenstein
35619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovenum {
36619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	STAGE_START,
37619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	STAGE_END,
38619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov};
3994a78b79cb5f14c09a42522738d6694c6a1cdd20Vladislav Zolotarov
4094a78b79cb5f14c09a42522738d6694c6a1cdd20Vladislav Zolotarov/* Returns the index of start or end of a specific block stage in ops array*/
4194a78b79cb5f14c09a42522738d6694c6a1cdd20Vladislav Zolotarov#define BLOCK_OPS_IDX(block, stage, end) \
42619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	(2*(((block)*NUM_OF_INIT_PHASES) + (stage)) + (end))
43ad8d394804b355bc623decc50748cd01dbc0783bEilon Greenstein
44a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
45619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* structs for the various opcodes */
46a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamirstruct raw_op {
476378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 op:8;
486378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 offset:24;
49a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	u32 raw_data;
50a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir};
51a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
52a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamirstruct op_read {
536378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 op:8;
546378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 offset:24;
55619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u32 val;
56a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir};
57a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
58a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamirstruct op_write {
596378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 op:8;
606378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 offset:24;
61a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	u32 val;
62a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir};
63a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
64619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovstruct op_arr_write {
656378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 op:8;
666378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 offset:24;
67619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#ifdef __BIG_ENDIAN
68a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	u16 data_len;
69a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	u16 data_off;
70619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#else /* __LITTLE_ENDIAN */
71619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u16 data_off;
72619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u16 data_len;
73a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir#endif
74a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir};
75a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
76a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamirstruct op_zero {
776378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 op:8;
786378c0253175e400525ac0efac9dd29f4e573cbfEilon Greenstein	u32 offset:24;
79a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	u32 len;
80a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir};
81a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
82619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovstruct op_if_mode {
83619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u32 op:8;
84619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u32 cmd_offset:24;
85619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u32 mode_bit_map;
86619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov};
87619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
88619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
89a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamirunion init_op {
90a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	struct op_read		read;
91a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	struct op_write		write;
92619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	struct op_arr_write	arr_wr;
93a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	struct op_zero		zero;
94a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir	struct raw_op		raw;
95619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	struct op_if_mode	if_mode;
96619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov};
97619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
98619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
99619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Init Phases */
100619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovenum {
101619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_COMMON,
102619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PORT0,
103619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PORT1,
104619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF0,
105619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF1,
106619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF2,
107619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF3,
108619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF4,
109619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF5,
110619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF6,
111619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	PHASE_PF7,
112619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	NUM_OF_INIT_PHASES
113619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov};
114619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
115619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Init Modes */
116619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovenum {
117619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_ASIC                      = 0x00000001,
118619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_FPGA                      = 0x00000002,
119619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_EMUL                      = 0x00000004,
120619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_E2                        = 0x00000008,
121619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_E3                        = 0x00000010,
122619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_PORT2                     = 0x00000020,
123619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_PORT4                     = 0x00000040,
124619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_SF                        = 0x00000080,
125619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_MF                        = 0x00000100,
126619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_MF_SD                     = 0x00000200,
127619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_MF_SI                     = 0x00000400,
128619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_MF_NIV                    = 0x00000800,
129619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_E3_A0                     = 0x00001000,
130619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	MODE_E3_B0                     = 0x00002000,
1316383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior	MODE_COS3                      = 0x00004000,
1326383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior	MODE_COS6                      = 0x00008000,
1336383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior	MODE_LITTLE_ENDIAN             = 0x00010000,
1346383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior	MODE_BIG_ENDIAN                = 0x00020000,
135619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov};
136619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
137619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Init Blocks */
138619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovenum {
139619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_ATC,
140619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_BRB1,
141619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_CCM,
142619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_CDU,
143619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_CFC,
144619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_CSDM,
145619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_CSEM,
146619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_DBG,
147619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_DMAE,
148619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_DORQ,
149619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_HC,
150619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_IGU,
151619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_MISC,
152619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_NIG,
153619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_PBF,
154619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_PGLUE_B,
155619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_PRS,
156619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_PXP2,
157619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_PXP,
158619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_QM,
159619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_SRC,
160619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_TCM,
161619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_TM,
162619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_TSDM,
163619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_TSEM,
164619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_UCM,
165619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_UPB,
166619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_USDM,
167619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_USEM,
168619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_XCM,
169619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_XPB,
170619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_XSDM,
171619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_XSEM,
172619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	BLOCK_MISC_AEU,
173619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	NUM_OF_INIT_BLOCKS
174a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir};
175a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
176619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* QM queue numbers */
177619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_ETH_Q		0
178619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_TOE_Q		3
179619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_TOE_ACK_Q		6
180619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_ISCSI_Q		9
1816383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior#define BNX2X_ISCSI_ACK_Q	11
182619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_FCOE_Q		10
183619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
184619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Vnics per mode */
185619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_PORT2_MODE_NUM_VNICS 4
186619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_PORT4_MODE_NUM_VNICS 2
187619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
188619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* COS offset for port1 in E3 B0 4port mode */
189619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_E3B0_PORT1_COS_OFFSET 3
190619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
191619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* QM Register addresses */
192619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_Q_VOQ_REG_ADDR(pf_q_num)\
193619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	(QM_REG_QVOQIDX_0 + 4 * (pf_q_num))
194619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_VOQ_Q_REG_ADDR(cos, pf_q_num)\
195619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	(QM_REG_VOQQMASK_0_LSB + 4 * ((cos) * 2 + ((pf_q_num) >> 5)))
196619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_Q_CMDQ_REG_ADDR(pf_q_num)\
197619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	(QM_REG_BYTECRDCMDQ_0 + 4 * ((pf_q_num) >> 4))
198619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
199619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* extracts the QM queue number for the specified port and vnic */
200619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BNX2X_PF_Q_NUM(q_num, port, vnic)\
201619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	((((port) << 1) | (vnic)) * 16 + (q_num))
202619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
203619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
204619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Maps the specified queue to the specified COS */
205619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarovstatic inline void bnx2x_map_q_cos(struct bnx2x *bp, u32 q_num, u32 new_cos)
206619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov{
207619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	/* find current COS mapping */
208619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	u32 curr_cos = REG_RD(bp, QM_REG_QVOQIDX_0 + q_num * 4);
209619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
210619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	/* check if queue->COS mapping has changed */
211619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	if (curr_cos != new_cos) {
212619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		u32 num_vnics = BNX2X_PORT2_MODE_NUM_VNICS;
213619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		u32 reg_addr, reg_bit_map, vnic;
214619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
215619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		/* update parameters for 4port mode */
216619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		if (INIT_MODE_FLAGS(bp) & MODE_PORT4) {
217619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			num_vnics = BNX2X_PORT4_MODE_NUM_VNICS;
218619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			if (BP_PORT(bp)) {
219619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				curr_cos += BNX2X_E3B0_PORT1_COS_OFFSET;
220619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				new_cos += BNX2X_E3B0_PORT1_COS_OFFSET;
221619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			}
222619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		}
223619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
224619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		/* change queue mapping for each VNIC */
225619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		for (vnic = 0; vnic < num_vnics; vnic++) {
226619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			u32 pf_q_num =
227619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				BNX2X_PF_Q_NUM(q_num, BP_PORT(bp), vnic);
228619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			u32 q_bit_map = 1 << (pf_q_num & 0x1f);
229619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
230619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			/* overwrite queue->VOQ mapping */
231619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			REG_WR(bp, BNX2X_Q_VOQ_REG_ADDR(pf_q_num), new_cos);
232619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
233619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			/* clear queue bit from current COS bit map */
234619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			reg_addr = BNX2X_VOQ_Q_REG_ADDR(curr_cos, pf_q_num);
235619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			reg_bit_map = REG_RD(bp, reg_addr);
236619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			REG_WR(bp, reg_addr, reg_bit_map & (~q_bit_map));
237619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
238619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			/* set queue bit in new COS bit map */
239619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			reg_addr = BNX2X_VOQ_Q_REG_ADDR(new_cos, pf_q_num);
240619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			reg_bit_map = REG_RD(bp, reg_addr);
241619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			REG_WR(bp, reg_addr, reg_bit_map | q_bit_map);
242619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
243619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			/* set/clear queue bit in command-queue bit map
244619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			(E2/E3A0 only, valid COS values are 0/1) */
245619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			if (!(INIT_MODE_FLAGS(bp) & MODE_E3_B0)) {
246619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				reg_addr = BNX2X_Q_CMDQ_REG_ADDR(pf_q_num);
247619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				reg_bit_map = REG_RD(bp, reg_addr);
248619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				q_bit_map = 1 << (2 * (pf_q_num & 0xf));
249619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				reg_bit_map = new_cos ?
250619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov					      (reg_bit_map | q_bit_map) :
251619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov					      (reg_bit_map & (~q_bit_map));
252619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				REG_WR(bp, reg_addr, reg_bit_map);
253619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			}
254619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		}
255619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	}
256619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov}
257619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
258619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Configures the QM according to the specified per-traffic-type COSes */
2596383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Eliorstatic inline void bnx2x_dcb_config_qm(struct bnx2x *bp, enum cos_mode mode,
260619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				       struct priority_cos *traffic_cos)
261619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov{
262619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	bnx2x_map_q_cos(bp, BNX2X_FCOE_Q,
263619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			traffic_cos[LLFC_TRAFFIC_TYPE_FCOE].cos);
264619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	bnx2x_map_q_cos(bp, BNX2X_ISCSI_Q,
265619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			traffic_cos[LLFC_TRAFFIC_TYPE_ISCSI].cos);
2666383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior	bnx2x_map_q_cos(bp, BNX2X_ISCSI_ACK_Q,
2676383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior		traffic_cos[LLFC_TRAFFIC_TYPE_ISCSI].cos);
2686383c0b35b48bfbd0fc8c6fe126a6603c5a9a4b3Ariel Elior	if (mode != STATIC_COS) {
269619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		/* required only in backward compatible COS mode */
270619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		bnx2x_map_q_cos(bp, BNX2X_ETH_Q,
271619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				traffic_cos[LLFC_TRAFFIC_TYPE_NW].cos);
272619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		bnx2x_map_q_cos(bp, BNX2X_TOE_Q,
273619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				traffic_cos[LLFC_TRAFFIC_TYPE_NW].cos);
274619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov		bnx2x_map_q_cos(bp, BNX2X_TOE_ACK_Q,
275619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov				traffic_cos[LLFC_TRAFFIC_TYPE_NW].cos);
276619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov	}
277619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov}
278619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
279619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
280619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov/* Returns the index of start or end of a specific block stage in ops array*/
281619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov#define BLOCK_OPS_IDX(block, stage, end) \
282619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov			(2*(((block)*NUM_OF_INIT_PHASES) + (stage)) + (end))
283619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
284619c5cb6885b936c44ae1422ef805b69c6291485Vlad Zolotarov
285523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define INITOP_SET		0	/* set the HW directly */
286523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define INITOP_CLEAR		1	/* clear the HW directly */
287523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define INITOP_INIT		2	/* set the init-value array */
288523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov
289523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov/****************************************************************************
290523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov* ILT management
291523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov****************************************************************************/
292523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkovstruct ilt_line {
293523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	dma_addr_t page_mapping;
294523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	void *page;
295523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u32 size;
296523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov};
297523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov
298523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkovstruct ilt_client_info {
299523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u32 page_size;
300523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u16 start;
301523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u16 end;
302523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u16 client_num;
303523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u16 flags;
304523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define ILT_CLIENT_SKIP_INIT	0x1
305523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define ILT_CLIENT_SKIP_MEM	0x2
306523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov};
307523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov
308523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkovstruct bnx2x_ilt {
309523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u32 start_line;
310523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	struct ilt_line		*lines;
311523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	struct ilt_client_info	clients[4];
312523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define ILT_CLIENT_CDU	0
313523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define ILT_CLIENT_QM	1
314523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define ILT_CLIENT_SRC	2
315523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov#define ILT_CLIENT_TM	3
316523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov};
317523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov
318523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov/****************************************************************************
319523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov* SRC configuration
320523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov****************************************************************************/
321523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkovstruct src_ent {
322523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u8 opaque[56];
323523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov	u64 next;
324523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov};
325523224a3b3cd407ce4e6731a087194e13a90db18Dmitry Kravkov
3264a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov/****************************************************************************
3274a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov* Parity configuration
3284a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov****************************************************************************/
3298736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov#define BLOCK_PRTY_INFO(block, en_mask, m1, m1h, m2, m3) \
3304a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{ \
3314a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	block##_REG_##block##_PRTY_MASK, \
3324a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	block##_REG_##block##_PRTY_STS_CLR, \
3338736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	en_mask, {m1, m1h, m2, m3}, #block \
3344a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
3354a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
3368736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov#define BLOCK_PRTY_INFO_0(block, en_mask, m1, m1h, m2, m3) \
3374a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{ \
3384a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	block##_REG_##block##_PRTY_MASK_0, \
3394a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	block##_REG_##block##_PRTY_STS_CLR_0, \
3408736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	en_mask, {m1, m1h, m2, m3}, #block"_0" \
3414a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
3424a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
3438736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov#define BLOCK_PRTY_INFO_1(block, en_mask, m1, m1h, m2, m3) \
3444a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{ \
3454a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	block##_REG_##block##_PRTY_MASK_1, \
3464a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	block##_REG_##block##_PRTY_STS_CLR_1, \
3478736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	en_mask, {m1, m1h, m2, m3}, #block"_1" \
3484a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
3494a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
3504a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic const struct {
3514a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	u32 mask_addr;
3524a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	u32 sts_clr_addr;
3534a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	u32 en_mask;		/* Mask to enable parity attentions */
3544a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	struct {
3554a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		u32 e1;		/* 57710 */
3564a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		u32 e1h;	/* 57711 */
3574a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		u32 e2;		/* 57712 */
3588736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov		u32 e3;		/* 578xx */
3594a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	} reg_mask;		/* Register mask (all valid bits) */
3604a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	char name[7];		/* Block's longest name is 6 characters long
3614a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov				 * (name + suffix)
3624a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov				 */
3634a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov} bnx2x_blocks_parity_data[] = {
3644a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* bit 19 masked */
3654a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* REG_WR(bp, PXP_REG_PXP_PRTY_MASK, 0x80000); */
3664a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* bit 5,18,20-31 */
3674a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_0, 0xfff40020); */
3684a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* bit 5 */
3694a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_1, 0x20);	*/
3704a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* REG_WR(bp, HC_REG_HC_PRTY_MASK, 0x0); */
3714a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* REG_WR(bp, MISC_REG_MISC_PRTY_MASK, 0x0); */
3724a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
3734a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't
3744a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 * want to handle "system kill" flow at the moment.
3754a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 */
3768736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(PXP, 0x7ffffff, 0x3ffffff, 0x3ffffff, 0x7ffffff,
3778736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov			0x7ffffff),
3788736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_0(PXP2,	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
3798736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov			  0xffffffff),
3808736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_1(PXP2,	0x1ffffff, 0x7f, 0x7f, 0x7ff, 0x1ffffff),
3818736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0, 0),
3828736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(NIG, 0xffffffff, 0x3fffffff, 0xffffffff, 0, 0),
3838736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_0(NIG,	0xffffffff, 0, 0, 0xffffffff, 0xffffffff),
3848736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_1(NIG,	0xffff, 0, 0, 0xff, 0xffff),
3858736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(IGU, 0x7ff, 0, 0, 0x7ff, 0x7ff),
3868736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(MISC, 0x1, 0x1, 0x1, 0x1, 0x1),
3878736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(QM, 0, 0x1ff, 0xfff, 0xfff, 0xfff),
3888736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(ATC, 0x1f, 0, 0, 0x1f, 0x1f),
3898736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(PGLUE_B, 0x3, 0, 0, 0x3, 0x3),
3908736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(DORQ, 0, 0x3, 0x3, 0x3, 0x3),
3914a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	{GRCBASE_UPB + PB_REG_PB_PRTY_MASK,
392c9ee92062424375fe6e73c4af5d52df289ccf9ebVladislav Zolotarov		GRCBASE_UPB + PB_REG_PB_PRTY_STS_CLR, 0xf,
3938736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov		{0xf, 0xf, 0xf, 0xf}, "UPB"},
3944a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	{GRCBASE_XPB + PB_REG_PB_PRTY_MASK,
3954a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		GRCBASE_XPB + PB_REG_PB_PRTY_STS_CLR, 0,
3968736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov		{0xf, 0xf, 0xf, 0xf}, "XPB"},
3978736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(SRC, 0x4, 0x7, 0x7, 0x7, 0x7),
3988736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(CDU, 0, 0x1f, 0x1f, 0x1f, 0x1f),
3998736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(CFC, 0, 0xf, 0xf, 0xf, 0x3f),
4008736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(DBG, 0, 0x1, 0x1, 0x1, 0x1),
4018736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(DMAE, 0, 0xf, 0xf, 0xf, 0xf),
4028736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(BRB1, 0, 0xf, 0xf, 0xf, 0xf),
4038736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(PRS, (1<<6), 0xff, 0xff, 0xff, 0xff),
4048736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(PBF, 0, 0, 0x3ffff, 0xfffff, 0xfffffff),
4058736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(TM, 0, 0, 0x7f, 0x7f, 0x7f),
4068736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(TSDM, 0x18, 0x7ff, 0x7ff, 0x7ff, 0x7ff),
4078736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(CSDM, 0x8, 0x7ff, 0x7ff, 0x7ff, 0x7ff),
4088736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(USDM, 0x38, 0x7ff, 0x7ff, 0x7ff, 0x7ff),
4098736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(XSDM, 0x8, 0x7ff, 0x7ff, 0x7ff, 0x7ff),
4108736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(TCM, 0, 0, 0x7ffffff, 0x7ffffff, 0x7ffffff),
4118736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(CCM, 0, 0, 0x7ffffff, 0x7ffffff, 0x7ffffff),
4128736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(UCM, 0, 0, 0x7ffffff, 0x7ffffff, 0x7ffffff),
4138736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO(XCM, 0, 0, 0x3fffffff, 0x3fffffff, 0x3fffffff),
4148736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_0(TSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff,
4158736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov			  0xffffffff),
4168736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_1(TSEM, 0, 0x3, 0x1f, 0x3f, 0x3f),
4178736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_0(USEM, 0, 0xffffffff, 0xffffffff, 0xffffffff,
4188736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov			  0xffffffff),
4198736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_1(USEM, 0, 0x3, 0x1f, 0x1f, 0x1f),
4208736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_0(CSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff,
4218736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov			  0xffffffff),
4228736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_1(CSEM, 0, 0x3, 0x1f, 0x1f, 0x1f),
4238736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_0(XSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff,
4248736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov			  0xffffffff),
4258736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	BLOCK_PRTY_INFO_1(XSEM, 0, 0x3, 0x1f, 0x3f, 0x3f),
4264a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov};
4274a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4284a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4294a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov/* [28] MCP Latched rom_parity
4304a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov * [29] MCP Latched ump_rx_parity
4314a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov * [30] MCP Latched ump_tx_parity
4324a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov * [31] MCP Latched scpad_parity
4334a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov */
4344a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov#define MISC_AEU_ENABLE_MCP_PRTY_BITS	\
4354a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	(AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | \
4364a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | \
4374a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY | \
4384a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY)
4394a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4404a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov/* Below registers control the MCP parity attention output. When
4414a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov * MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are
4424a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov * enabled, when cleared - disabled.
4434a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov */
4444a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic const u32 mcp_attn_ctl_regs[] = {
4454a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0,
4464a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	MISC_REG_AEU_ENABLE4_NIG_0,
4474a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	MISC_REG_AEU_ENABLE4_PXP_0,
4484a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0,
4494a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	MISC_REG_AEU_ENABLE4_NIG_1,
4504a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	MISC_REG_AEU_ENABLE4_PXP_1
4514a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov};
4524a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4534a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic inline void bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable)
4544a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{
4554a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	int i;
4564a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	u32 reg_val;
4574a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4584a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	for (i = 0; i < ARRAY_SIZE(mcp_attn_ctl_regs); i++) {
4594a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		reg_val = REG_RD(bp, mcp_attn_ctl_regs[i]);
4604a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4614a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		if (enable)
4624a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			reg_val |= MISC_AEU_ENABLE_MCP_PRTY_BITS;
4634a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		else
4644a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			reg_val &= ~MISC_AEU_ENABLE_MCP_PRTY_BITS;
4654a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4664a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		REG_WR(bp, mcp_attn_ctl_regs[i], reg_val);
4674a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	}
4684a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
4694a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4704a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic inline u32 bnx2x_parity_reg_mask(struct bnx2x *bp, int idx)
4714a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{
4724a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	if (CHIP_IS_E1(bp))
4734a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		return bnx2x_blocks_parity_data[idx].reg_mask.e1;
4744a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	else if (CHIP_IS_E1H(bp))
4754a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		return bnx2x_blocks_parity_data[idx].reg_mask.e1h;
4768736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	else if (CHIP_IS_E2(bp))
4774a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		return bnx2x_blocks_parity_data[idx].reg_mask.e2;
4788736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov	else /* CHIP_IS_E3 */
4798736c82650500222c031dd7f59f0126e59808e36Vladislav Zolotarov		return bnx2x_blocks_parity_data[idx].reg_mask.e3;
4804a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
4814a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4824a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic inline void bnx2x_disable_blocks_parity(struct bnx2x *bp)
4834a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{
4844a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	int i;
4854a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4864a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) {
4874a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		u32 dis_mask = bnx2x_parity_reg_mask(bp, i);
4884a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4894a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		if (dis_mask) {
4904a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			REG_WR(bp, bnx2x_blocks_parity_data[i].mask_addr,
4914a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			       dis_mask);
4924a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			DP(NETIF_MSG_HW, "Setting parity mask "
4934a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov						 "for %s to\t\t0x%x\n",
4944a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov				    bnx2x_blocks_parity_data[i].name, dis_mask);
4954a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		}
4964a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	}
4974a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
4984a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* Disable MCP parity attentions */
4994a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	bnx2x_set_mcp_parity(bp, false);
5004a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
5014a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5024a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov/**
5034a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov * Clear the parity error status registers.
5044a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov */
5054a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic inline void bnx2x_clear_blocks_parity(struct bnx2x *bp)
5064a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{
5074a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	int i;
5084a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	u32 reg_val, mcp_aeu_bits =
5094a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY |
5104a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY |
5114a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY |
5124a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY;
5134a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5144a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* Clear SEM_FAST parities */
5154a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	REG_WR(bp, XSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
5164a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	REG_WR(bp, TSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
5174a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	REG_WR(bp, USEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
5184a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	REG_WR(bp, CSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
5194a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5204a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) {
5214a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		u32 reg_mask = bnx2x_parity_reg_mask(bp, i);
5224a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5234a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		if (reg_mask) {
5244a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			reg_val = REG_RD(bp, bnx2x_blocks_parity_data[i].
5254a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov					 sts_clr_addr);
5264a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			if (reg_val & reg_mask)
5274a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov				DP(NETIF_MSG_HW,
5284a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov					    "Parity errors in %s: 0x%x\n",
5294a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov					    bnx2x_blocks_parity_data[i].name,
5304a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov					    reg_val & reg_mask);
5314a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		}
5324a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	}
5334a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5344a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* Check if there were parity attentions in MCP */
5354a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	reg_val = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_4_MCP);
5364a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	if (reg_val & mcp_aeu_bits)
5374a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		DP(NETIF_MSG_HW, "Parity error in MCP: 0x%x\n",
5384a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		   reg_val & mcp_aeu_bits);
5394a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5404a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* Clear parity attentions in MCP:
5414a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 * [7]  clears Latched rom_parity
5424a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 * [8]  clears Latched ump_rx_parity
5434a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 * [9]  clears Latched ump_tx_parity
5444a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 * [10] clears Latched scpad_parity (both ports)
5454a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	 */
5464a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	REG_WR(bp, MISC_REG_AEU_CLR_LATCH_SIGNAL, 0x780);
5474a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
5484a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5494a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarovstatic inline void bnx2x_enable_blocks_parity(struct bnx2x *bp)
5504a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov{
5514a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	int i;
5524a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5534a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) {
5544a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		u32 reg_mask = bnx2x_parity_reg_mask(bp, i);
5554a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5564a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov		if (reg_mask)
5574a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov			REG_WR(bp, bnx2x_blocks_parity_data[i].mask_addr,
5584a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov				bnx2x_blocks_parity_data[i].en_mask & reg_mask);
5594a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	}
5604a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5614a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	/* Enable MCP parity attentions */
5624a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov	bnx2x_set_mcp_parity(bp, true);
5634a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov}
5644a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
5654a33bc03ab66631e844080bf1189d2afd7aae929Vladislav Zolotarov
566a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir#endif /* BNX2X_INIT_H */
567a2fbb9ea235467b0be6db3cec0132b6c83c0b9fbEliezer Tamir
568