xref: /freebsd/sys/dev/ice/ice_nvm.c (revision 783d3ff6d7fae619db8a7990b8a6387de0c677b5)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*  Copyright (c) 2023, Intel Corporation
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above copyright notice,
9  *      this list of conditions and the following disclaimer.
10  *
11  *   2. Redistributions in binary form must reproduce the above copyright
12  *      notice, this list of conditions and the following disclaimer in the
13  *      documentation and/or other materials provided with the distribution.
14  *
15  *   3. Neither the name of the Intel Corporation nor the names of its
16  *      contributors may be used to endorse or promote products derived from
17  *      this software without specific prior written permission.
18  *
19  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  *  POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include "ice_common.h"
33 
34 #define GL_MNG_DEF_DEVID 0x000B611C
35 
36 /**
37  * ice_aq_read_nvm
38  * @hw: pointer to the HW struct
39  * @module_typeid: module pointer location in words from the NVM beginning
40  * @offset: byte offset from the module beginning
41  * @length: length of the section to be read (in bytes from the offset)
42  * @data: command buffer (size [bytes] = length)
43  * @last_command: tells if this is the last command in a series
44  * @read_shadow_ram: tell if this is a shadow RAM read
45  * @cd: pointer to command details structure or NULL
46  *
47  * Read the NVM using the admin queue commands (0x0701)
48  */
49 enum ice_status
50 ice_aq_read_nvm(struct ice_hw *hw, u16 module_typeid, u32 offset, u16 length,
51 		void *data, bool last_command, bool read_shadow_ram,
52 		struct ice_sq_cd *cd)
53 {
54 	struct ice_aq_desc desc;
55 	struct ice_aqc_nvm *cmd;
56 
57 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
58 
59 	cmd = &desc.params.nvm;
60 
61 	if (offset > ICE_AQC_NVM_MAX_OFFSET)
62 		return ICE_ERR_PARAM;
63 
64 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_read);
65 
66 	if (!read_shadow_ram && module_typeid == ICE_AQC_NVM_START_POINT)
67 		cmd->cmd_flags |= ICE_AQC_NVM_FLASH_ONLY;
68 
69 	/* If this is the last command in a series, set the proper flag. */
70 	if (last_command)
71 		cmd->cmd_flags |= ICE_AQC_NVM_LAST_CMD;
72 	cmd->module_typeid = CPU_TO_LE16(module_typeid);
73 	cmd->offset_low = CPU_TO_LE16(offset & 0xFFFF);
74 	cmd->offset_high = (offset >> 16) & 0xFF;
75 	cmd->length = CPU_TO_LE16(length);
76 
77 	return ice_aq_send_cmd(hw, &desc, data, length, cd);
78 }
79 
80 /**
81  * ice_read_flat_nvm - Read portion of NVM by flat offset
82  * @hw: pointer to the HW struct
83  * @offset: offset from beginning of NVM
84  * @length: (in) number of bytes to read; (out) number of bytes actually read
85  * @data: buffer to return data in (sized to fit the specified length)
86  * @read_shadow_ram: if true, read from shadow RAM instead of NVM
87  *
88  * Reads a portion of the NVM, as a flat memory space. This function correctly
89  * breaks read requests across Shadow RAM sectors and ensures that no single
90  * read request exceeds the maximum 4KB read for a single AdminQ command.
91  *
92  * Returns a status code on failure. Note that the data pointer may be
93  * partially updated if some reads succeed before a failure.
94  */
95 enum ice_status
96 ice_read_flat_nvm(struct ice_hw *hw, u32 offset, u32 *length, u8 *data,
97 		  bool read_shadow_ram)
98 {
99 	enum ice_status status;
100 	u32 inlen = *length;
101 	u32 bytes_read = 0;
102 	bool last_cmd;
103 
104 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
105 
106 	*length = 0;
107 
108 	/* Verify the length of the read if this is for the Shadow RAM */
109 	if (read_shadow_ram && ((offset + inlen) > (hw->flash.sr_words * 2u))) {
110 		ice_debug(hw, ICE_DBG_NVM, "NVM error: requested data is beyond Shadow RAM limit\n");
111 		return ICE_ERR_PARAM;
112 	}
113 
114 	do {
115 		u32 read_size, sector_offset;
116 
117 		/* ice_aq_read_nvm cannot read more than 4KB at a time.
118 		 * Additionally, a read from the Shadow RAM may not cross over
119 		 * a sector boundary. Conveniently, the sector size is also
120 		 * 4KB.
121 		 */
122 		sector_offset = offset % ICE_AQ_MAX_BUF_LEN;
123 		read_size = MIN_T(u32, ICE_AQ_MAX_BUF_LEN - sector_offset,
124 				  inlen - bytes_read);
125 
126 		last_cmd = !(bytes_read + read_size < inlen);
127 
128 		/* ice_aq_read_nvm takes the length as a u16. Our read_size is
129 		 * calculated using a u32, but the ICE_AQ_MAX_BUF_LEN maximum
130 		 * size guarantees that it will fit within the 2 bytes.
131 		 */
132 		status = ice_aq_read_nvm(hw, ICE_AQC_NVM_START_POINT,
133 					 offset, (u16)read_size,
134 					 data + bytes_read, last_cmd,
135 					 read_shadow_ram, NULL);
136 		if (status)
137 			break;
138 
139 		bytes_read += read_size;
140 		offset += read_size;
141 	} while (!last_cmd);
142 
143 	*length = bytes_read;
144 	return status;
145 }
146 
147 /**
148  * ice_aq_update_nvm
149  * @hw: pointer to the HW struct
150  * @module_typeid: module pointer location in words from the NVM beginning
151  * @offset: byte offset from the module beginning
152  * @length: length of the section to be written (in bytes from the offset)
153  * @data: command buffer (size [bytes] = length)
154  * @last_command: tells if this is the last command in a series
155  * @command_flags: command parameters
156  * @cd: pointer to command details structure or NULL
157  *
158  * Update the NVM using the admin queue commands (0x0703)
159  */
160 enum ice_status
161 ice_aq_update_nvm(struct ice_hw *hw, u16 module_typeid, u32 offset,
162 		  u16 length, void *data, bool last_command, u8 command_flags,
163 		  struct ice_sq_cd *cd)
164 {
165 	struct ice_aq_desc desc;
166 	struct ice_aqc_nvm *cmd;
167 
168 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
169 
170 	cmd = &desc.params.nvm;
171 
172 	/* In offset the highest byte must be zeroed. */
173 	if (offset & 0xFF000000)
174 		return ICE_ERR_PARAM;
175 
176 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_write);
177 
178 	cmd->cmd_flags |= command_flags;
179 
180 	/* If this is the last command in a series, set the proper flag. */
181 	if (last_command)
182 		cmd->cmd_flags |= ICE_AQC_NVM_LAST_CMD;
183 	cmd->module_typeid = CPU_TO_LE16(module_typeid);
184 	cmd->offset_low = CPU_TO_LE16(offset & 0xFFFF);
185 	cmd->offset_high = (offset >> 16) & 0xFF;
186 	cmd->length = CPU_TO_LE16(length);
187 
188 	desc.flags |= CPU_TO_LE16(ICE_AQ_FLAG_RD);
189 
190 	return ice_aq_send_cmd(hw, &desc, data, length, cd);
191 }
192 
193 /**
194  * ice_aq_erase_nvm
195  * @hw: pointer to the HW struct
196  * @module_typeid: module pointer location in words from the NVM beginning
197  * @cd: pointer to command details structure or NULL
198  *
199  * Erase the NVM sector using the admin queue commands (0x0702)
200  */
201 enum ice_status
202 ice_aq_erase_nvm(struct ice_hw *hw, u16 module_typeid, struct ice_sq_cd *cd)
203 {
204 	struct ice_aq_desc desc;
205 	struct ice_aqc_nvm *cmd;
206 	enum ice_status status;
207 	__le16 len;
208 
209 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
210 
211 	/* read a length value from SR, so module_typeid is equal to 0 */
212 	/* calculate offset where module size is placed from bytes to words */
213 	/* set last command and read from SR values to true */
214 	status = ice_aq_read_nvm(hw, 0, 2 * module_typeid + 2, 2, &len, true,
215 				 true, NULL);
216 	if (status)
217 		return status;
218 
219 	cmd = &desc.params.nvm;
220 
221 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_erase);
222 
223 	cmd->module_typeid = CPU_TO_LE16(module_typeid);
224 	cmd->length = len;
225 	cmd->offset_low = 0;
226 	cmd->offset_high = 0;
227 
228 	return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
229 }
230 
231 /**
232  * ice_aq_read_nvm_cfg - read an NVM config block
233  * @hw: pointer to the HW struct
234  * @cmd_flags: NVM access admin command bits
235  * @field_id: field or feature ID
236  * @data: buffer for result
237  * @buf_size: buffer size
238  * @elem_count: pointer to count of elements read by FW
239  * @cd: pointer to command details structure or NULL
240  *
241  * Reads single or multiple feature/field ID and data (0x0704)
242  */
243 enum ice_status
244 ice_aq_read_nvm_cfg(struct ice_hw *hw, u8 cmd_flags, u16 field_id, void *data,
245 		    u16 buf_size, u16 *elem_count, struct ice_sq_cd *cd)
246 {
247 	struct ice_aqc_nvm_cfg *cmd;
248 	struct ice_aq_desc desc;
249 	enum ice_status status;
250 
251 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
252 
253 	cmd = &desc.params.nvm_cfg;
254 
255 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_cfg_read);
256 
257 	cmd->cmd_flags = cmd_flags;
258 	cmd->id = CPU_TO_LE16(field_id);
259 
260 	status = ice_aq_send_cmd(hw, &desc, data, buf_size, cd);
261 	if (!status && elem_count)
262 		*elem_count = LE16_TO_CPU(cmd->count);
263 
264 	return status;
265 }
266 
267 /**
268  * ice_aq_write_nvm_cfg - write an NVM config block
269  * @hw: pointer to the HW struct
270  * @cmd_flags: NVM access admin command bits
271  * @data: buffer for result
272  * @buf_size: buffer size
273  * @elem_count: count of elements to be written
274  * @cd: pointer to command details structure or NULL
275  *
276  * Writes single or multiple feature/field ID and data (0x0705)
277  */
278 enum ice_status
279 ice_aq_write_nvm_cfg(struct ice_hw *hw, u8 cmd_flags, void *data, u16 buf_size,
280 		     u16 elem_count, struct ice_sq_cd *cd)
281 {
282 	struct ice_aqc_nvm_cfg *cmd;
283 	struct ice_aq_desc desc;
284 
285 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
286 
287 	cmd = &desc.params.nvm_cfg;
288 
289 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_cfg_write);
290 	desc.flags |= CPU_TO_LE16(ICE_AQ_FLAG_RD);
291 
292 	cmd->count = CPU_TO_LE16(elem_count);
293 	cmd->cmd_flags = cmd_flags;
294 
295 	return ice_aq_send_cmd(hw, &desc, data, buf_size, cd);
296 }
297 
298 /**
299  * ice_check_sr_access_params - verify params for Shadow RAM R/W operations.
300  * @hw: pointer to the HW structure
301  * @offset: offset in words from module start
302  * @words: number of words to access
303  */
304 static enum ice_status
305 ice_check_sr_access_params(struct ice_hw *hw, u32 offset, u16 words)
306 {
307 	if ((offset + words) > hw->flash.sr_words) {
308 		ice_debug(hw, ICE_DBG_NVM, "NVM error: offset beyond SR lmt.\n");
309 		return ICE_ERR_PARAM;
310 	}
311 
312 	if (words > ICE_SR_SECTOR_SIZE_IN_WORDS) {
313 		/* We can access only up to 4KB (one sector), in one AQ write */
314 		ice_debug(hw, ICE_DBG_NVM, "NVM error: tried to access %d words, limit is %d.\n",
315 			  words, ICE_SR_SECTOR_SIZE_IN_WORDS);
316 		return ICE_ERR_PARAM;
317 	}
318 
319 	if (((offset + (words - 1)) / ICE_SR_SECTOR_SIZE_IN_WORDS) !=
320 	    (offset / ICE_SR_SECTOR_SIZE_IN_WORDS)) {
321 		/* A single access cannot spread over two sectors */
322 		ice_debug(hw, ICE_DBG_NVM, "NVM error: cannot spread over two sectors.\n");
323 		return ICE_ERR_PARAM;
324 	}
325 
326 	return ICE_SUCCESS;
327 }
328 
329 /**
330  * ice_read_sr_word_aq - Reads Shadow RAM via AQ
331  * @hw: pointer to the HW structure
332  * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
333  * @data: word read from the Shadow RAM
334  *
335  * Reads one 16 bit word from the Shadow RAM using ice_read_flat_nvm.
336  */
337 enum ice_status ice_read_sr_word_aq(struct ice_hw *hw, u16 offset, u16 *data)
338 {
339 	u32 bytes = sizeof(u16);
340 	enum ice_status status;
341 	__le16 data_local;
342 
343 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
344 
345 	/* Note that ice_read_flat_nvm checks if the read is past the Shadow
346 	 * RAM size, and ensures we don't read across a Shadow RAM sector
347 	 * boundary
348 	 */
349 	status = ice_read_flat_nvm(hw, offset * sizeof(u16), &bytes,
350 				   (_FORCE_ u8 *)&data_local, true);
351 	if (status)
352 		return status;
353 
354 	*data = LE16_TO_CPU(data_local);
355 	return ICE_SUCCESS;
356 }
357 
358 /**
359  * ice_write_sr_aq - Writes Shadow RAM.
360  * @hw: pointer to the HW structure
361  * @offset: offset in words from module start
362  * @words: number of words to write
363  * @data: buffer with words to write to the Shadow RAM
364  * @last_command: tells the AdminQ that this is the last command
365  *
366  * Writes a 16 bit words buffer to the Shadow RAM using the admin command.
367  */
368 static enum ice_status
369 ice_write_sr_aq(struct ice_hw *hw, u32 offset, u16 words, __le16 *data,
370 		bool last_command)
371 {
372 	enum ice_status status;
373 
374 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
375 
376 	status = ice_check_sr_access_params(hw, offset, words);
377 	if (!status)
378 		status = ice_aq_update_nvm(hw, 0, 2 * offset, 2 * words, data,
379 					   last_command, 0, NULL);
380 
381 	return status;
382 }
383 
384 /**
385  * ice_read_sr_buf_aq - Reads Shadow RAM buf via AQ
386  * @hw: pointer to the HW structure
387  * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
388  * @words: (in) number of words to read; (out) number of words actually read
389  * @data: words read from the Shadow RAM
390  *
391  * Reads 16 bit words (data buf) from the Shadow RAM. Ownership of the NVM is
392  * taken before reading the buffer and later released.
393  */
394 static enum ice_status
395 ice_read_sr_buf_aq(struct ice_hw *hw, u16 offset, u16 *words, u16 *data)
396 {
397 	u32 bytes = *words * 2, i;
398 	enum ice_status status;
399 
400 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
401 
402 	/* ice_read_flat_nvm takes into account the 4KB AdminQ and Shadow RAM
403 	 * sector restrictions necessary when reading from the NVM.
404 	 */
405 	status = ice_read_flat_nvm(hw, offset * 2, &bytes, (u8 *)data, true);
406 
407 	/* Report the number of words successfully read */
408 	*words = (u16)(bytes / 2);
409 
410 	/* Byte swap the words up to the amount we actually read */
411 	for (i = 0; i < *words; i++)
412 		data[i] = LE16_TO_CPU(((_FORCE_ __le16 *)data)[i]);
413 
414 	return status;
415 }
416 
417 /**
418  * ice_acquire_nvm - Generic request for acquiring the NVM ownership
419  * @hw: pointer to the HW structure
420  * @access: NVM access type (read or write)
421  *
422  * This function will request NVM ownership.
423  */
424 enum ice_status
425 ice_acquire_nvm(struct ice_hw *hw, enum ice_aq_res_access_type access)
426 {
427 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
428 
429 	if (hw->flash.blank_nvm_mode)
430 		return ICE_SUCCESS;
431 
432 	return ice_acquire_res(hw, ICE_NVM_RES_ID, access, ICE_NVM_TIMEOUT);
433 }
434 
435 /**
436  * ice_release_nvm - Generic request for releasing the NVM ownership
437  * @hw: pointer to the HW structure
438  *
439  * This function will release NVM ownership.
440  */
441 void ice_release_nvm(struct ice_hw *hw)
442 {
443 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
444 
445 	if (hw->flash.blank_nvm_mode)
446 		return;
447 
448 	ice_release_res(hw, ICE_NVM_RES_ID);
449 }
450 
451 /**
452  * ice_get_flash_bank_offset - Get offset into requested flash bank
453  * @hw: pointer to the HW structure
454  * @bank: whether to read from the active or inactive flash bank
455  * @module: the module to read from
456  *
457  * Based on the module, lookup the module offset from the beginning of the
458  * flash.
459  *
460  * Returns the flash offset. Note that a value of zero is invalid and must be
461  * treated as an error.
462  */
463 static u32 ice_get_flash_bank_offset(struct ice_hw *hw, enum ice_bank_select bank, u16 module)
464 {
465 	struct ice_bank_info *banks = &hw->flash.banks;
466 	enum ice_flash_bank active_bank;
467 	bool second_bank_active;
468 	u32 offset, size;
469 
470 	switch (module) {
471 	case ICE_SR_1ST_NVM_BANK_PTR:
472 		offset = banks->nvm_ptr;
473 		size = banks->nvm_size;
474 		active_bank = banks->nvm_bank;
475 		break;
476 	case ICE_SR_1ST_OROM_BANK_PTR:
477 		offset = banks->orom_ptr;
478 		size = banks->orom_size;
479 		active_bank = banks->orom_bank;
480 		break;
481 	case ICE_SR_NETLIST_BANK_PTR:
482 		offset = banks->netlist_ptr;
483 		size = banks->netlist_size;
484 		active_bank = banks->netlist_bank;
485 		break;
486 	default:
487 		ice_debug(hw, ICE_DBG_NVM, "Unexpected value for flash module: 0x%04x\n", module);
488 		return 0;
489 	}
490 
491 	switch (active_bank) {
492 	case ICE_1ST_FLASH_BANK:
493 		second_bank_active = false;
494 		break;
495 	case ICE_2ND_FLASH_BANK:
496 		second_bank_active = true;
497 		break;
498 	default:
499 		ice_debug(hw, ICE_DBG_NVM, "Unexpected value for active flash bank: %u\n",
500 			  active_bank);
501 		return 0;
502 	}
503 
504 	/* The second flash bank is stored immediately following the first
505 	 * bank. Based on whether the 1st or 2nd bank is active, and whether
506 	 * we want the active or inactive bank, calculate the desired offset.
507 	 */
508 	switch (bank) {
509 	case ICE_ACTIVE_FLASH_BANK:
510 		return offset + (second_bank_active ? size : 0);
511 	case ICE_INACTIVE_FLASH_BANK:
512 		return offset + (second_bank_active ? 0 : size);
513 	}
514 
515 	ice_debug(hw, ICE_DBG_NVM, "Unexpected value for flash bank selection: %u\n", bank);
516 	return 0;
517 }
518 
519 /**
520  * ice_read_flash_module - Read a word from one of the main NVM modules
521  * @hw: pointer to the HW structure
522  * @bank: which bank of the module to read
523  * @module: the module to read
524  * @offset: the offset into the module in bytes
525  * @data: storage for the word read from the flash
526  * @length: bytes of data to read
527  *
528  * Read data from the specified flash module. The bank parameter indicates
529  * whether or not to read from the active bank or the inactive bank of that
530  * module.
531  *
532  * The word will be read using flat NVM access, and relies on the
533  * hw->flash.banks data being setup by ice_determine_active_flash_banks()
534  * during initialization.
535  */
536 static enum ice_status
537 ice_read_flash_module(struct ice_hw *hw, enum ice_bank_select bank, u16 module,
538 		      u32 offset, u8 *data, u32 length)
539 {
540 	enum ice_status status;
541 	u32 start;
542 
543 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
544 
545 	start = ice_get_flash_bank_offset(hw, bank, module);
546 	if (!start) {
547 		ice_debug(hw, ICE_DBG_NVM, "Unable to calculate flash bank offset for module 0x%04x\n",
548 			  module);
549 		return ICE_ERR_PARAM;
550 	}
551 
552 	status = ice_acquire_nvm(hw, ICE_RES_READ);
553 	if (status)
554 		return status;
555 
556 	status = ice_read_flat_nvm(hw, start + offset, &length, data, false);
557 
558 	ice_release_nvm(hw);
559 
560 	return status;
561 }
562 
563 /**
564  * ice_read_nvm_module - Read from the active main NVM module
565  * @hw: pointer to the HW structure
566  * @bank: whether to read from active or inactive NVM module
567  * @offset: offset into the NVM module to read, in words
568  * @data: storage for returned word value
569  *
570  * Read the specified word from the active NVM module. This includes the CSS
571  * header at the start of the NVM module.
572  */
573 static enum ice_status
574 ice_read_nvm_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
575 {
576 	enum ice_status status;
577 	__le16 data_local;
578 
579 	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_NVM_BANK_PTR, offset * sizeof(u16),
580 				       (_FORCE_ u8 *)&data_local, sizeof(u16));
581 	if (!status)
582 		*data = LE16_TO_CPU(data_local);
583 
584 	return status;
585 }
586 
587 /**
588  * ice_get_nvm_css_hdr_len - Read the CSS header length from the NVM CSS header
589  * @hw: pointer to the HW struct
590  * @bank: whether to read from the active or inactive flash bank
591  * @hdr_len: storage for header length in words
592  *
593  * Read the CSS header length from the NVM CSS header and add the Authentication
594  * header size, and then convert to words.
595  */
596 static enum ice_status
597 ice_get_nvm_css_hdr_len(struct ice_hw *hw, enum ice_bank_select bank,
598 			u32 *hdr_len)
599 {
600 	u16 hdr_len_l, hdr_len_h;
601 	enum ice_status status;
602 	u32 hdr_len_dword;
603 
604 	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_L,
605 				     &hdr_len_l);
606 	if (status)
607 		return status;
608 
609 	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_H,
610 				     &hdr_len_h);
611 	if (status)
612 		return status;
613 
614 	/* CSS header length is in DWORD, so convert to words and add
615 	 * authentication header size
616 	 */
617 	hdr_len_dword = hdr_len_h << 16 | hdr_len_l;
618 	*hdr_len = (hdr_len_dword * 2) + ICE_NVM_AUTH_HEADER_LEN;
619 
620 	return ICE_SUCCESS;
621 }
622 
623 /**
624  * ice_read_nvm_sr_copy - Read a word from the Shadow RAM copy in the NVM bank
625  * @hw: pointer to the HW structure
626  * @bank: whether to read from the active or inactive NVM module
627  * @offset: offset into the Shadow RAM copy to read, in words
628  * @data: storage for returned word value
629  *
630  * Read the specified word from the copy of the Shadow RAM found in the
631  * specified NVM module.
632  */
633 static enum ice_status
634 ice_read_nvm_sr_copy(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
635 {
636 	enum ice_status status;
637 	u32 hdr_len;
638 
639 	status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len);
640 	if (status)
641 		return status;
642 
643 	hdr_len = ROUND_UP(hdr_len, 32);
644 
645 	return ice_read_nvm_module(hw, bank, hdr_len + offset, data);
646 }
647 
648 /**
649  * ice_read_orom_module - Read from the active Option ROM module
650  * @hw: pointer to the HW structure
651  * @bank: whether to read from active or inactive OROM module
652  * @offset: offset into the OROM module to read, in words
653  * @data: storage for returned word value
654  *
655  * Read the specified word from the active Option ROM module of the flash.
656  * Note that unlike the NVM module, the CSS data is stored at the end of the
657  * module instead of at the beginning.
658  */
659 static enum ice_status
660 ice_read_orom_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
661 {
662 	enum ice_status status;
663 	__le16 data_local;
664 
665 	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR, offset * sizeof(u16),
666 				       (_FORCE_ u8 *)&data_local, sizeof(u16));
667 	if (!status)
668 		*data = LE16_TO_CPU(data_local);
669 
670 	return status;
671 }
672 
673 /**
674  * ice_read_netlist_module - Read data from the netlist module area
675  * @hw: pointer to the HW structure
676  * @bank: whether to read from the active or inactive module
677  * @offset: offset into the netlist to read from
678  * @data: storage for returned word value
679  *
680  * Read a word from the specified netlist bank.
681  */
682 static enum ice_status
683 ice_read_netlist_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
684 {
685 	enum ice_status status;
686 	__le16 data_local;
687 
688 	status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR, offset * sizeof(u16),
689 				       (_FORCE_ u8 *)&data_local, sizeof(u16));
690 	if (!status)
691 		*data = LE16_TO_CPU(data_local);
692 
693 	return status;
694 }
695 
696 /**
697  * ice_read_sr_word - Reads Shadow RAM word and acquire NVM if necessary
698  * @hw: pointer to the HW structure
699  * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
700  * @data: word read from the Shadow RAM
701  *
702  * Reads one 16 bit word from the Shadow RAM using the ice_read_sr_word_aq.
703  */
704 enum ice_status ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
705 {
706 	enum ice_status status;
707 
708 	status = ice_acquire_nvm(hw, ICE_RES_READ);
709 	if (!status) {
710 		status = ice_read_sr_word_aq(hw, offset, data);
711 		ice_release_nvm(hw);
712 	}
713 
714 	return status;
715 }
716 
717 /**
718  * ice_get_pfa_module_tlv - Reads sub module TLV from NVM PFA
719  * @hw: pointer to hardware structure
720  * @module_tlv: pointer to module TLV to return
721  * @module_tlv_len: pointer to module TLV length to return
722  * @module_type: module type requested
723  *
724  * Finds the requested sub module TLV type from the Preserved Field
725  * Area (PFA) and returns the TLV pointer and length. The caller can
726  * use these to read the variable length TLV value.
727  */
728 enum ice_status
729 ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
730 		       u16 module_type)
731 {
732 	enum ice_status status;
733 	u16 pfa_len, pfa_ptr;
734 	u16 next_tlv;
735 
736 	status = ice_read_sr_word(hw, ICE_SR_PFA_PTR, &pfa_ptr);
737 	if (status != ICE_SUCCESS) {
738 		ice_debug(hw, ICE_DBG_INIT, "Preserved Field Array pointer.\n");
739 		return status;
740 	}
741 	status = ice_read_sr_word(hw, pfa_ptr, &pfa_len);
742 	if (status != ICE_SUCCESS) {
743 		ice_debug(hw, ICE_DBG_INIT, "Failed to read PFA length.\n");
744 		return status;
745 	}
746 	/* Starting with first TLV after PFA length, iterate through the list
747 	 * of TLVs to find the requested one.
748 	 */
749 	next_tlv = pfa_ptr + 1;
750 	while (next_tlv < pfa_ptr + pfa_len) {
751 		u16 tlv_sub_module_type;
752 		u16 tlv_len;
753 
754 		/* Read TLV type */
755 		status = ice_read_sr_word(hw, next_tlv, &tlv_sub_module_type);
756 		if (status != ICE_SUCCESS) {
757 			ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV type.\n");
758 			break;
759 		}
760 		/* Read TLV length */
761 		status = ice_read_sr_word(hw, next_tlv + 1, &tlv_len);
762 		if (status != ICE_SUCCESS) {
763 			ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV length.\n");
764 			break;
765 		}
766 		if (tlv_sub_module_type == module_type) {
767 			if (tlv_len) {
768 				*module_tlv = next_tlv;
769 				*module_tlv_len = tlv_len;
770 				return ICE_SUCCESS;
771 			}
772 			return ICE_ERR_INVAL_SIZE;
773 		}
774 		/* Check next TLV, i.e. current TLV pointer + length + 2 words
775 		 * (for current TLV's type and length)
776 		 */
777 		next_tlv = next_tlv + tlv_len + 2;
778 	}
779 	/* Module does not exist */
780 	return ICE_ERR_DOES_NOT_EXIST;
781 }
782 
783 /**
784  * ice_read_pba_string - Reads part number string from NVM
785  * @hw: pointer to hardware structure
786  * @pba_num: stores the part number string from the NVM
787  * @pba_num_size: part number string buffer length
788  *
789  * Reads the part number string from the NVM.
790  */
791 enum ice_status
792 ice_read_pba_string(struct ice_hw *hw, u8 *pba_num, u32 pba_num_size)
793 {
794 	u16 pba_tlv, pba_tlv_len;
795 	enum ice_status status;
796 	u16 pba_word, pba_size;
797 	u16 i;
798 
799 	status = ice_get_pfa_module_tlv(hw, &pba_tlv, &pba_tlv_len,
800 					ICE_SR_PBA_BLOCK_PTR);
801 	if (status != ICE_SUCCESS) {
802 		ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Block TLV.\n");
803 		return status;
804 	}
805 
806 	/* pba_size is the next word */
807 	status = ice_read_sr_word(hw, (pba_tlv + 2), &pba_size);
808 	if (status != ICE_SUCCESS) {
809 		ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Section size.\n");
810 		return status;
811 	}
812 
813 	if (pba_tlv_len < pba_size) {
814 		ice_debug(hw, ICE_DBG_INIT, "Invalid PBA Block TLV size.\n");
815 		return ICE_ERR_INVAL_SIZE;
816 	}
817 
818 	/* Subtract one to get PBA word count (PBA Size word is included in
819 	 * total size)
820 	 */
821 	pba_size--;
822 	if (pba_num_size < (((u32)pba_size * 2) + 1)) {
823 		ice_debug(hw, ICE_DBG_INIT, "Buffer too small for PBA data.\n");
824 		return ICE_ERR_PARAM;
825 	}
826 
827 	for (i = 0; i < pba_size; i++) {
828 		status = ice_read_sr_word(hw, (pba_tlv + 2 + 1) + i, &pba_word);
829 		if (status != ICE_SUCCESS) {
830 			ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Block word %d.\n", i);
831 			return status;
832 		}
833 
834 		pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
835 		pba_num[(i * 2) + 1] = pba_word & 0xFF;
836 	}
837 	pba_num[(pba_size * 2)] = '\0';
838 
839 	return status;
840 }
841 
842 /**
843  * ice_get_nvm_srev - Read the security revision from the NVM CSS header
844  * @hw: pointer to the HW struct
845  * @bank: whether to read from the active or inactive flash bank
846  * @srev: storage for security revision
847  *
848  * Read the security revision out of the CSS header of the active NVM module
849  * bank.
850  */
851 static enum ice_status ice_get_nvm_srev(struct ice_hw *hw, enum ice_bank_select bank, u32 *srev)
852 {
853 	enum ice_status status;
854 	u16 srev_l, srev_h;
855 
856 	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_SREV_L, &srev_l);
857 	if (status)
858 		return status;
859 
860 	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_SREV_H, &srev_h);
861 	if (status)
862 		return status;
863 
864 	*srev = srev_h << 16 | srev_l;
865 
866 	return ICE_SUCCESS;
867 }
868 
869 /**
870  * ice_get_nvm_ver_info - Read NVM version information
871  * @hw: pointer to the HW struct
872  * @bank: whether to read from the active or inactive flash bank
873  * @nvm: pointer to NVM info structure
874  *
875  * Read the NVM EETRACK ID and map version of the main NVM image bank, filling
876  * in the nvm info structure.
877  */
878 static enum ice_status
879 ice_get_nvm_ver_info(struct ice_hw *hw, enum ice_bank_select bank, struct ice_nvm_info *nvm)
880 {
881 	u16 eetrack_lo, eetrack_hi, ver;
882 	enum ice_status status;
883 
884 	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_DEV_STARTER_VER, &ver);
885 	if (status) {
886 		ice_debug(hw, ICE_DBG_NVM, "Failed to read DEV starter version.\n");
887 		return status;
888 	}
889 
890 	nvm->major = (ver & ICE_NVM_VER_HI_MASK) >> ICE_NVM_VER_HI_SHIFT;
891 	nvm->minor = (ver & ICE_NVM_VER_LO_MASK) >> ICE_NVM_VER_LO_SHIFT;
892 
893 	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_LO, &eetrack_lo);
894 	if (status) {
895 		ice_debug(hw, ICE_DBG_NVM, "Failed to read EETRACK lo.\n");
896 		return status;
897 	}
898 	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_HI, &eetrack_hi);
899 	if (status) {
900 		ice_debug(hw, ICE_DBG_NVM, "Failed to read EETRACK hi.\n");
901 		return status;
902 	}
903 
904 	nvm->eetrack = (eetrack_hi << 16) | eetrack_lo;
905 
906 	status = ice_get_nvm_srev(hw, bank, &nvm->srev);
907 	if (status)
908 		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM security revision.\n");
909 
910 	return ICE_SUCCESS;
911 }
912 
913 /**
914  * ice_get_inactive_nvm_ver - Read Option ROM version from the inactive bank
915  * @hw: pointer to the HW structure
916  * @nvm: storage for Option ROM version information
917  *
918  * Reads the NVM EETRACK ID, Map version, and security revision of the
919  * inactive NVM bank. Used to access version data for a pending update that
920  * has not yet been activated.
921  */
922 enum ice_status ice_get_inactive_nvm_ver(struct ice_hw *hw, struct ice_nvm_info *nvm)
923 {
924 	return ice_get_nvm_ver_info(hw, ICE_INACTIVE_FLASH_BANK, nvm);
925 }
926 
927 /**
928  * ice_get_orom_srev - Read the security revision from the OROM CSS header
929  * @hw: pointer to the HW struct
930  * @bank: whether to read from active or inactive flash module
931  * @srev: storage for security revision
932  *
933  * Read the security revision out of the CSS header of the active OROM module
934  * bank.
935  */
936 static enum ice_status ice_get_orom_srev(struct ice_hw *hw, enum ice_bank_select bank, u32 *srev)
937 {
938 	u32 orom_size_word = hw->flash.banks.orom_size / 2;
939 	enum ice_status status;
940 	u16 srev_l, srev_h;
941 	u32 css_start;
942 	u32 hdr_len;
943 
944 	status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len);
945 	if (status)
946 		return status;
947 
948 	if (orom_size_word < hdr_len) {
949 		ice_debug(hw, ICE_DBG_NVM, "Unexpected Option ROM Size of %u\n",
950 			  hw->flash.banks.orom_size);
951 		return ICE_ERR_CFG;
952 	}
953 
954 	/* calculate how far into the Option ROM the CSS header starts. Note
955 	 * that ice_read_orom_module takes a word offset
956 	 */
957 	css_start = orom_size_word - hdr_len;
958 	status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_L, &srev_l);
959 	if (status)
960 		return status;
961 
962 	status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_H, &srev_h);
963 	if (status)
964 		return status;
965 
966 	*srev = srev_h << 16 | srev_l;
967 
968 	return ICE_SUCCESS;
969 }
970 
971 /**
972  * ice_get_orom_civd_data - Get the combo version information from Option ROM
973  * @hw: pointer to the HW struct
974  * @bank: whether to read from the active or inactive flash module
975  * @civd: storage for the Option ROM CIVD data.
976  *
977  * Searches through the Option ROM flash contents to locate the CIVD data for
978  * the image.
979  */
980 static enum ice_status
981 ice_get_orom_civd_data(struct ice_hw *hw, enum ice_bank_select bank,
982 		       struct ice_orom_civd_info *civd)
983 {
984 	u8 *orom_data;
985 	enum ice_status status;
986 	u32 offset;
987 
988 	/* The CIVD section is located in the Option ROM aligned to 512 bytes.
989 	 * The first 4 bytes must contain the ASCII characters "$CIV".
990 	 * A simple modulo 256 sum of all of the bytes of the structure must
991 	 * equal 0.
992 	 *
993 	 * The exact location is unknown and varies between images but is
994 	 * usually somewhere in the middle of the bank. We need to scan the
995 	 * Option ROM bank to locate it.
996 	 *
997 	 * It's significantly faster to read the entire Option ROM up front
998 	 * using the maximum page size, than to read each possible location
999 	 * with a separate firmware command.
1000 	 */
1001 	orom_data = (u8 *)ice_calloc(hw, hw->flash.banks.orom_size, sizeof(u8));
1002 	if (!orom_data)
1003 		return ICE_ERR_NO_MEMORY;
1004 
1005 	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR, 0,
1006 				       orom_data, hw->flash.banks.orom_size);
1007 	if (status) {
1008 		ice_debug(hw, ICE_DBG_NVM, "Unable to read Option ROM data\n");
1009 		return status;
1010 	}
1011 
1012 	/* Scan the memory buffer to locate the CIVD data section */
1013 	for (offset = 0; (offset + 512) <= hw->flash.banks.orom_size; offset += 512) {
1014 		struct ice_orom_civd_info *tmp;
1015 		u8 sum = 0, i;
1016 
1017 		tmp = (struct ice_orom_civd_info *)&orom_data[offset];
1018 
1019 		/* Skip forward until we find a matching signature */
1020 		if (memcmp("$CIV", tmp->signature, sizeof(tmp->signature)) != 0)
1021 			continue;
1022 
1023 		ice_debug(hw, ICE_DBG_NVM, "Found CIVD section at offset %u\n",
1024 			  offset);
1025 
1026 		/* Verify that the simple checksum is zero */
1027 		for (i = 0; i < sizeof(*tmp); i++)
1028 			sum += ((u8 *)tmp)[i];
1029 
1030 		if (sum) {
1031 			ice_debug(hw, ICE_DBG_NVM, "Found CIVD data with invalid checksum of %u\n",
1032 				  sum);
1033 			goto err_invalid_checksum;
1034 		}
1035 
1036 		*civd = *tmp;
1037 		ice_free(hw, orom_data);
1038 		return ICE_SUCCESS;
1039 	}
1040 
1041 	ice_debug(hw, ICE_DBG_NVM, "Unable to locate CIVD data within the Option ROM\n");
1042 
1043 err_invalid_checksum:
1044 	ice_free(hw, orom_data);
1045 	return ICE_ERR_NVM;
1046 }
1047 
1048 /**
1049  * ice_get_orom_ver_info - Read Option ROM version information
1050  * @hw: pointer to the HW struct
1051  * @bank: whether to read from the active or inactive flash module
1052  * @orom: pointer to Option ROM info structure
1053  *
1054  * Read Option ROM version and security revision from the Option ROM flash
1055  * section.
1056  */
1057 static enum ice_status
1058 ice_get_orom_ver_info(struct ice_hw *hw, enum ice_bank_select bank, struct ice_orom_info *orom)
1059 {
1060 	struct ice_orom_civd_info civd;
1061 	enum ice_status status;
1062 	u32 combo_ver;
1063 
1064 	status = ice_get_orom_civd_data(hw, bank, &civd);
1065 	if (status) {
1066 		ice_debug(hw, ICE_DBG_NVM, "Failed to locate valid Option ROM CIVD data\n");
1067 		return status;
1068 	}
1069 
1070 	combo_ver = LE32_TO_CPU(civd.combo_ver);
1071 
1072 	orom->major = (u8)((combo_ver & ICE_OROM_VER_MASK) >> ICE_OROM_VER_SHIFT);
1073 	orom->patch = (u8)(combo_ver & ICE_OROM_VER_PATCH_MASK);
1074 	orom->build = (u16)((combo_ver & ICE_OROM_VER_BUILD_MASK) >> ICE_OROM_VER_BUILD_SHIFT);
1075 
1076 	status = ice_get_orom_srev(hw, bank, &orom->srev);
1077 	if (status) {
1078 		ice_debug(hw, ICE_DBG_NVM, "Failed to read Option ROM security revision.\n");
1079 		return status;
1080 	}
1081 
1082 	return ICE_SUCCESS;
1083 }
1084 
1085 /**
1086  * ice_get_inactive_orom_ver - Read Option ROM version from the inactive bank
1087  * @hw: pointer to the HW structure
1088  * @orom: storage for Option ROM version information
1089  *
1090  * Reads the Option ROM version and security revision data for the inactive
1091  * section of flash. Used to access version data for a pending update that has
1092  * not yet been activated.
1093  */
1094 enum ice_status ice_get_inactive_orom_ver(struct ice_hw *hw, struct ice_orom_info *orom)
1095 {
1096 	return ice_get_orom_ver_info(hw, ICE_INACTIVE_FLASH_BANK, orom);
1097 }
1098 
1099 /**
1100  * ice_get_netlist_info
1101  * @hw: pointer to the HW struct
1102  * @bank: whether to read from the active or inactive flash bank
1103  * @netlist: pointer to netlist version info structure
1104  *
1105  * Get the netlist version information from the requested bank. Reads the Link
1106  * Topology section to find the Netlist ID block and extract the relevant
1107  * information into the netlist version structure.
1108  */
1109 static enum ice_status
1110 ice_get_netlist_info(struct ice_hw *hw, enum ice_bank_select bank,
1111 		     struct ice_netlist_info *netlist)
1112 {
1113 	u16 module_id, length, node_count, i;
1114 	enum ice_status status;
1115 	u16 *id_blk;
1116 
1117 	status = ice_read_netlist_module(hw, bank, ICE_NETLIST_TYPE_OFFSET, &module_id);
1118 	if (status)
1119 		return status;
1120 
1121 	if (module_id != ICE_NETLIST_LINK_TOPO_MOD_ID) {
1122 		ice_debug(hw, ICE_DBG_NVM, "Expected netlist module_id ID of 0x%04x, but got 0x%04x\n",
1123 			  ICE_NETLIST_LINK_TOPO_MOD_ID, module_id);
1124 		return ICE_ERR_NVM;
1125 	}
1126 
1127 	status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_MODULE_LEN, &length);
1128 	if (status)
1129 		return status;
1130 
1131 	/* sanity check that we have at least enough words to store the netlist ID block */
1132 	if (length < ICE_NETLIST_ID_BLK_SIZE) {
1133 		ice_debug(hw, ICE_DBG_NVM, "Netlist Link Topology module too small. Expected at least %u words, but got %u words.\n",
1134 			  ICE_NETLIST_ID_BLK_SIZE, length);
1135 		return ICE_ERR_NVM;
1136 	}
1137 
1138 	status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_NODE_COUNT, &node_count);
1139 	if (status)
1140 		return status;
1141 	node_count &= ICE_LINK_TOPO_NODE_COUNT_M;
1142 
1143 	id_blk = (u16 *)ice_calloc(hw, ICE_NETLIST_ID_BLK_SIZE, sizeof(*id_blk));
1144 	if (!id_blk)
1145 		return ICE_ERR_NO_MEMORY;
1146 
1147 	/* Read out the entire Netlist ID Block at once. */
1148 	status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR,
1149 				       ICE_NETLIST_ID_BLK_OFFSET(node_count) * sizeof(u16),
1150 				       (u8 *)id_blk, ICE_NETLIST_ID_BLK_SIZE * sizeof(u16));
1151 	if (status)
1152 		goto exit_error;
1153 
1154 	for (i = 0; i < ICE_NETLIST_ID_BLK_SIZE; i++)
1155 		id_blk[i] = LE16_TO_CPU(((_FORCE_ __le16 *)id_blk)[i]);
1156 
1157 	netlist->major = id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_HIGH] << 16 |
1158 			 id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_LOW];
1159 	netlist->minor = id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_HIGH] << 16 |
1160 			 id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_LOW];
1161 	netlist->type = id_blk[ICE_NETLIST_ID_BLK_TYPE_HIGH] << 16 |
1162 			id_blk[ICE_NETLIST_ID_BLK_TYPE_LOW];
1163 	netlist->rev = id_blk[ICE_NETLIST_ID_BLK_REV_HIGH] << 16 |
1164 		       id_blk[ICE_NETLIST_ID_BLK_REV_LOW];
1165 	netlist->cust_ver = id_blk[ICE_NETLIST_ID_BLK_CUST_VER];
1166 	/* Read the left most 4 bytes of SHA */
1167 	netlist->hash = id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(15)] << 16 |
1168 			id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(14)];
1169 
1170 exit_error:
1171 	ice_free(hw, id_blk);
1172 
1173 	return status;
1174 }
1175 
1176 /**
1177  * ice_get_netlist_ver_info
1178  * @hw: pointer to the HW struct
1179  * @netlist: pointer to netlist version info structure
1180  *
1181  * Get the netlist version information
1182  */
1183 enum ice_status ice_get_netlist_ver_info(struct ice_hw *hw, struct ice_netlist_info *netlist)
1184 {
1185 	return ice_get_netlist_info(hw, ICE_ACTIVE_FLASH_BANK, netlist);
1186 }
1187 
1188 /**
1189  * ice_get_inactive_netlist_ver
1190  * @hw: pointer to the HW struct
1191  * @netlist: pointer to netlist version info structure
1192  *
1193  * Read the netlist version data from the inactive netlist bank. Used to
1194  * extract version data of a pending flash update in order to display the
1195  * version data.
1196  */
1197 enum ice_status ice_get_inactive_netlist_ver(struct ice_hw *hw, struct ice_netlist_info *netlist)
1198 {
1199 	return ice_get_netlist_info(hw, ICE_INACTIVE_FLASH_BANK, netlist);
1200 }
1201 
1202 /**
1203  * ice_discover_flash_size - Discover the available flash size.
1204  * @hw: pointer to the HW struct
1205  *
1206  * The device flash could be up to 16MB in size. However, it is possible that
1207  * the actual size is smaller. Use bisection to determine the accessible size
1208  * of flash memory.
1209  */
1210 static enum ice_status ice_discover_flash_size(struct ice_hw *hw)
1211 {
1212 	u32 min_size = 0, max_size = ICE_AQC_NVM_MAX_OFFSET + 1;
1213 	enum ice_status status;
1214 
1215 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1216 
1217 	status = ice_acquire_nvm(hw, ICE_RES_READ);
1218 	if (status)
1219 		return status;
1220 
1221 	while ((max_size - min_size) > 1) {
1222 		u32 offset = (max_size + min_size) / 2;
1223 		u32 len = 1;
1224 		u8 data;
1225 
1226 		status = ice_read_flat_nvm(hw, offset, &len, &data, false);
1227 		if (status == ICE_ERR_AQ_ERROR &&
1228 		    hw->adminq.sq_last_status == ICE_AQ_RC_EINVAL) {
1229 			ice_debug(hw, ICE_DBG_NVM, "%s: New upper bound of %u bytes\n",
1230 				  __func__, offset);
1231 			status = ICE_SUCCESS;
1232 			max_size = offset;
1233 		} else if (!status) {
1234 			ice_debug(hw, ICE_DBG_NVM, "%s: New lower bound of %u bytes\n",
1235 				  __func__, offset);
1236 			min_size = offset;
1237 		} else {
1238 			/* an unexpected error occurred */
1239 			goto err_read_flat_nvm;
1240 		}
1241 	}
1242 
1243 	ice_debug(hw, ICE_DBG_NVM, "Predicted flash size is %u bytes\n", max_size);
1244 
1245 	hw->flash.flash_size = max_size;
1246 
1247 err_read_flat_nvm:
1248 	ice_release_nvm(hw);
1249 
1250 	return status;
1251 }
1252 
1253 /**
1254  * ice_read_sr_pointer - Read the value of a Shadow RAM pointer word
1255  * @hw: pointer to the HW structure
1256  * @offset: the word offset of the Shadow RAM word to read
1257  * @pointer: pointer value read from Shadow RAM
1258  *
1259  * Read the given Shadow RAM word, and convert it to a pointer value specified
1260  * in bytes. This function assumes the specified offset is a valid pointer
1261  * word.
1262  *
1263  * Each pointer word specifies whether it is stored in word size or 4KB
1264  * sector size by using the highest bit. The reported pointer value will be in
1265  * bytes, intended for flat NVM reads.
1266  */
1267 static enum ice_status
1268 ice_read_sr_pointer(struct ice_hw *hw, u16 offset, u32 *pointer)
1269 {
1270 	enum ice_status status;
1271 	u16 value;
1272 
1273 	status = ice_read_sr_word(hw, offset, &value);
1274 	if (status)
1275 		return status;
1276 
1277 	/* Determine if the pointer is in 4KB or word units */
1278 	if (value & ICE_SR_NVM_PTR_4KB_UNITS)
1279 		*pointer = (value & ~ICE_SR_NVM_PTR_4KB_UNITS) * 4 * 1024;
1280 	else
1281 		*pointer = value * 2;
1282 
1283 	return ICE_SUCCESS;
1284 }
1285 
1286 /**
1287  * ice_read_sr_area_size - Read an area size from a Shadow RAM word
1288  * @hw: pointer to the HW structure
1289  * @offset: the word offset of the Shadow RAM to read
1290  * @size: size value read from the Shadow RAM
1291  *
1292  * Read the given Shadow RAM word, and convert it to an area size value
1293  * specified in bytes. This function assumes the specified offset is a valid
1294  * area size word.
1295  *
1296  * Each area size word is specified in 4KB sector units. This function reports
1297  * the size in bytes, intended for flat NVM reads.
1298  */
1299 static enum ice_status
1300 ice_read_sr_area_size(struct ice_hw *hw, u16 offset, u32 *size)
1301 {
1302 	enum ice_status status;
1303 	u16 value;
1304 
1305 	status = ice_read_sr_word(hw, offset, &value);
1306 	if (status)
1307 		return status;
1308 
1309 	/* Area sizes are always specified in 4KB units */
1310 	*size = value * 4 * 1024;
1311 
1312 	return ICE_SUCCESS;
1313 }
1314 
1315 /**
1316  * ice_determine_active_flash_banks - Discover active bank for each module
1317  * @hw: pointer to the HW struct
1318  *
1319  * Read the Shadow RAM control word and determine which banks are active for
1320  * the NVM, OROM, and Netlist modules. Also read and calculate the associated
1321  * pointer and size. These values are then cached into the ice_flash_info
1322  * structure for later use in order to calculate the correct offset to read
1323  * from the active module.
1324  */
1325 static enum ice_status
1326 ice_determine_active_flash_banks(struct ice_hw *hw)
1327 {
1328 	struct ice_bank_info *banks = &hw->flash.banks;
1329 	enum ice_status status;
1330 	u16 ctrl_word;
1331 
1332 	status = ice_read_sr_word(hw, ICE_SR_NVM_CTRL_WORD, &ctrl_word);
1333 	if (status) {
1334 		ice_debug(hw, ICE_DBG_NVM, "Failed to read the Shadow RAM control word\n");
1335 		return status;
1336 	}
1337 
1338 	/* Check that the control word indicates validity */
1339 	if ((ctrl_word & ICE_SR_CTRL_WORD_1_M) >> ICE_SR_CTRL_WORD_1_S != ICE_SR_CTRL_WORD_VALID) {
1340 		ice_debug(hw, ICE_DBG_NVM, "Shadow RAM control word is invalid\n");
1341 		return ICE_ERR_CFG;
1342 	}
1343 
1344 	if (!(ctrl_word & ICE_SR_CTRL_WORD_NVM_BANK))
1345 		banks->nvm_bank = ICE_1ST_FLASH_BANK;
1346 	else
1347 		banks->nvm_bank = ICE_2ND_FLASH_BANK;
1348 
1349 	if (!(ctrl_word & ICE_SR_CTRL_WORD_OROM_BANK))
1350 		banks->orom_bank = ICE_1ST_FLASH_BANK;
1351 	else
1352 		banks->orom_bank = ICE_2ND_FLASH_BANK;
1353 
1354 	if (!(ctrl_word & ICE_SR_CTRL_WORD_NETLIST_BANK))
1355 		banks->netlist_bank = ICE_1ST_FLASH_BANK;
1356 	else
1357 		banks->netlist_bank = ICE_2ND_FLASH_BANK;
1358 
1359 	status = ice_read_sr_pointer(hw, ICE_SR_1ST_NVM_BANK_PTR, &banks->nvm_ptr);
1360 	if (status) {
1361 		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM bank pointer\n");
1362 		return status;
1363 	}
1364 
1365 	status = ice_read_sr_area_size(hw, ICE_SR_NVM_BANK_SIZE, &banks->nvm_size);
1366 	if (status) {
1367 		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM bank area size\n");
1368 		return status;
1369 	}
1370 
1371 	status = ice_read_sr_pointer(hw, ICE_SR_1ST_OROM_BANK_PTR, &banks->orom_ptr);
1372 	if (status) {
1373 		ice_debug(hw, ICE_DBG_NVM, "Failed to read OROM bank pointer\n");
1374 		return status;
1375 	}
1376 
1377 	status = ice_read_sr_area_size(hw, ICE_SR_OROM_BANK_SIZE, &banks->orom_size);
1378 	if (status) {
1379 		ice_debug(hw, ICE_DBG_NVM, "Failed to read OROM bank area size\n");
1380 		return status;
1381 	}
1382 
1383 	status = ice_read_sr_pointer(hw, ICE_SR_NETLIST_BANK_PTR, &banks->netlist_ptr);
1384 	if (status) {
1385 		ice_debug(hw, ICE_DBG_NVM, "Failed to read Netlist bank pointer\n");
1386 		return status;
1387 	}
1388 
1389 	status = ice_read_sr_area_size(hw, ICE_SR_NETLIST_BANK_SIZE, &banks->netlist_size);
1390 	if (status) {
1391 		ice_debug(hw, ICE_DBG_NVM, "Failed to read Netlist bank area size\n");
1392 		return status;
1393 	}
1394 
1395 	return ICE_SUCCESS;
1396 }
1397 
1398 /**
1399  * ice_init_nvm - initializes NVM setting
1400  * @hw: pointer to the HW struct
1401  *
1402  * This function reads and populates NVM settings such as Shadow RAM size,
1403  * max_timeout, and blank_nvm_mode
1404  */
1405 enum ice_status ice_init_nvm(struct ice_hw *hw)
1406 {
1407 	struct ice_flash_info *flash = &hw->flash;
1408 	enum ice_status status;
1409 	u32 fla, gens_stat;
1410 	u8 sr_size;
1411 
1412 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1413 
1414 	/* The SR size is stored regardless of the NVM programming mode
1415 	 * as the blank mode may be used in the factory line.
1416 	 */
1417 	gens_stat = rd32(hw, GLNVM_GENS);
1418 	sr_size = (gens_stat & GLNVM_GENS_SR_SIZE_M) >> GLNVM_GENS_SR_SIZE_S;
1419 
1420 	/* Switching to words (sr_size contains power of 2) */
1421 	flash->sr_words = BIT(sr_size) * ICE_SR_WORDS_IN_1KB;
1422 
1423 	/* Check if we are in the normal or blank NVM programming mode */
1424 	fla = rd32(hw, GLNVM_FLA);
1425 	if (fla & GLNVM_FLA_LOCKED_M) { /* Normal programming mode */
1426 		flash->blank_nvm_mode = false;
1427 	} else {
1428 		/* Blank programming mode */
1429 		flash->blank_nvm_mode = true;
1430 		ice_debug(hw, ICE_DBG_NVM, "NVM init error: unsupported blank mode.\n");
1431 		return ICE_ERR_NVM_BLANK_MODE;
1432 	}
1433 
1434 	status = ice_discover_flash_size(hw);
1435 	if (status) {
1436 		ice_debug(hw, ICE_DBG_NVM, "NVM init error: failed to discover flash size.\n");
1437 		return status;
1438 	}
1439 
1440 	status = ice_determine_active_flash_banks(hw);
1441 	if (status) {
1442 		ice_debug(hw, ICE_DBG_NVM, "Failed to determine active flash banks.\n");
1443 		return status;
1444 	}
1445 
1446 	status = ice_get_nvm_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->nvm);
1447 	if (status) {
1448 		ice_debug(hw, ICE_DBG_INIT, "Failed to read NVM info.\n");
1449 		return status;
1450 	}
1451 
1452 	status = ice_get_orom_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->orom);
1453 	if (status)
1454 		ice_debug(hw, ICE_DBG_INIT, "Failed to read Option ROM info.\n");
1455 
1456 	/* read the netlist version information */
1457 	status = ice_get_netlist_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->netlist);
1458 	if (status)
1459 		ice_debug(hw, ICE_DBG_INIT, "Failed to read netlist info.\n");
1460 	return ICE_SUCCESS;
1461 }
1462 
1463 /**
1464  * ice_read_sr_buf - Reads Shadow RAM buf and acquire lock if necessary
1465  * @hw: pointer to the HW structure
1466  * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
1467  * @words: (in) number of words to read; (out) number of words actually read
1468  * @data: words read from the Shadow RAM
1469  *
1470  * Reads 16 bit words (data buf) from the SR using the ice_read_nvm_buf_aq
1471  * method. The buf read is preceded by the NVM ownership take
1472  * and followed by the release.
1473  */
1474 enum ice_status
1475 ice_read_sr_buf(struct ice_hw *hw, u16 offset, u16 *words, u16 *data)
1476 {
1477 	enum ice_status status;
1478 
1479 	status = ice_acquire_nvm(hw, ICE_RES_READ);
1480 	if (!status) {
1481 		status = ice_read_sr_buf_aq(hw, offset, words, data);
1482 		ice_release_nvm(hw);
1483 	}
1484 
1485 	return status;
1486 }
1487 
1488 /**
1489  * __ice_write_sr_word - Writes Shadow RAM word
1490  * @hw: pointer to the HW structure
1491  * @offset: offset of the Shadow RAM word to write
1492  * @data: word to write to the Shadow RAM
1493  *
1494  * Writes a 16 bit word to the SR using the ice_write_sr_aq method.
1495  * NVM ownership have to be acquired and released (on ARQ completion event
1496  * reception) by caller. To commit SR to NVM update checksum function
1497  * should be called.
1498  */
1499 enum ice_status
1500 __ice_write_sr_word(struct ice_hw *hw, u32 offset, const u16 *data)
1501 {
1502 	__le16 data_local = CPU_TO_LE16(*data);
1503 
1504 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1505 
1506 	/* Value 0x00 below means that we treat SR as a flat mem */
1507 	return ice_write_sr_aq(hw, offset, 1, &data_local, false);
1508 }
1509 
1510 /**
1511  * __ice_write_sr_buf - Writes Shadow RAM buf
1512  * @hw: pointer to the HW structure
1513  * @offset: offset of the Shadow RAM buffer to write
1514  * @words: number of words to write
1515  * @data: words to write to the Shadow RAM
1516  *
1517  * Writes a 16 bit words buffer to the Shadow RAM using the admin command.
1518  * NVM ownership must be acquired before calling this function and released
1519  * on ARQ completion event reception by caller. To commit SR to NVM update
1520  * checksum function should be called.
1521  */
1522 enum ice_status
1523 __ice_write_sr_buf(struct ice_hw *hw, u32 offset, u16 words, const u16 *data)
1524 {
1525 	enum ice_status status;
1526 	__le16 *data_local;
1527 	void *vmem;
1528 	u32 i;
1529 
1530 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1531 
1532 	vmem = ice_calloc(hw, words, sizeof(u16));
1533 	if (!vmem)
1534 		return ICE_ERR_NO_MEMORY;
1535 	data_local = (_FORCE_ __le16 *)vmem;
1536 
1537 	for (i = 0; i < words; i++)
1538 		data_local[i] = CPU_TO_LE16(data[i]);
1539 
1540 	/* Here we will only write one buffer as the size of the modules
1541 	 * mirrored in the Shadow RAM is always less than 4K.
1542 	 */
1543 	status = ice_write_sr_aq(hw, offset, words, data_local, false);
1544 
1545 	ice_free(hw, vmem);
1546 
1547 	return status;
1548 }
1549 
1550 /**
1551  * ice_calc_sr_checksum - Calculates and returns Shadow RAM SW checksum
1552  * @hw: pointer to hardware structure
1553  * @checksum: pointer to the checksum
1554  *
1555  * This function calculates SW Checksum that covers the whole 64kB shadow RAM
1556  * except the VPD and PCIe ALT Auto-load modules. The structure and size of VPD
1557  * is customer specific and unknown. Therefore, this function skips all maximum
1558  * possible size of VPD (1kB).
1559  */
1560 static enum ice_status ice_calc_sr_checksum(struct ice_hw *hw, u16 *checksum)
1561 {
1562 	enum ice_status status = ICE_SUCCESS;
1563 	u16 pcie_alt_module = 0;
1564 	u16 checksum_local = 0;
1565 	u16 vpd_module;
1566 	void *vmem;
1567 	u16 *data;
1568 	u16 i;
1569 
1570 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1571 
1572 	vmem = ice_calloc(hw, ICE_SR_SECTOR_SIZE_IN_WORDS, sizeof(u16));
1573 	if (!vmem)
1574 		return ICE_ERR_NO_MEMORY;
1575 	data = (u16 *)vmem;
1576 
1577 	/* read pointer to VPD area */
1578 	status = ice_read_sr_word_aq(hw, ICE_SR_VPD_PTR, &vpd_module);
1579 	if (status)
1580 		goto ice_calc_sr_checksum_exit;
1581 
1582 	/* read pointer to PCIe Alt Auto-load module */
1583 	status = ice_read_sr_word_aq(hw, ICE_SR_PCIE_ALT_AUTO_LOAD_PTR,
1584 				     &pcie_alt_module);
1585 	if (status)
1586 		goto ice_calc_sr_checksum_exit;
1587 
1588 	/* Calculate SW checksum that covers the whole 64kB shadow RAM
1589 	 * except the VPD and PCIe ALT Auto-load modules
1590 	 */
1591 	for (i = 0; i < hw->flash.sr_words; i++) {
1592 		/* Read SR page */
1593 		if ((i % ICE_SR_SECTOR_SIZE_IN_WORDS) == 0) {
1594 			u16 words = ICE_SR_SECTOR_SIZE_IN_WORDS;
1595 
1596 			status = ice_read_sr_buf_aq(hw, i, &words, data);
1597 			if (status != ICE_SUCCESS)
1598 				goto ice_calc_sr_checksum_exit;
1599 		}
1600 
1601 		/* Skip Checksum word */
1602 		if (i == ICE_SR_SW_CHECKSUM_WORD)
1603 			continue;
1604 		/* Skip VPD module (convert byte size to word count) */
1605 		if (i >= (u32)vpd_module &&
1606 		    i < ((u32)vpd_module + ICE_SR_VPD_SIZE_WORDS))
1607 			continue;
1608 		/* Skip PCIe ALT module (convert byte size to word count) */
1609 		if (i >= (u32)pcie_alt_module &&
1610 		    i < ((u32)pcie_alt_module + ICE_SR_PCIE_ALT_SIZE_WORDS))
1611 			continue;
1612 
1613 		checksum_local += data[i % ICE_SR_SECTOR_SIZE_IN_WORDS];
1614 	}
1615 
1616 	*checksum = (u16)ICE_SR_SW_CHECKSUM_BASE - checksum_local;
1617 
1618 ice_calc_sr_checksum_exit:
1619 	ice_free(hw, vmem);
1620 	return status;
1621 }
1622 
1623 /**
1624  * ice_update_sr_checksum - Updates the Shadow RAM SW checksum
1625  * @hw: pointer to hardware structure
1626  *
1627  * NVM ownership must be acquired before calling this function and released
1628  * on ARQ completion event reception by caller.
1629  * This function will commit SR to NVM.
1630  */
1631 enum ice_status ice_update_sr_checksum(struct ice_hw *hw)
1632 {
1633 	enum ice_status status;
1634 	__le16 le_sum;
1635 	u16 checksum;
1636 
1637 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1638 
1639 	status = ice_calc_sr_checksum(hw, &checksum);
1640 	if (!status) {
1641 		le_sum = CPU_TO_LE16(checksum);
1642 		status = ice_write_sr_aq(hw, ICE_SR_SW_CHECKSUM_WORD, 1,
1643 					 &le_sum, true);
1644 	}
1645 	return status;
1646 }
1647 
1648 /**
1649  * ice_validate_sr_checksum - Validate Shadow RAM SW checksum
1650  * @hw: pointer to hardware structure
1651  * @checksum: calculated checksum
1652  *
1653  * Performs checksum calculation and validates the Shadow RAM SW checksum.
1654  * If the caller does not need checksum, the value can be NULL.
1655  */
1656 enum ice_status ice_validate_sr_checksum(struct ice_hw *hw, u16 *checksum)
1657 {
1658 	enum ice_status status;
1659 	u16 checksum_local;
1660 	u16 checksum_sr;
1661 
1662 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1663 
1664 	status = ice_acquire_nvm(hw, ICE_RES_READ);
1665 	if (!status) {
1666 		status = ice_calc_sr_checksum(hw, &checksum_local);
1667 		ice_release_nvm(hw);
1668 		if (status)
1669 			return status;
1670 	} else {
1671 		return status;
1672 	}
1673 
1674 	ice_read_sr_word(hw, ICE_SR_SW_CHECKSUM_WORD, &checksum_sr);
1675 
1676 	/* Verify read checksum from EEPROM is the same as
1677 	 * calculated checksum
1678 	 */
1679 	if (checksum_local != checksum_sr)
1680 		status = ICE_ERR_NVM_CHECKSUM;
1681 
1682 	/* If the user cares, return the calculated checksum */
1683 	if (checksum)
1684 		*checksum = checksum_local;
1685 
1686 	return status;
1687 }
1688 
1689 /**
1690  * ice_nvm_validate_checksum
1691  * @hw: pointer to the HW struct
1692  *
1693  * Verify NVM PFA checksum validity (0x0706)
1694  */
1695 enum ice_status ice_nvm_validate_checksum(struct ice_hw *hw)
1696 {
1697 	struct ice_aqc_nvm_checksum *cmd;
1698 	struct ice_aq_desc desc;
1699 	enum ice_status status;
1700 
1701 	status = ice_acquire_nvm(hw, ICE_RES_READ);
1702 	if (status)
1703 		return status;
1704 
1705 	cmd = &desc.params.nvm_checksum;
1706 
1707 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_checksum);
1708 	cmd->flags = ICE_AQC_NVM_CHECKSUM_VERIFY;
1709 
1710 	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1711 
1712 	ice_release_nvm(hw);
1713 
1714 	if (!status)
1715 		if (LE16_TO_CPU(cmd->checksum) != ICE_AQC_NVM_CHECKSUM_CORRECT)
1716 			status = ICE_ERR_NVM_CHECKSUM;
1717 
1718 	return status;
1719 }
1720 
1721 /**
1722  * ice_nvm_recalculate_checksum
1723  * @hw: pointer to the HW struct
1724  *
1725  * Recalculate NVM PFA checksum (0x0706)
1726  */
1727 enum ice_status ice_nvm_recalculate_checksum(struct ice_hw *hw)
1728 {
1729 	struct ice_aqc_nvm_checksum *cmd;
1730 	struct ice_aq_desc desc;
1731 	enum ice_status status;
1732 
1733 	status = ice_acquire_nvm(hw, ICE_RES_READ);
1734 	if (status)
1735 		return status;
1736 
1737 	cmd = &desc.params.nvm_checksum;
1738 
1739 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_checksum);
1740 	cmd->flags = ICE_AQC_NVM_CHECKSUM_RECALC;
1741 
1742 	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1743 
1744 	ice_release_nvm(hw);
1745 
1746 	return status;
1747 }
1748 
1749 /**
1750  * ice_nvm_write_activate
1751  * @hw: pointer to the HW struct
1752  * @cmd_flags: flags for write activate command
1753  * @response_flags: response indicators from firmware
1754  *
1755  * Update the control word with the required banks' validity bits
1756  * and dumps the Shadow RAM to flash (0x0707)
1757  *
1758  * cmd_flags controls which banks to activate, the preservation level to use
1759  * when activating the NVM bank, and whether an EMP reset is required for
1760  * activation.
1761  *
1762  * Note that the 16bit cmd_flags value is split between two separate 1 byte
1763  * flag values in the descriptor.
1764  *
1765  * On successful return of the firmware command, the response_flags variable
1766  * is updated with the flags reported by firmware indicating certain status,
1767  * such as whether EMP reset is enabled.
1768  */
1769 enum ice_status
1770 ice_nvm_write_activate(struct ice_hw *hw, u16 cmd_flags, u8 *response_flags)
1771 {
1772 	struct ice_aqc_nvm *cmd;
1773 	struct ice_aq_desc desc;
1774 	enum ice_status status;
1775 
1776 	cmd = &desc.params.nvm;
1777 	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_write_activate);
1778 
1779 	cmd->cmd_flags = ICE_LO_BYTE(cmd_flags);
1780 	cmd->offset_high = ICE_HI_BYTE(cmd_flags);
1781 
1782 	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1783 	if (!status && response_flags)
1784 		*response_flags = cmd->cmd_flags;
1785 
1786 	return status;
1787 }
1788 
1789 /**
1790  * ice_get_nvm_minsrevs - Get the Minimum Security Revision values from flash
1791  * @hw: pointer to the HW struct
1792  * @minsrevs: structure to store NVM and OROM minsrev values
1793  *
1794  * Read the Minimum Security Revision TLV and extract the revision values from
1795  * the flash image into a readable structure for processing.
1796  */
1797 enum ice_status
1798 ice_get_nvm_minsrevs(struct ice_hw *hw, struct ice_minsrev_info *minsrevs)
1799 {
1800 	struct ice_aqc_nvm_minsrev data;
1801 	enum ice_status status;
1802 	u16 valid;
1803 
1804 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1805 
1806 	status = ice_acquire_nvm(hw, ICE_RES_READ);
1807 	if (status)
1808 		return status;
1809 
1810 	status = ice_aq_read_nvm(hw, ICE_AQC_NVM_MINSREV_MOD_ID, 0, sizeof(data),
1811 				 &data, true, false, NULL);
1812 
1813 	ice_release_nvm(hw);
1814 
1815 	if (status)
1816 		return status;
1817 
1818 	valid = LE16_TO_CPU(data.validity);
1819 
1820 	/* Extract NVM minimum security revision */
1821 	if (valid & ICE_AQC_NVM_MINSREV_NVM_VALID) {
1822 		u16 minsrev_l, minsrev_h;
1823 
1824 		minsrev_l = LE16_TO_CPU(data.nvm_minsrev_l);
1825 		minsrev_h = LE16_TO_CPU(data.nvm_minsrev_h);
1826 
1827 		minsrevs->nvm = minsrev_h << 16 | minsrev_l;
1828 		minsrevs->nvm_valid = true;
1829 	}
1830 
1831 	/* Extract the OROM minimum security revision */
1832 	if (valid & ICE_AQC_NVM_MINSREV_OROM_VALID) {
1833 		u16 minsrev_l, minsrev_h;
1834 
1835 		minsrev_l = LE16_TO_CPU(data.orom_minsrev_l);
1836 		minsrev_h = LE16_TO_CPU(data.orom_minsrev_h);
1837 
1838 		minsrevs->orom = minsrev_h << 16 | minsrev_l;
1839 		minsrevs->orom_valid = true;
1840 	}
1841 
1842 	return ICE_SUCCESS;
1843 }
1844 
1845 /**
1846  * ice_update_nvm_minsrevs - Update minimum security revision TLV data in flash
1847  * @hw: pointer to the HW struct
1848  * @minsrevs: minimum security revision information
1849  *
1850  * Update the NVM or Option ROM minimum security revision fields in the PFA
1851  * area of the flash. Reads the minsrevs->nvm_valid and minsrevs->orom_valid
1852  * fields to determine what update is being requested. If the valid bit is not
1853  * set for that module, then the associated minsrev will be left as is.
1854  */
1855 enum ice_status
1856 ice_update_nvm_minsrevs(struct ice_hw *hw, struct ice_minsrev_info *minsrevs)
1857 {
1858 	struct ice_aqc_nvm_minsrev data;
1859 	enum ice_status status;
1860 
1861 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1862 
1863 	if (!minsrevs->nvm_valid && !minsrevs->orom_valid) {
1864 		ice_debug(hw, ICE_DBG_NVM, "At least one of NVM and OROM MinSrev must be valid");
1865 		return ICE_ERR_PARAM;
1866 	}
1867 
1868 	status = ice_acquire_nvm(hw, ICE_RES_WRITE);
1869 	if (status)
1870 		return status;
1871 
1872 	/* Get current data */
1873 	status = ice_aq_read_nvm(hw, ICE_AQC_NVM_MINSREV_MOD_ID, 0, sizeof(data),
1874 				 &data, true, false, NULL);
1875 	if (status)
1876 		goto exit_release_res;
1877 
1878 	if (minsrevs->nvm_valid) {
1879 		data.nvm_minsrev_l = CPU_TO_LE16(minsrevs->nvm & 0xFFFF);
1880 		data.nvm_minsrev_h = CPU_TO_LE16(minsrevs->nvm >> 16);
1881 		data.validity |= CPU_TO_LE16(ICE_AQC_NVM_MINSREV_NVM_VALID);
1882 	}
1883 
1884 	if (minsrevs->orom_valid) {
1885 		data.orom_minsrev_l = CPU_TO_LE16(minsrevs->orom & 0xFFFF);
1886 		data.orom_minsrev_h = CPU_TO_LE16(minsrevs->orom >> 16);
1887 		data.validity |= CPU_TO_LE16(ICE_AQC_NVM_MINSREV_OROM_VALID);
1888 	}
1889 
1890 	/* Update flash data */
1891 	status = ice_aq_update_nvm(hw, ICE_AQC_NVM_MINSREV_MOD_ID, 0, sizeof(data), &data,
1892 				   false, ICE_AQC_NVM_SPECIAL_UPDATE, NULL);
1893 	if (status)
1894 		goto exit_release_res;
1895 
1896 	/* Dump the Shadow RAM to the flash */
1897 	status = ice_nvm_write_activate(hw, 0, NULL);
1898 
1899 exit_release_res:
1900 	ice_release_nvm(hw);
1901 
1902 	return status;
1903 }
1904 
1905 /**
1906  * ice_nvm_access_get_features - Return the NVM access features structure
1907  * @cmd: NVM access command to process
1908  * @data: storage for the driver NVM features
1909  *
1910  * Fill in the data section of the NVM access request with a copy of the NVM
1911  * features structure.
1912  */
1913 enum ice_status
1914 ice_nvm_access_get_features(struct ice_nvm_access_cmd *cmd,
1915 			    union ice_nvm_access_data *data)
1916 {
1917 	/* The provided data_size must be at least as large as our NVM
1918 	 * features structure. A larger size should not be treated as an
1919 	 * error, to allow future extensions to the features structure to
1920 	 * work on older drivers.
1921 	 */
1922 	if (cmd->data_size < sizeof(struct ice_nvm_features))
1923 		return ICE_ERR_NO_MEMORY;
1924 
1925 	/* Initialize the data buffer to zeros */
1926 	ice_memset(data, 0, cmd->data_size, ICE_NONDMA_MEM);
1927 
1928 	/* Fill in the features data */
1929 	data->drv_features.major = ICE_NVM_ACCESS_MAJOR_VER;
1930 	data->drv_features.minor = ICE_NVM_ACCESS_MINOR_VER;
1931 	data->drv_features.size = sizeof(struct ice_nvm_features);
1932 	data->drv_features.features[0] = ICE_NVM_FEATURES_0_REG_ACCESS;
1933 
1934 	return ICE_SUCCESS;
1935 }
1936 
1937 /**
1938  * ice_nvm_access_get_module - Helper function to read module value
1939  * @cmd: NVM access command structure
1940  *
1941  * Reads the module value out of the NVM access config field.
1942  */
1943 u32 ice_nvm_access_get_module(struct ice_nvm_access_cmd *cmd)
1944 {
1945 	return ((cmd->config & ICE_NVM_CFG_MODULE_M) >> ICE_NVM_CFG_MODULE_S);
1946 }
1947 
1948 /**
1949  * ice_nvm_access_get_flags - Helper function to read flags value
1950  * @cmd: NVM access command structure
1951  *
1952  * Reads the flags value out of the NVM access config field.
1953  */
1954 u32 ice_nvm_access_get_flags(struct ice_nvm_access_cmd *cmd)
1955 {
1956 	return ((cmd->config & ICE_NVM_CFG_FLAGS_M) >> ICE_NVM_CFG_FLAGS_S);
1957 }
1958 
1959 /**
1960  * ice_nvm_access_get_adapter - Helper function to read adapter info
1961  * @cmd: NVM access command structure
1962  *
1963  * Read the adapter info value out of the NVM access config field.
1964  */
1965 u32 ice_nvm_access_get_adapter(struct ice_nvm_access_cmd *cmd)
1966 {
1967 	return ((cmd->config & ICE_NVM_CFG_ADAPTER_INFO_M) >>
1968 		ICE_NVM_CFG_ADAPTER_INFO_S);
1969 }
1970 
1971 /**
1972  * ice_validate_nvm_rw_reg - Check than an NVM access request is valid
1973  * @cmd: NVM access command structure
1974  *
1975  * Validates that an NVM access structure is request to read or write a valid
1976  * register offset. First validates that the module and flags are correct, and
1977  * then ensures that the register offset is one of the accepted registers.
1978  */
1979 static enum ice_status
1980 ice_validate_nvm_rw_reg(struct ice_nvm_access_cmd *cmd)
1981 {
1982 	u32 module, flags, offset;
1983 	u16 i;
1984 
1985 	module = ice_nvm_access_get_module(cmd);
1986 	flags = ice_nvm_access_get_flags(cmd);
1987 	offset = cmd->offset;
1988 
1989 	/* Make sure the module and flags indicate a read/write request */
1990 	if (module != ICE_NVM_REG_RW_MODULE ||
1991 	    flags != ICE_NVM_REG_RW_FLAGS ||
1992 	    cmd->data_size != FIELD_SIZEOF(union ice_nvm_access_data, regval))
1993 		return ICE_ERR_PARAM;
1994 
1995 	switch (offset) {
1996 	case GL_HICR:
1997 	case GL_HICR_EN: /* Note, this register is read only */
1998 	case GL_FWSTS:
1999 	case GL_MNG_FWSM:
2000 	case GLGEN_CSR_DEBUG_C:
2001 	case GLGEN_RSTAT:
2002 	case GLPCI_LBARCTRL:
2003 	case GL_MNG_DEF_DEVID:
2004 	case GLNVM_GENS:
2005 	case GLNVM_FLA:
2006 	case PF_FUNC_RID:
2007 		return ICE_SUCCESS;
2008 	default:
2009 		break;
2010 	}
2011 
2012 	for (i = 0; i <= GL_HIDA_MAX_INDEX; i++)
2013 		if (offset == (u32)GL_HIDA(i))
2014 			return ICE_SUCCESS;
2015 
2016 	for (i = 0; i <= GL_HIBA_MAX_INDEX; i++)
2017 		if (offset == (u32)GL_HIBA(i))
2018 			return ICE_SUCCESS;
2019 
2020 	/* All other register offsets are not valid */
2021 	return ICE_ERR_OUT_OF_RANGE;
2022 }
2023 
2024 /**
2025  * ice_nvm_access_read - Handle an NVM read request
2026  * @hw: pointer to the HW struct
2027  * @cmd: NVM access command to process
2028  * @data: storage for the register value read
2029  *
2030  * Process an NVM access request to read a register.
2031  */
2032 enum ice_status
2033 ice_nvm_access_read(struct ice_hw *hw, struct ice_nvm_access_cmd *cmd,
2034 		    union ice_nvm_access_data *data)
2035 {
2036 	enum ice_status status;
2037 
2038 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
2039 
2040 	/* Always initialize the output data, even on failure */
2041 	ice_memset(data, 0, cmd->data_size, ICE_NONDMA_MEM);
2042 
2043 	/* Make sure this is a valid read/write access request */
2044 	status = ice_validate_nvm_rw_reg(cmd);
2045 	if (status)
2046 		return status;
2047 
2048 	ice_debug(hw, ICE_DBG_NVM, "NVM access: reading register %08x\n",
2049 		  cmd->offset);
2050 
2051 	/* Read the register and store the contents in the data field */
2052 	data->regval = rd32(hw, cmd->offset);
2053 
2054 	return ICE_SUCCESS;
2055 }
2056 
2057 /**
2058  * ice_nvm_access_write - Handle an NVM write request
2059  * @hw: pointer to the HW struct
2060  * @cmd: NVM access command to process
2061  * @data: NVM access data to write
2062  *
2063  * Process an NVM access request to write a register.
2064  */
2065 enum ice_status
2066 ice_nvm_access_write(struct ice_hw *hw, struct ice_nvm_access_cmd *cmd,
2067 		     union ice_nvm_access_data *data)
2068 {
2069 	enum ice_status status;
2070 
2071 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
2072 
2073 	/* Make sure this is a valid read/write access request */
2074 	status = ice_validate_nvm_rw_reg(cmd);
2075 	if (status)
2076 		return status;
2077 
2078 	/* Reject requests to write to read-only registers */
2079 	switch (cmd->offset) {
2080 	case GL_HICR_EN:
2081 	case GLGEN_RSTAT:
2082 		return ICE_ERR_OUT_OF_RANGE;
2083 	default:
2084 		break;
2085 	}
2086 
2087 	ice_debug(hw, ICE_DBG_NVM, "NVM access: writing register %08x with value %08x\n",
2088 		  cmd->offset, data->regval);
2089 
2090 	/* Write the data field to the specified register */
2091 	wr32(hw, cmd->offset, data->regval);
2092 
2093 	return ICE_SUCCESS;
2094 }
2095 
2096 /**
2097  * ice_handle_nvm_access - Handle an NVM access request
2098  * @hw: pointer to the HW struct
2099  * @cmd: NVM access command info
2100  * @data: pointer to read or return data
2101  *
2102  * Process an NVM access request. Read the command structure information and
2103  * determine if it is valid. If not, report an error indicating the command
2104  * was invalid.
2105  *
2106  * For valid commands, perform the necessary function, copying the data into
2107  * the provided data buffer.
2108  */
2109 enum ice_status
2110 ice_handle_nvm_access(struct ice_hw *hw, struct ice_nvm_access_cmd *cmd,
2111 		      union ice_nvm_access_data *data)
2112 {
2113 	u32 module, flags, adapter_info;
2114 
2115 	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
2116 
2117 	/* Extended flags are currently reserved and must be zero */
2118 	if ((cmd->config & ICE_NVM_CFG_EXT_FLAGS_M) != 0)
2119 		return ICE_ERR_PARAM;
2120 
2121 	/* Adapter info must match the HW device ID */
2122 	adapter_info = ice_nvm_access_get_adapter(cmd);
2123 	if (adapter_info != hw->device_id)
2124 		return ICE_ERR_PARAM;
2125 
2126 	switch (cmd->command) {
2127 	case ICE_NVM_CMD_READ:
2128 		module = ice_nvm_access_get_module(cmd);
2129 		flags = ice_nvm_access_get_flags(cmd);
2130 
2131 		/* Getting the driver's NVM features structure shares the same
2132 		 * command type as reading a register. Read the config field
2133 		 * to determine if this is a request to get features.
2134 		 */
2135 		if (module == ICE_NVM_GET_FEATURES_MODULE &&
2136 		    flags == ICE_NVM_GET_FEATURES_FLAGS &&
2137 		    cmd->offset == 0)
2138 			return ice_nvm_access_get_features(cmd, data);
2139 		else
2140 			return ice_nvm_access_read(hw, cmd, data);
2141 	case ICE_NVM_CMD_WRITE:
2142 		return ice_nvm_access_write(hw, cmd, data);
2143 	default:
2144 		return ICE_ERR_PARAM;
2145 	}
2146 }
2147 
2148