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

Commit 25a0a5ce authored by Ni Wade's avatar Ni Wade Committed by Zhang Rui
Browse files

thermal: add available policies sysfs attribute



The Linux thermal framework support to change thermal governor
policy in userspace, but it can't show what available policies
supported.

This patch adds available_policies attribute to the thermal
framework, it can list the thermal governors which can be
used for a particular zone. This attribute is read only.

Signed-off-by: default avatarWei Ni <wni@nvidia.com>
Reviewed-by: default avatarJavi Merino <javi.merino@arm.com>
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
parent 74d33293
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -180,6 +180,7 @@ Thermal zone device sys I/F, created once it's registered:
    |---temp:			Current temperature
    |---temp:			Current temperature
    |---mode:			Working mode of the thermal zone
    |---mode:			Working mode of the thermal zone
    |---policy:			Thermal governor used for this zone
    |---policy:			Thermal governor used for this zone
    |---available_policies:	Available thermal governors for this zone
    |---trip_point_[0-*]_temp:	Trip point temperature
    |---trip_point_[0-*]_temp:	Trip point temperature
    |---trip_point_[0-*]_type:	Trip point type
    |---trip_point_[0-*]_type:	Trip point type
    |---trip_point_[0-*]_hyst:	Hysteresis value for this trip point
    |---trip_point_[0-*]_hyst:	Hysteresis value for this trip point
@@ -256,6 +257,10 @@ policy
	One of the various thermal governors used for a particular zone.
	One of the various thermal governors used for a particular zone.
	RW, Required
	RW, Required


available_policies
	Available thermal governors which can be used for a particular zone.
	RO, Required

trip_point_[0-*]_temp
trip_point_[0-*]_temp
	The temperature above which trip point will be fired.
	The temperature above which trip point will be fired.
	Unit: millidegree Celsius
	Unit: millidegree Celsius
@@ -417,6 +422,7 @@ method, the sys I/F structure will be built like this:
    |---temp:			37000
    |---temp:			37000
    |---mode:			enabled
    |---mode:			enabled
    |---policy:			step_wise
    |---policy:			step_wise
    |---available_policies:	step_wise fair_share
    |---trip_point_0_temp:	100000
    |---trip_point_0_temp:	100000
    |---trip_point_0_type:	critical
    |---trip_point_0_type:	critical
    |---trip_point_1_temp:	80000
    |---trip_point_1_temp:	80000
+28 −0
Original line number Original line Diff line number Diff line
@@ -847,6 +847,27 @@ policy_show(struct device *dev, struct device_attribute *devattr, char *buf)
	return sprintf(buf, "%s\n", tz->governor->name);
	return sprintf(buf, "%s\n", tz->governor->name);
}
}


static ssize_t
available_policies_show(struct device *dev, struct device_attribute *devattr,
			char *buf)
{
	struct thermal_governor *pos;
	ssize_t count = 0;
	ssize_t size = PAGE_SIZE;

	mutex_lock(&thermal_governor_lock);

	list_for_each_entry(pos, &thermal_governor_list, governor_list) {
		size = PAGE_SIZE - count;
		count += scnprintf(buf + count, size, "%s ", pos->name);
	}
	count += scnprintf(buf + count, size, "\n");

	mutex_unlock(&thermal_governor_lock);

	return count;
}

#ifdef CONFIG_THERMAL_EMULATION
#ifdef CONFIG_THERMAL_EMULATION
static ssize_t
static ssize_t
emul_temp_store(struct device *dev, struct device_attribute *attr,
emul_temp_store(struct device *dev, struct device_attribute *attr,
@@ -1032,6 +1053,7 @@ static DEVICE_ATTR(temp, 0444, temp_show, NULL);
static DEVICE_ATTR(mode, 0644, mode_show, mode_store);
static DEVICE_ATTR(mode, 0644, mode_show, mode_store);
static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store);
static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store);
static DEVICE_ATTR(policy, S_IRUGO | S_IWUSR, policy_show, policy_store);
static DEVICE_ATTR(policy, S_IRUGO | S_IWUSR, policy_show, policy_store);
static DEVICE_ATTR(available_policies, S_IRUGO, available_policies_show, NULL);


/* sys I/F for cooling device */
/* sys I/F for cooling device */
#define to_cooling_device(_dev)	\
#define to_cooling_device(_dev)	\
@@ -1817,6 +1839,11 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
	if (result)
	if (result)
		goto unregister;
		goto unregister;


	/* Create available_policies attribute */
	result = device_create_file(&tz->device, &dev_attr_available_policies);
	if (result)
		goto unregister;

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


@@ -1917,6 +1944,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
	if (tz->ops->get_mode)
	if (tz->ops->get_mode)
		device_remove_file(&tz->device, &dev_attr_mode);
		device_remove_file(&tz->device, &dev_attr_mode);
	device_remove_file(&tz->device, &dev_attr_policy);
	device_remove_file(&tz->device, &dev_attr_policy);
	device_remove_file(&tz->device, &dev_attr_available_policies);
	remove_trip_attrs(tz);
	remove_trip_attrs(tz);
	thermal_set_governor(tz, NULL);
	thermal_set_governor(tz, NULL);