All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Peres <martin.peres@labri.fr>
To: "Pali Rohár" <pali.rohar@gmail.com>
Cc: David Airlie <airlied@linux.ie>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Ben Skeggs <bskeggs@redhat.com>
Subject: Re: nouveau: temperature on nv40 is unavailable since ad40d73ef533ab0ad16b4a1ab2f7870c1f8ab954
Date: Wed, 14 Aug 2013 22:07:24 -0400	[thread overview]
Message-ID: <520C37DC.90902@labri.fr> (raw)
In-Reply-To: <201308141102.47960@pali>

[-- Attachment #1: Type: text/plain, Size: 1904 bytes --]

On 14/08/2013 05:02, Pali Rohár wrote:
> On Tuesday 13 August 2013 15:55:28 Martin Peres wrote:
>> On 13/08/2013 09:53, Pali Rohár wrote:
>>> On utorok, 13. augusta 2013 15:32:45 CEST, Martin Peres
> wrote:
>>>> On 13/08/2013 09:23, Pali Rohár wrote:
>>>>> On Tuesday 13 August 2013 09:01:19 Martin Peres wrote:
>>>>   ...
>>>>
>>>> You can check the temperature by running nvidia-settings.
>>>> If you can't see the temperature in it, then nvidia
>>>> doesn't support it on your card and
>>>> I'm not sure we should :s
>>>>
>>>> Thanks for the vbios you sent me in private. For the
>>>> others, the reason why he doesn't have temperature anymore
>>>> is because his vbios lacks sensor calibration values.
>>> In nvidia-settings tab "GPU 0 - (GeForce 6600 GT)" -->
>>> "Thermal Settings" is:
>>>
>>> Thermal Sensor Information:
>>> ID: 0
>>> Target: GPU
>>> Provider: GPU Internal
>>> Temperature: 70 C (now)
>>>
>>> I looked in Windows program SpeedFan. It found Nvidia PCI
>>> card and reported "GPU Temp" about 68-70 C. So it looks
>>> like both nvidia driver and windows SpeedFan program
>>> reading same values.
>> Great, I'll cook you a patch in a bit and you'll see what the
>> temperature is like. It won't be perfectly accurate but there
>> is some kind of default for nvidia cards of this generation.
> Ok, send me patch and I can try it if it will work and report
> similar values as windows or nvidia driver.
>
Sorry for the late answer.

Please test this patch. Be aware that temperature with nouveau will be 
higher than with the blob.
I only want to see if nouveau reports a temperature.

The only way to be sure if the values are good-enough would be to use 
the blob and run:
nvapeek 0x15b0
Please send me the result along with the temperature reported by nvidia 
at the time of the peek.

Martin

PS: This patch has only be compile-tested, I don't have access to an 
nv4x right now.

[-- Attachment #2: 0001-drm-nv40-therm-set-default-calibration-values-if-nee.patch --]
[-- Type: text/x-patch, Size: 4953 bytes --]

>From abe97f1e5de0b7ae5114802fcbc99d6e3408cd00 Mon Sep 17 00:00:00 2001
From: Martin Peres <martin.peres@labri.fr>
Date: Wed, 14 Aug 2013 22:00:48 -0400
Subject: [PATCH] drm/nv40/therm: set default calibration values if needed

Some vbios expose a thermal sensor but do not set default
calibration values. As they are almost always the same, let's
set some default ones.

Signed-off-by: Martin Peres <martin.peres@labri.fr>
---
 .../drm/nouveau/core/include/subdev/bios/therm.h   |  1 +
 drivers/gpu/drm/nouveau/core/subdev/bios/therm.c   |  1 +
 drivers/gpu/drm/nouveau/core/subdev/therm/nv40.c   | 36 ++++++++++++++++++----
 drivers/gpu/drm/nouveau/core/subdev/therm/temp.c   |  5 ++-
 4 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/bios/therm.h b/drivers/gpu/drm/nouveau/core/include/subdev/bios/therm.h
index 083541d..11b7993 100644
--- a/drivers/gpu/drm/nouveau/core/include/subdev/bios/therm.h
+++ b/drivers/gpu/drm/nouveau/core/include/subdev/bios/therm.h
@@ -10,6 +10,7 @@ struct nvbios_therm_threshold {
 
 struct nvbios_therm_sensor {
 	/* diode */
+	int has_sensor;
 	s16 slope_mult;
 	s16 slope_div;
 	s16 offset_num;
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/therm.c b/drivers/gpu/drm/nouveau/core/subdev/bios/therm.c
index 22a2057..16b763d 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/bios/therm.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/bios/therm.c
@@ -95,6 +95,7 @@ nvbios_therm_sensor_parse(struct nouveau_bios *bios,
 			sensor_section++;
 			if (sensor_section == 0) {
 				offset = ((s8) nv_ro08(bios, entry + 2)) / 2;
+				sensor->has_sensor = 1;
 				sensor->offset_constant = offset;
 			}
 			break;
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/nv40.c b/drivers/gpu/drm/nouveau/core/subdev/therm/nv40.c
index 002e51b..5312bbd 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/therm/nv40.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/therm/nv40.c
@@ -93,11 +93,6 @@ nv40_temp_get(struct nouveau_therm *therm)
 	} else
 		return -ENODEV;
 
-	/* if the slope or the offset is unset, do no use the sensor */
-	if (!sensor->slope_div || !sensor->slope_mult ||
-	    !sensor->offset_num || !sensor->offset_den)
-	    return -ENODEV;
-
 	core_temp = core_temp * sensor->slope_mult / sensor->slope_div;
 	core_temp = core_temp + sensor->offset_num / sensor->offset_den;
 	core_temp = core_temp + sensor->offset_constant - 8;
@@ -171,7 +166,7 @@ nv40_therm_intr(struct nouveau_subdev *subdev)
 	struct nouveau_therm *therm = nouveau_therm(subdev);
 	uint32_t stat = nv_rd32(therm, 0x1100);
 
-	/* traitement */
+	/* TODO: do something? Need more RE first */
 
 	/* ack all IRQs */
 	nv_wr32(therm, 0x1100, 0x70000);
@@ -202,11 +197,40 @@ nv40_therm_ctor(struct nouveau_object *parent,
 	return nouveau_therm_preinit(&priv->base.base);
 }
 
+static void
+nv40_therm_temp_safety_checks(struct nouveau_therm *therm)
+{
+	struct nouveau_therm_priv *priv = (void *)therm;
+	struct nvbios_therm_sensor *sensor = &priv->bios_sensor;
+	enum nv40_sensor_style style = nv40_sensor_style(therm);
+
+	/* if the slope or the offset is unset, do no use the sensor */
+	if (sensor->has_sensor && (!sensor->slope_div || !sensor->slope_mult ||
+	    !sensor->offset_num || !sensor->offset_den)) {
+
+		nv_info(therm, "Invalid sensor calibration values. "
+		               "Set default calibration values\n");
+
+		if (style == NEW_STYLE) {
+			sensor->slope_div = 10000;
+			sensor->slope_mult = 450;
+			sensor->offset_num = -25000;
+			sensor->offset_den = 100;
+		} else 	if (style == OLD_STYLE) {
+			sensor->slope_div = 1000;
+			sensor->slope_mult = 792;
+			sensor->offset_num = 2306;
+			sensor->offset_den = 100;
+		}
+	}
+}
+
 static int
 nv40_therm_init(struct nouveau_object *object)
 {
 	struct nouveau_therm *therm = (void *)object;
 
+	nv40_therm_temp_safety_checks(therm);
 	nv40_sensor_setup(therm);
 
 	return _nouveau_therm_init(object);
diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c b/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c
index dde746c..053034e 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/therm/temp.c
@@ -49,9 +49,8 @@ nouveau_therm_temp_set_defaults(struct nouveau_therm *therm)
 	priv->bios_sensor.thrs_shutdown.hysteresis = 5; /*not that it matters */
 }
 
-
 static void
-nouveau_therm_temp_safety_checks(struct nouveau_therm *therm)
+nouveau_therm_sensor_safety_checks(struct nouveau_therm *therm)
 {
 	struct nouveau_therm_priv *priv = (void *)therm;
 	struct nvbios_therm_sensor *s = &priv->bios_sensor;
@@ -239,7 +238,7 @@ nouveau_therm_sensor_ctor(struct nouveau_therm *therm)
 	if (nvbios_therm_sensor_parse(bios, NVBIOS_THERM_DOMAIN_CORE,
 				      &priv->bios_sensor))
 		nv_error(therm, "nvbios_therm_sensor_parse failed\n");
-	nouveau_therm_temp_safety_checks(therm);
+	nouveau_therm_sensor_safety_checks(therm);
 
 	return 0;
 }
-- 
1.8.3.4


  reply	other threads:[~2013-08-15  2:07 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-13  9:56 nouveau: temperature on nv40 is unavailable since ad40d73ef533ab0ad16b4a1ab2f7870c1f8ab954 Pali Rohár
2013-08-13 13:01 ` Martin Peres
2013-08-13 13:23   ` Pali Rohár
2013-08-13 13:32     ` Martin Peres
2013-08-13 13:53       ` Pali Rohár
2013-08-13 13:53         ` Pali Rohár
2013-08-13 13:55         ` Martin Peres
2013-08-14  9:02           ` Pali Rohár
2013-08-15  2:07             ` Martin Peres [this message]
2013-08-15  7:24               ` Pali Rohár
2013-08-15 22:21                 ` Martin Peres
2013-08-16  7:14                   ` Pali Rohár
2013-08-21 10:18                     ` Martin Peres

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=520C37DC.90902@labri.fr \
    --to=martin.peres@labri.fr \
    --cc=airlied@linux.ie \
    --cc=bskeggs@redhat.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pali.rohar@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.