[PATCH/RFC] Hookable IO operations

Benjamin Herrenschmidt benh at kernel.crashing.org
Sat Nov 4 09:32:01 EST 2006


> I think it would be helpful to not generate the function name itself,
> but pass it down to the macro, so you grep for the definition, either
> 
> DEF_MMIO_IN_BE(in_be16, u16, lwz)
> 
> or going further, making it look more like a declaration
> 
> static inline u16 DEF_MMIO_IN_BE(in_be16, u16, lwz)
> 
> which may even do the right thing with ctags (need to check that)

I'll look into it.

> > +/*
> > + * IO stream instructions are defined out of line
> > + */
> > +extern void _insb(volatile u8 __iomem *port, void *buf, long count);
> > +extern void _outsb(volatile u8 __iomem *port, const void *buf, long count);
> > +extern void _insw_ns(volatile u16 __iomem *port, void *buf, long count);
> > +extern void _outsw_ns(volatile u16 __iomem *port, const void *buf, long count);
> > +extern void _insl_ns(volatile u32 __iomem *port, void *buf, long count);
> > +extern void _outsl_ns(volatile u32 __iomem *port, const void *buf, long count);
> 
> If you leave out the 'extern', it fits into a normal line ;-)

Did I change them from the initial definition ? Anyway, I dislike
prototypes in headers without "extern".

> 
> similarly here, you could write these using slightly different macros
> as 
> 
> DEF_PCI_AC_OUT_MMIO(writeb, u8)
> DEF_PCI_AC_OUT_PIO(outb, u8)
> DEF_PCI_AC_OUT_MMIO(writew, u16)
> DEF_PCI_AC_OUT_PIO(outw, u16)

I'll look at it.

> > +
> > +/* We still use EEH versions for now. Ultimately, we might just get rid of
> > + * EEH in here and use it as a set of __memset_io etc... hooks
> > + */
> 
> Yes, I fully agree. The definition of eeh_memset_io and the others
> looks like they really want to be out-of-line.

Yes.

> > +
> > +extern void (*__memset_io)(volatile void __iomem *addr, int c,
> > +			   unsigned long n);
> > +extern void (*__memcpy_fromio)(void *dest, const volatile void __iomem *src,
> > +			       unsigned long n);
> > +extern void (*__memcpy_toio)(volatile void __iomem *dest, const void *src,
> > +			     unsigned long n);
> 
> Why are these all separate symbols? Wouldn't it be clearer to group them
> in ppc_md, or a similar structure of function pointers?

Because the IO ones are separate already and I want to keep things
consistent with them.

> This is the point where it gets completely unreadable. I ended up
> running the macros through 'gcc -E' to see what they do ;-)

Come on ... :-) They are almost the same as the ones in the .h, they
just only define the function pointer.

> If you resolve all the macros, you actually get fewer lines, and
> it suddenly becomes readable, as well as parsable with grep and ctags:
> 
> u8 (*__ind_readb) (const volatile void __iomem * addr);
> EXPORT_SYMBOL(__ind_readb);
> u8 (*__ind_inb) (unsigned long port);
> EXPORT_SYMBOL(__ind_inb);
> u16 (*__ind_readw) (const volatile void __iomem * addr);
> EXPORT_SYMBOL(__ind_readw);
> u16 (*__ind_inw) (unsigned long port);
> ...
> 
> I do the same when I start using macros, it's always hard to know exactly
> when to stop ;-)

I'll look and see what the result looks like.

> > -static u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
> > +static u8 iseries_readb(const volatile void __iomem *IoAddress)
> 
> Since you're converting iSeries_Read_Byte from SilLycAps, shouldn't
> you change IoAddress to something more sensible at the same time?

No, I'm only changing the prototype & name to better match my hooks,
further cleanups of the content of these functions is something I'll do
in a separate patch.
 
> >  {
> >  	u64 BarOffset;
> >  	u64 dsa;
> > @@ -462,7 +411,8 @@ static u8 iSeries_Read_Byte(const volati
> >  			num_printed = 0;
> >  		}
> >  		if (num_printed++ < 10)
> > -			printk(KERN_ERR "iSeries_Read_Byte: invalid access at IO address %p\n", IoAddress);
> > +			printk(KERN_ERR "iSeries_Read_Byte: invalid access at IO address %p\n",
> > +			       IoAddress);
> >  		return 0xff;
> 
> And the name in the comment should also be changed.

Ooopsa.

Ben.





More information about the Linuxppc-dev mailing list