Add support for more NVM-related operations through Admin Command
Interface, such as:

- NVM read/write
- Recalculating NVM checksum
- Sanitize NVM
- Clear user data from NVM
- Validate an NVM read/write request
- Read/program topology device
- Read Option ROM and Minimum Security Revision

Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
---
 drivers/net/ixgbe/base/ixgbe_e610.c      | 319 +++++++++++++++++++++++
 drivers/net/ixgbe/base/ixgbe_e610.h      |  15 ++
 drivers/net/ixgbe/base/ixgbe_type_e610.h | 151 +++++++++++
 3 files changed, 485 insertions(+)

diff --git a/drivers/net/ixgbe/base/ixgbe_e610.c 
b/drivers/net/ixgbe/base/ixgbe_e610.c
index e412345c28..ac71980630 100644
--- a/drivers/net/ixgbe/base/ixgbe_e610.c
+++ b/drivers/net/ixgbe/base/ixgbe_e610.c
@@ -2063,6 +2063,72 @@ s32 ixgbe_aci_sff_eeprom(struct ixgbe_hw *hw, u16 lport, 
u8 bus_addr,
        return status;
 }
 
+/**
+ * ixgbe_aci_prog_topo_dev_nvm - program Topology Device NVM
+ * @hw: pointer to the hardware structure
+ * @topo_params: pointer to structure storing topology parameters for a device
+ *
+ * Program Topology Device NVM using ACI command (0x06F2).
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_aci_prog_topo_dev_nvm(struct ixgbe_hw *hw,
+                       struct ixgbe_aci_cmd_link_topo_params *topo_params)
+{
+       struct ixgbe_aci_cmd_prog_topo_dev_nvm *cmd;
+       struct ixgbe_aci_desc desc;
+
+       cmd = &desc.params.prog_topo_dev_nvm;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_prog_topo_dev_nvm);
+
+       memcpy(&cmd->topo_params, topo_params, sizeof(*topo_params));
+
+       return ixgbe_aci_send_cmd(hw, &desc, NULL, 0);
+}
+
+/**
+ * ixgbe_aci_read_topo_dev_nvm - read Topology Device NVM
+ * @hw: pointer to the hardware structure
+ * @topo_params: pointer to structure storing topology parameters for a device
+ * @start_address: byte offset in the topology device NVM
+ * @data: pointer to data buffer
+ * @data_size: number of bytes to be read from the topology device NVM
+ * Read Topology Device NVM (0x06F3)
+ *
+ * Read Topology of Device NVM using ACI command (0x06F3).
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_aci_read_topo_dev_nvm(struct ixgbe_hw *hw,
+                       struct ixgbe_aci_cmd_link_topo_params *topo_params,
+                       u32 start_address, u8 *data, u8 data_size)
+{
+       struct ixgbe_aci_cmd_read_topo_dev_nvm *cmd;
+       struct ixgbe_aci_desc desc;
+       s32 status;
+
+       if (!data || data_size == 0 ||
+           data_size > IXGBE_ACI_READ_TOPO_DEV_NVM_DATA_READ_SIZE)
+               return IXGBE_ERR_PARAM;
+
+       cmd = &desc.params.read_topo_dev_nvm;
+
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_read_topo_dev_nvm);
+
+       desc.datalen = IXGBE_CPU_TO_LE16(data_size);
+       memcpy(&cmd->topo_params, topo_params, sizeof(*topo_params));
+       cmd->start_address = IXGBE_CPU_TO_LE32(start_address);
+
+       status = ixgbe_aci_send_cmd(hw, &desc, NULL, 0);
+       if (status)
+               return status;
+
+       memcpy(data, cmd->data_read, data_size);
+
+       return IXGBE_SUCCESS;
+}
+
 /**
  * ixgbe_acquire_nvm - Generic request for acquiring the NVM ownership
  * @hw: pointer to the HW structure
@@ -2422,6 +2488,60 @@ static s32 ixgbe_read_nvm_sr_copy(struct ixgbe_hw *hw,
        return ixgbe_read_nvm_module(hw, bank, hdr_len + offset, data);
 }
 
+/**
+ * ixgbe_get_nvm_minsrevs - Get the minsrevs values from flash
+ * @hw: pointer to the HW struct
+ * @minsrevs: structure to store NVM and OROM minsrev values
+ *
+ * Read the Minimum Security Revision TLV and extract
+ * the revision values from the flash image
+ * into a readable structure for processing.
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_get_nvm_minsrevs(struct ixgbe_hw *hw,
+                          struct ixgbe_minsrev_info *minsrevs)
+{
+       struct ixgbe_aci_cmd_nvm_minsrev data;
+       s32 status;
+       u16 valid;
+
+       status = ixgbe_acquire_nvm(hw, IXGBE_RES_READ);
+       if (status)
+               return status;
+
+       status = ixgbe_aci_read_nvm(hw, IXGBE_ACI_NVM_MINSREV_MOD_ID,
+                                   0, sizeof(data), &data,
+                                   true, false);
+
+       ixgbe_release_nvm(hw);
+
+       if (status)
+               return status;
+
+       valid = IXGBE_LE16_TO_CPU(data.validity);
+
+       /* Extract NVM minimum security revision */
+       if (valid & IXGBE_ACI_NVM_MINSREV_NVM_VALID) {
+               u16 minsrev_l = IXGBE_LE16_TO_CPU(data.nvm_minsrev_l);
+               u16 minsrev_h = IXGBE_LE16_TO_CPU(data.nvm_minsrev_h);
+
+               minsrevs->nvm = minsrev_h << 16 | minsrev_l;
+               minsrevs->nvm_valid = true;
+       }
+
+       /* Extract the OROM minimum security revision */
+       if (valid & IXGBE_ACI_NVM_MINSREV_OROM_VALID) {
+               u16 minsrev_l = IXGBE_LE16_TO_CPU(data.orom_minsrev_l);
+               u16 minsrev_h = IXGBE_LE16_TO_CPU(data.orom_minsrev_h);
+
+               minsrevs->orom = minsrev_h << 16 | minsrev_l;
+               minsrevs->orom_valid = true;
+       }
+
+       return IXGBE_SUCCESS;
+}
+
 /**
  * ixgbe_get_nvm_srev - Read the security revision from the NVM CSS header
  * @hw: pointer to the HW struct
@@ -2773,6 +2893,63 @@ s32 ixgbe_init_nvm(struct ixgbe_hw *hw)
        return IXGBE_SUCCESS;
 }
 
+/**
+ * ixgbe_sanitize_operate - Clear the user data
+ * @hw: pointer to the HW struct
+ *
+ * Clear user data from NVM using ACI command (0x070C).
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_sanitize_operate(struct ixgbe_hw *hw)
+{
+       s32 status;
+       u8 values;
+
+       u8 cmd_flags = IXGBE_ACI_SANITIZE_REQ_OPERATE |
+                      IXGBE_ACI_SANITIZE_OPERATE_SUBJECT_CLEAR;
+
+       status = ixgbe_sanitize_nvm(hw, cmd_flags, &values);
+       if (status)
+               return status;
+       if ((!(values & IXGBE_ACI_SANITIZE_OPERATE_HOST_CLEAN_DONE) &&
+            !(values & IXGBE_ACI_SANITIZE_OPERATE_BMC_CLEAN_DONE)) ||
+           ((values & IXGBE_ACI_SANITIZE_OPERATE_HOST_CLEAN_DONE) &&
+            !(values & IXGBE_ACI_SANITIZE_OPERATE_HOST_CLEAN_SUCCESS)) ||
+           ((values & IXGBE_ACI_SANITIZE_OPERATE_BMC_CLEAN_DONE) &&
+            !(values & IXGBE_ACI_SANITIZE_OPERATE_BMC_CLEAN_SUCCESS)))
+               return IXGBE_ERR_ACI_ERROR;
+
+       return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_sanitize_nvm - Sanitize NVM
+ * @hw: pointer to the HW struct
+ * @cmd_flags: flag to the ACI command
+ * @values: values returned from the command
+ *
+ * Sanitize NVM using ACI command (0x070C).
+ *
+ * Return: the exit code of the operation.
+ */
+s32 ixgbe_sanitize_nvm(struct ixgbe_hw *hw, u8 cmd_flags, u8 *values)
+{
+       struct ixgbe_aci_desc desc;
+       struct ixgbe_aci_cmd_nvm_sanitization *cmd;
+       s32 status;
+
+       cmd = &desc.params.nvm_sanitization;
+       ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_nvm_sanitization);
+       cmd->cmd_flags = cmd_flags;
+
+       status = ixgbe_aci_send_cmd(hw, &desc, NULL, 0);
+       if (values)
+               *values = cmd->values;
+
+       return status;
+}
+
 /**
  * ixgbe_read_sr_word_aci - Reads Shadow RAM via ACI
  * @hw: pointer to the HW structure
@@ -3080,6 +3257,148 @@ s32 ixgbe_aci_get_internal_data(struct ixgbe_hw *hw, 
u16 cluster_id,
        return status;
 }
 
+/**
+ * ixgbe_validate_nvm_rw_reg - Check that an NVM access request is valid
+ * @cmd: NVM access command structure
+ *
+ * Validates that an NVM access structure is request to read or write a valid
+ * register offset. First validates that the module and flags are correct, and
+ * then ensures that the register offset is one of the accepted registers.
+ *
+ * Return: 0 if the register access is valid, out of range error code 
otherwise.
+ */
+static s32
+ixgbe_validate_nvm_rw_reg(struct ixgbe_nvm_access_cmd *cmd)
+{
+       u16 i;
+
+       switch (cmd->offset) {
+       case GL_HICR:
+       case GL_HICR_EN: /* Note, this register is read only */
+       case GL_FWSTS:
+       case GL_MNG_FWSM:
+       case GLNVM_GENS:
+       case GLNVM_FLA:
+       case GL_FWRESETCNT:
+               return 0;
+       default:
+               break;
+       }
+
+       for (i = 0; i <= GL_HIDA_MAX_INDEX; i++)
+               if (cmd->offset == (u32)GL_HIDA(i))
+                       return 0;
+
+       for (i = 0; i <= GL_HIBA_MAX_INDEX; i++)
+               if (cmd->offset == (u32)GL_HIBA(i))
+                       return 0;
+
+       /* All other register offsets are not valid */
+       return IXGBE_ERR_OUT_OF_RANGE;
+}
+
+/**
+ * ixgbe_nvm_access_read - Handle an NVM read request
+ * @hw: pointer to the HW struct
+ * @cmd: NVM access command to process
+ * @data: storage for the register value read
+ *
+ * Process an NVM access request to read a register.
+ *
+ * Return: 0 if the register read is valid and successful,
+ * out of range error code otherwise.
+ */
+static s32 ixgbe_nvm_access_read(struct ixgbe_hw *hw,
+                       struct ixgbe_nvm_access_cmd *cmd,
+                       struct ixgbe_nvm_access_data *data)
+{
+       s32 status;
+
+       /* Always initialize the output data, even on failure */
+       memset(&data->regval, 0, cmd->data_size);
+
+       /* Make sure this is a valid read/write access request */
+       status = ixgbe_validate_nvm_rw_reg(cmd);
+       if (status)
+               return status;
+
+       DEBUGOUT1("NVM access: reading register %08x\n", cmd->offset);
+
+       /* Read the register and store the contents in the data field */
+       data->regval = IXGBE_READ_REG(hw, cmd->offset);
+
+       return 0;
+}
+
+/**
+ * ixgbe_nvm_access_write - Handle an NVM write request
+ * @hw: pointer to the HW struct
+ * @cmd: NVM access command to process
+ * @data: NVM access data to write
+ *
+ * Process an NVM access request to write a register.
+ *
+ * Return: 0 if the register write is valid and successful,
+ * out of range error code otherwise.
+ */
+static s32 ixgbe_nvm_access_write(struct ixgbe_hw *hw,
+                       struct ixgbe_nvm_access_cmd *cmd,
+                       struct ixgbe_nvm_access_data *data)
+{
+       s32 status;
+
+       /* Make sure this is a valid read/write access request */
+       status = ixgbe_validate_nvm_rw_reg(cmd);
+       if (status)
+               return status;
+
+       /* Reject requests to write to read-only registers */
+       switch (cmd->offset) {
+       case GL_HICR_EN:
+               return IXGBE_ERR_OUT_OF_RANGE;
+       default:
+               break;
+       }
+
+       DEBUGOUT2("NVM access: writing register %08x with value %08x\n",
+               cmd->offset, data->regval);
+
+       /* Write the data field to the specified register */
+       IXGBE_WRITE_REG(hw, cmd->offset, data->regval);
+
+       return 0;
+}
+
+/**
+ * ixgbe_handle_nvm_access - Handle an NVM access request
+ * @hw: pointer to the HW struct
+ * @cmd: NVM access command info
+ * @data: pointer to read or return data
+ *
+ * Process an NVM access request. Read the command structure information and
+ * determine if it is valid. If not, report an error indicating the command
+ * was invalid.
+ *
+ * For valid commands, perform the necessary function, copying the data into
+ * the provided data buffer.
+ *
+ * Return: 0 if the nvm access request is valid and successful,
+ * error code otherwise.
+ */
+s32 ixgbe_handle_nvm_access(struct ixgbe_hw *hw,
+                       struct ixgbe_nvm_access_cmd *cmd,
+                       struct ixgbe_nvm_access_data *data)
+{
+       switch (cmd->command) {
+       case IXGBE_NVM_CMD_READ:
+               return ixgbe_nvm_access_read(hw, cmd, data);
+       case IXGBE_NVM_CMD_WRITE:
+               return ixgbe_nvm_access_write(hw, cmd, data);
+       default:
+               return IXGBE_ERR_PARAM;
+       }
+}
+
 /**
  * ixgbe_init_ops_E610 - Inits func ptrs and MAC type
  * @hw: pointer to hardware structure
diff --git a/drivers/net/ixgbe/base/ixgbe_e610.h 
b/drivers/net/ixgbe/base/ixgbe_e610.h
index 48bd35b647..33c683d1c1 100644
--- a/drivers/net/ixgbe/base/ixgbe_e610.h
+++ b/drivers/net/ixgbe/base/ixgbe_e610.h
@@ -68,6 +68,12 @@ s32 ixgbe_aci_get_gpio(struct ixgbe_hw *hw, u16 
gpio_ctrl_handle, u8 pin_idx,
 s32 ixgbe_aci_sff_eeprom(struct ixgbe_hw *hw, u16 lport, u8 bus_addr,
                         u16 mem_addr, u8 page, u8 page_bank_ctrl, u8 *data,
                         u8 length, bool write);
+s32 ixgbe_aci_prog_topo_dev_nvm(struct ixgbe_hw *hw,
+                       struct ixgbe_aci_cmd_link_topo_params *topo_params);
+s32 ixgbe_aci_read_topo_dev_nvm(struct ixgbe_hw *hw,
+                       struct ixgbe_aci_cmd_link_topo_params *topo_params,
+                       u32 start_address, u8 *data, u8 data_size);
+
 s32 ixgbe_acquire_nvm(struct ixgbe_hw *hw,
                      enum ixgbe_aci_res_access_type access);
 void ixgbe_release_nvm(struct ixgbe_hw *hw);
@@ -79,10 +85,14 @@ s32 ixgbe_aci_read_nvm(struct ixgbe_hw *hw, u16 
module_typeid, u32 offset,
 s32 ixgbe_nvm_validate_checksum(struct ixgbe_hw *hw);
 s32 ixgbe_nvm_recalculate_checksum(struct ixgbe_hw *hw);
 
+s32 ixgbe_get_nvm_minsrevs(struct ixgbe_hw *hw, struct ixgbe_minsrev_info 
*minsrevs);
 s32 ixgbe_get_inactive_nvm_ver(struct ixgbe_hw *hw, struct ixgbe_nvm_info 
*nvm);
 s32 ixgbe_get_active_nvm_ver(struct ixgbe_hw *hw, struct ixgbe_nvm_info *nvm);
 s32 ixgbe_init_nvm(struct ixgbe_hw *hw);
 
+s32 ixgbe_sanitize_operate(struct ixgbe_hw *hw);
+s32 ixgbe_sanitize_nvm(struct ixgbe_hw *hw, u8 cmd_flags, u8 *values);
+
 s32 ixgbe_read_sr_word_aci(struct ixgbe_hw  *hw, u16 offset, u16 *data);
 s32 ixgbe_read_sr_buf_aci(struct ixgbe_hw *hw, u16 offset, u16 *words, u16 
*data);
 s32 ixgbe_read_flat_nvm(struct ixgbe_hw  *hw, u32 offset, u32 *length,
@@ -101,6 +111,11 @@ s32 ixgbe_aci_get_internal_data(struct ixgbe_hw *hw, u16 
cluster_id,
                                u16 buf_size, u16 *ret_buf_size,
                                u16 *ret_next_cluster, u16 *ret_next_table,
                                u32 *ret_next_index);
+
+s32 ixgbe_handle_nvm_access(struct ixgbe_hw *hw,
+                               struct ixgbe_nvm_access_cmd *cmd,
+                               struct ixgbe_nvm_access_data *data);
+
 /* E610 operations */
 s32 ixgbe_reset_hw_E610(struct ixgbe_hw *hw);
 s32 ixgbe_start_hw_E610(struct ixgbe_hw *hw);
