Message ID | 20221018-up-i350-thermal-bringup-v7-4-ebf08ff2eddb@baylibre.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp126904wrr; Fri, 18 Nov 2022 03:08:33 -0800 (PST) X-Google-Smtp-Source: AA0mqf69aes48PCBQ6L5+3LCQFfhHSIkO0RNyFUR03u5jqqg7pD/L0RC26An/eI4RlRiDuMW8hiW X-Received: by 2002:a17:903:12d3:b0:186:a394:aef7 with SMTP id io19-20020a17090312d300b00186a394aef7mr7203298plb.79.1668769712824; Fri, 18 Nov 2022 03:08:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668769712; cv=none; d=google.com; s=arc-20160816; b=YBJ0uBRJSHNhXBKf0j1Pc8FWdooNCXzGNLqz5nwg5OjWiPlIQP20CC1Px8TSbvAVd0 x9JESKSA+EUc6V9Fl+NQB8EAqArTYcrdxCwnM9ZbkgOmtibB+vLaxu39/bU8l1vHY9su Y0HuxLBKPP4xFCfij30Yc+cZ/dBatkWDPj0H1Ol8tFGwe0/fo4qUQ1mESZLFf++ZMFoU k8IDuZJNs1sGEvrlL54FfsienCtGaL5nq2WqBAbNrr7nX3deoQjNMUusQgecTN17qJoG qIJUA7+0rz59Gpc8mAAK3WtTYWj2aa09BXI6aWRwevvrQgUgylEmuKxVLnXLFmjfMzD+ yZZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=BXRPB3JgawBUJiVUofK6OmJyzttuKnkImFf/wIqxXmQ=; b=HIX4erPG6ruzspOc9GIA5na5/sc/EE7XZkwEPLFCadIsAMjk7ohj0JULAJIP+D6Qov aVBO7Q/BZpZ9iEWiJLDPENGinfbV7WzZczgjflvMHT9FLl71WgyzxCraA/eTaEVgIqbh 9G9h1O+tK72l/zNhLg9AgIe+OsBOK2ehiLy7fQ5OkVY0rVjs/pa73Z4XUunTDQ9vuIhl J/RDc5bLfKtARaZ2axDppglDxOq+MudqTbPsAw0UGEw6PxMF9aAegDlO5OopoT8SjuaK cVva6jaI0jaP50dV/6o4MkgTWNhzSu3tGoOr1CSUgQ3Csq6DwULGTDp2i95V2yBHWwPV A/6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20210112.gappssmtp.com header.s=20210112 header.b=KXz1x7PV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k9-20020a170902d58900b0017f59ed2dfasi3781323plh.63.2022.11.18.03.08.12; Fri, 18 Nov 2022 03:08:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20210112.gappssmtp.com header.s=20210112 header.b=KXz1x7PV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241704AbiKRLFM (ORCPT <rfc822;kkmonlee@gmail.com> + 99 others); Fri, 18 Nov 2022 06:05:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44838 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235200AbiKRLFF (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 18 Nov 2022 06:05:05 -0500 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B05E399E91 for <linux-kernel@vger.kernel.org>; Fri, 18 Nov 2022 03:04:48 -0800 (PST) Received: by mail-wm1-x32e.google.com with SMTP id ay14-20020a05600c1e0e00b003cf6ab34b61so7276031wmb.2 for <linux-kernel@vger.kernel.org>; Fri, 18 Nov 2022 03:04:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BXRPB3JgawBUJiVUofK6OmJyzttuKnkImFf/wIqxXmQ=; b=KXz1x7PVIRSygnZq/WJqqkYdJAeEDf2cq41xcS/VX2QD44aZpL/6lsm2HYsNKak+t8 /QWHfu2YG+yNalsfGy2TueUVs/X53k15FQI48MzsUPxpw1S4ln+wwSAsRAIvhDMmfXw0 KTAOa9lLsbcNgwNUn4Xs3JX0gY0CAHcO1+mbHfLhZc/n0nBYl/Xq5QJU6S3Y/8if/IBz NmkDpgR118kqV/5krIRGUAYrbm1+yjNiyTb7F/XHu5kCQQX9X0QX+WE+00NctK7bPhoH JBERSXbdr1NvnbpGMZTYdv2D30JElwiupgig90mF1sS0vBG6qHDz8GBnJ3rCQUensy7u vH+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BXRPB3JgawBUJiVUofK6OmJyzttuKnkImFf/wIqxXmQ=; b=CYicuLrkR/6yffIQj4Ex+In5a97LrJ0PyEuFExLIT7JvIqsM1uxeI8ZiHjunPL7G6r 0Fw2Zdhyi6n7Wm65SHyvTyQkpuQrezLu6/8x6EMD3n4q7pwEYtmgLbbfK+yPafyWt/5R I3wFrn9AwV8pD5fUx3QTEP3tOvw13FLyfnVz7XOchbWhf+YIobdh0QQGc9pkRz4Z123W eT6RGhK2TFsBmjnGXqGjFZd2PPO5UgG5ebbB5UjWN1tp9yJVLmVk6jvtZxOSuBP+InrJ zGvZHU0tQy8nYs7CCgprBD4GlfSQJ8XV+JNnfKB7zNdlZfocxxHX3Sx92y5CTn8UOmmK 5uRA== X-Gm-Message-State: ANoB5pm38s9U6gGwGP/gbRxWOXcUj8FcvgKxHZyyA8Gvc5GaDbn9gpBn 4ORW4XV41E/3JTQA6CajOlbWGw== X-Received: by 2002:a1c:7318:0:b0:3cf:cb16:f24a with SMTP id d24-20020a1c7318000000b003cfcb16f24amr7919556wmb.182.1668769486966; Fri, 18 Nov 2022 03:04:46 -0800 (PST) Received: from [127.0.1.1] (210.145.15.109.rev.sfr.net. [109.15.145.210]) by smtp.googlemail.com with ESMTPSA id i14-20020adff30e000000b002368a6deaf8sm3316948wro.57.2022.11.18.03.04.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Nov 2022 03:04:46 -0800 (PST) From: Amjad Ouled-Ameur <aouledameur@baylibre.com> Date: Fri, 18 Nov 2022 12:04:30 +0100 Subject: [PATCH v7 4/4] thermal: mediatek: add another get_temp ops for thermal sensors MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Message-Id: <20221018-up-i350-thermal-bringup-v7-4-ebf08ff2eddb@baylibre.com> References: <20221018-up-i350-thermal-bringup-v7-0-ebf08ff2eddb@baylibre.com> In-Reply-To: <20221018-up-i350-thermal-bringup-v7-0-ebf08ff2eddb@baylibre.com> To: "Rafael J. Wysocki" <rafael@kernel.org>, Daniel Lezcano <daniel.lezcano@linaro.org>, Amit Kucheria <amitk@kernel.org>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Zhang Rui <rui.zhang@intel.com> Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>, Fabien Parent <fparent@baylibre.com>, Matthias Brugger <matthias.bgg@gmail.com>, Markus Schneider-Pargmann <msp@baylibre.com>, linux-pm@vger.kernel.org, Rob Herring <robh@kernel.org>, Michael Kao <michael.kao@mediatek.com>, linux-kernel@vger.kernel.org, Hsin-Yi Wang <hsinyi@chromium.org>, Amjad Ouled-Ameur <aouledameur@baylibre.com>, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org X-Mailer: b4 0.10.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1668769481; l=5806; i=aouledameur@baylibre.com; s=20220920; h=from:subject:message-id; bh=5USa4lcv1habf94U1XG70OWqS+dbiiwFE4XST76LPQw=; b=q86fGiC3Ko/ELXbxUMsvp4Vbrh6THMSWdimMwXIsJH+k/u3tdJb48xYGQChhrRRufTNbxy5XmkZE kcwXutTNAvno1UuMFE6rPBUgiToMXKGm3WKQ5GYFs0QFwK6+uWJg X-Developer-Key: i=aouledameur@baylibre.com; a=ed25519; pk=HgYWawSL4qLGPx+RzJ+Cuu+V8Pi/KQnDDm1wjWPMOFE= X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749831870533570787?= X-GMAIL-MSGID: =?utf-8?q?1749831870533570787?= |
Series |
thermal: mediatek: Add support for MT8365 SoC
|
|
Commit Message
Amjad Ouled-Ameur
Nov. 18, 2022, 11:04 a.m. UTC
Provide thermal zone to read thermal sensor in the SoC. We can read all the thermal sensors value in the SoC by the node /sys/class/thermal/ In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS on the first read of sensor that often are bogus values. This can avoid following warning on boot: thermal thermal_zone6: failed to read out thermal zone (-13) Signed-off-by: Michael Kao <michael.kao@mediatek.com> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> Signed-off-by: Amjad Ouled-Ameur <aouledameur@baylibre.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> --- drivers/thermal/mtk_thermal.c | 99 ++++++++++++++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 25 deletions(-)
Comments
On 18/11/2022 12:04, Amjad Ouled-Ameur wrote: > Provide thermal zone to read thermal sensor in the SoC. We can read all the > thermal sensors value in the SoC by the node /sys/class/thermal/ > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > on the first read of sensor that often are bogus values. > This can avoid following warning on boot: > > thermal thermal_zone6: failed to read out thermal zone (-13) > > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> > Signed-off-by: Amjad Ouled-Ameur <aouledameur@baylibre.com> > Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> > --- > drivers/thermal/mtk_thermal.c | 99 ++++++++++++++++++++++++++++++++----------- > 1 file changed, 74 insertions(+), 25 deletions(-) > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > index 3a5df1440822..b1f4d19edd4f 100644 > --- a/drivers/thermal/mtk_thermal.c > +++ b/drivers/thermal/mtk_thermal.c > @@ -259,6 +259,11 @@ enum mtk_thermal_version { > > struct mtk_thermal; > > +struct mtk_thermal_zone { > + struct mtk_thermal *mt; > + int id; > +}; > + > struct thermal_bank_cfg { > unsigned int num_sensors; > const int *sensors; > @@ -307,6 +312,8 @@ struct mtk_thermal { > > const struct mtk_thermal_data *conf; > struct mtk_thermal_bank banks[MAX_NUM_ZONES]; > + > + int (*raw_to_mcelsius)(struct mtk_thermal *mt, int sensno, s32 raw); > }; > > /* MT8183 thermal sensor data */ > @@ -709,6 +716,29 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > mutex_unlock(&mt->lock); > } > > +static int _get_sensor_temp(struct mtk_thermal *mt, int id) > +{ > + u32 raw; > + int temp; > + > + const struct mtk_thermal_data *conf = mt->conf; > + > + raw = readl(mt->thermal_base + conf->msr[id]); > + > + temp = mt->raw_to_mcelsius(mt, id, raw); > + > + /* > + * The first read of a sensor often contains very high bogus > + * temperature value. Filter these out so that the system does > + * not immediately shut down. > + */ > + > + if (temp > 200000) > + return -EAGAIN; > + else > + return temp; > +} > + > /** > * mtk_thermal_bank_temperature - get the temperature of a bank > * @bank: The bank > @@ -721,26 +751,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > struct mtk_thermal *mt = bank->mt; > const struct mtk_thermal_data *conf = mt->conf; > int i, temp = INT_MIN, max = INT_MIN; > - u32 raw; > > for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > - raw = readl(mt->thermal_base + conf->msr[i]); > - > - if (mt->conf->version == MTK_THERMAL_V1) { > - temp = raw_to_mcelsius_v1( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } else { > - temp = raw_to_mcelsius_v2( > - mt, conf->bank_data[bank->id].sensors[i], raw); > - } > - > - /* > - * The first read of a sensor often contains very high bogus > - * temperature value. Filter these out so that the system does > - * not immediately shut down. > - */ > - if (temp > 200000) > - temp = 0; > + temp = _get_sensor_temp(mt, i); > > if (temp > max) > max = temp; > @@ -749,9 +762,10 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > return max; > } > > -static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature) > +static int mtk_read_temp(struct thermal_zone_device *tzdev, int *temperature) > { > - struct mtk_thermal *mt = tz->devdata; > + struct mtk_thermal_zone *tz = tzdev->devdata; > + struct mtk_thermal *mt = tz->mt; > int i; > int tempmax = INT_MIN; > > @@ -770,10 +784,28 @@ static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature) > return 0; > } > > +static int mtk_read_sensor_temp(struct thermal_zone_device *tzdev, int *temperature) > +{ > + struct mtk_thermal_zone *tz = tzdev->devdata; > + struct mtk_thermal *mt = tz->mt; > + int id = tz->id - 1; > + > + if (id < 0) > + return -EACCES; > + > + *temperature = _get_sensor_temp(mt, id); > + > + return 0; > +} > + > static const struct thermal_zone_device_ops mtk_thermal_ops = { > .get_temp = mtk_read_temp, > }; > > +static const struct thermal_zone_device_ops mtk_thermal_sensor_ops = { > + .get_temp = mtk_read_sensor_temp, > +}; > + > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > u32 apmixed_phys_base, u32 auxadc_phys_base, > int ctrl_id) > @@ -1072,6 +1104,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) > u64 auxadc_phys_base, apmixed_phys_base; > struct thermal_zone_device *tzdev; > void __iomem *apmixed_base, *auxadc_base; > + struct mtk_thermal_zone *tz; > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > if (!mt) > @@ -1150,6 +1183,9 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > mtk_thermal_turn_on_buffer(mt, apmixed_base); > > + mt->raw_to_mcelsius = (mt->conf->version == MTK_THERMAL_V1) ? > + raw_to_mcelsius_v1 : raw_to_mcelsius_v2; > + > if (mt->conf->version == MTK_THERMAL_V2) { > mtk_thermal_release_periodic_ts(mt, auxadc_base); > } > @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, mt); > > - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, > - &mtk_thermal_ops); > - if (IS_ERR(tzdev)) { > - ret = PTR_ERR(tzdev); > - goto err_disable_clk_peri_therm; > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > + if (!tz) > + return -ENOMEM; > + > + tz->mt = mt; > + tz->id = i; > + > + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? > + &mtk_thermal_ops : > + &mtk_thermal_sensor_ops); Here you use again the aggregation > + > + if (IS_ERR(tzdev)) { > + ret = PTR_ERR(tzdev); > + if (ret == -ENODEV) > + continue; > + goto err_disable_clk_peri_therm; > + } > } > > ret = devm_thermal_add_hwmon_sysfs(tzdev); >
Hi Daniel, On Sun Dec 4, 2022 at 6:26 PM CET, Daniel Lezcano wrote: > On 18/11/2022 12:04, Amjad Ouled-Ameur wrote: > > Provide thermal zone to read thermal sensor in the SoC. We can read all the > > thermal sensors value in the SoC by the node /sys/class/thermal/ > > > > In mtk_thermal_bank_temperature, return -EAGAIN instead of -EACCESS > > on the first read of sensor that often are bogus values. > > This can avoid following warning on boot: > > > > thermal thermal_zone6: failed to read out thermal zone (-13) > > > > Signed-off-by: Michael Kao <michael.kao@mediatek.com> > > Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> > > Signed-off-by: Amjad Ouled-Ameur <aouledameur@baylibre.com> > > Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> > > --- > > drivers/thermal/mtk_thermal.c | 99 ++++++++++++++++++++++++++++++++----------- > > 1 file changed, 74 insertions(+), 25 deletions(-) > > > > diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c > > index 3a5df1440822..b1f4d19edd4f 100644 > > --- a/drivers/thermal/mtk_thermal.c > > +++ b/drivers/thermal/mtk_thermal.c > > @@ -259,6 +259,11 @@ enum mtk_thermal_version { > > > > struct mtk_thermal; > > > > +struct mtk_thermal_zone { > > + struct mtk_thermal *mt; > > + int id; > > +}; > > + > > struct thermal_bank_cfg { > > unsigned int num_sensors; > > const int *sensors; > > @@ -307,6 +312,8 @@ struct mtk_thermal { > > > > const struct mtk_thermal_data *conf; > > struct mtk_thermal_bank banks[MAX_NUM_ZONES]; > > + > > + int (*raw_to_mcelsius)(struct mtk_thermal *mt, int sensno, s32 raw); > > }; > > > > /* MT8183 thermal sensor data */ > > @@ -709,6 +716,29 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) > > mutex_unlock(&mt->lock); > > } > > > > +static int _get_sensor_temp(struct mtk_thermal *mt, int id) > > +{ > > + u32 raw; > > + int temp; > > + > > + const struct mtk_thermal_data *conf = mt->conf; > > + > > + raw = readl(mt->thermal_base + conf->msr[id]); > > + > > + temp = mt->raw_to_mcelsius(mt, id, raw); > > + > > + /* > > + * The first read of a sensor often contains very high bogus > > + * temperature value. Filter these out so that the system does > > + * not immediately shut down. > > + */ > > + > > + if (temp > 200000) > > + return -EAGAIN; > > + else > > + return temp; > > +} > > + > > /** > > * mtk_thermal_bank_temperature - get the temperature of a bank > > * @bank: The bank > > @@ -721,26 +751,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > > struct mtk_thermal *mt = bank->mt; > > const struct mtk_thermal_data *conf = mt->conf; > > int i, temp = INT_MIN, max = INT_MIN; > > - u32 raw; > > > > for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { > > - raw = readl(mt->thermal_base + conf->msr[i]); > > - > > - if (mt->conf->version == MTK_THERMAL_V1) { > > - temp = raw_to_mcelsius_v1( > > - mt, conf->bank_data[bank->id].sensors[i], raw); > > - } else { > > - temp = raw_to_mcelsius_v2( > > - mt, conf->bank_data[bank->id].sensors[i], raw); > > - } > > - > > - /* > > - * The first read of a sensor often contains very high bogus > > - * temperature value. Filter these out so that the system does > > - * not immediately shut down. > > - */ > > - if (temp > 200000) > > - temp = 0; > > + temp = _get_sensor_temp(mt, i); > > > > if (temp > max) > > max = temp; > > @@ -749,9 +762,10 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) > > return max; > > } > > > > -static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature) > > +static int mtk_read_temp(struct thermal_zone_device *tzdev, int *temperature) > > { > > - struct mtk_thermal *mt = tz->devdata; > > + struct mtk_thermal_zone *tz = tzdev->devdata; > > + struct mtk_thermal *mt = tz->mt; > > int i; > > int tempmax = INT_MIN; > > > > @@ -770,10 +784,28 @@ static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature) > > return 0; > > } > > > > +static int mtk_read_sensor_temp(struct thermal_zone_device *tzdev, int *temperature) > > +{ > > + struct mtk_thermal_zone *tz = tzdev->devdata; > > + struct mtk_thermal *mt = tz->mt; > > + int id = tz->id - 1; > > + > > + if (id < 0) > > + return -EACCES; > > + > > + *temperature = _get_sensor_temp(mt, id); > > + > > + return 0; > > +} > > + > > static const struct thermal_zone_device_ops mtk_thermal_ops = { > > .get_temp = mtk_read_temp, > > }; > > > > +static const struct thermal_zone_device_ops mtk_thermal_sensor_ops = { > > + .get_temp = mtk_read_sensor_temp, > > +}; > > + > > static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, > > u32 apmixed_phys_base, u32 auxadc_phys_base, > > int ctrl_id) > > @@ -1072,6 +1104,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > u64 auxadc_phys_base, apmixed_phys_base; > > struct thermal_zone_device *tzdev; > > void __iomem *apmixed_base, *auxadc_base; > > + struct mtk_thermal_zone *tz; > > > > mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); > > if (!mt) > > @@ -1150,6 +1183,9 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > > > mtk_thermal_turn_on_buffer(mt, apmixed_base); > > > > + mt->raw_to_mcelsius = (mt->conf->version == MTK_THERMAL_V1) ? > > + raw_to_mcelsius_v1 : raw_to_mcelsius_v2; > > + > > if (mt->conf->version == MTK_THERMAL_V2) { > > mtk_thermal_release_periodic_ts(mt, auxadc_base); > > } > > @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > > > platform_set_drvdata(pdev, mt); > > > > - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, > > - &mtk_thermal_ops); > > - if (IS_ERR(tzdev)) { > > - ret = PTR_ERR(tzdev); > > - goto err_disable_clk_peri_therm; > > + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > > + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > > + if (!tz) > > + return -ENOMEM; > > + > > + tz->mt = mt; > > + tz->id = i; > > + > > + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? > > + &mtk_thermal_ops : > > + &mtk_thermal_sensor_ops); > > Here you use again the aggregation I addressed this concern in V6, could you please take a look and let me know what you think [0]. [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ Regards, Amjad > > > + > > + if (IS_ERR(tzdev)) { > > + ret = PTR_ERR(tzdev); > > + if (ret == -ENODEV) > > + continue; > > + goto err_disable_clk_peri_therm; > > + } > > } > > > > ret = devm_thermal_add_hwmon_sysfs(tzdev); > > > > -- > <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs > > Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | > <http://twitter.com/#!/linaroorg> Twitter | > <http://www.linaro.org/linaro-blog/> Blog
Hi Amjad, On 05/12/2022 11:41, Amjad Ouled-Ameur wrote: [ ... ] >>> @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) >>> >>> platform_set_drvdata(pdev, mt); >>> >>> - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, >>> - &mtk_thermal_ops); >>> - if (IS_ERR(tzdev)) { >>> - ret = PTR_ERR(tzdev); >>> - goto err_disable_clk_peri_therm; >>> + for (i = 0; i < mt->conf->num_sensors + 1; i++) { >>> + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); >>> + if (!tz) >>> + return -ENOMEM; >>> + >>> + tz->mt = mt; >>> + tz->id = i; >>> + >>> + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? >>> + &mtk_thermal_ops : >>> + &mtk_thermal_sensor_ops); >> >> Here you use again the aggregation > I addressed this concern in V6, could you please take a look and let me > know what you think [0]. > > [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ May I misunderstanding but AFAICS, this patch is setting the mtk_thermal_ops if the sensor id is zero. The get_temp is computing the max temperature in this ops which is what we don't want to do.
Hi Daniel, On Mon Dec 5, 2022 at 8:39 PM CET, Daniel Lezcano wrote: > > Hi Amjad, > > > On 05/12/2022 11:41, Amjad Ouled-Ameur wrote: > > [ ... ] > > >>> @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) > >>> > >>> platform_set_drvdata(pdev, mt); > >>> > >>> - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, > >>> - &mtk_thermal_ops); > >>> - if (IS_ERR(tzdev)) { > >>> - ret = PTR_ERR(tzdev); > >>> - goto err_disable_clk_peri_therm; > >>> + for (i = 0; i < mt->conf->num_sensors + 1; i++) { > >>> + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); > >>> + if (!tz) > >>> + return -ENOMEM; > >>> + > >>> + tz->mt = mt; > >>> + tz->id = i; > >>> + > >>> + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? > >>> + &mtk_thermal_ops : > >>> + &mtk_thermal_sensor_ops); > >> > >> Here you use again the aggregation > > I addressed this concern in V6, could you please take a look and let me > > know what you think [0]. > > > > [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ > > May I misunderstanding but AFAICS, this patch is setting the > mtk_thermal_ops if the sensor id is zero. The get_temp is computing the > max temperature in this ops which is what we don't want to do. Correct, but I think that is out of scope of this patchset, as the current driver already uses mtk_thermal_ops for sensor 0. The focus of this patchset is to add support for the other sensors. Besides, what do you suggest as a clean implementation if the current one no longer meets thermal core requirements ? Regards, Amjad > > > -- > <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs > > Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | > <http://twitter.com/#!/linaroorg> Twitter | > <http://www.linaro.org/linaro-blog/> Blog
Hi Daniel, On 12/6/22 10:18, Amjad Ouled-Ameur wrote: > Hi Daniel, > On Mon Dec 5, 2022 at 8:39 PM CET, Daniel Lezcano wrote: >> Hi Amjad, >> >> >> On 05/12/2022 11:41, Amjad Ouled-Ameur wrote: >> >> [ ... ] >> >>>>> @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) >>>>> >>>>> platform_set_drvdata(pdev, mt); >>>>> >>>>> - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, >>>>> - &mtk_thermal_ops); >>>>> - if (IS_ERR(tzdev)) { >>>>> - ret = PTR_ERR(tzdev); >>>>> - goto err_disable_clk_peri_therm; >>>>> + for (i = 0; i < mt->conf->num_sensors + 1; i++) { >>>>> + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); >>>>> + if (!tz) >>>>> + return -ENOMEM; >>>>> + >>>>> + tz->mt = mt; >>>>> + tz->id = i; >>>>> + >>>>> + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? >>>>> + &mtk_thermal_ops : >>>>> + &mtk_thermal_sensor_ops); >>>> Here you use again the aggregation >>> I addressed this concern in V6, could you please take a look and let me >>> know what you think [0]. >>> >>> [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ >> May I misunderstanding but AFAICS, this patch is setting the >> mtk_thermal_ops if the sensor id is zero. The get_temp is computing the >> max temperature in this ops which is what we don't want to do. > Correct, but I think that is out of scope of this patchset, as the current > driver already uses mtk_thermal_ops for sensor 0. The focus of this patchset > is to add support for the other sensors. > > Besides, what do you suggest as a clean implementation if the current one > no longer meets thermal core requirements ? Could you please address this ? Kindly, Amjad > Regards, > Amjad >> >> -- >> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs >> >> Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | >> <http://twitter.com/#!/linaroorg> Twitter | >> <http://www.linaro.org/linaro-blog/> Blog
On 06/12/2022 10:18, Amjad Ouled-Ameur wrote: > Hi Daniel, > On Mon Dec 5, 2022 at 8:39 PM CET, Daniel Lezcano wrote: >> >> Hi Amjad, >> >> >> On 05/12/2022 11:41, Amjad Ouled-Ameur wrote: >> >> [ ... ] >> >>>>> @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) >>>>> >>>>> platform_set_drvdata(pdev, mt); >>>>> >>>>> - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, >>>>> - &mtk_thermal_ops); >>>>> - if (IS_ERR(tzdev)) { >>>>> - ret = PTR_ERR(tzdev); >>>>> - goto err_disable_clk_peri_therm; >>>>> + for (i = 0; i < mt->conf->num_sensors + 1; i++) { >>>>> + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); >>>>> + if (!tz) >>>>> + return -ENOMEM; >>>>> + >>>>> + tz->mt = mt; >>>>> + tz->id = i; >>>>> + >>>>> + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? >>>>> + &mtk_thermal_ops : >>>>> + &mtk_thermal_sensor_ops); >>>> >>>> Here you use again the aggregation >>> I addressed this concern in V6, could you please take a look and let me >>> know what you think [0]. >>> >>> [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ >> >> May I misunderstanding but AFAICS, this patch is setting the >> mtk_thermal_ops if the sensor id is zero. The get_temp is computing the >> max temperature in this ops which is what we don't want to do. > > Correct, but I think that is out of scope of this patchset, as the current > driver already uses mtk_thermal_ops for sensor 0. The focus of this patchset > is to add support for the other sensors. > > Besides, what do you suggest as a clean implementation if the current one > no longer meets thermal core requirements ? IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 x 4 Little, right ? If it is the case, then a thermal zone per sensor with the trip points and a cooling device for each of them. The two thermal zones for the big will share the same cooling device. The little thermal zone will have its own cooling device. If there is the GPU, then its own cooling device also with devfreq. >> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs >> >> Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | >> <http://twitter.com/#!/linaroorg> Twitter | >> <http://www.linaro.org/linaro-blog/> Blog >
Hi Daniel, On 12/29/22 16:49, Daniel Lezcano wrote: > On 06/12/2022 10:18, Amjad Ouled-Ameur wrote: >> Hi Daniel, >> On Mon Dec 5, 2022 at 8:39 PM CET, Daniel Lezcano wrote: >>> >>> Hi Amjad, >>> >>> >>> On 05/12/2022 11:41, Amjad Ouled-Ameur wrote: >>> >>> [ ... ] >>> >>>>>> @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) >>>>>> platform_set_drvdata(pdev, mt); >>>>>> - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, >>>>>> - &mtk_thermal_ops); >>>>>> - if (IS_ERR(tzdev)) { >>>>>> - ret = PTR_ERR(tzdev); >>>>>> - goto err_disable_clk_peri_therm; >>>>>> + for (i = 0; i < mt->conf->num_sensors + 1; i++) { >>>>>> + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); >>>>>> + if (!tz) >>>>>> + return -ENOMEM; >>>>>> + >>>>>> + tz->mt = mt; >>>>>> + tz->id = i; >>>>>> + >>>>>> + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? >>>>>> + &mtk_thermal_ops : >>>>>> + &mtk_thermal_sensor_ops); >>>>> >>>>> Here you use again the aggregation >>>> I addressed this concern in V6, could you please take a look and let me >>>> know what you think [0]. >>>> >>>> [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ >>> >>> May I misunderstanding but AFAICS, this patch is setting the >>> mtk_thermal_ops if the sensor id is zero. The get_temp is computing the >>> max temperature in this ops which is what we don't want to do. >> >> Correct, but I think that is out of scope of this patchset, as the current >> driver already uses mtk_thermal_ops for sensor 0. The focus of this patchset >> is to add support for the other sensors. >> >> Besides, what do you suggest as a clean implementation if the current one >> no longer meets thermal core requirements ? > > IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 x 4 Little, right ? MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. Thermal zone 0 corresponds to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has nothing to do with CPUs. The cooling device type used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present in the SoC for debug-purpose only, they are not supposed to be used for production. Regards, Amjad > > If it is the case, then a thermal zone per sensor with the trip points and a cooling device for each of them. > > The two thermal zones for the big will share the same cooling device. The little thermal zone will have its own cooling device. > > If there is the GPU, then its own cooling device also with devfreq. > > >>> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs >>> >>> Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | >>> <http://twitter.com/#!/linaroorg> Twitter | >>> <http://www.linaro.org/linaro-blog/> Blog >> >
Hi Daniel, On 1/19/23 18:03, Amjad Ouled-Ameur wrote: > Hi Daniel, > > On 12/29/22 16:49, Daniel Lezcano wrote: >> On 06/12/2022 10:18, Amjad Ouled-Ameur wrote: >>> Hi Daniel, >>> On Mon Dec 5, 2022 at 8:39 PM CET, Daniel Lezcano wrote: >>>> >>>> Hi Amjad, >>>> >>>> >>>> On 05/12/2022 11:41, Amjad Ouled-Ameur wrote: >>>> >>>> [ ... ] >>>> >>>>>>> @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) >>>>>>> platform_set_drvdata(pdev, mt); >>>>>>> - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, >>>>>>> - &mtk_thermal_ops); >>>>>>> - if (IS_ERR(tzdev)) { >>>>>>> - ret = PTR_ERR(tzdev); >>>>>>> - goto err_disable_clk_peri_therm; >>>>>>> + for (i = 0; i < mt->conf->num_sensors + 1; i++) { >>>>>>> + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); >>>>>>> + if (!tz) >>>>>>> + return -ENOMEM; >>>>>>> + >>>>>>> + tz->mt = mt; >>>>>>> + tz->id = i; >>>>>>> + >>>>>>> + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? >>>>>>> + &mtk_thermal_ops : >>>>>>> + &mtk_thermal_sensor_ops); >>>>>> >>>>>> Here you use again the aggregation >>>>> I addressed this concern in V6, could you please take a look and let me >>>>> know what you think [0]. >>>>> >>>>> [0]: https://lore.kernel.org/all/5eb0cdc2-e9f9-dd42-bf80-b7dcd8bcc196@baylibre.com/ >>>> >>>> May I misunderstanding but AFAICS, this patch is setting the >>>> mtk_thermal_ops if the sensor id is zero. The get_temp is computing the >>>> max temperature in this ops which is what we don't want to do. >>> >>> Correct, but I think that is out of scope of this patchset, as the current >>> driver already uses mtk_thermal_ops for sensor 0. The focus of this patchset >>> is to add support for the other sensors. >>> >>> Besides, what do you suggest as a clean implementation if the current one >>> no longer meets thermal core requirements ? >> >> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 x 4 Little, right ? > > MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. Thermal zone 0 corresponds > > to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has nothing to do with CPUs. The cooling device type > > used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present in the SoC for debug-purpose only, they are not supposed > > to be used for production. > After reconsidering the fact that zones 1, 2 and 3 are only used for dev/debug, it might be best to avoid aggregation as you suggested, and keep only support for zone 0 in this driver. Thus I suggest I send a V8 where I keep only below fixes for this patch if that's okay with you: - Define "raw_to_mcelsius" function pointer for "struct thermal_bank_cfg". - Fix "mtk_thermal" variable in mtk_read_temp(). - Set "mt->raw_to_mcelsius" in probe(). For zones 1, 2 and 3 we can later add a different driver specific for dev/debug to probe them to avoid confusion. Regards, Amjad > > Regards, > > Amjad > >> >> If it is the case, then a thermal zone per sensor with the trip points and a cooling device for each of them. >> >> The two thermal zones for the big will share the same cooling device. The little thermal zone will have its own cooling device. >> >> If there is the GPU, then its own cooling device also with devfreq. >> >> >>>> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs >>>> >>>> Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | >>>> <http://twitter.com/#!/linaroorg> Twitter | >>>> <http://www.linaro.org/linaro-blog/> Blog >>> >>
Hi Amjad, On 24/01/2023 11:08, Amjad Ouled-Ameur wrote: [ ... ] >>> >>> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 >>> x 4 Little, right ? >> >> MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. >> Thermal zone 0 corresponds >> >> to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has nothing >> to do with CPUs. The cooling device type >> >> used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present in >> the SoC for debug-purpose only, they are not supposed >> >> to be used for production. >> > After reconsidering the fact that zones 1, 2 and 3 are only used for > dev/debug, it might be best to avo > > aggregation as you suggested, and keep only support for zone 0 in this > driver. Thus I suggest I send a V8 > > where I keep only below fixes for this patch if that's okay with you: > > - Define "raw_to_mcelsius" function pointer for "struct thermal_bank_cfg". > > - Fix "mtk_thermal" variable in mtk_read_temp(). > > - Set "mt->raw_to_mcelsius" in probe(). > > > For zones 1, 2 and 3 we can later add a different driver specific for > dev/debug to probe them to > > avoid confusion. You can add them in the driver and in the device tree, but just add the cooling device for the thermal zone 0.
On 1/24/23 17:54, Daniel Lezcano wrote: > > Hi Amjad, > > On 24/01/2023 11:08, Amjad Ouled-Ameur wrote: > > [ ... ] > >>>> >>>> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 x 4 Little, right ? >>> >>> MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. Thermal zone 0 corresponds >>> >>> to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has nothing to do with CPUs. The cooling device type >>> >>> used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present in the SoC for debug-purpose only, they are not supposed >>> >>> to be used for production. >>> >> After reconsidering the fact that zones 1, 2 and 3 are only used for dev/debug, it might be best to avo > >> aggregation as you suggested, and keep only support for zone 0 in this driver. Thus I suggest I send a V8 >> >> where I keep only below fixes for this patch if that's okay with you: >> >> - Define "raw_to_mcelsius" function pointer for "struct thermal_bank_cfg". >> >> - Fix "mtk_thermal" variable in mtk_read_temp(). >> >> - Set "mt->raw_to_mcelsius" in probe(). >> >> >> For zones 1, 2 and 3 we can later add a different driver specific for dev/debug to probe them to >> >> avoid confusion. > > You can add them in the driver and in the device tree, but just add the cooling device for the thermal zone 0. Thermal zone 0 uses CPU{0..3} for passive cooling, in this case we should register cooling device with cpufreq_cooling_register() for each CPU right ? > >
On 24/01/2023 18:46, Amjad Ouled-Ameur wrote: > > On 1/24/23 17:54, Daniel Lezcano wrote: >> >> Hi Amjad, >> >> On 24/01/2023 11:08, Amjad Ouled-Ameur wrote: >> >> [ ... ] >> >>>>> >>>>> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, >>>>> 1 x 4 Little, right ? >>>> >>>> MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. >>>> Thermal zone 0 corresponds >>>> >>>> to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has >>>> nothing to do with CPUs. The cooling device type >>>> >>>> used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present >>>> in the SoC for debug-purpose only, they are not supposed >>>> >>>> to be used for production. >>>> >>> After reconsidering the fact that zones 1, 2 and 3 are only used for >>> dev/debug, it might be best to avo > >>> aggregation as you suggested, and keep only support for zone 0 in >>> this driver. Thus I suggest I send a V8 >>> >>> where I keep only below fixes for this patch if that's okay with you: >>> >>> - Define "raw_to_mcelsius" function pointer for "struct >>> thermal_bank_cfg". >>> >>> - Fix "mtk_thermal" variable in mtk_read_temp(). >>> >>> - Set "mt->raw_to_mcelsius" in probe(). >>> >>> >>> For zones 1, 2 and 3 we can later add a different driver specific for >>> dev/debug to probe them to >>> >>> avoid confusion. >> >> You can add them in the driver and in the device tree, but just add >> the cooling device for the thermal zone 0. > > Thermal zone 0 uses CPU{0..3} for passive cooling, in this case we > should register cooling device with > > cpufreq_cooling_register() for each CPU right ? No, the OF code device tree does already that. You just have to register the different thermal zones. Do you have a pointer to a device tree for this board and the thermal setup ?
On 1/24/23 18:55, Daniel Lezcano wrote: > On 24/01/2023 18:46, Amjad Ouled-Ameur wrote: >> >> On 1/24/23 17:54, Daniel Lezcano wrote: >>> >>> Hi Amjad, >>> >>> On 24/01/2023 11:08, Amjad Ouled-Ameur wrote: >>> >>> [ ... ] >>> >>>>>> >>>>>> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 x 4 Little, right ? >>>>> >>>>> MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. Thermal zone 0 corresponds >>>>> >>>>> to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has nothing to do with CPUs. The cooling device type >>>>> >>>>> used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present in the SoC for debug-purpose only, they are not supposed >>>>> >>>>> to be used for production. >>>>> >>>> After reconsidering the fact that zones 1, 2 and 3 are only used for dev/debug, it might be best to avo > >>>> aggregation as you suggested, and keep only support for zone 0 in this driver. Thus I suggest I send a V8 >>>> >>>> where I keep only below fixes for this patch if that's okay with you: >>>> >>>> - Define "raw_to_mcelsius" function pointer for "struct thermal_bank_cfg". >>>> >>>> - Fix "mtk_thermal" variable in mtk_read_temp(). >>>> >>>> - Set "mt->raw_to_mcelsius" in probe(). >>>> >>>> >>>> For zones 1, 2 and 3 we can later add a different driver specific for dev/debug to probe them to >>>> >>>> avoid confusion. >>> >>> You can add them in the driver and in the device tree, but just add the cooling device for the thermal zone 0. >> >> Thermal zone 0 uses CPU{0..3} for passive cooling, in this case we should register cooling device with >> >> cpufreq_cooling_register() for each CPU right ? > > No, the OF code device tree does already that. You just have to register the different thermal zones. > > Do you have a pointer to a device tree for this board and the thermal setup ? Sure, here is a dtsi for MT8365 SoC which contains thermal nodes [0]. [0]: https://lore.kernel.org/linux-arm-kernel/20220531135026.238475-17-fparent@baylibre.com/#Z31arch:arm64:boot:dts:mediatek:mt8365.dtsi > >
On 24/01/2023 23:27, Amjad Ouled-Ameur wrote: > > On 1/24/23 18:55, Daniel Lezcano wrote: >> On 24/01/2023 18:46, Amjad Ouled-Ameur wrote: >>> >>> On 1/24/23 17:54, Daniel Lezcano wrote: >>>> >>>> Hi Amjad, >>>> >>>> On 24/01/2023 11:08, Amjad Ouled-Ameur wrote: >>>> >>>> [ ... ] >>>> >>>>>>> >>>>>>> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x >>>>>>> 2Bigs, 1 x 4 Little, right ? >>>>>> >>>>>> MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per >>>>>> sensor. Thermal zone 0 corresponds >>>>>> >>>>>> to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has >>>>>> nothing to do with CPUs. The cooling device type >>>>>> >>>>>> used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are >>>>>> present in the SoC for debug-purpose only, they are not supposed >>>>>> >>>>>> to be used for production. >>>>>> >>>>> After reconsidering the fact that zones 1, 2 and 3 are only used >>>>> for dev/debug, it might be best to avo > >>>>> aggregation as you suggested, and keep only support for zone 0 in >>>>> this driver. Thus I suggest I send a V8 >>>>> >>>>> where I keep only below fixes for this patch if that's okay with you: >>>>> >>>>> - Define "raw_to_mcelsius" function pointer for "struct >>>>> thermal_bank_cfg". >>>>> >>>>> - Fix "mtk_thermal" variable in mtk_read_temp(). >>>>> >>>>> - Set "mt->raw_to_mcelsius" in probe(). >>>>> >>>>> >>>>> For zones 1, 2 and 3 we can later add a different driver specific >>>>> for dev/debug to probe them to >>>>> >>>>> avoid confusion. >>>> >>>> You can add them in the driver and in the device tree, but just add >>>> the cooling device for the thermal zone 0. >>> >>> Thermal zone 0 uses CPU{0..3} for passive cooling, in this case we >>> should register cooling device with >>> >>> cpufreq_cooling_register() for each CPU right ? >> >> No, the OF code device tree does already that. You just have to >> register the different thermal zones. >> >> Do you have a pointer to a device tree for this board and the thermal >> setup ? > > Sure, here is a dtsi for MT8365 SoC which contains thermal nodes [0]. From my POV, there are two different setup with the DT but only one implementation with the driver. The driver should register all the thermal zones for each CPUs. For that, make things nice with the defines for the dt-bindings like [1]. Then the device tree: setup1: Describe all the thermal zones in the DT which will be similar to [2]. Each CPU has a thermal zone, trip points and the same cooling device. The first thermal zone reaching the trip temperature threshold will start the mitigation. The thermal framework takes care of multiple thermal zones sharing the same cooling device. The result will be the same as the max temperature aggregation you did previously. setup2: Describe all the thermal zones in the DT [3], but add the cooling device only on the sensor you are interested in mitigating. And finally, if the sensors should be used to describe a kind of temperature gradient, a linear equation could be used but that is not implemented yet in the thermal framework. Hope that helps -- Daniel [1] https://lore.kernel.org/linux-arm-kernel/5dd5c795-5e67-146d-7132-30fc90171d4c@collabora.com/T/#Z2e.:..:20230124131717.128660-3-bchihi::40baylibre.com:1include:dt-bindings:thermal:mediatek-lvts.h [2] https://lore.kernel.org/linux-arm-kernel/5dd5c795-5e67-146d-7132-30fc90171d4c@collabora.com/T/#m303240c4da71f6f37831e5d1b6f3da771ae8dd90 [3] https://lore.kernel.org/linux-arm-kernel/5dd5c795-5e67-146d-7132-30fc90171d4c@collabora.com/T/#Z2e.:..:20230124131717.128660-6-bchihi::40baylibre.com:1arch:arm64:boot:dts:mediatek:mt8195.dtsi
On 1/25/23 11:02, Daniel Lezcano wrote: > On 24/01/2023 23:27, Amjad Ouled-Ameur wrote: >> >> On 1/24/23 18:55, Daniel Lezcano wrote: >>> On 24/01/2023 18:46, Amjad Ouled-Ameur wrote: >>>> >>>> On 1/24/23 17:54, Daniel Lezcano wrote: >>>>> >>>>> Hi Amjad, >>>>> >>>>> On 24/01/2023 11:08, Amjad Ouled-Ameur wrote: >>>>> >>>>> [ ... ] >>>>> >>>>>>>> >>>>>>>> IIUC, there is a sensor per couple of cores. 1 x 2Bigs, 1 x 2Bigs, 1 x 4 Little, right ? >>>>>>> >>>>>>> MT8365 SoC has 4 x A53 CPUs. The SoC has 4 thermal zones per sensor. Thermal zone 0 corresponds >>>>>>> >>>>>>> to all 4 x A53 CPUs, the other thermal zones (1, 2 and 3) has nothing to do with CPUs. The cooling device type >>>>>>> >>>>>>> used for CPUs is passive. FYI, thermal zones 1, 2 and 3 are present in the SoC for debug-purpose only, they are not supposed >>>>>>> >>>>>>> to be used for production. >>>>>>> >>>>>> After reconsidering the fact that zones 1, 2 and 3 are only used for dev/debug, it might be best to avo > >>>>>> aggregation as you suggested, and keep only support for zone 0 in this driver. Thus I suggest I send a V8 >>>>>> >>>>>> where I keep only below fixes for this patch if that's okay with you: >>>>>> >>>>>> - Define "raw_to_mcelsius" function pointer for "struct thermal_bank_cfg". >>>>>> >>>>>> - Fix "mtk_thermal" variable in mtk_read_temp(). >>>>>> >>>>>> - Set "mt->raw_to_mcelsius" in probe(). >>>>>> >>>>>> >>>>>> For zones 1, 2 and 3 we can later add a different driver specific for dev/debug to probe them to >>>>>> >>>>>> avoid confusion. >>>>> >>>>> You can add them in the driver and in the device tree, but just add the cooling device for the thermal zone 0. >>>> >>>> Thermal zone 0 uses CPU{0..3} for passive cooling, in this case we should register cooling device with >>>> >>>> cpufreq_cooling_register() for each CPU right ? >>> >>> No, the OF code device tree does already that. You just have to register the different thermal zones. >>> >>> Do you have a pointer to a device tree for this board and the thermal setup ? >> >> Sure, here is a dtsi for MT8365 SoC which contains thermal nodes [0]. > > From my POV, there are two different setup with the DT but only one implementation with the driver. > > The driver should register all the thermal zones for each CPUs. For that, make things nice with the defines for the dt-bindings like [1]. > > Then the device tree: > > setup1: > > Describe all the thermal zones in the DT which will be similar to [2]. Each CPU has a thermal zone, trip points and the same cooling device. > > The first thermal zone reaching the trip temperature threshold will start the mitigation. The thermal framework takes care of multiple thermal zones sharing the same cooling device. > > The result will be the same as the max temperature aggregation you did previously. > > setup2: > > Describe all the thermal zones in the DT [3], but add the cooling device only on the sensor you are interested in mitigating. > > > And finally, if the sensors should be used to describe a kind of temperature gradient, a linear equation could be used but that is not implemented yet in the thermal framework. > > Hope that helps > Thank you Daniel for the thorough insights. FYI, MT8195 SoC you referred to has a different thermal architecture and sensor mapping than on MT8365. The latter has only one useful thermal zone corresponding to 4 CPUs at once. The other 3 thermal zones have no real purpose and will probably not be defined in dtsi. Thus I sent a V8 of this series to keep only support for thermal zone 0 of interest. Kindly, Amjad > -- Daniel > > [1] https://lore.kernel.org/linux-arm-kernel/5dd5c795-5e67-146d-7132-30fc90171d4c@collabora.com/T/#Z2e.:..:20230124131717.128660-3-bchihi::40baylibre.com:1include:dt-bindings:thermal:mediatek-lvts.h > > [2] https://lore.kernel.org/linux-arm-kernel/5dd5c795-5e67-146d-7132-30fc90171d4c@collabora.com/T/#m303240c4da71f6f37831e5d1b6f3da771ae8dd90 > > [3] https://lore.kernel.org/linux-arm-kernel/5dd5c795-5e67-146d-7132-30fc90171d4c@collabora.com/T/#Z2e.:..:20230124131717.128660-6-bchihi::40baylibre.com:1arch:arm64:boot:dts:mediatek:mt8195.dtsi > >
diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c index 3a5df1440822..b1f4d19edd4f 100644 --- a/drivers/thermal/mtk_thermal.c +++ b/drivers/thermal/mtk_thermal.c @@ -259,6 +259,11 @@ enum mtk_thermal_version { struct mtk_thermal; +struct mtk_thermal_zone { + struct mtk_thermal *mt; + int id; +}; + struct thermal_bank_cfg { unsigned int num_sensors; const int *sensors; @@ -307,6 +312,8 @@ struct mtk_thermal { const struct mtk_thermal_data *conf; struct mtk_thermal_bank banks[MAX_NUM_ZONES]; + + int (*raw_to_mcelsius)(struct mtk_thermal *mt, int sensno, s32 raw); }; /* MT8183 thermal sensor data */ @@ -709,6 +716,29 @@ static void mtk_thermal_put_bank(struct mtk_thermal_bank *bank) mutex_unlock(&mt->lock); } +static int _get_sensor_temp(struct mtk_thermal *mt, int id) +{ + u32 raw; + int temp; + + const struct mtk_thermal_data *conf = mt->conf; + + raw = readl(mt->thermal_base + conf->msr[id]); + + temp = mt->raw_to_mcelsius(mt, id, raw); + + /* + * The first read of a sensor often contains very high bogus + * temperature value. Filter these out so that the system does + * not immediately shut down. + */ + + if (temp > 200000) + return -EAGAIN; + else + return temp; +} + /** * mtk_thermal_bank_temperature - get the temperature of a bank * @bank: The bank @@ -721,26 +751,9 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) struct mtk_thermal *mt = bank->mt; const struct mtk_thermal_data *conf = mt->conf; int i, temp = INT_MIN, max = INT_MIN; - u32 raw; for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { - raw = readl(mt->thermal_base + conf->msr[i]); - - if (mt->conf->version == MTK_THERMAL_V1) { - temp = raw_to_mcelsius_v1( - mt, conf->bank_data[bank->id].sensors[i], raw); - } else { - temp = raw_to_mcelsius_v2( - mt, conf->bank_data[bank->id].sensors[i], raw); - } - - /* - * The first read of a sensor often contains very high bogus - * temperature value. Filter these out so that the system does - * not immediately shut down. - */ - if (temp > 200000) - temp = 0; + temp = _get_sensor_temp(mt, i); if (temp > max) max = temp; @@ -749,9 +762,10 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) return max; } -static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature) +static int mtk_read_temp(struct thermal_zone_device *tzdev, int *temperature) { - struct mtk_thermal *mt = tz->devdata; + struct mtk_thermal_zone *tz = tzdev->devdata; + struct mtk_thermal *mt = tz->mt; int i; int tempmax = INT_MIN; @@ -770,10 +784,28 @@ static int mtk_read_temp(struct thermal_zone_device *tz, int *temperature) return 0; } +static int mtk_read_sensor_temp(struct thermal_zone_device *tzdev, int *temperature) +{ + struct mtk_thermal_zone *tz = tzdev->devdata; + struct mtk_thermal *mt = tz->mt; + int id = tz->id - 1; + + if (id < 0) + return -EACCES; + + *temperature = _get_sensor_temp(mt, id); + + return 0; +} + static const struct thermal_zone_device_ops mtk_thermal_ops = { .get_temp = mtk_read_temp, }; +static const struct thermal_zone_device_ops mtk_thermal_sensor_ops = { + .get_temp = mtk_read_sensor_temp, +}; + static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, u32 apmixed_phys_base, u32 auxadc_phys_base, int ctrl_id) @@ -1072,6 +1104,7 @@ static int mtk_thermal_probe(struct platform_device *pdev) u64 auxadc_phys_base, apmixed_phys_base; struct thermal_zone_device *tzdev; void __iomem *apmixed_base, *auxadc_base; + struct mtk_thermal_zone *tz; mt = devm_kzalloc(&pdev->dev, sizeof(*mt), GFP_KERNEL); if (!mt) @@ -1150,6 +1183,9 @@ static int mtk_thermal_probe(struct platform_device *pdev) mtk_thermal_turn_on_buffer(mt, apmixed_base); + mt->raw_to_mcelsius = (mt->conf->version == MTK_THERMAL_V1) ? + raw_to_mcelsius_v1 : raw_to_mcelsius_v2; + if (mt->conf->version == MTK_THERMAL_V2) { mtk_thermal_release_periodic_ts(mt, auxadc_base); } @@ -1161,11 +1197,24 @@ static int mtk_thermal_probe(struct platform_device *pdev) platform_set_drvdata(pdev, mt); - tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, - &mtk_thermal_ops); - if (IS_ERR(tzdev)) { - ret = PTR_ERR(tzdev); - goto err_disable_clk_peri_therm; + for (i = 0; i < mt->conf->num_sensors + 1; i++) { + tz = devm_kmalloc(&pdev->dev, sizeof(*tz), GFP_KERNEL); + if (!tz) + return -ENOMEM; + + tz->mt = mt; + tz->id = i; + + tzdev = devm_thermal_of_zone_register(&pdev->dev, i, tz, (i == 0) ? + &mtk_thermal_ops : + &mtk_thermal_sensor_ops); + + if (IS_ERR(tzdev)) { + ret = PTR_ERR(tzdev); + if (ret == -ENODEV) + continue; + goto err_disable_clk_peri_therm; + } } ret = devm_thermal_add_hwmon_sysfs(tzdev);