These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / linux / thermal.h
index 5eac316..e13a1ac 100644 (file)
 /* No upper/lower limit requirement */
 #define THERMAL_NO_LIMIT       ((u32)~0)
 
+/* Default weight of a bound cooling device */
+#define THERMAL_WEIGHT_DEFAULT 0
+
+/* use value, which < 0K, to indicate an invalid/uninitialized temperature */
+#define THERMAL_TEMP_INVALID   -274000
+
 /* Unit conversion macros */
-#define KELVIN_TO_CELSIUS(t)   (long)(((long)t-2732 >= 0) ?    \
-                               ((long)t-2732+5)/10 : ((long)t-2732-5)/10)
-#define CELSIUS_TO_KELVIN(t)   ((t)*10+2732)
+#define DECI_KELVIN_TO_CELSIUS(t)      ({                      \
+       long _t = (t);                                          \
+       ((_t-2732 >= 0) ? (_t-2732+5)/10 : (_t-2732-5)/10);     \
+})
+#define CELSIUS_TO_DECI_KELVIN(t)      ((t)*10+2732)
 #define DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, off) (((t) - (off)) * 100)
 #define DECI_KELVIN_TO_MILLICELSIUS(t) DECI_KELVIN_TO_MILLICELSIUS_WITH_OFFSET(t, 2732)
 #define MILLICELSIUS_TO_DECI_KELVIN_WITH_OFFSET(t, off) (((t) / 100) + (off))
 #define DEFAULT_THERMAL_GOVERNOR       "fair_share"
 #elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
 #define DEFAULT_THERMAL_GOVERNOR       "user_space"
+#elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
+#define DEFAULT_THERMAL_GOVERNOR       "power_allocator"
 #endif
 
 struct thermal_zone_device;
 struct thermal_cooling_device;