diff --git a/drivers/net/ixgbe/base/ixgbe_type_e610.h 
b/drivers/net/ixgbe/base/ixgbe_type_e610.h
index 91ad0d8be6..646256365d 100644
--- a/drivers/net/ixgbe/base/ixgbe_type_e610.h
+++ b/drivers/net/ixgbe/base/ixgbe_type_e610.h
@@ -119,6 +119,14 @@
 #define E610_SR_NVM_CTRL_WORD          0x00
 #define E610_SR_PBA_BLOCK_PTR          0x16
 
+/* The Orom version topology */
+#define IXGBE_OROM_VER_PATCH_SHIFT     0
+#define IXGBE_OROM_VER_PATCH_MASK      (0xff << IXGBE_OROM_VER_PATCH_SHIFT)
+#define IXGBE_OROM_VER_BUILD_SHIFT     8
+#define IXGBE_OROM_VER_BUILD_MASK      (0xffff << IXGBE_OROM_VER_BUILD_SHIFT)
+#define IXGBE_OROM_VER_SHIFT           24
+#define IXGBE_OROM_VER_MASK            (0xff << IXGBE_OROM_VER_SHIFT)
+
 /* CSS Header words */
 #define IXGBE_NVM_CSS_HDR_LEN_L                        0x02
 #define IXGBE_NVM_CSS_HDR_LEN_H                        0x03
@@ -263,17 +271,81 @@
 #define GLNVM_FLA_LOCKED_S                     6
 #define GLNVM_FLA_LOCKED_M                     BIT(6)
 
+/* Bit Bang registers */
+#define RDASB_MSGCTL                           0x000B6820
+#define RDASB_MSGCTL_HDR_DWS_S                 0
+#define RDASB_MSGCTL_EXP_RDW_S                 8
+#define RDASB_MSGCTL_CMDV_M                    BIT(31)
+#define RDASB_RSPCTL                           0x000B6824
+#define RDASB_RSPCTL_BAD_LENGTH_M              BIT(30)
+#define RDASB_RSPCTL_NOT_SUCCESS_M             BIT(31)
+#define RDASB_WHDR0                            0x000B68F4
+#define RDASB_WHDR1                            0x000B68F8
+#define RDASB_WHDR2                            0x000B68FC
+#define RDASB_WHDR3                            0x000B6900
+#define RDASB_WHDR4                            0x000B6904
+#define RDASB_RHDR0                            0x000B6AFC
+#define RDASB_RHDR0_RESPONSE_S                 27
+#define RDASB_RHDR0_RESPONSE_M                 MAKEMASK(0x7, 27)
+#define RDASB_RDATA0                           0x000B6B00
+#define RDASB_RDATA1                           0x000B6B04
+
+/* SPI Registers */
+#define SPISB_MSGCTL                           0x000B7020
+#define SPISB_MSGCTL_HDR_DWS_S                 0
+#define SPISB_MSGCTL_EXP_RDW_S                 8
+#define SPISB_MSGCTL_MSG_MODE_S                        26
+#define SPISB_MSGCTL_TOKEN_MODE_S              28
+#define SPISB_MSGCTL_BARCLR_S                  30
+#define SPISB_MSGCTL_CMDV_S                    31
+#define SPISB_MSGCTL_CMDV_M                    BIT(31)
+#define SPISB_RSPCTL                           0x000B7024
+#define SPISB_RSPCTL_BAD_LENGTH_M              BIT(30)
+#define SPISB_RSPCTL_NOT_SUCCESS_M             BIT(31)
+#define SPISB_WHDR0                            0x000B70F4
+#define SPISB_WHDR0_DEST_SEL_S                 12
+#define SPISB_WHDR0_OPCODE_SEL_S               16
+#define SPISB_WHDR0_TAG_S                      24
+#define SPISB_WHDR1                            0x000B70F8
+#define SPISB_WHDR2                            0x000B70FC
+#define SPISB_RDATA                            0x000B7300
+#define SPISB_WDATA                            0x000B7100
+
+/* Firmware Reset Count register */
+#define GL_FWRESETCNT                          0x00083100 /* Reset Source: POR 
*/
+#define GL_FWRESETCNT_FWRESETCNT_S             0
+#define GL_FWRESETCNT_FWRESETCNT_M             MAKEMASK(0xFFFFFFFF, 0)
+
 /* Admin Command Interface (ACI) registers */
 #define PF_HIDA(_i)                    (0x00085000 + ((_i) * 4))
 #define PF_HIDA_2(_i)                  (0x00085020 + ((_i) * 4))
 #define PF_HIBA(_i)                    (0x00084000 + ((_i) * 4))
 #define PF_HICR                                0x00082048
 
