From 32dae59f6f47736d4229b907d925951a9b0314c2 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 1 Jun 2023 10:42:32 +0100 Subject: [PATCH] 6.1-stable patches added patches: revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch --- ...neric-thermal_zone_get_trip-function.patch | 400 ++++++++++++++++++ queue-6.1/series | 1 + 2 files changed, 401 insertions(+) create mode 100644 queue-6.1/revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch 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 index 00000000000..26b0a83495c --- /dev/null +++ b/queue-6.1/revert-thermal-drivers-mellanox-use-generic-thermal_zone_get_trip-function.patch @@ -0,0 +1,400 @@ +From idosch@nvidia.com Thu Jun 1 10:41:52 2023 +From: Ido Schimmel +Date: Thu, 1 Jun 2023 09:48:03 +0300 +Subject: Revert "thermal/drivers/mellanox: Use generic thermal_zone_get_trip() function" +To: +Cc: , , , , , , , Ido Schimmel +Message-ID: <20230601064803.1063014-1-idosch@nvidia.com> + +From: Ido Schimmel + +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 +Tested-by: Joe Botha +Signed-off-by: Ido Schimmel +Signed-off-by: Greg Kroah-Hartman +--- + 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, diff --git a/queue-6.1/series b/queue-6.1/series index 8eba6af90dc..c42a7271679 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -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 -- 2.47.3