On Mon, Sep 20, 2021 at 12:14 PM John Paul Adrian Glaubitz <glaubitz@xxxxxxxxxxxxxxxxxxx> wrote: > > If you want to get feedback whether the kernel actually boots, let me know. So having looked around more sparc64 actually looks to be ok as-is, because it doesn't do any ioremap at all, and the PIO accesses are done at physical address zero. Sparc uses a special IO memory address space and can basically map all of PCI that way, and it looks like the hardware does all the required special things for the PIO range at address 0-0xffff. So it turns out that the "missing iounmap()" is actually ok on sparc, because it's a no-op anyway - because the ioremap() was just a pointer cast with no actual remapping necessary. And the generic IOMAP thing does assume that PIO is special, in ways that sparc doesn't need. On x86, PIO is not remapped, but also uses different instructions, so it's not just pointer games that could be done at iomap/unmap case. (And on many other architectures you need to do different synchronization, even if you could perhaps otherwise make the PIO-vs-MMIO be only about the pointer mapping - so "writeb()" and "outb()" aren't just different in the addressing). End result: the only downside of sparc not using the generic iomap is likely that sparc will happily use a NULL __iomap pointer (error) and basically use it as a PIO access. But since other architectures like x86-64 would warn for that case (see 'bad_io_access()' in lib/iomap.c), even that isn't actually a big deal - any such bugs would have been found elsewhere. And having looked at this, I'm starting to suspect that sparc oddity is _why_ the fallback version in <asm-generic/io.h> was so broken. It did the right thing on sparc, but leaks iomap remappings almost anywhere else. But maybe sparc ended up being the only user of it? Linus