xref: /freebsd/sys/dev/ice/ice_nvm.c (revision 440addc642496f8d04fe17af9eb905ac4a5bdbd8)
1  /* SPDX-License-Identifier: BSD-3-Clause */
2  /*  Copyright (c) 2024, 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  int
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  int
96  ice_read_flat_nvm(struct ice_hw *hw, u32 offset, u32 *length, u8 *data,
97  		  bool read_shadow_ram)
98  {
99  	u32 inlen = *length;
100  	u32 bytes_read = 0;
101  	bool last_cmd;
102  	int status;
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  int
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  int 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  	int 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  int
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  	int 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  int
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 int
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 0;
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  int ice_read_sr_word_aq(struct ice_hw *hw, u16 offset, u16 *data)
337  {
338  	u32 bytes = sizeof(u16);
339  	__le16 data_local;
340  	int status;
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 0;
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 int
368  ice_write_sr_aq(struct ice_hw *hw, u32 offset, u16 words, __le16 *data,
369  		bool last_command)
370  {
371  	int 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 int
394  ice_read_sr_buf_aq(struct ice_hw *hw, u16 offset, u16 *words, u16 *data)
395  {
396  	u32 bytes = *words * 2, i;
397  	int 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 = (u16)(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  int ice_acquire_nvm(struct ice_hw *hw, enum ice_aq_res_access_type access)
424  {
425  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
426  	if (hw->flash.blank_nvm_mode)
427  		return 0;
428  
429  	return ice_acquire_res(hw, ICE_NVM_RES_ID, access, ICE_NVM_TIMEOUT);
430  }
431  
432  /**
433   * ice_release_nvm - Generic request for releasing the NVM ownership
434   * @hw: pointer to the HW structure
435   *
436   * This function will release NVM ownership.
437   */
438  void ice_release_nvm(struct ice_hw *hw)
439  {
440  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
441  
442  	if (hw->flash.blank_nvm_mode)
443  		return;
444  
445  	ice_release_res(hw, ICE_NVM_RES_ID);
446  }
447  
448  /**
449   * ice_get_flash_bank_offset - Get offset into requested flash bank
450   * @hw: pointer to the HW structure
451   * @bank: whether to read from the active or inactive flash bank
452   * @module: the module to read from
453   *
454   * Based on the module, lookup the module offset from the beginning of the
455   * flash.
456   *
457   * Returns the flash offset. Note that a value of zero is invalid and must be
458   * treated as an error.
459   */
460  static u32 ice_get_flash_bank_offset(struct ice_hw *hw, enum ice_bank_select bank, u16 module)
461  {
462  	struct ice_bank_info *banks = &hw->flash.banks;
463  	enum ice_flash_bank active_bank;
464  	bool second_bank_active;
465  	u32 offset, size;
466  
467  	switch (module) {
468  	case ICE_SR_1ST_NVM_BANK_PTR:
469  		offset = banks->nvm_ptr;
470  		size = banks->nvm_size;
471  		active_bank = banks->nvm_bank;
472  		break;
473  	case ICE_SR_1ST_OROM_BANK_PTR:
474  		offset = banks->orom_ptr;
475  		size = banks->orom_size;
476  		active_bank = banks->orom_bank;
477  		break;
478  	case ICE_SR_NETLIST_BANK_PTR:
479  		offset = banks->netlist_ptr;
480  		size = banks->netlist_size;
481  		active_bank = banks->netlist_bank;
482  		break;
483  	default:
484  		ice_debug(hw, ICE_DBG_NVM, "Unexpected value for flash module: 0x%04x\n", module);
485  		return 0;
486  	}
487  
488  	switch (active_bank) {
489  	case ICE_1ST_FLASH_BANK:
490  		second_bank_active = false;
491  		break;
492  	case ICE_2ND_FLASH_BANK:
493  		second_bank_active = true;
494  		break;
495  	default:
496  		ice_debug(hw, ICE_DBG_NVM, "Unexpected value for active flash bank: %u\n",
497  			  active_bank);
498  		return 0;
499  	}
500  
501  	/* The second flash bank is stored immediately following the first
502  	 * bank. Based on whether the 1st or 2nd bank is active, and whether
503  	 * we want the active or inactive bank, calculate the desired offset.
504  	 */
505  	switch (bank) {
506  	case ICE_ACTIVE_FLASH_BANK:
507  		return offset + (second_bank_active ? size : 0);
508  	case ICE_INACTIVE_FLASH_BANK:
509  		return offset + (second_bank_active ? 0 : size);
510  	}
511  
512  	ice_debug(hw, ICE_DBG_NVM, "Unexpected value for flash bank selection: %u\n", bank);
513  	return 0;
514  }
515  
516  /**
517   * ice_read_flash_module - Read a word from one of the main NVM modules
518   * @hw: pointer to the HW structure
519   * @bank: which bank of the module to read
520   * @module: the module to read
521   * @offset: the offset into the module in bytes
522   * @data: storage for the word read from the flash
523   * @length: bytes of data to read
524   *
525   * Read data from the specified flash module. The bank parameter indicates
526   * whether or not to read from the active bank or the inactive bank of that
527   * module.
528   *
529   * The word will be read using flat NVM access, and relies on the
530   * hw->flash.banks data being setup by ice_determine_active_flash_banks()
531   * during initialization.
532   */
533  static int
534  ice_read_flash_module(struct ice_hw *hw, enum ice_bank_select bank, u16 module,
535  		      u32 offset, u8 *data, u32 length)
536  {
537  	int status;
538  	u32 start;
539  
540  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
541  
542  	start = ice_get_flash_bank_offset(hw, bank, module);
543  	if (!start) {
544  		ice_debug(hw, ICE_DBG_NVM, "Unable to calculate flash bank offset for module 0x%04x\n",
545  			  module);
546  		return ICE_ERR_PARAM;
547  	}
548  
549  	status = ice_acquire_nvm(hw, ICE_RES_READ);
550  	if (status)
551  		return status;
552  
553  	status = ice_read_flat_nvm(hw, start + offset, &length, data, false);
554  
555  	ice_release_nvm(hw);
556  
557  	return status;
558  }
559  
560  /**
561   * ice_read_nvm_module - Read from the active main NVM module
562   * @hw: pointer to the HW structure
563   * @bank: whether to read from active or inactive NVM module
564   * @offset: offset into the NVM module to read, in words
565   * @data: storage for returned word value
566   *
567   * Read the specified word from the active NVM module. This includes the CSS
568   * header at the start of the NVM module.
569   */
570  static int
571  ice_read_nvm_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
572  {
573  	__le16 data_local;
574  	int status;
575  
576  	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_NVM_BANK_PTR, offset * sizeof(u16),
577  				       (_FORCE_ u8 *)&data_local, sizeof(u16));
578  	if (!status)
579  		*data = LE16_TO_CPU(data_local);
580  
581  	return status;
582  }
583  
584  /**
585   * ice_get_nvm_css_hdr_len - Read the CSS header length from the NVM CSS header
586   * @hw: pointer to the HW struct
587   * @bank: whether to read from the active or inactive flash bank
588   * @hdr_len: storage for header length in words
589   *
590   * Read the CSS header length from the NVM CSS header and add the Authentication
591   * header size, and then convert to words.
592   */
593  static int
594  ice_get_nvm_css_hdr_len(struct ice_hw *hw, enum ice_bank_select bank,
595  			u32 *hdr_len)
596  {
597  	u16 hdr_len_l, hdr_len_h;
598  	u32 hdr_len_dword;
599  	int status;
600  
601  	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_L,
602  				     &hdr_len_l);
603  	if (status)
604  		return status;
605  
606  	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_H,
607  				     &hdr_len_h);
608  	if (status)
609  		return status;
610  
611  	/* CSS header length is in DWORD, so convert to words and add
612  	 * authentication header size
613  	 */
614  	hdr_len_dword = hdr_len_h << 16 | hdr_len_l;
615  	*hdr_len = (hdr_len_dword * 2) + ICE_NVM_AUTH_HEADER_LEN;
616  
617  	return 0;
618  }
619  
620  /**
621   * ice_read_nvm_sr_copy - Read a word from the Shadow RAM copy in the NVM bank
622   * @hw: pointer to the HW structure
623   * @bank: whether to read from the active or inactive NVM module
624   * @offset: offset into the Shadow RAM copy to read, in words
625   * @data: storage for returned word value
626   *
627   * Read the specified word from the copy of the Shadow RAM found in the
628   * specified NVM module.
629   */
630  static int
631  ice_read_nvm_sr_copy(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
632  {
633  	u32 hdr_len;
634  	int status;
635  
636  	status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len);
637  	if (status)
638  		return status;
639  
640  	hdr_len = ROUND_UP(hdr_len, 32);
641  
642  	return ice_read_nvm_module(hw, bank, hdr_len + offset, data);
643  }
644  
645  /**
646   * ice_read_orom_module - Read from the active Option ROM module
647   * @hw: pointer to the HW structure
648   * @bank: whether to read from active or inactive OROM module
649   * @offset: offset into the OROM module to read, in words
650   * @data: storage for returned word value
651   *
652   * Read the specified word from the active Option ROM module of the flash.
653   * Note that unlike the NVM module, the CSS data is stored at the end of the
654   * module instead of at the beginning.
655   */
656  static int
657  ice_read_orom_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
658  {
659  	__le16 data_local;
660  	int status;
661  
662  	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR, offset * sizeof(u16),
663  				       (_FORCE_ u8 *)&data_local, sizeof(u16));
664  	if (!status)
665  		*data = LE16_TO_CPU(data_local);
666  
667  	return status;
668  }
669  
670  /**
671   * ice_read_netlist_module - Read data from the netlist module area
672   * @hw: pointer to the HW structure
673   * @bank: whether to read from the active or inactive module
674   * @offset: offset into the netlist to read from
675   * @data: storage for returned word value
676   *
677   * Read a word from the specified netlist bank.
678   */
679  static int
680  ice_read_netlist_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
681  {
682  	__le16 data_local;
683  	int status;
684  
685  	status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR, offset * sizeof(u16),
686  				       (_FORCE_ u8 *)&data_local, sizeof(u16));
687  	if (!status)
688  		*data = LE16_TO_CPU(data_local);
689  
690  	return status;
691  }
692  
693  /**
694   * ice_read_sr_word - Reads Shadow RAM word and acquire NVM if necessary
695   * @hw: pointer to the HW structure
696   * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
697   * @data: word read from the Shadow RAM
698   *
699   * Reads one 16 bit word from the Shadow RAM using the ice_read_sr_word_aq.
700   */
701  int ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
702  {
703  	int status;
704  
705  	status = ice_acquire_nvm(hw, ICE_RES_READ);
706  	if (!status) {
707  		status = ice_read_sr_word_aq(hw, offset, data);
708  		ice_release_nvm(hw);
709  	}
710  
711  	return status;
712  }
713  
714  #define check_add_overflow __builtin_add_overflow
715  
716  /**
717   * ice_get_pfa_module_tlv - Reads sub module TLV from NVM PFA
718   * @hw: pointer to hardware structure
719   * @module_tlv: pointer to module TLV to return
720   * @module_tlv_len: pointer to module TLV length to return
721   * @module_type: module type requested
722   *
723   * Finds the requested sub module TLV type from the Preserved Field
724   * Area (PFA) and returns the TLV pointer and length. The caller can
725   * use these to read the variable length TLV value.
726   */
727  int
728  ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
729  		       u16 module_type)
730  {
731  	u16 pfa_len, pfa_ptr, next_tlv, max_tlv;
732  	int status;
733  
734  	status = ice_read_sr_word(hw, ICE_SR_PFA_PTR, &pfa_ptr);
735  	if (status) {
736  		ice_debug(hw, ICE_DBG_INIT, "Preserved Field Array pointer.\n");
737  		return status;
738  	}
739  	status = ice_read_sr_word(hw, pfa_ptr, &pfa_len);
740  	if (status) {
741  		ice_debug(hw, ICE_DBG_INIT, "Failed to read PFA length.\n");
742  		return status;
743  	}
744  
745  	if (check_add_overflow(pfa_ptr, (u16)(pfa_len - 1), &max_tlv)) {
746  		ice_debug(hw, ICE_DBG_INIT, "PFA starts at offset %u. PFA length of %u caused 16-bit arithmetic overflow.\n",
747  				  pfa_ptr, pfa_len);
748  		return ICE_ERR_INVAL_SIZE;
749  	}
750  
751  	/* The Preserved Fields Area contains a sequence of TLVs which define
752  	 * its contents. The PFA length includes all of the TLVs, plus its
753  	 * initial length word itself, *and* one final word at the end of all
754  	 * of the TLVs.
755  	 *
756  	 * Starting with first TLV after PFA length, iterate through the list
757  	 * of TLVs to find the requested one.
758  	 */
759  	next_tlv = pfa_ptr + 1;
760  	while (next_tlv < max_tlv) {
761  		u16 tlv_sub_module_type;
762  		u16 tlv_len;
763  
764  		/* Read TLV type */
765  		status = ice_read_sr_word(hw, (u16)next_tlv,
766  					  &tlv_sub_module_type);
767  		if (status) {
768  			ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV type.\n");
769  			break;
770  		}
771  		/* Read TLV length */
772  		status = ice_read_sr_word(hw, (u16)(next_tlv + 1), &tlv_len);
773  		if (status) {
774  			ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV length.\n");
775  			break;
776  		}
777  		if (tlv_sub_module_type == module_type) {
778  			if (tlv_len) {
779  				*module_tlv = (u16)next_tlv;
780  				*module_tlv_len = tlv_len;
781  				return 0;
782  			}
783  			return ICE_ERR_INVAL_SIZE;
784  		}
785  
786  		if (check_add_overflow(next_tlv, (u16)2, &next_tlv) ||
787  		    check_add_overflow(next_tlv, tlv_len, &next_tlv)) {
788  			ice_debug(hw, ICE_DBG_INIT, "TLV of type %u and length 0x%04x caused 16-bit arithmetic overflow. The PFA starts at 0x%04x and has length of 0x%04x\n",
789  					  tlv_sub_module_type, tlv_len, pfa_ptr, pfa_len);
790  			return ICE_ERR_INVAL_SIZE;
791  		}
792  	}
793  	/* Module does not exist */
794  	return ICE_ERR_DOES_NOT_EXIST;
795  }
796  
797  /**
798   * ice_read_pba_string - Reads part number string from NVM
799   * @hw: pointer to hardware structure
800   * @pba_num: stores the part number string from the NVM
801   * @pba_num_size: part number string buffer length
802   *
803   * Reads the part number string from the NVM.
804   */
805  int ice_read_pba_string(struct ice_hw *hw, u8 *pba_num, u32 pba_num_size)
806  {
807  	u16 pba_tlv, pba_tlv_len;
808  	u16 pba_word, pba_size;
809  	int status;
810  	u16 i;
811  
812  	status = ice_get_pfa_module_tlv(hw, &pba_tlv, &pba_tlv_len,
813  					ICE_SR_PBA_BLOCK_PTR);
814  	if (status) {
815  		ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Block TLV.\n");
816  		return status;
817  	}
818  
819  	/* pba_size is the next word */
820  	status = ice_read_sr_word(hw, (pba_tlv + 2), &pba_size);
821  	if (status) {
822  		ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Section size.\n");
823  		return status;
824  	}
825  
826  	if (pba_tlv_len < pba_size) {
827  		ice_debug(hw, ICE_DBG_INIT, "Invalid PBA Block TLV size.\n");
828  		return ICE_ERR_INVAL_SIZE;
829  	}
830  
831  	/* Subtract one to get PBA word count (PBA Size word is included in
832  	 * total size)
833  	 */
834  	pba_size--;
835  	if (pba_num_size < (((u32)pba_size * 2) + 1)) {
836  		ice_debug(hw, ICE_DBG_INIT, "Buffer too small for PBA data.\n");
837  		return ICE_ERR_PARAM;
838  	}
839  
840  	for (i = 0; i < pba_size; i++) {
841  		status = ice_read_sr_word(hw, (pba_tlv + 2 + 1) + i, &pba_word);
842  		if (status) {
843  			ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Block word %d.\n", i);
844  			return status;
845  		}
846  
847  		pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
848  		pba_num[(i * 2) + 1] = pba_word & 0xFF;
849  	}
850  	pba_num[(pba_size * 2)] = '\0';
851  
852  	return status;
853  }
854  
855  /**
856   * ice_get_nvm_srev - Read the security revision from the NVM CSS header
857   * @hw: pointer to the HW struct
858   * @bank: whether to read from the active or inactive flash bank
859   * @srev: storage for security revision
860   *
861   * Read the security revision out of the CSS header of the active NVM module
862   * bank.
863   */
864  static int ice_get_nvm_srev(struct ice_hw *hw, enum ice_bank_select bank, u32 *srev)
865  {
866  	u16 srev_l, srev_h;
867  	int status;
868  
869  	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_SREV_L, &srev_l);
870  	if (status)
871  		return status;
872  
873  	status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_SREV_H, &srev_h);
874  	if (status)
875  		return status;
876  
877  	*srev = srev_h << 16 | srev_l;
878  
879  	return 0;
880  }
881  
882  /**
883   * ice_get_nvm_ver_info - Read NVM version information
884   * @hw: pointer to the HW struct
885   * @bank: whether to read from the active or inactive flash bank
886   * @nvm: pointer to NVM info structure
887   *
888   * Read the NVM EETRACK ID and map version of the main NVM image bank, filling
889   * in the NVM info structure.
890   */
891  static int
892  ice_get_nvm_ver_info(struct ice_hw *hw, enum ice_bank_select bank, struct ice_nvm_info *nvm)
893  {
894  	u16 eetrack_lo, eetrack_hi, ver;
895  	int status;
896  
897  	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_DEV_STARTER_VER, &ver);
898  	if (status) {
899  		ice_debug(hw, ICE_DBG_NVM, "Failed to read DEV starter version.\n");
900  		return status;
901  	}
902  
903  	nvm->major = (ver & ICE_NVM_VER_HI_MASK) >> ICE_NVM_VER_HI_SHIFT;
904  	nvm->minor = (ver & ICE_NVM_VER_LO_MASK) >> ICE_NVM_VER_LO_SHIFT;
905  
906  	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_LO, &eetrack_lo);
907  	if (status) {
908  		ice_debug(hw, ICE_DBG_NVM, "Failed to read EETRACK lo.\n");
909  		return status;
910  	}
911  	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_HI, &eetrack_hi);
912  	if (status) {
913  		ice_debug(hw, ICE_DBG_NVM, "Failed to read EETRACK hi.\n");
914  		return status;
915  	}
916  
917  	nvm->eetrack = (eetrack_hi << 16) | eetrack_lo;
918  
919  	status = ice_get_nvm_srev(hw, bank, &nvm->srev);
920  	if (status)
921  		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM security revision.\n");
922  
923  	return 0;
924  }
925  
926  /**
927   * ice_get_inactive_nvm_ver - Read Option ROM version from the inactive bank
928   * @hw: pointer to the HW structure
929   * @nvm: storage for Option ROM version information
930   *
931   * Reads the NVM EETRACK ID, Map version, and security revision of the
932   * inactive NVM bank. Used to access version data for a pending update that
933   * has not yet been activated.
934   */
935  int ice_get_inactive_nvm_ver(struct ice_hw *hw, struct ice_nvm_info *nvm)
936  {
937  	return ice_get_nvm_ver_info(hw, ICE_INACTIVE_FLASH_BANK, nvm);
938  }
939  
940  /**
941   * ice_get_orom_srev - Read the security revision from the OROM CSS header
942   * @hw: pointer to the HW struct
943   * @bank: whether to read from active or inactive flash module
944   * @srev: storage for security revision
945   *
946   * Read the security revision out of the CSS header of the active OROM module
947   * bank.
948   */
949  static int ice_get_orom_srev(struct ice_hw *hw, enum ice_bank_select bank, u32 *srev)
950  {
951  	u32 orom_size_word = hw->flash.banks.orom_size / 2;
952  	u16 srev_l, srev_h;
953  	u32 css_start;
954  	u32 hdr_len;
955  	int status;
956  
957  	status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len);
958  	if (status)
959  		return status;
960  
961  	if (orom_size_word < hdr_len) {
962  		ice_debug(hw, ICE_DBG_NVM, "Unexpected Option ROM Size of %u\n",
963  			  hw->flash.banks.orom_size);
964  		return ICE_ERR_CFG;
965  	}
966  
967  	/* calculate how far into the Option ROM the CSS header starts. Note
968  	 * that ice_read_orom_module takes a word offset
969  	 */
970  	css_start = orom_size_word - hdr_len;
971  	status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_L, &srev_l);
972  	if (status)
973  		return status;
974  
975  	status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_H, &srev_h);
976  	if (status)
977  		return status;
978  
979  	*srev = srev_h << 16 | srev_l;
980  
981  	return 0;
982  }
983  
984  /**
985   * ice_get_orom_civd_data - Get the combo version information from Option ROM
986   * @hw: pointer to the HW struct
987   * @bank: whether to read from the active or inactive flash module
988   * @civd: storage for the Option ROM CIVD data.
989   *
990   * Searches through the Option ROM flash contents to locate the CIVD data for
991   * the image.
992   */
993  static int
994  ice_get_orom_civd_data(struct ice_hw *hw, enum ice_bank_select bank,
995  		       struct ice_orom_civd_info *civd)
996  {
997  	struct ice_orom_civd_info civd_data_section;
998  	int status;
999  	u32 offset;
1000  	u32 tmp;
1001  
1002  	/* The CIVD section is located in the Option ROM aligned to 512 bytes.
1003  	 * The first 4 bytes must contain the ASCII characters "$CIV".
1004  	 * A simple modulo 256 sum of all of the bytes of the structure must
1005  	 * equal 0.
1006  	 *
1007  	 * The exact location is unknown and varies between images but is
1008  	 * usually somewhere in the middle of the bank. We need to scan the
1009  	 * Option ROM bank to locate it.
1010  	 *
1011  	 */
1012  
1013  	/* Scan the memory buffer to locate the CIVD data section */
1014  	for (offset = 0; (offset + 512) <= hw->flash.banks.orom_size; offset += 512) {
1015  		u8 sum = 0, i;
1016  
1017  		status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR,
1018  					       offset, (u8 *)&tmp, sizeof(tmp));
1019  		if (status) {
1020  			ice_debug(hw, ICE_DBG_NVM, "Unable to read Option ROM data\n");
1021  			return status;
1022  		}
1023  
1024  		/* Skip forward until we find a matching signature */
1025  		if (memcmp("$CIV", &tmp, sizeof(tmp)) != 0)
1026  			continue;
1027  
1028  		ice_debug(hw, ICE_DBG_NVM, "Found CIVD section at offset %u\n",
1029  			  offset);
1030  
1031  		status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR,
1032  					       offset, (u8 *)&civd_data_section,
1033  					       sizeof(civd_data_section));
1034  		if (status) {
1035  			ice_debug(hw, ICE_DBG_NVM, "Unable to read CIVD data\n");
1036  			goto exit_error;
1037  		}
1038  
1039  		/* Verify that the simple checksum is zero */
1040  		for (i = 0; i < sizeof(civd_data_section); i++)
1041  			sum += ((u8 *)&civd_data_section)[i];
1042  
1043  		if (sum) {
1044  			ice_debug(hw, ICE_DBG_NVM, "Found CIVD data with invalid checksum of %u\n",
1045  				  sum);
1046  			status = ICE_ERR_NVM;
1047  			goto exit_error;
1048  		}
1049  
1050  		*civd = civd_data_section;
1051  
1052  		return 0;
1053  	}
1054  
1055  	status = ICE_ERR_NVM;
1056  	ice_debug(hw, ICE_DBG_NVM, "Unable to locate CIVD data within the Option ROM\n");
1057  
1058  exit_error:
1059  	return status;
1060  }
1061  
1062  /**
1063   * ice_get_orom_ver_info - Read Option ROM version information
1064   * @hw: pointer to the HW struct
1065   * @bank: whether to read from the active or inactive flash module
1066   * @orom: pointer to Option ROM info structure
1067   *
1068   * Read Option ROM version and security revision from the Option ROM flash
1069   * section.
1070   */
1071  static int
1072  ice_get_orom_ver_info(struct ice_hw *hw, enum ice_bank_select bank, struct ice_orom_info *orom)
1073  {
1074  	struct ice_orom_civd_info civd;
1075  	u32 combo_ver;
1076  	int status;
1077  
1078  	status = ice_get_orom_civd_data(hw, bank, &civd);
1079  	if (status) {
1080  		ice_debug(hw, ICE_DBG_NVM, "Failed to locate valid Option ROM CIVD data\n");
1081  		return status;
1082  	}
1083  
1084  	combo_ver = LE32_TO_CPU(civd.combo_ver);
1085  
1086  	orom->major = (u8)((combo_ver & ICE_OROM_VER_MASK) >> ICE_OROM_VER_SHIFT);
1087  	orom->patch = (u8)(combo_ver & ICE_OROM_VER_PATCH_MASK);
1088  	orom->build = (u16)((combo_ver & ICE_OROM_VER_BUILD_MASK) >> ICE_OROM_VER_BUILD_SHIFT);
1089  
1090  	status = ice_get_orom_srev(hw, bank, &orom->srev);
1091  	if (status) {
1092  		ice_debug(hw, ICE_DBG_NVM, "Failed to read Option ROM security revision.\n");
1093  		return status;
1094  	}
1095  
1096  	return 0;
1097  }
1098  
1099  /**
1100   * ice_get_inactive_orom_ver - Read Option ROM version from the inactive bank
1101   * @hw: pointer to the HW structure
1102   * @orom: storage for Option ROM version information
1103   *
1104   * Reads the Option ROM version and security revision data for the inactive
1105   * section of flash. Used to access version data for a pending update that has
1106   * not yet been activated.
1107   */
1108  int ice_get_inactive_orom_ver(struct ice_hw *hw, struct ice_orom_info *orom)
1109  {
1110  	return ice_get_orom_ver_info(hw, ICE_INACTIVE_FLASH_BANK, orom);
1111  }
1112  
1113  /**
1114   * ice_get_netlist_info
1115   * @hw: pointer to the HW struct
1116   * @bank: whether to read from the active or inactive flash bank
1117   * @netlist: pointer to netlist version info structure
1118   *
1119   * Get the netlist version information from the requested bank. Reads the Link
1120   * Topology section to find the Netlist ID block and extract the relevant
1121   * information into the netlist version structure.
1122   */
1123  static int
1124  ice_get_netlist_info(struct ice_hw *hw, enum ice_bank_select bank,
1125  		     struct ice_netlist_info *netlist)
1126  {
1127  	u16 module_id, length, node_count, i;
1128  	u16 *id_blk;
1129  	int status;
1130  
1131  	status = ice_read_netlist_module(hw, bank, ICE_NETLIST_TYPE_OFFSET, &module_id);
1132  	if (status)
1133  		return status;
1134  
1135  	if (module_id != ICE_NETLIST_LINK_TOPO_MOD_ID) {
1136  		ice_debug(hw, ICE_DBG_NVM, "Expected netlist module_id ID of 0x%04x, but got 0x%04x\n",
1137  			  ICE_NETLIST_LINK_TOPO_MOD_ID, module_id);
1138  		return ICE_ERR_NVM;
1139  	}
1140  
1141  	status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_MODULE_LEN, &length);
1142  	if (status)
1143  		return status;
1144  
1145  	/* sanity check that we have at least enough words to store the netlist ID block */
1146  	if (length < ICE_NETLIST_ID_BLK_SIZE) {
1147  		ice_debug(hw, ICE_DBG_NVM, "Netlist Link Topology module too small. Expected at least %u words, but got %u words.\n",
1148  			  ICE_NETLIST_ID_BLK_SIZE, length);
1149  		return ICE_ERR_NVM;
1150  	}
1151  
1152  	status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_NODE_COUNT, &node_count);
1153  	if (status)
1154  		return status;
1155  	node_count &= ICE_LINK_TOPO_NODE_COUNT_M;
1156  
1157  	id_blk = (u16 *)ice_calloc(hw, ICE_NETLIST_ID_BLK_SIZE, sizeof(*id_blk));
1158  	if (!id_blk)
1159  		return ICE_ERR_NO_MEMORY;
1160  
1161  	/* Read out the entire Netlist ID Block at once. */
1162  	status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR,
1163  				       ICE_NETLIST_ID_BLK_OFFSET(node_count) * sizeof(u16),
1164  				       (u8 *)id_blk, ICE_NETLIST_ID_BLK_SIZE * sizeof(u16));
1165  	if (status)
1166  		goto exit_error;
1167  
1168  	for (i = 0; i < ICE_NETLIST_ID_BLK_SIZE; i++)
1169  		id_blk[i] = LE16_TO_CPU(((_FORCE_ __le16 *)id_blk)[i]);
1170  
1171  	netlist->major = id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_HIGH] << 16 |
1172  			 id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_LOW];
1173  	netlist->minor = id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_HIGH] << 16 |
1174  			 id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_LOW];
1175  	netlist->type = id_blk[ICE_NETLIST_ID_BLK_TYPE_HIGH] << 16 |
1176  			id_blk[ICE_NETLIST_ID_BLK_TYPE_LOW];
1177  	netlist->rev = id_blk[ICE_NETLIST_ID_BLK_REV_HIGH] << 16 |
1178  		       id_blk[ICE_NETLIST_ID_BLK_REV_LOW];
1179  	netlist->cust_ver = id_blk[ICE_NETLIST_ID_BLK_CUST_VER];
1180  	/* Read the left most 4 bytes of SHA */
1181  	netlist->hash = id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(15)] << 16 |
1182  			id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(14)];
1183  
1184  exit_error:
1185  	ice_free(hw, id_blk);
1186  
1187  	return status;
1188  }
1189  
1190  /**
1191   * ice_get_netlist_ver_info
1192   * @hw: pointer to the HW struct
1193   * @netlist: pointer to netlist version info structure
1194   *
1195   * Get the netlist version information
1196   */
1197  int ice_get_netlist_ver_info(struct ice_hw *hw, struct ice_netlist_info *netlist)
1198  {
1199  	return ice_get_netlist_info(hw, ICE_ACTIVE_FLASH_BANK, netlist);
1200  }
1201  
1202  /**
1203   * ice_get_inactive_netlist_ver
1204   * @hw: pointer to the HW struct
1205   * @netlist: pointer to netlist version info structure
1206   *
1207   * Read the netlist version data from the inactive netlist bank. Used to
1208   * extract version data of a pending flash update in order to display the
1209   * version data.
1210   */
1211  int ice_get_inactive_netlist_ver(struct ice_hw *hw, struct ice_netlist_info *netlist)
1212  {
1213  	return ice_get_netlist_info(hw, ICE_INACTIVE_FLASH_BANK, netlist);
1214  }
1215  
1216  /**
1217   * ice_discover_flash_size - Discover the available flash size
1218   * @hw: pointer to the HW struct
1219   *
1220   * The device flash could be up to 16MB in size. However, it is possible that
1221   * the actual size is smaller. Use bisection to determine the accessible size
1222   * of flash memory.
1223   */
1224  static int ice_discover_flash_size(struct ice_hw *hw)
1225  {
1226  	u32 min_size = 0, max_size = ICE_AQC_NVM_MAX_OFFSET + 1;
1227  	int status;
1228  
1229  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1230  
1231  	status = ice_acquire_nvm(hw, ICE_RES_READ);
1232  	if (status)
1233  		return status;
1234  
1235  	while ((max_size - min_size) > 1) {
1236  		u32 offset = (max_size + min_size) / 2;
1237  		u32 len = 1;
1238  		u8 data;
1239  
1240  		status = ice_read_flat_nvm(hw, offset, &len, &data, false);
1241  		if (status == ICE_ERR_AQ_ERROR &&
1242  		    hw->adminq.sq_last_status == ICE_AQ_RC_EINVAL) {
1243  			ice_debug(hw, ICE_DBG_NVM, "%s: New upper bound of %u bytes\n",
1244  				  __func__, offset);
1245  			status = 0;
1246  			max_size = offset;
1247  		} else if (!status) {
1248  			ice_debug(hw, ICE_DBG_NVM, "%s: New lower bound of %u bytes\n",
1249  				  __func__, offset);
1250  			min_size = offset;
1251  		} else {
1252  			/* an unexpected error occurred */
1253  			goto err_read_flat_nvm;
1254  		}
1255  	}
1256  
1257  	ice_debug(hw, ICE_DBG_NVM, "Predicted flash size is %u bytes\n", max_size);
1258  
1259  	hw->flash.flash_size = max_size;
1260  
1261  err_read_flat_nvm:
1262  	ice_release_nvm(hw);
1263  
1264  	return status;
1265  }
1266  
1267  /**
1268   * ice_read_sr_pointer - Read the value of a Shadow RAM pointer word
1269   * @hw: pointer to the HW structure
1270   * @offset: the word offset of the Shadow RAM word to read
1271   * @pointer: pointer value read from Shadow RAM
1272   *
1273   * Read the given Shadow RAM word, and convert it to a pointer value specified
1274   * in bytes. This function assumes the specified offset is a valid pointer
1275   * word.
1276   *
1277   * Each pointer word specifies whether it is stored in word size or 4KB
1278   * sector size by using the highest bit. The reported pointer value will be in
1279   * bytes, intended for flat NVM reads.
1280   */
1281  static int ice_read_sr_pointer(struct ice_hw *hw, u16 offset, u32 *pointer)
1282  {
1283  	int status;
1284  	u16 value;
1285  
1286  	status = ice_read_sr_word(hw, offset, &value);
1287  	if (status)
1288  		return status;
1289  
1290  	/* Determine if the pointer is in 4KB or word units */
1291  	if (value & ICE_SR_NVM_PTR_4KB_UNITS)
1292  		*pointer = (value & ~ICE_SR_NVM_PTR_4KB_UNITS) * 4 * 1024;
1293  	else
1294  		*pointer = value * 2;
1295  
1296  	return 0;
1297  }
1298  
1299  /**
1300   * ice_read_sr_area_size - Read an area size from a Shadow RAM word
1301   * @hw: pointer to the HW structure
1302   * @offset: the word offset of the Shadow RAM to read
1303   * @size: size value read from the Shadow RAM
1304   *
1305   * Read the given Shadow RAM word, and convert it to an area size value
1306   * specified in bytes. This function assumes the specified offset is a valid
1307   * area size word.
1308   *
1309   * Each area size word is specified in 4KB sector units. This function reports
1310   * the size in bytes, intended for flat NVM reads.
1311   */
1312  static int ice_read_sr_area_size(struct ice_hw *hw, u16 offset, u32 *size)
1313  {
1314  	int status;
1315  	u16 value;
1316  
1317  	status = ice_read_sr_word(hw, offset, &value);
1318  	if (status)
1319  		return status;
1320  
1321  	/* Area sizes are always specified in 4KB units */
1322  	*size = value * 4 * 1024;
1323  
1324  	return 0;
1325  }
1326  
1327  /**
1328   * ice_determine_active_flash_banks - Discover active bank for each module
1329   * @hw: pointer to the HW struct
1330   *
1331   * Read the Shadow RAM control word and determine which banks are active for
1332   * the NVM, OROM, and Netlist modules. Also read and calculate the associated
1333   * pointer and size. These values are then cached into the ice_flash_info
1334   * structure for later use in order to calculate the correct offset to read
1335   * from the active module.
1336   */
1337  static int ice_determine_active_flash_banks(struct ice_hw *hw)
1338  {
1339  	struct ice_bank_info *banks = &hw->flash.banks;
1340  	u16 ctrl_word;
1341  	int status;
1342  
1343  	status = ice_read_sr_word(hw, ICE_SR_NVM_CTRL_WORD, &ctrl_word);
1344  	if (status) {
1345  		ice_debug(hw, ICE_DBG_NVM, "Failed to read the Shadow RAM control word\n");
1346  		return status;
1347  	}
1348  
1349  	/* Check that the control word indicates validity */
1350  	if ((ctrl_word & ICE_SR_CTRL_WORD_1_M) >> ICE_SR_CTRL_WORD_1_S != ICE_SR_CTRL_WORD_VALID) {
1351  		ice_debug(hw, ICE_DBG_NVM, "Shadow RAM control word is invalid\n");
1352  		return ICE_ERR_CFG;
1353  	}
1354  
1355  	if (!(ctrl_word & ICE_SR_CTRL_WORD_NVM_BANK))
1356  		banks->nvm_bank = ICE_1ST_FLASH_BANK;
1357  	else
1358  		banks->nvm_bank = ICE_2ND_FLASH_BANK;
1359  
1360  	if (!(ctrl_word & ICE_SR_CTRL_WORD_OROM_BANK))
1361  		banks->orom_bank = ICE_1ST_FLASH_BANK;
1362  	else
1363  		banks->orom_bank = ICE_2ND_FLASH_BANK;
1364  
1365  	if (!(ctrl_word & ICE_SR_CTRL_WORD_NETLIST_BANK))
1366  		banks->netlist_bank = ICE_1ST_FLASH_BANK;
1367  	else
1368  		banks->netlist_bank = ICE_2ND_FLASH_BANK;
1369  
1370  	status = ice_read_sr_pointer(hw, ICE_SR_1ST_NVM_BANK_PTR, &banks->nvm_ptr);
1371  	if (status) {
1372  		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM bank pointer\n");
1373  		return status;
1374  	}
1375  
1376  	status = ice_read_sr_area_size(hw, ICE_SR_NVM_BANK_SIZE, &banks->nvm_size);
1377  	if (status) {
1378  		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM bank area size\n");
1379  		return status;
1380  	}
1381  
1382  	status = ice_read_sr_pointer(hw, ICE_SR_1ST_OROM_BANK_PTR, &banks->orom_ptr);
1383  	if (status) {
1384  		ice_debug(hw, ICE_DBG_NVM, "Failed to read OROM bank pointer\n");
1385  		return status;
1386  	}
1387  
1388  	status = ice_read_sr_area_size(hw, ICE_SR_OROM_BANK_SIZE, &banks->orom_size);
1389  	if (status) {
1390  		ice_debug(hw, ICE_DBG_NVM, "Failed to read OROM bank area size\n");
1391  		return status;
1392  	}
1393  
1394  	status = ice_read_sr_pointer(hw, ICE_SR_NETLIST_BANK_PTR, &banks->netlist_ptr);
1395  	if (status) {
1396  		ice_debug(hw, ICE_DBG_NVM, "Failed to read Netlist bank pointer\n");
1397  		return status;
1398  	}
1399  
1400  	status = ice_read_sr_area_size(hw, ICE_SR_NETLIST_BANK_SIZE, &banks->netlist_size);
1401  	if (status) {
1402  		ice_debug(hw, ICE_DBG_NVM, "Failed to read Netlist bank area size\n");
1403  		return status;
1404  	}
1405  
1406  	return 0;
1407  }
1408  
1409  /**
1410   * ice_init_nvm - initializes NVM setting
1411   * @hw: pointer to the HW struct
1412   *
1413   * This function reads and populates NVM settings such as Shadow RAM size,
1414   * max_timeout, and blank_nvm_mode
1415   */
1416  int ice_init_nvm(struct ice_hw *hw)
1417  {
1418  	struct ice_flash_info *flash = &hw->flash;
1419  	u32 fla, gens_stat;
1420  	u8 sr_size;
1421  	int status;
1422  
1423  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1424  
1425  	/* The SR size is stored regardless of the NVM programming mode
1426  	 * as the blank mode may be used in the factory line.
1427  	 */
1428  	gens_stat = rd32(hw, GLNVM_GENS);
1429  	sr_size = (gens_stat & GLNVM_GENS_SR_SIZE_M) >> GLNVM_GENS_SR_SIZE_S;
1430  
1431  	/* Switching to words (sr_size contains power of 2) */
1432  	flash->sr_words = BIT(sr_size) * ICE_SR_WORDS_IN_1KB;
1433  
1434  	/* Check if we are in the normal or blank NVM programming mode */
1435  	fla = rd32(hw, GLNVM_FLA);
1436  	if (fla & GLNVM_FLA_LOCKED_M) { /* Normal programming mode */
1437  		flash->blank_nvm_mode = false;
1438  	} else {
1439  		/* Blank programming mode */
1440  		flash->blank_nvm_mode = true;
1441  		ice_debug(hw, ICE_DBG_NVM, "NVM init error: unsupported blank mode.\n");
1442  		return ICE_ERR_NVM_BLANK_MODE;
1443  	}
1444  
1445  	status = ice_discover_flash_size(hw);
1446  	if (status) {
1447  		ice_debug(hw, ICE_DBG_NVM, "NVM init error: failed to discover flash size.\n");
1448  		return status;
1449  	}
1450  
1451  	status = ice_determine_active_flash_banks(hw);
1452  	if (status) {
1453  		ice_debug(hw, ICE_DBG_NVM, "Failed to determine active flash banks.\n");
1454  		return status;
1455  	}
1456  
1457  	status = ice_get_nvm_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->nvm);
1458  	if (status) {
1459  		ice_debug(hw, ICE_DBG_INIT, "Failed to read NVM info.\n");
1460  		return status;
1461  	}
1462  
1463  	status = ice_get_orom_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->orom);
1464  	if (status)
1465  		ice_debug(hw, ICE_DBG_INIT, "Failed to read Option ROM info.\n");
1466  
1467  	/* read the netlist version information */
1468  	status = ice_get_netlist_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->netlist);
1469  	if (status)
1470  		ice_debug(hw, ICE_DBG_INIT, "Failed to read netlist info.\n");
1471  
1472  	return 0;
1473  }
1474  
1475  /**
1476   * ice_read_sr_buf - Reads Shadow RAM buf and acquire lock if necessary
1477   * @hw: pointer to the HW structure
1478   * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
1479   * @words: (in) number of words to read; (out) number of words actually read
1480   * @data: words read from the Shadow RAM
1481   *
1482   * Reads 16 bit words (data buf) from the SR using the ice_read_nvm_buf_aq
1483   * method. The buf read is preceded by the NVM ownership take
1484   * and followed by the release.
1485   */
1486  int
1487  ice_read_sr_buf(struct ice_hw *hw, u16 offset, u16 *words, u16 *data)
1488  {
1489  	int status;
1490  
1491  	status = ice_acquire_nvm(hw, ICE_RES_READ);
1492  	if (!status) {
1493  		status = ice_read_sr_buf_aq(hw, offset, words, data);
1494  		ice_release_nvm(hw);
1495  	}
1496  
1497  	return status;
1498  }
1499  
1500  /**
1501   * __ice_write_sr_word - Writes Shadow RAM word
1502   * @hw: pointer to the HW structure
1503   * @offset: offset of the Shadow RAM word to write
1504   * @data: word to write to the Shadow RAM
1505   *
1506   * Writes a 16 bit word to the SR using the ice_write_sr_aq method.
1507   * NVM ownership have to be acquired and released (on ARQ completion event
1508   * reception) by caller. To commit SR to NVM update checksum function
1509   * should be called.
1510   */
1511  int
1512  __ice_write_sr_word(struct ice_hw *hw, u32 offset, const u16 *data)
1513  {
1514  	__le16 data_local = CPU_TO_LE16(*data);
1515  
1516  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1517  
1518  	/* Value 0x00 below means that we treat SR as a flat mem */
1519  	return ice_write_sr_aq(hw, offset, 1, &data_local, false);
1520  }
1521  
1522  /**
1523   * __ice_write_sr_buf - Writes Shadow RAM buf
1524   * @hw: pointer to the HW structure
1525   * @offset: offset of the Shadow RAM buffer to write
1526   * @words: number of words to write
1527   * @data: words to write to the Shadow RAM
1528   *
1529   * Writes a 16 bit words buffer to the Shadow RAM using the admin command.
1530   * NVM ownership must be acquired before calling this function and released
1531   * on ARQ completion event reception by caller. To commit SR to NVM update
1532   * checksum function should be called.
1533   */
1534  int
1535  __ice_write_sr_buf(struct ice_hw *hw, u32 offset, u16 words, const u16 *data)
1536  {
1537  	__le16 *data_local;
1538  	int status;
1539  	void *vmem;
1540  	u32 i;
1541  
1542  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1543  
1544  	vmem = ice_calloc(hw, words, sizeof(u16));
1545  	if (!vmem)
1546  		return ICE_ERR_NO_MEMORY;
1547  	data_local = (_FORCE_ __le16 *)vmem;
1548  
1549  	for (i = 0; i < words; i++)
1550  		data_local[i] = CPU_TO_LE16(data[i]);
1551  
1552  	/* Here we will only write one buffer as the size of the modules
1553  	 * mirrored in the Shadow RAM is always less than 4K.
1554  	 */
1555  	status = ice_write_sr_aq(hw, offset, words, data_local, false);
1556  
1557  	ice_free(hw, vmem);
1558  
1559  	return status;
1560  }
1561  
1562  /**
1563   * ice_calc_sr_checksum - Calculates and returns Shadow RAM SW checksum
1564   * @hw: pointer to hardware structure
1565   * @checksum: pointer to the checksum
1566   *
1567   * This function calculates SW Checksum that covers the whole 64kB shadow RAM
1568   * except the VPD and PCIe ALT Auto-load modules. The structure and size of VPD
1569   * is customer specific and unknown. Therefore, this function skips all maximum
1570   * possible size of VPD (1kB).
1571   */
1572  static int ice_calc_sr_checksum(struct ice_hw *hw, u16 *checksum)
1573  {
1574  	u16 pcie_alt_module = 0;
1575  	u16 checksum_local = 0;
1576  	u16 vpd_module;
1577  	int status = 0;
1578  	void *vmem;
1579  	u16 *data;
1580  	u16 i;
1581  
1582  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1583  
1584  	vmem = ice_calloc(hw, ICE_SR_SECTOR_SIZE_IN_WORDS, sizeof(u16));
1585  	if (!vmem)
1586  		return ICE_ERR_NO_MEMORY;
1587  	data = (u16 *)vmem;
1588  
1589  	/* read pointer to VPD area */
1590  	status = ice_read_sr_word_aq(hw, ICE_SR_VPD_PTR, &vpd_module);
1591  	if (status)
1592  		goto ice_calc_sr_checksum_exit;
1593  
1594  	/* read pointer to PCIe Alt Auto-load module */
1595  	status = ice_read_sr_word_aq(hw, ICE_SR_PCIE_ALT_AUTO_LOAD_PTR,
1596  				     &pcie_alt_module);
1597  	if (status)
1598  		goto ice_calc_sr_checksum_exit;
1599  
1600  	/* Calculate SW checksum that covers the whole 64kB shadow RAM
1601  	 * except the VPD and PCIe ALT Auto-load modules
1602  	 */
1603  	for (i = 0; i < hw->flash.sr_words; i++) {
1604  		/* Read SR page */
1605  		if ((i % ICE_SR_SECTOR_SIZE_IN_WORDS) == 0) {
1606  			u16 words = ICE_SR_SECTOR_SIZE_IN_WORDS;
1607  
1608  			status = ice_read_sr_buf_aq(hw, i, &words, data);
1609  			if (status)
1610  				goto ice_calc_sr_checksum_exit;
1611  		}
1612  
1613  		/* Skip Checksum word */
1614  		if (i == ICE_SR_SW_CHECKSUM_WORD)
1615  			continue;
1616  		/* Skip VPD module (convert byte size to word count) */
1617  		if (i >= (u32)vpd_module &&
1618  		    i < ((u32)vpd_module + ICE_SR_VPD_SIZE_WORDS))
1619  			continue;
1620  		/* Skip PCIe ALT module (convert byte size to word count) */
1621  		if (i >= (u32)pcie_alt_module &&
1622  		    i < ((u32)pcie_alt_module + ICE_SR_PCIE_ALT_SIZE_WORDS))
1623  			continue;
1624  
1625  		checksum_local += data[i % ICE_SR_SECTOR_SIZE_IN_WORDS];
1626  	}
1627  
1628  	*checksum = (u16)ICE_SR_SW_CHECKSUM_BASE - checksum_local;
1629  
1630  ice_calc_sr_checksum_exit:
1631  	ice_free(hw, vmem);
1632  	return status;
1633  }
1634  
1635  /**
1636   * ice_update_sr_checksum - Updates the Shadow RAM SW checksum
1637   * @hw: pointer to hardware structure
1638   *
1639   * NVM ownership must be acquired before calling this function and released
1640   * on ARQ completion event reception by caller.
1641   * This function will commit SR to NVM.
1642   */
1643  int ice_update_sr_checksum(struct ice_hw *hw)
1644  {
1645  	__le16 le_sum;
1646  	u16 checksum;
1647  	int status;
1648  
1649  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1650  
1651  	status = ice_calc_sr_checksum(hw, &checksum);
1652  	if (!status) {
1653  		le_sum = CPU_TO_LE16(checksum);
1654  		status = ice_write_sr_aq(hw, ICE_SR_SW_CHECKSUM_WORD, 1,
1655  					 &le_sum, true);
1656  	}
1657  	return status;
1658  }
1659  
1660  /**
1661   * ice_validate_sr_checksum - Validate Shadow RAM SW checksum
1662   * @hw: pointer to hardware structure
1663   * @checksum: calculated checksum
1664   *
1665   * Performs checksum calculation and validates the Shadow RAM SW checksum.
1666   * If the caller does not need checksum, the value can be NULL.
1667   */
1668  int ice_validate_sr_checksum(struct ice_hw *hw, u16 *checksum)
1669  {
1670  	u16 checksum_local;
1671  	u16 checksum_sr;
1672  	int status;
1673  
1674  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1675  
1676  	status = ice_acquire_nvm(hw, ICE_RES_READ);
1677  	if (!status) {
1678  		status = ice_calc_sr_checksum(hw, &checksum_local);
1679  		ice_release_nvm(hw);
1680  		if (status)
1681  			return status;
1682  	} else {
1683  		return status;
1684  	}
1685  
1686  	ice_read_sr_word(hw, ICE_SR_SW_CHECKSUM_WORD, &checksum_sr);
1687  
1688  	/* Verify read checksum from EEPROM is the same as
1689  	 * calculated checksum
1690  	 */
1691  	if (checksum_local != checksum_sr)
1692  		status = ICE_ERR_NVM_CHECKSUM;
1693  
1694  	/* If the user cares, return the calculated checksum */
1695  	if (checksum)
1696  		*checksum = checksum_local;
1697  
1698  	return status;
1699  }
1700  
1701  /**
1702   * ice_nvm_validate_checksum
1703   * @hw: pointer to the HW struct
1704   *
1705   * Verify NVM PFA checksum validity (0x0706)
1706   */
1707  int ice_nvm_validate_checksum(struct ice_hw *hw)
1708  {
1709  	struct ice_aqc_nvm_checksum *cmd;
1710  	struct ice_aq_desc desc;
1711  	int status;
1712  
1713  	status = ice_acquire_nvm(hw, ICE_RES_READ);
1714  	if (status)
1715  		return status;
1716  
1717  	cmd = &desc.params.nvm_checksum;
1718  
1719  	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_checksum);
1720  	cmd->flags = ICE_AQC_NVM_CHECKSUM_VERIFY;
1721  
1722  	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1723  	ice_release_nvm(hw);
1724  
1725  	if (!status)
1726  		if (LE16_TO_CPU(cmd->checksum) != ICE_AQC_NVM_CHECKSUM_CORRECT)
1727  			status = ICE_ERR_NVM_CHECKSUM;
1728  
1729  	return status;
1730  }
1731  
1732  /**
1733   * ice_nvm_recalculate_checksum
1734   * @hw: pointer to the HW struct
1735   *
1736   * Recalculate NVM PFA checksum (0x0706)
1737   */
1738  int ice_nvm_recalculate_checksum(struct ice_hw *hw)
1739  {
1740  	struct ice_aqc_nvm_checksum *cmd;
1741  	struct ice_aq_desc desc;
1742  	int status;
1743  
1744  	status = ice_acquire_nvm(hw, ICE_RES_READ);
1745  	if (status)
1746  		return status;
1747  
1748  	cmd = &desc.params.nvm_checksum;
1749  
1750  	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_checksum);
1751  	cmd->flags = ICE_AQC_NVM_CHECKSUM_RECALC;
1752  
1753  	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1754  
1755  	ice_release_nvm(hw);
1756  
1757  	return status;
1758  }
1759  
1760  /**
1761   * ice_nvm_write_activate
1762   * @hw: pointer to the HW struct
1763   * @cmd_flags: flags for write activate command
1764   * @response_flags: response indicators from firmware
1765   *
1766   * Update the control word with the required banks' validity bits
1767   * and dumps the Shadow RAM to flash (0x0707)
1768   *
1769   * cmd_flags controls which banks to activate, the preservation level to use
1770   * when activating the NVM bank, and whether an EMP reset is required for
1771   * activation.
1772   *
1773   * Note that the 16bit cmd_flags value is split between two separate 1 byte
1774   * flag values in the descriptor.
1775   *
1776   * On successful return of the firmware command, the response_flags variable
1777   * is updated with the flags reported by firmware indicating certain status,
1778   * such as whether EMP reset is enabled.
1779   */
1780  int ice_nvm_write_activate(struct ice_hw *hw, u16 cmd_flags, u8 *response_flags)
1781  {
1782  	struct ice_aqc_nvm *cmd;
1783  	struct ice_aq_desc desc;
1784  	int err;
1785  
1786  	cmd = &desc.params.nvm;
1787  	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_write_activate);
1788  
1789  	cmd->cmd_flags = (u8)(cmd_flags & 0xFF);
1790  	cmd->offset_high = (u8)((cmd_flags >> 8) & 0xFF);
1791  
1792  	err = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
1793  	if (!err && response_flags)
1794  		*response_flags = cmd->cmd_flags;
1795  
1796  	return err;
1797  }
1798  
1799  /**
1800   * ice_get_nvm_minsrevs - Get the Minimum Security Revision values from flash
1801   * @hw: pointer to the HW struct
1802   * @minsrevs: structure to store NVM and OROM minsrev values
1803   *
1804   * Read the Minimum Security Revision TLV and extract the revision values from
1805   * the flash image into a readable structure for processing.
1806   */
1807  int
1808  ice_get_nvm_minsrevs(struct ice_hw *hw, struct ice_minsrev_info *minsrevs)
1809  {
1810  	struct ice_aqc_nvm_minsrev data;
1811  	int status;
1812  	u16 valid;
1813  
1814  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1815  
1816  	status = ice_acquire_nvm(hw, ICE_RES_READ);
1817  	if (status)
1818  		return status;
1819  
1820  	status = ice_aq_read_nvm(hw, ICE_AQC_NVM_MINSREV_MOD_ID, 0, sizeof(data),
1821  				 &data, true, false, NULL);
1822  
1823  	ice_release_nvm(hw);
1824  
1825  	if (status)
1826  		return status;
1827  
1828  	valid = LE16_TO_CPU(data.validity);
1829  
1830  	/* Extract NVM minimum security revision */
1831  	if (valid & ICE_AQC_NVM_MINSREV_NVM_VALID) {
1832  		u16 minsrev_l, minsrev_h;
1833  
1834  		minsrev_l = LE16_TO_CPU(data.nvm_minsrev_l);
1835  		minsrev_h = LE16_TO_CPU(data.nvm_minsrev_h);
1836  
1837  		minsrevs->nvm = minsrev_h << 16 | minsrev_l;
1838  		minsrevs->nvm_valid = true;
1839  	}
1840  
1841  	/* Extract the OROM minimum security revision */
1842  	if (valid & ICE_AQC_NVM_MINSREV_OROM_VALID) {
1843  		u16 minsrev_l, minsrev_h;
1844  
1845  		minsrev_l = LE16_TO_CPU(data.orom_minsrev_l);
1846  		minsrev_h = LE16_TO_CPU(data.orom_minsrev_h);
1847  
1848  		minsrevs->orom = minsrev_h << 16 | minsrev_l;
1849  		minsrevs->orom_valid = true;
1850  	}
1851  
1852  	return 0;
1853  }
1854  
1855  /**
1856   * ice_update_nvm_minsrevs - Update minimum security revision TLV data in flash
1857   * @hw: pointer to the HW struct
1858   * @minsrevs: minimum security revision information
1859   *
1860   * Update the NVM or Option ROM minimum security revision fields in the PFA
1861   * area of the flash. Reads the minsrevs->nvm_valid and minsrevs->orom_valid
1862   * fields to determine what update is being requested. If the valid bit is not
1863   * set for that module, then the associated minsrev will be left as is.
1864   */
1865  int
1866  ice_update_nvm_minsrevs(struct ice_hw *hw, struct ice_minsrev_info *minsrevs)
1867  {
1868  	struct ice_aqc_nvm_minsrev data;
1869  	int status;
1870  
1871  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
1872  
1873  	if (!minsrevs->nvm_valid && !minsrevs->orom_valid) {
1874  		ice_debug(hw, ICE_DBG_NVM, "At least one of NVM and OROM MinSrev must be valid");
1875  		return ICE_ERR_PARAM;
1876  	}
1877  
1878  	status = ice_acquire_nvm(hw, ICE_RES_WRITE);
1879  	if (status)
1880  		return status;
1881  
1882  	/* Get current data */
1883  	status = ice_aq_read_nvm(hw, ICE_AQC_NVM_MINSREV_MOD_ID, 0, sizeof(data),
1884  				 &data, true, false, NULL);
1885  	if (status)
1886  		goto exit_release_res;
1887  
1888  	if (minsrevs->nvm_valid) {
1889  		data.nvm_minsrev_l = CPU_TO_LE16(minsrevs->nvm & 0xFFFF);
1890  		data.nvm_minsrev_h = CPU_TO_LE16(minsrevs->nvm >> 16);
1891  		data.validity |= CPU_TO_LE16(ICE_AQC_NVM_MINSREV_NVM_VALID);
1892  	}
1893  
1894  	if (minsrevs->orom_valid) {
1895  		data.orom_minsrev_l = CPU_TO_LE16(minsrevs->orom & 0xFFFF);
1896  		data.orom_minsrev_h = CPU_TO_LE16(minsrevs->orom >> 16);
1897  		data.validity |= CPU_TO_LE16(ICE_AQC_NVM_MINSREV_OROM_VALID);
1898  	}
1899  
1900  	/* Update flash data */
1901  	status = ice_aq_update_nvm(hw, ICE_AQC_NVM_MINSREV_MOD_ID, 0, sizeof(data), &data,
1902  				   false, ICE_AQC_NVM_SPECIAL_UPDATE, NULL);
1903  	if (status)
1904  		goto exit_release_res;
1905  
1906  	/* Dump the Shadow RAM to the flash */
1907  	status = ice_nvm_write_activate(hw, 0, NULL);
1908  
1909  exit_release_res:
1910  	ice_release_nvm(hw);
1911  
1912  	return status;
1913  }
1914  
1915  /**
1916   * ice_nvm_access_get_features - Return the NVM access features structure
1917   * @cmd: NVM access command to process
1918   * @data: storage for the driver NVM features
1919   *
1920   * Fill in the data section of the NVM access request with a copy of the NVM
1921   * features structure.
1922   */
1923  int
1924  ice_nvm_access_get_features(struct ice_nvm_access_cmd *cmd,
1925  			    union ice_nvm_access_data *data)
1926  {
1927  	/* The provided data_size must be at least as large as our NVM
1928  	 * features structure. A larger size should not be treated as an
1929  	 * error, to allow future extensions to the features structure to
1930  	 * work on older drivers.
1931  	 */
1932  	if (cmd->data_size < sizeof(struct ice_nvm_features))
1933  		return ICE_ERR_NO_MEMORY;
1934  
1935  	/* Initialize the data buffer to zeros */
1936  	ice_memset(data, 0, cmd->data_size, ICE_NONDMA_MEM);
1937  
1938  	/* Fill in the features data */
1939  	data->drv_features.major = ICE_NVM_ACCESS_MAJOR_VER;
1940  	data->drv_features.minor = ICE_NVM_ACCESS_MINOR_VER;
1941  	data->drv_features.size = sizeof(struct ice_nvm_features);
1942  	data->drv_features.features[0] = ICE_NVM_FEATURES_0_REG_ACCESS;
1943  
1944  	return 0;
1945  }
1946  
1947  /**
1948   * ice_nvm_access_get_module - Helper function to read module value
1949   * @cmd: NVM access command structure
1950   *
1951   * Reads the module value out of the NVM access config field.
1952   */
1953  u32 ice_nvm_access_get_module(struct ice_nvm_access_cmd *cmd)
1954  {
1955  	return ((cmd->config & ICE_NVM_CFG_MODULE_M) >> ICE_NVM_CFG_MODULE_S);
1956  }
1957  
1958  /**
1959   * ice_nvm_access_get_flags - Helper function to read flags value
1960   * @cmd: NVM access command structure
1961   *
1962   * Reads the flags value out of the NVM access config field.
1963   */
1964  u32 ice_nvm_access_get_flags(struct ice_nvm_access_cmd *cmd)
1965  {
1966  	return ((cmd->config & ICE_NVM_CFG_FLAGS_M) >> ICE_NVM_CFG_FLAGS_S);
1967  }
1968  
1969  /**
1970   * ice_nvm_access_get_adapter - Helper function to read adapter info
1971   * @cmd: NVM access command structure
1972   *
1973   * Read the adapter info value out of the NVM access config field.
1974   */
1975  u32 ice_nvm_access_get_adapter(struct ice_nvm_access_cmd *cmd)
1976  {
1977  	return ((cmd->config & ICE_NVM_CFG_ADAPTER_INFO_M) >>
1978  		ICE_NVM_CFG_ADAPTER_INFO_S);
1979  }
1980  
1981  /**
1982   * ice_validate_nvm_rw_reg - Check than an NVM access request is valid
1983   * @cmd: NVM access command structure
1984   *
1985   * Validates that an NVM access structure is request to read or write a valid
1986   * register offset. First validates that the module and flags are correct, and
1987   * then ensures that the register offset is one of the accepted registers.
1988   */
1989  static int
1990  ice_validate_nvm_rw_reg(struct ice_nvm_access_cmd *cmd)
1991  {
1992  	u32 module, flags, offset;
1993  	u16 i;
1994  
1995  	module = ice_nvm_access_get_module(cmd);
1996  	flags = ice_nvm_access_get_flags(cmd);
1997  	offset = cmd->offset;
1998  
1999  	/* Make sure the module and flags indicate a read/write request */
2000  	if (module != ICE_NVM_REG_RW_MODULE ||
2001  	    flags != ICE_NVM_REG_RW_FLAGS ||
2002  	    cmd->data_size != FIELD_SIZEOF(union ice_nvm_access_data, regval))
2003  		return ICE_ERR_PARAM;
2004  
2005  	switch (offset) {
2006  	case GL_HICR:
2007  	case GL_HICR_EN: /* Note, this register is read only */
2008  	case GL_FWSTS:
2009  	case GL_MNG_FWSM:
2010  	case GLGEN_CSR_DEBUG_C:
2011  	case GLGEN_RSTAT:
2012  	case GLPCI_LBARCTRL:
2013  	case GL_MNG_DEF_DEVID:
2014  	case GLNVM_GENS:
2015  	case GLNVM_FLA:
2016  	case PF_FUNC_RID:
2017  		return 0;
2018  	default:
2019  		break;
2020  	}
2021  
2022  	for (i = 0; i <= GL_HIDA_MAX_INDEX; i++)
2023  		if (offset == (u32)GL_HIDA(i))
2024  			return 0;
2025  
2026  	for (i = 0; i <= GL_HIBA_MAX_INDEX; i++)
2027  		if (offset == (u32)GL_HIBA(i))
2028  			return 0;
2029  
2030  	/* All other register offsets are not valid */
2031  	return ICE_ERR_OUT_OF_RANGE;
2032  }
2033  
2034  /**
2035   * ice_nvm_access_read - Handle an NVM read request
2036   * @hw: pointer to the HW struct
2037   * @cmd: NVM access command to process
2038   * @data: storage for the register value read
2039   *
2040   * Process an NVM access request to read a register.
2041   */
2042  int
2043  ice_nvm_access_read(struct ice_hw *hw, struct ice_nvm_access_cmd *cmd,
2044  		    union ice_nvm_access_data *data)
2045  {
2046  	int status;
2047  
2048  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
2049  
2050  	/* Always initialize the output data, even on failure */
2051  	ice_memset(data, 0, cmd->data_size, ICE_NONDMA_MEM);
2052  
2053  	/* Make sure this is a valid read/write access request */
2054  	status = ice_validate_nvm_rw_reg(cmd);
2055  	if (status)
2056  		return status;
2057  
2058  	ice_debug(hw, ICE_DBG_NVM, "NVM access: reading register %08x\n",
2059  		  cmd->offset);
2060  
2061  	/* Read the register and store the contents in the data field */
2062  	data->regval = rd32(hw, cmd->offset);
2063  
2064  	return 0;
2065  }
2066  
2067  /**
2068   * ice_nvm_access_write - Handle an NVM write request
2069   * @hw: pointer to the HW struct
2070   * @cmd: NVM access command to process
2071   * @data: NVM access data to write
2072   *
2073   * Process an NVM access request to write a register.
2074   */
2075  int
2076  ice_nvm_access_write(struct ice_hw *hw, struct ice_nvm_access_cmd *cmd,
2077  		     union ice_nvm_access_data *data)
2078  {
2079  	int status;
2080  
2081  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
2082  
2083  	/* Make sure this is a valid read/write access request */
2084  	status = ice_validate_nvm_rw_reg(cmd);
2085  	if (status)
2086  		return status;
2087  
2088  	/* Reject requests to write to read-only registers */
2089  	if (hw->mac_type == ICE_MAC_E830) {
2090  		if (cmd->offset == E830_GL_HICR_EN)
2091  			return ICE_ERR_OUT_OF_RANGE;
2092  	} else {
2093  		if (cmd->offset == GL_HICR_EN)
2094  			return ICE_ERR_OUT_OF_RANGE;
2095  	}
2096  
2097  	if (cmd->offset == GLGEN_RSTAT)
2098  		return ICE_ERR_OUT_OF_RANGE;
2099  
2100  	ice_debug(hw, ICE_DBG_NVM, "NVM access: writing register %08x with value %08x\n",
2101  		  cmd->offset, data->regval);
2102  
2103  	/* Write the data field to the specified register */
2104  	wr32(hw, cmd->offset, data->regval);
2105  
2106  	return 0;
2107  }
2108  
2109  /**
2110   * ice_handle_nvm_access - Handle an NVM access request
2111   * @hw: pointer to the HW struct
2112   * @cmd: NVM access command info
2113   * @data: pointer to read or return data
2114   *
2115   * Process an NVM access request. Read the command structure information and
2116   * determine if it is valid. If not, report an error indicating the command
2117   * was invalid.
2118   *
2119   * For valid commands, perform the necessary function, copying the data into
2120   * the provided data buffer.
2121   */
2122  int
2123  ice_handle_nvm_access(struct ice_hw *hw, struct ice_nvm_access_cmd *cmd,
2124  		      union ice_nvm_access_data *data)
2125  {
2126  	u32 module, flags, adapter_info;
2127  
2128  	ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
2129  
2130  	/* Extended flags are currently reserved and must be zero */
2131  	if ((cmd->config & ICE_NVM_CFG_EXT_FLAGS_M) != 0)
2132  		return ICE_ERR_PARAM;
2133  
2134  	/* Adapter info must match the HW device ID */
2135  	adapter_info = ice_nvm_access_get_adapter(cmd);
2136  	if (adapter_info != hw->device_id)
2137  		return ICE_ERR_PARAM;
2138  
2139  	switch (cmd->command) {
2140  	case ICE_NVM_CMD_READ:
2141  		module = ice_nvm_access_get_module(cmd);
2142  		flags = ice_nvm_access_get_flags(cmd);
2143  
2144  		/* Getting the driver's NVM features structure shares the same
2145  		 * command type as reading a register. Read the config field
2146  		 * to determine if this is a request to get features.
2147  		 */
2148  		if (module == ICE_NVM_GET_FEATURES_MODULE &&
2149  		    flags == ICE_NVM_GET_FEATURES_FLAGS &&
2150  		    cmd->offset == 0)
2151  			return ice_nvm_access_get_features(cmd, data);
2152  		else
2153  			return ice_nvm_access_read(hw, cmd, data);
2154  	case ICE_NVM_CMD_WRITE:
2155  		return ice_nvm_access_write(hw, cmd, data);
2156  	default:
2157  		return ICE_ERR_PARAM;
2158  	}
2159  }
2160  
2161  /**
2162   * ice_nvm_sanitize_operate - Clear the user data
2163   * @hw: pointer to the HW struct
2164   *
2165   * Clear user data from NVM using AQ command (0x070C).
2166   *
2167   * Return: the exit code of the operation.
2168   */
2169  s32 ice_nvm_sanitize_operate(struct ice_hw *hw)
2170  {
2171  	s32 status;
2172  	u8 values;
2173  
2174  	u8 cmd_flags = ICE_AQ_NVM_SANITIZE_REQ_OPERATE |
2175  		       ICE_AQ_NVM_SANITIZE_OPERATE_SUBJECT_CLEAR;
2176  
2177  	status = ice_nvm_sanitize(hw, cmd_flags, &values);
2178  	if (status)
2179  		return status;
2180  	if ((!(values & ICE_AQ_NVM_SANITIZE_OPERATE_HOST_CLEAN_DONE) &&
2181  	     !(values & ICE_AQ_NVM_SANITIZE_OPERATE_BMC_CLEAN_DONE)) ||
2182  	    ((values & ICE_AQ_NVM_SANITIZE_OPERATE_HOST_CLEAN_DONE) &&
2183  	     !(values & ICE_AQ_NVM_SANITIZE_OPERATE_HOST_CLEAN_SUCCESS)) ||
2184  	    ((values & ICE_AQ_NVM_SANITIZE_OPERATE_BMC_CLEAN_DONE) &&
2185  	     !(values & ICE_AQ_NVM_SANITIZE_OPERATE_BMC_CLEAN_SUCCESS)))
2186  		return ICE_ERR_AQ_ERROR;
2187  
2188  	return ICE_SUCCESS;
2189  }
2190  
2191  /**
2192   * ice_nvm_sanitize - Sanitize NVM
2193   * @hw: pointer to the HW struct
2194   * @cmd_flags: flag to the ACI command
2195   * @values: values returned from the command
2196   *
2197   * Sanitize NVM using AQ command (0x070C).
2198   *
2199   * Return: the exit code of the operation.
2200   */
2201  s32 ice_nvm_sanitize(struct ice_hw *hw, u8 cmd_flags, u8 *values)
2202  {
2203  	struct ice_aqc_nvm_sanitization *cmd;
2204  	struct ice_aq_desc desc;
2205  	s32 status;
2206  
2207  	cmd = &desc.params.sanitization;
2208  	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_sanitization);
2209  	cmd->cmd_flags = cmd_flags;
2210  
2211  	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2212  	if (values)
2213  		*values = cmd->values;
2214  
2215  	return status;
2216  }
2217