Re: [spi-devel-general] Re: [PATCH] spi: Added spi master driver for Freescale MPC83xx SPI controller
From: David Brownell
Date: Fri Apr 07 2006 - 21:25:44 EST
On Friday 07 April 2006 10:04 am, Kumar Gala wrote:
> > Well, not the _only_ way. The polling-type txrx_word() calls are
> > also full duplex. My point is more that it's bad/inefficient to
> > incur both IRQ _and_ task switch overheads per word, when it would
> > be a lot simpler to just have the IRQ handler do its normal job.
Not that you actually _need_ an IRQ handler to be correct, in any case.
> > (And that's even true if you've turned hard IRQ handlers into threads
> > for PREEMPT_RT or whatever. In that case the "IRQ overhead" is a
> > task switch, but you're still saving _additional_ task switches.)
>
> This makes more sense about what I'm doing that is wasteful.
> However, I'm not sure exactly where I should plug into things.
Only using interfaces below the line in spi_bitbang that says
it's the "SECOND PART".
> I think you are saying to continue using spi_bitbang_transfer &
> spi_bitbang_work, but have spi_bitbang_work call my own bitbang-
> >txrx_bufs().
Yes. Consider several different ways to implement that I/O loop:
- Interrupt plus two context switches per byte (what you have now),
no per-buffer context switch
- Interrupt per byte, plus one context switch pair per buffer
(what I've described)
- pure PIO per byte, no context switches (as if you polled
the registers rather than using an IRQ)
Any of them could be correct, but one of them is a lot worse in terms
of CPU overhead when you aim at tranfer rates of even just a few MBytes
per second. (It's the one with lots of needless context switching.)
That pure PIO model will sometimes be very appropriate; if the SPI clock
is fast enough, it can be less overhead than the IRQ driven one.
- Dave
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/