+#define PF_HIDA_MAX_INDEX              15
+#define PF_HIBA_MAX_INDEX              1023
+
 #define PF_HICR_EN                     BIT(0)
 #define PF_HICR_C                      BIT(1)
 #define PF_HICR_SV                     BIT(2)
 #define PF_HICR_EV                     BIT(3)
 
+#define GL_HIDA(_i)                    (0x00082000 + ((_i) * 4))
+#define GL_HIDA_2(_i)                  (0x00082020 + ((_i) * 4))
+#define GL_HIBA(_i)                    (0x00081000 + ((_i) * 4))
+#define GL_HICR                                0x00082040
+
+#define GL_HIDA_MAX_INDEX              15
+#define GL_HIBA_MAX_INDEX              1023
+
+#define GL_HICR_C                      BIT(1)
+#define GL_HICR_SV                     BIT(2)
+#define GL_HICR_EV                     BIT(3)
+
+#define GL_HICR_EN                     0x00082044
+
+#define GL_HICR_EN_CHECK               BIT(0)
+
 /* Admin Command Interface (ACI) defines */
 /* Defines that help manage the driver vs FW API checks.
  */
@@ -1278,10 +1350,48 @@ struct ixgbe_aci_cmd_nvm {
 };
 
 /* NVM Module_Type ID, needed offset and read_len for struct 
ixgbe_aci_cmd_nvm. */
+#define IXGBE_ACI_NVM_SECTOR_UNIT              4096 /* In Bytes */
+#define IXGBE_ACI_NVM_WORD_UNIT                        2 /* In Bytes */
+
 #define IXGBE_ACI_NVM_START_POINT              0
