ACPI: Make DMAR flags settable

Add a parameter to acpi_create_dmar() for the flags field and define
flags given by the spec [1].

[1] Intel Virtualization Technology for Directed I/O
    Architecture Specification
    Document-Number: D51397

Change-Id: I03ae32f13bb0061bd3b9bef607db175d9b0bc5e1
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: http://review.coreboot.org/12191
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Tested-by: build bot (Jenkins)
Reviewed-by: Duncan Laurie <dlaurie@google.com>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
diff --git a/src/arch/x86/acpi.c b/src/arch/x86/acpi.c
index 417a322..1570dc8 100644
--- a/src/arch/x86/acpi.c
+++ b/src/arch/x86/acpi.c
@@ -389,7 +389,7 @@
 	header->checksum = acpi_checksum((void *)srat, header->length);
 }
 
-void acpi_create_dmar(acpi_dmar_t *dmar,
+void acpi_create_dmar(acpi_dmar_t *dmar, enum dmar_flags flags,
 		      unsigned long (*acpi_fill_dmar) (unsigned long))
 {
 	acpi_header_t *header = &(dmar->header);
@@ -407,7 +407,7 @@
 	header->revision = 1;
 
 	dmar->host_address_width = 40 - 1; /* FIXME: == MTRR size? */
-	dmar->flags = 0;
+	dmar->flags = flags;
 
 	current = acpi_fill_dmar(current);
 
diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h
index d4bacf5..2a7ea79 100644
--- a/src/arch/x86/include/arch/acpi.h
+++ b/src/arch/x86/include/arch/acpi.h
@@ -220,6 +220,11 @@
 	DRHD_INCLUDE_PCI_ALL = 1
 };
 
+enum dmar_flags {
+	DMAR_INTR_REMAP		= 1,
+	DMAR_X2APIC_OPT_OUT	= 2,
+};
+
 typedef struct dmar_entry {
 	u16 type;
 	u16 length;
@@ -543,7 +548,7 @@
 
 void acpi_create_facs(acpi_facs_t *facs);
 
-void acpi_create_dmar(acpi_dmar_t *dmar,
+void acpi_create_dmar(acpi_dmar_t *dmar, enum dmar_flags flags,
 		      unsigned long (*acpi_fill_dmar) (unsigned long));
 unsigned long acpi_create_dmar_drhd(unsigned long current, u8 flags,
 				    u16 segment, u32 bar);
diff --git a/src/northbridge/intel/gm45/acpi.c b/src/northbridge/intel/gm45/acpi.c
index 5140b9c..21a8cd5 100644
--- a/src/northbridge/intel/gm45/acpi.c
+++ b/src/northbridge/intel/gm45/acpi.c
@@ -116,7 +116,7 @@
 
 	printk(BIOS_DEBUG, "ACPI:     * DMAR\n");
 	dmar = (acpi_dmar_t *) current;
-	acpi_create_dmar(dmar, acpi_fill_dmar);
+	acpi_create_dmar(dmar, 0, acpi_fill_dmar);
 	current += dmar->header.length;
 	ALIGN_CURRENT;
 	acpi_add_table(rsdp, dmar);