[PATCH v6 5/7] iio: ABI: Add support for floating-point numbers in buffer scan elements

Francesco Lavra posted 7 patches 1 month, 1 week ago
There is a newer version of this series
[PATCH v6 5/7] iio: ABI: Add support for floating-point numbers in buffer scan elements
Posted by Francesco Lavra 1 month, 1 week ago
In the data storage description of a scan element, the first character
after the colon can have the values 's' and 'u' to specify signed and
unsigned integers, respectively.
Add 'f' as an allowed value to specify floating-point numbers formatted
according to the IEEE 754 standard.

Signed-off-by: Francesco Lavra <flavra@baylibre.com>
---
 Documentation/ABI/testing/sysfs-bus-iio  | 33 +++++++++++++-----------
 Documentation/driver-api/iio/buffers.rst |  5 ++--
 Documentation/iio/iio_devbuf.rst         |  3 ++-
 3 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
index 5f87dcee78f7..61961bca4dce 100644
--- a/Documentation/ABI/testing/sysfs-bus-iio
+++ b/Documentation/ABI/testing/sysfs-bus-iio
@@ -1510,21 +1510,24 @@ Contact:	linux-iio@vger.kernel.org
 Description:
 		Description of the scan element data storage within the buffer
 		and hence the form in which it is read from user-space.
