From 8515d723262b57176aeeda8734edbe79fe1e7a5a Mon Sep 17 00:00:00 2001 From: Patrick Mooney Date: Wed, 18 Jul 2018 21:17:19 +0000 Subject: 13085 fast_syscall state should be tracked Reviewed by: John Levon Reviewed by: Robert Mustacchi Reviewed by: Toomas Soome Approved by: Dan McDonald --- usr/src/test/os-tests/tests/i386/ldt.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 usr/src/test/os-tests/tests/i386/ldt.c (limited to 'usr/src/test/os-tests') diff --git a/usr/src/test/os-tests/tests/i386/ldt.c b/usr/src/test/os-tests/tests/i386/ldt.c old mode 100755 new mode 100644 -- cgit v1.2.3 From 1045e13a248d94941f864998aa859970ae3a4154 Mon Sep 17 00:00:00 2001 From: Robert Mustacchi Date: Fri, 24 Jul 2020 11:42:23 -0700 Subject: 13079 Add ksensor support for voltage and current sensors Reviewed by: Andy Fiddaman Reviewed by: Paul Winder Approved by: Dan McDonald --- .../lib/fm/topo/modules/common/pcibus/pci_sensor.c | 61 +++++++---- .../fm/topo/modules/common/shared/topo_sensor.c | 117 ++++++++++++--------- .../fm/topo/modules/common/shared/topo_sensor.h | 4 +- usr/src/lib/fm/topo/modules/i86pc/chip/chip_temp.c | 4 +- .../lib/fm/topo/modules/i86pc/chipset/chipset.c | 2 +- .../test/os-tests/tests/ksensor/ksensor_basic.c | 111 ++++++++++++------- usr/src/test/os-tests/tests/ksensor/ksensor_err.c | 24 ++--- .../test/os-tests/tests/ksensor/ksensor_sread.c | 12 +-- .../test/os-tests/tests/ksensor/ksensor_stress.ksh | 2 +- usr/src/uts/common/io/igb/igb_sensor.c | 17 +-- usr/src/uts/common/io/ksensor/ksensor_drv.c | 16 +-- usr/src/uts/common/io/ksensor/ksensor_test.c | 76 ++++++++++--- usr/src/uts/common/mapfiles/ksensor.mapfile | 4 +- usr/src/uts/common/os/ksensor.c | 40 +++++-- usr/src/uts/common/sys/ksensor_impl.h | 2 +- usr/src/uts/common/sys/sensors.h | 62 ++++++----- usr/src/uts/intel/io/amdf17nbdf/amdf17nbdf.c | 21 ++-- usr/src/uts/intel/io/amdnbtemp/amdnbtemp.c | 10 +- usr/src/uts/intel/io/coretemp/coretemp.c | 12 +-- usr/src/uts/intel/io/pchtemp/pchtemp.c | 10 +- 20 files changed, 384 insertions(+), 223 deletions(-) (limited to 'usr/src/test/os-tests') diff --git a/usr/src/lib/fm/topo/modules/common/pcibus/pci_sensor.c b/usr/src/lib/fm/topo/modules/common/pcibus/pci_sensor.c index bb2cf6d344..390017fd4a 100644 --- a/usr/src/lib/fm/topo/modules/common/pcibus/pci_sensor.c +++ b/usr/src/lib/fm/topo/modules/common/pcibus/pci_sensor.c @@ -29,27 +29,14 @@ #include #include -int -pci_create_dev_sensors(topo_mod_t *mod, tnode_t *dev) +static const char *pci_sensor_types[] = { "current", "voltage", "temperature" }; + +static int +pci_create_dev_scandir(topo_mod_t *mod, tnode_t *dev, const char *path) { int ret; DIR *d; - char path[PATH_MAX]; - topo_instance_t binst, dinst; struct dirent *ent; - tnode_t *parent = topo_node_parent(dev); - - binst = topo_node_instance(parent); - dinst = topo_node_instance(dev); - - if (snprintf(path, sizeof (path), "/dev/sensors/temperature/pci/%x.%x", - binst, dinst) >= sizeof (path)) { - topo_mod_dprintf(mod, "failed to construct temp sensor " - "directory path, path too long"); - return (topo_mod_seterrno(mod, EMOD_UKNOWN_ENUM)); - } - - topo_mod_dprintf(mod, "searching for sensors in %s", path); d = opendir(path); if (d == NULL) { @@ -72,24 +59,54 @@ pci_create_dev_sensors(topo_mod_t *mod, tnode_t *dev) if (snprintf(spath, sizeof (spath), "%s/%s", path, ent->d_name) >= sizeof (spath)) { - topo_mod_dprintf(mod, "failed to construct temp sensor " - "path for %s/%s, path too long", path, ent->d_name); + topo_mod_dprintf(mod, "failed to construct sensor path " + "for %s/%s, path too long", path, ent->d_name); ret = topo_mod_seterrno(mod, EMOD_UKNOWN_ENUM); goto out; } topo_mod_dprintf(mod, "attempting to create sensor at %s", spath); - if ((ret = topo_sensor_create_temp_sensor(mod, dev, spath, + if ((ret = topo_sensor_create_scalar_sensor(mod, dev, spath, ent->d_name)) < 0) { goto out; } - } + ret = 0; out: (void) closedir(d); - return (ret); } + +int +pci_create_dev_sensors(topo_mod_t *mod, tnode_t *dev) +{ + uint_t i; + char path[PATH_MAX]; + topo_instance_t binst, dinst; + tnode_t *parent = topo_node_parent(dev); + + binst = topo_node_instance(parent); + dinst = topo_node_instance(dev); + + for (i = 0; i < ARRAY_SIZE(pci_sensor_types); i++) { + int ret; + + if (snprintf(path, sizeof (path), "/dev/sensors/%s/pci/%x.%x", + pci_sensor_types[i], binst, dinst) >= sizeof (path)) { + topo_mod_dprintf(mod, "failed to construct %s sensor " + "directory path, path too long", + pci_sensor_types[i]); + return (topo_mod_seterrno(mod, EMOD_UKNOWN_ENUM)); + } + + topo_mod_dprintf(mod, "searching for sensors in %s", path); + if ((ret = pci_create_dev_scandir(mod, dev, path)) != 0) { + return (ret); + } + } + + return (0); +} diff --git a/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.c b/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.c index c9e56e9e1f..a716c57a66 100644 --- a/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.c +++ b/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.c @@ -11,13 +11,14 @@ /* * Copyright 2019, Joyent, Inc. + * Copyright 2020 Oxide Computer Company */ /* * This file provides routines to interact with the kernel sensor framework. * Currently, modules that require interacting with a kernel sensor need to * build this file as part of the module. This takes care of all the work of - * setting up and creating the temperature sensor, given a path to that sensor. + * setting up and creating the sensor, given a path to that sensor. */ #include @@ -31,21 +32,21 @@ #include #include -#define TOPO_METH_TOPO_SENSOR_TEMP "topo_sensor_temp_reading" -#define TOPO_METH_TOPO_SENSOR_TEMP_DESC "Kernel Temperature Reading" -#define TOPO_METH_TOPO_SENSOR_TEMP_VERSION 0 +#define TOPO_METH_TOPO_SENSOR_SCALAR "topo_sensor_scalar_reading" +#define TOPO_METH_TOPO_SENSOR_SCALAR_DESC "Kernel Sensor Scalar Reading" +#define TOPO_METH_TOPO_SENSOR_SCALAR_VERSION 0 static int -topo_sensor_temp_read(topo_mod_t *mod, tnode_t *node, topo_version_t vers, +topo_sensor_scalar_read(topo_mod_t *mod, tnode_t *node, topo_version_t vers, nvlist_t *in, nvlist_t **out) { int fd = -1, ret; nvlist_t *args, *nvl; char *path; - sensor_ioctl_temperature_t temp; - double degrees; + sensor_ioctl_scalar_t scalar; + double value; - if (vers != TOPO_METH_TOPO_SENSOR_TEMP_VERSION) { + if (vers != TOPO_METH_TOPO_SENSOR_SCALAR_VERSION) { return (topo_mod_seterrno(mod, ETOPO_METHOD_VERNEW)); } @@ -62,31 +63,30 @@ topo_sensor_temp_read(topo_mod_t *mod, tnode_t *node, topo_version_t vers, return (topo_mod_seterrno(mod, EMOD_UNKNOWN)); } - (void) memset(&temp, '\0', sizeof (temp)); - if (ioctl(fd, SENSOR_IOCTL_TEMPERATURE, &temp) != 0) { - topo_mod_dprintf(mod, "failed to read temperature sensor " - "%s: %s", path, strerror(errno)); + (void) memset(&scalar, '\0', sizeof (scalar)); + if (ioctl(fd, SENSOR_IOCTL_SCALAR, &scalar) != 0) { + topo_mod_dprintf(mod, "failed to read sensor %s: %s", path, + strerror(errno)); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; } /* * Check to see if we need to change the value to get it into an - * accurate reading. Positive values indicate that the temperature - * reading is in a fractional number of degrees and that each degree - * contains temp.sit_gran steps. A negative number means that the - * temperature reading represents temp.sit_gran degrees. + * accurate reading. Positive granularities indicate that the sensor + * reading is in a fractional number of units and that each unit + * contains scalar.sis_gran steps. A negative number means that the + * sensor reading represents scalar.sis_gran units. */ - degrees = (double)temp.sit_temp; - if (temp.sit_gran > 1) { - degrees /= (double)temp.sit_gran; - } else if (temp.sit_gran < -1) { - degrees *= (double)labs(temp.sit_gran); + value = (double)scalar.sis_value; + if (scalar.sis_gran > 1) { + value /= (double)scalar.sis_gran; + } else if (scalar.sis_gran < -1) { + value *= (double)labs(scalar.sis_gran); } if (topo_mod_nvalloc(mod, &nvl, NV_UNIQUE_NAME) != 0) { - topo_mod_dprintf(mod, "failed to allocate output temperature " - "nvl"); + topo_mod_dprintf(mod, "failed to allocate output nvl"); ret = topo_mod_seterrno(mod, EMOD_NOMEM); goto out; } @@ -94,9 +94,9 @@ topo_sensor_temp_read(topo_mod_t *mod, tnode_t *node, topo_version_t vers, if (nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, TOPO_SENSOR_READING) != 0 || nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, TOPO_TYPE_DOUBLE) != 0 || - nvlist_add_double(nvl, TOPO_PROP_VAL_VAL, degrees) != 0) { + nvlist_add_double(nvl, TOPO_PROP_VAL_VAL, value) != 0) { topo_mod_dprintf(mod, "failed to add members to output " - "temperature nvlist"); + "sensor nvlist"); nvlist_free(nvl); ret = topo_mod_seterrno(mod, EMOD_NOMEM); goto out; @@ -111,35 +111,40 @@ out: return (ret); } -static const topo_method_t topo_sensor_temp_fac_methods[] = { - { TOPO_METH_TOPO_SENSOR_TEMP, TOPO_METH_TOPO_SENSOR_TEMP_DESC, - TOPO_METH_TOPO_SENSOR_TEMP_VERSION, TOPO_STABILITY_INTERNAL, - topo_sensor_temp_read }, +static const topo_method_t topo_sensor_scalar_fac_methods[] = { + { TOPO_METH_TOPO_SENSOR_SCALAR, TOPO_METH_TOPO_SENSOR_SCALAR_DESC, + TOPO_METH_TOPO_SENSOR_SCALAR_VERSION, TOPO_STABILITY_INTERNAL, + topo_sensor_scalar_read }, { NULL } }; static topo_sensor_unit_t -topo_sensor_units(const sensor_ioctl_temperature_t *temp) +topo_sensor_units(const sensor_ioctl_scalar_t *scalar) { - switch (temp->sit_unit) { + switch (scalar->sis_unit) { case SENSOR_UNIT_CELSIUS: return (TOPO_SENSOR_UNITS_DEGREES_C); case SENSOR_UNIT_FAHRENHEIT: return (TOPO_SENSOR_UNITS_DEGREES_F); case SENSOR_UNIT_KELVIN: return (TOPO_SENSOR_UNITS_DEGREES_K); + case SENSOR_UNIT_VOLTS: + return (TOPO_SENSOR_UNITS_VOLTS); + case SENSOR_UNIT_AMPS: + return (TOPO_SENSOR_UNITS_AMPS); default: return (TOPO_SENSOR_UNITS_UNSPECIFIED); } } int -topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, +topo_sensor_create_scalar_sensor(topo_mod_t *mod, tnode_t *pnode, const char *path, const char *fname) { int fd, ret, err; sensor_ioctl_kind_t sik; - sensor_ioctl_temperature_t temp; + sensor_ioctl_scalar_t scalar; + uint32_t topo_type; tnode_t *fnode = NULL; topo_pgroup_info_t pgi; nvlist_t *reader_arg = NULL; @@ -148,16 +153,16 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, topo_node_name(pnode), path); (void) memset(&sik, '\0', sizeof (sik)); - (void) memset(&temp, '\0', sizeof (temp)); + (void) memset(&scalar, '\0', sizeof (scalar)); if ((fd = open(path, O_RDONLY)) < 0) { topo_mod_dprintf(mod, "failed to open sensor path %s: %s", path, strerror(errno)); /* - * We always try to create temperature sensors; however, they - * may not exist or be supported on the system in question. - * Therefore ENOENT is totally acceptable. + * We always try to create sensors; however, they may not exist + * or be supported on the system in question. Therefore ENOENT + * is totally acceptable. */ if (errno == ENOENT) { return (0); @@ -165,23 +170,34 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, return (topo_mod_seterrno(mod, EMOD_UNKNOWN)); } - if (ioctl(fd, SENSOR_IOCTL_TYPE, &sik) != 0) { + if (ioctl(fd, SENSOR_IOCTL_KIND, &sik) != 0) { topo_mod_dprintf(mod, "failed to verify sensor kind for sensor " "%s: %s", path, strerror(errno)); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; } - if (sik.sik_kind != SENSOR_KIND_TEMPERATURE) { - topo_mod_dprintf(mod, "sensor kind for %s is not temperature, " - "found 0x%x", path, sik.sik_kind); + switch (sik.sik_kind) { + case SENSOR_KIND_TEMPERATURE: + topo_type = TOPO_SENSOR_TYPE_TEMP; + break; + case SENSOR_KIND_VOLTAGE: + topo_type = TOPO_SENSOR_TYPE_VOLTAGE; + break; + case SENSOR_KIND_CURRENT: + topo_type = TOPO_SENSOR_TYPE_CURRENT; + break; + default: + topo_mod_dprintf(mod, "unknown sensor kind for %s, found 0x%x", + path, sik.sik_kind); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; + } - if (ioctl(fd, SENSOR_IOCTL_TEMPERATURE, &temp) != 0) { - topo_mod_dprintf(mod, "failed to read temperature sensor " - "%s: %s", path, strerror(errno)); + if (ioctl(fd, SENSOR_IOCTL_SCALAR, &scalar) != 0) { + topo_mod_dprintf(mod, "failed to read scalar sensor %s: %s", + path, strerror(errno)); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; } @@ -191,7 +207,7 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, if ((fnode = topo_node_facbind(mod, pnode, fname, TOPO_FAC_TYPE_SENSOR)) == NULL) { - topo_mod_dprintf(mod, "failed to bind temperature facility " + topo_mod_dprintf(mod, "failed to bind sensor facility " "node to %s: %d", path, topo_mod_errno(mod)); ret = -1; goto out; @@ -213,10 +229,9 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, TOPO_SENSOR_CLASS, TOPO_PROP_IMMUTABLE, TOPO_SENSOR_CLASS_THRESHOLD, &err) != 0 || topo_prop_set_uint32(fnode, TOPO_PGROUP_FACILITY, - TOPO_FACILITY_TYPE, TOPO_PROP_IMMUTABLE, TOPO_SENSOR_TYPE_TEMP, - &err) != 0 || + TOPO_FACILITY_TYPE, TOPO_PROP_IMMUTABLE, topo_type, &err) != 0 || topo_prop_set_uint32(fnode, TOPO_PGROUP_FACILITY, - TOPO_SENSOR_UNITS, TOPO_PROP_IMMUTABLE, topo_sensor_units(&temp), + TOPO_SENSOR_UNITS, TOPO_PROP_IMMUTABLE, topo_sensor_units(&scalar), &err) != 0) { topo_mod_dprintf(mod, "failed to set properties for sensor " "%s: %s", path, topo_strerror(err)); @@ -225,7 +240,7 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, } - if (topo_method_register(mod, fnode, topo_sensor_temp_fac_methods) < + if (topo_method_register(mod, fnode, topo_sensor_scalar_fac_methods) < 0) { topo_mod_dprintf(mod, "failed to register reading methods on " "%s", path); @@ -241,7 +256,7 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, } if (topo_prop_method_register(fnode, TOPO_PGROUP_FACILITY, - TOPO_SENSOR_READING, TOPO_TYPE_DOUBLE, TOPO_METH_TOPO_SENSOR_TEMP, + TOPO_SENSOR_READING, TOPO_TYPE_DOUBLE, TOPO_METH_TOPO_SENSOR_SCALAR, reader_arg, &err) != 0) { topo_mod_dprintf(mod, "failed to set argument for sensor %s: " "%s", path, topo_strerror(err)); @@ -249,6 +264,8 @@ topo_sensor_create_temp_sensor(topo_mod_t *mod, tnode_t *pnode, goto out; } + topo_mod_dprintf(mod, "created sensor at %s", path); + nvlist_free(reader_arg); return (0); out: diff --git a/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.h b/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.h index ff6e1ea92e..753dcbd8d8 100644 --- a/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.h +++ b/usr/src/lib/fm/topo/modules/common/shared/topo_sensor.h @@ -24,8 +24,8 @@ extern "C" { #endif -extern int topo_sensor_create_temp_sensor(topo_mod_t *, tnode_t *, const char *, - const char *); +extern int topo_sensor_create_scalar_sensor(topo_mod_t *, tnode_t *, + const char *, const char *); #ifdef __cplusplus } diff --git a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_temp.c b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_temp.c index 89f8d57fb6..f06190bb46 100644 --- a/usr/src/lib/fm/topo/modules/i86pc/chip/chip_temp.c +++ b/usr/src/lib/fm/topo/modules/i86pc/chip/chip_temp.c @@ -71,7 +71,7 @@ chip_create_core_temp_sensor(topo_mod_t *mod, tnode_t *pnode) } } - return (topo_sensor_create_temp_sensor(mod, pnode, buf, "temp")); + return (topo_sensor_create_scalar_sensor(mod, pnode, buf, "temp")); } int @@ -87,5 +87,5 @@ chip_create_chip_temp_sensor(topo_mod_t *mod, tnode_t *pnode) return (topo_mod_seterrno(mod, EMOD_UNKNOWN)); } - return (topo_sensor_create_temp_sensor(mod, pnode, buf, "temp")); + return (topo_sensor_create_scalar_sensor(mod, pnode, buf, "temp")); } diff --git a/usr/src/lib/fm/topo/modules/i86pc/chipset/chipset.c b/usr/src/lib/fm/topo/modules/i86pc/chipset/chipset.c index cc306b4b2f..2f3781c932 100644 --- a/usr/src/lib/fm/topo/modules/i86pc/chipset/chipset.c +++ b/usr/src/lib/fm/topo/modules/i86pc/chipset/chipset.c @@ -136,7 +136,7 @@ topo_chipset_enum(topo_mod_t *mod, tnode_t *pnode, const char *name, /* * Finally, create the temperature sensor. */ - if ((ret = topo_sensor_create_temp_sensor(mod, tn, + if ((ret = topo_sensor_create_scalar_sensor(mod, tn, topo_chipset_temp_sensor, "temp")) != 0) { topo_mod_dprintf(mod, "failed to create chipset temperature " "sensor"); diff --git a/usr/src/test/os-tests/tests/ksensor/ksensor_basic.c b/usr/src/test/os-tests/tests/ksensor/ksensor_basic.c index 35590df264..22f79d18a7 100644 --- a/usr/src/test/os-tests/tests/ksensor/ksensor_basic.c +++ b/usr/src/test/os-tests/tests/ksensor/ksensor_basic.c @@ -26,66 +26,101 @@ #include #include #include +#include -static const char *ksensor_path = "/dev/sensors/test/test.temp.0.1"; +typedef struct sensor_test { + const char *st_path; + uint64_t st_kind; + uint32_t st_unit; + int32_t st_gran; + uint32_t st_prec; + int64_t st_val; +} sensor_test_t; -int -main(void) +/* + * These values come from the dummy sensors in the ksensor_test driver. + */ +static sensor_test_t ksensor_basic_tests[] = { + { "/dev/sensors/test/test.temp.0.1", SENSOR_KIND_TEMPERATURE, + SENSOR_UNIT_CELSIUS, 4, -2, 23 }, + { "/dev/sensors/test/test.volt.0.1", SENSOR_KIND_VOLTAGE, + SENSOR_UNIT_VOLTS, 1000, 0, 3300 }, + { "/dev/sensors/test/test.current.0.1", SENSOR_KIND_CURRENT, + SENSOR_UNIT_AMPS, 10, 0, 5 }, +}; + +static boolean_t +ksensor_basic(sensor_test_t *st) { sensor_ioctl_kind_t kind; - sensor_ioctl_temperature_t temp; - int ret = 0; + sensor_ioctl_scalar_t scalar; + int fd; - int fd = open(ksensor_path, O_RDONLY); + fd = open(st->st_path, O_RDONLY); if (fd < 0) { - err(EXIT_FAILURE, "TEST FAILED: failed to open %s", - ksensor_path); + warn("TEST FAILED: failed to open %s", st->st_path); + return (B_FALSE); } arc4random_buf(&kind, sizeof (kind)); - arc4random_buf(&temp, sizeof (temp)); + arc4random_buf(&scalar, sizeof (scalar)); + + if (ioctl(fd, SENSOR_IOCTL_KIND, &kind) != 0) { + warn("TEST FAILED: %s: failed to get sensor kind", st->st_path); + goto err; + } - if (ioctl(fd, SENSOR_IOCTL_TYPE, &kind) != 0) { - warn("TEST FAILED: failed to get sensor type"); - ret = EXIT_FAILURE; + if (kind.sik_kind != st->st_kind) { + warnx("TEST FAILED: %s: expected kind %" PRIu64 ", found kind %" + PRIu64, st->st_path, st->st_kind, kind); + goto err; } - if (kind.sik_kind != SENSOR_KIND_TEMPERATURE) { - warnx("TEST FAILED: expected temperature sensor, found kind %d", - kind); - ret = EXIT_FAILURE; + if (ioctl(fd, SENSOR_IOCTL_SCALAR, &scalar) != 0) { + warn("TEST FAILED: %s: failed to read sensor", st->st_path); + goto err; } - if (ioctl(fd, SENSOR_IOCTL_TEMPERATURE, &temp) != 0) { - warn("TEST FAILED: failed to get sensor temperature"); - ret = EXIT_FAILURE; + if (scalar.sis_unit != st->st_unit) { + warnx("TEST FAILED: %s: expected unit %" PRIu32 ", but found " + "%" PRIu32, st->st_path, st->st_unit, scalar.sis_unit); + goto err; } - /* - * These values come from the dummy temperature sensor in ksensor_test. - */ - if (temp.sit_unit != SENSOR_UNIT_CELSIUS) { - warnx("TEST FAILED: expected temp unit %" PRIu32 ", but found " - "%" PRIu32, SENSOR_UNIT_CELSIUS, temp.sit_unit); - ret = EXIT_FAILURE; + if (scalar.sis_gran != st->st_gran) { + warnx("TEST FAILED: %s: expected gran %" PRId32 ", but found " + "%" PRId32, st->st_path, st->st_gran, scalar.sis_gran); + goto err; } - if (temp.sit_gran != 4) { - warnx("TEST FAILED: expected temp gran %" PRId32 ", but found " - "%" PRId32, 4, temp.sit_gran); - ret = EXIT_FAILURE; + if (scalar.sis_prec != st->st_prec) { + warnx("TEST FAILED: %s: expected prec %" PRIu32 ", but found " + "%" PRIu32, st->st_path, st->st_prec, scalar.sis_prec); + goto err; } - if (temp.sit_prec != -2) { - warnx("TEST FAILED: expected temp prec %" PRId32 ", but found " - "%" PRId32, -2, temp.sit_prec); - ret = EXIT_FAILURE; + if (scalar.sis_value != st->st_val) { + warnx("TEST FAILED: %s: expected value %" PRId64 ", but found " + "%" PRId64, st->st_path, st->st_val, scalar.sis_value); + goto err; } - if (temp.sit_temp != 23) { - warnx("TEST FAILED: expected temp %" PRId64 ", but found " - "%" PRId64, 23, temp.sit_temp); - ret = EXIT_FAILURE; + return (B_TRUE); +err: + (void) close(fd); + return (B_FALSE); +} + +int +main(void) +{ + size_t i; + int ret = EXIT_SUCCESS; + + for (i = 0; i < ARRAY_SIZE(ksensor_basic_tests); i++) { + if (!ksensor_basic(&ksensor_basic_tests[i])) { + ret = EXIT_FAILURE; + } } return (ret); diff --git a/usr/src/test/os-tests/tests/ksensor/ksensor_err.c b/usr/src/test/os-tests/tests/ksensor/ksensor_err.c index 2818327f78..784dc477d8 100644 --- a/usr/src/test/os-tests/tests/ksensor/ksensor_err.c +++ b/usr/src/test/os-tests/tests/ksensor/ksensor_err.c @@ -39,20 +39,20 @@ error_kind(int fd, int exp) arc4random_buf(&alt_kind, sizeof (alt_kind)); (void) memcpy(&kind, &alt_kind, sizeof (alt_kind)); - if (ioctl(fd, SENSOR_IOCTL_TYPE, &kind) == 0) { - warnx("TEST FAILED: SENSIOR_IOCTL_TYPE succeeded on EIO " + if (ioctl(fd, SENSOR_IOCTL_KIND, &kind) == 0) { + warnx("TEST FAILED: SENSOR_IOCTL_KIND succeeded on EIO " "sensor"); error_exit = EXIT_FAILURE; } if (errno != exp) { - warnx("TEST FAILED: SENSIOR_IOCTL_TYPE got errno %d, " + warnx("TEST FAILED: SENSOR_IOCTL_KIND got errno %d, " "expected %d", errno, exp); error_exit = EXIT_FAILURE; } if (memcmp(&kind, &alt_kind, sizeof (alt_kind)) != 0) { - warnx("TEST FAILED: SENSIOR_IOCTL_TYPE modified data on error"); + warnx("TEST FAILED: SENSOR_IOCTL_KIND modified data on error"); error_exit = EXIT_FAILURE; } } @@ -60,25 +60,25 @@ error_kind(int fd, int exp) static void error_temp(int fd, int exp) { - sensor_ioctl_temperature_t temp, alt_temp; + sensor_ioctl_scalar_t scalar, alt_scalar; - arc4random_buf(&alt_temp, sizeof (alt_temp)); - (void) memcpy(&temp, &alt_temp, sizeof (alt_temp)); + arc4random_buf(&alt_scalar, sizeof (alt_scalar)); + (void) memcpy(&scalar, &alt_scalar, sizeof (alt_scalar)); - if (ioctl(fd, SENSOR_IOCTL_TEMPERATURE, &temp) == 0) { - warnx("TEST FAILED: SENSIOR_IOCTL_TEMPERATURE suceeded on " + if (ioctl(fd, SENSOR_IOCTL_SCALAR, &scalar) == 0) { + warnx("TEST FAILED: SENSIOR_IOCTL_SCALAR suceeded on " "EIO sensor"); error_exit = EXIT_FAILURE; } if (errno != exp) { - warnx("TEST FAILED: SENSIOR_IOCTL_TEMPERATURE got errno %d, " + warnx("TEST FAILED: SENSIOR_IOCTL_SCALAR got errno %d, " "expected %d", errno, EIO); error_exit = EXIT_FAILURE; } - if (memcmp(&temp, &alt_temp, sizeof (alt_temp)) != 0) { - warnx("TEST FAILED: SENSIOR_IOCTL_TEMPERATURE modified " + if (memcmp(&scalar, &alt_scalar, sizeof (alt_scalar)) != 0) { + warnx("TEST FAILED: SENSIOR_IOCTL_SCALAR modified " "data on error"); error_exit = EXIT_FAILURE; } diff --git a/usr/src/test/os-tests/tests/ksensor/ksensor_sread.c b/usr/src/test/os-tests/tests/ksensor/ksensor_sread.c index fef8b78f73..42be85f10e 100644 --- a/usr/src/test/os-tests/tests/ksensor/ksensor_sread.c +++ b/usr/src/test/os-tests/tests/ksensor/ksensor_sread.c @@ -58,7 +58,7 @@ main(int argc, const char *argv[]) char buf[PATH_MAX]; uint32_t sens, inst; struct timespec ts; - sensor_ioctl_temperature_t temp; + sensor_ioctl_scalar_t scalar; /* 0s based */ sens = arc4random_uniform(nsensors); @@ -73,15 +73,15 @@ main(int argc, const char *argv[]) goto wait; } - bzero(&temp, sizeof (temp)); - if (ioctl(fd, SENSOR_IOCTL_TEMPERATURE, &temp) != 0) { - warn("failed to get sensor temp on %s", buf); + bzero(&scalar, sizeof (scalar)); + if (ioctl(fd, SENSOR_IOCTL_SCALAR, &scalar) != 0) { + warn("failed to get sensor temperature on %s", buf); } - if (temp.sit_unit != SENSOR_UNIT_CELSIUS) { + if (scalar.sis_unit != SENSOR_UNIT_CELSIUS) { warnx("data from sensor %s looks off, expected sensor " "to indicate Celsius, but instead %u", - temp.sit_unit); + scalar.sis_unit); } (void) close(fd); diff --git a/usr/src/test/os-tests/tests/ksensor/ksensor_stress.ksh b/usr/src/test/os-tests/tests/ksensor/ksensor_stress.ksh index 805e464eb0..9a27a151ff 100644 --- a/usr/src/test/os-tests/tests/ksensor/ksensor_stress.ksh +++ b/usr/src/test/os-tests/tests/ksensor/ksensor_stress.ksh @@ -50,7 +50,7 @@ fi if [[ ! -L "$sensor_base/test.temp.0.1" ]]; then - printf "missing ksensor test data, ksensor_temp driver loaded\n" 2>&1 + printf "missing ksensor test data, ksensor_tstp driver loaded?\n" 2>&1 exit 1 fi diff --git a/usr/src/uts/common/io/igb/igb_sensor.c b/usr/src/uts/common/io/igb/igb_sensor.c index b233af2a92..3b41a853c0 100644 --- a/usr/src/uts/common/io/igb/igb_sensor.c +++ b/usr/src/uts/common/io/igb/igb_sensor.c @@ -72,7 +72,7 @@ #define EMC1413_REG_EXT3_DIODE_LO 0x2b static int -igb_sensor_reg_temp(void *arg, sensor_ioctl_temperature_t *temp) +igb_sensor_reg_temperature(void *arg, sensor_ioctl_scalar_t *scalar) { igb_t *igb = arg; uint32_t reg; @@ -87,17 +87,17 @@ igb_sensor_reg_temp(void *arg, sensor_ioctl_temperature_t *temp) return (EIO); } - temp->sit_unit = SENSOR_UNIT_CELSIUS; - temp->sit_gran = E1000_THMJT_RESOLUTION; - temp->sit_prec = E1000_THMJT_PRECISION; - temp->sit_temp = E1000_THMJT_TEMP(reg); + scalar->sis_unit = SENSOR_UNIT_CELSIUS; + scalar->sis_gran = E1000_THMJT_RESOLUTION; + scalar->sis_prec = E1000_THMJT_PRECISION; + scalar->sis_value = E1000_THMJT_TEMP(reg); return (0); } static const ksensor_ops_t igb_sensor_reg_ops = { .kso_kind = ksensor_kind_temperature, - .kso_temp = igb_sensor_reg_temp + .kso_scalar = igb_sensor_reg_temperature }; static boolean_t @@ -106,8 +106,9 @@ igb_sensors_create_minors(igb_t *igb) int ret; igb_sensors_t *sp = &igb->igb_sensors; - if ((ret = ksensor_create_temp_pcidev(igb->dip, &igb_sensor_reg_ops, - igb, "builtin", &sp->isn_reg_ksensor)) != 0) { + if ((ret = ksensor_create_scalar_pcidev(igb->dip, + SENSOR_KIND_TEMPERATURE, &igb_sensor_reg_ops, igb, "builtin", + &sp->isn_reg_ksensor)) != 0) { igb_log(igb, IGB_LOG_ERROR, "failed to create main sensor: %d", ret); return (B_FALSE); diff --git a/usr/src/uts/common/io/ksensor/ksensor_drv.c b/usr/src/uts/common/io/ksensor/ksensor_drv.c index 6810e11758..70e99287a2 100644 --- a/usr/src/uts/common/io/ksensor/ksensor_drv.c +++ b/usr/src/uts/common/io/ksensor/ksensor_drv.c @@ -90,15 +90,15 @@ ksensor_ioctl_kind(minor_t min, intptr_t arg, int mode) } static int -ksensor_ioctl_temp(minor_t min, intptr_t arg, int mode) +ksensor_ioctl_scalar(minor_t min, intptr_t arg, int mode) { int ret; - sensor_ioctl_temperature_t temp; + sensor_ioctl_scalar_t scalar; - bzero(&temp, sizeof (temp)); - ret = ksensor_op_temperature((id_t)min, &temp); + bzero(&scalar, sizeof (scalar)); + ret = ksensor_op_scalar((id_t)min, &scalar); if (ret == 0) { - if (ddi_copyout(&temp, (void *)arg, sizeof (temp), + if (ddi_copyout(&scalar, (void *)arg, sizeof (scalar), mode & FKIOCTL) != 0) { ret = EFAULT; } @@ -118,10 +118,10 @@ ksensor_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, m = getminor(dev); switch (cmd) { - case SENSOR_IOCTL_TYPE: + case SENSOR_IOCTL_KIND: return (ksensor_ioctl_kind(m, arg, mode)); - case SENSOR_IOCTL_TEMPERATURE: - return (ksensor_ioctl_temp(m, arg, mode)); + case SENSOR_IOCTL_SCALAR: + return (ksensor_ioctl_scalar(m, arg, mode)); default: return (ENOTTY); } diff --git a/usr/src/uts/common/io/ksensor/ksensor_test.c b/usr/src/uts/common/io/ksensor/ksensor_test.c index ea71ab5559..a98a8b77eb 100644 --- a/usr/src/uts/common/io/ksensor/ksensor_test.c +++ b/usr/src/uts/common/io/ksensor/ksensor_test.c @@ -32,21 +32,53 @@ typedef struct ksensor_test { id_t kt_sensor3; id_t kt_sensor4; id_t kt_sensor5; + id_t kt_volt; + id_t kt_current; } ksensor_test_t; static int -ksensor_test_temperature(void *arg, sensor_ioctl_temperature_t *temp) +ksensor_test_temp(void *arg, sensor_ioctl_scalar_t *scalar) { - temp->sit_unit = SENSOR_UNIT_CELSIUS; - temp->sit_gran = 4; - temp->sit_prec = -2; - temp->sit_temp = 23; + scalar->sis_unit = SENSOR_UNIT_CELSIUS; + scalar->sis_gran = 4; + scalar->sis_prec = -2; + scalar->sis_value = 23; return (0); } static const ksensor_ops_t ksensor_test_temp_ops = { - ksensor_kind_temperature, - ksensor_test_temperature + .kso_kind = ksensor_kind_temperature, + .kso_scalar = ksensor_test_temp +}; + +static int +ksensor_test_volt(void *arg, sensor_ioctl_scalar_t *scalar) +{ + scalar->sis_unit = SENSOR_UNIT_VOLTS; + scalar->sis_gran = 1000; + scalar->sis_prec = 0; + scalar->sis_value = 3300; + return (0); +} + +static const ksensor_ops_t ksensor_test_volt_ops = { + .kso_kind = ksensor_kind_voltage, + .kso_scalar = ksensor_test_volt +}; + +static int +ksensor_test_current(void *arg, sensor_ioctl_scalar_t *scalar) +{ + scalar->sis_unit = SENSOR_UNIT_AMPS; + scalar->sis_gran = 10; + scalar->sis_prec = 0; + scalar->sis_value = 5; + return (0); +} + +static const ksensor_ops_t ksensor_test_current_ops = { + .kso_kind = ksensor_kind_current, + .kso_scalar = ksensor_test_current }; static int @@ -56,14 +88,14 @@ ksensor_test_kind_eio(void *arg, sensor_ioctl_kind_t *kindp) } static int -ksensor_test_temp_eio(void *arg, sensor_ioctl_temperature_t *tempp) +ksensor_test_temp_eio(void *arg, sensor_ioctl_scalar_t *scalar) { return (EIO); } static const ksensor_ops_t ksensor_test_eio_ops = { - ksensor_test_kind_eio, - ksensor_test_temp_eio + .kso_kind = ksensor_test_kind_eio, + .kso_scalar = ksensor_test_temp_eio }; static int @@ -107,7 +139,7 @@ ksensor_test_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) ddi_get_instance(dip)); if ((ret = ksensor_create(dip, &ksensor_test_temp_ops, NULL, buf, "ddi_sensor:test", &kt->kt_sensor3)) != 0) { - dev_err(dip, CE_WARN, "failed to attatch sensor %s: %d", buf, + dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf, ret); goto err; } @@ -116,7 +148,7 @@ ksensor_test_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) ddi_get_instance(dip)); if ((ret = ksensor_create(dip, &ksensor_test_temp_ops, NULL, buf, "ddi_sensor:test", &kt->kt_sensor4)) != 0) { - dev_err(dip, CE_WARN, "failed to attatch sensor %s: %d", buf, + dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf, ret); goto err; } @@ -125,7 +157,25 @@ ksensor_test_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) ddi_get_instance(dip)); if ((ret = ksensor_create(dip, &ksensor_test_eio_ops, NULL, buf, "ddi_sensor:test", &kt->kt_sensor5)) != 0) { - dev_err(dip, CE_WARN, "failed to attatch sensor %s: %d", buf, + dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf, + ret); + goto err; + } + + (void) snprintf(buf, sizeof (buf), "test.volt.%d.1", + ddi_get_instance(dip)); + if ((ret = ksensor_create(dip, &ksensor_test_volt_ops, NULL, buf, + "ddi_sensor:test", &kt->kt_volt)) != 0) { + dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf, + ret); + goto err; + } + + (void) snprintf(buf, sizeof (buf), "test.current.%d.1", + ddi_get_instance(dip)); + if ((ret = ksensor_create(dip, &ksensor_test_current_ops, NULL, buf, + "ddi_sensor:test", &kt->kt_current)) != 0) { + dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf, ret); goto err; } diff --git a/usr/src/uts/common/mapfiles/ksensor.mapfile b/usr/src/uts/common/mapfiles/ksensor.mapfile index 0374c957f7..51b65a2b9d 100644 --- a/usr/src/uts/common/mapfiles/ksensor.mapfile +++ b/usr/src/uts/common/mapfiles/ksensor.mapfile @@ -36,8 +36,10 @@ $mapfile_version 2 SYMBOL_SCOPE { global: ksensor_create { FLAGS = EXTERN }; - ksensor_create_temp_pcidev { FLAGS = EXTERN }; + ksensor_create_scalar_pcidev { FLAGS = EXTERN }; ksensor_remove { FLAGS = EXTERN }; + ksensor_kind_current { FLAGS = EXTERN }; ksensor_kind_temperature { FLAGS = EXTERN }; + ksensor_kind_voltage { FLAGS = EXTERN }; }; diff --git a/usr/src/uts/common/os/ksensor.c b/usr/src/uts/common/os/ksensor.c index c89cad4206..491fbcc7cd 100644 --- a/usr/src/uts/common/os/ksensor.c +++ b/usr/src/uts/common/os/ksensor.c @@ -544,14 +544,29 @@ ksensor_create(dev_info_t *dip, const ksensor_ops_t *ops, void *arg, } int -ksensor_create_temp_pcidev(dev_info_t *dip, const ksensor_ops_t *ops, - void *arg, const char *name, id_t *idp) +ksensor_create_scalar_pcidev(dev_info_t *dip, uint_t kind, + const ksensor_ops_t *ops, void *arg, const char *name, id_t *idp) { char *pci_name, *type; + const char *class; int *regs, ret; uint_t nregs; uint16_t bus, dev; + switch (kind) { + case SENSOR_KIND_TEMPERATURE: + class = "ddi_sensor:temperature:pci"; + break; + case SENSOR_KIND_VOLTAGE: + class = "ddi_sensor:voltage:pci"; + break; + case SENSOR_KIND_CURRENT: + class = "ddi_sensor:current:pci"; + break; + default: + return (ENOTSUP); + } + if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0, "device_type", &type) != DDI_PROP_SUCCESS) { return (EINVAL); @@ -579,8 +594,7 @@ ksensor_create_temp_pcidev(dev_info_t *dip, const ksensor_ops_t *ops, pci_name = kmem_asprintf("%x.%x:%s", bus, dev, name); - ret = ksensor_create(dip, ops, arg, pci_name, - "ddi_sensor:temperature:pci", idp); + ret = ksensor_create(dip, ops, arg, pci_name, class, idp); strfree(pci_name); return (ret); } @@ -750,7 +764,7 @@ ksensor_op_kind(id_t id, sensor_ioctl_kind_t *kind) } int -ksensor_op_temperature(id_t id, sensor_ioctl_temperature_t *temp) +ksensor_op_scalar(id_t id, sensor_ioctl_scalar_t *scalar) { int ret; ksensor_t *sensor; @@ -759,7 +773,7 @@ ksensor_op_temperature(id_t id, sensor_ioctl_temperature_t *temp) return (ret); } - ret = sensor->ksensor_ops->kso_temp(sensor->ksensor_arg, temp); + ret = sensor->ksensor_ops->kso_scalar(sensor->ksensor_arg, scalar); ksensor_release(sensor); return (ret); @@ -831,6 +845,20 @@ ksensor_kind_temperature(void *unused, sensor_ioctl_kind_t *k) return (0); } +int +ksensor_kind_current(void *unused, sensor_ioctl_kind_t *k) +{ + k->sik_kind = SENSOR_KIND_CURRENT; + return (0); +} + +int +ksensor_kind_voltage(void *unused, sensor_ioctl_kind_t *k) +{ + k->sik_kind = SENSOR_KIND_VOLTAGE; + return (0); +} + void ksensor_init(void) { diff --git a/usr/src/uts/common/sys/ksensor_impl.h b/usr/src/uts/common/sys/ksensor_impl.h index 8d91973bc3..7407a264a2 100644 --- a/usr/src/uts/common/sys/ksensor_impl.h +++ b/usr/src/uts/common/sys/ksensor_impl.h @@ -35,7 +35,7 @@ extern void ksensor_init(void); * Operations vectors. */ extern int ksensor_op_kind(id_t, sensor_ioctl_kind_t *); -extern int ksensor_op_temperature(id_t, sensor_ioctl_temperature_t *); +extern int ksensor_op_scalar(id_t, sensor_ioctl_scalar_t *); /* * Registration callbacks. diff --git a/usr/src/uts/common/sys/sensors.h b/usr/src/uts/common/sys/sensors.h index a39dfca239..a5d830a933 100644 --- a/usr/src/uts/common/sys/sensors.h +++ b/usr/src/uts/common/sys/sensors.h @@ -33,6 +33,8 @@ extern "C" { */ #define SENSOR_KIND_UNKNOWN 0x00 #define SENSOR_KIND_TEMPERATURE 0x01 +#define SENSOR_KIND_VOLTAGE 0x02 +#define SENSOR_KIND_CURRENT 0x03 /* * Lists of units that senors may have. @@ -41,52 +43,60 @@ extern "C" { #define SENSOR_UNIT_CELSIUS 0x01 #define SENSOR_UNIT_FAHRENHEIT 0x02 #define SENSOR_UNIT_KELVIN 0x03 +#define SENSOR_UNIT_VOLTS 0x04 +#define SENSOR_UNIT_AMPS 0x05 #define SENSOR_IOCTL (('s' << 24) | ('e' << 16) | ('n' << 8)) /* * Ask the sensor what kind of sensor it is. */ -#define SENSOR_IOCTL_TYPE (SENSOR_IOCTL | 0x01) +#define SENSOR_IOCTL_KIND (SENSOR_IOCTL | 0x01) typedef struct sensor_ioctl_kind { uint64_t sik_kind; } sensor_ioctl_kind_t; /* - * Ask the sensor for a temperature measurement. The sensor is responsible for - * returning the units it's in. A temperature measurement is broken down into a + * Ask the sensor for a scalar measurement. The sensor is responsible for + * returning the units it's in. A scalar measurement is broken down into a * signed value and a notion of its granularity. The sit_gran member indicates - * the granularity: the number of increments per degree in the temperature - * measurement (the sit_temp member). sit_gran is signed and the sign indicates - * whether one needs to multiply or divide the granularity. For example, a - * value that set sit_gran to 10 would mean that the value in sit_temp was in - * 10ths of a degree and that to get the actual value in degrees, one would - * divide by 10. On the other hand, a negative value means that we effectively - * have to multiply to get there. For example, a value of -2 would indicate that - * each value in sit_temp indicated two degrees and to get the temperature in - * degrees you would multiply sit_temp by two. + * the granularity: the number of increments per unit in the measurement (the + * sit_value member). sit_gran is signed and the sign indicates whether one + * needs to multiply or divide the granularity. The sit_prec member describes a + * +/- value (taking sit_gran into account) that describes the precision of the + * sensor. + * + * For example, consider a temperature sensor that set sit_gran to 10. This + * would mean that the value in sit_value was in 10ths of a degree and that to + * get the actual value in degrees, one would divide by 10. On the other hand, a + * negative value means that we effectively have to multiply to get there. For + * example, a value of -2 would indicate that each value in sit_value indicated + * two degrees and to get the temperature in degrees you would multiply + * sit_value * by two. */ -#define SENSOR_IOCTL_TEMPERATURE (SENSOR_IOCTL | 0x02) +#define SENSOR_IOCTL_SCALAR (SENSOR_IOCTL | 0x02) -typedef struct sensor_ioctl_temperature { - uint32_t sit_unit; - int32_t sit_gran; - uint32_t sit_prec; - uint32_t sit_pad; - int64_t sit_temp; -} sensor_ioctl_temperature_t; +typedef struct sensor_ioctl_scalar { + uint32_t sis_unit; + int32_t sis_gran; + uint32_t sis_prec; + uint32_t sis_pad; + int64_t sis_value; +} sensor_ioctl_scalar_t; #ifdef _KERNEL typedef int (*ksensor_kind_f)(void *, sensor_ioctl_kind_t *); -typedef int (*ksensor_temp_f)(void *, sensor_ioctl_temperature_t *); +typedef int (*ksensor_scalar_f)(void *, sensor_ioctl_scalar_t *); typedef struct { - ksensor_kind_f kso_kind; - ksensor_temp_f kso_temp; + ksensor_kind_f kso_kind; + ksensor_scalar_f kso_scalar; } ksensor_ops_t; extern int ksensor_kind_temperature(void *, sensor_ioctl_kind_t *); +extern int ksensor_kind_voltage(void *, sensor_ioctl_kind_t *); +extern int ksensor_kind_current(void *, sensor_ioctl_kind_t *); /* * Create a sensor where the class and name is supplied. @@ -95,11 +105,11 @@ extern int ksensor_create(dev_info_t *, const ksensor_ops_t *, void *, const char *, const char *, id_t *); /* - * Create a temperature sensor for a PCI device. If this is not a device-wide + * Create a scalar sensor for a PCI device. If this is not a device-wide * (e.g. per-function) sensor, this should not be used. */ -extern int ksensor_create_temp_pcidev(dev_info_t *, const ksensor_ops_t *, - void *, const char *, id_t *); +extern int ksensor_create_scalar_pcidev(dev_info_t *, uint_t, + const ksensor_ops_t *, void *, const char *, id_t *); /* * Remove a named or all sensors from this driver. diff --git a/usr/src/uts/intel/io/amdf17nbdf/amdf17nbdf.c b/usr/src/uts/intel/io/amdf17nbdf/amdf17nbdf.c index 6b7da6a99a..7be8a4a9f8 100644 --- a/usr/src/uts/intel/io/amdf17nbdf/amdf17nbdf.c +++ b/usr/src/uts/intel/io/amdf17nbdf/amdf17nbdf.c @@ -684,13 +684,14 @@ amdf17nbdf_ioctl_kind(intptr_t arg, int mode) } static int -amdf17nbdf_ioctl_temp(amdf17nbdf_t *nbdf, minor_t minor, intptr_t arg, int mode) +amdf17nbdf_ioctl_scalar(amdf17nbdf_t *nbdf, minor_t minor, intptr_t arg, + int mode) { amdf17nb_t *nb; hrtime_t diff; - sensor_ioctl_temperature_t temp; + sensor_ioctl_scalar_t scalar; - bzero(&temp, sizeof (temp)); + bzero(&scalar, sizeof (scalar)); mutex_enter(&nbdf->amd_nbdf_lock); nb = amdf17nbdf_lookup_nb(nbdf, minor); @@ -710,12 +711,12 @@ amdf17nbdf_ioctl_temp(amdf17nbdf_t *nbdf, minor_t minor, intptr_t arg, int mode) } } - temp.sit_unit = SENSOR_UNIT_CELSIUS; - temp.sit_temp = nb->amd_nb_temp; - temp.sit_gran = AMDF17_THERMAL_GRANULARITY; + scalar.sis_unit = SENSOR_UNIT_CELSIUS; + scalar.sis_value = nb->amd_nb_temp; + scalar.sis_gran = AMDF17_THERMAL_GRANULARITY; mutex_exit(&nbdf->amd_nbdf_lock); - if (ddi_copyout(&temp, (void *)arg, sizeof (temp), + if (ddi_copyout(&scalar, (void *)arg, sizeof (scalar), mode & FKIOCTL) != 0) { return (EFAULT); } @@ -737,10 +738,10 @@ amdf17nbdf_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, m = getminor(dev); switch (cmd) { - case SENSOR_IOCTL_TYPE: + case SENSOR_IOCTL_KIND: return (amdf17nbdf_ioctl_kind(arg, mode)); - case SENSOR_IOCTL_TEMPERATURE: - return (amdf17nbdf_ioctl_temp(nbdf, m, arg, mode)); + case SENSOR_IOCTL_SCALAR: + return (amdf17nbdf_ioctl_scalar(nbdf, m, arg, mode)); default: return (ENOTTY); } diff --git a/usr/src/uts/intel/io/amdnbtemp/amdnbtemp.c b/usr/src/uts/intel/io/amdnbtemp/amdnbtemp.c index 1330f8563f..17934520fd 100644 --- a/usr/src/uts/intel/io/amdnbtemp/amdnbtemp.c +++ b/usr/src/uts/intel/io/amdnbtemp/amdnbtemp.c @@ -103,7 +103,7 @@ typedef struct amdnbtemp { static void *amdnbtemp_state; static int -amdnbtemp_read(void *arg, sensor_ioctl_temperature_t *temp) +amdnbtemp_read(void *arg, sensor_ioctl_scalar_t *scalar) { amdnbtemp_t *at = arg; @@ -120,9 +120,9 @@ amdnbtemp_read(void *arg, sensor_ioctl_temperature_t *temp) at->at_temp -= AMDNBTEMP_TEMP_ADJUST; } - temp->sit_unit = SENSOR_UNIT_CELSIUS; - temp->sit_gran = AMDNBTEMP_GRANULARITY; - temp->sit_temp = at->at_temp; + scalar->sis_unit = SENSOR_UNIT_CELSIUS; + scalar->sis_gran = AMDNBTEMP_GRANULARITY; + scalar->sis_value = at->at_temp; mutex_exit(&at->at_mutex); return (0); @@ -130,7 +130,7 @@ amdnbtemp_read(void *arg, sensor_ioctl_temperature_t *temp) static const ksensor_ops_t amdnbtemp_temp_ops = { .kso_kind = ksensor_kind_temperature, - .kso_temp = amdnbtemp_read + .kso_scalar = amdnbtemp_read }; static void diff --git a/usr/src/uts/intel/io/coretemp/coretemp.c b/usr/src/uts/intel/io/coretemp/coretemp.c index ee2d143554..bea8078002 100644 --- a/usr/src/uts/intel/io/coretemp/coretemp.c +++ b/usr/src/uts/intel/io/coretemp/coretemp.c @@ -259,7 +259,7 @@ coretemp_update(coretemp_t *ct, coretemp_sensor_t *sensor, cmi_hdl_t hdl) } static int -coretemp_read(void *arg, sensor_ioctl_temperature_t *sit) +coretemp_read(void *arg, sensor_ioctl_scalar_t *scalar) { coretemp_sensor_t *sensor = arg; coretemp_t *ct = sensor->cs_coretemp; @@ -313,10 +313,10 @@ coretemp_read(void *arg, sensor_ioctl_temperature_t *sit) sensor->cs_temperature = sensor->cs_tjmax - reading; sensor->cs_resolution = resolution; - sit->sit_unit = SENSOR_UNIT_CELSIUS; - sit->sit_temp = sensor->cs_temperature; - sit->sit_gran = CORETEMP_GRANULARITY; - sit->sit_prec = sensor->cs_resolution; + scalar->sis_unit = SENSOR_UNIT_CELSIUS; + scalar->sis_value = sensor->cs_temperature; + scalar->sis_gran = CORETEMP_GRANULARITY; + scalar->sis_prec = sensor->cs_resolution; mutex_exit(&ct->coretemp_mutex); return (0); @@ -324,7 +324,7 @@ coretemp_read(void *arg, sensor_ioctl_temperature_t *sit) static const ksensor_ops_t coretemp_temp_ops = { .kso_kind = ksensor_kind_temperature, - .kso_temp = coretemp_read + .kso_scalar = coretemp_read }; static void diff --git a/usr/src/uts/intel/io/pchtemp/pchtemp.c b/usr/src/uts/intel/io/pchtemp/pchtemp.c index 4aeb098112..2cfd7ae806 100644 --- a/usr/src/uts/intel/io/pchtemp/pchtemp.c +++ b/usr/src/uts/intel/io/pchtemp/pchtemp.c @@ -137,7 +137,7 @@ pchtemp_read_check(pchtemp_t *pch) } static int -pchtemp_read(void *arg, sensor_ioctl_temperature_t *sit) +pchtemp_read(void *arg, sensor_ioctl_scalar_t *scalar) { uint16_t temp, ctt, tahv, talv; uint8_t tsel; @@ -175,9 +175,9 @@ pchtemp_read(void *arg, sensor_ioctl_temperature_t *sit) } pch->pcht_temp = (temp & PCHTEMP_REG_TEMP_TSR) - PCHTEMP_TEMP_OFFSET; - sit->sit_unit = SENSOR_UNIT_CELSIUS; - sit->sit_gran = PCHTEMP_TEMP_RESOLUTION; - sit->sit_temp = pch->pcht_temp; + scalar->sis_unit = SENSOR_UNIT_CELSIUS; + scalar->sis_gran = PCHTEMP_TEMP_RESOLUTION; + scalar->sis_value = pch->pcht_temp; mutex_exit(&pch->pcht_mutex); return (0); @@ -185,7 +185,7 @@ pchtemp_read(void *arg, sensor_ioctl_temperature_t *sit) static const ksensor_ops_t pchtemp_temp_ops = { .kso_kind = ksensor_kind_temperature, - .kso_temp = pchtemp_read + .kso_scalar = pchtemp_read }; static void -- cgit v1.2.3