
Intel listed total 28 commits that need us to back port. There are 9 commits that are already included in our code base. The commit "ice: Add support for E825-C TS PLL handling" will not be back ported since we're not dealing with E825 for 24.09. So we need back port 18 commits. These commits were introduced in linux-6.9.y and linux-6.10.y. To back port these 18 commits successfully, we totally back ported 37 upstream commits. 1) The patches 1-15 are cherry picked to fix the conflicts for patch 16 ("ice: introduce PTP state machine") and patch 36 "ice: Introduce ice_ptp_hw struct". Also will be helpful for the subsequent commits back porting. 2) The patches 24-27 are cherry picked to fix the conflicts for patch 28 ("ice: Fix debugfs with devlink reload") 3) The minor adjust was done for the patches 17, 21, 23 and 33 to fit with the context change. Verification: - installs from iso succeed on servers with ice(Intel Ethernet Controller E810-XXVDA4T Westport Channel) and i40e hw(Intel Ethernet Controller X710) for rt and std. - interfaces are up and pass packets for rt and std. - create vfs, ensure that they are picked up by the new iavf driver and that the interface can come up and pass packets on rt and std system. - Check dmesg to see DDP package is loaded successfully and the version is 1.3.36.0 for rt and std. Story: 2011056 Task: 50950 Change-Id: I9aef0378ea01451684341093a167eaead3edc458 Signed-off-by: Jiping Ma <jiping.ma2@windriver.com>
282 lines
8.6 KiB
Diff
282 lines
8.6 KiB
Diff
From 189d58473481cf01b493fca4e9dd2ab8380d0ce5 Mon Sep 17 00:00:00 2001
|
|
From: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
|
|
Date: Tue, 12 Dec 2023 21:07:13 -0800
|
|
Subject: [PATCH 26/36] ice: enable FW logging
|
|
|
|
Once users have configured the FW logging then allow them to enable it
|
|
by writing to the 'fwlog/enable' file. The file accepts a boolean value
|
|
(0 or 1) where 1 means enable FW logging and 0 means disable FW logging.
|
|
|
|
# echo <value> > /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/enable
|
|
|
|
Where <value> is 0 or 1.
|
|
|
|
The user can read the 'fwlog/enable' file to see whether logging is
|
|
enabled or not. Reading the actual data is a separate patch. To see the
|
|
current value then:
|
|
|
|
# cat /sys/kernel/debug/ice/0000\:18\:00.0/fwlog/enable
|
|
|
|
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
|
|
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
|
|
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
|
|
(cherry picked from commit 73671c3162c83a689342fd57f00b5f261682e49b)
|
|
Signed-off-by: Jiping Ma <jiping.ma2@windriver.com>
|
|
---
|
|
.../net/ethernet/intel/ice/ice_adminq_cmd.h | 3 +
|
|
drivers/net/ethernet/intel/ice/ice_debugfs.c | 98 +++++++++++++++++++
|
|
drivers/net/ethernet/intel/ice/ice_fwlog.c | 67 +++++++++++++
|
|
drivers/net/ethernet/intel/ice/ice_fwlog.h | 2 +
|
|
4 files changed, 170 insertions(+)
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
|
|
index 347e4fed5e0d..11391be4efc2 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
|
|
@@ -2336,6 +2336,7 @@ enum ice_aqc_fw_logging_mod {
|
|
};
|
|
|
|
/* Set FW Logging configuration (indirect 0xFF30)
|
|
+ * Register for FW Logging (indirect 0xFF31)
|
|
* Query FW Logging (indirect 0xFF32)
|
|
*/
|
|
struct ice_aqc_fw_log {
|
|
@@ -2344,6 +2345,7 @@ struct ice_aqc_fw_log {
|
|
#define ICE_AQC_FW_LOG_CONF_AQ_EN BIT(1)
|
|
#define ICE_AQC_FW_LOG_QUERY_REGISTERED BIT(2)
|
|
#define ICE_AQC_FW_LOG_CONF_SET_VALID BIT(3)
|
|
+#define ICE_AQC_FW_LOG_AQ_REGISTER BIT(0)
|
|
#define ICE_AQC_FW_LOG_AQ_QUERY BIT(2)
|
|
|
|
u8 rsp_flag;
|
|
@@ -2662,6 +2664,7 @@ enum ice_adminq_opc {
|
|
|
|
/* FW Logging Commands */
|
|
ice_aqc_opc_fw_logs_config = 0xFF30,
|
|
+ ice_aqc_opc_fw_logs_register = 0xFF31,
|
|
ice_aqc_opc_fw_logs_query = 0xFF32,
|
|
};
|
|
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_debugfs.c b/drivers/net/ethernet/intel/ice/ice_debugfs.c
|
|
index 3b0d9b214fd1..3dde99969132 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_debugfs.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_debugfs.c
|
|
@@ -281,6 +281,101 @@ static const struct file_operations ice_debugfs_nr_messages_fops = {
|
|
.write = ice_debugfs_nr_messages_write,
|
|
};
|
|
|
|
+/**
|
|
+ * ice_debugfs_enable_read - read from 'enable' file
|
|
+ * @filp: the opened file
|
|
+ * @buffer: where to write the data for the user to read
|
|
+ * @count: the size of the user's buffer
|
|
+ * @ppos: file position offset
|
|
+ */
|
|
+static ssize_t ice_debugfs_enable_read(struct file *filp,
|
|
+ char __user *buffer, size_t count,
|
|
+ loff_t *ppos)
|
|
+{
|
|
+ struct ice_pf *pf = filp->private_data;
|
|
+ struct ice_hw *hw = &pf->hw;
|
|
+ char buff[32] = {};
|
|
+
|
|
+ snprintf(buff, sizeof(buff), "%u\n",
|
|
+ (u16)(hw->fwlog_cfg.options &
|
|
+ ICE_FWLOG_OPTION_IS_REGISTERED) >> 3);
|
|
+
|
|
+ return simple_read_from_buffer(buffer, count, ppos, buff, strlen(buff));
|
|
+}
|
|
+
|
|
+/**
|
|
+ * ice_debugfs_enable_write - write into 'enable' file
|
|
+ * @filp: the opened file
|
|
+ * @buf: where to find the user's data
|
|
+ * @count: the length of the user's data
|
|
+ * @ppos: file position offset
|
|
+ */
|
|
+static ssize_t
|
|
+ice_debugfs_enable_write(struct file *filp, const char __user *buf,
|
|
+ size_t count, loff_t *ppos)
|
|
+{
|
|
+ struct ice_pf *pf = filp->private_data;
|
|
+ struct ice_hw *hw = &pf->hw;
|
|
+ char user_val[8], *cmd_buf;
|
|
+ bool enable;
|
|
+ ssize_t ret;
|
|
+
|
|
+ /* don't allow partial writes or invalid input */
|
|
+ if (*ppos != 0 || count > 2)
|
|
+ return -EINVAL;
|
|
+
|
|
+ cmd_buf = memdup_user(buf, count);
|
|
+ if (IS_ERR(cmd_buf))
|
|
+ return PTR_ERR(cmd_buf);
|
|
+
|
|
+ ret = sscanf(cmd_buf, "%s", user_val);
|
|
+ if (ret != 1)
|
|
+ return -EINVAL;
|
|
+
|
|
+ ret = kstrtobool(user_val, &enable);
|
|
+ if (ret)
|
|
+ goto enable_write_error;
|
|
+
|
|
+ if (enable)
|
|
+ hw->fwlog_cfg.options |= ICE_FWLOG_OPTION_ARQ_ENA;
|
|
+ else
|
|
+ hw->fwlog_cfg.options &= ~ICE_FWLOG_OPTION_ARQ_ENA;
|
|
+
|
|
+ ret = ice_fwlog_set(hw, &hw->fwlog_cfg);
|
|
+ if (ret)
|
|
+ goto enable_write_error;
|
|
+
|
|
+ if (enable)
|
|
+ ret = ice_fwlog_register(hw);
|
|
+ else
|
|
+ ret = ice_fwlog_unregister(hw);
|
|
+
|
|
+ if (ret)
|
|
+ goto enable_write_error;
|
|
+
|
|
+ /* if we get here, nothing went wrong; return count since we didn't
|
|
+ * really write anything
|
|
+ */
|
|
+ ret = (ssize_t)count;
|
|
+
|
|
+enable_write_error:
|
|
+ /* This function always consumes all of the written input, or produces
|
|
+ * an error. Check and enforce this. Otherwise, the write operation
|
|
+ * won't complete properly.
|
|
+ */
|
|
+ if (WARN_ON(ret != (ssize_t)count && ret >= 0))
|
|
+ ret = -EIO;
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static const struct file_operations ice_debugfs_enable_fops = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .open = simple_open,
|
|
+ .read = ice_debugfs_enable_read,
|
|
+ .write = ice_debugfs_enable_write,
|
|
+};
|
|
+
|
|
/**
|
|
* ice_debugfs_fwlog_init - setup the debugfs directory
|
|
* @pf: the ice that is starting up
|
|
@@ -332,6 +427,9 @@ void ice_debugfs_fwlog_init(struct ice_pf *pf)
|
|
|
|
pf->ice_debugfs_pf_fwlog_modules = fw_modules;
|
|
|
|
+ debugfs_create_file("enable", 0600, pf->ice_debugfs_pf_fwlog,
|
|
+ pf, &ice_debugfs_enable_fops);
|
|
+
|
|
return;
|
|
|
|
err_create_module_files:
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_fwlog.c b/drivers/net/ethernet/intel/ice/ice_fwlog.c
|
|
index 307e0d04f3fe..25a17cbc1d34 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_fwlog.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_fwlog.c
|
|
@@ -63,6 +63,11 @@ void ice_fwlog_deinit(struct ice_hw *hw)
|
|
kfree(pf->ice_debugfs_pf_fwlog_modules);
|
|
|
|
pf->ice_debugfs_pf_fwlog_modules = NULL;
|
|
+
|
|
+ status = ice_fwlog_unregister(hw);
|
|
+ if (status)
|
|
+ dev_warn(ice_hw_to_dev(hw), "Unable to unregister FW logging, status: %d\n",
|
|
+ status);
|
|
}
|
|
|
|
/**
|
|
@@ -197,6 +202,8 @@ static int ice_aq_fwlog_get(struct ice_hw *hw, struct ice_fwlog_cfg *cfg)
|
|
cfg->options |= ICE_FWLOG_OPTION_ARQ_ENA;
|
|
if (cmd->cmd_flags & ICE_AQC_FW_LOG_CONF_UART_EN)
|
|
cfg->options |= ICE_FWLOG_OPTION_UART_ENA;
|
|
+ if (cmd->cmd_flags & ICE_AQC_FW_LOG_QUERY_REGISTERED)
|
|
+ cfg->options |= ICE_FWLOG_OPTION_IS_REGISTERED;
|
|
|
|
fw_modules = (struct ice_aqc_fw_log_cfg_resp *)buf;
|
|
|
|
@@ -226,6 +233,66 @@ int ice_fwlog_get(struct ice_hw *hw, struct ice_fwlog_cfg *cfg)
|
|
return ice_aq_fwlog_get(hw, cfg);
|
|
}
|
|
|
|
+/**
|
|
+ * ice_aq_fwlog_register - Register PF for firmware logging events (0xFF31)
|
|
+ * @hw: pointer to the HW structure
|
|
+ * @reg: true to register and false to unregister
|
|
+ */
|
|
+static int ice_aq_fwlog_register(struct ice_hw *hw, bool reg)
|
|
+{
|
|
+ struct ice_aq_desc desc;
|
|
+
|
|
+ ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_fw_logs_register);
|
|
+
|
|
+ if (reg)
|
|
+ desc.params.fw_log.cmd_flags = ICE_AQC_FW_LOG_AQ_REGISTER;
|
|
+
|
|
+ return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * ice_fwlog_register - Register the PF for firmware logging
|
|
+ * @hw: pointer to the HW structure
|
|
+ *
|
|
+ * After this call the PF will start to receive firmware logging based on the
|
|
+ * configuration set in ice_fwlog_set.
|
|
+ */
|
|
+int ice_fwlog_register(struct ice_hw *hw)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ if (!ice_fwlog_supported(hw))
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ status = ice_aq_fwlog_register(hw, true);
|
|
+ if (status)
|
|
+ ice_debug(hw, ICE_DBG_FW_LOG, "Failed to register for firmware logging events over ARQ\n");
|
|
+ else
|
|
+ hw->fwlog_cfg.options |= ICE_FWLOG_OPTION_IS_REGISTERED;
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * ice_fwlog_unregister - Unregister the PF from firmware logging
|
|
+ * @hw: pointer to the HW structure
|
|
+ */
|
|
+int ice_fwlog_unregister(struct ice_hw *hw)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ if (!ice_fwlog_supported(hw))
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ status = ice_aq_fwlog_register(hw, false);
|
|
+ if (status)
|
|
+ ice_debug(hw, ICE_DBG_FW_LOG, "Failed to unregister from firmware logging events over ARQ\n");
|
|
+ else
|
|
+ hw->fwlog_cfg.options &= ~ICE_FWLOG_OPTION_IS_REGISTERED;
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
/**
|
|
* ice_fwlog_set_supported - Set if FW logging is supported by FW
|
|
* @hw: pointer to the HW struct
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_fwlog.h b/drivers/net/ethernet/intel/ice/ice_fwlog.h
|
|
index 8e68ee02713b..45865558425d 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_fwlog.h
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_fwlog.h
|
|
@@ -53,4 +53,6 @@ int ice_fwlog_init(struct ice_hw *hw);
|
|
void ice_fwlog_deinit(struct ice_hw *hw);
|
|
int ice_fwlog_set(struct ice_hw *hw, struct ice_fwlog_cfg *cfg);
|
|
int ice_fwlog_get(struct ice_hw *hw, struct ice_fwlog_cfg *cfg);
|
|
+int ice_fwlog_register(struct ice_hw *hw);
|
|
+int ice_fwlog_unregister(struct ice_hw *hw);
|
|
#endif /* _ICE_FWLOG_H_ */
|
|
--
|
|
2.43.0
|
|
|