net/ice/base: update Boot Configuration Section read of NVM
[dpdk.git] / drivers / net / ice / base / ice_nvm.c
index c0f9e35..95a6c9a 100644 (file)
@@ -263,9 +263,9 @@ enum ice_status ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
 enum ice_status ice_init_nvm(struct ice_hw *hw)
 {
        struct ice_nvm_info *nvm = &hw->nvm;
-       u16 oem_hi, oem_lo, cfg_ptr;
+       u16 oem_hi, oem_lo, boot_cfg_tlv, boot_cfg_tlv_len;
        u16 eetrack_lo, eetrack_hi;
-       enum ice_status status = ICE_SUCCESS;
+       enum ice_status status;
        u32 fla, gens_stat;
        u8 sr_size;
 
@@ -284,12 +284,12 @@ enum ice_status ice_init_nvm(struct ice_hw *hw)
        fla = rd32(hw, GLNVM_FLA);
        if (fla & GLNVM_FLA_LOCKED_M) { /* Normal programming mode */
                nvm->blank_nvm_mode = false;
-       } else { /* Blank programming mode */
+       } else {
+               /* Blank programming mode */
                nvm->blank_nvm_mode = true;
-               status = ICE_ERR_NVM_BLANK_MODE;
                ice_debug(hw, ICE_DBG_NVM,
                          "NVM init error: unsupported blank mode.\n");
-               return status;
+               return ICE_ERR_NVM_BLANK_MODE;
        }
 
        status = ice_read_sr_word(hw, ICE_SR_NVM_DEV_STARTER_VER, &nvm->ver);
@@ -312,19 +312,37 @@ enum ice_status ice_init_nvm(struct ice_hw *hw)
 
        nvm->eetrack = (eetrack_hi << 16) | eetrack_lo;
 
-       status = ice_read_sr_word(hw, ICE_SR_BOOT_CFG_PTR, &cfg_ptr);
+       /* the following devices do not have boot_cfg_tlv yet */
+       if (hw->device_id == ICE_DEV_ID_C822N_BACKPLANE ||
+           hw->device_id == ICE_DEV_ID_C822N_QSFP ||
+           hw->device_id == ICE_DEV_ID_C822N_SFP)
+               return status;
+
+       status = ice_get_pfa_module_tlv(hw, &boot_cfg_tlv, &boot_cfg_tlv_len,
+                                       ICE_SR_BOOT_CFG_PTR);
        if (status) {
-               ice_debug(hw, ICE_DBG_INIT, "Failed to read BOOT_CONFIG_PTR.\n");
+               ice_debug(hw, ICE_DBG_INIT,
+                         "Failed to read Boot Configuration Block TLV.\n");
                return status;
        }
 
-       status = ice_read_sr_word(hw, (cfg_ptr + ICE_NVM_OEM_VER_OFF), &oem_hi);
+       /* Boot Configuration Block must have length at least 2 words
+        * (Combo Image Version High and Combo Image Version Low)
+        */
+       if (boot_cfg_tlv_len < 2) {
+               ice_debug(hw, ICE_DBG_INIT,
+                         "Invalid Boot Configuration Block TLV size.\n");
+               return ICE_ERR_INVAL_SIZE;
+       }
+
+       status = ice_read_sr_word(hw, (boot_cfg_tlv + ICE_NVM_OEM_VER_OFF),
+                                 &oem_hi);
        if (status) {
                ice_debug(hw, ICE_DBG_INIT, "Failed to read OEM_VER hi.\n");
                return status;
        }
 
-       status = ice_read_sr_word(hw, (cfg_ptr + (ICE_NVM_OEM_VER_OFF + 1)),
+       status = ice_read_sr_word(hw, (boot_cfg_tlv + ICE_NVM_OEM_VER_OFF + 1),
                                  &oem_lo);
        if (status) {
                ice_debug(hw, ICE_DBG_INIT, "Failed to read OEM_VER lo.\n");
@@ -332,7 +350,8 @@ enum ice_status ice_init_nvm(struct ice_hw *hw)
        }
 
        nvm->oem_ver = ((u32)oem_hi << 16) | oem_lo;
-       return status;
+
+       return ICE_SUCCESS;
 }