Re: [RFC PATCH] m68k: nommu: Fix behaviour of io macros on non-CF

Greg Ungerer <[email protected]>
Newsgroups org.kernel.vger.linux-m68k,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Hi Daniel,

On 4/4/26 12:46, Daniel Palmer wrote:
> Currently for 68000 readl() and friends are broken in that they
> return the value from the bus as-is but should be reading a little
> endian value and swapping it to big endian.
> 
> This was found using virtio-mmio on a 68000 virt machine. virtio-mmio
> is little endian even if the emulated machine is big endian. This works
> for MMU m68k because the io macros do what is expected there, but if
> the kernel was built for nommu it breaks.
> 
> Potentially this will break some stuff for nommu non-CF m68k users
> but since there are probably 2 or 3 of us in the world I think we
> can work it out.
> 
> Suggested-by: Arnd Bergmann <[email protected]>
> Link: https://lore.kernel.org/lkml/[email protected]/
> Signed-off-by: Daniel Palmer <[email protected]>
> ---
>   arch/m68k/include/asm/io_no.h | 9 ---------
>   1 file changed, 9 deletions(-)
> 
> diff --git a/arch/m68k/include/asm/io_no.h b/arch/m68k/include/asm/io_no.h
> index 516371d5587a..c39db8798ef2 100644
> --- a/arch/m68k/include/asm/io_no.h
> +++ b/arch/m68k/include/asm/io_no.h
> @@ -96,15 +96,6 @@ static inline void writel(u32 value, volatile void __iomem *addr)
>   		__raw_writel(swab32(value), addr);
>   }
>   
> -#else
> -
> -#define readb __raw_readb
> -#define readw __raw_readw
> -#define readl __raw_readl
> -#define writeb __raw_writeb
> -#define writew __raw_writew
> -#define writel __raw_writel
> -
>   #endif /* IOMEMBASE */
>   
>   #if defined(CONFIG_PCI)

This change, in this form at least, breaks most of the non-MMU ColdFire targets.
Try compiling any of m5208evb, m5249evb, m5272c3, m5275evb, m5307c3 or
m5407c3 defconfigs and you get build failures. Targets that do not have
a PCI bus and so do not define IOMEMBASE will fail, which is most of them.

Maybe something like this might be better. I think this ends up giving you the
same result for 68000 nommu targets.

diff --git a/arch/m68k/include/asm/io_no.h b/arch/m68k/include/asm/io_no.h
index 516371d5587a..b335fd4a18e9 100644
--- a/arch/m68k/include/asm/io_no.h
+++ b/arch/m68k/include/asm/io_no.h
@@ -33,7 +33,6 @@
  #include <asm/byteorder.h>
  #include <asm/coldfire.h>
  #include <asm/mcfsim.h>
-#endif /* CONFIG_COLDFIRE */
  
  #if defined(IOMEMBASE)
  /*
@@ -126,6 +125,7 @@ static inline void writel(u32 value, volatile void __iomem *addr)
  #define PCI_IOBASE     ((void __iomem *) PCI_IO_PA)
  #define PCI_SPACE_LIMIT        PCI_IO_MASK
  #endif /* CONFIG_PCI */
+#endif /* CONFIG_COLDFIRE */
  
  #include <asm/kmap.h>
  #include <asm/virtconvert.h>


Regards
Greg
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.