KSENSOR_CREATE(9F) Kernel Functions for Drivers KSENSOR_CREATE(9F)

NAME


ksensor_create, ksensor_create_scalar_pcidev, ksensor_remove - create and
remove ksensors

SYNOPSIS


#include <sys/sensors.h>

int
ksensor_create(dev_info_t *dip, const ksensor_ops_t *ops, void *driver,
const char *name, const char *class, id_t *idp);

int
ksensor_create_scalar_pcidev(dev_info_t *dip, uint64_t kind,
const ksensor_ops_t *ops, void *driver, const char *name, id_t *idp);

int
ksensor_remove(dev_info_t *dip, id_t id);

INTERFACE LEVEL


Volatile - This interface is still evolving in illumos. API and ABI
stability is not guaranteed.

PARAMETERS


class A string that indicates the class of sensor, see ksensor(9E)
for more information.

dip Pointer to the driver's dev_info_t structure for the specific
instance.

driver An opaque pointer that will be provided back to the driver in
ksensor_ops(9E) entry points.

id A ksensor's ID which can be used to refer back to it in the
framework.

idp A pointer which will be filled in with a created ksensor's
ID.

kind A sensor kind, see ksensor(9E) for a list of kinds.

name The name of the ksensor.

ops The ksensor operations vector, see ksensor_ops(9E).

DESCRIPTION


The ksensor_create() and ksensor_create_scalar_pcidev() functions are used
to create ksensors and register them with the ksensor(9E) framework during
a driver's attach(9E) entry point. A created ksensor is identified by the
combination of the driver's dip and an ID which is returned in idp, which
should be kept so the ksensor can be removed via a subsequent call to
ksensor_remove().

The ksensor_create_scalar_pcidev() function is used to create a ksensor for
a PCI or PCIe device and will cause it to automatically be registered with
the fault management architecture. kind is one of the sensor kinds listed
in ksensor(9E).

name should be something semantic about what the sensor is or its location
in the device. For example, a voltage or current sensor should try to name
the sensor based on the rail or supply it measures such as Vdd. Similarly,
a temperature sensor should try to indicate where it measures the
temperature.

The ops argument provides the operations vector that the ksensor framework
should use for making calls. The passed in structure must remain valid
across the lifetime of the ksensor and often is a constant structure in the
driver's program text. See ksensor_ops(9E) for more information on the
semantics of the callback operations vector. These operations vectors will
not be called during a driver's attach(9E) or detach(9E) entry points, but
can otherwise be called in parallel from multiple different threads. The
framework does not provide any serialization.

The opaque pointer driver, will be returned as part of calling any of the
ksensor_ops(9E) entry points. As the framework does not provide the
corresponding dip back in the entry points, this should generally not be a
NULL pointer.

The ksensor_create() function is a more generic function and requires that
the driver specify the class of the sensor directly, rather than having it
inferred based upon kind.

The ksensor_remove() function allows a driver to remove a ksensor that was
previously created identified by id. To simplify device teardown, a driver
may pass the special ID KSENSOR_ALL_IDS to remove any registered ksensors.
Because the framework guarantees that no entry points will be called during
either attach(9E) or detach(9E), the driver does not need to take special
care with when it calls ksensor_remove(), unlike untimeout(9F).

CONTEXT


The ksensor_create() and ksensor_create_scalar_pcidev() functions may only
be called from a driver's attach(9E) entry point. The ksensor_remove()
function may only be called from a driver's attach(9E) or detach(9E) entry
points.

RETURN VALUES


Upon successful completion, the ksensor_create() and
ksensor_create_scalar_pcidev() functions return 0 and update idp with the
newly created ksensor's ID. Otherwise, a non-zero error number is
returned.

Upon successful completion, the ksensor_remove() function returns 0 and
deletes the ksensor. Otherwise, a non-zero error number is returned.

ERRORS


The ksensor_create() and ksensor_create_scalar_pcidev() functions will fail
if:

EAGAIN The driver did not call these functions from its
attach(9E) entry point.

EEXIST A ksensor with the same class and name already exists.

EINVAL An invalid pointer was passed or ops, name, or class are
malformed.

Additionally, the ksensor_create_scalar_pcidev() function will fail if:

EINVAL dip does not refer to a valid PCI or PCIe device node
with a "regs" property.

EIO The "regs" property of dip is malformed.

ENOTSUP The value of kind is not supported.

The ksensor_remove() function will fail if

EAGAIN The driver did not call this from either attach(9E) or
detach(9E).

ENOENT The ksensor referenced in id does not exist for dip or,
if id is KSENSOR_ALL_IDS, the driver has no ksensors.

SEE ALSO


attach(9E), detach(9E), ksensor(9E), ksensor_ops(9E)

illumos May 10, 2024 illumos