+struct thermal_instance;
 
 enum thermal_device_mode {
        THERMAL_DEVICE_DISABLED = 0,
@@ -86,23 +97,19 @@ struct thermal_zone_device_ops {
                     struct thermal_cooling_device *);
        int (*unbind) (struct thermal_zone_device *,
                       struct thermal_cooling_device *);
-       int (*get_temp) (struct thermal_zone_device *, unsigned long *);
+       int (*get_temp) (struct thermal_zone_device *, int *);
        int (*get_mode) (struct thermal_zone_device *,
                         enum thermal_device_mode *);
        int (*set_mode) (struct thermal_zone_device *,
                enum thermal_device_mode);
        int (*get_trip_type) (struct thermal_zone_device *, int,
                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_trip_hyst) (struct thermal_zone_device *, int,
-                             unsigned long *);
-       int (*set_trip_hyst) (struct thermal_zone_device *, int,
-                             unsigned long);
-       int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
-       int (*set_emul_temp) (struct thermal_zone_device *, unsigned long);
+       int (*get_trip_temp) (struct thermal_zone_device *, int, int *);
+       int (*set_trip_temp) (struct thermal_zone_device *, int, int);
+       int (*get_trip_hyst) (struct thermal_zone_device *, int, int *);
+       int (*set_trip_hyst) (struct thermal_zone_device *, int, int);
+       int (*get_crit_temp) (struct thermal_zone_device *, int *);
+       int (*set_emul_temp) (struct thermal_zone_device *, int);
        int (*get_trend) (struct thermal_zone_device *, int,
                          enum thermal_trend *);
        int (*notify) (struct thermal_zone_device *, int,
@@ -113,6 +120,12 @@ struct thermal_cooling_device_ops {
        int (*get_max_state) (struct thermal_cooling_device *, unsigned long *);
        int (*get_cur_state) (struct thermal_cooling_device *, unsigned long *);
        int (*set_cur_state) (struct thermal_cooling_device *, unsigned long);
+       int (*get_requested_power)(struct thermal_cooling_device *,
+                                  struct thermal_zone_device *, u32 *);
+       int (*state2power)(struct thermal_cooling_device *,
+                          struct thermal_zone_device *, unsigned long, u32 *);
+       int (*power2state)(struct thermal_cooling_device *,
+                          struct thermal_zone_device *, u32, unsigned long *);
 };
 
 struct thermal_cooling_device {
@@ -144,8 +157,7 @@ struct thermal_attr {
  * @devdata:   private pointer for device private data
  * @trips:     number of trip points the thermal zone supports
  * @passive_delay:     number of milliseconds to wait between polls when
- *                     performing passive cooling.  Currenty only used by the
- *                     step-wise governor
+ *                     performing passive cooling.
  * @polling_delay:     number of milliseconds to wait between polls when
  *                     checking whether trip points have been crossed (0 for
  *                     interrupt driven systems)
@@ -155,13 +167,14 @@ struct thermal_attr {
  * @last_temperature:  previous temperature read
  * @emul_temperature:  emulated temperature when using CONFIG_THERMAL_EMULATION
  * @passive:           1 if you've crossed a passive trip point, 0 otherwise.
- *                     Currenty only used by the step-wise governor.
  * @forced_passive:    If > 0, temperature at which to switch on all ACPI
  *                     processor cooling devices.  Currently only used by the
  *                     step-wise governor.
+ * @need_update:       if equals 1, thermal_zone_device_update needs to be invoked.
  * @ops:       operations this &thermal_zone_device supports
  * @tzp:       thermal zone parameters
  * @governor:  pointer to the governor for this thermal zone
+ * @governor_data:     private pointer for governor data
  * @thermal_instances: list of &struct thermal_instance of this thermal zone
  * @idr:       &struct idr to generate unique id for this zone's cooling
  *             devices
@@ -185,9 +198,11 @@ struct thermal_zone_device {
        int emul_temperature;
        int passive;
        unsigned int forced_passive;
+       atomic_t need_update;
        struct thermal_zone_device_ops *ops;
-       const struct thermal_zone_params *tzp;
+       struct thermal_zone_params *tzp;
        struct thermal_governor *governor;
+       void *governor_data;
        struct list_head thermal_instances;
        struct idr idr;
        struct mutex lock;
@@ -198,12 +213,19 @@ struct thermal_zone_device {
 /**
  * struct thermal_governor - structure that holds thermal governor information
  * @name:      name of the governor
+ * @bind_to_tz: callback called when binding to a thermal zone.  If it
+ *             returns 0, the governor is bound to the thermal zone,
+ *             otherwise it fails.
+ * @unbind_from_tz:    callback called when a governor is unbound from a
+ *                     thermal zone.
  * @throttle:  callback called for every trip point even if temperature is
  *             below the trip point temperature
  * @governor_list:     node in thermal_governor_list (in thermal_core.c)
  */
 struct thermal_governor {
        char name[THERMAL_NAME_LENGTH];
+       int (*bind_to_tz)(struct thermal_zone_device *tz);
+       void (*unbind_from_tz)(struct thermal_zone_device *tz);
        int (*throttle)(struct thermal_zone_device *tz, int trip);
        struct list_head        governor_list;
 };
@@ -214,9 +236,12 @@ struct thermal_bind_params {
 
        /*
         * This is a measure of 'how effectively these devices can
-        * cool 'this' thermal zone. The shall be determined by platform
-        * characterization. This is on a 'percentage' scale.
-        * See Documentation/thermal/sysfs-api.txt for more information.
+        * cool 'this' thermal zone. It shall be determined by
+        * platform characterization. This value is relative to the
+        * rest of the weights so a cooling device whose weight is
+        * double that of another cooling device is twice as
+        * effective. See Documentation/thermal/sysfs-api.txt for more
+        * information.
         */
        int weight;
 
@@ -253,6 +278,44 @@ struct thermal_zone_params {
 
        int num_tbps;   /* Number of tbp entries */
        struct thermal_bind_params *tbp;
+
+       /*
+        * Sustainable power (heat) that this thermal zone can dissipate in
+        * mW
+        */
+       u32 sustainable_power;
+
+       /*
+        * Proportional parameter of the PID controller when
+        * overshooting (i.e., when temperature is below the target)
+        */
+       s32 k_po;
+
+       /*
+        * Proportional parameter of the PID controller when
+        * undershooting
+        */
+       s32 k_pu;
+
+       /* Integral parameter of the PID controller */
+       s32 k_i;
+
+       /* Derivative parameter of the PID controller */
+       s32 k_d;
+
+       /* threshold below which the error is no longer accumulated */
+       s32 integral_cutoff;
+
+       /*
+        * @slope:      slope of a linear temperature adjustment curve.
+        *              Used by thermal zone drivers.
+        */
+       int slope;
+       /*
+        * @offset:     offset of a linear temperature adjustment curve.
+        *              Used by thermal zone drivers (default 0).
+        */
+       int offset;
 };
 
 struct thermal_genl_event {
@@ -272,9 +335,9 @@ struct thermal_genl_event {
  *                temperature.
  */
 struct thermal_zone_of_device_ops {
-       int (*get_temp)(void *, long *);
+       int (*get_temp)(void *, int *);
        int (*get_trend)(void *, long *);
-       int (*set_emul_temp)(void *, unsigned long);
+       int (*set_emul_temp)(void *, int);
 };
 
 /**
@@ -304,7 +367,7 @@ static inline struct thermal_zone_device *
 thermal_zone_of_sensor_register(struct device *dev, int id, void *data,
                                const struct thermal_zone_of_device_ops *ops)
 {
-       return NULL;
+       return ERR_PTR(-ENODEV);
 }
 
 static inline
@@ -316,14 +379,27 @@ void thermal_zone_of_sensor_unregister(struct device *dev,
 #endif
 
 #if IS_ENABLED(CONFIG_THERMAL)
+static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
+{
+       return cdev->ops->get_requested_power && cdev->ops->state2power &&
+               cdev->ops->power2state;
+}
+
+int power_actor_get_max_power(struct thermal_cooling_device *,
+                             struct thermal_zone_device *tz, u32 *max_power);
+int power_actor_get_min_power(struct thermal_cooling_device *,
+                             struct thermal_zone_device *tz, u32 *min_power);
+int power_actor_set_power(struct thermal_cooling_device *,
+                         struct thermal_instance *, u32);
 struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
                void *, struct thermal_zone_device_ops *,
-               const struct thermal_zone_params *, int, int);
+               struct thermal_zone_params *, int, int);
 void thermal_zone_device_unregister(struct thermal_zone_device *);
 
 int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
                                     struct thermal_cooling_device *,
-                                    unsigned long, unsigned long);
+                                    unsigned long, unsigned long,
+                                    unsigned int);
 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
                                       struct thermal_cooling_device *);
 void thermal_zone_device_update(struct thermal_zone_device *);
@@ -335,7 +411,7 @@ thermal_of_cooling_device_register(struct device_node *np, char *, void *,
                                   const struct thermal_cooling_device_ops *);
 void thermal_cooling_device_unregister(struct thermal_cooling_device *);
 struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
-int thermal_zone_get_temp(struct thermal_zone_device *tz, unsigned long *temp);
+int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
 
 int get_tz_trend(struct thermal_zone_device *, int);
 struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
@@ -343,6 +419,18 @@ struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
 void thermal_cdev_update(struct thermal_cooling_device *);
 void thermal_notify_framework(struct thermal_zone_device *, int);
 #else
+static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
+{ return false; }
+static inline int power_actor_get_max_power(struct thermal_cooling_device *cdev,
+                             struct thermal_zone_device *tz, u32 *max_power)
+{ return 0; }
+static inline int power_actor_get_min_power(struct thermal_cooling_device *cdev,
+                                           struct thermal_zone_device *tz,
+                                           u32 *min_power)
+{ return -ENODEV; }
+static inline int power_actor_set_power(struct thermal_cooling_device *cdev,
+                         struct thermal_instance *tz, u32 power)
+{ return 0; }
 static inline struct thermal_zone_device *thermal_zone_device_register(
        const char *type, int trips, int mask, void *devdata,
        struct thermal_zone_device_ops *ops,
@@ -355,7 +443,8 @@ static inline void thermal_zone_device_unregister(
 static inline int thermal_zone_bind_cooling_device(
        struct thermal_zone_device *tz, int trip,
        struct thermal_cooling_device *cdev,
-       unsigned long upper, unsigned long lower)
+       unsigned long upper, unsigned long lower,
+       unsigned int weight)
 { return -ENODEV; }
 static inline int thermal_zone_unbind_cooling_device(
        struct thermal_zone_device *tz, int trip,
@@ -378,7 +467,7 @@ static inline struct thermal_zone_device *thermal_zone_get_zone_by_name(
                const char *name)
 { return ERR_PTR(-ENODEV); }
 static inline int thermal_zone_get_temp(
-               struct thermal_zone_device *tz, unsigned long *temp)
+               struct thermal_zone_device *tz, int *temp)
 { return -ENODEV; }
 static inline int get_tz_trend(struct thermal_zone_device *tz, int trip)
 { return -ENODEV; }