| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- /*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2022-3-08 GuEe-GUI the first version
- */
- #ifndef __THERMAL_H__
- #define __THERMAL_H__
- #include <rtdef.h>
- #include <dt-bindings/thermal/thermal.h>
- /* No upper/lower limit requirement */
- #define RT_THERMAL_NO_LIMIT ((rt_uint32_t)THERMAL_NO_LIMIT)
- #define RT_THERMAL_TEMP_INVALID (-274000)
- struct rt_thermal_zone_ops;
- struct rt_thermal_cooling_device;
- struct rt_thermal_cooling_device_ops;
- struct rt_thermal_cooling_governor;
- enum rt_thermal_trip_type
- {
- RT_THERMAL_TRIP_ACTIVE = 0,
- RT_THERMAL_TRIP_PASSIVE,
- RT_THERMAL_TRIP_HOT,
- RT_THERMAL_TRIP_CRITICAL,
- RT_THERMAL_TRIP_TYPE_MAX,
- };
- struct rt_thermal_trip
- {
- /* Temperature value in millidegree celsius */
- int temperature;
- /* Relative hysteresis in millidegree celsius */
- int hysteresis;
- enum rt_thermal_trip_type type;
- void *priv;
- };
- struct rt_thermal_zone_params
- {
- /* Sustainable power (heat) that this thermal zone can dissipate in mW */
- int sustainable_power;
- /* Slope of a linear temperature adjustment curve */
- int slope;
- /* Offset of a linear temperature adjustment curve */
- int offset;
- };
- struct rt_thermal_cooling_cell
- {
- struct rt_thermal_cooling_device *cooling_devices;
- rt_uint32_t level_range[2];
- };
- struct rt_thermal_cooling_map
- {
- rt_uint32_t contribution;
- rt_size_t cells_nr;
- struct rt_thermal_cooling_cell *cells;
- struct rt_thermal_trip *trips;
- };
- struct rt_thermal_zone_device
- {
- struct rt_device parent;
- int zone_id;
- const struct rt_thermal_zone_ops *ops;
- rt_bool_t trips_free;
- rt_size_t trips_nr;
- struct rt_thermal_trip *trips;
- struct rt_thermal_zone_params params;
- rt_bool_t enabled;
- rt_bool_t cooling;
- int temperature;
- int last_temperature;
- int prev_low_trip;
- int prev_high_trip;
- rt_list_t notifier_nodes;
- struct rt_spinlock nodes_lock;
- rt_size_t cooling_maps_nr;
- struct rt_thermal_cooling_map *cooling_maps;
- rt_tick_t passive_delay, polling_delay;
- struct rt_work poller;
- struct rt_mutex mutex;
- void *priv;
- };
- struct rt_thermal_zone_ops
- {
- rt_err_t (*get_temp)(struct rt_thermal_zone_device *zdev, int *out_temp);
- rt_err_t (*set_trips)(struct rt_thermal_zone_device *zdev, int low_temp, int high_temp);
- rt_err_t (*set_trip_temp)(struct rt_thermal_zone_device *zdev, int trip_id, int temp);
- rt_err_t (*set_trip_hyst)(struct rt_thermal_zone_device *zdev, int trip_id, int hyst);
- void (*hot)(struct rt_thermal_zone_device *zdev);
- void (*critical)(struct rt_thermal_zone_device *zdev);
- };
- /*
- * We don't want to make a temperature control system
- * that is finer than an air conditioner's temperature control,
- * just ensure get a reliable heat dissipation under high-load task
- * or when the SoC temperature is too high.
- */
- struct rt_thermal_cooling_device
- {
- struct rt_device parent;
- const struct rt_thermal_cooling_device_ops *ops;
- /* The cooling capacity indicator */
- rt_ubase_t max_level;
- rt_list_t governor_node;
- struct rt_thermal_cooling_governor *gov;
- void *priv;
- };
- struct rt_thermal_cooling_device_ops
- {
- rt_err_t (*bind)(struct rt_thermal_cooling_device *cdev, struct rt_thermal_zone_device *zdev);
- rt_err_t (*unbind)(struct rt_thermal_cooling_device *cdev, struct rt_thermal_zone_device *zdev);
- rt_err_t (*get_max_level)(struct rt_thermal_cooling_device *cdev, rt_ubase_t *out_level);
- rt_err_t (*get_cur_level)(struct rt_thermal_cooling_device *cdev, rt_ubase_t *out_level);
- rt_err_t (*set_cur_level)(struct rt_thermal_cooling_device *cdev, rt_ubase_t level);
- };
- struct rt_thermal_cooling_governor
- {
- rt_list_t list;
- const char *name;
- rt_list_t cdev_nodes;
- void (*tuning)(struct rt_thermal_zone_device *zdev,
- int map_idx, int cell_idx, rt_ubase_t *level);
- };
- struct rt_thermal_notifier;
- #define RT_THERMAL_MSG_EVENT_UNSPECIFIED RT_BIT(0) /* Unspecified event */
- #define RT_THERMAL_MSG_EVENT_TEMP_SAMPLE RT_BIT(1) /* New Temperature sample */
- #define RT_THERMAL_MSG_TRIP_VIOLATED RT_BIT(2) /* TRIP Point violation */
- #define RT_THERMAL_MSG_TRIP_CHANGED RT_BIT(3) /* TRIP Point temperature changed */
- #define RT_THERMAL_MSG_DEVICE_DOWN RT_BIT(4) /* Thermal device is down */
- #define RT_THERMAL_MSG_DEVICE_UP RT_BIT(5) /* Thermal device is up after a down event */
- #define RT_THERMAL_MSG_DEVICE_POWER_CAPABILITY_CHANGED RT_BIT(6) /* Power capability changed */
- #define RT_THERMAL_MSG_TABLE_CHANGED RT_BIT(7) /* Thermal table(s) changed */
- #define RT_THERMAL_MSG_EVENT_KEEP_ALIVE RT_BIT(8) /* Request for user space handler to respond */
- typedef rt_err_t (*rt_thermal_notifier_callback)(struct rt_thermal_notifier *notifier,
- rt_ubase_t msg);
- struct rt_thermal_notifier
- {
- rt_list_t list;
- struct rt_thermal_zone_device *zdev;
- rt_thermal_notifier_callback callback;
- void *priv;
- };
- rt_err_t rt_thermal_zone_device_register(struct rt_thermal_zone_device *zdev);
- rt_err_t rt_thermal_zone_device_unregister(struct rt_thermal_zone_device *zdev);
- rt_err_t rt_thermal_cooling_device_register(struct rt_thermal_cooling_device *cdev);
- rt_err_t rt_thermal_cooling_device_unregister(struct rt_thermal_cooling_device *cdev);
- rt_err_t rt_thermal_cooling_governor_register(struct rt_thermal_cooling_governor *gov);
- rt_err_t rt_thermal_cooling_governor_unregister(struct rt_thermal_cooling_governor *gov);
- rt_err_t rt_thermal_cooling_device_change_governor(struct rt_thermal_cooling_device *cdev,
- const char *name);
- rt_err_t rt_thermal_zone_notifier_register(struct rt_thermal_zone_device *zdev,
- struct rt_thermal_notifier *notifier);
- rt_err_t rt_thermal_zone_notifier_unregister(struct rt_thermal_zone_device *zdev,
- struct rt_thermal_notifier *notifier);
- void rt_thermal_zone_device_update(struct rt_thermal_zone_device *zdev, rt_ubase_t msg);
- void rt_thermal_cooling_device_kick(struct rt_thermal_zone_device *zdev);
- rt_err_t rt_thermal_zone_set_trip(struct rt_thermal_zone_device *zdev, int trip_id,
- const struct rt_thermal_trip *trip);
- rt_err_t rt_thermal_zone_get_trip(struct rt_thermal_zone_device *zdev, int trip_id,
- struct rt_thermal_trip *out_trip);
- #endif /* __THERMAL_H__ */
|