X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fdt.c;fp=discover%2Fdt.c;h=a7383e145a626c3b15af76ac083d7059d43aa4fc;hp=0000000000000000000000000000000000000000;hb=28219c8896177558892f48bef03ef7381382c420;hpb=f166fe2b62d781109e3a88736db96613af8c71d9 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 +#include +#include +#include +#include + +#include +#include + +#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; +}