net/ice/base: enhance NVM read
authorQi Zhang <qi.z.zhang@intel.com>
Thu, 29 Aug 2019 02:35:54 +0000 (10:35 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 7 Oct 2019 13:00:52 +0000 (15:00 +0200)
Add an option to read NVM from flash directly.

Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Xiaolong Ye <xiaolong.ye@intel.com>
drivers/net/ice/base/ice_adminq_cmd.h
drivers/net/ice/base/ice_dcb.h
drivers/net/ice/base/ice_nvm.c

index 7afdb65..b5faa5b 100644 (file)
@@ -1684,6 +1684,28 @@ struct ice_aqc_nvm {
        __le32 addr_low;
 };
 
+/* NVM Module_Type ID, needed offset and read_len for struct ice_aqc_nvm. */
+#define ICE_AQC_NVM_SECTOR_UNIT                        4096 /* In Bytes */
+#define ICE_AQC_NVM_WORD_UNIT                  2 /* In Bytes */
+
+#define ICE_AQC_NVM_START_POINT                        0
+#define ICE_AQC_NVM_EMP_SR_PTR_OFFSET          0x90
+#define ICE_AQC_NVM_EMP_SR_PTR_RD_LEN          2 /* In Bytes */
+#define ICE_AQC_NVM_EMP_SR_PTR_M               MAKEMASK(0x7FFF, 0)
+#define ICE_AQC_NVM_EMP_SR_PTR_TYPE_S          15
+#define ICE_AQC_NVM_EMP_SR_PTR_TYPE_M          BIT(15)
+#define ICE_AQC_NVM_EMP_SR_PTR_TYPE_SECTOR     1
+
+#define ICE_AQC_NVM_LLDP_CFG_PTR_OFFSET                0x46
+#define ICE_AQC_NVM_LLDP_CFG_HEADER_LEN                2 /* In Bytes */
+#define ICE_AQC_NVM_LLDP_CFG_PTR_RD_LEN                2 /* In Bytes */
+
+#define ICE_AQC_NVM_LLDP_PRESERVED_MOD_ID      0x129
+#define ICE_AQC_NVM_CUR_LLDP_PERSIST_RD_OFFSET 2 /* In Bytes */
+#define ICE_AQC_NVM_LLDP_STATUS_M              MAKEMASK(0xF, 0)
+#define ICE_AQC_NVM_LLDP_STATUS_M_LEN          4 /* In Bits */
+#define ICE_AQC_NVM_LLDP_STATUS_RD_LEN         4 /* In Bytes */
+
 
 /* Used for 0x0704 as well as for 0x0705 commands */
 struct ice_aqc_nvm_cfg {
index 4712709..9a0968f 100644 (file)
@@ -6,6 +6,7 @@
 #define _ICE_DCB_H_
 
 #include "ice_type.h"
+#include "ice_common.h"
 
 #define ICE_DCBX_OFFLOAD_DIS           0
 #define ICE_DCBX_OFFLOAD_ENABLED       1
index 6178cd4..f4567ca 100644 (file)
  * @length: length of the section to be read (in bytes from the offset)
  * @data: command buffer (size [bytes] = length)
  * @last_command: tells if this is the last command in a series
+ * @read_shadow_ram: tell if this is a shadow RAM read
  * @cd: pointer to command details structure or NULL
  *
  * Read the NVM using the admin queue commands (0x0701)
  */
 static enum ice_status
 ice_aq_read_nvm(struct ice_hw *hw, u16 module_typeid, u32 offset, u16 length,
-               void *data, bool last_command, struct ice_sq_cd *cd)
+               void *data, bool last_command, bool read_shadow_ram,
+               struct ice_sq_cd *cd)
 {
        struct ice_aq_desc desc;
        struct ice_aqc_nvm *cmd;
@@ -34,6 +36,9 @@ ice_aq_read_nvm(struct ice_hw *hw, u16 module_typeid, u32 offset, u16 length,
 
        ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_read);
 
+       if (!read_shadow_ram && module_typeid == ICE_AQC_NVM_START_POINT)
+               cmd->cmd_flags |= ICE_AQC_NVM_FLASH_ONLY;
+
        /* If this is the last command in a series, set the proper flag. */
        if (last_command)
                cmd->cmd_flags |= ICE_AQC_NVM_LAST_CMD;
@@ -104,8 +109,9 @@ ice_read_sr_aq(struct ice_hw *hw, u32 offset, u16 words, u16 *data,
         * So do this conversion while calling ice_aq_read_nvm.
         */
        if (!status)
-               status = ice_aq_read_nvm(hw, 0, 2 * offset, 2 * words, data,
-                                        last_command, NULL);
+               status = ice_aq_read_nvm(hw, ICE_AQC_NVM_START_POINT,
+                                        2 * offset, 2 * words, data,
+                                        last_command, true, NULL);
 
        return status;
 }