igd.asl rewrite

Old igd.asl had inconsistent addresses (between _DOD and actual device)
and ghost devices. Any of those is enough to make brightness on windows
fail and make igd.asl out-of-ACPI-spec. Also old code favoured ridiculous
copying of the same thing 6 times per chipset. Leave only hooking up and
chipset-specific part in chipset directory. Move NVS handling and ACPI-spec
parts to a common file.

Change-Id: I556769e5e28b83e7465e3db689e26c8c0ab44757
Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-on: http://review.coreboot.org/7472
Tested-by: build bot (Jenkins)
Reviewed-by: Edward O'Callaghan <edward.ocallaghan@koparo.com>
Reviewed-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
diff --git a/src/northbridge/intel/gm45/Kconfig b/src/northbridge/intel/gm45/Kconfig
index add8c4a..9564ea6 100644
--- a/src/northbridge/intel/gm45/Kconfig
+++ b/src/northbridge/intel/gm45/Kconfig
@@ -30,6 +30,7 @@
 	select IOMMU
 	select VGA
 	select INTEL_EDID
+	select INTEL_GMA_ACPI
 
 config BOOTBLOCK_NORTHBRIDGE_INIT
 	string
diff --git a/src/northbridge/intel/gm45/acpi/igd.asl b/src/northbridge/intel/gm45/acpi/igd.asl
index cb99694..696cc2b 100644
--- a/src/northbridge/intel/gm45/acpi/igd.asl
+++ b/src/northbridge/intel/gm45/acpi/igd.asl
@@ -26,10 +26,10 @@
 	Field (GFXC, DWordAcc, NoLock, Preserve)
 	{
 		Offset (0x10),
-			BAR0, 64
+		BAR0, 64
 	}
 
-	OperationRegion (GFRG, SystemMemory, And (BAR0, 0xfffffffffffffff0), 0x400000)
+	OperationRegion (GFRG, SystemMemory, And(BAR0, 0xfffffffffffffff0), 0x400000)
 	Field (GFRG, DWordAcc, NoLock, Preserve)
 	{
 		Offset (0x61250),
@@ -38,399 +38,40 @@
 			BCLM, 16,
 	}
 
-	/* Display Output Switching */
-	Method (_DOS, 1)
+	Name (BRIG, Package (0x12)
 	{
-		/* Windows 2000 and Windows XP call _DOS to enable/disable
-		 * Display Output Switching during init and while a switch
-		 * is already active
-		 */
-		Store (And(Arg0, 7), DSEN)
+		0x61,
+		0x61,
+		0x2,
+		0x4,
+		0x5,
+		0x7,
+		0x9,
+		0xb,
+		0xd,
+		0x11,
+		0x14,
+		0x17,
+		0x1c,
+		0x20,
+		0x27,
+		0x31,
+		0x41,
+		0x61,
+	})
+
+	Method (XBCM, 1, NotSerialized)
+	{
+		Store (ShiftLeft (Arg0, 4), BCLV)
+		Store (0x80000000, CR1)
+		Store (0x0610, BCLM)
 	}
 
-	/* We try to support as many GM45 systems as possible,
-	 * so keep the number of DIDs flexible.
-	 */
-	Method (_DOD, 0)
+	Method (XBQC, 0, NotSerialized)
 	{
-		If (LEqual(NDID, 1)) {
-			Name(DOD1, Package() {
-				0xffffffff
-			})
-			Store (Or(0x00010000, DID1), Index(DOD1, 0))
-			Return(DOD1)
-		}
-
-		If (LEqual(NDID, 2)) {
-			Name(DOD2, Package() {
-				0xffffffff,
-				0xffffffff
-			})
-			Store (Or(0x00010000, DID1), Index(DOD2, 0))
-			Store (Or(0x00010000, DID2), Index(DOD2, 1))
-			Return(DOD2)
-		}
-
-		If (LEqual(NDID, 3)) {
-			Name(DOD3, Package() {
-				0xffffffff,
-				0xffffffff,
-				0xffffffff
-			})
-			Store (Or(0x00010000, DID1), Index(DOD3, 0))
-			Store (Or(0x00010000, DID2), Index(DOD3, 1))
-			Store (Or(0x00010000, DID3), Index(DOD3, 2))
-			Return(DOD3)
-		}
-
-		If (LEqual(NDID, 4)) {
-			Name(DOD4, Package() {
-				0xffffffff,
-				0xffffffff,
-				0xffffffff,
-				0xffffffff
-			})
-			Store (Or(0x00010000, DID1), Index(DOD4, 0))
-			Store (Or(0x00010000, DID2), Index(DOD4, 1))
-			Store (Or(0x00010000, DID3), Index(DOD4, 2))
-			Store (Or(0x00010000, DID4), Index(DOD4, 3))
-			Return(DOD4)
-		}
-
-		If (LGreater(NDID, 4)) {
-			Name(DOD5, Package() {
-				0xffffffff,
-				0xffffffff,
-				0xffffffff,
-				0xffffffff,
-				0xffffffff
-			})
-			Store (Or(0x00010000, DID1), Index(DOD5, 0))
-			Store (Or(0x00010000, DID2), Index(DOD5, 1))
-			Store (Or(0x00010000, DID3), Index(DOD5, 2))
-			Store (Or(0x00010000, DID4), Index(DOD5, 3))
-			Store (Or(0x00010000, DID5), Index(DOD5, 4))
-			Return(DOD5)
-		}
-
-		/* Some error happened, but we have to return something */
-		Return (Package() {0x00000400})
+		Store (BCLV, Local0)
+		ShiftRight (Local0, 4, Local0)
+		Return (Local0)
 	}
