On Sat, May 22, 2021 at 01:11:07PM -0700, Greg Steuck wrote:
> Jonathan Gray <[email protected]> writes:
>
> > As with otto's earlier problem there is likely something wrong
> > with sys/dev/pci/drm/i915/display/intel_gmbus.c or the way linux style
> > i2c is handled in drm_linux.c.
> >
> > As kettenis previously suggested this may be a problem with falling back
> > to bit banging.
> >
> > https://marc.info/?l=openbsd-bugs&m=159178640810102&w=2
>
> This does seem to be the case (full log at the end):
>
> May 22 09:29:22 lenny /bsd: GMBUS [i915 gmbus dpb] timed out, falling back to
> bit banging on pin 1
> May 22 09:29:22 lenny /bsd: GMBUS [i915 gmbus dpb] timed out after NAK
> May 22 09:29:22 lenny /bsd: GMBUS [i915 gmbus dpb] NAK for addr: 0050 w(1)
> May 22 09:29:22 lenny /bsd: GMBUS [i915 gmbus dpb] timed out after NAK
> May 22 09:29:22 lenny /bsd: GMBUS [i915 gmbus dpb] NAK for addr: 0050 w(1)
> May 22 09:29:22 lenny /bsd: GMBUS [i915 gmbus dpb] timed out, falling back to
> bit banging on pin 1
> May 22 09:29:22 lenny /bsd: DP dual mode HDMI ID: 0xffff800021bfe110E (err -5)
> May 22 09:29:22 lenny /bsd: [CONNECTOR:110:HDMI-A-1] status updated from
> connected to disconnected
>
> > I would prefer if someone who sees this issue could find the cause
> > instead of continuing to add workarounds.
>
> We can certainly try to fix the gmbus problem though I believe it is
> separable from the out-of-bounds access in the error reporting path
> https://marc.info/?l=openbsd-tech&m=162061987617667&w=2
>
> If you have patches to try, I'm happy to give them a go...
intel_gmbus.c has
/*
* We wish to retry with bit banging
* after a timed out GMBUS attempt.
*/
bus->adapter.retries = 1;
does this help?
Index: sys/dev/pci/drm/drm_linux.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v
retrieving revision 1.79
diff -u -p -r1.79 drm_linux.c
--- sys/dev/pci/drm/drm_linux.c 11 Apr 2021 15:30:51 -0000 1.79
+++ sys/dev/pci/drm/drm_linux.c 28 May 2021 09:51:58 -0000
@@ -955,15 +955,21 @@ fail:
int
i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
- int ret;
+ int ret, retries;
if (adap->lock_ops)
adap->lock_ops->lock_bus(adap, 0);
+ retries = adap->retries;
+retry:
if (adap->algo)
ret = adap->algo->master_xfer(adap, msgs, num);
else
ret = i2c_master_xfer(adap, msgs, num);
+ if (ret == -EAGAIN && retries > 0) {
+ retries--;
+ goto retry;
+ }
if (adap->lock_ops)
adap->lock_ops->unlock_bus(adap, 0);