1e65c26f4SWilliam Breathitt Gray /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2e65c26f4SWilliam Breathitt Gray /* 3e65c26f4SWilliam Breathitt Gray * Userspace ABI for Counter character devices 4e65c26f4SWilliam Breathitt Gray * Copyright (C) 2020 William Breathitt Gray 5e65c26f4SWilliam Breathitt Gray */ 6e65c26f4SWilliam Breathitt Gray #ifndef _UAPI_COUNTER_H_ 7e65c26f4SWilliam Breathitt Gray #define _UAPI_COUNTER_H_ 8e65c26f4SWilliam Breathitt Gray 9b6c50affSWilliam Breathitt Gray #include <linux/ioctl.h> 10b6c50affSWilliam Breathitt Gray #include <linux/types.h> 11b6c50affSWilliam Breathitt Gray 12b6c50affSWilliam Breathitt Gray /* Component type definitions */ 13b6c50affSWilliam Breathitt Gray enum counter_component_type { 14b6c50affSWilliam Breathitt Gray COUNTER_COMPONENT_NONE, 15b6c50affSWilliam Breathitt Gray COUNTER_COMPONENT_SIGNAL, 16b6c50affSWilliam Breathitt Gray COUNTER_COMPONENT_COUNT, 17b6c50affSWilliam Breathitt Gray COUNTER_COMPONENT_FUNCTION, 18b6c50affSWilliam Breathitt Gray COUNTER_COMPONENT_SYNAPSE_ACTION, 19b6c50affSWilliam Breathitt Gray COUNTER_COMPONENT_EXTENSION, 20b6c50affSWilliam Breathitt Gray }; 21b6c50affSWilliam Breathitt Gray 22e65c26f4SWilliam Breathitt Gray /* Component scope definitions */ 23e65c26f4SWilliam Breathitt Gray enum counter_scope { 24e65c26f4SWilliam Breathitt Gray COUNTER_SCOPE_DEVICE, 25e65c26f4SWilliam Breathitt Gray COUNTER_SCOPE_SIGNAL, 26e65c26f4SWilliam Breathitt Gray COUNTER_SCOPE_COUNT, 27e65c26f4SWilliam Breathitt Gray }; 28e65c26f4SWilliam Breathitt Gray 29b6c50affSWilliam Breathitt Gray /** 30b6c50affSWilliam Breathitt Gray * struct counter_component - Counter component identification 31b6c50affSWilliam Breathitt Gray * @type: component type (one of enum counter_component_type) 32b6c50affSWilliam Breathitt Gray * @scope: component scope (one of enum counter_scope) 33b6c50affSWilliam Breathitt Gray * @parent: parent ID (matching the ID suffix of the respective parent sysfs 34b6c50affSWilliam Breathitt Gray * path as described by the ABI documentation file 35b6c50affSWilliam Breathitt Gray * Documentation/ABI/testing/sysfs-bus-counter) 36b6c50affSWilliam Breathitt Gray * @id: component ID (matching the ID provided by the respective *_component_id 37b6c50affSWilliam Breathitt Gray * sysfs attribute of the desired component) 38b6c50affSWilliam Breathitt Gray * 39b6c50affSWilliam Breathitt Gray * For example, if the Count 2 ceiling extension of Counter device 4 is desired, 40b6c50affSWilliam Breathitt Gray * set type equal to COUNTER_COMPONENT_EXTENSION, scope equal to 41*7904cdf1SFabrice Gasnier * COUNTER_SCOPE_COUNT, parent equal to 2, and id equal to the value provided by 42b6c50affSWilliam Breathitt Gray * the respective /sys/bus/counter/devices/counter4/count2/ceiling_component_id 43b6c50affSWilliam Breathitt Gray * sysfs attribute. 44b6c50affSWilliam Breathitt Gray */ 45b6c50affSWilliam Breathitt Gray struct counter_component { 46b6c50affSWilliam Breathitt Gray __u8 type; 47b6c50affSWilliam Breathitt Gray __u8 scope; 48b6c50affSWilliam Breathitt Gray __u8 parent; 49b6c50affSWilliam Breathitt Gray __u8 id; 50b6c50affSWilliam Breathitt Gray }; 51b6c50affSWilliam Breathitt Gray 52b6c50affSWilliam Breathitt Gray /* Event type definitions */ 53b6c50affSWilliam Breathitt Gray enum counter_event_type { 54b6c50affSWilliam Breathitt Gray /* Count value increased past ceiling */ 55b6c50affSWilliam Breathitt Gray COUNTER_EVENT_OVERFLOW, 56b6c50affSWilliam Breathitt Gray /* Count value decreased past floor */ 57b6c50affSWilliam Breathitt Gray COUNTER_EVENT_UNDERFLOW, 58b6c50affSWilliam Breathitt Gray /* Count value increased past ceiling, or decreased past floor */ 59b6c50affSWilliam Breathitt Gray COUNTER_EVENT_OVERFLOW_UNDERFLOW, 60b6c50affSWilliam Breathitt Gray /* Count value reached threshold */ 61b6c50affSWilliam Breathitt Gray COUNTER_EVENT_THRESHOLD, 62b6c50affSWilliam Breathitt Gray /* Index signal detected */ 63b6c50affSWilliam Breathitt Gray COUNTER_EVENT_INDEX, 6473799a88SOleksij Rempel /* State of counter is changed */ 6573799a88SOleksij Rempel COUNTER_EVENT_CHANGE_OF_STATE, 6645d29185SWilliam Breathitt Gray /* Count value captured */ 6745d29185SWilliam Breathitt Gray COUNTER_EVENT_CAPTURE, 68b6c50affSWilliam Breathitt Gray }; 69b6c50affSWilliam Breathitt Gray 70b6c50affSWilliam Breathitt Gray /** 71b6c50affSWilliam Breathitt Gray * struct counter_watch - Counter component watch configuration 72b6c50affSWilliam Breathitt Gray * @component: component to watch when event triggers 73b6c50affSWilliam Breathitt Gray * @event: event that triggers (one of enum counter_event_type) 74b6c50affSWilliam Breathitt Gray * @channel: event channel (typically 0 unless the device supports concurrent 75b6c50affSWilliam Breathitt Gray * events of the same type) 76b6c50affSWilliam Breathitt Gray */ 77b6c50affSWilliam Breathitt Gray struct counter_watch { 78b6c50affSWilliam Breathitt Gray struct counter_component component; 79b6c50affSWilliam Breathitt Gray __u8 event; 80b6c50affSWilliam Breathitt Gray __u8 channel; 81b6c50affSWilliam Breathitt Gray }; 82b6c50affSWilliam Breathitt Gray 83b6c50affSWilliam Breathitt Gray /* 84b6c50affSWilliam Breathitt Gray * Queues a Counter watch for the specified event. 85b6c50affSWilliam Breathitt Gray * 86b6c50affSWilliam Breathitt Gray * The queued watches will not be applied until COUNTER_ENABLE_EVENTS_IOCTL is 87b6c50affSWilliam Breathitt Gray * called. 88b6c50affSWilliam Breathitt Gray */ 89b6c50affSWilliam Breathitt Gray #define COUNTER_ADD_WATCH_IOCTL _IOW(0x3E, 0x00, struct counter_watch) 90b6c50affSWilliam Breathitt Gray /* 91b6c50affSWilliam Breathitt Gray * Enables monitoring the events specified by the Counter watches that were 92b6c50affSWilliam Breathitt Gray * queued by COUNTER_ADD_WATCH_IOCTL. 93b6c50affSWilliam Breathitt Gray * 94b6c50affSWilliam Breathitt Gray * If events are already enabled, the new set of watches replaces the old one. 95b6c50affSWilliam Breathitt Gray * Calling this ioctl also has the effect of clearing the queue of watches added 96b6c50affSWilliam Breathitt Gray * by COUNTER_ADD_WATCH_IOCTL. 97b6c50affSWilliam Breathitt Gray */ 98b6c50affSWilliam Breathitt Gray #define COUNTER_ENABLE_EVENTS_IOCTL _IO(0x3E, 0x01) 99b6c50affSWilliam Breathitt Gray /* 100b6c50affSWilliam Breathitt Gray * Stops monitoring the previously enabled events. 101b6c50affSWilliam Breathitt Gray */ 102b6c50affSWilliam Breathitt Gray #define COUNTER_DISABLE_EVENTS_IOCTL _IO(0x3E, 0x02) 103b6c50affSWilliam Breathitt Gray 104b6c50affSWilliam Breathitt Gray /** 105b6c50affSWilliam Breathitt Gray * struct counter_event - Counter event data 106b6c50affSWilliam Breathitt Gray * @timestamp: best estimate of time of event occurrence, in nanoseconds 107b6c50affSWilliam Breathitt Gray * @value: component value 108b6c50affSWilliam Breathitt Gray * @watch: component watch configuration 109b6c50affSWilliam Breathitt Gray * @status: return status (system error number) 110b6c50affSWilliam Breathitt Gray */ 111b6c50affSWilliam Breathitt Gray struct counter_event { 112b6c50affSWilliam Breathitt Gray __aligned_u64 timestamp; 113b6c50affSWilliam Breathitt Gray __aligned_u64 value; 114b6c50affSWilliam Breathitt Gray struct counter_watch watch; 115b6c50affSWilliam Breathitt Gray __u8 status; 116b6c50affSWilliam Breathitt Gray }; 117b6c50affSWilliam Breathitt Gray 118e65c26f4SWilliam Breathitt Gray /* Count direction values */ 119e65c26f4SWilliam Breathitt Gray enum counter_count_direction { 120e65c26f4SWilliam Breathitt Gray COUNTER_COUNT_DIRECTION_FORWARD, 121e65c26f4SWilliam Breathitt Gray COUNTER_COUNT_DIRECTION_BACKWARD, 122e65c26f4SWilliam Breathitt Gray }; 123e65c26f4SWilliam Breathitt Gray 124e65c26f4SWilliam Breathitt Gray /* Count mode values */ 125e65c26f4SWilliam Breathitt Gray enum counter_count_mode { 126e65c26f4SWilliam Breathitt Gray COUNTER_COUNT_MODE_NORMAL, 127e65c26f4SWilliam Breathitt Gray COUNTER_COUNT_MODE_RANGE_LIMIT, 128e65c26f4SWilliam Breathitt Gray COUNTER_COUNT_MODE_NON_RECYCLE, 129e65c26f4SWilliam Breathitt Gray COUNTER_COUNT_MODE_MODULO_N, 130d4284874SWilliam Breathitt Gray COUNTER_COUNT_MODE_INTERRUPT_ON_TERMINAL_COUNT, 131d4284874SWilliam Breathitt Gray COUNTER_COUNT_MODE_HARDWARE_RETRIGGERABLE_ONESHOT, 132d4284874SWilliam Breathitt Gray COUNTER_COUNT_MODE_RATE_GENERATOR, 133d4284874SWilliam Breathitt Gray COUNTER_COUNT_MODE_SQUARE_WAVE_MODE, 134d4284874SWilliam Breathitt Gray COUNTER_COUNT_MODE_SOFTWARE_TRIGGERED_STROBE, 135d4284874SWilliam Breathitt Gray COUNTER_COUNT_MODE_HARDWARE_TRIGGERED_STROBE, 136e65c26f4SWilliam Breathitt Gray }; 137e65c26f4SWilliam Breathitt Gray 138e65c26f4SWilliam Breathitt Gray /* Count function values */ 139e65c26f4SWilliam Breathitt Gray enum counter_function { 140e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_INCREASE, 141e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_DECREASE, 142e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_PULSE_DIRECTION, 143e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_QUADRATURE_X1_A, 144e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_QUADRATURE_X1_B, 145e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_QUADRATURE_X2_A, 146e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_QUADRATURE_X2_B, 147e65c26f4SWilliam Breathitt Gray COUNTER_FUNCTION_QUADRATURE_X4, 148e65c26f4SWilliam Breathitt Gray }; 149e65c26f4SWilliam Breathitt Gray 150e65c26f4SWilliam Breathitt Gray /* Signal values */ 151e65c26f4SWilliam Breathitt Gray enum counter_signal_level { 152e65c26f4SWilliam Breathitt Gray COUNTER_SIGNAL_LEVEL_LOW, 153e65c26f4SWilliam Breathitt Gray COUNTER_SIGNAL_LEVEL_HIGH, 154e65c26f4SWilliam Breathitt Gray }; 155e65c26f4SWilliam Breathitt Gray 156e65c26f4SWilliam Breathitt Gray /* Action mode values */ 157e65c26f4SWilliam Breathitt Gray enum counter_synapse_action { 158e65c26f4SWilliam Breathitt Gray COUNTER_SYNAPSE_ACTION_NONE, 159e65c26f4SWilliam Breathitt Gray COUNTER_SYNAPSE_ACTION_RISING_EDGE, 160e65c26f4SWilliam Breathitt Gray COUNTER_SYNAPSE_ACTION_FALLING_EDGE, 161e65c26f4SWilliam Breathitt Gray COUNTER_SYNAPSE_ACTION_BOTH_EDGES, 162e65c26f4SWilliam Breathitt Gray }; 163e65c26f4SWilliam Breathitt Gray 164650ae67bSWilliam Breathitt Gray /* Signal polarity values */ 165650ae67bSWilliam Breathitt Gray enum counter_signal_polarity { 166650ae67bSWilliam Breathitt Gray COUNTER_SIGNAL_POLARITY_POSITIVE, 167650ae67bSWilliam Breathitt Gray COUNTER_SIGNAL_POLARITY_NEGATIVE, 168650ae67bSWilliam Breathitt Gray }; 169650ae67bSWilliam Breathitt Gray 170e65c26f4SWilliam Breathitt Gray #endif /* _UAPI_COUNTER_H_ */ 171