Lines Matching +full:num +full:- +full:strings
1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
25 /** Strings that correspond to enum hwmon_type. */
41 /** Strings that correspond to enum hwmon_item. */
111 * struct hwmon_pmu_event_value: Value in hwmon_pmu->events.
129 return pmu && pmu->type >= PERF_PMU_TYPE_HWMON_START && in perf_pmu__is_hwmon()
130 pmu->type <= PERF_PMU_TYPE_HWMON_END; in perf_pmu__is_hwmon()
135 return perf_pmu__is_hwmon(evsel->pmu); in evsel__is_hwmon()
180 *number = -1; in parse_hwmon_filename()
189 elem = bsearch(&fn_type, hwmon_type_strs + 1, ARRAY_SIZE(hwmon_type_strs) - 1, in parse_hwmon_filename()
197 *type = elem - &hwmon_type_strs[0]; in parse_hwmon_filename()
203 if (fn_item_len > 6 && !strcmp(&fn_item[fn_item_len - 6], "_alarm")) { in parse_hwmon_filename()
205 strlcpy(fn_type, fn_item, fn_item_len - 5); in parse_hwmon_filename()
209 elem = bsearch(fn_item, hwmon_item_strs + 1, ARRAY_SIZE(hwmon_item_strs) - 1, in parse_hwmon_filename()
216 *item = elem - &hwmon_item_strs[0]; in parse_hwmon_filename()
244 if (pmu->pmu.sysfs_aliases_loaded) in hwmon_pmu__read_events()
248 io_dir__init(&dir, openat(pmu->hwmon_dir_fd, ".", O_CLOEXEC | O_DIRECTORY | O_RDONLY)); in hwmon_pmu__read_events()
251 return -ENOENT; in hwmon_pmu__read_events()
261 if (ent->d_type != DT_REG) in hwmon_pmu__read_events()
264 if (!parse_hwmon_filename(ent->d_name, &type, &number, &item, &alarm)) { in hwmon_pmu__read_events()
265 pr_debug3("Not a hwmon file '%s'\n", ent->d_name); in hwmon_pmu__read_events()
268 key.num = number; in hwmon_pmu__read_events()
270 if (!hashmap__find(&pmu->events, key.type_and_num, &value)) { in hwmon_pmu__read_events()
273 err = -ENOMEM; in hwmon_pmu__read_events()
276 err = hashmap__add(&pmu->events, key.type_and_num, value); in hwmon_pmu__read_events()
279 err = -ENOMEM; in hwmon_pmu__read_events()
283 __set_bit(item, alarm ? value->alarm_items : value->items); in hwmon_pmu__read_events()
286 int fd = openat(pmu->hwmon_dir_fd, ent->d_name, O_RDONLY); in hwmon_pmu__read_events()
294 while (read_len > 0 && buf[read_len - 1] == '\n') in hwmon_pmu__read_events()
295 read_len--; in hwmon_pmu__read_events()
302 pmu->pmu.name, ent->d_name); in hwmon_pmu__read_events()
306 value->label = strdup(buf); in hwmon_pmu__read_events()
307 if (!value->label) { in hwmon_pmu__read_events()
312 snprintf(buf, sizeof(buf), "%s_%s", hwmon_type_strs[type], value->label); in hwmon_pmu__read_events()
314 value->name = strdup(buf); in hwmon_pmu__read_events()
315 if (!value->name) in hwmon_pmu__read_events()
320 if (hashmap__size(&pmu->events) == 0) in hwmon_pmu__read_events()
321 pr_debug2("hwmon_pmu: %s has no events\n", pmu->pmu.name); in hwmon_pmu__read_events()
323 hashmap__for_each_entry_safe((&pmu->events), cur, tmp, bkt) { in hwmon_pmu__read_events()
325 .type_and_num = cur->key, in hwmon_pmu__read_events()
327 struct hwmon_pmu_event_value *value = cur->pvalue; in hwmon_pmu__read_events()
329 if (!test_bit(HWMON_ITEM_INPUT, value->items)) { in hwmon_pmu__read_events()
331 pmu->pmu.name, hwmon_type_strs[key.type], key.num); in hwmon_pmu__read_events()
332 hashmap__delete(&pmu->events, key.type_and_num, &key, &value); in hwmon_pmu__read_events()
333 zfree(&value->label); in hwmon_pmu__read_events()
334 zfree(&value->name); in hwmon_pmu__read_events()
338 pmu->pmu.sysfs_aliases_loaded = true; in hwmon_pmu__read_events()
354 hwm->hwmon_dir_fd = hwmon_dir; in hwmon_pmu__new()
355 hwm->pmu.type = PERF_PMU_TYPE_HWMON_START + strtoul(sysfs_name + 5, NULL, 10); in hwmon_pmu__new()
356 if (hwm->pmu.type > PERF_PMU_TYPE_HWMON_END) { in hwmon_pmu__new()
362 hwm->pmu.name = strdup(buf); in hwmon_pmu__new()
363 if (!hwm->pmu.name) in hwmon_pmu__new()
365 hwm->pmu.alias_name = strdup(sysfs_name); in hwmon_pmu__new()
366 if (!hwm->pmu.alias_name) in hwmon_pmu__new()
368 hwm->pmu.cpus = perf_cpu_map__new("0"); in hwmon_pmu__new()
369 if (!hwm->pmu.cpus) in hwmon_pmu__new()
371 INIT_LIST_HEAD(&hwm->pmu.format); in hwmon_pmu__new()
372 INIT_LIST_HEAD(&hwm->pmu.aliases); in hwmon_pmu__new()
373 INIT_LIST_HEAD(&hwm->pmu.caps); in hwmon_pmu__new()
374 hashmap__init(&hwm->events, hwmon_pmu__event_hashmap_hash, in hwmon_pmu__new()
377 list_add_tail(&hwm->pmu.list, pmus); in hwmon_pmu__new()
378 return &hwm->pmu; in hwmon_pmu__new()
380 free((char *)hwm->pmu.name); in hwmon_pmu__new()
381 free(hwm->pmu.alias_name); in hwmon_pmu__new()
393 hashmap__for_each_entry_safe((&hwm->events), cur, tmp, bkt) { in hwmon_pmu__exit()
394 struct hwmon_pmu_event_value *value = cur->pvalue; in hwmon_pmu__exit()
396 zfree(&value->label); in hwmon_pmu__exit()
397 zfree(&value->name); in hwmon_pmu__exit()
400 hashmap__clear(&hwm->events); in hwmon_pmu__exit()
401 close(hwm->hwmon_dir_fd); in hwmon_pmu__exit()
420 key.num, in hwmon_pmu__describe_items()
423 fd = openat(hwm->hwmon_dir_fd, buf, O_RDONLY); in hwmon_pmu__describe_items()
427 while (read_len > 0 && buf[read_len - 1] == '\n') in hwmon_pmu__describe_items()
428 read_len--; in hwmon_pmu__describe_items()
435 len += snprintf(out_buf + len, out_buf_len - len, "%s%s%s=%g%s", in hwmon_pmu__describe_items()
457 hashmap__for_each_entry((&hwm->events), cur, bkt) { in hwmon_pmu__for_each_event()
488 .type_and_num = cur->key, in hwmon_pmu__for_each_event()
490 struct hwmon_pmu_event_value *value = cur->pvalue; in hwmon_pmu__for_each_event()
493 .name = value->name, in hwmon_pmu__for_each_event()
500 .pmu_name = pmu->name, in hwmon_pmu__for_each_event()
507 hwmon_type_strs[key.type], key.num); in hwmon_pmu__for_each_event()
515 pmu->name + 6, in hwmon_pmu__for_each_event()
516 value->label ?: info.name); in hwmon_pmu__for_each_event()
518 len += hwmon_pmu__describe_items(hwm, desc_buf + len, sizeof(desc_buf) - len, in hwmon_pmu__for_each_event()
519 key, value->items, /*is_alarm=*/false); in hwmon_pmu__for_each_event()
521 len += hwmon_pmu__describe_items(hwm, desc_buf + len, sizeof(desc_buf) - len, in hwmon_pmu__for_each_event()
522 key, value->alarm_items, /*is_alarm=*/true); in hwmon_pmu__for_each_event()
525 pmu->name, cur->key); in hwmon_pmu__for_each_event()
539 return hashmap__size(&hwm->events); in hwmon_pmu__num_events()
558 key.num = number; in hwmon_pmu__have_event()
559 if (hashmap_find(&hwm->events, key.type_and_num, /*value=*/NULL)) in hwmon_pmu__have_event()
561 if (key.num != -1) in hwmon_pmu__have_event()
564 hashmap__for_each_entry((&hwm->events), cur, bkt) { in hwmon_pmu__have_event()
565 struct hwmon_pmu_event_value *value = cur->pvalue; in hwmon_pmu__have_event()
567 key.type_and_num = cur->key; in hwmon_pmu__have_event()
568 if (key.type == type && value->name && !strcasecmp(name, value->name)) in hwmon_pmu__have_event()
579 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER) { in hwmon_pmu__config_term()
583 if (parse_hwmon_filename(term->config, &type, &number, in hwmon_pmu__config_term()
585 if (number == -1) { in hwmon_pmu__config_term()
593 attr->config = 0; in hwmon_pmu__config_term()
594 hashmap__for_each_entry((&hwm->events), cur, bkt) { in hwmon_pmu__config_term()
596 .type_and_num = cur->key, in hwmon_pmu__config_term()
598 struct hwmon_pmu_event_value *value = cur->pvalue; in hwmon_pmu__config_term()
600 if (key.type == type && value->name && in hwmon_pmu__config_term()
601 !strcasecmp(term->config, value->name)) { in hwmon_pmu__config_term()
602 attr->config = key.type_and_num; in hwmon_pmu__config_term()
606 if (attr->config == 0) in hwmon_pmu__config_term()
607 return -EINVAL; in hwmon_pmu__config_term()
614 key.num = number; in hwmon_pmu__config_term()
615 attr->config = key.type_and_num; in hwmon_pmu__config_term()
623 parse_events_error__handle(err, term->err_val, in hwmon_pmu__config_term()
626 parse_events__term_type_str(term->type_term), in hwmon_pmu__config_term()
627 term->config) < 0 in hwmon_pmu__config_term()
632 return -EINVAL; in hwmon_pmu__config_term()
648 list_for_each_entry(term, &terms->terms, list) { in hwmon_pmu__config_terms()
650 return -EINVAL; in hwmon_pmu__config_terms()
661 list_first_entry(&terms->terms, struct parse_events_term, list); in hwmon_pmu__check_alias()
663 if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER) { in hwmon_pmu__check_alias()
667 if (parse_hwmon_filename(term->config, &type, &number, in hwmon_pmu__check_alias()
669 info->unit = hwmon_units[type]; in hwmon_pmu__check_alias()
672 info->scale = 1; in hwmon_pmu__check_alias()
674 info->scale = 0.001; in hwmon_pmu__check_alias()
681 parse_events_error__handle(err, term->err_val, in hwmon_pmu__check_alias()
684 parse_events__term_type_str(term->type_term), in hwmon_pmu__check_alias()
685 term->config) < 0 in hwmon_pmu__check_alias()
690 return -EINVAL; in hwmon_pmu__check_alias()
715 if (class_hwmon_ent->d_type != DT_LNK) in perf_pmus__read_hwmon_pmus()
718 scnprintf(buf, sizeof(buf), "%s/class/hwmon/%s", sysfs, class_hwmon_ent->d_name); in perf_pmus__read_hwmon_pmus()
720 if (hwmon_dir == -1) { in perf_pmus__read_hwmon_pmus()
722 sysfs, class_hwmon_ent->d_name); in perf_pmus__read_hwmon_pmus()
726 if (name_fd == -1) { in perf_pmus__read_hwmon_pmus()
728 sysfs, class_hwmon_ent->d_name); in perf_pmus__read_hwmon_pmus()
734 if (line_len > 0 && line[line_len - 1] == '\n') in perf_pmus__read_hwmon_pmus()
735 line[line_len - 1] = '\0'; in perf_pmus__read_hwmon_pmus()
736 hwmon_pmu__new(pmus, hwmon_dir, class_hwmon_ent->d_name, line); in perf_pmus__read_hwmon_pmus()
744 #define FD(e, x, y) (*(int *)xyarray__entry(e->core.fd, x, y))
750 struct hwmon_pmu *hwm = container_of(evsel->pmu, struct hwmon_pmu, pmu); in evsel__hwmon_pmu_open()
752 .type_and_num = evsel->core.attr.config, in evsel__hwmon_pmu_open()
763 hwmon_type_strs[key.type], key.num); in evsel__hwmon_pmu_open()
765 fd = openat(hwm->hwmon_dir_fd, buf, O_RDONLY); in evsel__hwmon_pmu_open()
768 err = -errno; in evsel__hwmon_pmu_open()
776 threads->err_thread = thread; in evsel__hwmon_pmu_open()
779 while (--thread >= 0) { in evsel__hwmon_pmu_open()
782 FD(evsel, idx, thread) = -1; in evsel__hwmon_pmu_open()
785 } while (--idx >= 0); in evsel__hwmon_pmu_open()
796 if (evsel->prev_raw_counts) in evsel__hwmon_pmu_read()
797 old_count = perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread); in evsel__hwmon_pmu_read()
799 count = perf_counts(evsel->counts, cpu_map_idx, thread); in evsel__hwmon_pmu_read()
803 count->lost++; in evsel__hwmon_pmu_read()
804 return -EINVAL; in evsel__hwmon_pmu_read()
808 count->val = old_count->val + strtoll(buf, NULL, 10); in evsel__hwmon_pmu_read()
809 count->run = old_count->run + 1; in evsel__hwmon_pmu_read()
810 count->ena = old_count->ena + 1; in evsel__hwmon_pmu_read()
812 count->val = strtoll(buf, NULL, 10); in evsel__hwmon_pmu_read()
813 count->run++; in evsel__hwmon_pmu_read()
814 count->ena++; in evsel__hwmon_pmu_read()