-
-	Device(DD01)
-	{
-		/* Device Unique ID */
-		Method(_ADR, 0, Serialized)
-		{
-			If(LEqual(DID1, 0)) {
-				Return (1)
-			} Else {
-				Return (And(0xffff, DID1))
-			}
-		}
-
-		/* Device Current Status */
-		Method(_DCS, 0)
-		{
-			TRAP(1)
-			If (And(CSTE, 1)) {
-				Return (0x1f)
-			}
-			Return(0x1d)
-		}
-
-		/* Query Device Graphics State */
-		Method(_DGS, 0)
-		{
-			If (And(NSTE, 1)) {
-				Return(1)
-			}
-			Return(0)
-		}
-
-		/* Device Set State */
-		Method(_DSS, 1)
-		{
-			/* If Parameter Arg0 is (1 << 31) | (1 << 30), the
-			 * display switch was completed
-			 */
-			If (LEqual(And(Arg0, 0xc0000000), 0xc0000000)) {
-				Store (NSTE, CSTE)
-			}
-		}
-	}
-
-#ifdef DISPLAY_DEVICE_2_IS_LCD_SCREEN
-	Device (LCD0)
-	{
-		/* Device Unique ID */
-		Method(_ADR, 0, Serialized)
-		{
-			If(LEqual(DID2, 0)) {
-				Return (2)
-			} Else {
-				Return (And(0xffff, DID2))
-			}
-		}
-
-		Name (BRCT, 0)
-
-		Name (BRIG, Package (0x12)
-		{
-			0x61,
-			0x61,
-			0x2,
-			0x4,
-			0x5,
-			0x7,
-			0x9,
-			0xb,
-			0xd,
-			0x11,
-			0x14,
-			0x17,
-			0x1c,
-			0x20,
-			0x27,
-			0x31,
-			0x41,
-			0x61,
-		})
-
-		Method (_BCL, 0, NotSerialized)
-		{
-			Store (1, BRCT)
-			Return (BRIG)
-		}
-
-		Method (_BCM, 1, NotSerialized)
-		{
-			Store (ShiftLeft (Arg0, 4), ^^BCLV)
-			Store (0x80000000, ^^CR1)
-			Store (0x0610, ^^BCLM)
-		}
-		Method (_BQC, 0, NotSerialized)
-		{
-			Store (^^BCLV, Local0)
-			ShiftRight (Local0, 4, Local0)
-			Return (Local0)
-		}
-
-		Method(BRID, 1, NotSerialized)
-		{
-			Store (Match (BRIG, MEQ, Arg0, MTR, Zero, 2), Local0)
-			If (LEqual (Local0, Ones))
-			{
-				Return (0x11)
-			}
-			Return (Local0)
-		}
-
-		/* Using Notify is the right way. But Windows doesn't handle
-		   it well. So use both method in a way to avoid double action.
-		 */
-		Method (DECB, 0, NotSerialized)
-		{
-			If (BRCT)
-			{
-				Notify (LCD0, 0x87)
-			} Else {
-				Store (BRID (_BQC ()), Local0)
-				If (LNotEqual (Local0, 2))
-				{
-					Decrement (Local0)
-				}
-				_BCM (DerefOf (Index (BRIG, Local0)))
-			}
-		}
-		Method (INCB, 0, NotSerialized)
-		{
-			If (BRCT)
-			{
-				Notify (LCD0, 0x86)
-			} Else {
-				Store (BRID (_BQC ()), Local0)
-				If (LNotEqual (Local0, 0x11))
-				{
-					Increment (Local0)
-				}
-				_BCM (DerefOf (Index (BRIG, Local0)))
-			}
-		}
-	}
-#else
-	Device(DD02)
-	{
-		/* Device Unique ID */
-		Method(_ADR, 0, Serialized)
-		{
-			If(LEqual(DID2, 0)) {
-				Return (2)
-			} Else {
-				Return (And(0xffff, DID2))
-			}
-		}
-
-		/* Device Current Status */
-		Method(_DCS, 0)
-		{
-			TRAP(1)
-			If (And(CSTE, 2)) {
-				Return (0x1f)
-			}
-			Return(0x1d)
-		}
-
-		/* Query Device Graphics State */
-		Method(_DGS, 0)
-		{
-			If (And(NSTE, 2)) {
-				Return(1)
-			}
-			Return(0)
-		}
-
-		/* Device Set State */
-		Method(_DSS, 1)
-		{
-			/* If Parameter Arg0 is (1 << 31) | (1 << 30), the
-			 * display switch was completed
-			 */
-			If (LEqual(And(Arg0, 0xc0000000), 0xc0000000)) {
-				Store (NSTE, CSTE)
-			}
-		}
-	}
-#endif
-
-	Device(DD03)
-	{
-		/* Device Unique ID */
-		Method(_ADR, 0, Serialized)
-		{
-			If(LEqual(DID3, 0)) {
-				Return (3)
-			} Else {
-				Return (And(0xffff, DID3))
-			}
-		}
-
-		/* Device Current Status */
-		Method(_DCS, 0)
-		{
-			TRAP(1)
-			If (And(CSTE, 4)) {
-				Return (0x1f)
-			}
-			Return(0x1d)
-		}
-
-		/* Query Device Graphics State */
-		Method(_DGS, 0)
-		{
-			If (And(NSTE, 4)) {
-				Return(1)
-			}
-			Return(0)
-		}
-
-		/* Device Set State */
-		Method(_DSS, 1)
-		{
-			/* If Parameter Arg0 is (1 << 31) | (1 << 30), the
-			 * display switch was completed
-			 */
-			If (LEqual(And(Arg0, 0xc0000000), 0xc0000000)) {
-				Store (NSTE, CSTE)
-			}
-		}
-	}
-
-
-	Device(DD04)
-	{
-		/* Device Unique ID */
-		Method(_ADR, 0, Serialized)
-		{
-			If(LEqual(DID4, 0)) {
-				Return (4)
-			} Else {
-				Return (And(0xffff, DID4))
-			}
-		}
-
-		/* Device Current Status */
-		Method(_DCS, 0)
-		{
-			TRAP(1)
-			If (And(CSTE, 8)) {
-				Return (0x1f)
-			}
-			Return(0x1d)
-		}
-
-		/* Query Device Graphics State */
-		Method(_DGS, 0)
-		{
-			If (And(NSTE, 4)) {
-				Return(1)
-			}
-			Return(0)
-		}
-
-		/* Device Set State */
-		Method(_DSS, 1)
-		{
-			/* If Parameter Arg0 is (1 << 31) | (1 << 30), the
-			 * display switch was completed
-			 */
-			If (LEqual(And(Arg0, 0xc0000000), 0xc0000000)) {
-				Store (NSTE, CSTE)
-			}
-		}
-	}
-
-
-	Device(DD05)
-	{
-		/* Device Unique ID */
-		Method(_ADR, 0, Serialized)
-		{
-			If(LEqual(DID5, 0)) {
-				Return (5)
-			} Else {
-				Return (And(0xffff, DID5))
-			}
-		}
-
-		/* Device Current Status */
-		Method(_DCS, 0)
-		{
-			TRAP(1)
-			If (And(CSTE, 16)) {
-				Return (0x1f)
-			}
-			Return(0x1d)
-		}
-
-		/* Query Device Graphics State */
-		Method(_DGS, 0)
-		{
-			If (And(NSTE, 4)) {
-				Return(1)
-			}
-			Return(0)
-		}
-
-		/* Device Set State */
-		Method(_DSS, 1)
-		{
-			/* If Parameter Arg0 is (1 << 31) | (1 << 30), the
-			 * display switch was completed
-			 */
-			If (LEqual(And(Arg0, 0xc0000000), 0xc0000000)) {
-				Store (NSTE, CSTE)
-			}
-		}
-	}
+#include <drivers/intel/gma/igd.asl>
 }
