diff options
Diffstat (limited to 'common/dptf.c')
-rw-r--r-- | common/dptf.c | 204 |
1 files changed, 0 insertions, 204 deletions
diff --git a/common/dptf.c b/common/dptf.c deleted file mode 100644 index 33a42ba5af..0000000000 --- a/common/dptf.c +++ /dev/null @@ -1,204 +0,0 @@ -/* Copyright 2016 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "atomic.h" -#include "chipset.h" -#include "common.h" -#include "console.h" -#include "dptf.h" -#include "hooks.h" -#include "host_command.h" -#include "temp_sensor.h" -#include "util.h" - -#ifdef CONFIG_ZEPHYR -#include "temp_sensor/temp_sensor.h" -#endif - -/* Console output macros */ -#define CPUTS(outstr) cputs(CC_DPTF, outstr) -#define CPRINTS(format, args...) cprints(CC_DPTF, format, ## args) - -/*****************************************************************************/ -/* DPTF temperature thresholds */ - -static struct { - int temp; /* degrees K, negative for disabled */ - cond_t over; /* watch for crossings */ -} dptf_threshold[TEMP_SENSOR_COUNT][DPTF_THRESHOLDS_PER_SENSOR]; - -static void dptf_init(void) -{ - int id, t; - - for (id = 0; id < TEMP_SENSOR_COUNT; id++) - for (t = 0; t < DPTF_THRESHOLDS_PER_SENSOR; t++) { - dptf_threshold[id][t].temp = -1; - cond_init(&dptf_threshold[id][t].over, 0); - } - -} -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 & BIT(id)) { /* atomic? */ - atomic_clear_bits(&dptf_seen, BIT(id)); - return id; - } - - return -1; -} - -/* Return true if any threshold transition occurs. */ -static int dptf_check_temp_threshold(int sensor_id, int temp) -{ - int tripped = 0; - int max, i; - - if (sensor_id >= TEMP_SENSOR_COUNT) { - CPRINTS("DPTF: Invalid sensor ID"); - return 0; - } - - for (i = 0; i < DPTF_THRESHOLDS_PER_SENSOR; i++) { - - max = dptf_threshold[sensor_id][i].temp; - if (max < 0) /* disabled? */ - continue; - - if (temp >= max) - cond_set_true(&dptf_threshold[sensor_id][i].over); - else if (temp <= max - DPTF_THRESHOLD_HYSTERESIS) - cond_set_false(&dptf_threshold[sensor_id][i].over); - - if (cond_went_true(&dptf_threshold[sensor_id][i].over)) { - CPRINTS("DPTF over threshold [%d][%d", - sensor_id, i); - atomic_or(&dptf_seen, BIT(sensor_id)); - tripped = 1; - } - if (cond_went_false(&dptf_threshold[sensor_id][i].over)) { - CPRINTS("DPTF under threshold [%d][%d", - sensor_id, i); - atomic_or(&dptf_seen, BIT(sensor_id)); - tripped = 1; - } - } - - return tripped; -} - -void dptf_set_temp_threshold(int sensor_id, int temp, int idx, int enable) -{ - CPRINTS("DPTF sensor %d, threshold %d C, index %d, %sabled", - sensor_id, K_TO_C(temp), idx, enable ? "en" : "dis"); - - if ((sensor_id >= TEMP_SENSOR_COUNT) || - (idx >= DPTF_THRESHOLDS_PER_SENSOR)) { - CPRINTS("DPTF: Invalid sensor ID"); - return; - } - - if (enable) { - /* Don't update threshold condition if already enabled */ - if (dptf_threshold[sensor_id][idx].temp == -1) - cond_init(&dptf_threshold[sensor_id][idx].over, 0); - dptf_threshold[sensor_id][idx].temp = temp; - atomic_clear_bits(&dptf_seen, BIT(sensor_id)); - } else { - dptf_threshold[sensor_id][idx].temp = -1; - } -} - -/*****************************************************************************/ -/* EC-specific thermal controls */ - -test_mockable_static void smi_sensor_failure_warning(void) -{ - CPRINTS("can't read any temp sensors!"); - host_set_single_event(EC_HOST_EVENT_THERMAL); -} - -static void thermal_control_dptf(void) -{ - int i, t, rv; - int dptf_tripped; - int num_sensors_read; - - dptf_tripped = 0; - num_sensors_read = 0; - - /* go through all the sensors */ - for (i = 0; i < TEMP_SENSOR_COUNT; ++i) { - rv = temp_sensor_read(i, &t); - if (rv != EC_SUCCESS) - continue; - else - num_sensors_read++; - /* and check the dptf thresholds */ - dptf_tripped |= dptf_check_temp_threshold(i, t); - } - - if (!num_sensors_read) { - /* - * Trigger a SMI event if we can't read any sensors. - * - * In theory we could do something more elaborate like forcing - * the system to shut down if no sensors are available after - * several retries. This is a very unlikely scenario - - * particularly on LM4-based boards, since the LM4 has its own - * internal temp sensor. It's most likely to occur during - * bringup of a new board, where we haven't debugged the I2C - * bus to the sensors; forcing a shutdown in that case would - * merely hamper board bringup. - */ - if (!chipset_in_state(CHIPSET_STATE_HARD_OFF)) - smi_sensor_failure_warning(); - } - - /* Don't forget to signal any DPTF thresholds */ - if (dptf_tripped) - host_set_single_event(EC_HOST_EVENT_THERMAL_THRESHOLD); -} - -/* Wait until after the sensors have been read */ -DECLARE_HOOK(HOOK_SECOND, thermal_control_dptf, HOOK_PRIO_TEMP_SENSOR_DONE); - -/*****************************************************************************/ -/* Console commands */ - -static int command_dptftemp(int argc, char **argv) -{ - int id, t; - int temp, trig; - - ccprintf("sensor thresh0 thresh1\n"); - for (id = 0; id < TEMP_SENSOR_COUNT; id++) { - ccprintf(" %2d", id); - for (t = 0; t < DPTF_THRESHOLDS_PER_SENSOR; t++) { - temp = dptf_threshold[id][t].temp; - trig = cond_is_true(&dptf_threshold[id][t].over); - if (temp < 0) - ccprintf(" --- "); - else - ccprintf(" %3d%c", temp, - trig ? '*' : ' '); - } - 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, - NULL, - "Print DPTF thermal parameters (degrees Kelvin)"); |