]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Jun 2023 09:42:32 +0000 (10:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Jun 2023 09:42:32 +0000 (10:42 +0100)
added patches:
revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch

queue-6.1/revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch [new file with mode: 0644]
queue-6.1/series

diff --git a/queue-6.1/revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch b/queue-6.1/revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch
new file mode 100644 (file)
index 0000000..26b0a83
--- /dev/null
@@ -0,0 +1,400 @@
+From idosch@nvidia.com  Thu Jun  1 10:41:52 2023
+From: Ido Schimmel <idosch@nvidia.com>
+Date: Thu, 1 Jun 2023 09:48:03 +0300
+Subject: Revert "thermal/drivers/mellanox: Use generic thermal_zone_get_trip() function"
+To: <stable@vger.kernel.org>
+Cc: <daniel.lezcano@linaro.org>, <vadimp@nvidia.com>, <sashal@kernel.org>, <petrm@nvidia.com>, <davem@davemloft.net>, <joe@atomic.ac>, <gregkh@linuxfoundation.org>, Ido Schimmel <idosch@nvidia.com>
+Message-ID: <20230601064803.1063014-1-idosch@nvidia.com>
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+This reverts commit a71f388045edbf6788a61f43e2cdc94b392a4ea3.
+
+Commit a71f388045ed ("thermal/drivers/mellanox: Use generic
+thermal_zone_get_trip() function") was backported as a dependency of the
+fix in upstream commit 6d206b1ea9f4 ("mlxsw: core_thermal: Fix fan speed
+in maximum cooling state"). However, it is dependent on changes in the
+thermal core that were merged in v6.3. Without them, the mlxsw driver is
+unable to register its thermal zone:
+
+mlxsw_spectrum 0000:03:00.0: Failed to register thermal zone
+mlxsw_spectrum 0000:03:00.0: cannot register bus device
+mlxsw_spectrum: probe of 0000:03:00.0 failed with error -22
+
+Fix this by reverting this commit and instead fix the small conflict
+with the above mentioned fix. Tested using the test case mentioned in
+the change log of the fix:
+
+ # cat /sys/class/thermal/thermal_zone2/cdev0/type
+ mlxsw_fan
+ # echo 10 > /sys/class/thermal/thermal_zone2/cdev0/cur_state
+ # cat /sys/class/hwmon/hwmon1/name
+ mlxsw
+ # cat /sys/class/hwmon/hwmon1/pwm1
+ 255
+
+After setting the fan to its maximum cooling state (10), it operates at
+100% duty cycle instead of being stuck at 0 RPM.
+
+Fixes: a71f388045ed ("thermal/drivers/mellanox: Use generic thermal_zone_get_trip() function")
+Reported-by: Joe Botha <joe@atomic.ac>
+Tested-by: Joe Botha <joe@atomic.ac>
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/mellanox/mlxsw/core_thermal.c |  209 ++++++++++++++++-----
+ 1 file changed, 161 insertions(+), 48 deletions(-)
+
+--- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
+@@ -36,39 +36,33 @@ enum mlxsw_thermal_trips {
+       MLXSW_THERMAL_TEMP_TRIP_HOT,
+ };
+-struct mlxsw_cooling_states {
++struct mlxsw_thermal_trip {
++      int     type;
++      int     temp;
++      int     hyst;
+       int     min_state;
+       int     max_state;
+ };
+-static const struct thermal_trip default_thermal_trips[] = {
++static const struct mlxsw_thermal_trip default_thermal_trips[] = {
+       {       /* In range - 0-40% PWM */
+               .type           = THERMAL_TRIP_ACTIVE,
+-              .temperature    = MLXSW_THERMAL_ASIC_TEMP_NORM,
+-              .hysteresis     = MLXSW_THERMAL_HYSTERESIS_TEMP,
+-      },
+-      {
+-              /* In range - 40-100% PWM */
+-              .type           = THERMAL_TRIP_ACTIVE,
+-              .temperature    = MLXSW_THERMAL_ASIC_TEMP_HIGH,
+-              .hysteresis     = MLXSW_THERMAL_HYSTERESIS_TEMP,
+-      },
+-      {       /* Warning */
+-              .type           = THERMAL_TRIP_HOT,
+-              .temperature    = MLXSW_THERMAL_ASIC_TEMP_HOT,
+-      },
+-};
+-
+-static const struct mlxsw_cooling_states default_cooling_states[] = {
+-      {
++              .temp           = MLXSW_THERMAL_ASIC_TEMP_NORM,
++              .hyst           = MLXSW_THERMAL_HYSTERESIS_TEMP,
+               .min_state      = 0,
+               .max_state      = (4 * MLXSW_THERMAL_MAX_STATE) / 10,
+       },
+       {
++              /* In range - 40-100% PWM */
++              .type           = THERMAL_TRIP_ACTIVE,
++              .temp           = MLXSW_THERMAL_ASIC_TEMP_HIGH,
++              .hyst           = MLXSW_THERMAL_HYSTERESIS_TEMP,
+               .min_state      = (4 * MLXSW_THERMAL_MAX_STATE) / 10,
+               .max_state      = MLXSW_THERMAL_MAX_STATE,
+       },
+-      {
++      {       /* Warning */
++              .type           = THERMAL_TRIP_HOT,
++              .temp           = MLXSW_THERMAL_ASIC_TEMP_HOT,
+               .min_state      = MLXSW_THERMAL_MAX_STATE,
+               .max_state      = MLXSW_THERMAL_MAX_STATE,
+       },
+@@ -84,8 +78,7 @@ struct mlxsw_thermal;
+ struct mlxsw_thermal_module {
+       struct mlxsw_thermal *parent;
+       struct thermal_zone_device *tzdev;
+-      struct thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
+-      struct mlxsw_cooling_states cooling_states[MLXSW_THERMAL_NUM_TRIPS];
++      struct mlxsw_thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
+       int module; /* Module or gearbox number */
+       u8 slot_index;
+ };
+@@ -105,8 +98,7 @@ struct mlxsw_thermal {
+       struct thermal_zone_device *tzdev;
+       int polling_delay;
+       struct thermal_cooling_device *cdevs[MLXSW_MFCR_PWMS_MAX];
+-      struct thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
+-      struct mlxsw_cooling_states cooling_states[MLXSW_THERMAL_NUM_TRIPS];
++      struct mlxsw_thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
+       struct mlxsw_thermal_area line_cards[];
+ };
+@@ -143,9 +135,9 @@ static int mlxsw_get_cooling_device_idx(
+ static void
+ mlxsw_thermal_module_trips_reset(struct mlxsw_thermal_module *tz)
+ {
+-      tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temperature = 0;
+-      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temperature = 0;
+-      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temperature = 0;
++      tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temp = 0;
++      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temp = 0;
++      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temp = 0;
+ }
+ static int
+@@ -187,12 +179,12 @@ mlxsw_thermal_module_trips_update(struct
+        * by subtracting double hysteresis value.
+        */
+       if (crit_temp >= MLXSW_THERMAL_MODULE_TEMP_SHIFT)
+-              tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temperature = crit_temp -
++              tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temp = crit_temp -
+                                       MLXSW_THERMAL_MODULE_TEMP_SHIFT;
+       else
+-              tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temperature = crit_temp;
+-      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temperature = crit_temp;
+-      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temperature = emerg_temp;
++              tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temp = crit_temp;
++      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temp = crit_temp;
++      tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temp = emerg_temp;
+       return 0;
+ }
+@@ -209,11 +201,11 @@ static int mlxsw_thermal_bind(struct the
+               return 0;
+       for (i = 0; i < MLXSW_THERMAL_NUM_TRIPS; i++) {
+-              const struct mlxsw_cooling_states *state = &thermal->cooling_states[i];
++              const struct mlxsw_thermal_trip *trip = &thermal->trips[i];
+               err = thermal_zone_bind_cooling_device(tzdev, i, cdev,
+-                                                     state->max_state,
+-                                                     state->min_state,
++                                                     trip->max_state,
++                                                     trip->min_state,
+                                                      THERMAL_WEIGHT_DEFAULT);
+               if (err < 0) {
+                       dev_err(dev, "Failed to bind cooling device to trip %d\n", i);
+@@ -267,6 +259,61 @@ static int mlxsw_thermal_get_temp(struct
+       return 0;
+ }
++static int mlxsw_thermal_get_trip_type(struct thermal_zone_device *tzdev,
++                                     int trip,
++                                     enum thermal_trip_type *p_type)
++{
++      struct mlxsw_thermal *thermal = tzdev->devdata;
++
++      if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
++              return -EINVAL;
++
++      *p_type = thermal->trips[trip].type;
++      return 0;
++}
++
++static int mlxsw_thermal_get_trip_temp(struct thermal_zone_device *tzdev,
++                                     int trip, int *p_temp)
++{
++      struct mlxsw_thermal *thermal = tzdev->devdata;
++
++      if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
++              return -EINVAL;
++
++      *p_temp = thermal->trips[trip].temp;
++      return 0;
++}
++
++static int mlxsw_thermal_set_trip_temp(struct thermal_zone_device *tzdev,
++                                     int trip, int temp)
++{
++      struct mlxsw_thermal *thermal = tzdev->devdata;
++
++      if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
++              return -EINVAL;
++
++      thermal->trips[trip].temp = temp;
++      return 0;
++}
++
++static int mlxsw_thermal_get_trip_hyst(struct thermal_zone_device *tzdev,
++                                     int trip, int *p_hyst)
++{
++      struct mlxsw_thermal *thermal = tzdev->devdata;
++
++      *p_hyst = thermal->trips[trip].hyst;
++      return 0;
++}
++
++static int mlxsw_thermal_set_trip_hyst(struct thermal_zone_device *tzdev,
++                                     int trip, int hyst)
++{
++      struct mlxsw_thermal *thermal = tzdev->devdata;
++
++      thermal->trips[trip].hyst = hyst;
++      return 0;
++}
++
+ static struct thermal_zone_params mlxsw_thermal_params = {
+       .no_hwmon = true,
+ };
+@@ -275,6 +322,11 @@ static struct thermal_zone_device_ops ml
+       .bind = mlxsw_thermal_bind,
+       .unbind = mlxsw_thermal_unbind,
+       .get_temp = mlxsw_thermal_get_temp,
++      .get_trip_type  = mlxsw_thermal_get_trip_type,
++      .get_trip_temp  = mlxsw_thermal_get_trip_temp,
++      .set_trip_temp  = mlxsw_thermal_set_trip_temp,
++      .get_trip_hyst  = mlxsw_thermal_get_trip_hyst,
++      .set_trip_hyst  = mlxsw_thermal_set_trip_hyst,
+ };
+ static int mlxsw_thermal_module_bind(struct thermal_zone_device *tzdev,
+@@ -289,11 +341,11 @@ static int mlxsw_thermal_module_bind(str
+               return 0;
+       for (i = 0; i < MLXSW_THERMAL_NUM_TRIPS; i++) {
+-              const struct mlxsw_cooling_states *state = &tz->cooling_states[i];
++              const struct mlxsw_thermal_trip *trip = &tz->trips[i];
+               err = thermal_zone_bind_cooling_device(tzdev, i, cdev,
+-                                                     state->max_state,
+-                                                     state->min_state,
++                                                     trip->max_state,
++                                                     trip->min_state,
+                                                      THERMAL_WEIGHT_DEFAULT);
+               if (err < 0)
+                       goto err_thermal_zone_bind_cooling_device;
+@@ -381,10 +433,74 @@ static int mlxsw_thermal_module_temp_get
+       return 0;
+ }
++static int
++mlxsw_thermal_module_trip_type_get(struct thermal_zone_device *tzdev, int trip,
++                                 enum thermal_trip_type *p_type)
++{
++      struct mlxsw_thermal_module *tz = tzdev->devdata;
++
++      if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
++              return -EINVAL;
++
++      *p_type = tz->trips[trip].type;
++      return 0;
++}
++
++static int
++mlxsw_thermal_module_trip_temp_get(struct thermal_zone_device *tzdev,
++                                 int trip, int *p_temp)
++{
++      struct mlxsw_thermal_module *tz = tzdev->devdata;
++
++      if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
++              return -EINVAL;
++
++      *p_temp = tz->trips[trip].temp;
++      return 0;
++}
++
++static int
++mlxsw_thermal_module_trip_temp_set(struct thermal_zone_device *tzdev,
++                                 int trip, int temp)
++{
++      struct mlxsw_thermal_module *tz = tzdev->devdata;
++
++      if (trip < 0 || trip >= MLXSW_THERMAL_NUM_TRIPS)
++              return -EINVAL;
++
++      tz->trips[trip].temp = temp;
++      return 0;
++}
++
++static int
++mlxsw_thermal_module_trip_hyst_get(struct thermal_zone_device *tzdev, int trip,
++                                 int *p_hyst)
++{
++      struct mlxsw_thermal_module *tz = tzdev->devdata;
++
++      *p_hyst = tz->trips[trip].hyst;
++      return 0;
++}
++
++static int
++mlxsw_thermal_module_trip_hyst_set(struct thermal_zone_device *tzdev, int trip,
++                                 int hyst)
++{
++      struct mlxsw_thermal_module *tz = tzdev->devdata;
++
++      tz->trips[trip].hyst = hyst;
++      return 0;
++}
++
+ static struct thermal_zone_device_ops mlxsw_thermal_module_ops = {
+       .bind           = mlxsw_thermal_module_bind,
+       .unbind         = mlxsw_thermal_module_unbind,
+       .get_temp       = mlxsw_thermal_module_temp_get,
++      .get_trip_type  = mlxsw_thermal_module_trip_type_get,
++      .get_trip_temp  = mlxsw_thermal_module_trip_temp_get,
++      .set_trip_temp  = mlxsw_thermal_module_trip_temp_set,
++      .get_trip_hyst  = mlxsw_thermal_module_trip_hyst_get,
++      .set_trip_hyst  = mlxsw_thermal_module_trip_hyst_set,
+ };
+ static int mlxsw_thermal_gearbox_temp_get(struct thermal_zone_device *tzdev,
+@@ -414,6 +530,11 @@ static struct thermal_zone_device_ops ml
+       .bind           = mlxsw_thermal_module_bind,
+       .unbind         = mlxsw_thermal_module_unbind,
+       .get_temp       = mlxsw_thermal_gearbox_temp_get,
++      .get_trip_type  = mlxsw_thermal_module_trip_type_get,
++      .get_trip_temp  = mlxsw_thermal_module_trip_temp_get,
++      .set_trip_temp  = mlxsw_thermal_module_trip_temp_set,
++      .get_trip_hyst  = mlxsw_thermal_module_trip_hyst_get,
++      .set_trip_hyst  = mlxsw_thermal_module_trip_hyst_set,
+ };
+ static int mlxsw_thermal_get_max_state(struct thermal_cooling_device *cdev,
+@@ -495,8 +616,7 @@ mlxsw_thermal_module_tz_init(struct mlxs
+       else
+               snprintf(tz_name, sizeof(tz_name), "mlxsw-module%d",
+                        module_tz->module + 1);
+-      module_tz->tzdev = thermal_zone_device_register_with_trips(tz_name,
+-                                                      module_tz->trips,
++      module_tz->tzdev = thermal_zone_device_register(tz_name,
+                                                       MLXSW_THERMAL_NUM_TRIPS,
+                                                       MLXSW_THERMAL_TRIP_MASK,
+                                                       module_tz,
+@@ -540,8 +660,6 @@ mlxsw_thermal_module_init(struct device
+       module_tz->parent = thermal;
+       memcpy(module_tz->trips, default_thermal_trips,
+              sizeof(thermal->trips));
+-      memcpy(module_tz->cooling_states, default_cooling_states,
+-             sizeof(thermal->cooling_states));
+       /* Initialize all trip point. */
+       mlxsw_thermal_module_trips_reset(module_tz);
+       /* Read module temperature and thresholds. */
+@@ -637,8 +755,7 @@ mlxsw_thermal_gearbox_tz_init(struct mlx
+       else
+               snprintf(tz_name, sizeof(tz_name), "mlxsw-gearbox%d",
+                        gearbox_tz->module + 1);
+-      gearbox_tz->tzdev = thermal_zone_device_register_with_trips(tz_name,
+-                                              gearbox_tz->trips,
++      gearbox_tz->tzdev = thermal_zone_device_register(tz_name,
+                                               MLXSW_THERMAL_NUM_TRIPS,
+                                               MLXSW_THERMAL_TRIP_MASK,
+                                               gearbox_tz,
+@@ -695,8 +812,6 @@ mlxsw_thermal_gearboxes_init(struct devi
+               gearbox_tz = &area->tz_gearbox_arr[i];
+               memcpy(gearbox_tz->trips, default_thermal_trips,
+                      sizeof(thermal->trips));
+-              memcpy(gearbox_tz->cooling_states, default_cooling_states,
+-                     sizeof(thermal->cooling_states));
+               gearbox_tz->module = i;
+               gearbox_tz->parent = thermal;
+               gearbox_tz->slot_index = area->slot_index;
+@@ -812,7 +927,6 @@ int mlxsw_thermal_init(struct mlxsw_core
+       thermal->core = core;
+       thermal->bus_info = bus_info;
+       memcpy(thermal->trips, default_thermal_trips, sizeof(thermal->trips));
+-      memcpy(thermal->cooling_states, default_cooling_states, sizeof(thermal->cooling_states));
+       thermal->line_cards[0].slot_index = 0;
+       err = mlxsw_reg_query(thermal->core, MLXSW_REG(mfcr), mfcr_pl);
+@@ -862,8 +976,7 @@ int mlxsw_thermal_init(struct mlxsw_core
+                                MLXSW_THERMAL_SLOW_POLL_INT :
+                                MLXSW_THERMAL_POLL_INT;
+-      thermal->tzdev = thermal_zone_device_register_with_trips("mlxsw",
+-                                                    thermal->trips,
++      thermal->tzdev = thermal_zone_device_register("mlxsw",
+                                                     MLXSW_THERMAL_NUM_TRIPS,
+                                                     MLXSW_THERMAL_TRIP_MASK,
+                                                     thermal,
index 8eba6af90dc6f4e256784e08c145038ffd74357a..c42a7271679415725f11295c6b67a91297ab2b6d 100644 (file)
@@ -34,3 +34,4 @@ dmaengine-at_xdmac-restore-the-content-of-grws-regis.patch
 octeontx2-af-add-validation-for-lmac-type.patch
 drm-amd-don-t-allow-s0ix-on-apus-older-than-raven.patch
 bluetooth-add-cmd-validity-checks-at-the-start-of-hci_sock_ioctl.patch
+revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch