xref: /linux/tools/perf/util/hwmon_pmu.h (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
14810b761SIan Rogers /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
24810b761SIan Rogers #ifndef __HWMON_PMU_H
34810b761SIan Rogers #define __HWMON_PMU_H
44810b761SIan Rogers 
5*53cc0b35SIan Rogers #include "pmu.h"
64810b761SIan Rogers #include <stdbool.h>
74810b761SIan Rogers 
8*53cc0b35SIan Rogers struct list_head;
9*53cc0b35SIan Rogers struct perf_thread_map;
10*53cc0b35SIan Rogers 
114810b761SIan Rogers /**
124810b761SIan Rogers  * enum hwmon_type:
134810b761SIan Rogers  *
144810b761SIan Rogers  * As described in Documentation/hwmon/sysfs-interface.rst hwmon events are
154810b761SIan Rogers  * defined over multiple files of the form <type><num>_<item>. This enum
164810b761SIan Rogers  * captures potential <type> values.
174810b761SIan Rogers  *
184810b761SIan Rogers  * This enum is exposed for testing.
194810b761SIan Rogers  */
204810b761SIan Rogers enum hwmon_type {
214810b761SIan Rogers 	HWMON_TYPE_NONE,
224810b761SIan Rogers 
234810b761SIan Rogers 	HWMON_TYPE_CPU,
244810b761SIan Rogers 	HWMON_TYPE_CURR,
254810b761SIan Rogers 	HWMON_TYPE_ENERGY,
264810b761SIan Rogers 	HWMON_TYPE_FAN,
274810b761SIan Rogers 	HWMON_TYPE_HUMIDITY,
284810b761SIan Rogers 	HWMON_TYPE_IN,
294810b761SIan Rogers 	HWMON_TYPE_INTRUSION,
304810b761SIan Rogers 	HWMON_TYPE_POWER,
314810b761SIan Rogers 	HWMON_TYPE_PWM,
324810b761SIan Rogers 	HWMON_TYPE_TEMP,
334810b761SIan Rogers 
344810b761SIan Rogers 	HWMON_TYPE_MAX
354810b761SIan Rogers };
364810b761SIan Rogers 
374810b761SIan Rogers /**
384810b761SIan Rogers  * enum hwmon_item:
394810b761SIan Rogers  *
404810b761SIan Rogers  * Similar to enum hwmon_type but describes the item part of a a sysfs filename.
414810b761SIan Rogers  *
424810b761SIan Rogers  * This enum is exposed for testing.
434810b761SIan Rogers  */
444810b761SIan Rogers enum hwmon_item {
454810b761SIan Rogers 	HWMON_ITEM_NONE,
464810b761SIan Rogers 
474810b761SIan Rogers 	HWMON_ITEM_ACCURACY,
484810b761SIan Rogers 	HWMON_ITEM_ALARM,
494810b761SIan Rogers 	HWMON_ITEM_AUTO_CHANNELS_TEMP,
504810b761SIan Rogers 	HWMON_ITEM_AVERAGE,
514810b761SIan Rogers 	HWMON_ITEM_AVERAGE_HIGHEST,
524810b761SIan Rogers 	HWMON_ITEM_AVERAGE_INTERVAL,
534810b761SIan Rogers 	HWMON_ITEM_AVERAGE_INTERVAL_MAX,
544810b761SIan Rogers 	HWMON_ITEM_AVERAGE_INTERVAL_MIN,
554810b761SIan Rogers 	HWMON_ITEM_AVERAGE_LOWEST,
564810b761SIan Rogers 	HWMON_ITEM_AVERAGE_MAX,
574810b761SIan Rogers 	HWMON_ITEM_AVERAGE_MIN,
584810b761SIan Rogers 	HWMON_ITEM_BEEP,
594810b761SIan Rogers 	HWMON_ITEM_CAP,
604810b761SIan Rogers 	HWMON_ITEM_CAP_HYST,
614810b761SIan Rogers 	HWMON_ITEM_CAP_MAX,
624810b761SIan Rogers 	HWMON_ITEM_CAP_MIN,
634810b761SIan Rogers 	HWMON_ITEM_CRIT,
644810b761SIan Rogers 	HWMON_ITEM_CRIT_HYST,
654810b761SIan Rogers 	HWMON_ITEM_DIV,
664810b761SIan Rogers 	HWMON_ITEM_EMERGENCY,
674810b761SIan Rogers 	HWMON_ITEM_EMERGENCY_HIST,
684810b761SIan Rogers 	HWMON_ITEM_ENABLE,
694810b761SIan Rogers 	HWMON_ITEM_FAULT,
704810b761SIan Rogers 	HWMON_ITEM_FREQ,
714810b761SIan Rogers 	HWMON_ITEM_HIGHEST,
724810b761SIan Rogers 	HWMON_ITEM_INPUT,
734810b761SIan Rogers 	HWMON_ITEM_LABEL,
744810b761SIan Rogers 	HWMON_ITEM_LCRIT,
754810b761SIan Rogers 	HWMON_ITEM_LCRIT_HYST,
764810b761SIan Rogers 	HWMON_ITEM_LOWEST,
774810b761SIan Rogers 	HWMON_ITEM_MAX,
784810b761SIan Rogers 	HWMON_ITEM_MAX_HYST,
794810b761SIan Rogers 	HWMON_ITEM_MIN,
804810b761SIan Rogers 	HWMON_ITEM_MIN_HYST,
814810b761SIan Rogers 	HWMON_ITEM_MOD,
824810b761SIan Rogers 	HWMON_ITEM_OFFSET,
834810b761SIan Rogers 	HWMON_ITEM_PULSES,
844810b761SIan Rogers 	HWMON_ITEM_RATED_MAX,
854810b761SIan Rogers 	HWMON_ITEM_RATED_MIN,
864810b761SIan Rogers 	HWMON_ITEM_RESET_HISTORY,
874810b761SIan Rogers 	HWMON_ITEM_TARGET,
884810b761SIan Rogers 	HWMON_ITEM_TYPE,
894810b761SIan Rogers 	HWMON_ITEM_VID,
904810b761SIan Rogers 
914810b761SIan Rogers 	HWMON_ITEM__MAX,
924810b761SIan Rogers };
934810b761SIan Rogers 
94*53cc0b35SIan Rogers bool perf_pmu__is_hwmon(const struct perf_pmu *pmu);
95*53cc0b35SIan Rogers bool evsel__is_hwmon(const struct evsel *evsel);
96*53cc0b35SIan Rogers 
974810b761SIan Rogers /**
984810b761SIan Rogers  * parse_hwmon_filename() - Parse filename into constituent parts.
994810b761SIan Rogers  *
1004810b761SIan Rogers  * @filename: To be parsed, of the form <type><number>_<item>.
1014810b761SIan Rogers  * @type: The type defined from the parsed file name.
1024810b761SIan Rogers  * @number: The number of the type, for example there may be more than 1 fan.
1034810b761SIan Rogers  * @item: A hwmon <type><number> may have multiple associated items.
1044810b761SIan Rogers  * @alarm: Is the filename for an alarm value?
1054810b761SIan Rogers  *
1064810b761SIan Rogers  * An example of a hwmon filename is "temp1_input". The type is temp for a
1074810b761SIan Rogers  * temperature value. The number is 1. The item within the file is an input
1084810b761SIan Rogers  * value - the temperature itself. This file doesn't contain an alarm value.
1094810b761SIan Rogers  *
1104810b761SIan Rogers  * Exposed for testing.
1114810b761SIan Rogers  */
1124810b761SIan Rogers bool parse_hwmon_filename(const char *filename,
1134810b761SIan Rogers 			  enum hwmon_type *type,
1144810b761SIan Rogers 			  int *number,
1154810b761SIan Rogers 			  enum hwmon_item *item,
1164810b761SIan Rogers 			  bool *alarm);
1174810b761SIan Rogers 
118*53cc0b35SIan Rogers /**
119*53cc0b35SIan Rogers  * hwmon_pmu__new() - Allocate and construct a hwmon PMU.
120*53cc0b35SIan Rogers  *
121*53cc0b35SIan Rogers  * @pmus: The list of PMUs to be added to.
122*53cc0b35SIan Rogers  * @hwmon_dir: An O_DIRECTORY file descriptor for a hwmon directory.
123*53cc0b35SIan Rogers  * @sysfs_name: Name of the hwmon sysfs directory like hwmon0.
124*53cc0b35SIan Rogers  * @name: The contents of the "name" file in the hwmon directory.
125*53cc0b35SIan Rogers  *
126*53cc0b35SIan Rogers  * Exposed for testing. Regular construction should happen via
127*53cc0b35SIan Rogers  * perf_pmus__read_hwmon_pmus.
128*53cc0b35SIan Rogers  */
129*53cc0b35SIan Rogers struct perf_pmu *hwmon_pmu__new(struct list_head *pmus, int hwmon_dir,
130*53cc0b35SIan Rogers 				const char *sysfs_name, const char *name);
131*53cc0b35SIan Rogers void hwmon_pmu__exit(struct perf_pmu *pmu);
132*53cc0b35SIan Rogers 
133*53cc0b35SIan Rogers int hwmon_pmu__for_each_event(struct perf_pmu *pmu, void *state, pmu_event_callback cb);
134*53cc0b35SIan Rogers size_t hwmon_pmu__num_events(struct perf_pmu *pmu);
135*53cc0b35SIan Rogers bool hwmon_pmu__have_event(struct perf_pmu *pmu, const char *name);
136*53cc0b35SIan Rogers int hwmon_pmu__config_terms(const struct perf_pmu *pmu,
137*53cc0b35SIan Rogers 			    struct perf_event_attr *attr,
138*53cc0b35SIan Rogers 			    struct parse_events_terms *terms,
139*53cc0b35SIan Rogers 			    struct parse_events_error *err);
140*53cc0b35SIan Rogers int hwmon_pmu__check_alias(struct parse_events_terms *terms, struct perf_pmu_info *info,
141*53cc0b35SIan Rogers 			   struct parse_events_error *err);
142*53cc0b35SIan Rogers 
143*53cc0b35SIan Rogers int perf_pmus__read_hwmon_pmus(struct list_head *pmus);
144*53cc0b35SIan Rogers 
145*53cc0b35SIan Rogers 
146*53cc0b35SIan Rogers int evsel__hwmon_pmu_open(struct evsel *evsel,
147*53cc0b35SIan Rogers 			 struct perf_thread_map *threads,
148*53cc0b35SIan Rogers 			 int start_cpu_map_idx, int end_cpu_map_idx);
149*53cc0b35SIan Rogers int evsel__hwmon_pmu_read(struct evsel *evsel, int cpu_map_idx, int thread);
150*53cc0b35SIan Rogers 
1514810b761SIan Rogers #endif /* __HWMON_PMU_H */
152