Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f38271c authored by Javi Merino's avatar Javi Merino Committed by Eduardo Valentin
Browse files

thermal: export thermal_zone_parameters to sysfs



It's useful for tuning to be able to edit thermal_zone_parameters from
userspace.  Export them to the thermal_zone sysfs so that they can be
easily changed.

Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Eduardo Valentin <edubezval@gmail.com>
Signed-off-by: default avatarJavi Merino <javi.merino@arm.com>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 0cdf97e1
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -184,6 +184,12 @@ Thermal zone device sys I/F, created once it's registered:
    |---trip_point_[0-*]_type:	Trip point type
    |---trip_point_[0-*]_hyst:	Hysteresis value for this trip point
    |---emul_temp:		Emulated temperature set node
    |---sustainable_power:      Sustainable dissipatable power
    |---k_po:                   Proportional term during temperature overshoot
    |---k_pu:                   Proportional term during temperature undershoot
    |---k_i:                    PID's integral term in the power allocator gov
    |---k_d:                    PID's derivative term in the power allocator
    |---integral_cutoff:        Offset above which errors are accumulated

Thermal cooling device sys I/F, created once it's registered:
/sys/class/thermal/cooling_device[0-*]:
@@ -307,6 +313,52 @@ emul_temp
	  because userland can easily disable the thermal policy by simply
	  flooding this sysfs node with low temperature values.

sustainable_power
	An estimate of the sustained power that can be dissipated by
	the thermal zone. Used by the power allocator governor. For
	more information see Documentation/thermal/power_allocator.txt
	Unit: milliwatts
	RW, Optional

k_po
	The proportional term of the power allocator governor's PID
	controller during temperature overshoot. Temperature overshoot
	is when the current temperature is above the "desired
	temperature" trip point. For more information see
	Documentation/thermal/power_allocator.txt
	RW, Optional

k_pu
	The proportional term of the power allocator governor's PID
	controller during temperature undershoot. Temperature undershoot
	is when the current temperature is below the "desired
	temperature" trip point. For more information see
	Documentation/thermal/power_allocator.txt
	RW, Optional

k_i
	The integral term of the power allocator governor's PID
	controller. This term allows the PID controller to compensate
	for long term drift. For more information see
	Documentation/thermal/power_allocator.txt
	RW, Optional

k_d
	The derivative term of the power allocator governor's PID
	controller. For more information see
	Documentation/thermal/power_allocator.txt
	RW, Optional

integral_cutoff
	Temperature offset from the desired temperature trip point
	above which the integral term of the power allocator
	governor's PID controller starts accumulating errors. For
	example, if integral_cutoff is 0, then the integral term only
	accumulates error when temperature is above the desired
	temperature trip point. For more information see
	Documentation/thermal/power_allocator.txt
	RW, Optional

*****************************
* Cooling device attributes *
*****************************
+101 −0
Original line number Diff line number Diff line
@@ -875,6 +875,102 @@ emul_temp_store(struct device *dev, struct device_attribute *attr,
static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store);
#endif/*CONFIG_THERMAL_EMULATION*/

static ssize_t
sustainable_power_show(struct device *dev, struct device_attribute *devattr,
		       char *buf)
{
	struct thermal_zone_device *tz = to_thermal_zone(dev);

	if (tz->tzp)
		return sprintf(buf, "%u\n", tz->tzp->sustainable_power);
	else
		return -EIO;
}

static ssize_t
sustainable_power_store(struct device *dev, struct device_attribute *devattr,
			const char *buf, size_t count)
{
	struct thermal_zone_device *tz = to_thermal_zone(dev);
	u32 sustainable_power;

	if (!tz->tzp)
		return -EIO;

	if (kstrtou32(buf, 10, &sustainable_power))
		return -EINVAL;

	tz->tzp->sustainable_power = sustainable_power;

	return count;
}
static DEVICE_ATTR(sustainable_power, S_IWUSR | S_IRUGO, sustainable_power_show,
		sustainable_power_store);

#define create_s32_tzp_attr(name)					\
	static ssize_t							\
	name##_show(struct device *dev, struct device_attribute *devattr, \
		char *buf)						\
	{								\
	struct thermal_zone_device *tz = to_thermal_zone(dev);		\
									\
	if (tz->tzp)							\
		return sprintf(buf, "%u\n", tz->tzp->name);		\
	else								\
		return -EIO;						\
	}								\
									\
	static ssize_t							\
	name##_store(struct device *dev, struct device_attribute *devattr, \
		const char *buf, size_t count)				\
	{								\
		struct thermal_zone_device *tz = to_thermal_zone(dev);	\
		s32 value;						\
									\
		if (!tz->tzp)						\
			return -EIO;					\
									\
		if (kstrtos32(buf, 10, &value))				\
			return -EINVAL;					\
									\
		tz->tzp->name = value;					\
									\
		return count;						\
	}								\
	static DEVICE_ATTR(name, S_IWUSR | S_IRUGO, name##_show, name##_store)

create_s32_tzp_attr(k_po);
create_s32_tzp_attr(k_pu);
create_s32_tzp_attr(k_i);
create_s32_tzp_attr(k_d);
create_s32_tzp_attr(integral_cutoff);
#undef create_s32_tzp_attr

static struct device_attribute *dev_tzp_attrs[] = {
	&dev_attr_sustainable_power,
	&dev_attr_k_po,
	&dev_attr_k_pu,
	&dev_attr_k_i,
	&dev_attr_k_d,
	&dev_attr_integral_cutoff,
};

static int create_tzp_attrs(struct device *dev)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(dev_tzp_attrs); i++) {
		int ret;
		struct device_attribute *dev_attr = dev_tzp_attrs[i];

		ret = device_create_file(dev, dev_attr);
		if (ret)
			return ret;
	}

	return 0;
}

/**
 * power_actor_get_max_power() - get the maximum power that a cdev can consume
 * @cdev:	pointer to &thermal_cooling_device
@@ -1712,6 +1808,11 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
	if (result)
		goto unregister;

	/* Add thermal zone params */
	result = create_tzp_attrs(&tz->device);
	if (result)
		goto unregister;

	/* Update 'this' zone's governor information */
	mutex_lock(&thermal_governor_lock);