Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp41533pxk; Tue, 8 Sep 2020 21:09:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxPkAqdMGfJEWp41MA6lXsQVB7UfOOBiYpdlKtxETCdQ4Kurx6FqCcPBjCKUit+rGQ8qFgo X-Received: by 2002:a50:99d5:: with SMTP id n21mr2199737edb.88.1599624584956; Tue, 08 Sep 2020 21:09:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599624584; cv=none; d=google.com; s=arc-20160816; b=K0AfmiWgwsjgTzEqU2MArYpwagXV6Xr2QZxVmPn+SIvy/8D9Nm6XydRoHupP7sP8nh br54ec2aGmsMZbbQJN8jhuVpTiSnrEHQKAPRT24Nw5gtV3X4XNgyf6bF6IOTiXe+YVQo IiwYsn8cZXRAjNOVpasRat7YPAcQhupkwg1+Z4MwCBA+3EdjpF30+MLtgcl8TGd5gkP1 DlftGq6GpkxA112M1GBjaq32mkJgPS1TBTAR51/YV2dNVQhjyG6jGWepRGzepRpUZuTp WvMTQ2dlf0SqYJqYBL08bbnvrYmH0HDfx4IZmv4U58gfQ9pZfKPnapTTybGD8mNZa0VL JEcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=5l1eticj7qDEdDrm+OGUOAk8jXt5YDIoOSHNMBDZgrs=; b=vX83KiUyQ4ExO0xD7TrETRGFpS5u6miIpreqSWMBbGXxMoqm3Wopku2jdU2VUT4Isr ZvDDN66GJXGJjjOSkco6377BB4zKrvAFkoBUZPr5qdt32Oj+FLDDM24vW2RA7c6Mfgi9 ucsN5OFustJprLgilMWA57vpVMF9MwFJwbH3QO68E2WKVA1HHGEXPXvEK9BxOQyQxRfg r+kRyrHxMCJvfizsEyKsEmFe2XPT4GA23MtPfjQX8BIKZ9ncjZeF6SkIkGUawtTPuFAx etywHPF0bux79HsejwiJKNJ0Hzhs9fqzMFJOYEJ4AczzsdcnNNMX5RNziTOLl7EdFgxO AytQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QKCBOrW+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h19si669430edv.301.2020.09.08.21.09.22; Tue, 08 Sep 2020 21:09:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QKCBOrW+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725856AbgIIEGH (ORCPT + 99 others); Wed, 9 Sep 2020 00:06:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54636 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725767AbgIIEGE (ORCPT ); Wed, 9 Sep 2020 00:06:04 -0400 Received: from mail-yb1-xb44.google.com (mail-yb1-xb44.google.com [IPv6:2607:f8b0:4864:20::b44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 65C14C061573 for ; Tue, 8 Sep 2020 21:06:04 -0700 (PDT) Received: by mail-yb1-xb44.google.com with SMTP id v78so894469ybv.5 for ; Tue, 08 Sep 2020 21:06:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=5l1eticj7qDEdDrm+OGUOAk8jXt5YDIoOSHNMBDZgrs=; b=QKCBOrW+n5uJloRSW/TtfMCk2ECMuKI0/Ix/ZlH1tx5chIYiuGO+fPBqUG39J/laqA tT3nj1TNAuEingDRkUbUa8yoGpLSXKacXQFIDkr4DuKukTkqc3r1tCZ6vRrhX76HFZ8R GvK4q2OapZQtyohQaPR40jrK6INB98O7Nsvp0yU/p1N7Ccjky2/e8SbNvxHuNTETNvtC KvuQZb/CpjTwhdYz0fuV+qXCCX/Zbbz62G6be0r39Le319Ah8pliXMsv+QYG+3PH3zJV /Q9+noQh1ZjjhzE2wg2ieli4Xuu9go5nTuYyKG9ox9LELbmLhYpHIZ6J0Y6iIpvB737Z dtjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=5l1eticj7qDEdDrm+OGUOAk8jXt5YDIoOSHNMBDZgrs=; b=DGS3v3u3kuoLDUT+zJFomTeKowsGGp/o2Y4C5yNojV4p6Amg2i/3ucYG0FgnF82Yqq G/TEa3bt2h+Qos2bDQozHaZD5CA3zO9sBJNXd04sPr3m894j+crWILmX7Tz7iwktHf5m EK3Dm1V0C9bbauAVorNLzcMDs7YtWCfilRj9mtST+78yudo4qgx2dzqjV6eyNpuMMzGv 6W63z/Cy2yHHdyzmCR2DbxnNopxw6CQWe2ILLmVRP5P0YorJI70GRShHCv2DOytYXURj JVUo++Kge0QkOFwAff/AEtsVUknvWpCNE2v1FBqD9RpW2Dyrva4azfK0FtF54cJQ8TKf PLog== X-Gm-Message-State: AOAM530u8tgZTI9B3ktAxt/LsuV1QRU4sEY3rqsoqp76TuaGMuc3TcFj hL8ptH5YV445r4o855c6p6PN6QclnVjgRyOTTZQ= X-Received: by 2002:a25:bc82:: with SMTP id e2mr2918057ybk.435.1599624363612; Tue, 08 Sep 2020 21:06:03 -0700 (PDT) MIME-Version: 1.0 References: <20200812204952.1921587-1-jcline@redhat.com> In-Reply-To: <20200812204952.1921587-1-jcline@redhat.com> From: Ben Skeggs Date: Wed, 9 Sep 2020 14:05:52 +1000 Message-ID: Subject: Re: [Nouveau] [PATCH] drm/nouveau: Add fine-grain temperature reporting To: Jeremy Cline Cc: Ben Skeggs , David Airlie , ML nouveau , LKML , ML dri-devel , Daniel Vetter Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 13 Aug 2020 at 06:50, Jeremy Cline wrote: > > Commit d32656373857 ("drm/nouveau/therm/gp100: initial implementation of > new gp1xx temperature sensor") added support for reading finer-grain > temperatures, but continued to report temperatures in 1 degree Celsius > increments via nvkm_therm_temp_get(). > > Rather than altering nvkm_therm_temp_get() to report finer-grain > temperatures, which would be inconvenient for other users of the > function, a second interface has been added to line up with hwmon's > native unit of temperature. Hey Jeremy, Sorry this slipped past me until now. I'm OK with adding support for millidegree temperature reporting, but don't think we need to keep both interfaces around and would rather see the existing code converted to return millidegrees (even on GPUs that don't support it) instead of degrees. Thanks! Ben. > > Signed-off-by: Jeremy Cline > --- > .../drm/nouveau/include/nvkm/subdev/therm.h | 18 +++++++++++++ > drivers/gpu/drm/nouveau/nouveau_hwmon.c | 4 +-- > .../gpu/drm/nouveau/nvkm/subdev/therm/base.c | 16 ++++++++++++ > .../gpu/drm/nouveau/nvkm/subdev/therm/gp100.c | 25 +++++++++++++++++-- > .../gpu/drm/nouveau/nvkm/subdev/therm/priv.h | 1 + > 5 files changed, 60 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h > index 62c34f98c930..7b9928dd001c 100644 > --- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h > +++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/therm.h > @@ -100,6 +100,24 @@ struct nvkm_therm { > }; > > int nvkm_therm_temp_get(struct nvkm_therm *); > + > +/** > + * nvkm_therm_temp_millidegree_get() - get the temperature in millidegrees > + * @therm: The thermal device to read from. > + * > + * This interface reports temperatures in units of millidegree Celsius to > + * align with the hwmon API. Some cards may only be capable of reporting in > + * units of Celsius, and those that report finer grain temperatures may not be > + * capable of millidegree Celsius accuracy, > + * > + * For cases where millidegree temperature is too fine-grain, the > + * nvkm_therm_temp_get() interface reports temperatures in one degree Celsius > + * increments. > + * > + * Return: The temperature in millidegrees Celsius, or -ENODEV if temperature > + * reporting is not supported. > + */ > +int nvkm_therm_temp_millidegree_get(struct nvkm_therm *therm); > int nvkm_therm_fan_sense(struct nvkm_therm *); > int nvkm_therm_cstate(struct nvkm_therm *, int, int); > void nvkm_therm_clkgate_init(struct nvkm_therm *, > diff --git a/drivers/gpu/drm/nouveau/nouveau_hwmon.c b/drivers/gpu/drm/nouveau/nouveau_hwmon.c > index 1c3104d20571..e96355f93ce5 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_hwmon.c > +++ b/drivers/gpu/drm/nouveau/nouveau_hwmon.c > @@ -428,8 +428,8 @@ nouveau_temp_read(struct device *dev, u32 attr, int channel, long *val) > case hwmon_temp_input: > if (drm_dev->switch_power_state != DRM_SWITCH_POWER_ON) > return -EINVAL; > - ret = nvkm_therm_temp_get(therm); > - *val = ret < 0 ? ret : (ret * 1000); > + ret = nvkm_therm_temp_millidegree_get(therm); > + *val = ret; > break; > case hwmon_temp_max: > *val = therm->attr_get(therm, NVKM_THERM_ATTR_THRS_DOWN_CLK) > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c > index 4a4d1e224126..e655b32c78b8 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c > @@ -34,6 +34,22 @@ nvkm_therm_temp_get(struct nvkm_therm *therm) > return -ENODEV; > } > > +int > +nvkm_therm_temp_millidegree_get(struct nvkm_therm *therm) > +{ > + int ret = -ENODEV; > + > + if (therm->func->temp_millidegree_get) > + return therm->func->temp_millidegree_get(therm); > + > + if (therm->func->temp_get) { > + ret = therm->func->temp_get(therm); > + if (ret > 0) > + ret *= 1000; > + } > + return ret; > +} > + > static int > nvkm_therm_update_trip(struct nvkm_therm *therm) > { > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.c > index 9f0dea3f61dc..4c3c2895a3cb 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.c > @@ -24,7 +24,7 @@ > #include "priv.h" > > static int > -gp100_temp_get(struct nvkm_therm *therm) > +gp100_temp_get_raw(struct nvkm_therm *therm) > { > struct nvkm_device *device = therm->subdev.device; > struct nvkm_subdev *subdev = &therm->subdev; > @@ -37,14 +37,35 @@ gp100_temp_get(struct nvkm_therm *therm) > > /* device valid */ > if (tsensor & 0x20000000) > - return (inttemp >> 8); > + return inttemp; > else > return -ENODEV; > } > > +static int > +gp100_temp_millidegree_get(struct nvkm_therm *therm) > +{ > + int raw_temp = gp100_temp_get_raw(therm); > + > + if (raw_temp < 0) > + return raw_temp; > + return raw_temp * 1000 >> 8; > +} > + > +static int > +gp100_temp_get(struct nvkm_therm *therm) > +{ > + int raw_temp = gp100_temp_get_raw(therm); > + > + if (raw_temp < 0) > + return raw_temp; > + return raw_temp >> 8; > +} > + > static const struct nvkm_therm_func > gp100_therm = { > .temp_get = gp100_temp_get, > + .temp_millidegree_get = gp100_temp_millidegree_get, > .program_alarms = nvkm_therm_program_alarms_polling, > }; > > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/priv.h b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/priv.h > index 21659daf1864..a53068b4f0b9 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/priv.h > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/priv.h > @@ -92,6 +92,7 @@ struct nvkm_therm_func { > int (*pwm_clock)(struct nvkm_therm *, int line); > > int (*temp_get)(struct nvkm_therm *); > + int (*temp_millidegree_get)(struct nvkm_therm *therm); > > int (*fan_sense)(struct nvkm_therm *); > > -- > 2.26.2 > > _______________________________________________ > Nouveau mailing list > Nouveau@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/nouveau