On Wed, Feb 20, 2002 at 06:48:50PM -0800, Matthew Dharm wrote: > But isn't that what all the complicated logic in ioremap() is for? Not exactly. Here is the whole picture: drivers do inb(delta)/outb(delta) -> translated to an virtual address (mips_io_port_base + delta) -> mapped into (GT_IO_BASE + delta) physical addr -> Bingo! you got the devices. Here your goal is to make the drivers that do inb()/outb() happy (i.e., be able to reuse them without modification) If you only use drivers that directly access memory (such as drivers/net/nec_korva.c on linux-mips.sf.net), then you don't even have to set mips_io_port_base at all. The ioremap() comes into place because by default you can not set a mips_io_port_base value in kseg1 range on ocelot (it is at 0x20000000 in physical addr space). Therefore you do a ioremap(), blah blah as explained above. Someday I should finish the PCI chapter on my porting guide ... Jun