Messages in this thread | | | Date | Tue, 13 Nov 2007 10:28:21 +0800 | From | "eric miao" <> | Subject | Re: [patch/rfc 1/4] GPIO implementation framework |
| |
Hi David,
I hope I was not late giving my humble feedback on this framework :-)
Can we use "per gpio based" structure instead of "per gpio_chip" based one, just like what the generic IRQ layer is doing nowadays? So that
a. you don't have to declare per gpio_chip "can_sleep", "is_out" and "requested". Those will be just bits of properties of a single GPIO.
b. and furthur more, one can avoid the use of ARCH_GPIOS_PER_CHIP, which leads to many holes
c. gpio_to_chip() will be made easy and straight forward
d. granularity of spin_lock()/_unlock() can be made small (per GPIO instead of per gpio_chip)
What do you think?
- eric
On Nov 6, 2007 5:05 AM, David Brownell <david-b@pacbell.net> wrote: > On Monday 29 October 2007, David Brownell wrote: > > > > Provides new implementation infrastructure that platforms may choose to use > > when implementing the GPIO programming interface. Platforms can update their > > GPIO support to use this. The downside is slower access to non-inlined GPIOs; > > rarely a problem except when bitbanging some protocol. > > I was asked just what that overhead *is* ... and it surprised me. > A summary of the results is appended to this note. > > Fortuntely it turns out those problems all go away if the gpiolib > code uses a *raw* spinlock to guard its table lookups. With a raw > spinlock, any performance impact of gpiolib seems to be well under > a microsecond in this bitbang context (and not objectionable). > Preempt became free; enabling debug options had only a minor cost. > > That's as it should be, since the only substantive changes were to > grab and release a lock, do one table lookup a bit differently, and > add one indirection function call ... changes which should not have > any visible performance impact on per-bit codepaths, and one might > expect to cost on the order of one dozen instructions. > > > So the next version of this code will include a few minor bugfixes, > and will also use a raw spinlock to protect that table. A raw lock > seems appropriate there in any case, since non-sleeping GPIOs should > be accessible from hardirq contexts even on RT kernels. > > If anyone has any strong arguments against using a raw spinlock > to protect that table, it'd be nice to know them sooner rather > than later. > > - Dave > > > SUMMARY: > > Using the i2c-gpio driver on a preempt kernel with all the usual > kernel debug options enabled, the per-bit times (*) went up in a > bad way: from about 6.4 usec/bit (original GPIO code on this board) > up to about 11.2 usec/bit (just switching to gpiolib), which is > well into "objectionable overhead" territory for bit access. > > Just enabling preempt shot the time up to 7.4 usec/bit ... which is > also objectionable (it's all-the-time overhead that is clearly > needless), but much less so. > > Converting the table lock to be a raw spinlock essentially removed > all non-debug overheads. It took enabling all those debug options > plus internal gpiolib debugging overhead to get those times up to > the 7.4 usec/bit that previously applied even with just preempt. > > (*) Those times being eyeballed medians; I didn't make time to find > a way to export a few thousand measurements from the tool and > do the math. The typical range was +/- one usec. > > The numbers include udelay() calls, so the relevant point is > the time *delta* attributable only to increased gpiolib costs, > not the base time (with udelays). The delta probably reflects > on the order of four GPIO calls: set two different bits, clear > one of them, and read it to make sure it cleared. > > > > > The upside is: > > > > * Providing two features which were "want to have (but OK to defer)" when > > GPIO interfaces were first discussed in November 2006: > > > > -A "struct gpio_chip" to plug in GPIOs that aren't directly supported > > by SOC platforms, but come from FPGAs or other multifunction devices > > (like UCB-1x00 GPIOs). > > > > -Full support for message-based GPIO expanders, needing a gpio_chip > > hookup; previous support for this part of the programming interface > > was just stubs. (One example: the widely used pcf8574 I2C chips, > > with 8 GPIOs each.) > > > > * Including a non-stub implementation of the gpio_{request,free}() calls, > > which makes those calls much more useful. The diagnostic labels are > > also recorded given DEBUG_FS, so /sys/kernel/debug/gpio can show a > > snapshot of all GPIOs known to this infrastructure. > > > > The driver programming interfaces introduced in 2.6.21 do not change at all; > > this new infrastructure is entirely below the covers. > > >
-- Cheers - eric - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |