| /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | |
| /* | |
| * Userspace ABI for Counter character devices | |
| * Copyright (C) 2020 William Breathitt Gray | |
| */ | |
| #ifndef _UAPI_COUNTER_H_ | |
| #define _UAPI_COUNTER_H_ | |
| #include <linux/ioctl.h> | |
| #include <linux/types.h> | |
| /* Component type definitions */ | |
| enum counter_component_type { | |
| COUNTER_COMPONENT_NONE, | |
| COUNTER_COMPONENT_SIGNAL, | |
| COUNTER_COMPONENT_COUNT, | |
| COUNTER_COMPONENT_FUNCTION, | |
| COUNTER_COMPONENT_SYNAPSE_ACTION, | |
| COUNTER_COMPONENT_EXTENSION, | |
| }; | |
| /* Component scope definitions */ | |
| enum counter_scope { | |
| COUNTER_SCOPE_DEVICE, | |
| COUNTER_SCOPE_SIGNAL, | |
| COUNTER_SCOPE_COUNT, | |
| }; | |
| /** | |
| * struct counter_component - Counter component identification | |
| * @type: component type (one of enum counter_component_type) | |
| * @scope: component scope (one of enum counter_scope) | |
| * @parent: parent ID (matching the ID suffix of the respective parent sysfs | |
| * path as described by the ABI documentation file | |
| * Documentation/ABI/testing/sysfs-bus-counter) | |
| * @id: component ID (matching the ID provided by the respective *_component_id | |
| * sysfs attribute of the desired component) | |
| * | |
| * For example, if the Count 2 ceiling extension of Counter device 4 is desired, | |
| * set type equal to COUNTER_COMPONENT_EXTENSION, scope equal to | |
| * COUNTER_COUNT_SCOPE, parent equal to 2, and id equal to the value provided by | |
| * the respective /sys/bus/counter/devices/counter4/count2/ceiling_component_id | |
| * sysfs attribute. | |
| */ | |
| struct counter_component { | |
| __u8 type; | |
| __u8 scope; | |
| __u8 parent; | |
| __u8 id; | |
| }; | |
| /* Event type definitions */ | |
| enum counter_event_type { | |
| /* Count value increased past ceiling */ | |
| COUNTER_EVENT_OVERFLOW, | |
| /* Count value decreased past floor */ | |
| COUNTER_EVENT_UNDERFLOW, | |
| /* Count value increased past ceiling, or decreased past floor */ | |
| COUNTER_EVENT_OVERFLOW_UNDERFLOW, | |
| /* Count value reached threshold */ | |
| COUNTER_EVENT_THRESHOLD, | |
| /* Index signal detected */ | |
| COUNTER_EVENT_INDEX, | |
| /* State of counter is changed */ | |
| COUNTER_EVENT_CHANGE_OF_STATE, | |
| /* Count value captured */ | |
| COUNTER_EVENT_CAPTURE, | |
| }; | |
| /** | |
| * struct counter_watch - Counter component watch configuration | |
| * @component: component to watch when event triggers | |
| * @event: event that triggers (one of enum counter_event_type) | |
| * @channel: event channel (typically 0 unless the device supports concurrent | |
| * events of the same type) | |
| */ | |
| struct counter_watch { | |
| struct counter_component component; | |
| __u8 event; | |
| __u8 channel; | |
| }; | |
| /* | |
| * Queues a Counter watch for the specified event. | |
| * | |
| * The queued watches will not be applied until COUNTER_ENABLE_EVENTS_IOCTL is | |
| * called. | |
| */ | |
| #define COUNTER_ADD_WATCH_IOCTL _IOW(0x3E, 0x00, struct counter_watch) | |
| /* | |
| * Enables monitoring the events specified by the Counter watches that were | |
| * queued by COUNTER_ADD_WATCH_IOCTL. | |
| * | |
| * If events are already enabled, the new set of watches replaces the old one. | |
| * Calling this ioctl also has the effect of clearing the queue of watches added | |
| * by COUNTER_ADD_WATCH_IOCTL. | |
| */ | |
| #define COUNTER_ENABLE_EVENTS_IOCTL _IO(0x3E, 0x01) | |
| /* | |
| * Stops monitoring the previously enabled events. | |
| */ | |
| #define COUNTER_DISABLE_EVENTS_IOCTL _IO(0x3E, 0x02) | |
| /** | |
| * struct counter_event - Counter event data | |
| * @timestamp: best estimate of time of event occurrence, in nanoseconds | |
| * @value: component value | |
| * @watch: component watch configuration | |
| * @status: return status (system error number) | |
| */ | |
| struct counter_event { | |
| __aligned_u64 timestamp; | |
| __aligned_u64 value; | |
| struct counter_watch watch; | |
| __u8 status; | |
| }; | |
| /* Count direction values */ | |
| enum counter_count_direction { | |
| COUNTER_COUNT_DIRECTION_FORWARD, | |
| COUNTER_COUNT_DIRECTION_BACKWARD, | |
| }; | |
| /* Count mode values */ | |
| enum counter_count_mode { | |
| COUNTER_COUNT_MODE_NORMAL, | |
| COUNTER_COUNT_MODE_RANGE_LIMIT, | |
| COUNTER_COUNT_MODE_NON_RECYCLE, | |
| COUNTER_COUNT_MODE_MODULO_N, | |
| COUNTER_COUNT_MODE_INTERRUPT_ON_TERMINAL_COUNT, | |
| COUNTER_COUNT_MODE_HARDWARE_RETRIGGERABLE_ONESHOT, | |
| COUNTER_COUNT_MODE_RATE_GENERATOR, | |
| COUNTER_COUNT_MODE_SQUARE_WAVE_MODE, | |
| COUNTER_COUNT_MODE_SOFTWARE_TRIGGERED_STROBE, | |
| COUNTER_COUNT_MODE_HARDWARE_TRIGGERED_STROBE, | |
| }; | |
| /* Count function values */ | |
| enum counter_function { | |
| COUNTER_FUNCTION_INCREASE, | |
| COUNTER_FUNCTION_DECREASE, | |
| COUNTER_FUNCTION_PULSE_DIRECTION, | |
| COUNTER_FUNCTION_QUADRATURE_X1_A, | |
| COUNTER_FUNCTION_QUADRATURE_X1_B, | |
| COUNTER_FUNCTION_QUADRATURE_X2_A, | |
| COUNTER_FUNCTION_QUADRATURE_X2_B, | |
| COUNTER_FUNCTION_QUADRATURE_X4, | |
| }; | |
| /* Signal values */ | |
| enum counter_signal_level { | |
| COUNTER_SIGNAL_LEVEL_LOW, | |
| COUNTER_SIGNAL_LEVEL_HIGH, | |
| }; | |
| /* Action mode values */ | |
| enum counter_synapse_action { | |
| COUNTER_SYNAPSE_ACTION_NONE, | |
| COUNTER_SYNAPSE_ACTION_RISING_EDGE, | |
| COUNTER_SYNAPSE_ACTION_FALLING_EDGE, | |
| COUNTER_SYNAPSE_ACTION_BOTH_EDGES, | |
| }; | |
| /* Signal polarity values */ | |
| enum counter_signal_polarity { | |
| COUNTER_SIGNAL_POLARITY_POSITIVE, | |
| COUNTER_SIGNAL_POLARITY_NEGATIVE, | |
| }; | |
| #endif /* _UAPI_COUNTER_H_ */ |