All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Tommy S. Christensen" <tommy.christensen@eicon.com>
To: Barry Wu <wqb123@yahoo.com>
Cc: linux-mips@oss.sgi.com
Subject: Re: mips ide disk dma problem
Date: Mon, 13 Aug 2001 21:38:24 +0200	[thread overview]
Message-ID: <3B782CB0.AA24C7C8@eicon.com> (raw)
In-Reply-To: 20010813130729.37581.qmail@web13908.mail.yahoo.com

Barry Wu wrote:
> I meet problems about mips ide disk. I find dma mode
> is different from other platform. We have to use
> dma_cache_wback_inv and vtonocache functions to work
> under DMA mode, I read pcnet32 ethernet driver,
> it works like that. I do not know if I have to support
> ide disk dma, what I have to do?

Some MIPS'ification is needed to handle the caches.
You can try the patch below to drivers/block/ide-dma.c.

I don't know about your IDE controller (our board have 
a CMD PCI-648), but it may need some special handling also.

-Tommy


--- ide-dma.c.old	Tue Aug 31 09:46:14 1999
+++ ide-dma.c	Mon Aug 13 20:51:57 2001
@@ -176,6 +176,13 @@
 #endif
 	unsigned int count = 0;
 
+#if defined(__mips__)
+	/* MIPS: We access the dmatable through uncached addresses, so that it
+	 * will be read correctly by the controller. The alternative is to flush
+	 * the appropriate range at the end of this procedure.
+	 */
+	table = (unsigned int *)vtonocache(table);
+#endif
 	do {
 		/*
 		 * Determine addr and size of next buffer area.  We assume that
@@ -197,6 +204,10 @@
 				size += bh->b_size;
 			}
 		}
+#if defined(__mips__)
+		/* MIPS: We need to flush the cache */
+		dma_cache_wback_inv(bus_to_virt(addr), size);
+#endif
 		/*
 		 * Fill in the dma table, without crossing any 64kB boundaries.
 		 * Most hardware requires 16-bit alignment of all blocks,
@@ -401,6 +412,10 @@
 		dmatable += (PRD_ENTRIES * PRD_BYTES);
 		leftover -= (PRD_ENTRIES * PRD_BYTES);
 		hwif->dmaproc = &ide_dmaproc;
+#if defined(__mips__)
+		/* Make sure no part of the dmatable is in the cache */
+		dma_cache_wback_inv(hwif->dmatable, PRD_ENTRIES * PRD_BYTES);
+#endif
 
 		if (hwif->chipset != ide_trm290) {
 			byte dma_stat = inb(dma_base+2);
@@ -430,6 +445,9 @@
 		}
 	}
 	if (dma_base) {
+#if defined(__mips__)
+		dma_base = KSEG1ADDR(dma_base);
+#endif
 		if (extra) /* PDC20246 & HPT343 */
 			request_region(dma_base+16, extra, name);
 		dma_base += hwif->channel ? 8 : 0;

  reply	other threads:[~2001-08-13 19:37 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-08-13 13:07 mips ide disk dma problem Barry Wu
2001-08-13 19:38 ` Tommy S. Christensen [this message]
2001-08-14  5:17   ` Ralf Baechle
2001-08-14  8:12     ` Tommy S. Christensen
2001-08-14  9:03       ` Ralf Baechle

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=3B782CB0.AA24C7C8@eicon.com \
    --to=tommy.christensen@eicon.com \
    --cc=linux-mips@oss.sgi.com \
    --cc=wqb123@yahoo.com \
    /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.