diff options
Diffstat (limited to 'board/morphius/thermal.c')
-rw-r--r-- | board/morphius/thermal.c | 522 |
1 files changed, 0 insertions, 522 deletions
diff --git a/board/morphius/thermal.c b/board/morphius/thermal.c deleted file mode 100644 index 449fd92d5d..0000000000 --- a/board/morphius/thermal.c +++ /dev/null @@ -1,522 +0,0 @@ -/* Copyright 2020 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 "chipset.h" -#include "common.h" -#include "console.h" -#include "extpower.h" -#include "fan.h" -#include "hooks.h" -#include "host_command.h" -#include "lid_switch.h" -#include "motion_lid.h" -#include "tablet_mode.h" -#include "temp_sensor.h" -#include "thermal.h" -#include "util.h" - -/* Console output macros */ -#define CPUTS(outstr) cputs(CC_THERMAL, outstr) -#define CPRINTS(format, args...) cprints(CC_THERMAL, format, ## args) - -struct fan_step { - /* - * Sensor 1~4 trigger point, set -1 if we're not using this - * sensor to determine fan speed. - */ - int8_t on[TEMP_SENSOR_COUNT]; - - /* - * Sensor 1~4 trigger point, set -1 if we're not using this - * sensor to determine fan speed. - */ - int8_t off[TEMP_SENSOR_COUNT]; - - /* Fan 1~2 rpm */ - uint16_t rpm[FAN_CH_COUNT]; -}; - -static const struct fan_step *fan_step_table; - -static const struct fan_step fan1_table_clamshell[] = { - { - /* level 0 */ - .on = {-1, -1, -1, -1}, - .off = {-1, -1, -1, -1}, - .rpm = {0}, - }, - { - /* level 1 */ - .on = {-1, -1, 40, -1}, - .off = {-1, -1, 31, -1}, - .rpm = {1900}, - }, - { - /* level 2 */ - .on = {-1, -1, 45, -1}, - .off = {-1, -1, 43, -1}, - .rpm = {2900}, - }, - { - /* level 3 */ - .on = {-1, -1, 48, -1}, - .off = {-1, -1, 46, -1}, - .rpm = {3200}, - }, - { - /* level 4 */ - .on = {-1, -1, 51, -1}, - .off = {-1, -1, 49, -1}, - .rpm = {3550}, - }, - { - /* level 5 */ - .on = {-1, -1, 54, -1}, - .off = {-1, -1, 52, -1}, - .rpm = {3950}, - }, - { - /* level 6 */ - .on = {-1, -1, 57, -1}, - .off = {-1, -1, 55, -1}, - .rpm = {4250}, - }, - { - /* level 7 */ - .on = {-1, -1, 60, -1}, - .off = {-1, -1, 58, -1}, - .rpm = {4650}, - }, -}; - -static const struct fan_step fan1_table_tablet[] = { - { - /* level 0 */ - .on = {-1, -1, -1, -1}, - .off = {-1, -1, -1, -1}, - .rpm = {0}, - }, - { - /* level 1 */ - .on = {-1, -1, 41, -1}, - .off = {-1, -1, 31, -1}, - .rpm = {2100}, - }, - { - /* level 2 */ - .on = {-1, -1, 50, -1}, - .off = {-1, -1, 48, -1}, - .rpm = {2600}, - }, - { - /* level 3 */ - .on = {-1, -1, 54, -1}, - .off = {-1, -1, 52, -1}, - .rpm = {2800}, - }, - { - /* level 4 */ - .on = {-1, -1, 57, -1}, - .off = {-1, -1, 55, -1}, - .rpm = {3300}, - }, - { - /* level 5 */ - .on = {-1, -1, 60, -1}, - .off = {-1, -1, 58, -1}, - .rpm = {3800}, - }, - { - /* level 6 */ - .on = {-1, -1, 72, -1}, - .off = {-1, -1, 69, -1}, - .rpm = {4000}, - }, - { - /* level 7 */ - .on = {-1, -1, 74, -1}, - .off = {-1, -1, 73, -1}, - .rpm = {4300}, - }, -}; - -static const struct fan_step fan1_table_stand[] = { - { - /* level 0 */ - .on = {-1, -1, -1, -1}, - .off = {-1, -1, -1, -1}, - .rpm = {0}, - }, - { - /* level 1 */ - .on = {-1, -1, 34, -1}, - .off = {-1, -1, 31, -1}, - .rpm = {1850}, - }, - { - /* level 2 */ - .on = {-1, -1, 42, -1}, - .off = {-1, -1, 39, -1}, - .rpm = {2550}, - }, - { - /* level 3 */ - .on = {-1, -1, 49, -1}, - .off = {-1, -1, 48, -1}, - .rpm = {2900}, - }, - { - /* level 4 */ - .on = {-1, -1, 51, -1}, - .off = {-1, -1, 50, -1}, - .rpm = {3350}, - }, - { - /* level 5 */ - .on = {-1, -1, 53, -1}, - .off = {-1, -1, 52, -1}, - .rpm = {3700}, - }, - { - /* level 6 */ - .on = {-1, -1, 55, -1}, - .off = {-1, -1, 54, -1}, - .rpm = {3900}, - }, - { - /* level 7 */ - .on = {-1, -1, 57, -1}, - .off = {-1, -1, 56, -1}, - .rpm = {4250}, - }, -}; - -static const struct fan_step fan0_table_clamshell[] = { - { - /* level 0 */ - .on = {-1, -1, -1, -1}, - .off = {-1, -1, -1, -1}, - .rpm = {0}, - }, - { - /* level 1 */ - .on = {-1, -1, 41, -1}, - .off = {-1, -1, 31, -1}, - .rpm = {2350}, - }, - { - /* level 2 */ - .on = {-1, -1, 44, -1}, - .off = {-1, -1, 42, -1}, - .rpm = {3300}, - }, - { - /* level 3 */ - .on = {-1, -1, 47, -1}, - .off = {-1, -1, 45, -1}, - .rpm = {3600}, - }, - { - /* level 4 */ - .on = {-1, -1, 50, -1}, - .off = {-1, -1, 48, -1}, - .rpm = {4050}, - }, - { - /* level 5 */ - .on = {-1, -1, 53, -1}, - .off = {-1, -1, 51, -1}, - .rpm = {4450}, - }, - { - /* level 6 */ - .on = {-1, -1, 56, -1}, - .off = {-1, -1, 54, -1}, - .rpm = {4750}, - }, - { - /* level 7 */ - .on = {-1, -1, 59, -1}, - .off = {-1, -1, 57, -1}, - .rpm = {5150}, - }, -}; - -static const struct fan_step fan0_table_tablet[] = { - { - /* level 0 */ - .on = {-1, -1, -1, -1}, - .off = {-1, -1, -1, -1}, - .rpm = {0}, - }, - { - /* level 1 */ - .on = {-1, -1, 41, -1}, - .off = {-1, -1, 31, -1}, - .rpm = {2250}, - }, - { - /* level 2 */ - .on = {-1, -1, 50, -1}, - .off = {-1, -1, 48, -1}, - .rpm = {2850}, - }, - { - /* level 3 */ - .on = {-1, -1, 54, -1}, - .off = {-1, -1, 51, -1}, - .rpm = {3100}, - }, - { - /* level 4 */ - .on = {-1, -1, 57, -1}, - .off = {-1, -1, 55, -1}, - .rpm = {3500}, - }, - { - /* level 5 */ - .on = {-1, -1, 60, -1}, - .off = {-1, -1, 58, -1}, - .rpm = {3900}, - }, - { - /* level 6 */ - .on = {-1, -1, 72, -1}, - .off = {-1, -1, 69, -1}, - .rpm = {4150}, - }, - { - /* level 7 */ - .on = {-1, -1, 74, -1}, - .off = {-1, -1, 73, -1}, - .rpm = {4400}, - }, -}; - -static const struct fan_step fan0_table_stand[] = { - { - /* level 0 */ - .on = {-1, -1, -1, -1}, - .off = {-1, -1, -1, -1}, - .rpm = {0}, - }, - { - /* level 1 */ - .on = {-1, -1, 34, -1}, - .off = {-1, -1, 31, -1}, - .rpm = {2250}, - }, - { - /* level 2 */ - .on = {-1, -1, 42, -1}, - .off = {-1, -1, 39, -1}, - .rpm = {2800}, - }, - { - /* level 3 */ - .on = {-1, -1, 49, -1}, - .off = {-1, -1, 48, -1}, - .rpm = {3150}, - }, - { - /* level 4 */ - .on = {-1, -1, 51, -1}, - .off = {-1, -1, 50, -1}, - .rpm = {3550}, - }, - { - /* level 5 */ - .on = {-1, -1, 53, -1}, - .off = {-1, -1, 52, -1}, - .rpm = {3900}, - }, - { - /* level 6 */ - .on = {-1, -1, 55, -1}, - .off = {-1, -1, 54, -1}, - .rpm = {4150}, - }, - { - /* level 7 */ - .on = {-1, -1, 57, -1}, - .off = {-1, -1, 56, -1}, - .rpm = {4400}, - }, -}; - -#define NUM_FAN_LEVELS ARRAY_SIZE(fan1_table_clamshell) - -#define lid_angle_tablet 340 -static int throttle_on; - -BUILD_ASSERT(ARRAY_SIZE(fan1_table_clamshell) == - ARRAY_SIZE(fan1_table_tablet)); - -#define average_time 60 -int fan_table_to_rpm(int fan, int *temp) -{ - static int current_level; - static int avg_tmp[TEMP_SENSOR_COUNT]; - static int avg_calc_tmp[TEMP_SENSOR_COUNT][average_time]; - static int prev_tmp[TEMP_SENSOR_COUNT]; - static int new_rpm; - int i, j, avg_sum = 0; - int lid_angle = motion_lid_get_angle(); - static int fan_up_count, fan_down_count; - static int temp_count; - - /* - * Select different fan curve table - * by mode: clamshell, tent/stand, tablet and fan id - */ - if (tablet_get_mode()) { - if (gpio_get_level(GPIO_FAN_ID)) - fan_step_table = fan1_table_stand; - else - fan_step_table = fan0_table_stand; - - if (lid_angle >= lid_angle_tablet) { - if (gpio_get_level(GPIO_FAN_ID)) - fan_step_table = fan1_table_tablet; - else - fan_step_table = fan0_table_tablet; - } - } else { - if (gpio_get_level(GPIO_FAN_ID)) - fan_step_table = fan1_table_clamshell; - else - fan_step_table = fan0_table_clamshell; - } - - /* - * Average temp 60 sec timing average - */ - if (temp_count < average_time) { - avg_calc_tmp[TEMP_SENSOR_CPU][temp_count] = - temp[TEMP_SENSOR_CPU]; - temp_count++; - } else - temp_count = 0; - - for (j = 0; j < average_time; j++) - avg_sum = avg_sum + avg_calc_tmp[TEMP_SENSOR_CPU][j]; - - avg_tmp[TEMP_SENSOR_CPU] = avg_sum/average_time; - - /* - * Compare the current and previous temperature, we have - * the three paths : - * 1. decreasing path. (check the release point) - * 2. increasing path. (check the trigger point) - * 3. invariant path. (return the current RPM) - */ - if (avg_tmp[TEMP_SENSOR_CPU] < prev_tmp[TEMP_SENSOR_CPU]) { - for (i = current_level; i >= 0; i--) { - if (avg_tmp[TEMP_SENSOR_CPU] < - fan_step_table[i].off[TEMP_SENSOR_CPU]) { - /* - * fan step down debounce - */ - if (fan_down_count < 10) { - fan_down_count++; - fan_up_count = 0; - - return new_rpm; - } - fan_down_count = 0; - fan_up_count = 0; - - current_level = i - 1; - } else - break; - } - } else if (avg_tmp[TEMP_SENSOR_CPU] > prev_tmp[TEMP_SENSOR_CPU]) { - for (i = current_level+1; i < NUM_FAN_LEVELS; i++) { - if ((avg_tmp[TEMP_SENSOR_CPU] > - fan_step_table[i].on[TEMP_SENSOR_CPU])) { - /* - * fan step up debounce - */ - if (fan_up_count < 10) { - fan_up_count++; - fan_down_count = 0; - - return new_rpm; - } - fan_down_count = 0; - fan_up_count = 0; - - current_level = i; - } else - break; - } - } else { - fan_down_count = 0; - fan_up_count = 0; - } - - if (current_level < 1) - current_level = 1; - - if (current_level >= 7) - current_level = 7; - - for (i = 0; i < TEMP_SENSOR_COUNT; ++i) - prev_tmp[i] = avg_tmp[i]; - - ASSERT(current_level < NUM_FAN_LEVELS); - - switch (fan) { - case FAN_CH_0: - new_rpm = fan_step_table[current_level].rpm[FAN_CH_0]; - break; - default: - break; - } - - return new_rpm; -} - -void board_override_fan_control(int fan, int *tmp) -{ - if (chipset_in_state(CHIPSET_STATE_ON | CHIPSET_STATE_ANY_SUSPEND)) { - int new_rpm = fan_table_to_rpm(fan, tmp); - - if (new_rpm != fan_get_rpm_target(FAN_CH(fan))) { - cprints(CC_THERMAL, "Setting fan RPM to %d", new_rpm); - board_print_temps(); - fan_set_rpm_mode(FAN_CH(fan), 1); - fan_set_rpm_target(FAN_CH(fan), new_rpm); - } - } -} - -void thermal_protect(void) -{ - if ((!lid_is_open()) && (!extpower_is_present())) { - int rv1, rv2; - int thermal_sensor1, thermal_sensor2; - - rv1 = temp_sensor_read(TEMP_SENSOR_5V_REGULATOR, - &thermal_sensor1); - rv2 = temp_sensor_read(TEMP_SENSOR_CPU, - &thermal_sensor2); - - if (rv2 == EC_SUCCESS) { - if (thermal_sensor2 > C_TO_K(70)) { - chipset_throttle_cpu(1); - throttle_on = 1; - } else if (thermal_sensor2 < C_TO_K(60) && - throttle_on) { - chipset_throttle_cpu(0); - throttle_on = 0; - } - } - if (rv1 == EC_SUCCESS && - thermal_sensor1 > C_TO_K(51)) - chipset_force_shutdown(CHIPSET_SHUTDOWN_THERMAL); - } -} -DECLARE_HOOK(HOOK_SECOND, thermal_protect, HOOK_PRIO_DEFAULT); |