The CSS Header length is defined as ICE_CSS_HEADER_LENGTH. To
support changes in CSS Header length, calculate the CSS Header
length from the NVM CSS Header length field plus the Authentication
Header length.

Signed-off-by: Paul Greenwalt <paul.greenw...@intel.com>
Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
---
 drivers/net/ice/base/ice_nvm.c  | 61 +++++++++++++++++++++++++++++----
 drivers/net/ice/base/ice_type.h | 12 +++----
 2 files changed, 59 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ice/base/ice_nvm.c b/drivers/net/ice/base/ice_nvm.c
index 7860006206..ad2496e873 100644
--- a/drivers/net/ice/base/ice_nvm.c
+++ b/drivers/net/ice/base/ice_nvm.c
@@ -350,6 +350,42 @@ ice_read_nvm_module(struct ice_hw *hw, enum 
ice_bank_select bank, u32 offset, u1
        return status;
 }
 
+/**
+ * ice_get_nvm_css_hdr_len - Read the CSS header length from the NVM CSS header
+ * @hw: pointer to the HW struct
+ * @bank: whether to read from the active or inactive flash bank
+ * @hdr_len: storage for header length in words
+ *
+ * Read the CSS header length from the NVM CSS header and add the 
Authentication
+ * header size, and then convert to words.
+ */
+static enum ice_status
+ice_get_nvm_css_hdr_len(struct ice_hw *hw, enum ice_bank_select bank,
+                       u32 *hdr_len)
+{
+       u16 hdr_len_l, hdr_len_h;
+       enum ice_status status;
+       u32 hdr_len_dword;
+
+       status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_L,
+                                    &hdr_len_l);
+       if (status)
+               return status;
+
+       status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_H,
+                                    &hdr_len_h);
+       if (status)
+               return status;
+
+       /* CSS header length is in DWORD, so convert to words and add
+        * authentication header size
+        */
+       hdr_len_dword = hdr_len_h << 16 | hdr_len_l;
+       *hdr_len = (hdr_len_dword * 2) + ICE_NVM_AUTH_HEADER_LEN;
+
+       return ICE_SUCCESS;
+}
+
 /**
  * ice_read_nvm_sr_copy - Read a word from the Shadow RAM copy in the NVM bank
  * @hw: pointer to the HW structure
@@ -363,7 +399,16 @@ ice_read_nvm_module(struct ice_hw *hw, enum 
ice_bank_select bank, u32 offset, u1
 static enum ice_status
 ice_read_nvm_sr_copy(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, 
u16 *data)
 {
-       return ice_read_nvm_module(hw, bank, ICE_NVM_SR_COPY_WORD_OFFSET + 
offset, data);
+       enum ice_status status;
+       u32 hdr_len;
+
+       status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len);
+       if (status)
+               return status;
+
+       hdr_len = ROUND_UP(hdr_len, 32);
+
+       return ice_read_nvm_module(hw, bank, hdr_len + offset, data);
 }
 
 /**
@@ -633,22 +678,26 @@ enum ice_status ice_get_inactive_nvm_ver(struct ice_hw 
*hw, struct ice_nvm_info
  */
 static enum ice_status ice_get_orom_srev(struct ice_hw *hw, enum 
ice_bank_select bank, u32 *srev)
 {
+       u32 orom_size_word = hw->flash.banks.orom_size / 2;
        enum ice_status status;
        u16 srev_l, srev_h;
        u32 css_start;
+       u32 hdr_len;
 
-       if (hw->flash.banks.orom_size < ICE_NVM_OROM_TRAILER_LENGTH) {
+       status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len);
+       if (status)
+               return status;
+
+       if (orom_size_word < hdr_len) {
                ice_debug(hw, ICE_DBG_NVM, "Unexpected Option ROM Size of %u\n",
                          hw->flash.banks.orom_size);
                return ICE_ERR_CFG;
        }
 
        /* calculate how far into the Option ROM the CSS header starts. Note
-        * that ice_read_orom_module takes a word offset so we need to
-        * divide by 2 here.
+        * that ice_read_orom_module takes a word offset
         */
-       css_start = (hw->flash.banks.orom_size - ICE_NVM_OROM_TRAILER_LENGTH) / 
2;
-
+       css_start = orom_size_word - hdr_len;
        status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_L, 
&srev_l);
        if (status)
                return status;
diff --git a/drivers/net/ice/base/ice_type.h b/drivers/net/ice/base/ice_type.h
index d81984633a..d4d0cab089 100644
--- a/drivers/net/ice/base/ice_type.h
+++ b/drivers/net/ice/base/ice_type.h
@@ -1419,17 +1419,13 @@ struct ice_aq_get_set_rss_lut_params {
 #define ICE_SR_POR_REGISTERS_AUTOLOAD_PTR      0x118
 
 /* CSS Header words */
+#define ICE_NVM_CSS_HDR_LEN_L                  0x02
+#define ICE_NVM_CSS_HDR_LEN_H                  0x03
 #define ICE_NVM_CSS_SREV_L                     0x14
 #define ICE_NVM_CSS_SREV_H                     0x15
 
-/* Length of CSS header section in words */
-#define ICE_CSS_HEADER_LENGTH                  330
-
-/* Offset of Shadow RAM copy in the NVM bank area. */
-#define ICE_NVM_SR_COPY_WORD_OFFSET            ROUND_UP(ICE_CSS_HEADER_LENGTH, 
32)
-
-/* Size in bytes of Option ROM trailer */
-#define ICE_NVM_OROM_TRAILER_LENGTH            (2 * ICE_CSS_HEADER_LENGTH)
+/* Length of Authentication header section in words */
+#define ICE_NVM_AUTH_HEADER_LEN                        0x08
 
 /* The Link Topology Netlist section is stored as a series of words. It is
  * stored in the NVM as a TLV, with the first two words containing the type
-- 
2.31.1

Reply via email to