linux-tegra.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/10] thermal: tegra: Do not register cooling device
@ 2023-04-14 12:57 Thierry Reding
  2023-04-14 12:57 ` [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature Thierry Reding
                   ` (11 more replies)
  0 siblings, 12 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

Hi,

this set of patches removes the registration of the SOCTHERM internal
throttling mechanism as cooling device. Since this throttling starts
automatically once a certain temperature threshold is crossed, it
doesn't make sense to represent it as a cooling device, which are
typically "manually" activated by the thermal framework when thermal
sensors report temperature thresholds being crossed.

Instead of using the cooling device mechanism, this statically programs
the throttling mechanism when it is configured in device tree. In order
to do this, an additional device tree property is needed to replace the
information that was previously contained in trip points.

There's a few preparatory patches to make the removal a bit simpler and
also some follow up cleanups included as well.

Thierry

Thierry Reding (10):
  dt-bindings: thermal: tegra: Document throttle temperature
  thermal: tegra: Use driver-private data consistently
  thermal: tegra: Constify SoC-specific data
  thermal: tegra: Do not register cooling device
  thermal: tegra: Use unsigned int where appropriate
  thermal: tegra: Avoid over-allocation of temporary array
  thermal: tegra: Remove gratuitous error assignment
  thermal: tegra: Minor stylistic cleanups
  arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
  ARM: tegra: Rework SOCTHERM on Tegra124

 .../thermal/nvidia,tegra124-soctherm.yaml     |   7 +
 arch/arm/boot/dts/tegra124.dtsi               |  65 +--
 arch/arm64/boot/dts/nvidia/tegra132.dtsi      |  63 +--
 arch/arm64/boot/dts/nvidia/tegra210.dtsi      |  83 +---
 drivers/thermal/tegra/soctherm.c              | 392 ++++++------------
 drivers/thermal/tegra/soctherm.h              |   1 +
 drivers/thermal/tegra/tegra124-soctherm.c     |   4 +
 drivers/thermal/tegra/tegra132-soctherm.c     |   4 +
 drivers/thermal/tegra/tegra210-soctherm.c     |   4 +
 9 files changed, 208 insertions(+), 415 deletions(-)

-- 
2.40.0


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 21:47   ` Krzysztof Kozlowski
  2023-04-14 12:57 ` [PATCH 02/10] thermal: tegra: Use driver-private data consistently Thierry Reding
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

Each throttling configuration needs to specify the temperature threshold
at which it should start throttling. Previously this was tied to a given
trip point as a cooling device and used the temperature specified for
that trip point. This doesn't work well because the throttling mechanism
is not a cooling device in the traditional sense.

Instead, allow device trees to specify the throttle temperature in the
throttle configuration directly so that the throttle doesn't need to be
exposed as a cooling device.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 .../bindings/thermal/nvidia,tegra124-soctherm.yaml         | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
index 4677ad6645a5..37dac851f486 100644
--- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
+++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
@@ -120,6 +120,13 @@ properties:
               # high (85%, TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
               - 3
 
