17e3c0381SLina Iyer /* SPDX-License-Identifier: GPL-2.0 */
271350db4SDurgadoss R /*
371350db4SDurgadoss R * thermal_core.h
471350db4SDurgadoss R *
571350db4SDurgadoss R * Copyright (C) 2012 Intel Corp
671350db4SDurgadoss R * Author: Durgadoss R <durgadoss.r@intel.com>
771350db4SDurgadoss R */
871350db4SDurgadoss R
971350db4SDurgadoss R #ifndef __THERMAL_CORE_H__
1071350db4SDurgadoss R #define __THERMAL_CORE_H__
1171350db4SDurgadoss R
1271350db4SDurgadoss R #include <linux/device.h>
1371350db4SDurgadoss R #include <linux/thermal.h>
1471350db4SDurgadoss R
155b8583d3SDaniel Lezcano #include "thermal_netlink.h"
165b8583d3SDaniel Lezcano
178097db40SDaniel Lezcano /* Default Thermal Governor */
188097db40SDaniel Lezcano #if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
198097db40SDaniel Lezcano #define DEFAULT_THERMAL_GOVERNOR "step_wise"
208097db40SDaniel Lezcano #elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
218097db40SDaniel Lezcano #define DEFAULT_THERMAL_GOVERNOR "fair_share"
228097db40SDaniel Lezcano #elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
238097db40SDaniel Lezcano #define DEFAULT_THERMAL_GOVERNOR "user_space"
248097db40SDaniel Lezcano #elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
258097db40SDaniel Lezcano #define DEFAULT_THERMAL_GOVERNOR "power_allocator"
2604bf1fe4SThierry Reding #elif defined(CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG)
2704bf1fe4SThierry Reding #define DEFAULT_THERMAL_GOVERNOR "bang_bang"
288097db40SDaniel Lezcano #endif
298097db40SDaniel Lezcano
3071350db4SDurgadoss R /* Initial state of a cooling device during binding */
3171350db4SDurgadoss R #define THERMAL_NO_TARGET -1UL
3271350db4SDurgadoss R
33980af75eSDaniel Lezcano /* Init section thermal table */
34980af75eSDaniel Lezcano extern struct thermal_governor *__governor_thermal_table[];
35980af75eSDaniel Lezcano extern struct thermal_governor *__governor_thermal_table_end[];
36980af75eSDaniel Lezcano
37980af75eSDaniel Lezcano #define THERMAL_TABLE_ENTRY(table, name) \
38980af75eSDaniel Lezcano static typeof(name) *__thermal_table_entry_##name \
3933def849SJoe Perches __used __section("__" #table "_thermal_table") = &name
40980af75eSDaniel Lezcano
41980af75eSDaniel Lezcano #define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY(governor, name)
42980af75eSDaniel Lezcano
43980af75eSDaniel Lezcano #define for_each_governor_table(__governor) \
44980af75eSDaniel Lezcano for (__governor = __governor_thermal_table; \
45980af75eSDaniel Lezcano __governor < __governor_thermal_table_end; \
46980af75eSDaniel Lezcano __governor++)
47980af75eSDaniel Lezcano
483d44a509SDaniel Lezcano int for_each_thermal_zone(int (*cb)(struct thermal_zone_device *, void *),
493d44a509SDaniel Lezcano void *);
503d44a509SDaniel Lezcano
513d44a509SDaniel Lezcano int for_each_thermal_cooling_device(int (*cb)(struct thermal_cooling_device *,
523d44a509SDaniel Lezcano void *), void *);
533d44a509SDaniel Lezcano
543d44a509SDaniel Lezcano int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *),
553d44a509SDaniel Lezcano void *thermal_governor);
563d44a509SDaniel Lezcano
57329b064fSDaniel Lezcano struct thermal_zone_device *thermal_zone_get_by_id(int id);
58329b064fSDaniel Lezcano
59c68df440SDaniel Lezcano struct thermal_attr {
60c68df440SDaniel Lezcano struct device_attribute attr;
61c68df440SDaniel Lezcano char name[THERMAL_NAME_LENGTH];
62c68df440SDaniel Lezcano };
63c68df440SDaniel Lezcano
cdev_is_power_actor(struct thermal_cooling_device * cdev)6433a88af1SDaniel Lezcano static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
6533a88af1SDaniel Lezcano {
6633a88af1SDaniel Lezcano return cdev->ops->get_requested_power && cdev->ops->state2power &&
6733a88af1SDaniel Lezcano cdev->ops->power2state;
6833a88af1SDaniel Lezcano }
6933a88af1SDaniel Lezcano
7023ff8529SDaniel Lezcano void thermal_cdev_update(struct thermal_cooling_device *);
71b70dbf40SLukasz Luba void __thermal_cdev_update(struct thermal_cooling_device *cdev);
7223ff8529SDaniel Lezcano
738289d810SRafael J. Wysocki int get_tz_trend(struct thermal_zone_device *tz, int trip_index);
74f0129c23SDaniel Lezcano
7506f1041fSDaniel Lezcano struct thermal_instance *
7606f1041fSDaniel Lezcano get_thermal_instance(struct thermal_zone_device *tz,
7706f1041fSDaniel Lezcano struct thermal_cooling_device *cdev,
7806f1041fSDaniel Lezcano int trip);
7906f1041fSDaniel Lezcano
8071350db4SDurgadoss R /*
8171350db4SDurgadoss R * This structure is used to describe the behavior of
8271350db4SDurgadoss R * a certain cooling device on a certain trip point
8371350db4SDurgadoss R * in a certain thermal zone
8471350db4SDurgadoss R */
8571350db4SDurgadoss R struct thermal_instance {
8671350db4SDurgadoss R int id;
8771350db4SDurgadoss R char name[THERMAL_NAME_LENGTH];
8871350db4SDurgadoss R struct thermal_zone_device *tz;
8971350db4SDurgadoss R struct thermal_cooling_device *cdev;
90*77451ef5SRafael J. Wysocki const struct thermal_trip *trip;
91bb431ba2SZhang Rui bool initialized;
9271350db4SDurgadoss R unsigned long upper; /* Highest cooling state for this trip point */
9371350db4SDurgadoss R unsigned long lower; /* Lowest cooling state for this trip point */
9471350db4SDurgadoss R unsigned long target; /* expected cooling state */
9571350db4SDurgadoss R char attr_name[THERMAL_NAME_LENGTH];
9671350db4SDurgadoss R struct device_attribute attr;
97db916513SJavi Merino char weight_attr_name[THERMAL_NAME_LENGTH];
98db916513SJavi Merino struct device_attribute weight_attr;
9971350db4SDurgadoss R struct list_head tz_node; /* node in tz->thermal_instances */
10071350db4SDurgadoss R struct list_head cdev_node; /* node in cdev->thermal_instances */
1016cd9e9f6SKapileshwar Singh unsigned int weight; /* The weight of the cooling device */
102790930f4SRafael J. Wysocki bool upper_no_limit;
10371350db4SDurgadoss R };
10471350db4SDurgadoss R
105ba78da44SEduardo Valentin #define to_thermal_zone(_dev) \
106ba78da44SEduardo Valentin container_of(_dev, struct thermal_zone_device, device)
107ba78da44SEduardo Valentin
10899ea2effSEduardo Valentin #define to_cooling_device(_dev) \
10999ea2effSEduardo Valentin container_of(_dev, struct thermal_cooling_device, device)
11099ea2effSEduardo Valentin
11180a26a5cSZhang Rui int thermal_register_governor(struct thermal_governor *);
11280a26a5cSZhang Rui void thermal_unregister_governor(struct thermal_governor *);
1136b885202SEduardo Valentin int thermal_zone_device_set_policy(struct thermal_zone_device *, char *);
11497d2423bSEduardo Valentin int thermal_build_list_of_policies(char *buf);
11505eeee2bSGuenter Roeck void __thermal_zone_device_update(struct thermal_zone_device *tz,
11605eeee2bSGuenter Roeck enum thermal_notify_event event);
11780a26a5cSZhang Rui
118bceb5646SDaniel Lezcano /* Helpers */
119a930da9bSDaniel Lezcano void __thermal_zone_set_trips(struct thermal_zone_device *tz);
1207c3d5c20SDaniel Lezcano int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id,
1217c3d5c20SDaniel Lezcano struct thermal_trip *trip);
122*77451ef5SRafael J. Wysocki int thermal_zone_trip_id(struct thermal_zone_device *tz,
123*77451ef5SRafael J. Wysocki const struct thermal_trip *trip);
124a930da9bSDaniel Lezcano int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
125bceb5646SDaniel Lezcano
126a369ee88SEduardo Valentin /* sysfs I/F */
127a369ee88SEduardo Valentin int thermal_zone_create_device_groups(struct thermal_zone_device *, int);
12832fa5ba3SChristophe Jaillet void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
12945cf2ec9SEduardo Valentin void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *);
1308ea22951SViresh Kumar void thermal_cooling_device_destroy_sysfs(struct thermal_cooling_device *cdev);
131790930f4SRafael J. Wysocki void thermal_cooling_device_stats_reinit(struct thermal_cooling_device *cdev);
13245cf2ec9SEduardo Valentin /* used only at binding time */
13333e678d4SViresh Kumar ssize_t trip_point_show(struct device *, struct device_attribute *, char *);
13433e678d4SViresh Kumar ssize_t weight_show(struct device *, struct device_attribute *, char *);
13533e678d4SViresh Kumar ssize_t weight_store(struct device *, struct device_attribute *, const char *,
13633e678d4SViresh Kumar size_t);
137a369ee88SEduardo Valentin
1388ea22951SViresh Kumar #ifdef CONFIG_THERMAL_STATISTICS
1398ea22951SViresh Kumar void thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
1408ea22951SViresh Kumar unsigned long new_state);
1418ea22951SViresh Kumar #else
1428ea22951SViresh Kumar static inline void
thermal_cooling_device_stats_update(struct thermal_cooling_device * cdev,unsigned long new_state)1438ea22951SViresh Kumar thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev,
1448ea22951SViresh Kumar unsigned long new_state) {}
1458ea22951SViresh Kumar #endif /* CONFIG_THERMAL_STATISTICS */
1468ea22951SViresh Kumar
1474e5e4705SEduardo Valentin /* device tree support */
148514acd00SAndrzej Pietrasiewicz int thermal_zone_device_is_enabled(struct thermal_zone_device *tz);
149514acd00SAndrzej Pietrasiewicz
15071350db4SDurgadoss R #endif /* __THERMAL_CORE_H__ */
151