Message ID | 1347946506-18449-8-git-send-email-durgadoss.r@intel.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
On ?, 2012-09-18 at 11:04 +0530, Durgadoss R wrote: > This patch adds a policy sysfs attribute to a thermal zone. > This attribute denotes the throttling governor used for the > zone. This is a RW attribute. > > Signed-off-by: Durgadoss R <durgadoss.r@intel.com> > --- > drivers/thermal/thermal_sys.c | 42 ++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 39 insertions(+), 3 deletions(-) > > diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c > index a67c6c0..0948a60 100644 > --- a/drivers/thermal/thermal_sys.c > +++ b/drivers/thermal/thermal_sys.c > @@ -454,10 +454,41 @@ passive_show(struct device *dev, struct device_attribute *attr, > return sprintf(buf, "%d\n", tz->forced_passive); > } > > +static ssize_t > +policy_store(struct device *dev, struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + int ret = -EINVAL; > + struct thermal_zone_device *tz = to_thermal_zone(dev); > + struct thermal_governor *gov; > + > + mutex_lock(&thermal_governor_lock); > + > + gov = __find_governor(buf); > + if (!gov) > + goto exit; > + > + tz->governor = gov; > + ret = count; > + > +exit: > + mutex_unlock(&thermal_governor_lock); > + return ret; > +} > + > +static ssize_t > +policy_show(struct device *dev, struct device_attribute *devattr, char *buf) > +{ > + struct thermal_zone_device *tz = to_thermal_zone(dev); > + > + return sprintf(buf, "%s\n", tz->governor->name); > +} > + we should introduce an API for platform thermal drivers to switch their policy. say they may want to switch to "userspace" to disable the kernel thermal control. and policy_store should invoke that function directly. BTW, IMO, deactiving all the thermal_instances and updating the cooling devices when a thermal zone switches to "userspace" governor is reasonable. thanks, rui > static DEVICE_ATTR(type, 0444, type_show, NULL); > static DEVICE_ATTR(temp, 0444, temp_show, NULL); > static DEVICE_ATTR(mode, 0644, mode_show, mode_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); > > /* sys I/F for cooling device */ > #define to_cooling_device(_dev) \ > @@ -1512,10 +1543,14 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, > passive = 1; > } > > - if (!passive) > - result = device_create_file(&tz->device, > - &dev_attr_passive); > + if (!passive) { > + result = device_create_file(&tz->device, &dev_attr_passive); > + if (result) > + goto unregister; > + } > > + /* Create policy attribute */ > + result = device_create_file(&tz->device, &dev_attr_policy); > if (result) > goto unregister; > > @@ -1591,6 +1626,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) > device_remove_file(&tz->device, &dev_attr_temp); > if (tz->ops->get_mode) > device_remove_file(&tz->device, &dev_attr_mode); > + device_remove_file(&tz->device, &dev_attr_policy); > remove_trip_attrs(tz); > tz->governor = NULL; > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
SGkgUnVpLA0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IFpoYW5nLCBS dWkNCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1iZXIgMjEsIDIwMTIgMTozNyBQTQ0KPiBUbzogUiwg RHVyZ2Fkb3NzDQo+IENjOiBsZW5iQGtlcm5lbC5vcmc7IGxpbnV4LWFjcGlAdmdlci5rZXJuZWwu b3JnOyBlZHVhcmRvLnZhbGVudGluQHRpLmNvbQ0KPiBTdWJqZWN0OiBSZTogW1BBVENIdjQgMDcv MTVdIFRoZXJtYWw6IEFkZCBhIHBvbGljeSBzeXNmcyBhdHRyaWJ1dGUNCj4gDQo+IE9uIOS6jCwg MjAxMi0wOS0xOCBhdCAxMTowNCArMDUzMCwgRHVyZ2Fkb3NzIFIgd3JvdGU6DQo+ID4gVGhpcyBw YXRjaCBhZGRzIGEgcG9saWN5IHN5c2ZzIGF0dHJpYnV0ZSB0byBhIHRoZXJtYWwgem9uZS4NCj4g PiBUaGlzIGF0dHJpYnV0ZSBkZW5vdGVzIHRoZSB0aHJvdHRsaW5nIGdvdmVybm9yIHVzZWQgZm9y IHRoZQ0KPiA+IHpvbmUuIFRoaXMgaXMgYSBSVyBhdHRyaWJ1dGUuDQo+ID4NCj4gPiBTaWduZWQt b2ZmLWJ5OiBEdXJnYWRvc3MgUiA8ZHVyZ2Fkb3NzLnJAaW50ZWwuY29tPg0KPiA+IC0tLQ0KPiA+ ICBkcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYyB8ICAgNDINCj4gKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKystLS0NCj4gPiAgMSBmaWxlIGNoYW5nZWQsIDM5IGluc2Vy dGlvbnMoKyksIDMgZGVsZXRpb25zKC0pDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy90 aGVybWFsL3RoZXJtYWxfc3lzLmMgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYw0KPiA+ IGluZGV4IGE2N2M2YzAuLjA5NDhhNjAgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy90aGVybWFs L3RoZXJtYWxfc3lzLmMNCj4gPiArKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYw0K PiA+IEBAIC00NTQsMTAgKzQ1NCw0MSBAQCBwYXNzaXZlX3Nob3coc3RydWN0IGRldmljZSAqZGV2 LCBzdHJ1Y3QNCj4gZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwNCj4gPiAgCXJldHVybiBzcHJpbnRm KGJ1ZiwgIiVkXG4iLCB0ei0+Zm9yY2VkX3Bhc3NpdmUpOw0KPiA+ICB9DQo+ID4NCj4gPiArc3Rh dGljIHNzaXplX3QNCj4gPiArcG9saWN5X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsDQo+ID4gKwkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6 ZV90IGNvdW50KQ0KPiA+ICt7DQo+ID4gKwlpbnQgcmV0ID0gLUVJTlZBTDsNCj4gPiArCXN0cnVj dCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiA9IHRvX3RoZXJtYWxfem9uZShkZXYpOw0KPiA+ICsJ c3RydWN0IHRoZXJtYWxfZ292ZXJub3IgKmdvdjsNCj4gPiArDQo+ID4gKwltdXRleF9sb2NrKCZ0 aGVybWFsX2dvdmVybm9yX2xvY2spOw0KPiA+ICsNCj4gPiArCWdvdiA9IF9fZmluZF9nb3Zlcm5v cihidWYpOw0KPiA+ICsJaWYgKCFnb3YpDQo+ID4gKwkJZ290byBleGl0Ow0KPiA+ICsNCj4gPiAr CXR6LT5nb3Zlcm5vciA9IGdvdjsNCj4gPiArCXJldCA9IGNvdW50Ow0KPiA+ICsNCj4gPiArZXhp dDoNCj4gPiArCW11dGV4X3VubG9jaygmdGhlcm1hbF9nb3Zlcm5vcl9sb2NrKTsNCj4gPiArCXJl dHVybiByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBzc2l6ZV90DQo+ID4gK3BvbGlj eV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0 dHIsIGNoYXINCj4gKmJ1ZikNCj4gPiArew0KPiA+ICsJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZp Y2UgKnR6ID0gdG9fdGhlcm1hbF96b25lKGRldik7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHNwcmlu dGYoYnVmLCAiJXNcbiIsIHR6LT5nb3Zlcm5vci0+bmFtZSk7DQo+ID4gK30NCj4gPiArDQo+IA0K PiB3ZSBzaG91bGQgaW50cm9kdWNlIGFuIEFQSSBmb3IgcGxhdGZvcm0gdGhlcm1hbCBkcml2ZXJz IHRvIHN3aXRjaCB0aGVpcg0KPiBwb2xpY3kuDQo+IHNheSB0aGV5IG1heSB3YW50IHRvIHN3aXRj aCB0byAidXNlcnNwYWNlIiB0byBkaXNhYmxlIHRoZSBrZXJuZWwgdGhlcm1hbA0KPiBjb250cm9s Lg0KPiBhbmQgcG9saWN5X3N0b3JlIHNob3VsZCBpbnZva2UgdGhhdCBmdW5jdGlvbiBkaXJlY3Rs eS4NCg0KWWVzLCBtYWtlcyBzZW5zZSwgd2UgY2FuIGludHJvZHVjZSBhbiBFWFBPUlRfU1lNQk9M IEFQSS4NCg0KVGhhbmtzLA0KRHVyZ2ENCg0KPiBCVFcsIElNTywgZGVhY3RpdmluZyBhbGwgdGhl IHRoZXJtYWxfaW5zdGFuY2VzIGFuZCB1cGRhdGluZyB0aGUgY29vbGluZw0KPiBkZXZpY2VzIHdo ZW4gYSB0aGVybWFsIHpvbmUgc3dpdGNoZXMgdG8gInVzZXJzcGFjZSIgZ292ZXJub3IgaXMNCj4g cmVhc29uYWJsZS4NCj4gDQo+IHRoYW5rcywNCj4gcnVpDQo+ID4gIHN0YXRpYyBERVZJQ0VfQVRU Uih0eXBlLCAwNDQ0LCB0eXBlX3Nob3csIE5VTEwpOw0KPiA+ICBzdGF0aWMgREVWSUNFX0FUVFIo dGVtcCwgMDQ0NCwgdGVtcF9zaG93LCBOVUxMKTsNCj4gPiAgc3RhdGljIERFVklDRV9BVFRSKG1v ZGUsIDA2NDQsIG1vZGVfc2hvdywgbW9kZV9zdG9yZSk7DQo+ID4gIHN0YXRpYyBERVZJQ0VfQVRU UihwYXNzaXZlLCBTX0lSVUdPIHwgU19JV1VTUiwgcGFzc2l2ZV9zaG93LA0KPiBwYXNzaXZlX3N0 b3JlKTsNCj4gPiArc3RhdGljIERFVklDRV9BVFRSKHBvbGljeSwgU19JUlVHTyB8IFNfSVdVU1Is IHBvbGljeV9zaG93LA0KPiBwb2xpY3lfc3RvcmUpOw0KPiA+DQo+ID4gIC8qIHN5cyBJL0YgZm9y IGNvb2xpbmcgZGV2aWNlICovDQo+ID4gICNkZWZpbmUgdG9fY29vbGluZ19kZXZpY2UoX2RldikJ XA0KPiA+IEBAIC0xNTEyLDEwICsxNTQzLDE0IEBAIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNl DQo+ICp0aGVybWFsX3pvbmVfZGV2aWNlX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKnR5cGUsDQo+ID4g IAkJCXBhc3NpdmUgPSAxOw0KPiA+ICAJfQ0KPiA+DQo+ID4gLQlpZiAoIXBhc3NpdmUpDQo+ID4g LQkJcmVzdWx0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ0ei0+ZGV2aWNlLA0KPiA+IC0JCQkJCSAg ICAmZGV2X2F0dHJfcGFzc2l2ZSk7DQo+ID4gKwlpZiAoIXBhc3NpdmUpIHsNCj4gPiArCQlyZXN1 bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl9wYXNzaXZlKTsN Cj4gPiArCQlpZiAocmVzdWx0KQ0KPiA+ICsJCQlnb3RvIHVucmVnaXN0ZXI7DQo+ID4gKwl9DQo+ ID4NCj4gPiArCS8qIENyZWF0ZSBwb2xpY3kgYXR0cmlidXRlICovDQo+ID4gKwlyZXN1bHQgPSBk ZXZpY2VfY3JlYXRlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl9wb2xpY3kpOw0KPiA+ICAJ aWYgKHJlc3VsdCkNCj4gPiAgCQlnb3RvIHVucmVnaXN0ZXI7DQo+ID4NCj4gPiBAQCAtMTU5MSw2 ICsxNjI2LDcgQEAgdm9pZCB0aGVybWFsX3pvbmVfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0DQo+ IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQ0KPiA+ICAJZGV2aWNlX3JlbW92ZV9maWxlKCZ0ei0+ ZGV2aWNlLCAmZGV2X2F0dHJfdGVtcCk7DQo+ID4gIAlpZiAodHotPm9wcy0+Z2V0X21vZGUpDQo+ ID4gIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZ0ei0+ZGV2aWNlLCAmZGV2X2F0dHJfbW9kZSk7DQo+ ID4gKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl9wb2xpY3kpOw0K PiA+ICAJcmVtb3ZlX3RyaXBfYXR0cnModHopOw0KPiA+ICAJdHotPmdvdmVybm9yID0gTlVMTDsN Cj4gPg0KPiANCg0K -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On ?, 2012-09-21 at 02:09 -0600, R, Durgadoss wrote: > Hi Rui, > > > -----Original Message----- > > From: Zhang, Rui > > Sent: Friday, September 21, 2012 1:37 PM > > To: R, Durgadoss > > Cc: lenb@kernel.org; linux-acpi@vger.kernel.org; eduardo.valentin@ti.com > > Subject: Re: [PATCHv4 07/15] Thermal: Add a policy sysfs attribute > > > > On ?, 2012-09-18 at 11:04 +0530, Durgadoss R wrote: > > > This patch adds a policy sysfs attribute to a thermal zone. > > > This attribute denotes the throttling governor used for the > > > zone. This is a RW attribute. > > > > > > Signed-off-by: Durgadoss R <durgadoss.r@intel.com> > > > --- > > > drivers/thermal/thermal_sys.c | 42 > > ++++++++++++++++++++++++++++++++++++++--- > > > 1 file changed, 39 insertions(+), 3 deletions(-) > > > > > > diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c > > > index a67c6c0..0948a60 100644 > > > --- a/drivers/thermal/thermal_sys.c > > > +++ b/drivers/thermal/thermal_sys.c > > > @@ -454,10 +454,41 @@ passive_show(struct device *dev, struct > > device_attribute *attr, > > > return sprintf(buf, "%d\n", tz->forced_passive); > > > } > > > > > > +static ssize_t > > > +policy_store(struct device *dev, struct device_attribute *attr, > > > + const char *buf, size_t count) > > > +{ > > > + int ret = -EINVAL; > > > + struct thermal_zone_device *tz = to_thermal_zone(dev); > > > + struct thermal_governor *gov; > > > + > > > + mutex_lock(&thermal_governor_lock); > > > + > > > + gov = __find_governor(buf); > > > + if (!gov) > > > + goto exit; > > > + > > > + tz->governor = gov; > > > + ret = count; > > > + > > > +exit: > > > + mutex_unlock(&thermal_governor_lock); > > > + return ret; > > > +} > > > + > > > +static ssize_t > > > +policy_show(struct device *dev, struct device_attribute *devattr, char > > *buf) > > > +{ > > > + struct thermal_zone_device *tz = to_thermal_zone(dev); > > > + > > > + return sprintf(buf, "%s\n", tz->governor->name); > > > +} > > > + > > > > we should introduce an API for platform thermal drivers to switch their > > policy. > > say they may want to switch to "userspace" to disable the kernel thermal > > control. > > and policy_store should invoke that function directly. > > Yes, makes sense, we can introduce an EXPORT_SYMBOL API. yes, we can have an incremental path for this. thanks, rui > > Thanks, > Durga > > > BTW, IMO, deactiving all the thermal_instances and updating the cooling > > devices when a thermal zone switches to "userspace" governor is > > reasonable. > > > > thanks, > > rui > > > static DEVICE_ATTR(type, 0444, type_show, NULL); > > > static DEVICE_ATTR(temp, 0444, temp_show, NULL); > > > static DEVICE_ATTR(mode, 0644, mode_show, mode_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); > > > > > > /* sys I/F for cooling device */ > > > #define to_cooling_device(_dev) \ > > > @@ -1512,10 +1543,14 @@ struct thermal_zone_device > > *thermal_zone_device_register(const char *type, > > > passive = 1; > > > } > > > > > > - if (!passive) > > > - result = device_create_file(&tz->device, > > > - &dev_attr_passive); > > > + if (!passive) { > > > + result = device_create_file(&tz->device, &dev_attr_passive); > > > + if (result) > > > + goto unregister; > > > + } > > > > > > + /* Create policy attribute */ > > > + result = device_create_file(&tz->device, &dev_attr_policy); > > > if (result) > > > goto unregister; > > > > > > @@ -1591,6 +1626,7 @@ void thermal_zone_device_unregister(struct > > thermal_zone_device *tz) > > > device_remove_file(&tz->device, &dev_attr_temp); > > > if (tz->ops->get_mode) > > > device_remove_file(&tz->device, &dev_attr_mode); > > > + device_remove_file(&tz->device, &dev_attr_policy); > > > remove_trip_attrs(tz); > > > tz->governor = NULL; > > > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index a67c6c0..0948a60 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c @@ -454,10 +454,41 @@ passive_show(struct device *dev, struct device_attribute *attr, return sprintf(buf, "%d\n", tz->forced_passive); } +static ssize_t +policy_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret = -EINVAL; + struct thermal_zone_device *tz = to_thermal_zone(dev); + struct thermal_governor *gov; + + mutex_lock(&thermal_governor_lock); + + gov = __find_governor(buf); + if (!gov) + goto exit; + + tz->governor = gov; + ret = count; + +exit: + mutex_unlock(&thermal_governor_lock); + return ret; +} + +static ssize_t +policy_show(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct thermal_zone_device *tz = to_thermal_zone(dev); + + return sprintf(buf, "%s\n", tz->governor->name); +} + static DEVICE_ATTR(type, 0444, type_show, NULL); static DEVICE_ATTR(temp, 0444, temp_show, NULL); static DEVICE_ATTR(mode, 0644, mode_show, mode_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); /* sys I/F for cooling device */ #define to_cooling_device(_dev) \ @@ -1512,10 +1543,14 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, passive = 1; } - if (!passive) - result = device_create_file(&tz->device, - &dev_attr_passive); + if (!passive) { + result = device_create_file(&tz->device, &dev_attr_passive); + if (result) + goto unregister; + } + /* Create policy attribute */ + result = device_create_file(&tz->device, &dev_attr_policy); if (result) goto unregister; @@ -1591,6 +1626,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) device_remove_file(&tz->device, &dev_attr_temp); if (tz->ops->get_mode) device_remove_file(&tz->device, &dev_attr_mode); + device_remove_file(&tz->device, &dev_attr_policy); remove_trip_attrs(tz); tz->governor = NULL;
This patch adds a policy sysfs attribute to a thermal zone. This attribute denotes the throttling governor used for the zone. This is a RW attribute. Signed-off-by: Durgadoss R <durgadoss.r@intel.com> --- drivers/thermal/thermal_sys.c | 42 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-)