From: William Breathitt Gray <vilhelm.gray@gmail.com>
To: jic23@kernel.org
Cc: kamel.bouhara@bootlin.com, gwendal@chromium.org,
alexandre.belloni@bootlin.com, david@lechnology.com,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-stm32@st-md-mailman.stormreply.com,
linux-arm-kernel@lists.infradead.org, syednwaris@gmail.com,
patrick.havelange@essensium.com, fabrice.gasnier@st.com,
mcoquelin.stm32@gmail.com, alexandre.torgue@st.com,
William Breathitt Gray <vilhelm.gray@gmail.com>
Subject: [PATCH v5 4/5] docs: counter: Document character device interface
Date: Sat, 26 Sep 2020 22:18:17 -0400 [thread overview]
Message-ID: <54190f9875b81b6aa5483a7710b084053a44abb8.1601170670.git.vilhelm.gray@gmail.com> (raw)
In-Reply-To: <cover.1601170670.git.vilhelm.gray@gmail.com>
This patch adds high-level documentation about the Counter subsystem
character device interface.
Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
---
Documentation/ABI/testing/sysfs-bus-counter | 18 ++
Documentation/driver-api/generic-counter.rst | 228 ++++++++++++++----
.../userspace-api/ioctl/ioctl-number.rst | 1 +
3 files changed, 206 insertions(+), 41 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-bus-counter b/Documentation/ABI/testing/sysfs-bus-counter
index 566bd99fe0a5..b7fdb14ae891 100644
--- a/Documentation/ABI/testing/sysfs-bus-counter
+++ b/Documentation/ABI/testing/sysfs-bus-counter
@@ -99,6 +99,24 @@ Description:
Read-only attribute that indicates whether excessive noise is
present at the channel Y counter inputs.
+What: /sys/bus/counter/devices/counterX/countY/extensionZ_name
+What: /sys/bus/counter/devices/counterX/extensionZ_name
+What: /sys/bus/counter/devices/counterX/signalY/extensionZ_name
+KernelVersion: 5.11
+Contact: linux-iio@vger.kernel.org
+Description:
+ Read-only attribute that indicates the component name of
+ Extension Z.
+
+What: /sys/bus/counter/devices/counterX/countY/extensionZ_width
+What: /sys/bus/counter/devices/counterX/extensionZ_width
+What: /sys/bus/counter/devices/counterX/signalY/extensionZ_width
+KernelVersion: 5.11
+Contact: linux-iio@vger.kernel.org
+Description:
+ Read-only attribute that indicates the data width of value of
+ Extension Z.
+
What: /sys/bus/counter/devices/counterX/countY/function
KernelVersion: 5.2
Contact: linux-iio@vger.kernel.org
diff --git a/Documentation/driver-api/generic-counter.rst b/Documentation/driver-api/generic-counter.rst
index b842ddbbd8a0..6077bf162ac3 100644
--- a/Documentation/driver-api/generic-counter.rst
+++ b/Documentation/driver-api/generic-counter.rst
@@ -223,19 +223,6 @@ whether an input line is differential or single-ended) and instead focus
on the core idea of what the data and process represent (e.g. position
as interpreted from quadrature encoding data).
-Userspace Interface
-===================
-
-Several sysfs attributes are generated by the Generic Counter interface,
-and reside under the /sys/bus/counter/devices/counterX directory, where
-counterX refers to the respective counter device. Please see
-Documentation/ABI/testing/sysfs-bus-counter for detailed
-information on each Generic Counter interface sysfs attribute.
-
-Through these sysfs attributes, programs and scripts may interact with
-the Generic Counter paradigm Counts, Signals, and Synapses of respective
-counter devices.
-
Driver API
==========
@@ -387,16 +374,16 @@ userspace interface components::
/ driver callbacks /
-------------------
|
- +---------------+
- |
- V
- +--------------------+
- | Counter sysfs |
- +--------------------+
- | Translates to the |
- | standard Counter |
- | sysfs output |
- +--------------------+
+ +---------------+---------------+
+ | |
+ V V
+ +--------------------+ +---------------------+
+ | Counter sysfs | | Counter chrdev |
+ +--------------------+ +---------------------+
+ | Translates to the | | Translates to the |
+ | standard Counter | | standard Counter |
+ | sysfs output | | character device |
+ +--------------------+ +---------------------+
Thereafter, data can be transferred directly between the Counter device
driver and Counter userspace interface::
@@ -427,23 +414,30 @@ driver and Counter userspace interface::
/ u64 /
----------
|
- +---------------+
- |
- V
- +--------------------+
- | Counter sysfs |
- +--------------------+
- | Translates to the |
- | standard Counter |
- | sysfs output |
- |--------------------|
- | Type: const char * |
- | Value: "42" |
- +--------------------+
- |
- ---------------
- / const char * /
- ---------------
+ +---------------+---------------+
+ | |
+ V V
+ +--------------------+ +---------------------+
+ | Counter sysfs | | Counter chrdev |
+ +--------------------+ +---------------------+
+ | Translates to the | | Translates to the |
+ | standard Counter | | standard Counter |
+ | sysfs output | | character device |
+ |--------------------| |---------------------|
+ | Type: const char * | | Type: u64 |
+ | Value: "42" | | Value: 42 |
+ +--------------------+ +---------------------+
+ | |
+ --------------- -----------------------
+ / const char * / / struct counter_event /
+ --------------- -----------------------
+ | |
+ | V
+ | +-----------+
+ | | read |
+ | +-----------+
+ | \ Count: 42 /
+ | -----------
|
V
+--------------------------------------------------+
@@ -452,7 +446,7 @@ driver and Counter userspace interface::
\ Count: "42" /
--------------------------------------------------
-There are three primary components involved:
+There are four primary components involved:
Counter device driver
---------------------
@@ -472,3 +466,155 @@ and vice versa.
Please refer to the `Documentation/ABI/testing/sysfs-bus-counter` file
for a detailed breakdown of the available Generic Counter interface
sysfs attributes.
+
+Counter chrdev
+--------------
+Translates counter data to the standard Counter character device; data
+is transferred via standard character device read calls, while Counter
+events are configured via ioctl calls.
+
+Sysfs Interface
+===============
+
+Several sysfs attributes are generated by the Generic Counter interface,
+and reside under the `/sys/bus/counter/devices/counterX` directory,
+where `X` is to the respective counter device id. Please see
+`Documentation/ABI/testing/sysfs-bus-counter` for detailed information
+on each Generic Counter interface sysfs attribute.
+
+Through these sysfs attributes, programs and scripts may interact with
+the Generic Counter paradigm Counts, Signals, and Synapses of respective
+counter devices.
+
+Counter Character Device
+========================
+
+Counter character device nodes are created under the `/dev` directory as
+`counterX`, where `X` is the respective counter device id. Defines for
+the standard Counter data types are exposed via the userspace
+`include/uapi/linux/counter.h` file.
+
+Counter events
+--------------
+Counter device drivers can support Counter events by utilizing the
+`counter_push_event` function::
+
+ int counter_push_event(struct counter_device *const counter, const u8 event,
+ const u8 channel);
+
+The event id is specified by the `event` parameter; the event channel id
+is specified by the `channel` parameter. When this function is called,
+the Counter data associated with the respective event is gathered, and a
+`struct counter_event` is generated for each datum and pushed to
+userspace.
+
+Counter events can be configured by users to report various Counter
+data of interest. This can be conceptualized as a list of Counter
+component read calls to perform. For example::
+
+ +~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~+
+ | COUNTER_EVENT_OVERFLOW | COUNTER_EVENT_INDEX |
+ +~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~+
+ | Channel 0 | Channel 0 |
+ +------------------------+------------------------+
+ | * Count 0 | * Signal 0 |
+ | * Count 1 | * Signal 0 Extension 0 |
+ | * Signal 3 | * Extension 4 |
+ | * Count 4 Extension 2 +------------------------+
+ | * Signal 5 Extension 0 | Channel 1 |
+ | +------------------------+
+ | | * Signal 4 |
+ | | * Signal 4 Extension 0 |
+ | | * Count 7 |
+ +------------------------+------------------------+
+
+When `counter_push_event(counter, COUNTER_EVENT_INDEX, 1)` is called for
+example, it will go down the list for the `COUNTER_EVENT_INDEX` event
+channel 1 and execute the read callbacks for Signal 4, Signal 4
+Extension 0, and Count 4 -- the data returned for each is pushed to a
+kfifo as a `struct counter_event`, which userspace can retrieve via a
+standard read operation on the respective character device node.
+
+Userspace
+---------
+Userspace applications can configure Counter events via ioctl operations
+on the Counter character device node. There following ioctl codes are
+supported and provided by the `linux/counter.h` userspace header file:
+
+* COUNTER_CLEAR_WATCHES_IOCTL:
+ Clear all Counter watches from all events
+
+* COUNTER_SET_WATCH_IOCTL:
+ Set a Counter watch for the specified event
+
+* COUNTER_LOAD_WATCHES_IOCTL:
+ Activates the Counter watches set earlier
+
+To configure events to gather Counter data, users first populate a
+`struct counter_watch` with the relevant event id, event channel id, and
+the information for the desired Counter component from which to read,
+and then pass it via the `COUNTER_SET_WATCH_IOCTL` ioctl command.
+
+The `COUNTER_SET_WATCH_IOCTL` command will buffer these Counter watches.
+When ready, the `COUNTER_LOAD_WATCHES_IOCTL` ioctl command may be used
+to activate these Counter watches.
+
+Userspace applications can then execute a `read` operation (optionally
+calling `poll` first) on the Counter character device node to retrieve
+`struct counter_event` elements with the desired data.
+
+For example, the following userspace code opens `/dev/counter0`,
+configures the `COUNTER_EVENT_INDEX` event channel 0 to gather Count 0
+and Count 1, and prints out the data as it becomes available on the
+character device node::
+
+ #include <fcntl.h>
+ #include <linux/counter.h>
+ #include <poll.h>
+ #include <stdio.h>
+ #include <sys/ioctl.h>
+ #include <unistd.h>
+
+ struct counter_watch watches[2] = {
+ {
+ .event = COUNTER_EVENT_INDEX,
+ .channel = 0,
+ .component.scope = COUNTER_SCOPE_COUNT,
+ .component.parent = 0,
+ .component.type = COUNTER_COMPONENT_COUNT,
+ },
+ {
+ .event = COUNTER_EVENT_INDEX,
+ .channel = 0,
+ .component.scope = COUNTER_SCOPE_COUNT,
+ .component.parent = 1,
+ .component.type = COUNTER_COMPONENT_COUNT,
+ },
+ };
+
+ int main(void)
+ {
+ struct pollfd pfd = { .events = POLLIN };
+ struct counter_event event_data[2];
+
+ pfd.fd = open("/dev/counter0", O_RDWR);
+
+ ioctl(pfd.fd, COUNTER_SET_WATCH_IOCTL, watches);
+ ioctl(pfd.fd, COUNTER_SET_WATCH_IOCTL, watches + 1);
+ ioctl(pfd.fd, COUNTER_LOAD_WATCHES_IOCTL);
+
+ for (;;) {
+ poll(&pfd, 1, -1);
+
+ read(pfd.fd, event_data, sizeof(event_data));
+
+ printf("Timestamp 0: %llu\nCount 0: %llu\n"
+ "Timestamp 1: %llu\nCount 1: %llu\n",
+ (unsigned long long)event_data[0].timestamp,
+ (unsigned long long)event_data[0].value_u64,
+ (unsigned long long)event_data[1].timestamp,
+ (unsigned long long)event_data[1].value_u64);
+ }
+
+ return 0;
+ }
diff --git a/Documentation/userspace-api/ioctl/ioctl-number.rst b/Documentation/userspace-api/ioctl/ioctl-number.rst
index 2a198838fca9..f6e96bb780cd 100644
--- a/Documentation/userspace-api/ioctl/ioctl-number.rst
+++ b/Documentation/userspace-api/ioctl/ioctl-number.rst
@@ -88,6 +88,7 @@ Code Seq# Include File Comments
<http://infiniband.sourceforge.net/>
0x20 all drivers/cdrom/cm206.h
0x22 all scsi/sg.h
+0x3E 00-0F linux/counter.h <mailto:linux-iio@vger.kernel.org>
'!' 00-1F uapi/linux/seccomp.h
'#' 00-3F IEEE 1394 Subsystem
Block for the entire subsystem
--
2.28.0
next prev parent reply other threads:[~2020-09-27 2:18 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-27 2:18 [PATCH v5 0/5] Introduce the Counter character device interface William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 2/5] docs: counter: Update to reflect sysfs internalization William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 3/5] counter: Add character device interface William Breathitt Gray
2020-10-14 1:40 ` David Lechner
2020-10-18 16:49 ` William Breathitt Gray
2020-10-20 15:53 ` David Lechner
2020-10-25 12:55 ` William Breathitt Gray
2020-10-25 16:36 ` David Lechner
2020-10-14 17:43 ` David Lechner
2020-10-14 19:05 ` William Breathitt Gray
2020-10-14 22:32 ` David Lechner
2020-10-14 22:40 ` David Lechner
2020-10-18 16:58 ` William Breathitt Gray
2020-10-20 16:06 ` David Lechner
2020-10-25 13:18 ` William Breathitt Gray
2020-10-25 16:34 ` David Lechner
2020-10-25 17:53 ` William Breathitt Gray
2020-09-27 2:18 ` William Breathitt Gray [this message]
2020-10-08 8:09 ` [PATCH v5 4/5] docs: counter: Document " Pavel Machek
2020-10-08 12:28 ` William Breathitt Gray
2020-10-12 17:04 ` David Lechner
2020-10-13 18:58 ` William Breathitt Gray
2020-10-13 19:08 ` David Lechner
2020-10-13 19:27 ` William Breathitt Gray
2020-09-27 2:18 ` [PATCH v5 5/5] counter: 104-quad-8: Add IRQ support for the ACCES 104-QUAD-8 William Breathitt Gray
2020-10-14 0:13 ` David Lechner
2020-10-18 14:50 ` William Breathitt Gray
2020-10-13 0:35 ` [PATCH v5 0/5] Introduce the Counter character device interface David Lechner
2020-10-18 14:14 ` William Breathitt Gray
[not found] ` <e38f6dc3a08bf2510034334262776a6ed1df8b89.1601170670.git.vilhelm.gray@gmail.com>
2020-10-13 2:15 ` [PATCH v5 1/5] counter: Internalize sysfs interface code David Lechner
2020-10-18 14:49 ` William Breathitt Gray
2020-10-20 15:38 ` David Lechner
2020-10-23 13:12 ` William Breathitt Gray
2020-10-15 1:38 ` David Lechner
2020-10-18 17:00 ` William Breathitt Gray
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54190f9875b81b6aa5483a7710b084053a44abb8.1601170670.git.vilhelm.gray@gmail.com \
--to=vilhelm.gray@gmail.com \
--cc=alexandre.belloni@bootlin.com \
--cc=alexandre.torgue@st.com \
--cc=david@lechnology.com \
--cc=fabrice.gasnier@st.com \
--cc=gwendal@chromium.org \
--cc=jic23@kernel.org \
--cc=kamel.bouhara@bootlin.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=patrick.havelange@essensium.com \
--cc=syednwaris@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).