From 00e69c8a86f9f42188fea455c2eb0797417ed7fc Mon Sep 17 00:00:00 2001 From: Riana Tauro <riana.tauro@intel.com> Date: Mon, 17 Oct 2022 11:05:17 +0530 Subject: [PATCH] lib/igt_hwmon: Introduce library igt_hwmon igt_hwmon exposes methods to open hwmon directories identified by name v2: Add license(Petri) Cc: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> --- lib/igt_hwmon.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/igt_hwmon.h | 13 +++++++++ lib/meson.build | 1 + 3 files changed, 88 insertions(+) create mode 100644 lib/igt_hwmon.c create mode 100644 lib/igt_hwmon.h diff --git a/lib/igt_hwmon.c b/lib/igt_hwmon.c new file mode 100644 index 000000000..309019d69 --- /dev/null +++ b/lib/igt_hwmon.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Intel Corporation + */ +#include <sys/stat.h> +#include <sys/sysmacros.h> +#include <dirent.h> +#include <fcntl.h> +#include <inttypes.h> +#include <unistd.h> + +#include "drmtest.h" +#include "igt_core.h" +#include "igt_hwmon.h" +#include "igt_sysfs.h" + +static char *igt_hwmon_path(int device, char *path, const char *name) +{ + char buf[80]; + int path_offset; + struct dirent *entry; + struct stat st; + DIR *dir; + + if (igt_debug_on(device < 0)) + return NULL; + + if (igt_debug_on(fstat(device, &st)) || igt_debug_on(!S_ISCHR(st.st_mode))) + return NULL; + + path_offset = snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/hwmon", + major(st.st_rdev), minor(st.st_rdev)); + + dir = opendir(path); + if (!dir) + return NULL; + + while ((entry = readdir(dir))) { + if (entry->d_name[0] == '.') + continue; + + snprintf(path + path_offset, PATH_MAX - path_offset, "/%s/name", entry->d_name); + igt_sysfs_scanf(dirfd(dir), path, "%s", buf); + + if (strncmp(buf, name, strlen(name)) == 0) { + snprintf(path + path_offset, PATH_MAX - path_offset, "/%s", entry->d_name); + closedir(dir); + return path; + } + } + + closedir(dir); + return NULL; +} + +/** + * igt_hwmon_open: + * @device: fd of the device + * + * Opens the hwmon directory corresponding to device + * + * Returns: + * The directory fd, or -1 on failure. + */ +int igt_hwmon_open(int device) +{ + char path[PATH_MAX]; + + if (!is_i915_device(device) || !igt_hwmon_path(device, path, "i915")) + return -1; + + return open(path, O_RDONLY); +} + diff --git a/lib/igt_hwmon.h b/lib/igt_hwmon.h new file mode 100644 index 000000000..e50c09389 --- /dev/null +++ b/lib/igt_hwmon.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2022 Intel Corporation + */ + +#ifndef IGT_HWMON_H +#define IGT_HWMON_H + +#include <stdbool.h> + +int igt_hwmon_open(int device); + +#endif /* IGT_HWMON_H */ diff --git a/lib/meson.build b/lib/meson.build index c665bd250..b1b8e80cb 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -24,6 +24,7 @@ lib_sources = [ 'igt_aux.c', 'igt_gt.c', 'igt_halffloat.c', + 'igt_hwmon.c', 'igt_io.c', 'igt_matrix.c', 'igt_os.c', -- GitLab