linux-mips
[Top] [All Lists]

IDE woos in BE mode 2.6 kernel

To: linux-mips@linux-mips.org
Subject: IDE woos in BE mode 2.6 kernel
From: Manish Lachwani <mlachwani@mvista.com>
Date: Fri, 17 Sep 2004 12:18:37 -0700
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4.2) Gecko/20040308
Hello !

In response to Jun Suns mail sent on 06/24/2004

Anybody has tried IDE disks in big endian mode with 2.6 kernel?
I seem to have troubles with Malta board.

Current malta board has CONFIG_SWAP_IO_SPACE defined and therefore
all inw, inl and their friends are byte-swapped in BE mode.  As a
results all IDE IO ops (such as ide_inw, etc) do swapping too.

A quick experiement shows those IDE IO ops should not do swapping.
Anybody knows why?

Apparently fixing the above is not enough.  I either encountered
failure to read partition table or having DMA error.  Any clues
here?

I suppose this problem really should exist for other arches
with BE support.  Anybody knows how other arches deal with this?

Thanks.

Jun

---

The following patch gets the Malta to work well. However, this patch introduces 
board specific changes in the IDE subsystem.
This is not a final patch but maybe there can be a better approach to this issue

Thanks
Manish


--- drivers/ide/ide-iops.c.orig 2004-09-16 19:20:52.000000000 -0700
+++ drivers/ide/ide-iops.c      2004-09-16 18:55:37.000000000 -0700
@@ -95,13 +95,23 @@
        hwif->OUTBSYNC  = ide_outbsync;
        hwif->OUTW      = ide_outw;
        hwif->OUTL      = ide_outl;
+#if defined(CONFIG_MIPS_MALTA) && !defined(CONFIG_CPU_LITTLE_ENDIAN)
+       hwif->OUTSW     = malta_ide_outsw;
+       hwif->OUTSL     = malta_ide_outsl;
+#else
        hwif->OUTSW     = ide_outsw;
        hwif->OUTSL     = ide_outsl;
+#endif
        hwif->INB       = ide_inb;
        hwif->INW       = ide_inw;
        hwif->INL       = ide_inl;
+#if defined(CONFIG_MIPS_MALTA) && !defined(CONFIG_CPU_LITTLE_ENDIAN)
+       hwif->INSW      = malta_ide_insw;
+       hwif->INSL      = malta_ide_insl;
+#else
        hwif->INSW      = ide_insw;
        hwif->INSL      = ide_insl;
+#endif
 }
 
 EXPORT_SYMBOL(default_hwif_iops);
--- include/asm-mips/ide.h.orig 2004-09-16 15:41:00.000000000 -0700
+++ include/asm-mips/ide.h      2004-09-16 18:12:26.000000000 -0700
@@ -20,6 +20,42 @@
 #define __ide_mm_outsw  ide_outsw
 #define __ide_mm_outsl  ide_outsl
 
+#if defined(CONFIG_MIPS_MALTA) && !defined(CONFIG_CPU_LITTLE_ENDIAN)
+extern const unsigned long mips_io_port_base;
+
+static inline void malta_ide_insw(unsigned long port, void *addr, unsigned int 
count)
+{
+       while (count--) {
+               *(u16 *)addr = *(volatile u16 *)(mips_io_port_base + port);
+               addr += 2;
+       }
+}
+
+static inline void malta_ide_outsw(unsigned long port, void *addr, unsigned 
int count)
+{
+       while (count--) {
+               *(volatile u16 *)(mips_io_port_base + (port)) = *(u16 *)addr;
+               addr += 2;
+       }
+}
+
+static inline void malta_ide_insl(unsigned long port, void *addr, unsigned int 
count)
+{
+       while (count--) {
+               *(u32 *)addr = *(volatile u32 *)(mips_io_port_base + port);
+               addr += 4;
+       }
+}
+
+static inline void malta_ide_outsl(unsigned long port, void *addr, unsigned 
int count)
+{
+       while (count--) {
+               *(volatile u32 *)(mips_io_port_base + (port)) = *(u32 *)addr;
+               addr += 4;
+       }
+}
+#endif
+
 #endif /* __KERNEL__ */
 
 #endif /* __ASM_IDE_H */
<Prev in Thread] Current Thread [Next in Thread>