Title: [8917] trunk/arch/blackfin: [#6047] Kernel cannot wake up from mem in latest trunk
Revision
8917
Author
hennerich
Date
2010-06-16 05:12:10 -0400 (Wed, 16 Jun 2010)

Log Message

[#6047] Kernel cannot wake up from mem in latest trunk
This bug is caused by commit svn:8859 => 8860 (bfin: allow cache funcs
to be in L1 for anomaly 491)
The resume code restores L1 content in bf53x_resume_l1_mem().
It therefore uses dma_memcpy(). 
However dma_memcpy() calls blackfin_dcache_flush_range() which is also
in L1, but not present.
Since caches are off while this happens, a solution is to provide a
dma_memcpy() that doesn't do flush/invalidate.

Modified Paths

Diff

Modified: trunk/arch/blackfin/include/asm/dma.h (8916 => 8917)


--- trunk/arch/blackfin/include/asm/dma.h	2010-06-15 14:35:48 UTC (rev 8916)
+++ trunk/arch/blackfin/include/asm/dma.h	2010-06-16 09:12:10 UTC (rev 8917)
@@ -276,6 +276,7 @@
 }
 
 void *dma_memcpy(void *dest, const void *src, size_t count);
+void *dma_memcpy_nocache(void *dest, const void *src, size_t count);
 void *safe_dma_memcpy(void *dest, const void *src, size_t count);
 void blackfin_dma_early_init(void);
 void early_dma_memcpy(void *dest, const void *src, size_t count);

Modified: trunk/arch/blackfin/kernel/bfin_dma_5xx.c (8916 => 8917)


--- trunk/arch/blackfin/kernel/bfin_dma_5xx.c	2010-06-15 14:35:48 UTC (rev 8916)
+++ trunk/arch/blackfin/kernel/bfin_dma_5xx.c	2010-06-16 09:12:10 UTC (rev 8917)
@@ -468,6 +468,29 @@
 EXPORT_SYMBOL(dma_memcpy);
 
 /**
+ *	dma_memcpy_nocache - DMA memcpy under mutex lock
+ *	- No cache flush/invalidate
+ *
+ * Do not check arguments before starting the DMA memcpy.  Break the transfer
+ * up into two pieces.  The first transfer is in multiples of 64k and the
+ * second transfer is the piece smaller than 64k.
+ */
+void *dma_memcpy_nocache(void *pdst, const void *psrc, size_t size)
+{
+	unsigned long dst = (unsigned long)pdst;
+	unsigned long src = "" long)psrc;
+	size_t bulk, rest;
+
+	bulk = size & ~0xffff;
+	rest = size - bulk;
+	if (bulk)
+		_dma_memcpy(pdst, psrc, bulk);
+	_dma_memcpy(pdst + bulk, psrc + bulk, rest);
+	return pdst;
+}
+EXPORT_SYMBOL(dma_memcpy_nocache);
+
+/**
  *	safe_dma_memcpy - DMA memcpy w/argument checking
  *
  * Verify arguments are safe before heading to dma_memcpy().

Modified: trunk/arch/blackfin/mach-common/pm.c (8916 => 8917)


--- trunk/arch/blackfin/mach-common/pm.c	2010-06-15 14:35:48 UTC (rev 8916)
+++ trunk/arch/blackfin/mach-common/pm.c	2010-06-16 09:12:10 UTC (rev 8917)
@@ -61,10 +61,11 @@
 
 int bf53x_suspend_l1_mem(unsigned char *memptr)
 {
-	dma_memcpy(memptr, (const void *) L1_CODE_START, L1_CODE_LENGTH);
-	dma_memcpy(memptr + L1_CODE_LENGTH, (const void *) L1_DATA_A_START,
-			L1_DATA_A_LENGTH);
-	dma_memcpy(memptr + L1_CODE_LENGTH + L1_DATA_A_LENGTH,
+	dma_memcpy_nocache(memptr, (const void *) L1_CODE_START,
+			L1_CODE_LENGTH);
+	dma_memcpy_nocache(memptr + L1_CODE_LENGTH,
+			(const void *) L1_DATA_A_START, L1_DATA_A_LENGTH);
+	dma_memcpy_nocache(memptr + L1_CODE_LENGTH + L1_DATA_A_LENGTH,
 			(const void *) L1_DATA_B_START, L1_DATA_B_LENGTH);
 	memcpy(memptr + L1_CODE_LENGTH + L1_DATA_A_LENGTH +
 			L1_DATA_B_LENGTH, (const void *) L1_SCRATCH_START,
@@ -75,10 +76,10 @@
 
 int bf53x_resume_l1_mem(unsigned char *memptr)
 {
-	dma_memcpy((void *) L1_CODE_START, memptr, L1_CODE_LENGTH);
-	dma_memcpy((void *) L1_DATA_A_START, memptr + L1_CODE_LENGTH,
+	dma_memcpy_nocache((void *) L1_CODE_START, memptr, L1_CODE_LENGTH);
+	dma_memcpy_nocache((void *) L1_DATA_A_START, memptr + L1_CODE_LENGTH,
 			L1_DATA_A_LENGTH);
-	dma_memcpy((void *) L1_DATA_B_START, memptr + L1_CODE_LENGTH +
+	dma_memcpy_nocache((void *) L1_DATA_B_START, memptr + L1_CODE_LENGTH +
 			L1_DATA_A_LENGTH, L1_DATA_B_LENGTH);
 	memcpy((void *) L1_SCRATCH_START, memptr + L1_CODE_LENGTH +
 			L1_DATA_A_LENGTH + L1_DATA_B_LENGTH, L1_SCRATCH_LENGTH);
@@ -167,7 +168,7 @@
 	_disable_icplb();
 	bf53x_suspend_l1_mem(memptr);
 
-	do_hibernate(wakeup | vr_wakeup);	/* Goodbye */
+	do_hibernate(wakeup | vr_wakeup);	/* See you later! */
 
 	bf53x_resume_l1_mem(memptr);
 
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to