summaryrefslogtreecommitdiffstats
path: root/discover/dt.c
diff options
context:
space:
mode:
Diffstat (limited to 'discover/dt.c')
-rw-r--r--discover/dt.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/discover/dt.c b/discover/dt.c
new file mode 100644
index 0000000..a7383e1
--- /dev/null
+++ b/discover/dt.c
@@ -0,0 +1,61 @@
+#include <asm/byteorder.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <talloc/talloc.h>
+#include <file/file.h>
+
+#include "dt.h"
+
+static int filter_sensors(const struct dirent *ent)
+{
+ /* Check for prefix "sensor@" */
+ return strncmp(ent->d_name, "sensor@", strlen("sensor@")) == 0;
+}
+
+int get_ipmi_sensor(void *t, enum ipmi_sensor_ids sensor_id)
+{
+ int rc, len, n;
+ struct dirent **namelist;
+ char *buf, *filename;
+ const char sensor_dir[] = "/proc/device-tree/bmc/sensors/";
+
+ n = scandir(sensor_dir, &namelist, filter_sensors, alphasort);
+ if (n <= 0)
+ return -1;
+
+ while (n--) {
+ filename = talloc_asprintf(t, "%s%s/ipmi-sensor-type",
+ sensor_dir, namelist[n]->d_name);
+ rc = read_file(t, filename, &buf, &len);
+ if (rc == 0 && len == 4 &&
+ __be32_to_cpu(*(uint32_t *)buf) == sensor_id)
+ break;
+ free(namelist[n]);
+ }
+ if (n < 0) {
+ rc = -1;
+ goto out;
+ }
+
+ filename = talloc_asprintf(t, "%s%s/reg", sensor_dir,
+ namelist[n]->d_name);
+ /* Free the rest of the scandir strings, if there are any */
+ do {
+ free(namelist[n]);
+ } while (n-- > 0);
+
+ rc = read_file(t, filename, &buf, &len);
+ if (rc != 0 || len != 4) {
+ rc = -1;
+ goto out;
+ }
+
+ rc = __be32_to_cpu(*(uint32_t *)buf);
+
+out:
+ free(namelist);
+ return rc;
+}
OpenPOWER on IntegriCloud