Hi all,

I've had people trying to convince me of all sorts of things
lately on this and finally went to the source (DaveM).  The
short is that DMA-mapping.txt means what it says in the
section entitled "What memory is DMA'able?".  That is, the
only memory that can be used with the DMA API is memory
acquired via *get_free_page, kmalloc, or kmem_cache_alloc.
Period.

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.  flush_dcache_all is still used by 405lp pm
code so it stays and I updated the comments and made it
safe (per another thread) for 440gp's cache size.  This
is in case it is needed by some external callers on non-405lp.

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.

===== arch/ppc/kernel/misc.S 1.79 vs edited =====
--- 1.79/arch/ppc/kernel/misc.S Thu Feb 27 12:40:15 2003
+++ edited/arch/ppc/kernel/misc.S       Tue Mar  4 14:51:48 2003
@@ -607,25 +607,18 @@
        blr

 #ifdef CONFIG_NOT_COHERENT_CACHE
-/* This is a bad one....It is used by 'consistent_sync' functions when
- * there isn't any handle on the virtual address needed by the usual
- * cache flush instructions.  On the MPC8xx, we can use the cache line
- * flush command, on others all we can do is read enough data to completely
- * reload the cache, flushing old data out.
- */
-
 /*
  * 40x cores have 8K or 16K dcache and 32 byte line size.
  * 440 has a 32K dcache and 32 byte line size.
  * 8xx has 1, 2, 4, 8K variants.
  * For now, cover the worst case of the 440.
- * When we get a cputable cache size entry we can do the right thing.
+ * Must be called with external interrupts disabled.
  */
 #define CACHE_NWAYS    64
 #define CACHE_NLINES   16

 _GLOBAL(flush_dcache_all)
-       li      r4, (CACHE_NWAYS * CACHE_NLINES)
+       li      r4, (2 * CACHE_NWAYS * CACHE_NLINES)
        mtctr   r4
        lis     r5, KERNELBASE at h
 1:     lwz     r3, 0(r5)               /* Load one word from every line */
===== include/asm-ppc/pci.h 1.30 vs edited =====
--- 1.30/include/asm-ppc/pci.h  Thu Feb 27 12:40:19 2003
+++ edited/include/asm-ppc/pci.h        Tue Mar  4 14:32:28 2003
@@ -214,20 +214,8 @@
 {
        if (direction == PCI_DMA_NONE)
                BUG();
-#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.  If we used it, we could
-        * get a cache line alias with the wrong attributes.
-        * Since there isn't any Linux way to get the real VA from a PA,
-        * it is just easier to flush the whole cache.  The code to
-        * determine VA from PA would probably do the same :-).
-        * I don't know why these functions don't pass VA, since the
-        * cache operations use VA and the caller has this information.
-        *      -- Dan
-        */
-       flush_dcache_all();
-#endif
+
+       consistent_sync(bus_to_virt(dma_handle), size, direction);
 }

 /* Make physical memory consistent for a set of streaming

Regards,
--
Matt Porter
porter at 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/



Reply via email to