• Rafael J. Wysocki's avatar
    thermal: core: Add trip thresholds for trip crossing detection · 44844db9
    Rafael J. Wysocki authored
    The trip crossing detection in handle_thermal_trip() does not work
    correctly in the cases when a trip point is crossed on the way up and
    then the zone temperature stays above its low temperature (that is, its
    temperature decreased by its hysteresis).  The trip temperature may
    be passed by the zone temperature subsequently in that case, even
    multiple times, but that does not count as the trip crossing as long as
    the zone temperature does not fall below the trip's low temperature or,
    in other words, until the trip is crossed on the way down.
    
    |-----------low--------high------------|
                 |<--------->|
                 |    hyst   |
                 |           |
                 |          -|--> crossed on the way up
                 |
             <---|-- crossed on the way down
    
    However, handle_thermal_trip() will invoke thermal_notify_tz_trip_up()
    every time the trip temperature is passed by the zone temperature on
    the way up regardless of whether or not the trip has been crossed on
    the way down yet.  Moreover, it will not call thermal_notify_tz_trip_down()
    if the last zone temperature was between the trip's temperature and its
    low temperature, so some "trip crossed on the way down" events may not
    be reported.
    
    To address this issue, introduce trip thresholds equal to either the
    temperature of the given trip, or its low temperature, such that if
    the trip's threshold is passed by the zone temperature on the way up,
    its value will be set to the trip's low temperature and
    thermal_notify_tz_trip_up() will be called, and if the trip's threshold
    is passed by the zone temperature on the way down, its value will be set
    to the trip's temperature (high) and thermal_notify_tz_trip_down() will
    be called.  Accordingly, if the threshold is passed on the way up, it
    cannot be passed on the way up again until its passed on the way down
    and if it is passed on the way down, it cannot be passed on the way down
    again until it is passed on the way up which guarantees correct
    triggering of trip crossing notifications.
    
    If the last temperature of the zone is invalid, the trip's threshold
    will be set depending of the zone's current temperature: If that
    temperature is above the trip's temperature, its threshold will be
    set to its low temperature or otherwise its threshold will be set to
    its (high) temperature.  Because the zone temperature is initially
    set to invalid and tz->last_temperature is only updated by
    update_temperature(), this is sufficient to set the correct initial
    threshold values for all trips.
    
    Link: https://lore.kernel.org/all/20220718145038.1114379-4-daniel.lezcano@linaro.orgSigned-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    44844db9
thermal_core.c 41.3 KB