CTDP: Only do TDP down/nominal change from TNP0

Otherwise there is a flurry of TDP changes with suspend/resume
as the kernel powers devices off on suspend and brings them
back online in resume.

This also adds a mutex around the TDP operations since it is
split across two methods and can't just rely on being Serialized.

Change-Id: I7757d3ddad34ac985a9c8ce2fc202e2b2dcb2527
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: http://review.coreboot.org/1348
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/src/northbridge/intel/sandybridge/acpi/hostbridge.asl b/src/northbridge/intel/sandybridge/acpi/hostbridge.asl
index 8dd1de6..93db98d 100644
--- a/src/northbridge/intel/sandybridge/acpi/hostbridge.asl
+++ b/src/northbridge/intel/sandybridge/acpi/hostbridge.asl
@@ -101,6 +101,8 @@
 		TLUD,	 32,
 	}
 
+	Mutex (CTCM, 1)		/* CTDP Switch Mutex (sync level 1) */
+	Name (CTCC, 0)		/* CTDP Current Selection */
 	Name (CTCN, 0)		/* CTDP Nominal Select */
 	Name (CTCD, 1)		/* CTDP Down Select */
 	Name (CTCU, 2)		/* CTDP Up Select */
@@ -167,11 +169,15 @@
 	/* Set TDP Down */
 	Method (STND, 0, Serialized)
 	{
-		Store ("Set TDP Down", Debug)
-
-		If (LEqual (CTCD, CTCS)) {
+		If (Acquire (CTCM, 100)) {
 			Return (0)
 		}
+		If (LEqual (CTCD, CTCC)) {
+			Release (CTCM)
+			Return (0)
+		}
+
+		Store ("Set TDP Down", Debug)
 
 		/* Set CTC */
 		Store (CTCD, CTCS)
@@ -189,17 +195,25 @@
 		/* Set PL1 */
 		Store (CTDD, PL1V)
 
+		/* Store the new TDP Down setting */
+		Store (CTCD, CTCC)
+
+		Release (CTCM)
 		Return (1)
 	}
 
 	/* Set TDP Nominal from Down */
 	Method (STDN, 0, Serialized)
 	{
-		Store ("Set TDP Nominal", Debug)
-
-		If (LEqual (CTCN, CTCS)) {
+		If (Acquire (CTCM, 100)) {
 			Return (0)
 		}
+		If (LEqual (CTCN, CTCC)) {
+			Release (CTCM)
+			Return (0)
+		}
+
+		Store ("Set TDP Nominal", Debug)
 
 		/* Set PL1 */
 		Store (CTDN, PL1V)
@@ -217,6 +231,10 @@
 		/* Set CTC */
 		Store (CTCN, CTCS)
 
+		/* Store the new TDP Nominal setting */
+		Store (CTCN, CTCC)
+
+		Release (CTCM)
 		Return (1)
 	}
 }