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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox