Message ID | 1431957407-24920-5-git-send-email-tharvey@gateworks.com |
---|---|
State | Awaiting Upstream |
Delegated to: | Stefano Babic |
Headers | show |
On Mon, May 18, 2015 at 6:56 AM, Tim Harvey <tharvey@gateworks.com> wrote: > Replace the hard-coded values for min/max/passive with values derived from > the CPU temperature grade. > > Signed-off-by: Tim Harvey <tharvey@gateworks.com> > --- > drivers/thermal/imx_thermal.c | 29 +++++++++++++++++++---------- > 1 file changed, 19 insertions(+), 10 deletions(-) > > diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c <snip> > -#define TEMPERATURE_MIN -40 > -#define TEMPERATURE_HOT 80 > -#define TEMPERATURE_MAX 125 <snip> > @@ -119,11 +124,12 @@ static int read_cpu_temperature(struct udevice *dev) > > int imx_thermal_get_temp(struct udevice *dev, int *temp) > { > + struct thermal_data *priv = dev_get_priv(dev); > int cpu_tmp = 0; > > cpu_tmp = read_cpu_temperature(dev); > - while (cpu_tmp > TEMPERATURE_MIN && cpu_tmp < TEMPERATURE_MAX) { > - if (cpu_tmp >= TEMPERATURE_HOT) { > + while (cpu_tmp > priv->minc && cpu_tmp < priv->maxc) { > + if (cpu_tmp >= priv->passive) { > printf("CPU Temperature is %d C, too hot to boot, waiting...\n", > cpu_tmp); > udelay(5000000); Ye, I'm curious where you got your previous hard-coded values of -40/80/125 from? The range of -40 to 125 makes me think it was assumed that the IMX6 was Automotive grade (probably a bad assumption) but I'm more curious about the value of 80C that kicks in this busywait loop above. <snip> > + /* set passive cooling temp to max - 20C */ > + get_cpu_temp_grade(&priv->minc, &priv->maxc); > + priv->passive = priv->maxc - 20; > + priv->fuse = fuse; > In my patch here I am calling your TEMPERATURE_HOT the 'passive' temp and setting it to maxc-20 which for an industrial grade CPU with a max of 105C is 85C. Do we really want to sit in a busywait loop if the board is too hot and if so isn't maxc-20 way too aggressive? I think that I should re-work this patch and set 'passive' to 'maxc' or maybe just a few C under it instead of 20C. Until then I'll need to disable CONFIG_IMX6_THERMAL for our board because it doesn't allow us to even run at an ambient temperature of 80C with an intdustrial processor (80C is the point at which the CPU hits 85C at 800Mhz in U-Boot on our board). Tim
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index 0bd9cfd..b5dab63 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c @@ -12,15 +12,13 @@ #include <fuse.h> #include <asm/io.h> #include <asm/arch/clock.h> +#include <asm/arch/sys_proto.h> #include <dm.h> #include <errno.h> #include <malloc.h> #include <thermal.h> #include <imx_thermal.h> -#define TEMPERATURE_MIN -40 -#define TEMPERATURE_HOT 80 -#define TEMPERATURE_MAX 125 #define FACTOR0 10000000 #define FACTOR1 15976 #define FACTOR2 4297157 @@ -34,14 +32,21 @@ #define MISC0_REFTOP_SELBIASOFF (1 << 3) #define TEMPSENSE1_MEASURE_FREQ 0xffff +struct thermal_data { + unsigned int fuse; + int passive; + int minc; + int maxc; +}; + static int read_cpu_temperature(struct udevice *dev) { int temperature; unsigned int reg, n_meas; const struct imx_thermal_plat *pdata = dev_get_platdata(dev); struct anatop_regs *anatop = (struct anatop_regs *)pdata->regs; - unsigned int *priv = dev_get_priv(dev); - u32 fuse = *priv; + struct thermal_data *priv = dev_get_priv(dev); + u32 fuse = priv->fuse; int t1, n1; u32 c1, c2; u64 temp64; @@ -119,11 +124,12 @@ static int read_cpu_temperature(struct udevice *dev) int imx_thermal_get_temp(struct udevice *dev, int *temp) { + struct thermal_data *priv = dev_get_priv(dev); int cpu_tmp = 0; cpu_tmp = read_cpu_temperature(dev); - while (cpu_tmp > TEMPERATURE_MIN && cpu_tmp < TEMPERATURE_MAX) { - if (cpu_tmp >= TEMPERATURE_HOT) { + while (cpu_tmp > priv->minc && cpu_tmp < priv->maxc) { + if (cpu_tmp >= priv->passive) { printf("CPU Temperature is %d C, too hot to boot, waiting...\n", cpu_tmp); udelay(5000000); @@ -147,7 +153,7 @@ static int imx_thermal_probe(struct udevice *dev) unsigned int fuse = ~0; const struct imx_thermal_plat *pdata = dev_get_platdata(dev); - unsigned int *priv = dev_get_priv(dev); + struct thermal_data *priv = dev_get_priv(dev); /* Read Temperature calibration data fuse */ fuse_read(pdata->fuse_bank, pdata->fuse_word, &fuse); @@ -158,7 +164,10 @@ static int imx_thermal_probe(struct udevice *dev) return -EPERM; } - *priv = fuse; + /* set passive cooling temp to max - 20C */ + get_cpu_temp_grade(&priv->minc, &priv->maxc); + priv->passive = priv->maxc - 20; + priv->fuse = fuse; enable_thermal_clk(); @@ -170,6 +179,6 @@ U_BOOT_DRIVER(imx_thermal) = { .id = UCLASS_THERMAL, .ops = &imx_thermal_ops, .probe = imx_thermal_probe, - .priv_auto_alloc_size = sizeof(unsigned int), + .priv_auto_alloc_size = sizeof(struct thermal_data), .flags = DM_FLAG_PRE_RELOC, };
Replace the hard-coded values for min/max/passive with values derived from the CPU temperature grade. Signed-off-by: Tim Harvey <tharvey@gateworks.com> --- drivers/thermal/imx_thermal.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-)