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