Thermal control fixes for 6.10-rc4
- Prevent the thermal core from failing the registration of a cooling device if its .get_cur_state() reports an incorrect state to start with which may happen for fans handled through firmware-supplied AML in ACPI tables (Rafael Wysocki). - Make the ACPI thermal zone driver initialize all trip points with temperature of 0 centigrade and below as invalid because such trip point temperatures do not make sense on systems with ACPI thermal control and they cause performance regressions due to permanent thermal mitigations to occur (Rafael Wysocki). - Restore passive polling management in the Step-Wise thermal governor that uses it to ensure that all cooling devices used for thermal mitigation will go back to their initial states eventually (Rafael Wysocki). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmZsQZASHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRx9OMP/1RX+WL0CIIaeuMFapZDmtNoflkl2HF/ Cx7S1ETc79dxgglZjlfNDi8Ebs9EHAgsqQlpbwNQA0959BideY5sFOgzbhdSYfs1 NhS+rDobXKNnmH7v3sABNNnRdQAsYC57WThNZVBBOmPyh3XCS2+JiRu2BZ3CpszO pqotB+ayOEfbhswLWKfG5o36TbXiwpAsmfyl4bTJMxdAA+FwrcIlHYaDx0WaDGzN NQhgz+PPg6Vu59eNu7N6/WInVL8k34/JMGhgseN1nHCZHhTUzl8TQfdBG761B4L4 +gLGaqFkIWm88EPlFYxyBSYqEISvi4Ap3vjBhbLMrGfQNJ//KjqEOdSz9C1fK2mF BIZwpOq9W6ccL6IvznefkHRn7Qbjbk19etp4oG/CBvOW+n0bvRRv6atVckNZju4P PMTzkLFTo6h6YN5PP6WCkbq3SsO7GacLWkpgiqedFdy5sophud7rcmuG9MR1XiFV Ozvm7VV9ONJBtrv4Vx6uwmwerzl1qomCboOn1yCAq7WBvBaloKDRFWHlyqwrgzBP FM0kByyEioF7aYdRB6kC7uZ11o3Fq9Z1TRlZZMsG1tmySdx2IL/AbmIyO4+KyQIV jdM8xulNBT3DhcwoBgcK6LsyY7Q0iTTb5gR6t5ndjDUCljgCAMf0RXqewXoetg9/ mFkOuLLZKtYp =bfRy -----END PGP SIGNATURE----- Merge tag 'thermal-6.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull thermal control fixes from Rafael Wysocki: "These fix three issues introduced recently, two related to defects in ACPI tables supplied by the platform firmware and one cause by a thermal core change that went too far: - Prevent the thermal core from failing the registration of a cooling device if its .get_cur_state() reports an incorrect state to start with which may happen for fans handled through firmware-supplied AML in ACPI tables (Rafael Wysocki) - Make the ACPI thermal zone driver initialize all trip points with temperature of 0 centigrade and below as invalid because such trip point temperatures do not make sense on systems with ACPI thermal control and they cause performance regressions due to permanent thermal mitigations to occur (Rafael Wysocki) - Restore passive polling management in the Step-Wise thermal governor that uses it to ensure that all cooling devices used for thermal mitigation will go back to their initial states eventually (Rafael Wysocki)" * tag 'thermal-6.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: thermal: gov_step_wise: Restore passive polling management thermal: ACPI: Invalidate trip points with temperature of 0 or below thermal: core: Do not fail cdev registration because of invalid initial state
This commit is contained in:
commit
cee84c0b00
|
@ -168,11 +168,17 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
|
|||
|
||||
static int acpi_thermal_temp(struct acpi_thermal *tz, int temp_deci_k)
|
||||
{
|
||||
int temp;
|
||||
|
||||
if (temp_deci_k == THERMAL_TEMP_INVALID)
|
||||
return THERMAL_TEMP_INVALID;
|
||||
|
||||
return deci_kelvin_to_millicelsius_with_offset(temp_deci_k,
|
||||
temp = deci_kelvin_to_millicelsius_with_offset(temp_deci_k,
|
||||
tz->kelvin_offset);
|
||||
if (temp <= 0)
|
||||
return THERMAL_TEMP_INVALID;
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
static bool acpi_thermal_trip_valid(struct acpi_thermal_trip *acpi_trip)
|
||||
|
|
|
@ -93,6 +93,23 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,
|
|||
if (instance->initialized && old_target == instance->target)
|
||||
continue;
|
||||
|
||||
if (trip->type == THERMAL_TRIP_PASSIVE) {
|
||||
/*
|
||||
* If the target state for this thermal instance
|
||||
* changes from THERMAL_NO_TARGET to something else,
|
||||
* ensure that the zone temperature will be updated
|
||||
* (assuming enabled passive cooling) until it becomes
|
||||
* THERMAL_NO_TARGET again, or the cooling device may
|
||||
* not be reset to its initial state.
|
||||
*/
|
||||
if (old_target == THERMAL_NO_TARGET &&
|
||||
instance->target != THERMAL_NO_TARGET)
|
||||
tz->passive++;
|
||||
else if (old_target != THERMAL_NO_TARGET &&
|
||||
instance->target == THERMAL_NO_TARGET)
|
||||
tz->passive--;
|
||||
}
|
||||
|
||||
instance->initialized = true;
|
||||
|
||||
mutex_lock(&instance->cdev->lock);
|
||||
|
|
|
@ -999,9 +999,17 @@ __thermal_cooling_device_register(struct device_node *np,
|
|||
if (ret)
|
||||
goto out_cdev_type;
|
||||
|
||||
/*
|
||||
* The cooling device's current state is only needed for debug
|
||||
* initialization below, so a failure to get it does not cause
|
||||
* the entire cooling device initialization to fail. However,
|
||||
* the debug will not work for the device if its initial state
|
||||
* cannot be determined and drivers are responsible for ensuring
|
||||
* that this will not happen.
|
||||
*/
|
||||
ret = cdev->ops->get_cur_state(cdev, ¤t_state);
|
||||
if (ret)
|
||||
goto out_cdev_type;
|
||||
current_state = ULONG_MAX;
|
||||
|
||||
thermal_cooling_device_setup_sysfs(cdev);
|
||||
|
||||
|
@ -1016,7 +1024,8 @@ __thermal_cooling_device_register(struct device_node *np,
|
|||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
thermal_debug_cdev_add(cdev, current_state);
|
||||
if (current_state <= cdev->max_state)
|
||||
thermal_debug_cdev_add(cdev, current_state);
|
||||
|
||||
/* Add 'this' new cdev to the global cdev list */
|
||||
mutex_lock(&thermal_list_lock);
|
||||
|
|
Loading…
Reference in New Issue