nb/intel/nehalem/gma: Use common init_igd_opregion method

Use common init_igd_opregion method.

Change-Id: Ic8a85d1373f04814b4460cce377d6e096bcdc349
Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-on: https://review.coreboot.org/19907
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Martin Roth <martinroth@google.com>
diff --git a/src/northbridge/intel/nehalem/gma.c b/src/northbridge/intel/nehalem/gma.c
index 43ca4b6..fa84f78 100644
--- a/src/northbridge/intel/nehalem/gma.c
+++ b/src/northbridge/intel/nehalem/gma.c
@@ -26,10 +26,11 @@
 #include <cpu/x86/mtrr.h>
 #include <drivers/intel/gma/edid.h>
 #include <drivers/intel/gma/i915.h>
+#include <drivers/intel/gma/intel_bios.h>
 #include <pc80/vga.h>
 #include <pc80/vga_io.h>
-#include <drivers/intel/gma/intel_bios.h>
 #include <southbridge/intel/ibexpeak/nvs.h>
+#include <northbridge/intel/common/gma_opregion.h>
 #include <cbmem.h>
 
 #include "chip.h"
@@ -1099,27 +1100,50 @@
 	drivers_intel_gma_displays_ssdt_generate(gfx);
 }
 
+/* Enable SCI to ACPI _GPE._L06 */
+static void gma_enable_swsci(void)
+{
+	u16 reg16;
+
+	/* clear DMISCI status */
+	reg16 = inw(DEFAULT_PMBASE + TCO1_STS);
+	reg16 &= DMISCI_STS;
+	outw(DEFAULT_PMBASE + TCO1_STS, reg16);
+
+	/* clear acpi tco status */
+	outl(DEFAULT_PMBASE + GPE0_STS, TCOSCI_STS);
+
+	/* enable acpi tco scis */
+	reg16 = inw(DEFAULT_PMBASE + GPE0_EN);
+	reg16 |= TCOSCI_EN;
+	outw(DEFAULT_PMBASE + GPE0_EN, reg16);
+}
+
 static unsigned long
 gma_write_acpi_tables(struct device *const dev,
 		      unsigned long current,
 		      struct acpi_rsdp *const rsdp)
 {
-	igd_opregion_t *opregion;
+	igd_opregion_t *opregion = (igd_opregion_t *)current;
 	global_nvs_t *gnvs;
 
-	// FIXME: Replace by common VBT implementation writing to current
-	opregion = igd_make_opregion();
-	if (opregion) {
-		/* GNVS has been already set up */
-		gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
-		if (gnvs) {
-			/* IGD OpRegion Base Address */
-			gnvs->aslb = (u32)(uintptr_t)opregion;
-		} else {
-			printk(BIOS_ERR, "Error: GNVS table not found.\n");
-		}
+	if (init_igd_opregion(opregion) != CB_SUCCESS)
+		return current;
+
+	current += sizeof(igd_opregion_t);
+
+	/* GNVS has been already set up */
+	gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
+	if (gnvs) {
+		/* IGD OpRegion Base Address */
+		gnvs->aslb = (u32)(uintptr_t)opregion;
+	} else {
+		printk(BIOS_ERR, "Error: GNVS table not found.\n");
 	}
 
+	gma_enable_swsci();
+
+	current = acpi_align_current(current);
 	return current;
 }