Skip to content

Commit 9292302

Browse files
zhang-ruirafaeljw
authored andcommitted
thermal: intel: pch: enhance overheat handling
Commit ef63b04 ("thermal: intel: pch: fix S0ix failure due to PCH temperature above threshold") introduces delay loop mechanism that allows PCH temperature to go down below threshold during suspend so it won't block S0ix. And the default overall delay timeout is 1 second. However, in practice, we found that the time it takes to cool the PCH down below threshold highly depends on the initial PCH temperature when the delay starts, as well as the ambient temperature. And in some cases, the 1 second delay is not sufficient. As a result, the system stays in a shallower power state like PCx instead of S0ix, and drains the battery power, without user' notice. To make sure S0ix is not blocked by the PCH overheating, we 1. expand the default overall timeout to 60 seconds. 2. make sure the temperature is below threshold rather than equal to it. At the same time, as the cooling delay can be much longer and many wakeup events (ACPI Power Button press, USB mouse move, etc) becomes valid in the suspend_noirq phase, add detection of wakeup event so that the driver does not delay blindly when the system suspend is likely to abort soon. This patch may introduce longer suspend time, but only in the cases when the system overheats and Linux used to enter a shallower S2idle state, say, PCx instead of S0ix. Signed-off-by: Zhang Rui <[email protected]> Tested-by: Sumeet Pawnikar <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 28708e1 commit 9292302

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

drivers/thermal/intel/intel_pch_thermal.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ static unsigned int delay_timeout = 100;
7070
module_param(delay_timeout, int, 0644);
7171
MODULE_PARM_DESC(delay_timeout, "amount of time delay for each iteration.");
7272

73-
/* Number of iterations for cooling delay, 10 counts by default for now */
74-
static unsigned int delay_cnt = 10;
73+
/* Number of iterations for cooling delay, 600 counts by default for now */
74+
static unsigned int delay_cnt = 600;
7575
module_param(delay_cnt, int, 0644);
7676
MODULE_PARM_DESC(delay_cnt, "total number of iterations for time delay.");
7777

@@ -197,7 +197,7 @@ static int pch_wpt_get_temp(struct pch_thermal_device *ptd, int *temp)
197197
static int pch_wpt_suspend(struct pch_thermal_device *ptd)
198198
{
199199
u8 tsel;
200-
u8 pch_delay_cnt = 1;
200+
int pch_delay_cnt = 1;
201201
u16 pch_thr_temp, pch_cur_temp;
202202

203203
/* Shutdown the thermal sensor if it is not enabled by BIOS */
@@ -234,7 +234,10 @@ static int pch_wpt_suspend(struct pch_thermal_device *ptd)
234234
* which helps to indentify the reason why S0ix entry was rejected.
235235
*/
236236
while (pch_delay_cnt <= delay_cnt) {
237-
if (pch_cur_temp <= pch_thr_temp)
237+
if (pch_cur_temp < pch_thr_temp)
238+
break;
239+
240+
if (pm_wakeup_pending())
238241
break;
239242

240243
dev_warn(&ptd->pdev->dev,
@@ -246,7 +249,7 @@ static int pch_wpt_suspend(struct pch_thermal_device *ptd)
246249
pch_delay_cnt++;
247250
}
248251

249-
if (pch_cur_temp > pch_thr_temp)
252+
if (pch_cur_temp >= pch_thr_temp)
250253
dev_warn(&ptd->pdev->dev,
251254
"CPU-PCH is hot [%dC] even after delay, continue to suspend. S0ix might fail\n",
252255
pch_cur_temp);

0 commit comments

Comments
 (0)