The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ice/ice_nvm.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: dea48e26c4bbeabaac205884fbc77959


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.