+          temperature:
+            $ref: /schemas/types.yaml#/definitions/int32
+            minimum: -273000
+            maximum: 200000
+            description: The temperature threshold (in millicelsius) that,
+              when crossed, will trigger the configured automatic throttling.
+
           # optional
           # Tegra210 specific and valid only for OCx throttle events
           nvidia,count-threshold:
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 02/10] thermal: tegra: Use driver-private data consistently
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
  2023-04-14 12:57 ` [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 03/10] thermal: tegra: Constify SoC-specific data Thierry Reding
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

Instead of passing around platform and plain devices and figuring out
the driver-private data within each helper, directly pass around the
driver-private data when it's available.

Also store a pointer to the parent device in the main driver-private
data structure for easier access.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c | 213 ++++++++++++++-----------------
 1 file changed, 95 insertions(+), 118 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ea66cba09e56..ca39340cd93f 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -299,7 +299,6 @@ static const char *const throt_names[] = {
 struct tegra_soctherm;
 struct tegra_thermctl_zone {
 	void __iomem *reg;
-	struct device *dev;
 	struct tegra_soctherm *ts;
 	struct thermal_zone_device *tz;
 	const struct tegra_tsensor_group *sg;
@@ -327,6 +326,7 @@ struct soctherm_throt_cfg {
 };
 
 struct tegra_soctherm {
+	struct device *dev;
 	struct reset_control *reset;
 	struct clk *clock_tsensor;
 	struct clk *clock_soctherm;
@@ -444,14 +444,15 @@ static int tegra_thermctl_get_temp(struct thermal_zone_device *tz, int *out_temp
  *
  * Return: The precision adjusted capped temperature in millicelsius.
  */
-static int enforce_temp_range(struct device *dev, int trip_temp)
+static int enforce_temp_range(struct tegra_soctherm *ts, int trip_temp)
 {
 	int temp;
 
 	temp = clamp_val(trip_temp, min_low_temp, max_high_temp);
 	if (temp != trip_temp)
-		dev_dbg(dev, "soctherm: trip temperature %d forced to %d\n",
+		dev_dbg(ts->dev, "trip temperature %d forced to %d\n",
 			trip_temp, temp);
+
 	return temp;
 }
 
@@ -471,18 +472,17 @@ static int enforce_temp_range(struct device *dev, int trip_temp)
  *
  * Return: 0 upon success, or %-EINVAL upon failure.
  */
-static int thermtrip_program(struct device *dev,
+static int thermtrip_program(struct tegra_soctherm *ts,
 			     const struct tegra_tsensor_group *sg,
 			     int trip_temp)
 {
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	int temp;
 	u32 r;
 
 	if (!sg || !sg->thermtrip_threshold_mask)
 		return -EINVAL;
 
-	temp = enforce_temp_range(dev, trip_temp) / ts->soc->thresh_grain;
+	temp = enforce_temp_range(ts, trip_temp) / ts->soc->thresh_grain;
 
 	r = readl(ts->regs + THERMCTL_THERMTRIP_CTL);
 	r = REG_SET_MASK(r, sg->thermtrip_threshold_mask, temp);
@@ -496,7 +496,7 @@ static int thermtrip_program(struct device *dev,
 /**
  * throttrip_program() - Configures the hardware to throttle the
  * pulse if a given sensor group reaches a given temperature
- * @dev: ptr to the struct device for the SOC_THERM IP block
+ * @ts: pointer to a struct tegra_soctherm
  * @sg: pointer to the sensor group to set the thermtrip temperature for
  * @stc: pointer to the throttle need to be triggered
  * @trip_temp: the temperature in millicelsius to trigger the thermal trip at
@@ -510,12 +510,11 @@ static int thermtrip_program(struct device *dev,
  *
  * Return: 0 upon success, or %-EINVAL upon failure.
  */
-static int throttrip_program(struct device *dev,
+static int throttrip_program(struct tegra_soctherm *ts,
 			     const struct tegra_tsensor_group *sg,
 			     struct soctherm_throt_cfg *stc,
 			     int trip_temp)
 {
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	int temp, cpu_throt, gpu_throt;
 	unsigned int throt;
 	u32 r, reg_off;
@@ -523,7 +522,7 @@ static int throttrip_program(struct device *dev,
 	if (!sg || !stc || !stc->init)
 		return -EINVAL;
 
-	temp = enforce_temp_range(dev, trip_temp) / ts->soc->thresh_grain;
+	temp = enforce_temp_range(ts, trip_temp) / ts->soc->thresh_grain;
 
 	/* Hardcode LIGHT on LEVEL1 and HEAVY on LEVEL2 */
 	throt = stc->id;
@@ -536,7 +535,7 @@ static int throttrip_program(struct device *dev,
 		cpu_throt = THERMCTL_LVL0_CPU0_CPU_THROT_HEAVY;
 		gpu_throt = THERMCTL_LVL0_CPU0_GPU_THROT_HEAVY;
 		if (throt != THROTTLE_HEAVY)
-			dev_warn(dev,
+			dev_warn(ts->dev,
 				 "invalid throt id %d - assuming HEAVY",
 				 throt);
 	}
@@ -588,7 +587,6 @@ static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip
 	struct tegra_soctherm *ts = zone->ts;
 	struct thermal_trip trip;
 	const struct tegra_tsensor_group *sg = zone->sg;
-	struct device *dev = zone->dev;
 	int ret;
 
 	if (!tz)
@@ -605,7 +603,7 @@ static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip
 		 * if not, program critical trip to HW.
 		 */
 		if (min_low_temp == tsensor_group_thermtrip_get(ts, sg->id))
-			return thermtrip_program(dev, sg, temp);
+			return thermtrip_program(ts, sg, temp);
 		else
 			return 0;
 
@@ -625,7 +623,7 @@ static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip
 			else
 				continue;
 
-			return throttrip_program(dev, sg, stc, temp);
+			return throttrip_program(ts, sg, stc, temp);
 		}
 	}
 
@@ -667,9 +665,9 @@ static int tegra_thermctl_set_trips(struct thermal_zone_device *tz, int lo, int
 	r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_EN_MASK, 0);
 	writel(r, zone->ts->regs + zone->sg->thermctl_lvl0_offset);
 
-	lo = enforce_temp_range(zone->dev, lo) / zone->ts->soc->thresh_grain;
-	hi = enforce_temp_range(zone->dev, hi) / zone->ts->soc->thresh_grain;
-	dev_dbg(zone->dev, "%s hi:%d, lo:%d\n", __func__, hi, lo);
+	lo = enforce_temp_range(zone->ts, lo) / zone->ts->soc->thresh_grain;
+	hi = enforce_temp_range(zone->ts, hi) / zone->ts->soc->thresh_grain;
+	dev_dbg(zone->ts->dev, "%s hi:%d, lo:%d\n", __func__, hi, lo);
 
 	r = REG_SET_MASK(r, zone->sg->thermctl_lvl0_up_thresh_mask, hi);
 	r = REG_SET_MASK(r, zone->sg->thermctl_lvl0_dn_thresh_mask, lo);
@@ -731,11 +729,10 @@ static int get_hot_temp(struct thermal_zone_device *tz, int *trip_id, int *temp)
  * this one appears on the serial console:
  * ""throttrip: will throttle when sensor group XXX reaches YYYYYY mC"
  */
-static int tegra_soctherm_set_hwtrips(struct device *dev,
+static int tegra_soctherm_set_hwtrips(struct tegra_soctherm *ts,
 				      const struct tegra_tsensor_group *sg,
 				      struct thermal_zone_device *tz)
 {
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	struct soctherm_throt_cfg *stc;
 	int i, trip, temperature, ret;
 
@@ -745,18 +742,19 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 		if (thermal_zone_get_crit_temp(tz, &temperature))
 			temperature = max_high_temp;
 
-	ret = thermtrip_program(dev, sg, temperature);
+	ret = thermtrip_program(ts, sg, temperature);
 	if (ret) {
-		dev_err(dev, "thermtrip: %s: error during enable\n", sg->name);
+		dev_err(ts->dev, "thermtrip: %s: error during enable\n",
+			sg->name);
 		return ret;
 	}
 
-	dev_info(dev, "thermtrip: will shut down when %s reaches %d mC\n",
+	dev_info(ts->dev, "thermtrip: will shut down when %s reaches %d mC\n",
 		 sg->name, temperature);
 
 	ret = get_hot_temp(tz, &trip, &temperature);
 	if (ret) {
-		dev_info(dev, "throttrip: %s: missing hot temperature\n",
+		dev_info(ts->dev, "throttrip: %s: missing hot temperature\n",
 			 sg->name);
 		return 0;
 	}
@@ -773,21 +771,21 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
 		else
 			continue;
 
-		ret = throttrip_program(dev, sg, stc, temperature);
+		ret = throttrip_program(ts, sg, stc, temperature);
 		if (ret) {
-			dev_err(dev, "throttrip: %s: error during enable\n",
+			dev_err(ts->dev, "throttrip: %s: error during enable\n",
 				sg->name);
 			return ret;
 		}
 
-		dev_info(dev,
+		dev_info(ts->dev,
 			 "throttrip: will throttle when %s reaches %d mC\n",
 			 sg->name, temperature);
 		break;
 	}
 
 	if (i == THROTTLE_SIZE)
-		dev_info(dev, "throttrip: %s: missing throttle cdev\n",
+		dev_info(ts->dev, "throttrip: %s: missing throttle cdev\n",
 			 sg->name);
 
 	return 0;
@@ -1253,8 +1251,7 @@ static int soctherm_oc_int_init(struct device_node *np, int num_irqs)
 #ifdef CONFIG_DEBUG_FS
 static int regs_show(struct seq_file *s, void *data)
 {
-	struct platform_device *pdev = s->private;
-	struct tegra_soctherm *ts = platform_get_drvdata(pdev);
+	struct tegra_soctherm *ts = s->private;
 	const struct tegra_tsensor *tsensors = ts->soc->tsensors;
 	const struct tegra_tsensor_group **ttgs = ts->soc->ttgs;
 	u32 r, state;
@@ -1449,24 +1446,24 @@ static int regs_show(struct seq_file *s, void *data)
 
 DEFINE_SHOW_ATTRIBUTE(regs);
 
-static void soctherm_debug_init(struct platform_device *pdev)
+static void soctherm_debug_init(struct tegra_soctherm *tegra)
 {
-	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
 	struct dentry *root;
 
 	root = debugfs_create_dir("soctherm", NULL);
 
 	tegra->debugfs_dir = root;
 
-	debugfs_create_file("reg_contents", 0644, root, pdev, &regs_fops);
+	debugfs_create_file("reg_contents", 0644, root, tegra, &regs_fops);
 }
 #else
-static inline void soctherm_debug_init(struct platform_device *pdev) {}
+static inline void soctherm_debug_init(struct tegra_soctherm *ts)
+{
+}
 #endif
 
-static int soctherm_clk_enable(struct platform_device *pdev, bool enable)
+static int soctherm_clk_enable(struct tegra_soctherm *tegra, bool enable)
 {
-	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
 	int err;
 
 	if (!tegra->clock_soctherm || !tegra->clock_tsensor)
@@ -1531,10 +1528,8 @@ static const struct thermal_cooling_device_ops throt_cooling_ops = {
 	.set_cur_state = throt_set_cdev_state,
 };
 
-static int soctherm_thermtrips_parse(struct platform_device *pdev)
+static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 {
-	struct device *dev = &pdev->dev;
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
 	const int max_num_prop = ts->soc->num_ttgs * 2;
 	u32 *tlb;
@@ -1543,22 +1538,22 @@ static int soctherm_thermtrips_parse(struct platform_device *pdev)
 	if (!tt)
 		return -ENOMEM;
 
-	n = of_property_count_u32_elems(dev->of_node, "nvidia,thermtrips");
+	n = of_property_count_u32_elems(ts->dev->of_node, "nvidia,thermtrips");
 	if (n <= 0) {
-		dev_info(dev,
+		dev_info(ts->dev,
 			 "missing thermtrips, will use critical trips as shut down temp\n");
 		return n;
 	}
 
 	n = min(max_num_prop, n);
 
-	tlb = devm_kcalloc(&pdev->dev, max_num_prop, sizeof(u32), GFP_KERNEL);
+	tlb = devm_kcalloc(ts->dev, max_num_prop, sizeof(u32), GFP_KERNEL);
 	if (!tlb)
 		return -ENOMEM;
-	ret = of_property_read_u32_array(dev->of_node, "nvidia,thermtrips",
+	ret = of_property_read_u32_array(ts->dev->of_node, "nvidia,thermtrips",
 					 tlb, n);
 	if (ret) {
-		dev_err(dev, "invalid num ele: thermtrips:%d\n", ret);
+		dev_err(ts->dev, "invalid num ele: thermtrips:%d\n", ret);
 		return ret;
 	}
 
@@ -1575,9 +1570,9 @@ static int soctherm_thermtrips_parse(struct platform_device *pdev)
 	return 0;
 }
 
-static void soctherm_oc_cfg_parse(struct device *dev,
-				struct device_node *np_oc,
-				struct soctherm_throt_cfg *stc)
+static void soctherm_oc_cfg_parse(struct tegra_soctherm *tegra,
+				  struct device_node *np_oc,
+				  struct soctherm_throt_cfg *stc)
 {
 	u32 val;
 
@@ -1601,19 +1596,20 @@ static void soctherm_oc_cfg_parse(struct device *dev,
 	stc->oc_cfg.mode = OC_THROTTLE_MODE_BRIEF;
 }
 
-static int soctherm_throt_cfg_parse(struct device *dev,
+static int soctherm_throt_cfg_parse(struct tegra_soctherm *ts,
 				    struct device_node *np,
 				    struct soctherm_throt_cfg *stc)
 {
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	int ret;
 	u32 val;
 
 	ret = of_property_read_u32(np, "nvidia,priority", &val);
 	if (ret) {
-		dev_err(dev, "throttle-cfg: %s: invalid priority\n", stc->name);
+		dev_err(ts->dev, "throttle-cfg: %s: invalid priority\n",
+			stc->name);
 		return -EINVAL;
 	}
+
 	stc->priority = val;
 
 	ret = of_property_read_u32(np, ts->soc->use_ccroc ?
@@ -1640,7 +1636,7 @@ static int soctherm_throt_cfg_parse(struct device *dev,
 	return 0;
 
 err:
-	dev_err(dev, "throttle-cfg: %s: no throt prop or invalid prop\n",
+	dev_err(ts->dev, "throttle-cfg: %s: no throt prop or invalid prop\n",
 		stc->name);
 	return -EINVAL;
 }
@@ -1648,25 +1644,23 @@ static int soctherm_throt_cfg_parse(struct device *dev,
 /**
  * soctherm_init_hw_throt_cdev() - Parse the HW throttle configurations
  * and register them as cooling devices.
- * @pdev: Pointer to platform_device struct
+ * @tegra: pointer to Tegra soctherm structure
  */
-static void soctherm_init_hw_throt_cdev(struct platform_device *pdev)
+static void soctherm_init_hw_throt_cdev(struct tegra_soctherm *tegra)
 {
-	struct device *dev = &pdev->dev;
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	struct device_node *np_stc, *np_stcc;
 	const char *name;
 	int i;
 
 	for (i = 0; i < THROTTLE_SIZE; i++) {
-		ts->throt_cfgs[i].name = throt_names[i];
-		ts->throt_cfgs[i].id = i;
-		ts->throt_cfgs[i].init = false;
+		tegra->throt_cfgs[i].name = throt_names[i];
+		tegra->throt_cfgs[i].id = i;
+		tegra->throt_cfgs[i].init = false;
 	}
 
-	np_stc = of_get_child_by_name(dev->of_node, "throttle-cfgs");
+	np_stc = of_get_child_by_name(tegra->dev->of_node, "throttle-cfgs");
 	if (!np_stc) {
-		dev_info(dev,
+		dev_info(tegra->dev,
 			 "throttle-cfg: no throttle-cfgs - not enabling\n");
 		return;
 	}
@@ -1677,33 +1671,34 @@ static void soctherm_init_hw_throt_cdev(struct platform_device *pdev)
 		int err;
 
 		name = np_stcc->name;
-		stc = find_throttle_cfg_by_name(ts, name);
+		stc = find_throttle_cfg_by_name(tegra, name);
 		if (!stc) {
-			dev_err(dev,
-				"throttle-cfg: could not find %s\n", name);
+			dev_err(tegra->dev, "throttle-cfg: could not find %s\n",
+				name);
 			continue;
 		}
 
 		if (stc->init) {
-			dev_err(dev, "throttle-cfg: %s: redefined!\n", name);
+			dev_err(tegra->dev, "throttle-cfg: %s: redefined!\n",
+				name);
 			of_node_put(np_stcc);
 			break;
 		}
 
-		err = soctherm_throt_cfg_parse(dev, np_stcc, stc);
+		err = soctherm_throt_cfg_parse(tegra, np_stcc, stc);
 		if (err)
 			continue;
 
 		if (stc->id >= THROTTLE_OC1) {
-			soctherm_oc_cfg_parse(dev, np_stcc, stc);
+			soctherm_oc_cfg_parse(tegra, np_stcc, stc);
 			stc->init = true;
 		} else {
 
 			tcd = thermal_of_cooling_device_register(np_stcc,
-							 (char *)name, ts,
+							 (char *)name, tegra,
 							 &throt_cooling_ops);
 			if (IS_ERR_OR_NULL(tcd)) {
-				dev_err(dev,
+				dev_err(tegra->dev,
 					"throttle-cfg: %s: failed to register cooling device\n",
 					name);
 				continue;
@@ -1711,7 +1706,6 @@ static void soctherm_init_hw_throt_cdev(struct platform_device *pdev)
 			stc->cdev = tcd;
 			stc->init = true;
 		}
-
 	}
 
 	of_node_put(np_stc);
@@ -1931,9 +1925,8 @@ static void soctherm_throttle_program(struct tegra_soctherm *ts,
 	writel(r, ts->regs + THROT_PRIORITY_LOCK);
 }
 
-static void tegra_soctherm_throttle(struct device *dev)
+static void tegra_soctherm_throttle(struct tegra_soctherm *ts)
 {
-	struct tegra_soctherm *ts = dev_get_drvdata(dev);
 	u32 v;
 	int i;
 
@@ -1969,43 +1962,29 @@ static void tegra_soctherm_throttle(struct device *dev)
 	writel(v, ts->regs + THERMCTL_STATS_CTL);
 }
 
-static int soctherm_interrupts_init(struct platform_device *pdev,
-				    struct tegra_soctherm *tegra)
+static int soctherm_interrupts_init(struct tegra_soctherm *tegra)
 {
-	struct device_node *np = pdev->dev.of_node;
 	int ret;
 
-	ret = soctherm_oc_int_init(np, TEGRA_SOC_OC_IRQ_MAX);
+	ret = soctherm_oc_int_init(tegra->dev->of_node, TEGRA_SOC_OC_IRQ_MAX);
 	if (ret < 0) {
-		dev_err(&pdev->dev, "soctherm_oc_int_init failed\n");
+		dev_err(tegra->dev, "soctherm_oc_int_init failed\n");
 		return ret;
 	}
 
-	tegra->thermal_irq = platform_get_irq(pdev, 0);
-	if (tegra->thermal_irq < 0) {
-		dev_dbg(&pdev->dev, "get 'thermal_irq' failed.\n");
-		return 0;
-	}
-
-	tegra->edp_irq = platform_get_irq(pdev, 1);
-	if (tegra->edp_irq < 0) {
-		dev_dbg(&pdev->dev, "get 'edp_irq' failed.\n");
-		return 0;
-	}
-
-	ret = devm_request_threaded_irq(&pdev->dev,
+	ret = devm_request_threaded_irq(tegra->dev,
 					tegra->thermal_irq,
 					soctherm_thermal_isr,
 					soctherm_thermal_isr_thread,
 					IRQF_ONESHOT,
-					dev_name(&pdev->dev),
+					dev_name(tegra->dev),
 					tegra);
 	if (ret < 0) {
-		dev_err(&pdev->dev, "request_irq 'thermal_irq' failed.\n");
+		dev_err(tegra->dev, "failed to request thermal IRQ: %d\n", ret);
 		return ret;
 	}
 
-	ret = devm_request_threaded_irq(&pdev->dev,
+	ret = devm_request_threaded_irq(tegra->dev,
 					tegra->edp_irq,
 					soctherm_edp_isr,
 					soctherm_edp_isr_thread,
@@ -2013,16 +1992,15 @@ static int soctherm_interrupts_init(struct platform_device *pdev,
 					"soctherm_edp",
 					tegra);
 	if (ret < 0) {
-		dev_err(&pdev->dev, "request_irq 'edp_irq' failed.\n");
+		dev_err(tegra->dev, "failed to request EDP IRQ: %d\n", ret);
 		return ret;
 	}
 
 	return 0;
 }
 
-static void soctherm_init(struct platform_device *pdev)
+static void soctherm_init(struct tegra_soctherm *tegra)
 {
-	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
 	const struct tegra_tsensor_group **ttgs = tegra->soc->ttgs;
 	int i;
 	u32 pdiv, hotspot;
@@ -2048,7 +2026,7 @@ static void soctherm_init(struct platform_device *pdev)
 	writel(hotspot, tegra->regs + SENSOR_HOTSPOT_OFF);
 
 	/* Configure hw throttle */
-	tegra_soctherm_throttle(&pdev->dev);
+	tegra_soctherm_throttle(tegra);
 }
 
 static const struct of_device_id tegra_soctherm_of_match[] = {
@@ -2096,9 +2074,9 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 	if (!tegra)
 		return -ENOMEM;
 
-	mutex_init(&tegra->thermctl_lock);
 	dev_set_drvdata(&pdev->dev, tegra);
-
+	mutex_init(&tegra->thermctl_lock);
+	tegra->dev = &pdev->dev;
 	tegra->soc = soc;
 
 	tegra->regs = devm_platform_ioremap_resource_byname(pdev, "soctherm-reg");
@@ -2121,6 +2099,9 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 		}
 	}
 
+	tegra->thermal_irq = platform_get_irq(pdev, 0);
+	tegra->edp_irq = platform_get_irq(pdev, 1);
+
 	tegra->reset = devm_reset_control_get(&pdev->dev, "soctherm");
 	if (IS_ERR(tegra->reset)) {
 		dev_err(&pdev->dev, "can't get soctherm reset\n");
@@ -2165,15 +2146,15 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 	if (!tegra->thermctl_tzs)
 		return -ENOMEM;
 
-	err = soctherm_clk_enable(pdev, true);
+	err = soctherm_clk_enable(tegra, true);
 	if (err)
 		return err;
 
-	soctherm_thermtrips_parse(pdev);
+	soctherm_thermtrips_parse(tegra);
 
-	soctherm_init_hw_throt_cdev(pdev);
+	soctherm_init_hw_throt_cdev(tegra);
 
-	soctherm_init(pdev);
+	soctherm_init(tegra);
 
 	for (i = 0; i < soc->num_ttgs; ++i) {
 		struct tegra_thermctl_zone *zone =
@@ -2184,7 +2165,6 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 		}
 
 		zone->reg = tegra->regs + soc->ttgs[i]->sensor_temp_offset;
-		zone->dev = &pdev->dev;
 		zone->sg = soc->ttgs[i];
 		zone->ts = tegra;
 
@@ -2202,19 +2182,19 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 		tegra->thermctl_tzs[soc->ttgs[i]->id] = z;
 
 		/* Configure hw trip points */
-		err = tegra_soctherm_set_hwtrips(&pdev->dev, soc->ttgs[i], z);
+		err = tegra_soctherm_set_hwtrips(tegra, soc->ttgs[i], z);
 		if (err)
 			goto disable_clocks;
 	}
 
-	err = soctherm_interrupts_init(pdev, tegra);
+	err = soctherm_interrupts_init(tegra);
 
-	soctherm_debug_init(pdev);
+	soctherm_debug_init(tegra);
 
 	return 0;
 
 disable_clocks:
-	soctherm_clk_enable(pdev, false);
+	soctherm_clk_enable(tegra, false);
 
 	return err;
 }
@@ -2225,44 +2205,41 @@ static int tegra_soctherm_remove(struct platform_device *pdev)
 
 	debugfs_remove_recursive(tegra->debugfs_dir);
 
-	soctherm_clk_enable(pdev, false);
+	soctherm_clk_enable(tegra, false);
 
 	return 0;
 }
 
 static int __maybe_unused soctherm_suspend(struct device *dev)
 {
-	struct platform_device *pdev = to_platform_device(dev);
+	struct tegra_soctherm *tegra = dev_get_drvdata(dev);
 
-	soctherm_clk_enable(pdev, false);
+	soctherm_clk_enable(tegra, false);
 
 	return 0;
 }
 
 static int __maybe_unused soctherm_resume(struct device *dev)
 {
-	struct platform_device *pdev = to_platform_device(dev);
-	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
+	struct tegra_soctherm *tegra = dev_get_drvdata(dev);
 	struct tegra_soctherm_soc *soc = tegra->soc;
 	int err, i;
 
-	err = soctherm_clk_enable(pdev, true);
+	err = soctherm_clk_enable(tegra, true);
 	if (err) {
-		dev_err(&pdev->dev,
-			"Resume failed: enable clocks failed\n");
+		dev_err(dev, "Resume failed: enable clocks failed\n");
 		return err;
 	}
 
-	soctherm_init(pdev);
+	soctherm_init(tegra);
 
 	for (i = 0; i < soc->num_ttgs; ++i) {
 		struct thermal_zone_device *tz;
 
 		tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
-		err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
+		err = tegra_soctherm_set_hwtrips(tegra, soc->ttgs[i], tz);
 		if (err) {
-			dev_err(&pdev->dev,
-				"Resume failed: set hwtrips failed\n");
+			dev_err(dev, "Resume failed: set hwtrips failed\n");
 			return err;
 		}
 	}
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 03/10] thermal: tegra: Constify SoC-specific data
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
  2023-04-14 12:57 ` [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature Thierry Reding
  2023-04-14 12:57 ` [PATCH 02/10] thermal: tegra: Use driver-private data consistently Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 04/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

The SoC-specific parameter structure is read-only data, so consistently
use const to mark it as such.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ca39340cd93f..958fa10de516 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -339,7 +339,7 @@ struct tegra_soctherm {
 
 	u32 *calib;
 	struct thermal_zone_device **thermctl_tzs;
-	struct tegra_soctherm_soc *soc;
+	const struct tegra_soctherm_soc *soc;
 
 	struct soctherm_throt_cfg throt_cfgs[THROTTLE_SIZE];
 
@@ -2054,19 +2054,15 @@ MODULE_DEVICE_TABLE(of, tegra_soctherm_of_match);
 
 static int tegra_soctherm_probe(struct platform_device *pdev)
 {
-	const struct of_device_id *match;
 	struct tegra_soctherm *tegra;
 	struct thermal_zone_device *z;
 	struct tsensor_shared_calib shared_calib;
-	struct tegra_soctherm_soc *soc;
+	const struct tegra_soctherm_soc *soc;
 	unsigned int i;
 	int err;
 
-	match = of_match_node(tegra_soctherm_of_match, pdev->dev.of_node);
-	if (!match)
-		return -ENODEV;
+	soc = device_get_match_data(&pdev->dev);
 
-	soc = (struct tegra_soctherm_soc *)match->data;
 	if (soc->num_ttgs > TEGRA124_SOCTHERM_SENSOR_NUM)
 		return -EINVAL;
 
@@ -2222,7 +2218,7 @@ static int __maybe_unused soctherm_suspend(struct device *dev)
 static int __maybe_unused soctherm_resume(struct device *dev)
 {
 	struct tegra_soctherm *tegra = dev_get_drvdata(dev);
-	struct tegra_soctherm_soc *soc = tegra->soc;
+	const struct tegra_soctherm_soc *soc = tegra->soc;
 	int err, i;
 
 	err = soctherm_clk_enable(tegra, true);
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 04/10] thermal: tegra: Do not register cooling device
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (2 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 03/10] thermal: tegra: Constify SoC-specific data Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 05/10] thermal: tegra: Use unsigned int where appropriate Thierry Reding
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

The SOCTHERM's built-in throttling mechanism doesn't map well to the
concept of a cooling device because it will automatically start to
throttle when the programmed temperature threshold is crossed.

Remove the cooling device implementation and instead unconditionally
program the throttling for the CPU and GPU thermal zones.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c          | 148 +++-------------------
 drivers/thermal/tegra/soctherm.h          |   1 +
 drivers/thermal/tegra/tegra124-soctherm.c |   4 +
 drivers/thermal/tegra/tegra132-soctherm.c |   4 +
 drivers/thermal/tegra/tegra210-soctherm.c |   4 +
 5 files changed, 33 insertions(+), 128 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 958fa10de516..eb12e8cc0a2f 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -317,11 +317,11 @@ struct soctherm_throt_cfg {
 	const char *name;
 	unsigned int id;
 	u8 priority;
+	int temperature;
 	u8 cpu_throt_level;
 	u32 cpu_throt_depth;
 	u32 gpu_throt_level;
 	struct soctherm_oc_cfg oc_cfg;
-	struct thermal_cooling_device *cdev;
 	bool init;
 };
 
@@ -606,25 +606,6 @@ static int tegra_thermctl_set_trip_temp(struct thermal_zone_device *tz, int trip
 			return thermtrip_program(ts, sg, temp);
 		else
 			return 0;
-
-	} else if (trip.type == THERMAL_TRIP_HOT) {
-		int i;
-
-		for (i = 0; i < THROTTLE_SIZE; i++) {
-			struct thermal_cooling_device *cdev;
-			struct soctherm_throt_cfg *stc;
-
-			if (!ts->throt_cfgs[i].init)
-				continue;
-
-			cdev = ts->throt_cfgs[i].cdev;
-			if (get_thermal_instance(tz, cdev, trip_id))
-				stc = find_throttle_cfg_by_name(ts, cdev->type);
-			else
-				continue;
-
-			return throttrip_program(ts, sg, stc, temp);
-		}
 	}
 
 	return 0;
@@ -685,26 +666,6 @@ static const struct thermal_zone_device_ops tegra_of_thermal_ops = {
 	.set_trips = tegra_thermctl_set_trips,
 };
 
-static int get_hot_temp(struct thermal_zone_device *tz, int *trip_id, int *temp)
-{
-	int i, ret;
-	struct thermal_trip trip;
-
-	for (i = 0; i < thermal_zone_get_num_trips(tz); i++) {
-
-		ret = thermal_zone_get_trip(tz, i, &trip);
-		if (ret)
-			return -EINVAL;
-
-		if (trip.type == THERMAL_TRIP_HOT) {
-			*trip_id = i;
-			return 0;
-		}
-	}
-
-	return -EINVAL;
-}
-
 /**
  * tegra_soctherm_set_hwtrips() - set HW trip point from DT data
  * @dev: struct device * of the SOC_THERM instance
@@ -734,7 +695,7 @@ static int tegra_soctherm_set_hwtrips(struct tegra_soctherm *ts,
 				      struct thermal_zone_device *tz)
 {
 	struct soctherm_throt_cfg *stc;
-	int i, trip, temperature, ret;
+	int temperature, ret;
 
 	/* Get thermtrips. If missing, try to get critical trips. */
 	temperature = tsensor_group_thermtrip_get(ts, sg->id);
@@ -752,42 +713,19 @@ static int tegra_soctherm_set_hwtrips(struct tegra_soctherm *ts,
 	dev_info(ts->dev, "thermtrip: will shut down when %s reaches %d mC\n",
 		 sg->name, temperature);
 
-	ret = get_hot_temp(tz, &trip, &temperature);
-	if (ret) {
-		dev_info(ts->dev, "throttrip: %s: missing hot temperature\n",
-			 sg->name);
-		return 0;
-	}
-
-	for (i = 0; i < THROTTLE_OC1; i++) {
-		struct thermal_cooling_device *cdev;
-
-		if (!ts->throt_cfgs[i].init)
-			continue;
-
-		cdev = ts->throt_cfgs[i].cdev;
-		if (get_thermal_instance(tz, cdev, trip))
-			stc = find_throttle_cfg_by_name(ts, cdev->type);
-		else
-			continue;
-
-		ret = throttrip_program(ts, sg, stc, temperature);
-		if (ret) {
-			dev_err(ts->dev, "throttrip: %s: error during enable\n",
-				sg->name);
-			return ret;
+	/* if configured, program the pulse skipper for CPU and GPU zones */
+	if (sg->can_throttle) {
+		stc = find_throttle_cfg_by_name(ts, "heavy");
+		if (stc && stc->init) {
+			ret = throttrip_program(ts, sg, stc, temperature);
+			if (ret) {
+				dev_err(ts->dev,
+					"throttrip: %s: failed to enable: %d\n",
+					sg->name, ret);
+			}
 		}
-
-		dev_info(ts->dev,
-			 "throttrip: will throttle when %s reaches %d mC\n",
-			 sg->name, temperature);
-		break;
 	}
 
-	if (i == THROTTLE_SIZE)
-		dev_info(ts->dev, "throttrip: %s: missing throttle cdev\n",
-			 sg->name);
-
 	return 0;
 }
 
@@ -1494,40 +1432,6 @@ static int soctherm_clk_enable(struct tegra_soctherm *tegra, bool enable)
 	return 0;
 }
 
-static int throt_get_cdev_max_state(struct thermal_cooling_device *cdev,
-				    unsigned long *max_state)
-{
-	*max_state = 1;
-	return 0;
-}
-
-static int throt_get_cdev_cur_state(struct thermal_cooling_device *cdev,
-				    unsigned long *cur_state)
-{
-	struct tegra_soctherm *ts = cdev->devdata;
-	u32 r;
-
-	r = readl(ts->regs + THROT_STATUS);
-	if (REG_GET_MASK(r, THROT_STATUS_STATE_MASK))
-		*cur_state = 1;
-	else
-		*cur_state = 0;
-
-	return 0;
-}
-
-static int throt_set_cdev_state(struct thermal_cooling_device *cdev,
-				unsigned long cur_state)
-{
-	return 0;
-}
-
-static const struct thermal_cooling_device_ops throt_cooling_ops = {
-	.get_max_state = throt_get_cdev_max_state,
-	.get_cur_state = throt_get_cdev_cur_state,
-	.set_cur_state = throt_set_cdev_state,
-};
-
 static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 {
 	struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
@@ -1633,6 +1537,10 @@ static int soctherm_throt_cfg_parse(struct tegra_soctherm *ts,
 	else
 		goto err;
 
+	ret = of_property_read_u32(np, "temperature", &stc->temperature);
+	if (ret < 0)
+		goto err;
+
 	return 0;
 
 err:
@@ -1642,14 +1550,12 @@ static int soctherm_throt_cfg_parse(struct tegra_soctherm *ts,
 }
 
 /**
- * soctherm_init_hw_throt_cdev() - Parse the HW throttle configurations
- * and register them as cooling devices.
+ * soctherm_init_hw_throttling() - parse the HW throttle configurations
  * @tegra: pointer to Tegra soctherm structure
  */
-static void soctherm_init_hw_throt_cdev(struct tegra_soctherm *tegra)
+static void soctherm_init_hw_throttling(struct tegra_soctherm *tegra)
 {
 	struct device_node *np_stc, *np_stcc;
-	const char *name;
 	int i;
 
 	for (i = 0; i < THROTTLE_SIZE; i++) {
@@ -1666,11 +1572,10 @@ static void soctherm_init_hw_throt_cdev(struct tegra_soctherm *tegra)
 	}
 
 	for_each_child_of_node(np_stc, np_stcc) {
+		const char *name = np_stcc->name;
 		struct soctherm_throt_cfg *stc;
-		struct thermal_cooling_device *tcd;
 		int err;
 
-		name = np_stcc->name;
 		stc = find_throttle_cfg_by_name(tegra, name);
 		if (!stc) {
 			dev_err(tegra->dev, "throttle-cfg: could not find %s\n",
@@ -1692,19 +1597,6 @@ static void soctherm_init_hw_throt_cdev(struct tegra_soctherm *tegra)
 		if (stc->id >= THROTTLE_OC1) {
 			soctherm_oc_cfg_parse(tegra, np_stcc, stc);
 			stc->init = true;
-		} else {
-
-			tcd = thermal_of_cooling_device_register(np_stcc,
-							 (char *)name, tegra,
-							 &throt_cooling_ops);
-			if (IS_ERR_OR_NULL(tcd)) {
-				dev_err(tegra->dev,
-					"throttle-cfg: %s: failed to register cooling device\n",
-					name);
-				continue;
-			}
-			stc->cdev = tcd;
-			stc->init = true;
 		}
 	}
 
@@ -2148,7 +2040,7 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 
 	soctherm_thermtrips_parse(tegra);
 
-	soctherm_init_hw_throt_cdev(tegra);
+	soctherm_init_hw_throttling(tegra);
 
 	soctherm_init(tegra);
 
diff --git a/drivers/thermal/tegra/soctherm.h b/drivers/thermal/tegra/soctherm.h
index 70501e73d586..894bee5d96c5 100644
--- a/drivers/thermal/tegra/soctherm.h
+++ b/drivers/thermal/tegra/soctherm.h
@@ -83,6 +83,7 @@ struct tegra_tsensor_group {
 	u16 thermctl_lvl0_offset;
 	u32 thermctl_lvl0_up_thresh_mask;
 	u32 thermctl_lvl0_dn_thresh_mask;
+	bool can_throttle;
 };
 
 struct tegra_tsensor_configuration {
diff --git a/drivers/thermal/tegra/tegra124-soctherm.c b/drivers/thermal/tegra/tegra124-soctherm.c
index 20ad27f4d1a1..7b11fa8fb533 100644
--- a/drivers/thermal/tegra/tegra124-soctherm.c
+++ b/drivers/thermal/tegra/tegra124-soctherm.c
@@ -60,6 +60,7 @@ static const struct tegra_tsensor_group tegra124_tsensor_group_cpu = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_CPU,
 	.thermctl_lvl0_up_thresh_mask = TEGRA124_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA124_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = true,
 };
 
 static const struct tegra_tsensor_group tegra124_tsensor_group_gpu = {
@@ -79,6 +80,7 @@ static const struct tegra_tsensor_group tegra124_tsensor_group_gpu = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_GPU,
 	.thermctl_lvl0_up_thresh_mask = TEGRA124_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA124_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = true,
 };
 
 static const struct tegra_tsensor_group tegra124_tsensor_group_pll = {
@@ -96,6 +98,7 @@ static const struct tegra_tsensor_group tegra124_tsensor_group_pll = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_TSENSE,
 	.thermctl_lvl0_up_thresh_mask = TEGRA124_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA124_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = false,
 };
 
 static const struct tegra_tsensor_group tegra124_tsensor_group_mem = {
@@ -115,6 +118,7 @@ static const struct tegra_tsensor_group tegra124_tsensor_group_mem = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_MEM,
 	.thermctl_lvl0_up_thresh_mask = TEGRA124_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA124_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = false,
 };
 
 static const struct tegra_tsensor_group *tegra124_tsensor_groups[] = {
diff --git a/drivers/thermal/tegra/tegra132-soctherm.c b/drivers/thermal/tegra/tegra132-soctherm.c
index b76308fdad9e..304561fe9110 100644
--- a/drivers/thermal/tegra/tegra132-soctherm.c
+++ b/drivers/thermal/tegra/tegra132-soctherm.c
@@ -60,6 +60,7 @@ static const struct tegra_tsensor_group tegra132_tsensor_group_cpu = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_CPU,
 	.thermctl_lvl0_up_thresh_mask = TEGRA132_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA132_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = true,
 };
 
 static const struct tegra_tsensor_group tegra132_tsensor_group_gpu = {
@@ -79,6 +80,7 @@ static const struct tegra_tsensor_group tegra132_tsensor_group_gpu = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_GPU,
 	.thermctl_lvl0_up_thresh_mask = TEGRA132_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA132_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = true,
 };
 
 static const struct tegra_tsensor_group tegra132_tsensor_group_pll = {
@@ -96,6 +98,7 @@ static const struct tegra_tsensor_group tegra132_tsensor_group_pll = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_TSENSE,
 	.thermctl_lvl0_up_thresh_mask = TEGRA132_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA132_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = false,
 };
 
 static const struct tegra_tsensor_group tegra132_tsensor_group_mem = {
@@ -115,6 +118,7 @@ static const struct tegra_tsensor_group tegra132_tsensor_group_mem = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_MEM,
 	.thermctl_lvl0_up_thresh_mask = TEGRA132_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA132_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = false,
 };
 
 static const struct tegra_tsensor_group *tegra132_tsensor_groups[] = {
diff --git a/drivers/thermal/tegra/tegra210-soctherm.c b/drivers/thermal/tegra/tegra210-soctherm.c
index d0ff793f18c5..6277a8e12b8a 100644
--- a/drivers/thermal/tegra/tegra210-soctherm.c
+++ b/drivers/thermal/tegra/tegra210-soctherm.c
@@ -61,6 +61,7 @@ static const struct tegra_tsensor_group tegra210_tsensor_group_cpu = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_CPU,
 	.thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = true,
 };
 
 static const struct tegra_tsensor_group tegra210_tsensor_group_gpu = {
@@ -80,6 +81,7 @@ static const struct tegra_tsensor_group tegra210_tsensor_group_gpu = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_GPU,
 	.thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = true,
 };
 
 static const struct tegra_tsensor_group tegra210_tsensor_group_pll = {
@@ -97,6 +99,7 @@ static const struct tegra_tsensor_group tegra210_tsensor_group_pll = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_TSENSE,
 	.thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = false,
 };
 
 static const struct tegra_tsensor_group tegra210_tsensor_group_mem = {
@@ -116,6 +119,7 @@ static const struct tegra_tsensor_group tegra210_tsensor_group_mem = {
 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_MEM,
 	.thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK,
 	.thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK,
+	.can_throttle = false,
 };
 
 static const struct tegra_tsensor_group *tegra210_tsensor_groups[] = {
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 05/10] thermal: tegra: Use unsigned int where appropriate
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (3 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 04/10] thermal: tegra: Do not register cooling device Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 06/10] thermal: tegra: Avoid over-allocation of temporary array Thierry Reding
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

Use unsigned integers more consistently, which helps to make it more
explicit about what values can be expected.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index eb12e8cc0a2f..730b034004cb 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -565,8 +565,9 @@ find_throttle_cfg_by_name(struct tegra_soctherm *ts, const char *name)
 
 static int tsensor_group_thermtrip_get(struct tegra_soctherm *ts, int id)
 {
-	int i, temp = min_low_temp;
 	struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
+	int temp = min_low_temp;
+	unsigned int i;
 
 	if (id >= TEGRA124_SOCTHERM_SENSOR_NUM)
 		return temp;
@@ -1436,33 +1437,34 @@ static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 {
 	struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
 	const int max_num_prop = ts->soc->num_ttgs * 2;
+	unsigned int i, j, count;
 	u32 *tlb;
-	int i, j, n, ret;
+	int ret;
 
 	if (!tt)
 		return -ENOMEM;
 
-	n = of_property_count_u32_elems(ts->dev->of_node, "nvidia,thermtrips");
-	if (n <= 0) {
+	ret = of_property_count_u32_elems(ts->dev->of_node, "nvidia,thermtrips");
+	if (ret <= 0) {
 		dev_info(ts->dev,
-			 "missing thermtrips, will use critical trips as shut down temp\n");
-		return n;
+			 "missing thermtrips, will use critical trips as shut down temperature\n");
+		return ret;
 	}
 
-	n = min(max_num_prop, n);
+	count = min_t(unsigned int, ret, ts->soc->num_ttgs * 2);
 
 	tlb = devm_kcalloc(ts->dev, max_num_prop, sizeof(u32), GFP_KERNEL);
 	if (!tlb)
 		return -ENOMEM;
+
 	ret = of_property_read_u32_array(ts->dev->of_node, "nvidia,thermtrips",
-					 tlb, n);
+					 tlb, count);
 	if (ret) {
 		dev_err(ts->dev, "invalid num ele: thermtrips:%d\n", ret);
 		return ret;
 	}
 
-	i = 0;
-	for (j = 0; j < n; j = j + 2) {
+	for (i = 0, j = 0; j < count; j = j + 2) {
 		if (tlb[j] >= TEGRA124_SOCTHERM_SENSOR_NUM)
 			continue;
 
@@ -1556,7 +1558,7 @@ static int soctherm_throt_cfg_parse(struct tegra_soctherm *ts,
 static void soctherm_init_hw_throttling(struct tegra_soctherm *tegra)
 {
 	struct device_node *np_stc, *np_stcc;
-	int i;
+	unsigned int i;
 
 	for (i = 0; i < THROTTLE_SIZE; i++) {
 		tegra->throt_cfgs[i].name = throt_names[i];
@@ -1819,8 +1821,8 @@ static void soctherm_throttle_program(struct tegra_soctherm *ts,
 
 static void tegra_soctherm_throttle(struct tegra_soctherm *ts)
 {
+	unsigned int i;
 	u32 v;
-	int i;
 
 	/* configure LOW, MED and HIGH levels for CCROC NV_THERM */
 	if (ts->soc->use_ccroc) {
@@ -1894,8 +1896,8 @@ static int soctherm_interrupts_init(struct tegra_soctherm *tegra)
 static void soctherm_init(struct tegra_soctherm *tegra)
 {
 	const struct tegra_tsensor_group **ttgs = tegra->soc->ttgs;
-	int i;
 	u32 pdiv, hotspot;
+	unsigned int i;
 
 	/* Initialize raw sensors */
 	for (i = 0; i < tegra->soc->num_tsensors; ++i)
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 06/10] thermal: tegra: Avoid over-allocation of temporary array
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (4 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 05/10] thermal: tegra: Use unsigned int where appropriate Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 07/10] thermal: tegra: Remove gratuitous error assignment Thierry Reding
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

The code will attempt to read "count" entries from DT, but the code
allocates the maximum number that is possible, potentially over-
allocating the array. Use the actual number of entries when allocating.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 730b034004cb..16fa00fa0839 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1436,7 +1436,6 @@ static int soctherm_clk_enable(struct tegra_soctherm *tegra, bool enable)
 static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 {
 	struct tsensor_group_thermtrips *tt = ts->soc->thermtrips;
-	const int max_num_prop = ts->soc->num_ttgs * 2;
 	unsigned int i, j, count;
 	u32 *tlb;
 	int ret;
@@ -1453,7 +1452,7 @@ static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 
 	count = min_t(unsigned int, ret, ts->soc->num_ttgs * 2);
 
-	tlb = devm_kcalloc(ts->dev, max_num_prop, sizeof(u32), GFP_KERNEL);
+	tlb = devm_kcalloc(ts->dev, count, sizeof(u32), GFP_KERNEL);
 	if (!tlb)
 		return -ENOMEM;
 
@@ -1473,6 +1472,8 @@ static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 		i++;
 	}
 
+	devm_kfree(ts->dev, tlb);
+
 	return 0;
 }
 
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 07/10] thermal: tegra: Remove gratuitous error assignment
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (5 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 06/10] thermal: tegra: Avoid over-allocation of temporary array Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 08/10] thermal: tegra: Minor stylistic cleanups Thierry Reding
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

Interrupts are optional, so errors during their initialization are
ignored. However, the code confusingly stores the error code and makes
it looks like it is somehow relevant. Remove the gratuitous assignment
to make it clearer that these errors are being purposefully ignored.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 16fa00fa0839..b6e61393fb8f 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -2078,8 +2078,7 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 			goto disable_clocks;
 	}
 
-	err = soctherm_interrupts_init(tegra);
-
+	soctherm_interrupts_init(tegra);
 	soctherm_debug_init(tegra);
 
 	return 0;
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 08/10] thermal: tegra: Minor stylistic cleanups
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (6 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 07/10] thermal: tegra: Remove gratuitous error assignment Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-14 12:57 ` [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210 Thierry Reding
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

Fix up some whitespace (padding, identation) issues and reword an
unreadable comment.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/thermal/tegra/soctherm.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index b6e61393fb8f..ba93ea1486f6 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1459,7 +1459,9 @@ static int soctherm_thermtrips_parse(struct tegra_soctherm *ts)
 	ret = of_property_read_u32_array(ts->dev->of_node, "nvidia,thermtrips",
 					 tlb, count);
 	if (ret) {
-		dev_err(ts->dev, "invalid num ele: thermtrips:%d\n", ret);
+		dev_err(ts->dev,
+			"failed to read \"nvidia,thermtrips\" property: %d\n",
+			ret);
 		return ret;
 	}
 
@@ -1756,7 +1758,7 @@ static void throttlectl_gpu_level_select(struct tegra_soctherm *ts,
 }
 
 static int soctherm_oc_cfg_program(struct tegra_soctherm *ts,
-				      enum soctherm_throttle_id throt)
+				   enum soctherm_throttle_id throt)
 {
 	u32 r;
 	struct soctherm_oc_cfg *oc = &ts->throt_cfgs[throt].oc_cfg;
@@ -2048,8 +2050,9 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
 	soctherm_init(tegra);
 
 	for (i = 0; i < soc->num_ttgs; ++i) {
-		struct tegra_thermctl_zone *zone =
-			devm_kzalloc(&pdev->dev, sizeof(*zone), GFP_KERNEL);
+		struct tegra_thermctl_zone *zone;
+
+		zone = devm_kzalloc(&pdev->dev, sizeof(*zone), GFP_KERNEL);
 		if (!zone) {
 			err = -ENOMEM;
 			goto disable_clocks;
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (7 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 08/10] thermal: tegra: Minor stylistic cleanups Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-04-17  8:15   ` Daniel Lezcano
  2023-04-14 12:57 ` [PATCH 10/10] ARM: tegra: Rework SOCTHERM on Tegra124 Thierry Reding
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

The "heavy throttle" cooling device that SOCTHERM uses isn't a cooling
device in the traditional sense. It's an automatic mechanism that cannot
be actively controlled. Do not expose it as a cooling device and instead
of tying it to a specific trip point, hard-code the temperature at which
the automatic throttling will begin.

While at it, clean up the trip point names to reflect the names used by
the thermal device tree bindings.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 arch/arm64/boot/dts/nvidia/tegra132.dtsi | 63 +++++-------------
 arch/arm64/boot/dts/nvidia/tegra210.dtsi | 83 +++++++-----------------
 2 files changed, 39 insertions(+), 107 deletions(-)

diff --git a/arch/arm64/boot/dts/nvidia/tegra132.dtsi b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
index 8b78be8f4f9d..11ebf7517df1 100644
--- a/arch/arm64/boot/dts/nvidia/tegra132.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
@@ -876,11 +876,10 @@ soctherm: thermal-sensor@700e2000 {
 		#thermal-sensor-cells = <1>;
 
 		throttle-cfgs {
-			throttle_heavy: heavy {
+			heavy {
 				nvidia,priority = <100>;
 				nvidia,cpu-throt-level = <TEGRA_SOCTHERM_THROT_LEVEL_HIGH>;
-
-				#cooling-cells = <2>;
+				temperature = <102000>;
 			};
 		};
 	};
@@ -1136,114 +1135,84 @@ cpu-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
 
 			trips {
-				cpu_shutdown_trip {
+				critical {
 					temperature = <105000>;
 					hysteresis = <1000>;
 					type = "critical";
 				};
 
-				cpu_throttle_trip: throttle-trip {
+				hot {
 					temperature = <102000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				map0 {
-					trip = <&cpu_throttle_trip>;
-					cooling-device = <&throttle_heavy 1 1>;
-				};
-			};
 		};
 
 		mem-thermal {
 			polling-delay-passive = <0>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_MEM>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_MEM>;
 
 			trips {
-				mem_shutdown_trip {
+				critical {
 					temperature = <101000>;
 					hysteresis = <1000>;
 					type = "critical";
 				};
-				mem_throttle_trip {
+
+				hot {
 					temperature = <99000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				/*
-				 * There are currently no cooling maps,
-				 * because there are no cooling devices.
-				 */
-			};
 		};
 
 		gpu-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_GPU>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_GPU>;
 
 			trips {
-				gpu_shutdown_trip {
+				critical {
 					temperature = <101000>;
 					hysteresis = <1000>;
 					type = "critical";
 				};
 
-				gpu_throttle_trip: throttle-trip {
+				hot {
 					temperature = <99000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				map0 {
-					trip = <&gpu_throttle_trip>;
-					cooling-device = <&throttle_heavy 1 1>;
-				};
-			};
 		};
 
 		pllx-thermal {
 			polling-delay-passive = <0>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_PLLX>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
 			trips {
-				pllx_shutdown_trip {
+				critical {
 					temperature = <105000>;
 					hysteresis = <1000>;
 					type = "critical";
 				};
-				pllx_throttle_trip {
+
+				hot {
 					temperature = <99000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				/*
-				 * There are currently no cooling maps,
-				 * because there are no cooling devices.
-				 */
-			};
 		};
 	};
 
diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
index 0e463b3cbe01..af5460c74184 100644
--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1331,12 +1331,11 @@ soctherm: thermal-sensor@700e2000 {
 		#thermal-sensor-cells = <1>;
 
 		throttle-cfgs {
-			throttle_heavy: heavy {
+			heavy {
 				nvidia,priority = <100>;
 				nvidia,cpu-throt-percent = <85>;
 				nvidia,gpu-throt-level = <TEGRA_SOCTHERM_THROT_LEVEL_HIGH>;
-
-				#cooling-cells = <2>;
+				temperature = <98500>;
 			};
 		};
 	};
@@ -2032,73 +2031,53 @@ cpu-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
 
 			trips {
-				cpu-shutdown-trip {
+				critical {
 					temperature = <102500>;
 					hysteresis = <0>;
 					type = "critical";
 				};
 
-				cpu_throttle_trip: throttle-trip {
+				hot {
 					temperature = <98500>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				map0 {
-					trip = <&cpu_throttle_trip>;
-					cooling-device = <&throttle_heavy 1 1>;
-				};
-			};
 		};
 
 		mem-thermal {
 			polling-delay-passive = <0>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_MEM>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_MEM>;
 
 			trips {
-				dram_nominal: mem-nominal-trip {
-					temperature = <50000>;
-					hysteresis = <1000>;
-					type = "passive";
-				};
-
-				dram_throttle: mem-throttle-trip {
-					temperature = <70000>;
-					hysteresis = <1000>;
-					type = "active";
+				critical {
+					temperature = <103000>;
+					hysteresis = <0>;
+					type = "critical";
 				};
 
-				mem-hot-trip {
+				hot {
 					temperature = <100000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 
-				mem-shutdown-trip {
-					temperature = <103000>;
-					hysteresis = <0>;
-					type = "critical";
+				emc_throttle_trip: passive {
+					temperature = <95000>;
+					hysteresis = <2000>;
+					type = "passive";
 				};
 			};
 
 			cooling-maps {
-				dram-passive {
-					cooling-device = <&emc 0 0>;
-					trip = <&dram_nominal>;
-				};
-
-				dram-active {
+				passive {
 					cooling-device = <&emc 1 1>;
-					trip = <&dram_throttle>;
+					trip = <&emc_throttle_trip>;
 				};
 			};
 		};
@@ -2107,58 +2086,42 @@ gpu-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_GPU>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_GPU>;
 
 			trips {
-				gpu-shutdown-trip {
+				critical {
 					temperature = <103000>;
 					hysteresis = <0>;
 					type = "critical";
 				};
 
-				gpu_throttle_trip: throttle-trip {
+				hot {
 					temperature = <100000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				map0 {
-					trip = <&gpu_throttle_trip>;
-					cooling-device = <&throttle_heavy 1 1>;
-				};
-			};
 		};
 
 		pllx-thermal {
 			polling-delay-passive = <0>;
 			polling-delay = <0>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_PLLX>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
 			trips {
-				pllx-shutdown-trip {
+				critical {
 					temperature = <103000>;
 					hysteresis = <0>;
 					type = "critical";
 				};
 
-				pllx-throttle-trip {
+				hot {
 					temperature = <100000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				/*
-				 * There are currently no cooling maps,
-				 * because there are no cooling devices.
-				 */
-			};
 		};
 	};
 
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 10/10] ARM: tegra: Rework SOCTHERM on Tegra124
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (8 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210 Thierry Reding
@ 2023-04-14 12:57 ` Thierry Reding
  2023-06-19 10:36 ` [PATCH 00/10] thermal: tegra: Do not register cooling device Daniel Lezcano
  2023-07-11  8:25 ` Daniel Lezcano
  11 siblings, 0 replies; 21+ messages in thread
From: Thierry Reding @ 2023-04-14 12:57 UTC (permalink / raw)
  To: Daniel Lezcano, Rafael J . Wysocki, Thierry Reding, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

From: Thierry Reding <treding@nvidia.com>

The "heavy throttle" cooling device that SOCTHERM uses isn't a cooling
device in the traditional sense. It's an automatic mechanism that cannot
be actively controlled. Do not expose it as a cooling device and instead
of tying it to a specific trip point, hard-code the temperature at which
the automatic throttling will begin.

While at it, clean up the trip point names to reflect the names used by
the thermal device tree bindings.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 arch/arm/boot/dts/tegra124.dtsi | 65 +++++++++------------------------
 1 file changed, 18 insertions(+), 47 deletions(-)

diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi
index b3fbecf5c818..656361b4ac01 100644
--- a/arch/arm/boot/dts/tegra124.dtsi
+++ b/arch/arm/boot/dts/tegra124.dtsi
@@ -932,12 +932,11 @@ soctherm: thermal-sensor@700e2000 {
 		#thermal-sensor-cells = <1>;
 
 		throttle-cfgs {
-			throttle_heavy: heavy {
+			heavy {
 				nvidia,priority = <100>;
 				nvidia,cpu-throt-percent = <85>;
 				nvidia,gpu-throt-level = <TEGRA_SOCTHERM_THROT_LEVEL_HIGH>;
-
-				#cooling-cells = <2>;
+				temperature = <100000>;
 			};
 		};
 	};
@@ -1242,112 +1241,84 @@ cpu-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <1000>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
 
 			trips {
-				cpu-shutdown-trip {
+				critical {
 					temperature = <103000>;
 					hysteresis = <0>;
 					type = "critical";
 				};
-				cpu_throttle_trip: throttle-trip {
+
+				hot {
 					temperature = <100000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				map0 {
-					trip = <&cpu_throttle_trip>;
-					cooling-device = <&throttle_heavy 1 1>;
-				};
-			};
 		};
 
 		mem-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <1000>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_MEM>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_MEM>;
 
 			trips {
-				mem-shutdown-trip {
+				critical {
 					temperature = <103000>;
 					hysteresis = <0>;
 					type = "critical";
 				};
-				mem-throttle-trip {
+
+				hot {
 					temperature = <99000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				/*
-				 * There are currently no cooling maps,
-				 * because there are no cooling devices.
-				 */
-			};
 		};
 
 		gpu-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <1000>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_GPU>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_GPU>;
 
 			trips {
-				gpu-shutdown-trip {
+				critical {
 					temperature = <101000>;
 					hysteresis = <0>;
 					type = "critical";
 				};
-				gpu_throttle_trip: throttle-trip {
+
+				hot {
 					temperature = <99000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				map0 {
-					trip = <&gpu_throttle_trip>;
-					cooling-device = <&throttle_heavy 1 1>;
-				};
-			};
 		};
 
 		pllx-thermal {
 			polling-delay-passive = <1000>;
 			polling-delay = <1000>;
 
-			thermal-sensors =
-				<&soctherm TEGRA124_SOCTHERM_SENSOR_PLLX>;
+			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_PLLX>;
 
 			trips {
-				pllx-shutdown-trip {
+				critical {
 					temperature = <103000>;
 					hysteresis = <0>;
 					type = "critical";
 				};
-				pllx-throttle-trip {
+
+				hot {
 					temperature = <99000>;
 					hysteresis = <1000>;
 					type = "hot";
 				};
 			};
-
-			cooling-maps {
-				/*
-				 * There are currently no cooling maps,
-				 * because there are no cooling devices.
-				 */
-			};
 		};
 	};
 
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature
  2023-04-14 12:57 ` [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature Thierry Reding
@ 2023-04-14 21:47   ` Krzysztof Kozlowski
  2023-04-17  8:59     ` Thierry Reding
  0 siblings, 1 reply; 21+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-14 21:47 UTC (permalink / raw)
  To: Thierry Reding, Daniel Lezcano, Rafael J . Wysocki, Rob Herring,
	Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

On 14/04/2023 14:57, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> Each throttling configuration needs to specify the temperature threshold
> at which it should start throttling. Previously this was tied to a given
> trip point as a cooling device and used the temperature specified for
> that trip point. This doesn't work well because the throttling mechanism
> is not a cooling device in the traditional sense.
> 
> Instead, allow device trees to specify the throttle temperature in the
> throttle configuration directly so that the throttle doesn't need to be
> exposed as a cooling device.
> 
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
>  .../bindings/thermal/nvidia,tegra124-soctherm.yaml         | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
> index 4677ad6645a5..37dac851f486 100644
> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml

File does not exist in next and no dependency is mentioned, so tricky to
review and figure out context. Without context the comment is:


> @@ -120,6 +120,13 @@ properties:
>                # high (85%, TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
>                - 3
>  
> +          temperature:
> +            $ref: /schemas/types.yaml#/definitions/int32

Use -millicelsius suffix instead:
https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/property-units.yaml

> +            minimum: -273000
> +            maximum: 200000
> +            description: The temperature threshold (in millicelsius) that,
> +              when crossed, will trigger the configured automatic throttling.

Don't you want some hysteresis? Or is it already using trips binding?
But in that case you should skip the $ref and maximum - they come from
thermal-zones, don't they?

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
  2023-04-14 12:57 ` [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210 Thierry Reding
@ 2023-04-17  8:15   ` Daniel Lezcano
  2023-04-17  9:06     ` Thierry Reding
  0 siblings, 1 reply; 21+ messages in thread
From: Daniel Lezcano @ 2023-04-17  8:15 UTC (permalink / raw)
  To: Thierry Reding, Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

On 14/04/2023 14:57, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> The "heavy throttle" cooling device that SOCTHERM uses isn't a cooling
> device in the traditional sense. It's an automatic mechanism that cannot
> be actively controlled. Do not expose it as a cooling device and instead
> of tying it to a specific trip point, hard-code the temperature at which
> the automatic throttling will begin.
> 
> While at it, clean up the trip point names to reflect the names used by
> the thermal device tree bindings.
> 
> Signed-off-by: Thierry Reding <treding@nvidia.com>
> ---
>   arch/arm64/boot/dts/nvidia/tegra132.dtsi | 63 +++++-------------
>   arch/arm64/boot/dts/nvidia/tegra210.dtsi | 83 +++++++-----------------
>   2 files changed, 39 insertions(+), 107 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/nvidia/tegra132.dtsi b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
> index 8b78be8f4f9d..11ebf7517df1 100644
> --- a/arch/arm64/boot/dts/nvidia/tegra132.dtsi
> +++ b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
> @@ -876,11 +876,10 @@ soctherm: thermal-sensor@700e2000 {
>   		#thermal-sensor-cells = <1>;
>   
>   		throttle-cfgs {
> -			throttle_heavy: heavy {
> +			heavy {
>   				nvidia,priority = <100>;
>   				nvidia,cpu-throt-level = <TEGRA_SOCTHERM_THROT_LEVEL_HIGH>;
> -
> -				#cooling-cells = <2>;
> +				temperature = <102000>;
>   			};
>   		};
>   	};
> @@ -1136,114 +1135,84 @@ cpu-thermal {
>   			polling-delay-passive = <1000>;
>   			polling-delay = <0>;
>   
> -			thermal-sensors =
> -				<&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
> +			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
>   
>   			trips {
> -				cpu_shutdown_trip {
> +				critical {
>   					temperature = <105000>;
>   					hysteresis = <1000>;
>   					type = "critical";
>   				};
>   
> -				cpu_throttle_trip: throttle-trip {
> +				hot {
>   					temperature = <102000>;
>   					hysteresis = <1000>;
>   					type = "hot";
>   				};
>   			};
> -
> -			cooling-maps {
> -				map0 {
> -					trip = <&cpu_throttle_trip>;
> -					cooling-device = <&throttle_heavy 1 1>;
> -				};
> -			};

If the hardware mitigation is 'heavy', don't you want to have DVFS 
acting before hardware throttling ?

[ ... ]

-- 
<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


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature
  2023-04-14 21:47   ` Krzysztof Kozlowski
@ 2023-04-17  8:59     ` Thierry Reding
  2023-04-18 16:13       ` Krzysztof Kozlowski
  0 siblings, 1 reply; 21+ messages in thread
From: Thierry Reding @ 2023-04-17  8:59 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Daniel Lezcano, Rafael J . Wysocki, Rob Herring,
	Krzysztof Kozlowski, Amit Kucheria, Zhang Rui, Jon Hunter,
	linux-pm, devicetree, linux-tegra

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

On Fri, Apr 14, 2023 at 11:47:56PM +0200, Krzysztof Kozlowski wrote:
> On 14/04/2023 14:57, Thierry Reding wrote:
> > From: Thierry Reding <treding@nvidia.com>
> > 
> > Each throttling configuration needs to specify the temperature threshold
> > at which it should start throttling. Previously this was tied to a given
> > trip point as a cooling device and used the temperature specified for
> > that trip point. This doesn't work well because the throttling mechanism
> > is not a cooling device in the traditional sense.
> > 
> > Instead, allow device trees to specify the throttle temperature in the
> > throttle configuration directly so that the throttle doesn't need to be
> > exposed as a cooling device.
> > 
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> >  .../bindings/thermal/nvidia,tegra124-soctherm.yaml         | 7 +++++++
> >  1 file changed, 7 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
> > index 4677ad6645a5..37dac851f486 100644
> > --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
> > +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
> 
> File does not exist in next and no dependency is mentioned, so tricky to
> review and figure out context. Without context the comment is:

Apologies, I have a conversion series for these thermal bindings. I'll
send those out first.

> > @@ -120,6 +120,13 @@ properties:
> >                # high (85%, TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
> >                - 3
> >  
> > +          temperature:
> > +            $ref: /schemas/types.yaml#/definitions/int32
> 
> Use -millicelsius suffix instead:
> https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/property-units.yaml

Okay.

> > +            minimum: -273000
> > +            maximum: 200000
> > +            description: The temperature threshold (in millicelsius) that,
> > +              when crossed, will trigger the configured automatic throttling.
> 
> Don't you want some hysteresis? Or is it already using trips binding?
> But in that case you should skip the $ref and maximum - they come from
> thermal-zones, don't they?

We don't use a hysteresis at the moment, but checking the register
documentation, there's indeed "up" and "down" thresholds, so we can add
another property for that.

This doesn't use the trips binding and in fact, one of the reasons for
this change is because we want to make this separate from trip points.
Trip points are usually associated with cooling devices and this
throttling mechanism doesn't really fit that concept because it is an
automatic mechanism that is triggered when a given temperature threshold
is crossed, rather than a manually activated mechanism, which is what a
cooling device would be.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
  2023-04-17  8:15   ` Daniel Lezcano
@ 2023-04-17  9:06     ` Thierry Reding
  2023-04-17  9:15       ` Daniel Lezcano
  0 siblings, 1 reply; 21+ messages in thread
From: Thierry Reding @ 2023-04-17  9:06 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski,
	Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree,
	linux-tegra

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

On Mon, Apr 17, 2023 at 10:15:11AM +0200, Daniel Lezcano wrote:
> On 14/04/2023 14:57, Thierry Reding wrote:
> > From: Thierry Reding <treding@nvidia.com>
> > 
> > The "heavy throttle" cooling device that SOCTHERM uses isn't a cooling
> > device in the traditional sense. It's an automatic mechanism that cannot
> > be actively controlled. Do not expose it as a cooling device and instead
> > of tying it to a specific trip point, hard-code the temperature at which
> > the automatic throttling will begin.
> > 
> > While at it, clean up the trip point names to reflect the names used by
> > the thermal device tree bindings.
> > 
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> >   arch/arm64/boot/dts/nvidia/tegra132.dtsi | 63 +++++-------------
> >   arch/arm64/boot/dts/nvidia/tegra210.dtsi | 83 +++++++-----------------
> >   2 files changed, 39 insertions(+), 107 deletions(-)
> > 
> > diff --git a/arch/arm64/boot/dts/nvidia/tegra132.dtsi b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
> > index 8b78be8f4f9d..11ebf7517df1 100644
> > --- a/arch/arm64/boot/dts/nvidia/tegra132.dtsi
> > +++ b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
> > @@ -876,11 +876,10 @@ soctherm: thermal-sensor@700e2000 {
> >   		#thermal-sensor-cells = <1>;
> >   		throttle-cfgs {
> > -			throttle_heavy: heavy {
> > +			heavy {
> >   				nvidia,priority = <100>;
> >   				nvidia,cpu-throt-level = <TEGRA_SOCTHERM_THROT_LEVEL_HIGH>;
> > -
> > -				#cooling-cells = <2>;
> > +				temperature = <102000>;
> >   			};
> >   		};
> >   	};
> > @@ -1136,114 +1135,84 @@ cpu-thermal {
> >   			polling-delay-passive = <1000>;
> >   			polling-delay = <0>;
> > -			thermal-sensors =
> > -				<&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
> > +			thermal-sensors = <&soctherm TEGRA124_SOCTHERM_SENSOR_CPU>;
> >   			trips {
> > -				cpu_shutdown_trip {
> > +				critical {
> >   					temperature = <105000>;
> >   					hysteresis = <1000>;
> >   					type = "critical";
> >   				};
> > -				cpu_throttle_trip: throttle-trip {
> > +				hot {
> >   					temperature = <102000>;
> >   					hysteresis = <1000>;
> >   					type = "hot";
> >   				};
> >   			};
> > -
> > -			cooling-maps {
> > -				map0 {
> > -					trip = <&cpu_throttle_trip>;
> > -					cooling-device = <&throttle_heavy 1 1>;
> > -				};
> > -			};
> 
> If the hardware mitigation is 'heavy', don't you want to have DVFS acting
> before hardware throttling ?

The throttling here is in fact some form of DVFS, but yes, generally we
would likely want to have additional forms of DVFS before we reach this
state. We could add CPU cooling devices and there's also a mechanism to
throttle the DRAM frequency on certain boards.

But those are mostly orthogonal to this series. The goal here is to get
rid of the throttling mechanism as a cooling device.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
  2023-04-17  9:06     ` Thierry Reding
@ 2023-04-17  9:15       ` Daniel Lezcano
  0 siblings, 0 replies; 21+ messages in thread
From: Daniel Lezcano @ 2023-04-17  9:15 UTC (permalink / raw)
  To: Thierry Reding
  Cc: Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski,
	Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree,
	linux-tegra

On 17/04/2023 11:06, Thierry Reding wrote:

[ ... ]

>>
>> If the hardware mitigation is 'heavy', don't you want to have DVFS acting
>> before hardware throttling ?
> 
> The throttling here is in fact some form of DVFS, but yes, generally we
> would likely want to have additional forms of DVFS before we reach this
> state. We could add CPU cooling devices and there's also a mechanism to
> throttle the DRAM frequency on certain boards.
> 
> But those are mostly orthogonal to this series. The goal here is to get
> rid of the throttling mechanism as a cooling device.

Right, thanks

-- 
<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


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature
  2023-04-17  8:59     ` Thierry Reding
@ 2023-04-18 16:13       ` Krzysztof Kozlowski
  0 siblings, 0 replies; 21+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-18 16:13 UTC (permalink / raw)
  To: Thierry Reding
  Cc: Daniel Lezcano, Rafael J . Wysocki, Rob Herring,
	Krzysztof Kozlowski, Amit Kucheria, Zhang Rui, Jon Hunter,
	linux-pm, devicetree, linux-tegra

On 17/04/2023 10:59, Thierry Reding wrote:
> On Fri, Apr 14, 2023 at 11:47:56PM +0200, Krzysztof Kozlowski wrote:
>> On 14/04/2023 14:57, Thierry Reding wrote:
>>> From: Thierry Reding <treding@nvidia.com>
>>>
>>> Each throttling configuration needs to specify the temperature threshold
>>> at which it should start throttling. Previously this was tied to a given
>>> trip point as a cooling device and used the temperature specified for
>>> that trip point. This doesn't work well because the throttling mechanism
>>> is not a cooling device in the traditional sense.
>>>
>>> Instead, allow device trees to specify the throttle temperature in the
>>> throttle configuration directly so that the throttle doesn't need to be
>>> exposed as a cooling device.
>>>
>>> Signed-off-by: Thierry Reding <treding@nvidia.com>
>>> ---
>>>  .../bindings/thermal/nvidia,tegra124-soctherm.yaml         | 7 +++++++
>>>  1 file changed, 7 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
>>> index 4677ad6645a5..37dac851f486 100644
>>> --- a/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
>>> +++ b/Documentation/devicetree/bindings/thermal/nvidia,tegra124-soctherm.yaml
>>
>> File does not exist in next and no dependency is mentioned, so tricky to
>> review and figure out context. Without context the comment is:
> 
> Apologies, I have a conversion series for these thermal bindings. I'll
> send those out first.
> 
>>> @@ -120,6 +120,13 @@ properties:
>>>                # high (85%, TEGRA_SOCTHERM_THROT_LEVEL_HIGH)
>>>                - 3
>>>  
>>> +          temperature:
>>> +            $ref: /schemas/types.yaml#/definitions/int32
>>
>> Use -millicelsius suffix instead:
>> https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/property-units.yaml
> 
> Okay.
> 
>>> +            minimum: -273000
>>> +            maximum: 200000
>>> +            description: The temperature threshold (in millicelsius) that,
>>> +              when crossed, will trigger the configured automatic throttling.
>>
>> Don't you want some hysteresis? Or is it already using trips binding?
>> But in that case you should skip the $ref and maximum - they come from
>> thermal-zones, don't they?
> 
> We don't use a hysteresis at the moment, but checking the register
> documentation, there's indeed "up" and "down" thresholds, so we can add
> another property for that.
> 
> This doesn't use the trips binding and in fact, one of the reasons for
> this change is because we want to make this separate from trip points.
> Trip points are usually associated with cooling devices and this
> throttling mechanism doesn't really fit that concept because it is an
> automatic mechanism that is triggered when a given temperature threshold
> is crossed, rather than a manually activated mechanism, which is what a
> cooling device would be.

OK, I just wasn't sure if the binding already includes trips, which
would mean you should use existing 'temperature' property.

In such case, I think it's better to switch to property with common unit
- millicelsius, either low/high ranges or with hysteresis.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 00/10] thermal: tegra: Do not register cooling device
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (9 preceding siblings ...)
  2023-04-14 12:57 ` [PATCH 10/10] ARM: tegra: Rework SOCTHERM on Tegra124 Thierry Reding
@ 2023-06-19 10:36 ` Daniel Lezcano
  2023-07-11  8:25 ` Daniel Lezcano
  11 siblings, 0 replies; 21+ messages in thread
From: Daniel Lezcano @ 2023-06-19 10:36 UTC (permalink / raw)
  To: Thierry Reding, Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra


Hi Thierry,

are you planning to send a new version ?


On 14/04/2023 14:57, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> Hi,
> 
> this set of patches removes the registration of the SOCTHERM internal
> throttling mechanism as cooling device. Since this throttling starts
> automatically once a certain temperature threshold is crossed, it
> doesn't make sense to represent it as a cooling device, which are
> typically "manually" activated by the thermal framework when thermal
> sensors report temperature thresholds being crossed.
> 
> Instead of using the cooling device mechanism, this statically programs
> the throttling mechanism when it is configured in device tree. In order
> to do this, an additional device tree property is needed to replace the
> information that was previously contained in trip points.
> 
> There's a few preparatory patches to make the removal a bit simpler and
> also some follow up cleanups included as well.
> 
> Thierry
> 
> Thierry Reding (10):
>    dt-bindings: thermal: tegra: Document throttle temperature
>    thermal: tegra: Use driver-private data consistently
>    thermal: tegra: Constify SoC-specific data
>    thermal: tegra: Do not register cooling device
>    thermal: tegra: Use unsigned int where appropriate
>    thermal: tegra: Avoid over-allocation of temporary array
>    thermal: tegra: Remove gratuitous error assignment
>    thermal: tegra: Minor stylistic cleanups
>    arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
>    ARM: tegra: Rework SOCTHERM on Tegra124
> 
>   .../thermal/nvidia,tegra124-soctherm.yaml     |   7 +
>   arch/arm/boot/dts/tegra124.dtsi               |  65 +--
>   arch/arm64/boot/dts/nvidia/tegra132.dtsi      |  63 +--
>   arch/arm64/boot/dts/nvidia/tegra210.dtsi      |  83 +---
>   drivers/thermal/tegra/soctherm.c              | 392 ++++++------------
>   drivers/thermal/tegra/soctherm.h              |   1 +
>   drivers/thermal/tegra/tegra124-soctherm.c     |   4 +
>   drivers/thermal/tegra/tegra132-soctherm.c     |   4 +
>   drivers/thermal/tegra/tegra210-soctherm.c     |   4 +
>   9 files changed, 208 insertions(+), 415 deletions(-)
> 

-- 
<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


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 00/10] thermal: tegra: Do not register cooling device
  2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
                   ` (10 preceding siblings ...)
  2023-06-19 10:36 ` [PATCH 00/10] thermal: tegra: Do not register cooling device Daniel Lezcano
@ 2023-07-11  8:25 ` Daniel Lezcano
  2023-07-11 15:42   ` Thierry Reding
  11 siblings, 1 reply; 21+ messages in thread
From: Daniel Lezcano @ 2023-07-11  8:25 UTC (permalink / raw)
  To: Thierry Reding, Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski
  Cc: Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree, linux-tegra

Hi Thierry,

do you have an update for this series?

Thanks

   -- Daniel

On 14/04/2023 14:57, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
> 
> Hi,
> 
> this set of patches removes the registration of the SOCTHERM internal
> throttling mechanism as cooling device. Since this throttling starts
> automatically once a certain temperature threshold is crossed, it
> doesn't make sense to represent it as a cooling device, which are
> typically "manually" activated by the thermal framework when thermal
> sensors report temperature thresholds being crossed.
> 
> Instead of using the cooling device mechanism, this statically programs
> the throttling mechanism when it is configured in device tree. In order
> to do this, an additional device tree property is needed to replace the
> information that was previously contained in trip points.
> 
> There's a few preparatory patches to make the removal a bit simpler and
> also some follow up cleanups included as well.
> 
> Thierry
> 
> Thierry Reding (10):
>    dt-bindings: thermal: tegra: Document throttle temperature
>    thermal: tegra: Use driver-private data consistently
>    thermal: tegra: Constify SoC-specific data
>    thermal: tegra: Do not register cooling device
>    thermal: tegra: Use unsigned int where appropriate
>    thermal: tegra: Avoid over-allocation of temporary array
>    thermal: tegra: Remove gratuitous error assignment
>    thermal: tegra: Minor stylistic cleanups
>    arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210
>    ARM: tegra: Rework SOCTHERM on Tegra124
> 
>   .../thermal/nvidia,tegra124-soctherm.yaml     |   7 +
>   arch/arm/boot/dts/tegra124.dtsi               |  65 +--
>   arch/arm64/boot/dts/nvidia/tegra132.dtsi      |  63 +--
>   arch/arm64/boot/dts/nvidia/tegra210.dtsi      |  83 +---
>   drivers/thermal/tegra/soctherm.c              | 392 ++++++------------
>   drivers/thermal/tegra/soctherm.h              |   1 +
>   drivers/thermal/tegra/tegra124-soctherm.c     |   4 +
>   drivers/thermal/tegra/tegra132-soctherm.c     |   4 +
>   drivers/thermal/tegra/tegra210-soctherm.c     |   4 +
>   9 files changed, 208 insertions(+), 415 deletions(-)
> 

-- 
<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


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 00/10] thermal: tegra: Do not register cooling device
  2023-07-11  8:25 ` Daniel Lezcano
@ 2023-07-11 15:42   ` Thierry Reding
  2023-07-12 11:01     ` Daniel Lezcano
  0 siblings, 1 reply; 21+ messages in thread
From: Thierry Reding @ 2023-07-11 15:42 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski,
	Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree,
	linux-tegra

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

On Tue, Jul 11, 2023 at 10:25:16AM +0200, Daniel Lezcano wrote:
> Hi Thierry,
> 
> do you have an update for this series?

Yeah, I've been working on this on and off for a while since I ran into
some complications with this version. I need to find a block of spare
time to go over the latest version again and do some testing. Hopefully
I can get around to that within this week or next.

Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 00/10] thermal: tegra: Do not register cooling device
  2023-07-11 15:42   ` Thierry Reding
@ 2023-07-12 11:01     ` Daniel Lezcano
  0 siblings, 0 replies; 21+ messages in thread
From: Daniel Lezcano @ 2023-07-12 11:01 UTC (permalink / raw)
  To: Thierry Reding
  Cc: Rafael J . Wysocki, Rob Herring, Krzysztof Kozlowski,
	Amit Kucheria, Zhang Rui, Jon Hunter, linux-pm, devicetree,
	linux-tegra

On 11/07/2023 17:42, Thierry Reding wrote:
> On Tue, Jul 11, 2023 at 10:25:16AM +0200, Daniel Lezcano wrote:
>> Hi Thierry,
>>
>> do you have an update for this series?
> 
> Yeah, I've been working on this on and off for a while since I ran into
> some complications with this version. I need to find a block of spare
> time to go over the latest version again and do some testing. Hopefully
> I can get around to that within this week or next.

That is great, thanks !


-- 
<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


^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2023-07-12 11:01 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-14 12:57 [PATCH 00/10] thermal: tegra: Do not register cooling device Thierry Reding
2023-04-14 12:57 ` [PATCH 01/10] dt-bindings: thermal: tegra: Document throttle temperature Thierry Reding
2023-04-14 21:47   ` Krzysztof Kozlowski
2023-04-17  8:59     ` Thierry Reding
2023-04-18 16:13       ` Krzysztof Kozlowski
2023-04-14 12:57 ` [PATCH 02/10] thermal: tegra: Use driver-private data consistently Thierry Reding
2023-04-14 12:57 ` [PATCH 03/10] thermal: tegra: Constify SoC-specific data Thierry Reding
2023-04-14 12:57 ` [PATCH 04/10] thermal: tegra: Do not register cooling device Thierry Reding
2023-04-14 12:57 ` [PATCH 05/10] thermal: tegra: Use unsigned int where appropriate Thierry Reding
2023-04-14 12:57 ` [PATCH 06/10] thermal: tegra: Avoid over-allocation of temporary array Thierry Reding
2023-04-14 12:57 ` [PATCH 07/10] thermal: tegra: Remove gratuitous error assignment Thierry Reding
2023-04-14 12:57 ` [PATCH 08/10] thermal: tegra: Minor stylistic cleanups Thierry Reding
2023-04-14 12:57 ` [PATCH 09/10] arm64: tegra: Rework SOCTHERM on Tegra132 and Tegra210 Thierry Reding
2023-04-17  8:15   ` Daniel Lezcano
2023-04-17  9:06     ` Thierry Reding
2023-04-17  9:15       ` Daniel Lezcano
2023-04-14 12:57 ` [PATCH 10/10] ARM: tegra: Rework SOCTHERM on Tegra124 Thierry Reding
2023-06-19 10:36 ` [PATCH 00/10] thermal: tegra: Do not register cooling device Daniel Lezcano
2023-07-11  8:25 ` Daniel Lezcano
2023-07-11 15:42   ` Thierry Reding
2023-07-12 11:01     ` Daniel Lezcano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).