summaryrefslogtreecommitdiff
path: root/common/thermal.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/thermal.c')
-rw-r--r--common/thermal.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/common/thermal.c b/common/thermal.c
index 6464ef7161..7113564f82 100644
--- a/common/thermal.c
+++ b/common/thermal.c
@@ -7,6 +7,7 @@
* implementation from the original version that shipped on Link.
*/
+#include "atomic.h"
#include "chipset.h"
#include "common.h"
#include "console.h"
@@ -45,8 +46,21 @@ static void dptf_init(void)
}
DECLARE_HOOK(HOOK_INIT, dptf_init, HOOK_PRIO_DEFAULT);
+/* Keep track of which triggered sensor thresholds the AP has seen */
+static uint32_t dptf_seen;
+int dptf_query_next_sensor_event(void)
+{
+ int id;
+ for (id = 0; id < TEMP_SENSOR_COUNT; id++)
+ if (dptf_seen & (1 << id)) { /* atomic? */
+ atomic_clear(&dptf_seen, (1 << id));
+ return id;
+ }
+
+ return -1;
+}
/* Return true if any threshold transition occurs. */
static int dpft_check_temp_threshold(int sensor_id, int temp)
@@ -68,11 +82,13 @@ static int dpft_check_temp_threshold(int sensor_id, int temp)
if (cond_went_true(&dptf_threshold[sensor_id][i].over)) {
CPRINTF("[%T DPTF over threshold [%d][%d]\n",
sensor_id, i);
+ atomic_or(&dptf_seen, (1 << sensor_id));
tripped = 1;
}
if (cond_went_false(&dptf_threshold[sensor_id][i].over)) {
CPRINTF("[%T DPTF under threshold [%d][%d]\n",
sensor_id, i);
+ atomic_or(&dptf_seen, (1 << sensor_id));
tripped = 1;
}
}
@@ -80,7 +96,6 @@ static int dpft_check_temp_threshold(int sensor_id, int temp)
return tripped;
}
-
void dptf_set_temp_threshold(int sensor_id, int temp, int idx, int enable)
{
CPRINTF("[%T DPTF sensor %d, threshold %d C, index %d, %sabled]\n",
@@ -89,15 +104,12 @@ void dptf_set_temp_threshold(int sensor_id, int temp, int idx, int enable)
if (enable) {
dptf_threshold[sensor_id][idx].temp = temp;
cond_init(&dptf_threshold[sensor_id][idx].over, 0);
+ atomic_clear(&dptf_seen, (1 << sensor_id));
} else {
dptf_threshold[sensor_id][idx].temp = -1;
}
}
-
-
-
-
/*****************************************************************************/
/* EC-specific thermal controls */
@@ -350,6 +362,7 @@ static int command_dptftemp(int argc, char **argv)
ccprintf(" %s\n", temp_sensors[id].name);
}
+ ccprintf("AP seen mask: 0x%08x\n", dptf_seen);
return EC_SUCCESS;
}
DECLARE_CONSOLE_COMMAND(dptftemp, command_dptftemp,