diff mbox

[U-Boot,v3,4/4] thermal: imx_thermal: use CPU temperature grade for trip points

Message ID 1431957407-24920-5-git-send-email-tharvey@gateworks.com
State Awaiting Upstream
Delegated to: Stefano Babic
Headers show

Commit Message

Tim Harvey May 18, 2015, 1:56 p.m. UTC
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(-)

Comments

Tim Harvey May 20, 2015, 2:09 p.m. UTC | #1
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 mbox

Patch

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,
 };