Re: [PATCH] ACPI-Thermal: Make Thermal trip points writeable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sorry, I just read Durgadoss last comment.  Please ignore mine.

On Fri, Apr 6, 2012 at 8:01 AM, Rob Lee <rob.lee@xxxxxxxxxx> wrote:
> On Thu, Apr 5, 2012 at 12:52 AM, Amit Daniel Kachhap
> <amit.kachhap@xxxxxxxxxx> wrote:
>> Hi Durgadoss,
>>
>> Instead of making all the trip-points of a thermal zone writeable we should
>> only allow non-critical trip points to be writeable.
>>
>> Thanks,
>> Amit Daniel
>>
>
> Agree, or even better, could the writeable attribute be made an
> optional for any trip point?
>
> Many SoCs now have built in thermal sensing and for cost reasons some
> device makers may want to rely on the kernel thermal handling
> capabilities as their primary thermal protection.  Allowing userspace
> to modify the trip points may increase their risk/exposure to lawsuits
> or other undesirable results in some cases.
>
> Best Regards,
> Rob
>
>>> -----Original Message-----
>>> From: Durgadoss R <durgadoss.r@xxxxxxxxx>
>>> Sent: Friday, January 27, 2012 9:58 PM
>>> To: linux-acpi@xxxxxxxxxxxxxxx
>>> Cc: lenb@xxxxxxxxxx; rui.zhang@xxxxxxxxx; durgadoss.r@xxxxxxxxx
>>> Subject: [PATCH] ACPI-Thermal: Make Thermal trip points writeable
>>
>>>Some of the thermal drivers using the Generic Thermal Framework
>>>require (all/some) trip points to be writeable. This patch makes
>>>the trip point temperatures writeable on a per-trip point basis,
>>>and modifies the required function call in thermal.c. This patch
>>>also updates the Documentation to reflect the new change.
>>>
>>>Signed-off-by: Durgadoss R <durgadoss.r@xxxxxxxxx>
>>>---
>>>v1
>>>* patch1/2: Code for making trip points writeable
>>>* patch2/2: Change the callee in thermal.c
>>>v2
>>>* Make both the changes in a single patch
>>>* Update Documentation/thermal/sysfs-api.txt
>>>---
>>> Documentation/thermal/sysfs-api.txt |    4 +-
>>> drivers/acpi/thermal.c              |    4 +-
>>> drivers/thermal/thermal_sys.c       |  127 ++++++++++++++++++++++-------------
>>> include/linux/thermal.h             |   10 ++-
>>> 4 files changed, 91 insertions(+), 54 deletions(-)
>>>
>>>diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt
>>>index b61e46f..cd1476c 100644
>>>--- a/Documentation/thermal/sysfs-api.txt
>>>+++ b/Documentation/thermal/sysfs-api.txt
>>>@@ -32,7 +32,8 @@ temperature) and throttle appropriate devices.
>>>
>>> 1.1 thermal zone device interface
>>> 1.1.1 struct thermal_zone_device *thermal_zone_device_register(char *name,
>>>-              int trips, void *devdata, struct thermal_zone_device_ops *ops)
>>>+              int trips, int flag, void *devdata,
>>>+              struct thermal_zone_device_ops *ops)
>>>
>>>     This interface function adds a new thermal zone device (sensor) to
>>>     /sys/class/thermal folder as thermal_zone[0-*]. It tries to bind all the
>>>@@ -40,6 +41,7 @@ temperature) and throttle appropriate devices.
>>>
>>>     name: the thermal zone name.
>>>     trips: the total number of trip points this thermal zone supports.
>>>+    flag: Bit string: If 'n'th bit is set, then trip point 'n' is writeable.
>>>     devdata: device private data
>>>     ops: thermal zone device call-backs.
>>>       .bind: bind the thermal zone device with a thermal cooling device.
>>>diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
>>>index 48fbc64..1c3133e 100644
>>>--- a/drivers/acpi/thermal.c
>>>+++ b/drivers/acpi/thermal.c
>>>@@ -845,7 +845,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
>>>
>>>       if (tz->trips.passive.flags.valid)
>>>               tz->thermal_zone =
>>>-                      thermal_zone_device_register("acpitz", trips, tz,
>>>+                      thermal_zone_device_register("acpitz", trips, 0, tz,
>>>                                                    &acpi_thermal_zone_ops,
>>>                                                    tz->trips.passive.tc1,
>>>                                                    tz->trips.passive.tc2,
>>>@@ -853,7 +853,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
>>>                                                    tz->polling_frequency*100);
>>>       else
>>>               tz->thermal_zone =
>>>-                      thermal_zone_device_register("acpitz", trips, tz,
>>>+                      thermal_zone_device_register("acpitz", trips, 0, tz,
>>>                                                    &acpi_thermal_zone_ops,
>>>                                                    0, 0, 0,
>>>                                                    tz->polling_frequency*100);
>>>diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
>>>index dd9a574..3a4341e 100644
>>>--- a/drivers/thermal/thermal_sys.c
>>>+++ b/drivers/thermal/thermal_sys.c
>>>@@ -220,6 +220,28 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr,
>>> }
>>>
>>> static ssize_t
>>>+trip_point_temp_store(struct device *dev, struct device_attribute *attr,
>>>+                   const char *buf, size_t count)
>>>+{
>>>+      struct thermal_zone_device *tz = to_thermal_zone(dev);
>>>+      int trip, ret;
>>>+      unsigned long temperature;
>>>+
>>>+      if (!tz->ops->set_trip_temp)
>>>+              return -EPERM;
>>>+
>>>+      if (!sscanf(attr->attr.name, "trip_point_%d_temp", &trip))
>>>+              return -EINVAL;
>>>+
>>>+      if (kstrtoul(buf, 10, &temperature))
>>>+              return -EINVAL;
>>>+
>>>+      ret = tz->ops->set_trip_temp(tz, trip, temperature);
>>>+
>>>+      return ret ? ret : count;
>>>+}
>>>+
>>>+static ssize_t
>>> passive_store(struct device *dev, struct device_attribute *attr,
>>>                   const char *buf, size_t count)
>>> {
>>>@@ -286,49 +308,6 @@ static DEVICE_ATTR(mode, 0644, mode_show, mode_store);
>>> static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, \
>>>                  passive_store);
>>>
>>>-static struct device_attribute trip_point_attrs[] = {
>>>-      __ATTR(trip_point_0_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_0_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_1_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_1_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_2_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_2_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_3_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_3_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_4_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_4_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_5_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_5_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_6_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_6_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_7_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_7_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_8_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_8_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_9_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_9_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_10_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_10_temp, 0444, trip_point_temp_show, NULL),
>>>-      __ATTR(trip_point_11_type, 0444, trip_point_type_show, NULL),
>>>-      __ATTR(trip_point_11_temp, 0444, trip_point_temp_show, NULL),
>>>-};
>>>-
>>>-#define TRIP_POINT_ATTR_ADD(_dev, _index, result)     \
>>>-do {    \
>>>-      result = device_create_file(_dev,       \
>>>-                              &trip_point_attrs[_index * 2]); \
>>>-      if (result)     \
>>>-              break;  \
>>>-      result = device_create_file(_dev,       \
>>>-                      &trip_point_attrs[_index * 2 + 1]);     \
>>>-} while (0)
>>>-
>>>-#define TRIP_POINT_ATTR_REMOVE(_dev, _index)  \
>>>-do {  \
>>>-      device_remove_file(_dev, &trip_point_attrs[_index * 2]);        \
>>>-      device_remove_file(_dev, &trip_point_attrs[_index * 2 + 1]);    \
>>>-} while (0)
>>>-
>>> /* sys I/F for cooling device */
>>> #define to_cooling_device(_dev)       \
>>>       container_of(_dev, struct thermal_cooling_device, device)
>>>@@ -1112,9 +1091,54 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
>>> EXPORT_SYMBOL(thermal_zone_device_update);
>>>
>>> /**
>>>+ * create_trip_type_attr - creates a trip point type attribute
>>>+ * @tz:               the thermal zone device
>>>+ * @indx:     index into the trip_type_attrs array
>>>+ */
>>>+static int create_trip_type_attr(struct thermal_zone_device *tz, int indx)
>>>+{
>>>+      char attr_name[THERMAL_NAME_LENGTH];
>>>+
>>>+      snprintf(attr_name, THERMAL_NAME_LENGTH, "trip_point_%d_type", indx);
>>>+
>>>+      sysfs_attr_init(&tz->trip_type_attrs[indx].attr);
>>>+      tz->trip_type_attrs[indx].attr.name = attr_name;
>>>+      tz->trip_type_attrs[indx].attr.mode = S_IRUGO;
>>>+      tz->trip_type_attrs[indx].show = trip_point_type_show;
>>>+
>>>+      return device_create_file(&tz->device, &tz->trip_type_attrs[indx]);
>>>+}
>>>+
>>>+/**
>>>+ * create_trip_temp_attr - creates a trip point temp attribute
>>>+ * @tz:               the thermal zone device
>>>+ * @indx:     index into the trip_type_attrs array
>>>+ * @writeable:        A flag: If 1, 'this' trip point is writeable; otherwise not
>>>+ */
>>>+static int create_trip_temp_attr(struct thermal_zone_device *tz,
>>>+                              int indx, int writeable)
>>>+{
>>>+      char attr_name[THERMAL_NAME_LENGTH];
>>>+
>>>+      snprintf(attr_name, THERMAL_NAME_LENGTH, "trip_point_%d_temp", indx);
>>>+
>>>+      sysfs_attr_init(&tz->trip_temp_attrs[indx].attr);
>>>+      tz->trip_temp_attrs[indx].attr.name = attr_name;
>>>+      tz->trip_temp_attrs[indx].attr.mode = S_IRUGO;
>>>+      tz->trip_temp_attrs[indx].show = trip_point_temp_show;
>>>+      if (writeable) {
>>>+              tz->trip_temp_attrs[indx].attr.mode |= S_IWUSR;
>>>+              tz->trip_temp_attrs[indx].store = trip_point_temp_store;
>>>+      }
>>>+
>>>+      return device_create_file(&tz->device, &tz->trip_temp_attrs[indx]);
>>>+}
>>>+
>>>+/**
>>>  * thermal_zone_device_register - register a new thermal zone device
>>>  * @type:     the thermal zone device type
>>>  * @trips:    the number of trip points the thermal zone support
>>>+ * @flag:     a bit string indicating the writeablility of trip points
>>>  * @devdata:  private device data
>>>  * @ops:      standard thermal zone device callbacks
>>>  * @tc1:      thermal coefficient 1 for passive calculations
>>>@@ -1130,7 +1154,7 @@ EXPORT_SYMBOL(thermal_zone_device_update);
>>>  * section 11.1.5.1 of the ACPI specification 3.0.
>>>  */
>>> struct thermal_zone_device *thermal_zone_device_register(char *type,
>>>-      int trips, void *devdata,
>>>+      int trips, int flag, void *devdata,
>>>       const struct thermal_zone_device_ops *ops,
>>>       int tc1, int tc2, int passive_delay, int polling_delay)
>>> {
>>>@@ -1199,9 +1223,15 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
>>>       }
>>>
>>>       for (count = 0; count < trips; count++) {
>>>-              TRIP_POINT_ATTR_ADD(&tz->device, count, result);
>>>+              result = create_trip_type_attr(tz, count);
>>>               if (result)
>>>                       goto unregister;
>>>+
>>>+              result = create_trip_temp_attr(tz, count,
>>>+                                              (flag & (1 << count)));
>>>+              if (result)
>>>+                      goto unregister;
>>>+
>>>               tz->ops->get_trip_type(tz, count, &trip_type);
>>>               if (trip_type == THERMAL_TRIP_PASSIVE)
>>>                       passive = 1;
>>>@@ -1279,9 +1309,10 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
>>>       if (tz->ops->get_mode)
>>>               device_remove_file(&tz->device, &dev_attr_mode);
>>>
>>>-      for (count = 0; count < tz->trips; count++)
>>>-              TRIP_POINT_ATTR_REMOVE(&tz->device, count);
>>>-
>>>+      for (count = 0; count < tz->trips; count++) {
>>>+              device_remove_file(&tz->device, &tz->trip_type_attrs[count]);
>>>+              device_remove_file(&tz->device, &tz->trip_temp_attrs[count]);
>>>+      }
>>>       thermal_remove_hwmon_sysfs(tz);
>>>       release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
>>>       idr_destroy(&tz->idr);
>>>diff --git a/include/linux/thermal.h b/include/linux/thermal.h
>>>index 47b4a27..4aa5a45 100644
>>>--- a/include/linux/thermal.h
>>>+++ b/include/linux/thermal.h
>>>@@ -58,6 +58,8 @@ struct thermal_zone_device_ops {
>>>               enum thermal_trip_type *);
>>>       int (*get_trip_temp) (struct thermal_zone_device *, int,
>>>                             unsigned long *);
>>>+      int (*set_trip_temp) (struct thermal_zone_device *, int,
>>>+                            unsigned long);
>>>       int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
>>>       int (*notify) (struct thermal_zone_device *, int,
>>>                      enum thermal_trip_type);
>>>@@ -89,6 +91,8 @@ struct thermal_zone_device {
>>>       int id;
>>>       char type[THERMAL_NAME_LENGTH];
>>>       struct device device;
>>>+      struct device_attribute trip_temp_attrs[THERMAL_MAX_TRIPS];
>>>+      struct device_attribute trip_type_attrs[THERMAL_MAX_TRIPS];
>>>       void *devdata;
>>>       int trips;
>>>       int tc1;
>>>@@ -137,9 +141,9 @@ enum {
>>> };
>>> #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
>>>
>>>-struct thermal_zone_device *thermal_zone_device_register(char *, int, void *,
>>>-              const struct thermal_zone_device_ops *, int tc1, int tc2,
>>>-              int passive_freq, int polling_freq);
>>>+struct thermal_zone_device *thermal_zone_device_register(char *, int, int,
>>>+              void *, const struct thermal_zone_device_ops *, int tc1,
>>>+              int tc2, int passive_freq, int polling_freq);
>>> void thermal_zone_device_unregister(struct thermal_zone_device *);
>>>
>>> int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
>>>--
>>>1.7.1
>>>
>>
>> _______________________________________________
>> linaro-dev mailing list
>> linaro-dev@xxxxxxxxxxxxxxxx
>> http://lists.linaro.org/mailman/listinfo/linaro-dev
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux