From 7436d5d3486ee2e9d3f1f90e67d1fd238824d4af Mon Sep 17 00:00:00 2001
From: John Tsichritzis <john.tsichritzis@arm.com>
Date: Wed, 22 Aug 2018 10:40:33 +0100
Subject: [PATCH] DSU erratum 936184 workaround: bug fix

The initial implementation was corrupting registers that it shouldn't.
Now this is fixed.

Change-Id: Iaa407c18e668b2d9381391bf10d6876fe936aded
Signed-off-by: John Tsichritzis <john.tsichritzis@arm.com>
---
 lib/cpus/aarch64/dsu_helpers.S | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/lib/cpus/aarch64/dsu_helpers.S b/lib/cpus/aarch64/dsu_helpers.S
index 293ed24bf..152a3da26 100644
--- a/lib/cpus/aarch64/dsu_helpers.S
+++ b/lib/cpus/aarch64/dsu_helpers.S
@@ -8,15 +8,19 @@
 #include <dsu_def.h>
 #include <errata_report.h>
 
-/*
- * DSU erratum 936184
- * Check the DSU variant, revision and configuration to determine if the
- * erratum applies. This erratum was fixed in r2p0.
+/* -----------------------------------------------------------------------
+ * DSU erratum 936184 check function
+ * Checks the DSU variant, revision and configuration to determine if
+ * the erratum applies. Erratum applies if ACP interface is present
+ * in the DSU and revision-variant < r2p0.
+ *
+ * The erratum was fixed in r2p0.
  *
  * This function is called from both assembly and C environment. So it
  * follows AAPCS.
  *
  * Clobbers: x0-x3
+ * -----------------------------------------------------------------------
  */
 	.globl	check_errata_dsu_936184
 	.globl	errata_dsu_936184_wa
@@ -25,7 +29,7 @@ func check_errata_dsu_936184
 	mov	x2, #ERRATA_NOT_APPLIES
 	mov	x3, #ERRATA_APPLIES
 
-	/* Erratum applies only if ACP interface is present in DSU */
+	/* Erratum applies only if DSU has the ACP interface */
 	mov	x0, x2
 	mrs	x1, CLUSTERCFR_EL1
 	ubfx	x1, x1, #CLUSTERCFR_ACP_SHIFT, #1
@@ -44,8 +48,14 @@ func check_errata_dsu_936184
 	ret
 endfunc check_errata_dsu_936184
 
+/* --------------------------------------------------
+ * Errata Workaround for DSU erratum #936184.
+ *
+ * Can clobber only: x0-x17
+ * --------------------------------------------------
+ */
 func errata_dsu_936184_wa
-	mov	x20, x30
+	mov	x17, x30
 	bl	check_errata_dsu_936184
 	cbz	x0, 1f
 
@@ -56,5 +66,5 @@ func errata_dsu_936184_wa
 	msr	CLUSTERACTLR_EL1, x0
 	isb
 1:
-	ret	x20
+	ret	x17
 endfunc errata_dsu_936184_wa
-- 
GitLab