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