+#define IXGBE_ACI_NVM_EMP_SR_PTR_OFFSET                0x90
+#define IXGBE_ACI_NVM_EMP_SR_PTR_RD_LEN                2 /* In Bytes */
+#define IXGBE_ACI_NVM_EMP_SR_PTR_M             MAKEMASK(0x7FFF, 0)
+#define IXGBE_ACI_NVM_EMP_SR_PTR_TYPE_S                15
+#define IXGBE_ACI_NVM_EMP_SR_PTR_TYPE_M                BIT(15)
+#define IXGBE_ACI_NVM_EMP_SR_PTR_TYPE_SECTOR   1
+
+#define IXGBE_ACI_NVM_LLDP_CFG_PTR_OFFSET      0x46
+#define IXGBE_ACI_NVM_LLDP_CFG_HEADER_LEN      2 /* In Bytes */
+#define IXGBE_ACI_NVM_LLDP_CFG_PTR_RD_LEN      2 /* In Bytes */
+
+#define IXGBE_ACI_NVM_LLDP_PRESERVED_MOD_ID            0x129
+#define IXGBE_ACI_NVM_CUR_LLDP_PERSIST_RD_OFFSET       2 /* In Bytes */
+#define IXGBE_ACI_NVM_LLDP_STATUS_M                    MAKEMASK(0xF, 0)
+#define IXGBE_ACI_NVM_LLDP_STATUS_M_LEN                        4 /* In Bits */
+#define IXGBE_ACI_NVM_LLDP_STATUS_RD_LEN               4 /* In Bytes */
+
+#define IXGBE_ACI_NVM_MINSREV_MOD_ID           0x130
 
 IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_nvm);
 
