162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  (C) 2016 SUSE Software Solutions GmbH
462306a36Sopenharmony_ci *           Thomas Renninger <trenn@suse.de>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __CPUPOWER_RAPL_H__
862306a36Sopenharmony_ci#define __CPUPOWER_RAPL_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define PATH_TO_POWERCAP "/sys/devices/virtual/powercap"
1162306a36Sopenharmony_ci#define PATH_TO_RAPL "/sys/devices/virtual/powercap/intel-rapl"
1262306a36Sopenharmony_ci#define PATH_TO_RAPL_CLASS "/sys/devices/virtual/powercap/intel-rapl"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define POWERCAP_MAX_CHILD_ZONES 10
1562306a36Sopenharmony_ci#define POWERCAP_MAX_TREE_DEPTH 10
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define MAX_LINE_LEN 4096
1862306a36Sopenharmony_ci#define SYSFS_PATH_MAX 255
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <stdint.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct powercap_zone {
2362306a36Sopenharmony_ci	char name[MAX_LINE_LEN];
2462306a36Sopenharmony_ci	/*
2562306a36Sopenharmony_ci	 * sys_name relative to PATH_TO_POWERCAP,
2662306a36Sopenharmony_ci	 * do not forget the / in between
2762306a36Sopenharmony_ci	 */
2862306a36Sopenharmony_ci	char sys_name[SYSFS_PATH_MAX];
2962306a36Sopenharmony_ci	int tree_depth;
3062306a36Sopenharmony_ci	struct powercap_zone *parent;
3162306a36Sopenharmony_ci	struct powercap_zone *children[POWERCAP_MAX_CHILD_ZONES];
3262306a36Sopenharmony_ci	/* More possible caps or attributes to be added? */
3362306a36Sopenharmony_ci	uint32_t has_power_uw:1,
3462306a36Sopenharmony_ci		 has_energy_uj:1;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciint powercap_walk_zones(struct powercap_zone *zone,
3962306a36Sopenharmony_ci			int (*f)(struct powercap_zone *zone));
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct powercap_zone *powercap_init_zones(void);
4262306a36Sopenharmony_ciint powercap_get_enabled(int *mode);
4362306a36Sopenharmony_ciint powercap_set_enabled(int mode);
4462306a36Sopenharmony_ciint powercap_get_driver(char *driver, int buflen);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciint powercap_get_max_energy_range_uj(struct powercap_zone *zone, uint64_t *val);
4762306a36Sopenharmony_ciint powercap_get_energy_uj(struct powercap_zone *zone, uint64_t *val);
4862306a36Sopenharmony_ciint powercap_get_max_power_range_uw(struct powercap_zone *zone, uint64_t *val);
4962306a36Sopenharmony_ciint powercap_get_power_uw(struct powercap_zone *zone, uint64_t *val);
5062306a36Sopenharmony_ciint powercap_zone_get_enabled(struct powercap_zone *zone, int *mode);
5162306a36Sopenharmony_ciint powercap_zone_set_enabled(struct powercap_zone *zone, int mode);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#endif /* __CPUPOWER_RAPL_H__ */
55