Re: [RFC 0/8] iio: add support for hardware fifo

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2014-11-18 at 13:24 +0000, jic23@xxxxxxxxxx wrote:
> Octavian Purdila writes: 
> 
> > Hi everybody,
> Hi Octavian.
> > 
> > I hope this RFC is a good starting point to discuss support for
> > hardware fifo in IIO. The main reason to support it is to reduce the
> > power consumtion, by allowing the CPU to enter deep sleep states for
> > longer periods of time.
> A worthwhile aim indeed.
> > 
> > Don't get discourage by the large number of patches most of them are
> > refactors in the bmc150 driver, to make it easier to add support for
> > the hardware fifo (basically to make adding interrupts and
> > events/triggers easier). 
> > 
> > For discussing the hardware fifo stuff, only the first and last
> > patches are important: the first adds new IIO attributes so that we
> > can expose the hardware fifo and the last implements hadware fifo for
> > IIO (as an example of how would a device use the exposed attributes). 
> > 
> > Note that the attributes can be exposed on a per device or per channel
> > basis, since it seems both types of hardware fifos exists: those that
> > store all data in a single fifo (temperature, accelerometer,
> > magnetometer, etc.) and those that have separate fifos for
> > accelerometer, gyroscope, etc. Thankfully, at the driver level we just
> > need to use the appropriate sharing level to support one mode or the
> > other.
> If this is the case, then the buffered outputs will have to be separate
> so we know what is coming.  E.g. it will have to be effectively treated
> as separate iio_buffers.  Now we have devices that already do (see some
> of the more interesting SOC ADCs) 
> 
> Is this actually the case for the bmc150? If you could point at
> devices where it is then it would be great (as mentioned above one
> or two SOC ADCs have a bonkers level of flexibility).
> My reading of the datasheet is that the data is interleaved in the
> buffer for any channels enable. 
> 
> > 
> > Also note that this patch is orthogonal to the software watermark /
> > batching patch send on the list a while back.
> 
I think last watershed patch was reviewed and agreed upon, but looks
like never merged. I think the author dropped the approach. I think as a
start we should merge this patch. In addition those watersheds should be
exposed to IIO drivers, so that individual drivers can estimate FIFO
size in combination with sampling frequency. 
> I'm not so sure this is orthogonal at all.   That proposal was actually
> about hardware support.  I pushed back that I wanted any new interface
> to work whether or not there was hardware support.  In a sense that is
> a more complex problem - hence the discussion became a little bit focused
> on that case. 
> 
> The intent there was to hide the implementation details of exactly this
> sort of hardware/software buffer interaction. 
> 
> Perhaps some history is in order. 
> 
> We had exactly what you propose here a long time back with the sca3000
> accelerometer (which is why there is still core support for hardware
> buffers).  The interface was precisely the watershed type you have
> here. 
> 
> A review by Arnd Bergman pointed out that this was seriously clunky. 
> 
> It puts data related to the in-band data flow into our out-of-band channel.
> His suggestion was to allow for watershed interrupts using one of the
> more interesting POLL types leaving the main poll for the data flow.
> Arnd also suggested the bits about using anonymous chardevs for the event
> reporting etc.  The unusual form of poll bit never got implemented,
> but in the interests of moving forward with the common case and because
> they were on there way out anyway the watershed interrupts were dropped. 
> 
> The more recent discussion came to the conclusion that there was no need
> to use the weird forms of poll.  We could simply have an attribute to
> control when poll was fired.  The only bit that caused friction was whether
> there should be a timeout or not. 
> 
> Now, when then ti_am35xx driver came along it became clear that it wasn't
> actually terribly useful exposing the hardware buffers directly to
> user space.  The buffers tend not to be terribly long (in your bma160) I
> see they are only 32 elements.  As such the conclusion was that it makes
> more sense to use the buffers as temporary storage to smooth out the
> data flow.  Thus that driver fills a software buffer from a hardware
> buffer.  This seems the method that is most likely to work long term.
> I note this is effectively what you have here, though I'm not sure of
> the advantage of the explicit software flush over just reading the data
> whenever the interrupt fires. 
> 
> Hence we started with something that at least superficially (I haven't
> had a chance to go through the implementation in detail yet)
> looks similar to what you have but ended up changing the method of
> signalling to and from userspace. 
> 
> Hardware buffer -> Software buffer -> user space. 
> 
> Userspace watershed control -> Software buffer watershed control
>  -> Hardware buffer watershed control. 
> 
> If userspace sets the watershed to say 16 then, as well as setting
> that level in the software buffer it should be passed on to the
> device driver allowing the watershed there to be set appropriately.
> Now things get interesting if userspace sets the watershed to a value
> that makes no sense for the hardware (say 17 on a device that does
> power of 2 values only) as then it will have to fall back to
> grabbing every one (Watershed of 1).  Perhaps we can provide 'hints'
> for this? 
> 
> Anyhow, having given this general comment, I'll give some feedback on
> the implementation details. 
> 
> Jonathan 
> 
> > 
> > Octavian Purdila (8):
> >   iio: add support for hardware fifo
> >   iio: bmc150: refactor slope duration and threshold update
> >   iio: bmc150: refactor interrupt enabling
> >   iio: bmc150: exit early if event / trigger state is not changed
> >   iio: bmc150: introduce bmc150_accel_interrupt
> >   iio: bmc150: introduce bmc150_accel_trigger
> >   iio: bmc150: introduce bmc150_accel_event
> >   iio: bmc150: add support for hardware fifo 
> > 
> >  Documentation/ABI/testing/sysfs-bus-iio |  51 ++
> >  drivers/iio/accel/bmc150-accel.c        | 976 ++++++++++++++++++++++----------
> >  drivers/iio/industrialio-core.c         |   2 +
> >  drivers/iio/industrialio-event.c        |   2 +
> >  include/linux/iio/iio.h                 |  17 +
> >  include/linux/iio/types.h               |   2 +
> >  6 files changed, 739 insertions(+), 311 deletions(-) 
> > 
> > -- 
> > 1.9.1 
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html

��.n��������+%������w��{.n�����{��(��)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux