From: Luca Ceresoli <luca.ceresoli@bootlin.com>
To: zzam@gentoo.org
Cc: "Tomi Valkeinen" <tomi.valkeinen@ideasonboard.com>,
linux-media@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org,
"Rob Herring" <robh+dt@kernel.org>,
"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
"Wolfram Sang" <wsa@kernel.org>,
"Andy Shevchenko" <andriy.shevchenko@intel.com>,
"Matti Vaittinen" <Matti.Vaittinen@fi.rohmeurope.com>,
"Laurent Pinchart" <laurent.pinchart+renesas@ideasonboard.com>,
"Mauro Carvalho Chehab" <mchehab@kernel.org>,
"Peter Rosin" <peda@axentia.se>,
"Liam Girdwood" <lgirdwood@gmail.com>,
"Mark Brown" <broonie@kernel.org>,
"Sakari Ailus" <sakari.ailus@linux.intel.com>,
"Michael Tretter" <m.tretter@pengutronix.de>,
"Hans Verkuil" <hverkuil@xs4all.nl>,
"Mike Pagano" <mpagano@gentoo.org>,
"Krzysztof Hałasa" <khalasa@piap.pl>,
"Marek Vasut" <marex@denx.de>,
"Satish Nagireddy" <satish.nagireddy@getcruise.com>,
"Luca Ceresoli" <luca@lucaceresoli.net>
Subject: Re: [PATCH v10 1/8] i2c: add I2C Address Translator (ATR) support
Date: Mon, 20 Mar 2023 09:28:30 +0100 [thread overview]
Message-ID: <20230320092830.0431d042@booty> (raw)
In-Reply-To: <70323408-b823-1f1a-0202-434e6243b2af@gentoo.org>
Hello Matthias,
thanks for the in-depth review!
On Mon, 20 Mar 2023 07:34:34 +0100
zzam@gentoo.org wrote:
> Some inline comments below.
>
> Regards
> Matthias
>
> Am 22.02.23 um 14:29 schrieb Tomi Valkeinen:
> > From: Luca Ceresoli <luca@lucaceresoli.net>
> >
> > An ATR is a device that looks similar to an i2c-mux: it has an I2C
> > slave "upstream" port and N master "downstream" ports, and forwards
> > transactions from upstream to the appropriate downstream port. But it
> > is different in that the forwarded transaction has a different slave
> > address. The address used on the upstream bus is called the "alias"
> > and is (potentially) different from the physical slave address of the
> > downstream chip.
> >
> > Add a helper file (just like i2c-mux.c for a mux or switch) to allow
> > implementing ATR features in a device driver. The helper takes care or
> > adapter creation/destruction and translates addresses at each transaction.
> >
> > Signed-off-by: Luca Ceresoli <luca@lucaceresoli.net>
> > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> > ---
> > Documentation/i2c/index.rst | 1 +
> > Documentation/i2c/muxes/i2c-atr.rst | 97 +++++
> > MAINTAINERS | 8 +
> > drivers/i2c/Kconfig | 9 +
> > drivers/i2c/Makefile | 1 +
> > drivers/i2c/i2c-atr.c | 548 ++++++++++++++++++++++++++++
> > include/linux/i2c-atr.h | 116 ++++++
> > 7 files changed, 780 insertions(+)
> > create mode 100644 Documentation/i2c/muxes/i2c-atr.rst
> > create mode 100644 drivers/i2c/i2c-atr.c
> > create mode 100644 include/linux/i2c-atr.h
> >
> [...]
> > diff --git a/drivers/i2c/i2c-atr.c b/drivers/i2c/i2c-atr.c
> > new file mode 100644
> > index 000000000000..5ab890b83670
> > --- /dev/null
> > +++ b/drivers/i2c/i2c-atr.c
> > @@ -0,0 +1,548 @@
> [...]
> > +
> > +/*
> > + * Replace all message addresses with their aliases, saving the original
> > + * addresses.
> > + *
> > + * This function is internal for use in i2c_atr_master_xfer(). It must be
> > + * followed by i2c_atr_unmap_msgs() to restore the original addresses.
> > + */
> > +static int i2c_atr_map_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs,
> > + int num)
> > +{
> > + struct i2c_atr *atr = chan->atr;
> > + static struct i2c_atr_cli2alias_pair *c2a;
> > + int i;
> > +
> > + /* Ensure we have enough room to save the original addresses */
> > + if (unlikely(chan->orig_addrs_size < num)) {
> > + u16 *new_buf;
> > +
> > + /* We don't care about old data, hence no realloc() */
> > + new_buf = kmalloc_array(num, sizeof(*new_buf), GFP_KERNEL);
> > + if (!new_buf)
> > + return -ENOMEM;
> > +
> > + kfree(chan->orig_addrs);
> > + chan->orig_addrs = new_buf;
> > + chan->orig_addrs_size = num;
> > + }
> > +
> > + for (i = 0; i < num; i++) {
> > + chan->orig_addrs[i] = msgs[i].addr;
> > +
> > + c2a = i2c_atr_find_mapping_by_addr(&chan->alias_list,
> > + msgs[i].addr);
> > + if (!c2a) {
> > + dev_err(atr->dev, "client 0x%02x not mapped!\n",
> > + msgs[i].addr);
> > + return -ENXIO;
> I miss the roll-back of previously modified msgs[].addr values.
Indeed you have a point. There is a subtle error in case all of the
following happen in a single i2c_atr_master_xfer() call:
* there are 2+ messages, having different addresses
* msg[0] is mapped correctly
* msg[n] (n > 0) fails mapping
It's very unlikely, but in this case we'd get back to the caller with
an error and modified addresses for the first n messages. Which in turn
is unlikely to create any problems, but it could.
Tomi, do you agree?
This looks like a simple solution:
if (!c2a) {
+ i2c_atr_unmap_msgs(chan, msgs, i);
...
}
While there, maybe switching to dev_err_probe would make code cleaner.
> > +/*
> > + * Restore all message address aliases with the original addresses. This
> > + * function is internal for use in i2c_atr_master_xfer().
> > + *
> > + * @see i2c_atr_map_msgs()
> > + */
> > +static void i2c_atr_unmap_msgs(struct i2c_atr_chan *chan, struct i2c_msg *msgs,
> > + int num)
> > +{
> > + int i;
> > +
> > + for (i = 0; i < num; i++)
> > + msgs[i].addr = chan->orig_addrs[i];
> Does this code needs null and size checks for orig_addrs/orig_addrs_size
> to protect from oopses?
> This cannot happen now as i2c_atr_master_xfer returns early when
> i2c_atr_map_msgs fails.
The map/unmap functions are really a part of i2c_atr_master_xfer() that
has been extracted for code readability, as the comments say, and I
can't think of a different use for them. So I think this code is OK as
is.
However a small comment might help future readers, especially in case
code will change and these functions gain new use cases.
E.g.
This function is internal for use in i2c_atr_master_xfer()
+ and for this reason it needs no null and size checks on orig_addr.
It must be followed by i2c_atr_unmap_msgs() to restore the original addresses.
Regards,
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2023-03-20 8:28 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-22 13:28 [PATCH v10 0/8] i2c-atr and FPDLink Tomi Valkeinen
2023-02-22 13:29 ` [PATCH v10 1/8] i2c: add I2C Address Translator (ATR) support Tomi Valkeinen
2023-03-08 12:20 ` Tomi Valkeinen
2023-03-20 17:00 ` Wolfram Sang
2023-03-20 17:15 ` Tomi Valkeinen
2023-03-17 9:16 ` Luca Ceresoli
2023-03-17 12:11 ` Andy Shevchenko
2023-03-17 12:36 ` Tomi Valkeinen
2023-03-17 13:43 ` Andy Shevchenko
2023-03-20 6:34 ` zzam
2023-03-20 8:28 ` Luca Ceresoli [this message]
2023-03-20 12:12 ` Tomi Valkeinen
2023-03-21 10:56 ` Luca Ceresoli
2023-04-18 14:25 ` Wolfram Sang
2023-04-19 7:13 ` Luca Ceresoli
2023-02-22 13:29 ` [PATCH v10 2/8] media: subdev: Split V4L2_SUBDEV_ROUTING_NO_STREAM_MIX Tomi Valkeinen
2023-02-22 13:29 ` [PATCH v10 3/8] dt-bindings: media: add TI DS90UB913 FPD-Link III Serializer Tomi Valkeinen
2023-02-22 13:29 ` [PATCH v10 4/8] dt-bindings: media: add TI DS90UB953 " Tomi Valkeinen
2023-02-22 13:29 ` [PATCH v10 5/8] dt-bindings: media: add TI DS90UB960 FPD-Link III Deserializer Tomi Valkeinen
2023-04-18 13:06 ` Wolfram Sang
2023-04-19 7:13 ` Luca Ceresoli
2023-04-19 8:05 ` Wolfram Sang
2023-04-19 16:13 ` Luca Ceresoli
2023-04-19 18:09 ` Wolfram Sang
2023-04-20 7:30 ` Tomi Valkeinen
2023-04-20 18:47 ` Wolfram Sang
2023-04-21 6:18 ` Tomi Valkeinen
2023-02-22 13:29 ` [PATCH v10 6/8] media: i2c: add DS90UB960 driver Tomi Valkeinen
2023-02-23 0:59 ` kernel test robot
2023-02-22 13:29 ` [PATCH v10 7/8] media: i2c: add DS90UB913 driver Tomi Valkeinen
2023-02-22 13:29 ` [PATCH v10 8/8] media: i2c: add DS90UB953 driver Tomi Valkeinen
2023-02-23 7:10 ` kernel test robot
2023-02-22 14:15 ` [PATCH v10 0/8] i2c-atr and FPDLink Andy Shevchenko
2023-02-22 14:17 ` Andy Shevchenko
2023-02-23 8:19 ` Tomi Valkeinen
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=20230320092830.0431d042@booty \
--to=luca.ceresoli@bootlin.com \
--cc=Matti.Vaittinen@fi.rohmeurope.com \
--cc=andriy.shevchenko@intel.com \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=hverkuil@xs4all.nl \
--cc=khalasa@piap.pl \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=lgirdwood@gmail.com \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=luca@lucaceresoli.net \
--cc=m.tretter@pengutronix.de \
--cc=marex@denx.de \
--cc=mchehab@kernel.org \
--cc=mpagano@gentoo.org \
--cc=peda@axentia.se \
--cc=robh+dt@kernel.org \
--cc=sakari.ailus@linux.intel.com \
--cc=satish.nagireddy@getcruise.com \
--cc=tomi.valkeinen@ideasonboard.com \
--cc=wsa@kernel.org \
--cc=zzam@gentoo.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.