diff options
author | Ryan Lin <ryan.lin@intel.com> | 2014-09-22 23:29:16 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-03-21 08:44:28 +0100 |
commit | bd978851b0988d32d2c7e85e493c32a5245e892c (patch) | |
tree | b9e0cab9ce1e4df4caaf4d7cd8aa68d323471c7b /src/superio/ite/it8772f/superio.c | |
parent | de77e6a99f37651aefe0abe3015dc7abc5562f54 (diff) |
superio: ite8772f: Exit extemp busy state
It causes fan top speed due to this bug + our board-specific workaround,
and causes invalid temperature sensor readings.
Therefore, re-configure the register "External Temperature Sensor Host
Control Register" to terminate processes when this issue happens.
BUG=chromium:402204
TEST=ran suspend_stress_test 500 times
Change-Id: I439d5de798fbe999e4eec5497e6969b7b453121b
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: b82f2922c7fce3ca6b2797a8d9775e9db2817fe9
Original-Change-Id: I6e71b6a46a31b00e541c304f1ed58c1678c1d42e
Original-Signed-off-by: Ryan Lin <ryan.lin@intel.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/219445
Original-Reviewed-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: http://review.coreboot.org/8820
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/superio/ite/it8772f/superio.c')
-rw-r--r-- | src/superio/ite/it8772f/superio.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/superio/ite/it8772f/superio.c b/src/superio/ite/it8772f/superio.c index ca103518a4..4d83280241 100644 --- a/src/superio/ite/it8772f/superio.c +++ b/src/superio/ite/it8772f/superio.c @@ -22,6 +22,7 @@ #include <device/pnp.h> #include <pc80/keyboard.h> #include <arch/io.h> +#include <delay.h> #include <stdlib.h> #include <superio/conf_mode.h> @@ -40,6 +41,34 @@ static inline void it8772f_envc_write(struct resource *res, u8 addr, u8 value) outb(value, res->base + 6); } +static void it8772f_extemp_force_idle_status(struct resource *res) +{ + u8 reg; + int retries = 10; + + /* Wait up to 10ms for non-busy state. */ + while (retries > 0) { + reg = it8772f_envc_read(res, IT8772F_EXTEMP_STATUS); + + if ((reg & IT8772F_EXTEMP_STATUS_HOST_BUSY) == 0x0) + break; + + retries--; + + mdelay(1); + } + + if (retries == 0 && (reg & IT8772F_EXTEMP_STATUS_HOST_BUSY) == 0x1) { + /* + * SIO is busy due to unfinished peci transaction. + * Re-configure Register 0x8E to terminate processes. + */ + it8772f_envc_write(res, IT8772F_EXTEMP_CONTROL, + IT8772F_EXTEMP_CONTROL_AUTO_4HZ | + IT8772F_EXTEMP_CONTROL_AUTO_START); + } +} + /* * Setup External Temperature to read via PECI into TMPINx register */ @@ -142,6 +171,13 @@ static void it8772f_init(struct device *dev) it8772f_enable_fan(res, 2); if (conf->fan3_enable) it8772f_enable_fan(res, 3); + + /* + * System may get wrong temperature data when SIO is in + * busy state. Therefore, check the status and terminate + * processes if needed. + */ + it8772f_extemp_force_idle_status(res); break; case IT8772F_GPIO: /* Set GPIO output levels */ |