Re: Kmod driver at iicbus. attach() and config_intrhook(9)

John-Mark Gurney <[email protected]>
Newsgroups gmane.os.freebsd.devel.arm
Message-ID <[email protected]>
Alexander Mishin wrote this message on Sat, Aug 22, 2020 at 00:59 +0400:
> Ian Lepore ?????????? 2020-08-21 02:51:
> > On Thu, 2020-08-20 at 15:39 -0700, John-Mark Gurney wrote:
> >> Alexander Mishin wrote this message on Thu, Aug 20, 2020 at 10:07
> >> +0400:
> >> > Ian Lepore ?????????? 2020-08-19 19:39:
> >> > > On Wed, 2020-08-19 at 00:24 -0700, Oleksandr Tymoshenko wrote:
> >> > > > Andriy Gapon ([email protected]) wrote:
> >> > > > > On 18/08/2020 22:05, Alexander Mishin wrote:
> >> > > > > > Hi
> >> > > > > > ...
> >> > > > > > But I see that some other devices (from /usr/src/sys/dev)
> >> > > > > > uses
> >> > > > > > CONFIG_INTRHOOK(9)
> >> > > > > > on attach() for initialize themselfs.
> >> > > > > > I wonder if I need this too? ...
> >> > > > >
> >> > > > > This is usually needed when a driver needs to talk to its
> >> > > > > device
> >> > > > > while
> >> > > > > attaching.  E.g., to set some initial configuration or to
> >> > > > > confirm
> >> > > > > device's
> >> > > > > identity, etc.
> >> > > >
> >> > > > To extend Andriy's explanation a bit: all these operations may
> >> > > > perform
> >> > > > I2C transfers and most I2C controllers use interrupts to get
> >> > > > notified
> >> > > > about tranfer status change (finished, error, etc...). There is
> >> > > > no
> >> > > > guarantee that when driver's attach method is called interrupts
> >> > > > are
> >> > > > globally enabled. What would happen in this case is: I2C
> >> > > > controller
> >> > > > is going to initiate I2C operation and wait for an interrupt
> >> > > > that's
> >> > > > never going to be delivered. CONFIG_INTRHOOK is a solution for
> >> > > > this
> >> > > > problem, if your attach method requires interrupts - just split
> >> > > > it
> >> > > > in two parts and postpone running interrupt-dependent part
> >> > > > until
> >> > > > after
> >> > > > interrupts are globally enabled.
> >> > >
> >> > > A note about all this:  It should never be necessary for an i2c
> >> > > slave
> >> > > device driver to do this.  The reason it's needed is because many
> >> > > i2c
> >> > > controller drivers attach the iicbus from their attach() routine
> >> > > even
> >> > > though they can't actually do i2c IO until interrupts are
> >> > > available.
> >> > > It is these controller drivers that should have the intrhook
> >> > > logic to
> >> > > not call bus_generic_attach() until interrupts are available if
> >> > > they
> >> > > can't do IO until interrupts are available.
> >> > >
> >> > > It has long been my goal to fix all our i2c controller drivers to
> >> > > behave correctly, so that i2c slave device drivers don't all need
> >> > > the
> >> > > intrhook logic.  But somehow I never get around to it.
> >> >
> >> > I think, it would be helpful, as it would be possible to return an
> >> > error
> >> > on early stage, from attach(), if there is no connection with the
> >> > configured device.
> >> 
> >> Looks like there's a function bus_delayed_attach_children designed
> >> exactly for this:
> >>  * Many buses can't run transactions on the bus which children need
> >> to probe and
> >>  * attach until after interrupts and/or timers are running.  This
> >> function
> >>  * delays their attach until interrupts and timers are enabled.
> >> 
> >> and it looks like a couple controllers are already using it, imx_i2c
> >> and ti_i2c...
> >> 
> >> It looks like maybe a simple replace of bus_generic_attach w/
> >> bus_delayed_attach_children should be enough on those w/
> >> interrupts...
> >> 
> >> Is there any argument for doing it for ALL controllers instead of
> >> just
> >> some?
> >> 
> >> Poking around some, and it looks like some (one) drivers "pretend" to
> >> use interrupts, but just busy wait instead, e.g. exynos5...
> >> 
> > 
> > Hmm, yeah, it looks like more has been done along these lines than I
> > remembered.  In fact, the work may be done.
> > 
> > Some i2c controllers have to work properly before interrupts are
> > available, to control things like PMIC chips that are required very
> > early in device configuration.  Typically they have some sort of
> > polling mechanism that's used early, and revert to using interrupts
> > once they're available.  The allwinner and rockchip drivers work that
> > way.
> > 
> Just to dot the i's, my SoC is allwinner (Orange PI PC). And the issue 
> at boot time really showed itself up until config_intrhook was used.
> FreeBSD myhost.mh.net.ru 13.0-CURRENT FreeBSD 13.0-CURRENT #3 r364004

Maybe I misread this thread, but this implied to me that the device had
to do the config_intrhook work in order to work on the twsi i2c bus
driver, is this not the case?

Alexander Mishin wrote this message on Tue, Sep 01, 2020 at 19:21 +0400:
> Andriy Gapon ?????????? 2020-09-01 09:51:
> > On 01/09/2020 03:26, John-Mark Gurney wrote:
> >> Ok, then the OP shouldn't be having a problem then, maybe you can help
> >> then figure it out then?
> > 
> > Was there actually any problem?
> > I thought that OP was just inquiring about the pattern commonly seen
> > in the code.
> > 
> > Alexander Mishin wrote:
> >> But I see that some other devices (from /usr/src/sys/dev) uses 
> >> CONFIG_INTRHOOK(9)
> >> on attach() for initialize themselfs.
> >> I wonder if I need this too? ...or maybe... when I might need it?
> 
> Yes, exactly. And I quite understood about using config_intrhook(9), 
> thank you all!
> ...but still interesting to read if the need for this would be removed 
> for the twsi controller.

So my reading of the twsi driver is that it handles things correctly
allowing devices pre-interrupts to attach, and using interrupts for
transfers post-cold.

So, your driver does not need to do any config_intrhook magic to make
it work.

If you run across any other i2c bus controllers than need it, then that
controller should be fixed.

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-arm
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.