1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 *  (C) 2016 SUSE Software Solutions GmbH
4 *           Thomas Renninger <trenn@suse.de>
5 */
6
7#ifndef __CPUPOWER_RAPL_H__
8#define __CPUPOWER_RAPL_H__
9
10#define PATH_TO_POWERCAP "/sys/devices/virtual/powercap"
11#define PATH_TO_RAPL "/sys/devices/virtual/powercap/intel-rapl"
12#define PATH_TO_RAPL_CLASS "/sys/devices/virtual/powercap/intel-rapl"
13
14#define POWERCAP_MAX_CHILD_ZONES 10
15#define POWERCAP_MAX_TREE_DEPTH 10
16
17#define MAX_LINE_LEN 4096
18#define SYSFS_PATH_MAX 255
19
20#include <stdint.h>
21
22struct powercap_zone {
23	char name[MAX_LINE_LEN];
24	/*
25	 * sys_name relative to PATH_TO_POWERCAP,
26	 * do not forget the / in between
27	 */
28	char sys_name[SYSFS_PATH_MAX];
29	int tree_depth;
30	struct powercap_zone *parent;
31	struct powercap_zone *children[POWERCAP_MAX_CHILD_ZONES];
32	/* More possible caps or attributes to be added? */
33	uint32_t has_power_uw:1,
34		 has_energy_uj:1;
35
36};
37
38int powercap_walk_zones(struct powercap_zone *zone,
39			int (*f)(struct powercap_zone *zone));
40
41struct powercap_zone *powercap_init_zones(void);
42int powercap_get_enabled(int *mode);
43int powercap_set_enabled(int mode);
44int powercap_get_driver(char *driver, int buflen);
45
46int powercap_get_max_energy_range_uj(struct powercap_zone *zone, uint64_t *val);
47int powercap_get_energy_uj(struct powercap_zone *zone, uint64_t *val);
48int powercap_get_max_power_range_uw(struct powercap_zone *zone, uint64_t *val);
49int powercap_get_power_uw(struct powercap_zone *zone, uint64_t *val);
50int powercap_zone_get_enabled(struct powercap_zone *zone, int *mode);
51int powercap_zone_set_enabled(struct powercap_zone *zone, int mode);
52
53
54#endif /* __CPUPOWER_RAPL_H__ */
55