Re: [RFC PATCH 2/2] hwmon: (pmbus/ucd9000) Throttle SMBus transfers to avoid poor behaviour

Guenter Roeck
2020-09-16T18:45:11Z

On Wed, Sep 16, 2020 at 02:51:08PM +0930, Andrew Jeffery wrote:
>
>
> On Mon, 14 Sep 2020, at 23:44, Guenter Roeck wrote:
> > On 9/14/20 5:28 AM, Andrew Jeffery wrote:
> > > Short turn-around times between transfers to e.g. the UCD90320 can lead
> > > to problematic behaviour, including excessive clock stretching, bus
> > > lockups and potential corruption of the device's volatile state.
> > >
> > > Introduce transfer throttling for the device with a minimum access
> > > delay of 1ms.
> > >
> >
> > Some Zilker labs devices have the same problem, though not as bad
> > to need a 1ms delay. See zl6100.c. Various LTS devices have a similar
> > problem, but there it is possible to poll the device until it is ready.
> > See ltc2978.c.
> >
> > > Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
> > > ---
> > > drivers/hwmon/pmbus/ucd9000.c | 6 ++++++
> > > 1 file changed, 6 insertions(+)
> > >
> > > diff --git a/drivers/hwmon/pmbus/ucd9000.c b/drivers/hwmon/pmbus/ucd9000.c
> > > index 81f4c4f166cd..a0b97d035326 100644
> > > --- a/drivers/hwmon/pmbus/ucd9000.c
> > > +++ b/drivers/hwmon/pmbus/ucd9000.c
> > > @@ -9,6 +9,7 @@
> > > #include <linux/debugfs.h>
> > > #include <linux/kernel.h>
> > > #include <linux/module.h>
> > > +#include <linux/moduleparam.h>
> > > #include <linux/of_device.h>
> > > #include <linux/init.h>
> > > #include <linux/err.h>
> > > @@ -18,6 +19,9 @@
> > > #include <linux/gpio/driver.h>
> > > #include "pmbus.h"
> > >
> > > +static unsigned long smbus_delay_us = 1000;
> >
> > Is that to be on the super-safe side ? Patch 0 talks about needing 250 uS.
> >
> > > +module_param(smbus_delay_us, ulong, 0664);
> > > +
> >
> > I would not want to have this in user control, and it should not affect devices
> > not known to be affected.
>
> Can you clarify what you mean here? Initially I interpreted your statement as
> meaning "Don't impose delays on the UCD90160 when the issues have only been
> demonstrated with the UCD90320". But I've since looked at zl6100.c and its

Yes, that is what I meant.

> delay is also exposed as a module parameter, which makes me wonder whether it

My bad. Not how I would implement it today. I'd also not use udelay() if I were
to re-implement this today.

> was unclear that smbus_delay_us here is specific to the driver's i2c_client and
> is not a delay imposed on all SMBus accesses from the associated master. That
> is, with the implementation I've posted here, other (non-UCD9000) devices on
> the same bus are _not_ impacted by this value.
>
The delay is specific to the driver's i2c client.

> > I would suggest an implementation similar to other
> > affected devices; again, see zl6100.c or ltc2978.c for examples.
>
> I've had a look at these two examples. As you suggest the delays in zl6100.c
> look pretty similar to what this series implements in the i2c core. I'm finding
> it hard to dislodge the feeling that open-coding the waits is error prone, but
> to avoid that and not implement the waits in the i2c core means having almost
> duplicate implementations of handlers for i2c_smbus_{read,write}*() and
> pmbus_{read,write}*() calls in the driver.
>

Not sure I can follow you here. Anyway, it seems to me that you are set on
an implementation in the i2c core. I personally don't like that approach,
but I'll accept a change in the ucd9000 driver to make use of it. Please
leave the zl6100 code alone, though - it took me long enough to get that
working, and I won't have time to test any changes.

Thanks,
Guenter