diff --git a/src/northbridge/intel/gm45/gma.c b/src/northbridge/intel/gm45/gma.c
index fab7787..7cc59c8 100644
--- a/src/northbridge/intel/gm45/gma.c
+++ b/src/northbridge/intel/gm45/gma.c
@@ -491,6 +491,27 @@
 	}
 }
 
+const struct i915_gpu_controller_info *
+intel_gma_get_controller_info(void)
+{
+	device_t dev = dev_find_slot(0, PCI_DEVFN(0x2,0));
+	if (!dev) {
+		return NULL;
+	}
+	struct northbridge_intel_gm45_config *chip = dev->chip_info;
+	return &chip->gfx;
+}
+
+static void gma_ssdt(void)
+{
+	const struct i915_gpu_controller_info *gfx = intel_gma_get_controller_info();
+	if (!gfx) {
+		return;
+	}
+
+	drivers_intel_gma_displays_ssdt_generate(gfx);
+}
+
 static struct pci_operations gma_pci_ops = {
 	.set_subsystem = gma_set_subsystem,
 };
@@ -499,6 +520,7 @@
 	.read_resources = pci_dev_read_resources,
 	.set_resources = pci_dev_set_resources,
 	.enable_resources = pci_dev_enable_resources,
+	.acpi_fill_ssdt_generator = gma_ssdt,
 	.init = gma_func0_init,
 	.scan_bus = 0,
 	.enable = 0,