-		Form is [be|le]:[s|u]bits/storagebits[>>shift].
-		be or le specifies big or little endian. s or u specifies if
-		signed (2's complement) or unsigned. bits is the number of bits
-		of data and storagebits is the space (after padding) that it
-		occupies in the buffer. shift if specified, is the shift that
-		needs to be applied prior to masking out unused bits. Some
-		devices put their data in the middle of the transferred elements
-		with additional information on both sides.  Note that some
-		devices will have additional information in the unused bits
-		so to get a clean value, the bits value must be used to mask
-		the buffer output value appropriately.  The storagebits value
-		also specifies the data alignment.  So s48/64>>2 will be a
-		signed 48 bit integer stored in a 64 bit location aligned to
-		a 64 bit boundary. To obtain the clean value, shift right 2
-		and apply a mask to zero the top 16 bits of the result.
+		Form is [be|le]:[s|u|f]bits/storagebits[>>shift].
+		be or le specifies big or little endian. s means signed (two's
+		complement), u means unsigned, f means floating-point (IEEE 754
+		binary format). bits is the number of bits of data and storagebits
+		is the space (after padding) that it occupies in the buffer; when
+		using a floating-point format, bits must be one of the width values
+		defined in the IEEE 754 standard for binary interchange formats
+		(e.g. 16 indicates the binary16 format for half-precision numbers).
+		shift, if specified, is the shift that needs to be applied prior to
+		masking out unused bits. Some devices put their data in the middle
+		of the transferred elements with additional information on both
+		sides. Note that some devices will have additional information in
+		the unused bits, so to get a clean value the bits value must be
+		used to mask the buffer output value appropriately. The storagebits
+		value also specifies the data alignment. So s48/64>>2 will be a
+		signed 48 bit integer stored in a 64 bit location aligned to a 64
+		bit boundary. To obtain the clean value, shift right 2 and apply a
+		mask to zero the top 16 bits of the result.
 		For other storage combinations this attribute will be extended
 		appropriately.
 
diff --git a/Documentation/driver-api/iio/buffers.rst b/Documentation/driver-api/iio/buffers.rst
index 00398472ce59..43410b5053d2 100644
--- a/Documentation/driver-api/iio/buffers.rst
+++ b/Documentation/driver-api/iio/buffers.rst
@@ -37,10 +37,11 @@ directory contains attributes of the following form:
 * :file:`index`, the scan_index of the channel.
 * :file:`type`, description of the scan element data storage within the buffer
   and hence the form in which it is read from user space.
-  Format is [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift] .
+  Format is [be|le]:[s|u|f]bits/storagebits[Xrepeat][>>shift] .
 
   * *be* or *le*, specifies big or little endian.
-  * *s* or *u*, specifies if signed (2's complement) or unsigned.
+  * *s* or *u* or *f*, specifies if signed (2's complement) or unsigned or
+    floating-point.
   * *bits*, is the number of valid data bits.
   * *storagebits*, is the number of bits (after padding) that it occupies in the
     buffer.
diff --git a/Documentation/iio/iio_devbuf.rst b/Documentation/iio/iio_devbuf.rst
index dca1f0200b0d..6d7e7dcc2d80 100644
--- a/Documentation/iio/iio_devbuf.rst
+++ b/Documentation/iio/iio_devbuf.rst
@@ -86,7 +86,8 @@ within the buffer and hence the form in which it is read from userspace. Format
 is [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift], where:
 
 - **be** or **le** specifies big or little-endian.
-- **s** or **u** specifies if signed (2's complement) or unsigned.
+- **s** or **u** or **f** specifies if signed (2's complement) or unsigned or
+  floating-point.
 - **bits** is the number of valid data bits.
 - **storagebits** is the number of bits (after padding) that it occupies in the
   buffer.
-- 
2.39.5
Re: [PATCH v6 5/7] iio: ABI: Add support for floating-point numbers in buffer scan elements
Posted by David Lechner 1 month, 1 week ago
On 2/25/26 4:17 AM, Francesco Lavra wrote:
> In the data storage description of a scan element, the first character
> after the colon can have the values 's' and 'u' to specify signed and
> unsigned integers, respectively.
> Add 'f' as an allowed value to specify floating-point numbers formatted
> according to the IEEE 754 standard.
> 
> Signed-off-by: Francesco Lavra <flavra@baylibre.com>
> ---
>  Documentation/ABI/testing/sysfs-bus-iio  | 33 +++++++++++++-----------
>  Documentation/driver-api/iio/buffers.rst |  5 ++--
>  Documentation/iio/iio_devbuf.rst         |  3 ++-
>  3 files changed, 23 insertions(+), 18 deletions(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
> index 5f87dcee78f7..61961bca4dce 100644
> --- a/Documentation/ABI/testing/sysfs-bus-iio
> +++ b/Documentation/ABI/testing/sysfs-bus-iio
> @@ -1510,21 +1510,24 @@ Contact:	linux-iio@vger.kernel.org
>  Description:
>  		Description of the scan element data storage within the buffer
>  		and hence the form in which it is read from user-space.
> -		Form is [be|le]:[s|u]bits/storagebits[>>shift].
> -		be or le specifies big or little endian. s or u specifies if
> -		signed (2's complement) or unsigned. bits is the number of bits
> -		of data and storagebits is the space (after padding) that it
> -		occupies in the buffer. shift if specified, is the shift that
> -		needs to be applied prior to masking out unused bits. Some
> -		devices put their data in the middle of the transferred elements
> -		with additional information on both sides.  Note that some
> -		devices will have additional information in the unused bits
> -		so to get a clean value, the bits value must be used to mask
> -		the buffer output value appropriately.  The storagebits value
> -		also specifies the data alignment.  So s48/64>>2 will be a
> -		signed 48 bit integer stored in a 64 bit location aligned to
> -		a 64 bit boundary. To obtain the clean value, shift right 2
> -		and apply a mask to zero the top 16 bits of the result.
> +		Form is [be|le]:[s|u|f]bits/storagebits[>>shift].

Not related to this patch, but I notice that this is missing "repeat".
\
Re: [PATCH v6 5/7] iio: ABI: Add support for floating-point numbers in buffer scan elements
Posted by Andy Shevchenko 1 month, 1 week ago
On Wed, Feb 25, 2026 at 11:17:47AM +0100, Francesco Lavra wrote:
> In the data storage description of a scan element, the first character
> after the colon can have the values 's' and 'u' to specify signed and
> unsigned integers, respectively.
> Add 'f' as an allowed value to specify floating-point numbers formatted
> according to the IEEE 754 standard.

Main Q here: How will behave iio-tools and other existing user space when
it sees this? Shouldn't you prepare the user space first for such a change?

...

> -  Format is [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift] .
> +  Format is [be|le]:[s|u|f]bits/storagebits[Xrepeat][>>shift] .

I would probably keep order as [f|s|u] and...

> -  * *s* or *u*, specifies if signed (2's complement) or unsigned.
> +  * *s* or *u* or *f*, specifies if signed (2's complement) or unsigned or
> +    floating-point.

  * *f*, specifies if floating-point.
  * *s* or *u*, specifies if signed (2's complement) or unsigned.

...

>  - **be** or **le** specifies big or little-endian.
> -- **s** or **u** specifies if signed (2's complement) or unsigned.
> +- **s** or **u** or **f** specifies if signed (2's complement) or unsigned or
> +  floating-point.

Ditto.

-- 
With Best Regards,
Andy Shevchenko