47c4b0de08
The thermal framework implements a netlink notification mechanism to be used by the userspace to have a thermal configuration discovery, trip point changes or violation, cooling device changes notifications, etc... This library provides a level of abstraction for the thermal netlink notification allowing the userspace to connect to the notification mechanism more easily. The library is callback oriented. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Tested-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Link: https://lore.kernel.org/r/20220420160933.347088-2-daniel.lezcano@linaro.org
143 lines
4.1 KiB
C
143 lines
4.1 KiB
C
/* SPDX-License-Identifier: LGPL-2.1+ */
|
|
/* Copyright (C) 2022, Linaro Ltd - Daniel Lezcano <daniel.lezcano@linaro.org> */
|
|
#ifndef __LIBTHERMAL_H
|
|
#define __LIBTHERMAL_H
|
|
|
|
#include <linux/thermal.h>
|
|
|
|
#ifndef LIBTHERMAL_API
|
|
#define LIBTHERMAL_API __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct thermal_sampling_ops {
|
|
int (*tz_temp)(int tz_id, int temp, void *arg);
|
|
};
|
|
|
|
struct thermal_events_ops {
|
|
int (*tz_create)(const char *name, int tz_id, void *arg);
|
|
int (*tz_delete)(int tz_id, void *arg);
|
|
int (*tz_enable)(int tz_id, void *arg);
|
|
int (*tz_disable)(int tz_id, void *arg);
|
|
int (*trip_high)(int tz_id, int trip_id, int temp, void *arg);
|
|
int (*trip_low)(int tz_id, int trip_id, int temp, void *arg);
|
|
int (*trip_add)(int tz_id, int trip_id, int type, int temp, int hyst, void *arg);
|
|
int (*trip_change)(int tz_id, int trip_id, int type, int temp, int hyst, void *arg);
|
|
int (*trip_delete)(int tz_id, int trip_id, void *arg);
|
|
int (*cdev_add)(const char *name, int cdev_id, int max_state, void *arg);
|
|
int (*cdev_delete)(int cdev_id, void *arg);
|
|
int (*cdev_update)(int cdev_id, int cur_state, void *arg);
|
|
int (*gov_change)(int tz_id, const char *gov_name, void *arg);
|
|
};
|
|
|
|
struct thermal_ops {
|
|
struct thermal_sampling_ops sampling;
|
|
struct thermal_events_ops events;
|
|
};
|
|
|
|
struct thermal_trip {
|
|
int id;
|
|
int type;
|
|
int temp;
|
|
int hyst;
|
|
};
|
|
|
|
struct thermal_zone {
|
|
int id;
|
|
int temp;
|
|
char name[THERMAL_NAME_LENGTH];
|
|
char governor[THERMAL_NAME_LENGTH];
|
|
struct thermal_trip *trip;
|
|
};
|
|
|
|
struct thermal_cdev {
|
|
int id;
|
|
char name[THERMAL_NAME_LENGTH];
|
|
int max_state;
|
|
int min_state;
|
|
int cur_state;
|
|
};
|
|
|
|
typedef enum {
|
|
THERMAL_ERROR = -1,
|
|
THERMAL_SUCCESS = 0,
|
|
} thermal_error_t;
|
|
|
|
struct thermal_handler;
|
|
|
|
typedef int (*cb_tz_t)(struct thermal_zone *, void *);
|
|
|
|
typedef int (*cb_tt_t)(struct thermal_trip *, void *);
|
|
|
|
typedef int (*cb_tc_t)(struct thermal_cdev *, void *);
|
|
|
|
LIBTHERMAL_API int for_each_thermal_zone(struct thermal_zone *tz, cb_tz_t cb, void *arg);
|
|
|
|
LIBTHERMAL_API int for_each_thermal_trip(struct thermal_trip *tt, cb_tt_t cb, void *arg);
|
|
|
|
LIBTHERMAL_API int for_each_thermal_cdev(struct thermal_cdev *cdev, cb_tc_t cb, void *arg);
|
|
|
|
LIBTHERMAL_API struct thermal_zone *thermal_zone_find_by_name(struct thermal_zone *tz,
|
|
const char *name);
|
|
|
|
LIBTHERMAL_API struct thermal_zone *thermal_zone_find_by_id(struct thermal_zone *tz, int id);
|
|
|
|
LIBTHERMAL_API struct thermal_zone *thermal_zone_discover(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API struct thermal_handler *thermal_init(struct thermal_ops *ops);
|
|
|
|
LIBTHERMAL_API void thermal_exit(struct thermal_handler *th);
|
|
|
|
/*
|
|
* Netlink thermal events
|
|
*/
|
|
LIBTHERMAL_API thermal_error_t thermal_events_exit(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_events_init(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_events_handle(struct thermal_handler *th, void *arg);
|
|
|
|
LIBTHERMAL_API int thermal_events_fd(struct thermal_handler *th);
|
|
|
|
/*
|
|
* Netlink thermal commands
|
|
*/
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_exit(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_init(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_get_tz(struct thermal_handler *th,
|
|
struct thermal_zone **tz);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_get_cdev(struct thermal_handler *th,
|
|
struct thermal_cdev **tc);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_get_trip(struct thermal_handler *th,
|
|
struct thermal_zone *tz);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_get_governor(struct thermal_handler *th,
|
|
struct thermal_zone *tz);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_cmd_get_temp(struct thermal_handler *th,
|
|
struct thermal_zone *tz);
|
|
|
|
/*
|
|
* Netlink thermal samples
|
|
*/
|
|
LIBTHERMAL_API thermal_error_t thermal_sampling_exit(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_sampling_init(struct thermal_handler *th);
|
|
|
|
LIBTHERMAL_API thermal_error_t thermal_sampling_handle(struct thermal_handler *th, void *arg);
|
|
|
|
LIBTHERMAL_API int thermal_sampling_fd(struct thermal_handler *th);
|
|
|
|
#endif /* __LIBTHERMAL_H */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|