--- a/arch/arm/mm/cache-fa.S
+++ b/arch/arm/mm/cache-fa.S
@@ -24,7 +24,8 @@
 /*
  * The size of one data cache line.
  */
-#define CACHE_DLINESIZE	16
+#define CACHE_DLINESIZE		16
+#define CACHE_DLINESHIFT	4
 
 /*
  * The total size of the data cache.
@@ -169,7 +170,17 @@ ENTRY(fa_flush_kern_dcache_area)
  *	- start  - virtual start address
  *	- end	 - virtual end address
  */
+__flush_whole_dcache:
+	mcr	p15, 0, r0, c7, c14, 0		@ clean/invalidate D cache
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c10, 4		@ drain write buffer
+	mov	pc, lr
+
 fa_dma_inv_range:
+	sub	r3, r1, r0			@ calculate total size
+	cmp	r3, #CACHE_DLIMIT		@ total size >= limit?
+	bhs	__flush_whole_dcache		@ flush whole D cache
+
 	tst	r0, #CACHE_DLINESIZE - 1
 	bic	r0, r0, #CACHE_DLINESIZE - 1
 	mcrne	p15, 0, r0, c7, c14, 1		@ clean & invalidate D entry
@@ -193,6 +204,10 @@ fa_dma_inv_range:
  *	- end	 - virtual end address
  */
 fa_dma_clean_range:
+	sub	r3, r1, r0			@ calculate total size
+	cmp	r3, #CACHE_DLIMIT		@ total size >= limit?
+	bhs	__flush_whole_dcache		@ flush whole D cache
+
 	bic	r0, r0, #CACHE_DLINESIZE - 1
 1:	mcr	p15, 0, r0, c7, c10, 1		@ clean D entry
 	add	r0, r0, #CACHE_DLINESIZE
