From: Manish Lachwani <mlachwani@mvista.com>
To: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: linux-mips@linux-mips.org
Subject: Re: IDE woos in BE mode 2.6 kernel
Date: Fri, 24 Sep 2004 16:40:25 -0700 [thread overview]
Message-ID: <4154B069.8010708@mvista.com> (raw)
In-Reply-To: <20040918.231947.74754644.anemo@mba.ocn.ne.jp>
[-- Attachment #1: Type: text/plain, Size: 3960 bytes --]
Hello !
These changes below work and attached is the patch based on your
suggestion. However, I have made changes to include/asm-mips/ide.h since
I think there may be problems with other MIPS boards to in BE mode.
And, I have not included the (dma_cache_wback) in the patch.
Thanks
Manish
Atsushi Nemoto wrote:
>>>>>>On Fri, 17 Sep 2004 12:18:37 -0700, Manish Lachwani <mlachwani@mvista.com> said:
>>>>>>
>>>>>>
>
>mlachwani> In response to Jun Suns mail sent on 06/24/2004
>
>jsun> Anybody has tried IDE disks in big endian mode with 2.6
>jsun> kernel? I seem to have troubles with Malta board.
>...
>mlachwani> The following patch gets the Malta to work well. However,
>mlachwani> this patch introduces board specific changes in the IDE
>mlachwani> subsystem. This is not a final patch but maybe there can
>mlachwani> be a better approach to this issue
>
>FYI, here is my approach. Not so beautiful but less intrusive...
>
>1. copy include/asm-mips/mach-generic/ide.h to my mach-xxx directory.
>2. add following lines to include/asm-mips/mach-xxx/ide.h
>--- begin ---
>/* get rid of defs from io.h - ide has its private and conflicting versions */
>#ifdef insb
>#undef insb
>#endif
>#ifdef outsb
>#undef outsb
>#endif
>#ifdef insw
>#undef insw
>#endif
>#ifdef outsw
>#undef outsw
>#endif
>#ifdef insl
>#undef insl
>#endif
>#ifdef outsl
>#undef outsl
>#endif
>
>#define insb(port, addr, count) ___ide_insb(port, addr, count)
>#define insw(port, addr, count) ___ide_insw(port, addr, count)
>#define insl(port, addr, count) ___ide_insl(port, addr, count)
>#define outsb(port, addr, count) ___ide_outsb(port, addr, count)
>#define outsw(port, addr, count) ___ide_outsw(port, addr, count)
>#define outsl(port, addr, count) ___ide_outsl(port, addr, count)
>
>static inline void ___ide_insb(unsigned long port, void *addr, unsigned int count)
>{
> unsigned long start = (unsigned long)addr;
> unsigned long size = (unsigned long)count;
> while (count--) {
> *(u16 *)addr = *(volatile u8 *)(mips_io_port_base + port);
> addr++;
> }
> if (cpu_has_dc_aliases)
> dma_cache_wback((unsigned long)start, size);
>}
>
>static inline void ___ide_outsb(unsigned long port, void *addr, unsigned int count)
>{
> while (count--) {
> *(volatile u8 *)(mips_io_port_base + port) = *(u8 *)addr;
> addr++;
> }
>}
>
>static inline void ___ide_insw(unsigned long port, void *addr, unsigned int count)
>{
> unsigned long start = (unsigned long)addr;
> unsigned long size = (unsigned long)count * 2;
> while (count--) {
> *(u16 *)addr = *(volatile u16 *)(mips_io_port_base + port);
> addr += 2;
> }
> if (cpu_has_dc_aliases)
> dma_cache_wback((unsigned long)start, size);
>}
>
>static inline void ___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 ___ide_insl(unsigned long port, void *addr, unsigned int count)
>{
> unsigned long start = (unsigned long)addr;
> unsigned long size = (unsigned long)count * 4;
> while (count--) {
> *(u32 *)addr = *(volatile u32 *)(mips_io_port_base + port);
> addr += 4;
> }
> if (cpu_has_dc_aliases)
> dma_cache_wback((unsigned long)start, size);
>}
>
>static inline void ___ide_outsl(unsigned long port, void *addr, unsigned int count)
>{
> while (count--) {
> *(volatile u32 *)(mips_io_port_base + port) = *(u32 *)addr;
> addr += 4;
> }
>}
>--- end ---
>
>Note that above codes include workarounds for PIO IDE cache problem
>(dma_cache_wback) though I'm not sure this workaround still needed.
>Please refer this ML thread for the workaround.
><http://www.linux-mips.org/archives/linux-mips/2004-03/msg00185.html>
>
>
>And as I wrote before, I think this IDE endian problem still exists in
>current 2.4 tree too. Please refer my 02/26 mail for this topic.
><http://www.linux-mips.org/archives/linux-mips/2004-02/msg00219.html>
>
>Thank you.
>
>---
>Atsushi Nemoto
>
>
[-- Attachment #2: patch-26-ide-malta --]
[-- Type: text/plain, Size: 2398 bytes --]
--- include/asm-mips/ide.h.orig 2004-09-16 15:41:00.000000000 -0700
+++ include/asm-mips/ide.h 2004-09-20 09:45:14.000000000 -0700
@@ -20,6 +20,91 @@
#define __ide_mm_outsw ide_outsw
#define __ide_mm_outsl ide_outsl
+#ifndef CONFIG_CPU_LITTLE_ENDIAN
+/*
+ * Only for the Big Endian systems, do not do the swapping.
+ * We cannot turn off the CONFIG_SWAP_IO_SPACE since the
+ * other subsystems need it. Hence we need this approach for
+ * IDE only - Manish Lachwani (mlachwani@mvista.com)
+ */
+extern const unsigned long mips_io_port_base;
+
+#ifdef insb
+#undef insb
+#endif
+#ifdef outsb
+#undef outsb
+#endif
+#ifdef insw
+#undef insw
+#endif
+#ifdef outsw
+#undef outsw
+#endif
+#ifdef insl
+#undef insl
+#endif
+#ifdef outsl
+#undef outsl
+#endif
+
+#define insb(port, addr, count) ___ide_insb(port, addr, count)
+#define insw(port, addr, count) ___ide_insw(port, addr, count)
+#define insl(port, addr, count) ___ide_insl(port, addr, count)
+#define outsb(port, addr, count) ___ide_outsb(port, addr, count)
+#define outsw(port, addr, count) ___ide_outsw(port, addr, count)
+#define outsl(port, addr, count) ___ide_outsl(port, addr, count)
+
+static inline void ___ide_insb(unsigned long port, void *addr, unsigned int count)
+{
+ while (count--) {
+ *(u16 *)addr = *(volatile u8 *)(mips_io_port_base + port);
+ addr++;
+ }
+}
+
+static inline void ___ide_outsb(unsigned long port, void *addr, unsigned int count)
+{
+ while (count--) {
+ *(volatile u8 *)(mips_io_port_base + port) = *(u8 *)addr;
+ addr++;
+ }
+}
+
+static inline void ___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 ___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 ___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 ___ide_outsl(unsigned long port, void *addr, unsigned int count)
+{
+ while (count--) {
+ *(volatile u32 *)(mips_io_port_base + port) = *(u32 *)addr;
+ addr += 4;
+ }
+}
+
+#endif /* CONFIG_LITTLE_ENDIAN */
+
#endif /* __KERNEL__ */
#endif /* __ASM_IDE_H */
next prev parent reply other threads:[~2004-09-24 23:40 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-17 19:18 IDE woos in BE mode 2.6 kernel Manish Lachwani
2004-09-18 14:19 ` Atsushi Nemoto
2004-09-24 23:40 ` Manish Lachwani [this message]
2004-09-25 14:41 ` Atsushi Nemoto
-- strict thread matches above, loose matches on Subject: below --
2004-06-24 23:45 Jun Sun
2004-06-25 8:45 ` Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4154B069.8010708@mvista.com \
--to=mlachwani@mvista.com \
--cc=anemo@mba.ocn.ne.jp \
--cc=linux-mips@linux-mips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.