summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Büchler <michael.buechler@posteo.net>2020-06-01 23:22:10 +0200
committerFelix Held <felix-coreboot@felixheld.de>2020-08-10 12:43:56 +0000
commite693b1d549621acfd20aaad876d4d5888ad5ca99 (patch)
tree82fa5ab5a7d24d6e52821be4f1ef7fdf28d3da7e
parenta2bb4553a558c4a33046a2e0f9c76b056e1c07fd (diff)
downloadcoreboot-e693b1d549621acfd20aaad876d4d5888ad5ca99.tar.gz
coreboot-e693b1d549621acfd20aaad876d4d5888ad5ca99.tar.bz2
coreboot-e693b1d549621acfd20aaad876d4d5888ad5ca99.zip
superio/ite: configure EC for fans to full at thermal limit
This applies to the automatic fan control mode of the environment controller (EC). Previously the affected bit was always cleared while the default value is 1 according to datasheets. Add a variable that can be set per mainboard in devicetree.cb. In the IT8783E datasheet that bit is marked as reserved. Signed-off-by: Michael Büchler <michael.buechler@posteo.net> Change-Id: Ie74102ac0d54be33558c161c9c84594d121772b1 Reviewed-on: https://review.coreboot.org/c/coreboot/+/44165 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
-rw-r--r--src/superio/ite/common/env_ctrl.c6
-rw-r--r--src/superio/ite/common/env_ctrl.h1
-rw-r--r--src/superio/ite/common/env_ctrl_chip.h19
3 files changed, 16 insertions, 10 deletions
diff --git a/src/superio/ite/common/env_ctrl.c b/src/superio/ite/common/env_ctrl.c
index f63bfd3eea2d..fbf74468b009 100644
--- a/src/superio/ite/common/env_ctrl.c
+++ b/src/superio/ite/common/env_ctrl.c
@@ -113,6 +113,7 @@ static void fan_smartconfig(const u16 base, const u8 fan,
u8 pwm_ctrl;
u8 pwm_start = 0;
u8 pwm_auto = 0;
+ u8 delta_temp;
if (mode == FAN_SMART_SOFTWARE) {
pwm_ctrl = ITE_EC_FAN_CTL_PWM_MODE_SOFTWARE;
@@ -145,8 +146,11 @@ static void fan_smartconfig(const u16 base, const u8 fan,
/* Full speed above 127°C by default */
pnp_write_hwm5_index(base, ITE_EC_FAN_CTL_TEMP_LIMIT_FULL(fan),
conf->tmp_full ? conf->tmp_full : 127);
+
+ delta_temp = ITE_EC_FAN_CTL_DELTA_TEMP_INTRVL(conf->tmp_delta);
+ delta_temp |= ITE_EC_FAN_CTL_FULL_AT_THRML_LMT(conf->full_lmt);
pnp_write_hwm5_index(base, ITE_EC_FAN_CTL_DELTA_TEMP(fan),
- ITE_EC_FAN_CTL_DELTA_TEMP_INTRVL(conf->tmp_delta));
+ delta_temp);
}
pnp_write_hwm5_index(base, ITE_EC_FAN_CTL_PWM_CONTROL(fan), pwm_ctrl);
diff --git a/src/superio/ite/common/env_ctrl.h b/src/superio/ite/common/env_ctrl.h
index e8fb1f5b01e2..7bce8097f557 100644
--- a/src/superio/ite/common/env_ctrl.h
+++ b/src/superio/ite/common/env_ctrl.h
@@ -185,6 +185,7 @@ static const u8 ITE_EC_TEMP_ADJUST[] = { 0x56, 0x57, 0x59 };
/* Common for ITE_EC_FAN_CTL_DELTA_TEMP */
#define ITE_EC_FAN_CTL_DELTA_TEMP_INTRVL(c) ((c) & 0x1f)
+#define ITE_EC_FAN_CTL_FULL_AT_THRML_LMT(x) (((x) & 0x1) << 6)
#define ITE_EC_FAN_CTL_TARGET_ZONE(x) (0x66 + ((x)-1) * 8)
#define ITE_EC_FAN_CTL_TARGET_ZONE_MASK 0x0f
diff --git a/src/superio/ite/common/env_ctrl_chip.h b/src/superio/ite/common/env_ctrl_chip.h
index 6a027b90f19f..09577a4d84e9 100644
--- a/src/superio/ite/common/env_ctrl_chip.h
+++ b/src/superio/ite/common/env_ctrl_chip.h
@@ -50,15 +50,16 @@ enum ite_ec_fan_mode {
};
struct ite_ec_fan_smartconfig {
- u8 tmpin; /* select TMPINx (1, 2 or 3) */
- u8 tmp_off; /* turn fan off below (°C) */
- u8 tmp_start; /* turn fan on above (°C) */
- u8 tmp_full; /* 100% duty cycle above (°C) */
- u8 tmp_delta; /* adapt fan speed when temperature
- changed by at least `tmp_delta`°C */
- u8 smoothing; /* enable smoothing */
- u8 pwm_start; /* start at this duty cycle (%) */
- u8 slope; /* increase duty cycle by `slope`%/°C */
+ u8 tmpin; /* select TMPINx (1, 2 or 3) */
+ u8 tmp_off; /* turn fan off below (°C) */
+ u8 tmp_start; /* turn fan on above (°C) */
+ u8 tmp_full; /* 100% duty cycle above (°C) */
+ u8 tmp_delta; /* adapt fan speed when temperature changed by
+ at least `tmp_delta`°C */
+ u8 full_lmt; /* force fan to full PWM at thermal limit */
+ u8 smoothing; /* enable smoothing */
+ u8 pwm_start; /* start at this duty cycle (%) */
+ u8 slope; /* increase duty cycle by `slope`%/°C */
};
struct ite_ec_fan_config {