diff options
author | Peter Chi <peter_chi@wistron.corp-partner.google.com> | 2022-08-17 19:33:56 +0800 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-08-29 23:46:50 +0000 |
commit | 7aa894e15600b02819119a02ca52bd8875009759 (patch) | |
tree | c3c6402ba63a8d70ca952724d4c82068d405ac16 | |
parent | c9dd7ec16dd696a27f51a0d55c4134384bf7f988 (diff) | |
download | chrome-ec-7aa894e15600b02819119a02ca52bd8875009759.tar.gz |
crota: modify custom fan control
Sensor DDR also is a fan on/off switch:
- temperature > 38°C = on
- temperature < 37°C = off
Record actual and target RPM every 2 minutes.
BUG=b:243100667
BRANCH=none
TEST=make -j BOARD=crota
Signed-off-by: Peter Chi <peter_chi@wistron.corp-partner.google.com>
Change-Id: I069512cf68639e597351f2bf6877d95f45094c89
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3826595
Reviewed-by: caveh jalali <caveh@chromium.org>
-rw-r--r-- | board/crota/fans.c | 90 | ||||
-rw-r--r-- | board/crota/sensors.c | 4 |
2 files changed, 51 insertions, 43 deletions
diff --git a/board/crota/fans.c b/board/crota/fans.c index cbae27512f..c47004617f 100644 --- a/board/crota/fans.c +++ b/board/crota/fans.c @@ -12,12 +12,16 @@ #include "fan.h" #include "hooks.h" #include "pwm.h" +#include "timer.h" #include "thermal.h" #include "util.h" -#define SENSOR_SOC_FAN_OFF 35 -#define SENSOR_SOC_FAN_MID 45 -#define SENSOR_SOC_FAN_MAX 51 +#define SENSOR_SOC_FAN_OFF 30 +#define SENSOR_SOC_FAN_MID 47 +#define SENSOR_SOC_FAN_MAX 53 +#define SENSOR_DDR_FAN_TURN_OFF 37 +#define SENSOR_DDR_FAN_TURN_ON 38 +#define RECORD_TIME (2 * MINUTE) /* MFT channels. These are logically separate from pwm_channels. */ const struct mft_t mft_channels[] = { @@ -75,30 +79,24 @@ struct fan_t fans[FAN_CH_COUNT] = { }, }; -static void fan_set_percent(int fan, int pct, int soc_temp, int fan_triggered) +static void fan_get_rpm(int fan) { - int new_rpm; + static timestamp_t deadline; - switch (fan_triggered) { - case TEMP_SENSOR_1_SOC: - if (soc_temp > SENSOR_SOC_FAN_MID) - fans[fan].rpm = &rpm_table[RPM_TABLE_CPU1]; - else - fans[fan].rpm = &rpm_table[RPM_TABLE_CPU0]; - break; - case TEMP_SENSOR_2_DDR: - fans[fan].rpm = &rpm_table[RPM_TABLE_DDR]; - break; - case TEMP_SENSOR_3_CHARGER: - fans[fan].rpm = &rpm_table[RPM_TABLE_CHARGER]; - break; - case TEMP_SENSOR_4_AMBIENT: - fans[fan].rpm = &rpm_table[RPM_TABLE_AMBIENT]; - break; + /* Record actual RPM every 2 minutes. */ + if (timestamp_expired(deadline, NULL)) { + ccprints("fan actual rpm: %d", fan_get_rpm_actual(FAN_CH(fan))); + deadline.val += RECORD_TIME; } +} + +static void fan_set_percent(int fan, int pct) +{ + int new_rpm; new_rpm = fan_percent_to_rpm(fan, pct); fan_set_rpm_target(FAN_CH(fan), new_rpm); + fan_get_rpm(fan); } void board_override_fan_control(int fan, int *tmp) @@ -116,16 +114,15 @@ void board_override_fan_control(int fan, int *tmp) * by other sensors. * * Sensor SOC has two slopes for fan speed. - * + * Sensor DDR also become a fan on/off switch. */ - int pct; + static int pct; int sensor_soc; int sensor_ddr; int sensor_charger; int sensor_ambient; - int fan_triggered; - /* Decide sensor SOC temperature using which slope */ + /* Decide sensor SOC temperature using which slope. */ if (tmp[TEMP_SENSOR_1_SOC] > SENSOR_SOC_FAN_MID) { thermal_params[TEMP_SENSOR_1_SOC].temp_fan_off = C_TO_K(SENSOR_SOC_FAN_MID); @@ -156,23 +153,34 @@ void board_override_fan_control(int fan, int *tmp) C_TO_K(tmp[TEMP_SENSOR_4_AMBIENT])); /* - * Decide which sensor was triggered - * Priority: charger > soc > ddr > ambient + * Sensor DDR turn on when temperature > 38, + * turn off when temperature < 37 */ - if (sensor_charger) { - fan_triggered = TEMP_SENSOR_3_CHARGER; - pct = sensor_charger; - } else if (sensor_soc) { - fan_triggered = TEMP_SENSOR_1_SOC; - pct = sensor_soc; - } else if (sensor_ddr) { - fan_triggered = TEMP_SENSOR_2_DDR; - pct = sensor_ddr; - } else { - fan_triggered = TEMP_SENSOR_4_AMBIENT; - pct = sensor_ambient; + if ((tmp[TEMP_SENSOR_2_DDR]) < SENSOR_DDR_FAN_TURN_OFF) { + pct = 0; + } else if ((tmp[TEMP_SENSOR_2_DDR]) > SENSOR_DDR_FAN_TURN_ON) { + /* + * Decide which sensor was triggered and choose table. + * Priority: charger > soc > ddr > ambient + */ + if (sensor_charger) { + fans[fan].rpm = &rpm_table[RPM_TABLE_CHARGER]; + pct = sensor_charger; + } else if (sensor_soc) { + if (tmp[TEMP_SENSOR_1_SOC] > SENSOR_SOC_FAN_MID) + fans[fan].rpm = &rpm_table[RPM_TABLE_CPU1]; + else + fans[fan].rpm = &rpm_table[RPM_TABLE_CPU0]; + pct = sensor_soc; + } else if (sensor_ddr) { + fans[fan].rpm = &rpm_table[RPM_TABLE_DDR]; + pct = sensor_ddr; + } else { + fans[fan].rpm = &rpm_table[RPM_TABLE_AMBIENT]; + pct = sensor_ambient; + } } - /* Transfer percent to rpm */ - fan_set_percent(fan, pct, tmp[TEMP_SENSOR_1_SOC], fan_triggered); + /* Transfer percent to rpm. */ + fan_set_percent(fan, pct); } diff --git a/board/crota/sensors.c b/board/crota/sensors.c index e7e534dace..c757743c35 100644 --- a/board/crota/sensors.c +++ b/board/crota/sensors.c @@ -260,8 +260,8 @@ BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); .temp_host_release = { \ [EC_TEMP_THRESH_HIGH] = C_TO_K(77), \ }, \ - .temp_fan_off = C_TO_K(35), \ - .temp_fan_max = C_TO_K(45), \ + .temp_fan_off = C_TO_K(30), \ + .temp_fan_max = C_TO_K(47), \ } __maybe_unused static const struct ec_thermal_config thermal_cpu = THERMAL_CPU; |