+/* Used for reading and writing MinSRev using 0x0701 and 0x0703. Note that the
+ * type field is excluded from the section when reading and writing from
+ * a module using the module_typeid field with these AQ commands.
+ */
+struct ixgbe_aci_cmd_nvm_minsrev {
+       __le16 length;
+       __le16 validity;
+#define IXGBE_ACI_NVM_MINSREV_NVM_VALID                BIT(0)
+#define IXGBE_ACI_NVM_MINSREV_OROM_VALID       BIT(1)
+       __le16 nvm_minsrev_l;
+       __le16 nvm_minsrev_h;
+       __le16 orom_minsrev_l;
+       __le16 orom_minsrev_h;
+};
+
+IXGBE_CHECK_STRUCT_LEN(12, ixgbe_aci_cmd_nvm_minsrev);
+
 /* Used for 0x0704 as well as for 0x0705 commands */
 struct ixgbe_aci_cmd_nvm_cfg {
        u8      cmd_flags;
@@ -1298,6 +1408,14 @@ struct ixgbe_aci_cmd_nvm_cfg {
 
 IXGBE_CHECK_PARAM_LEN(ixgbe_aci_cmd_nvm_cfg);
 
+struct ixgbe_aci_cmd_nvm_cfg_data {
+       __le16 field_id;
+       __le16 field_options;
+       __le16 field_value;
+};
+
+IXGBE_CHECK_STRUCT_LEN(6, ixgbe_aci_cmd_nvm_cfg_data);
+
 /* NVM Checksum Command (direct, 0x0706) */
 struct ixgbe_aci_cmd_nvm_checksum {
        u8 flags;
@@ -1738,6 +1856,16 @@ struct ixgbe_ts_dev_info {
        u8 tmr1_ena;
 };
 
+#pragma pack(1)
+struct ixgbe_orom_civd_info {
+       u8 signature[4];        /* Must match ASCII '$CIV' characters */
+       u8 checksum;            /* Simple modulo 256 sum of all structure bytes 
must equal 0 */
+       __le32 combo_ver;       /* Combo Image Version number */
+       u8 combo_name_len;      /* Length of the unicode combo image version 
string, max of 32 */
+       __le16 combo_name[32];  /* Unicode string representing the Combo Image 
version */
+};
+#pragma pack()
+
 /* Function specific capabilities */
 struct ixgbe_hw_func_caps {
        struct ixgbe_hw_common_caps common_cap;
@@ -1768,6 +1896,14 @@ struct ixgbe_aci_info {
        struct ixgbe_lock lock;         /* admin command interface lock */
 };
 
+/* Minimum Security Revision information */
+struct ixgbe_minsrev_info {
+       u32 nvm;
+       u32 orom;
+       u8 nvm_valid : 1;
+       u8 orom_valid : 1;
+};
+
 /* Enumeration of which flash bank is desired to read from, either the active
  * bank or the inactive bank. Used to abstract 1st and 2nd bank notion from
  * code which just wants to read the active or inactive flash bank.
@@ -1825,4 +1961,19 @@ struct ixgbe_flash_info {
        u8 blank_nvm_mode;                      /* is NVM empty (no FW present) 
*/
 };
 
+#define IXGBE_NVM_CMD_READ             0x0000000B
+#define IXGBE_NVM_CMD_WRITE            0x0000000C
+
+/* NVM Access command */
+struct ixgbe_nvm_access_cmd {
+       u32 command;            /* NVM command: READ or WRITE */
+       u32 offset;                     /* Offset to read/write, in bytes */
+       u32 data_size;          /* Size of data field, in bytes */
+};
+
+/* NVM Access data */
+struct ixgbe_nvm_access_data {
+       u32 regval;                     /* Storage for register value */
+};
+
 #endif /* _IXGBE_TYPE_E610_H_ */
-- 
2.43.0

Reply via email to