summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Chi <peter_chi@wistron.corp-partner.google.com>2022-08-17 19:33:56 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-08-29 23:46:50 +0000
commit7aa894e15600b02819119a02ca52bd8875009759 (patch)
treec3c6402ba63a8d70ca952724d4c82068d405ac16
parentc9dd7ec16dd696a27f51a0d55c4134384bf7f988 (diff)
downloadchrome-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.c90
-rw-r--r--board/crota/sensors.c4
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;