Adds new helper function to read from HW sensors via a new AQ command
"Get Sensor Reading (0x0632)".

Signed-off-by: Martion Domagala <marvinx.domag...@intel.com>
Signed-off-by: Qiming Yang <qiming.y...@intel.com>
---
 drivers/net/ice/base/ice_adminq_cmd.h | 29 +++++++++++++++++++++
 drivers/net/ice/base/ice_common.c     | 36 +++++++++++++++++++++++++++
 drivers/net/ice/base/ice_common.h     |  6 +++--
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ice/base/ice_adminq_cmd.h 
b/drivers/net/ice/base/ice_adminq_cmd.h
index 4c4fd27865..5a44ebbdc0 100644
--- a/drivers/net/ice/base/ice_adminq_cmd.h
+++ b/drivers/net/ice/base/ice_adminq_cmd.h
@@ -1681,6 +1681,32 @@ struct ice_aqc_set_mac_lb {
        u8 reserved[15];
 };
 
+/* Get sensor reading (direct 0x0632) */
+struct ice_aqc_get_sensor_reading {
+       u8 sensor;
+#define ICE_AQC_INT_TEMP_SENSOR                0x0
+       u8 format;
+#define ICE_AQC_INT_TEMP_FORMAT                0x0
+       u8 reserved[6];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
+/* Get sensor reading response (direct 0x0632) */
+struct ice_aqc_get_sensor_reading_resp {
+       union {
+               u8 raw[8];
+               /* Output data for sensor 0x00, format 0x00 */
+               struct {
+                       s8 temp;
+                       u8 temp_warning_threshold;
+                       u8 temp_critical_threshold;
+                       u8 temp_fatal_threshold;
+                       u8 reserved[4];
+               } s0f0;
+       } data;
+};
+
 struct ice_aqc_link_topo_params {
        u8 lport_num;
        u8 lport_num_valid;
@@ -3032,6 +3058,8 @@ struct ice_aq_desc {
                struct ice_aqc_get_phy_caps get_phy;
                struct ice_aqc_set_phy_cfg set_phy;
                struct ice_aqc_restart_an restart_an;
+               struct ice_aqc_get_sensor_reading get_sensor_reading;
+               struct ice_aqc_get_sensor_reading_resp get_sensor_reading_resp;
                struct ice_aqc_i2c read_write_i2c;
                struct ice_aqc_read_i2c_resp read_i2c_resp;
                struct ice_aqc_gpio read_write_gpio;
@@ -3281,6 +3309,7 @@ enum ice_adminq_opc {
        ice_aqc_opc_get_link_status                     = 0x0607,
        ice_aqc_opc_set_event_mask                      = 0x0613,
        ice_aqc_opc_set_mac_lb                          = 0x0620,
+       ice_aqc_opc_get_sensor_reading                  = 0x0632,
        ice_aqc_opc_get_link_topo                       = 0x06E0,
        ice_aqc_opc_get_link_topo_pin                   = 0x06E1,
        ice_aqc_opc_read_i2c                            = 0x06E2,
diff --git a/drivers/net/ice/base/ice_common.c 
b/drivers/net/ice/base/ice_common.c
index a51a436df6..ed811e406d 100644
--- a/drivers/net/ice/base/ice_common.c
+++ b/drivers/net/ice/base/ice_common.c
@@ -5278,6 +5278,42 @@ ice_cfg_vsi_lan(struct ice_port_info *pi, u16 
vsi_handle, u16 tc_bitmap,
                              ICE_SCHED_NODE_OWNER_LAN);
 }
 
+/**
+ * ice_aq_get_sensor_reading
+ * @hw: pointer to the HW struct
+ * @sensor: sensor type
+ * @format: requested response format
+ * @data: pointer to data to be read from the sensor
+ * @cd: pointer to command details structure or NULL
+ *
+ * Get sensor reading (0x0632)
+ */
+enum ice_status
+ice_aq_get_sensor_reading(struct ice_hw *hw, u8 sensor, u8 format,
+                         struct ice_aqc_get_sensor_reading_resp *data,
+                         struct ice_sq_cd *cd)
+{
+       struct ice_aqc_get_sensor_reading *cmd;
+       struct ice_aq_desc desc;
+       enum ice_status status;
+
+       if (!data)
+               return ICE_ERR_PARAM;
+
+       ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_sensor_reading);
+       cmd = &desc.params.get_sensor_reading;
+       cmd->sensor = sensor;
+       cmd->format = format;
+
+       status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
+
+       if (!status)
+               ice_memcpy(data, &desc.params.get_sensor_reading_resp,
+                          sizeof(*data), ICE_NONDMA_TO_NONDMA);
+
+       return status;
+}
+
 /**
  * ice_is_main_vsi - checks whether the VSI is main VSI
  * @hw: pointer to the HW struct
diff --git a/drivers/net/ice/base/ice_common.h 
b/drivers/net/ice/base/ice_common.h
index f612ce7c52..ccefe85af7 100644
--- a/drivers/net/ice/base/ice_common.h
+++ b/drivers/net/ice/base/ice_common.h
@@ -29,7 +29,6 @@ enum ice_status ice_init_hw(struct ice_hw *hw);
 void ice_deinit_hw(struct ice_hw *hw);
 enum ice_status ice_check_reset(struct ice_hw *hw);
 enum ice_status ice_reset(struct ice_hw *hw, enum ice_reset_req req);
-
 enum ice_status ice_create_all_ctrlq(struct ice_hw *hw);
 enum ice_status ice_init_all_ctrlq(struct ice_hw *hw);
 void ice_shutdown_all_ctrlq(struct ice_hw *hw, bool unloading);
@@ -61,7 +60,6 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq,
                struct ice_aq_desc *desc, void *buf, u16 buf_size,
                struct ice_sq_cd *cd);
 void ice_clear_pxe_mode(struct ice_hw *hw);
-
 enum ice_status ice_get_caps(struct ice_hw *hw);
 
 void ice_set_safe_mode_caps(struct ice_hw *hw);
@@ -247,6 +245,10 @@ enum ice_status ice_sbq_rw_reg_lp(struct ice_hw *hw,
 void ice_sbq_lock(struct ice_hw *hw);
 void ice_sbq_unlock(struct ice_hw *hw);
 enum ice_status ice_sbq_rw_reg(struct ice_hw *hw, struct ice_sbq_msg_input 
*in);
+enum ice_status
+ice_aq_get_sensor_reading(struct ice_hw *hw, u8 sensor, u8 format,
+                         struct ice_aqc_get_sensor_reading_resp *data,
+                         struct ice_sq_cd *cd);
 void
 ice_stat_update40(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
                  u64 *prev_stat, u64 *cur_stat);
-- 
2.25.1

Reply via email to