Explorar el Código

ubwcp: disable range translation before flush

Ensure the buffer range translation is disabled before calling
the UBWC-P flush.
This is to avoid a potential HW hang due to
speculative lines being in the cache at time of DMA un-mapping.

We are still awaiting final confirmation on the programming
sequence. Once confirmed this code will likely need
re-factoring.

It is not clear if the isb() calls are required so we
may be able to optimize them out later.

Change-Id: Ib2e6d5d26cf9a47c9833b98c34d985484b58f46e
Signed-off-by: Liam Mark <[email protected]>
Signed-off-by: Linux Image Build Automation <[email protected]>
Liam Mark hace 1 año
padre
commit
64d4db75cd
Se han modificado 1 ficheros con 14 adiciones y 5 borrados
  1. 14 5
      ubwcp/ubwcp_hw.c

+ 14 - 5
ubwcp/ubwcp_hw.c

@@ -12,6 +12,7 @@
 #include <linux/cdev.h>
 #include <linux/qcom_scm.h>
 #include <linux/delay.h>
+#include <asm/barrier.h>
 
 #include "ubwcp_hw.h"
 
@@ -209,6 +210,19 @@ int ubwcp_hw_disable_range_check_with_flush(void __iomem *base, u16 index)
 	u32 val;
 	u16 ctrl_reg = index >> 5;
 
+	/*
+	 * It is not clear that the isb() calls in this sequence are
+	 * requried, we may be able to remove them.
+	 */
+
+	//ensure all CMOs have completed
+	isb();
+
+	//disable range ck
+	val = UBWCP_REG_READ(base, RANGE_CHECK_CONTROL + ctrl_reg*4);
+	val &= ~(1 << (index & 0x1F));
+	UBWCP_REG_WRITE(base, RANGE_CHECK_CONTROL + ctrl_reg*4, val);
+	isb();
 	//assert flush
 	UBWCP_REG_WRITE(base, FLUSH_CONTROL, 0x3);
 
@@ -216,11 +230,6 @@ int ubwcp_hw_disable_range_check_with_flush(void __iomem *base, u16 index)
 	do {
 		flush_complete = UBWCP_REG_READ(base, FLUSH_STATUS) & 0x1;
 		if (flush_complete) {
-			//disable range ck
-			val = UBWCP_REG_READ(base, RANGE_CHECK_CONTROL + ctrl_reg*4);
-			val &= ~(1 << (index & 0x1F));
-			UBWCP_REG_WRITE(base, RANGE_CHECK_CONTROL + ctrl_reg*4, val);
-
 			//clear flush
 			UBWCP_REG_WRITE(base, FLUSH_CONTROL, 0x0);
 			return 0;