1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, v.1,  (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 
22 /*
23 * Copyright 2014-2017 Cavium, Inc.
24 * The contents of this file are subject to the terms of the Common Development
25 * and Distribution License, v.1,  (the "License").
26 
27 * You may not use this file except in compliance with the License.
28 
29 * You can obtain a copy of the License at available
30 * at http://opensource.org/licenses/CDDL-1.0
31 
32 * See the License for the specific language governing permissions and
33 * limitations under the License.
34 */
35 
36 /****************************************************************************
37  * Name:        nvm_map.h
38  *
39  * Description: Everest NVRAM map
40  *
41  ****************************************************************************/
42 
43 #ifndef NVM_MAP_H
44 #define NVM_MAP_H
45 
46 #define CRC_MAGIC_VALUE                     0xDEBB20E3
47 #define CRC32_POLYNOMIAL                    0xEDB88320
48 #define NVM_CRC_SIZE				(sizeof(u32))
49 enum nvm_sw_arbitrator {
50 	NVM_SW_ARB_HOST,
51 	NVM_SW_ARB_MCP,
52 	NVM_SW_ARB_UART,
53 	NVM_SW_ARB_RESERVED
54 };
55 
56 /****************************************************************************
57  * Boot Strap Region                                                        *
58  ****************************************************************************/
59 struct legacy_bootstrap_region {
60 	u32 magic_value;	/* a pattern not likely to occur randomly */
61 #define NVM_MAGIC_VALUE          0x669955aa
62 	u32 sram_start_addr;	/* where to locate LIM code (byte addr) */
63 	u32 code_len;		/* boot code length (in dwords) */
64 	u32 code_start_addr;	/* location of code on media (media byte addr) */
65 	u32 crc;		/* 32-bit CRC */
66 };
67 
68 /****************************************************************************
69  * Directories Region                                                       *
70  ****************************************************************************/
71 struct nvm_code_entry {
72 	u32 image_type;		/* Image type */
73 	u32 nvm_start_addr;	/* NVM address of the image */
74 	u32 len;		/* Include CRC */
75 	u32 sram_start_addr;	/* Where to load the image on the scratchpad */
76 	u32 sram_run_addr;	/* Relevant in case of MIM only */
77 };
78 
79 enum nvm_image_type {
80 	NVM_TYPE_TIM1       = 0x01,
81 	NVM_TYPE_TIM2       = 0x02,
82 	NVM_TYPE_MIM1       = 0x03,
83 	NVM_TYPE_MIM2       = 0x04,
84 	NVM_TYPE_MBA        = 0x05,
85 	NVM_TYPE_MODULES_PN = 0x06,
86 	NVM_TYPE_VPD        = 0x07,
87 	NVM_TYPE_MFW_TRACE1 = 0x08,
88 	NVM_TYPE_MFW_TRACE2 = 0x09,
89 	NVM_TYPE_NVM_CFG1   = 0x0a,
90 	NVM_TYPE_L2B        = 0x0b,
91 	NVM_TYPE_DIR1       = 0x0c,
92 	NVM_TYPE_EAGLE_FW1  = 0x0d,
93 	NVM_TYPE_FALCON_FW1 = 0x0e,
94 	NVM_TYPE_PCIE_FW1   = 0x0f,
95 	NVM_TYPE_HW_SET     = 0x10,
96 	NVM_TYPE_LIM        = 0x11,
97 	NVM_TYPE_AVS_FW1    = 0x12,
98 	NVM_TYPE_DIR2       = 0x13,
99 	NVM_TYPE_CCM        = 0x14,
100 	NVM_TYPE_EAGLE_FW2  = 0x15,
101 	NVM_TYPE_FALCON_FW2 = 0x16,
102 	NVM_TYPE_PCIE_FW2   = 0x17,
103 	NVM_TYPE_AVS_FW2    = 0x18,
104 	NVM_TYPE_INIT_HW    = 0x19,
105 	NVM_TYPE_DEFAULT_CFG= 0x1a,
106 	NVM_TYPE_MDUMP	    = 0x1b,
107 	NVM_TYPE_NVM_META   = 0x1c,
108 	NVM_TYPE_ISCSI_CFG  = 0x1d,
109 	NVM_TYPE_FCOE_CFG   = 0x1f,
110 	NVM_TYPE_ETH_PHY_FW1 = 0x20,
111 	NVM_TYPE_ETH_PHY_FW2 = 0x21,
112 	NVM_TYPE_BDN        = 0x22,
113 	NVM_TYPE_8485X_PHY_FW = 0x23,
114 	NVM_TYPE_PUB_KEY    = 0x24,
115 	NVM_TYPE_RECOVERY   = 0x25,
116 	NVM_TYPE_MAX,
117 };
118 
119 #ifdef DEFINE_IMAGE_TABLE
120 struct image_map {
121 	char name[32];
122 	char option[32];
123 	u32 image_type;
124 };
125 
126 struct image_map g_image_table[] = {
127 	{"TIM1",        "-tim1",    NVM_TYPE_TIM1},
128 	{"TIM2",        "-tim2",    NVM_TYPE_TIM2},
129 	{"MIM1",        "-mim1",    NVM_TYPE_MIM1},
130 	{"MIM2",        "-mim2",    NVM_TYPE_MIM2},
131 	{"MBA",         "-mba",     NVM_TYPE_MBA},
132 	{"OPT_MODULES", "-optm",    NVM_TYPE_MODULES_PN},
133 	{"VPD",         "-vpd",     NVM_TYPE_VPD},
134 	{"MFW_TRACE1",  "-mfwt1",   NVM_TYPE_MFW_TRACE1},
135 	{"MFW_TRACE2",  "-mfwt2",   NVM_TYPE_MFW_TRACE2},
136 	{"NVM_CFG1",    "-cfg",     NVM_TYPE_NVM_CFG1},
137 	{"L2B",         "-l2b",     NVM_TYPE_L2B},
138 	{"DIR1",        "-dir1",    NVM_TYPE_DIR1},
139 	{"EAGLE_FW1",   "-eagle1",  NVM_TYPE_EAGLE_FW1},
140 	{"FALCON_FW1",  "-falcon1", NVM_TYPE_FALCON_FW1},
141 	{"PCIE_FW1",    "-pcie1",   NVM_TYPE_PCIE_FW1},
142 	{"HW_SET",      "-hw_set",  NVM_TYPE_HW_SET},
143 	{"LIM",         "-lim",     NVM_TYPE_LIM},
144 	{"AVS_FW1",     "-avs1",    NVM_TYPE_AVS_FW1},
145 	{"DIR2",        "-dir2",    NVM_TYPE_DIR2},
146 	{"CCM",         "-ccm",     NVM_TYPE_CCM},
147 	{"EAGLE_FW2",   "-eagle2",  NVM_TYPE_EAGLE_FW2},
148 	{"FALCON_FW2",  "-falcon2", NVM_TYPE_FALCON_FW2},
149 	{"PCIE_FW2",    "-pcie2",   NVM_TYPE_PCIE_FW2},
150 	{"AVS_FW2",     "-avs2",    NVM_TYPE_AVS_FW2},
151 	{"INIT_HW",     "-init_hw", NVM_TYPE_INIT_HW},
152 	{"DEFAULT_CFG", "-def_cfg", NVM_TYPE_DEFAULT_CFG},
153 	{"CRASH_DUMP",  "-mdump",   NVM_TYPE_MDUMP},
154 	{"META",	    "-meta",    NVM_TYPE_NVM_META},
155 	{"ISCSI_CFG",   "-iscsi_cfg", NVM_TYPE_ISCSI_CFG},
156 	{"FCOE_CFG",    "-fcoe_cfg",NVM_TYPE_FCOE_CFG},
157 	{"ETH_PHY_FW1", "-ethphy1", NVM_TYPE_ETH_PHY_FW1},
158 	{"ETH_PHY_FW2", "-ethphy2", NVM_TYPE_ETH_PHY_FW2},
159 	{"BDN",         "-bdn",     NVM_TYPE_BDN},
160 	{"PK",          "-pk",      NVM_TYPE_PUB_KEY},
161 	{"RECOVERY",    "-recovery",NVM_TYPE_RECOVERY}
162 };
163 
164 #define IMAGE_TABLE_SIZE (sizeof(g_image_table) / sizeof(struct image_map))
165 
166 #endif	/* #ifdef DEFINE_IMAGE_TABLE */
167 #define MAX_NVM_DIR_ENTRIES 150
168 /* Note: The has given 150 possible entries since anyway each file captures at least one page. */
169 
170 struct nvm_dir {
171 	s32 seq; /* This dword is used to indicate whether this dir is valid, and whether it is more updated than the other dir */
172 #define NVM_DIR_NEXT_MFW_MASK	0x00000001
173 #define NVM_DIR_SEQ_MASK	0xfffffffe
174 #define NVM_DIR_NEXT_MFW(seq) ((seq) & NVM_DIR_NEXT_MFW_MASK)
175 #define NVM_DIR_UPDATE_SEQ(_seq, swap_mfw) \
176 	do { \
177 		_seq = (((_seq + 2) & NVM_DIR_SEQ_MASK) | (NVM_DIR_NEXT_MFW(_seq ^ swap_mfw))); \
178 	} while (0)
179 #define IS_DIR_SEQ_VALID(seq) ((seq & NVM_DIR_SEQ_MASK) != NVM_DIR_SEQ_MASK)
180 
181 	u32 num_images;
182 	u32 rsrv;
183 	struct nvm_code_entry code[1];	/* Up to MAX_NVM_DIR_ENTRIES */
184 };
185 #define NVM_DIR_SIZE(_num_images) (sizeof(struct nvm_dir) + (_num_images - 1) * sizeof(struct nvm_code_entry) + NVM_CRC_SIZE)
186 
187 struct nvm_vpd_image {
188 	u32 format_revision;
189 #define VPD_IMAGE_VERSION        1
190 
191 	/* This array length depends on the number of VPD fields */
192 	u8 vpd_data[1];
193 };
194 
195 /****************************************************************************
196  * NVRAM FULL MAP                                                           *
197  ****************************************************************************/
198 #define DIR_ID_1    (0)
199 #define DIR_ID_2    (1)
200 #define MAX_DIR_IDS (2)
201 
202 #define MFW_BUNDLE_1    (0)
203 #define MFW_BUNDLE_2    (1)
204 #define MAX_MFW_BUNDLES (2)
205 
206 #define FLASH_PAGE_SIZE 0x1000
207 #define NVM_DIR_MAX_SIZE    (FLASH_PAGE_SIZE) 		/* 4Kb */
208 #define ASIC_MIM_MAX_SIZE   (300*FLASH_PAGE_SIZE)	/* 1.2Mb */
209 #define FPGA_MIM_MAX_SIZE   (62*FLASH_PAGE_SIZE)	/* 250Kb */
210 
211 /* Each image must start on its own page. Bootstrap and LIM are bound together, so they can share the same page.
212  * The LIM itself should be very small, so limit it to 8Kb, but in order to open a new page, we decrement the bootstrap size out of it.
213  */
214 #define LIM_MAX_SIZE	    ((2*FLASH_PAGE_SIZE) - sizeof(struct legacy_bootstrap_region) - NVM_RSV_SIZE)
215 #define LIM_OFFSET          (NVM_OFFSET(lim_image))
216 #define NVM_RSV_SIZE		(44)
217 #define MIM_MAX_SIZE(is_asic) ((is_asic) ? ASIC_MIM_MAX_SIZE : FPGA_MIM_MAX_SIZE )
218 #define MIM_OFFSET(idx, is_asic) (NVM_OFFSET(dir[MAX_MFW_BUNDLES]) + ((idx == NVM_TYPE_MIM2) ? MIM_MAX_SIZE(is_asic) : 0))
219 #define NVM_FIXED_AREA_SIZE(is_asic) (sizeof(struct nvm_image) + MIM_MAX_SIZE(is_asic)*2)
220 
221 union nvm_dir_union {
222 	struct nvm_dir dir;
223 	u8 page[FLASH_PAGE_SIZE];
224 };
225 
226 /*                        Address
227  *  +-------------------+ 0x000000
228  *  |    Bootstrap:     |
229  *  | magic_number      |
230  *  | sram_start_addr   |
231  *  | code_len  	|
232  *  | code_start_addr   |
233  *  | crc               |
234  *  +-------------------+ 0x000014
235  *  | rsrv              |
236  *  +-------------------+ 0x000040
237  *  | LIM               |
238  *  +-------------------+ 0x002000
239  *  | Dir1              |
240  *  +-------------------+ 0x003000
241  *  | Dir2              |
242  *  +-------------------+ 0x004000
243  *  | MIM1              |
244  *  +-------------------+ 0x130000
245  *  | MIM2              |
246  *  +-------------------+ 0x25C000
247  *  | Rest Images:      |
248  *  | TIM1/2    	|
249  *  | MFW_TRACE1/2      |
250  *  | Eagle/Falcon FW   |
251  *  | PCIE/AVS FW       |
252  *  | MBA/CCM/L2B       |
253  *  | VPD       	|
254  *  | optic_modules     |
255  *  |  ...              |
256  *  +-------------------+ 0x400000
257 */
258 struct nvm_image {
259 /*********** !!!  FIXED SECTIONS  !!! DO NOT MODIFY !!! **********************/
260 						/* NVM Offset  (size) */
261 	struct legacy_bootstrap_region bootstrap;	/* 0x000000 (0x000014) */
262 	u8 rsrv[NVM_RSV_SIZE];			/* 0x000014 (0x00002c) */
263 	u8 lim_image[LIM_MAX_SIZE];		/* 0x000040 (0x001fc0) */
264 	union nvm_dir_union dir[MAX_MFW_BUNDLES];	/* 0x002000 (0x001000)x2 */
265 	/* MIM1_IMAGE        	                   0x004000 (0x12c000) */
266 	/* MIM2_IMAGE                              0x130000 (0x12c000) */
267 /*********** !!!  FIXED SECTIONS  !!! DO NOT MODIFY !!! **********************/
268 };				/* 0x134 */
269 
270 #define NVM_OFFSET(f)       ((u32_t)((int_ptr_t)(&(((struct nvm_image*)0)->f))))
271 
272 struct hw_set_info {
273 	u32 reg_type;
274 #define GRC_REG_TYPE 1
275 #define PHY_REG_TYPE 2
276 #define PCI_REG_TYPE 4
277 
278 	u32 bank_num;
279 	u32 pf_num;
280 	u32 operation;
281 #define READ_OP     1
282 #define WRITE_OP    2
283 #define RMW_SET_OP  3
284 #define RMW_CLR_OP  4
285 
286 	u32 reg_addr;
287 	u32 reg_data;
288 
289 	u32 reset_type;
290 #define POR_RESET_TYPE  (1 << 0)
291 #define HARD_RESET_TYPE (1 << 1)
292 #define CORE_RESET_TYPE (1 << 2)
293 #define MCP_RESET_TYPE  (1 << 3)
294 #define PERSET_ASSERT   (1 << 4)
295 #define PERSET_DEASSERT (1 << 5)
296 
297 };
298 
299 struct hw_set_image {
300 	u32 format_version;
301 #define HW_SET_IMAGE_VERSION        1
302 	u32 no_hw_sets;
303 	/* This array length depends on the no_hw_sets */
304 	struct hw_set_info hw_sets[1];
305 };
306 
307 #endif				//NVM_MAP_H
308