Thread (1 message) 1 message, 1 author, 2003-03-04

Re: [PATCH] Fix *dma_sync_single() and flush_dcache_all

From: Matt Porter <hidden>
Date: 2003-03-04 23:45:35

On Tue, Mar 04, 2003 at 06:11:48PM -0500, Dan Malek wrote:
Matt Porter wrote:
quoted
That means the ARM and MIPS implementations that use a
bus_to_virt() on the dma_handle in *dma_sync_single are
correct and our (performance killing) call to flush_dcache_all
is unnecessary.
Well, to be fair it seems this code has gone through a couple
of revisions since it was originally written.  I suspect a "better
safe than sorry" approach was taken when changes were made. :-)
I figured that. :)
quoted
If there are no objections, then I will commit to following
patch to 2_4_devel and 2.5.  The 2.5 pci_map_single/sync_single
are horked up anyway for 4xx so that will get fixed too.
OK, go for it.  A couple of comments though.........

quoted
 #define CACHE_NWAYS	64
 #define CACHE_NLINES	16
I made these #defines in the original code and I believe they were
set to values based upon the processor selection.  When did they
change to 'worst case' and the most popular and most performance
challenged processors are paying the price for unnecessary cache
operations?
I don't know the answer that.  It happened before I first touched
it.  I simply upped the worst case to cover the larger 440 core
dcache.
quoted
-#ifdef CONFIG_NOT_COHERENT_CACHE
-	/* The bus_to_virt() can't be used here, in case dma_handle
-	 * points to something that doesn't have the same cache attributes
-	 * as the 1:1 mapped kernel memory.
Ummm....this is a very important comment (not because I wrote it) :-)
On the 4xx and 8xx processors you can't use bus_to_virt() (unless we
are still calling iopa() and properly tracking all of the pages that
may be part of the DMA).  Are we _sure_ we aren't using consistent_alloc()'ed
memory with these APIs?
Yes, I completely understand the comment. :)

As I said, the DMA API explicitly lists what memory can be passed to
this family of API's.  Memory allocated from pci_alloc_consistent
cannot be passed in.  Nor can ioremapped addresses.  DaveM suggests
another API be created to handle device to device transfers for 2.5+
for that specific case.

I listed the types of allocated addresses that the API documentation
explicitly mentions in the previous mail.  Memory allocated via
those methods will always be able to be converted back to a
virtual address via bus_to_virt() because the allocations come
from 1:1 kernel lowmem and are guaranteed to be contiguous.  highmem
is not a consideration since the *_single() family of calls is only
usable on lowmem...*_page() would be used for highmem.

Regards,
--
Matt Porter
porter@cox.net
This is Linux Country. On a quiet night, you can hear Windows reboot.

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help