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 */
|