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