From: Dmitry Guzman <Dmitry.Guzman@mobileye.com>
To: Andi Shyti <andi.shyti@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Linus Walleij <linusw@kernel.org>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
"Benoît Monin" <benoit.monin@bootlin.com>,
"Dmitry Guzman" <Dmitry.Guzman@mobileye.com>
Subject: [PATCH v2 00/12] I2C - detailed transfer reporting in case of a fault
Date: Thu, 03 Sep 2026 08:38:07 +0300 [thread overview]
Message-ID: <20260903-i2c-fault-reporting-v2-0-fedeb91792e6@mobileye.com> (raw)
The existing API has function `i2c_xfer` that transfers one or more
messages, and it only returns a single error code if the transfer was
failed. It doesn't allow to know how many of the messages were
transferred successfully, neither how many bytes were transferred in the
message that caused the fault, and also it drops all data received from
target device before the fault. There is a comment about this in
drivers/i2c/i2c-core-base.c: "REVISIT the fault reporting model here is
weak".
This patch series implements new API function `i2c_xfer_v2` that does
the same as `i2c_xfer` but also returns detailed transfer report, including
number of messages and bytes transferred before the fault. This also allows
client to get the bytes read from the target before the fault occurred.
For user space clients, new ioctl `I2C_RDWR_V2` is introduced.
Patch for `i2c-tools` user space utility that introduces support of this
feature:
https://lore.kernel.org/linux-i2c/20260623-i2c_detailed_report-v1-1-b67259a31a9d@mobileye.com/
A usage example (the first message changes the target address, so the
second message is not ACKed):
# i2ctransfer -r -y 0 w2@0x20 0 0x55 r1
Error: No such device or address at message 1
1 out of 2 messages sent
#
In this patchset, the introduced functionality is implemented in
`i2c-nomadik` and `i2c-designware` drivers. Several other improvements in
these drivers related to fault handling are also included in this patchset.
`i2c-nomadik` driver has been tested on EyeQ6H.
`i2c-designware` driver has been tested on EyeQ6L+.
The implementation is split up into patches:
Patch #1 Introduce callback `xfer_v2` in struct `i2c_algorithm`,
function `i2c_xfer_v2`, ioctl `I2C_RDWR_V2`, structures for I2C
transfer reporting and implement all driver-independent functionality.
Patch #2 Optimize struct layout in `i2c-nomadik`.
Patch #3 Remove automatic retransfer in `i2c-nomadik`.
Patch #4 Fix error codes returned by `xfer` callback in `i2c-nomadik`.
Patch #5 Replace `dev_err` with `dev_dbg` on I2C faults in `i2c-nomadik`.
Patch #6 Add quirks that describe some limitations of `i2c-nomadik`.
Patch #7 Add support for `xfer_v2` in `i2c-nomadik`.
Patch #8 Fix error codes returned by `xfer` callback in
`i2c-designware`.
Patch #9 Reset SMBUS_READ_BLOCK_DATA bit in functionality mask for
`designware` variants without EMPTYFIFO_HOLD_MASTER feature.
Patch #10 Terminate transfer if spurious STOP is detected in
`i2c-designware` driver.
Patch #11 Separate `i2c_algorithm` structure for AMD_NAVI_GPU variant of
designware controller.
Patch #12 Add support for `xfer_v2` in `i2c-designware` driver.
Signed-off-by: Dmitry Guzman <Dmitry.Guzman@mobileye.com>
---
Changes in v2:
- Add support for detailed transfer reporting in designware driver (patches
#8..#12).
- Change `unsigned char` into `u8` in patch #2.
- Added code-review trailers for patches #3..#7.
- Rebase on new kernel version (no conflicting code changes).
- Link to v1: https://lore.kernel.org/r/20260623-i2c-fault-reporting-v1-0-6db1a8aabf18@mobileye.com
---
Dmitry Guzman (12):
i2c: core: add I2C_XFER_V2 - support for detailed transfer reporting
i2c: nomadik: optimize struct layout, change unsigned char into u8
i2c: nomadik: do not try to retransmit I2C message series on errors
i2c: nomadik: return proper fault codes
i2c: nomadik: change print level for fault messages to debug
i2c: nomadik: add quirks max_len=2047 and no_zero_len_read
i2c: nomadik: add support for I2C_XFER_V2 - detailed fault reporting
i2c: designware: return proper fault codes
i2c: designware: no SMBUS_READ_BLOCK_DATA without EMPTYFIFO_HOLD_MASTER
i2c: designware: stop transfer if spurious STOP is detected
i2c: designware: use separate `i2c_algorithm` for AMD_NAVI_GPU
i2c: designware: add support for I2C_XFER_V2 - detailed fault reporting
Documentation/i2c/dev-interface.rst | 46 +++++++++
drivers/i2c/busses/i2c-designware-common.c | 23 ++++-
drivers/i2c/busses/i2c-designware-core.h | 14 ++-
drivers/i2c/busses/i2c-designware-master.c | 160 ++++++++++++++++++++++++++---
drivers/i2c/busses/i2c-nomadik.c | 111 ++++++++++++++------
drivers/i2c/i2c-core-base.c | 107 +++++++++++++------
drivers/i2c/i2c-dev.c | 79 +++++++++++---
include/linux/i2c.h | 12 +++
include/trace/events/i2c.h | 6 +-
include/uapi/linux/i2c-dev.h | 9 ++
include/uapi/linux/i2c.h | 21 ++++
11 files changed, 489 insertions(+), 99 deletions(-)
---
base-commit: 940de590b839f71d6dc846160534bf202401b8b7
change-id: 20260623-i2c-fault-reporting-9236c9affc2d
Best regards,
--
Dmitry Guzman <Dmitry.Guzman@mobileye.com>
next reply other threads:[~2026-09-03 5:39 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 5:38 Dmitry Guzman [this message]
2026-09-03 5:38 ` [PATCH v2 01/12] i2c: core: add I2C_XFER_V2 - support for detailed transfer reporting Dmitry Guzman
2026-09-03 7:21 ` Andy Shevchenko
2026-09-03 5:38 ` [PATCH v2 02/12] i2c: nomadik: optimize struct layout, change unsigned char into u8 Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 03/12] i2c: nomadik: do not try to retransmit I2C message series on errors Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 04/12] i2c: nomadik: return proper fault codes Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 05/12] i2c: nomadik: change print level for fault messages to debug Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 06/12] i2c: nomadik: add quirks max_len=2047 and no_zero_len_read Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 07/12] i2c: nomadik: add support for I2C_XFER_V2 - detailed fault reporting Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 08/12] i2c: designware: return proper fault codes Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 09/12] i2c: designware: no SMBUS_READ_BLOCK_DATA without EMPTYFIFO_HOLD_MASTER Dmitry Guzman
2026-09-03 7:39 ` Andy Shevchenko
2026-09-03 5:38 ` [PATCH v2 10/12] i2c: designware: stop transfer if spurious STOP is detected Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 11/12] i2c: designware: use separate `i2c_algorithm` for AMD_NAVI_GPU Dmitry Guzman
2026-09-03 5:38 ` [PATCH v2 12/12] i2c: designware: add support for I2C_XFER_V2 - detailed fault reporting Dmitry Guzman
2026-09-03 7:47 ` Andy Shevchenko
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=20260903-i2c-fault-reporting-v2-0-fedeb91792e6@mobileye.com \
--to=dmitry.guzman@mobileye.com \
--cc=andi.shyti@kernel.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=benoit.monin@bootlin.com \
--cc=linusw@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=rostedt@goodmis.org \
/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