tests/x86: Update ACPI info by looking for interrupt remapping hardware

This will tell if the hardware target support Intel VT-D or not.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
diff --git a/tests/arch/x86/info/src/acpi.c b/tests/arch/x86/info/src/acpi.c
index 332e548..8af1d4d 100644
--- a/tests/arch/x86/info/src/acpi.c
+++ b/tests/arch/x86/info/src/acpi.c
@@ -6,6 +6,121 @@
 #include <zephyr.h>
 #include <arch/x86/acpi.h>
 
+static void vtd_dev_scope_info(struct acpi_dmar_dev_scope *dev_scope)
+{
+	struct acpi_dmar_dev_path *path;
+	int n_path;
+
+	printk("\t\t\t. Type: ");
+
+	switch (dev_scope->type) {
+	case ACPI_DRHD_DEV_SCOPE_PCI_EPD:
+		printk("PCI Endpoint");
+		break;
+	case ACPI_DRHD_DEV_SCOPE_PCI_SUB_H:
+		printk("PCI Sub-hierarchy");
+		break;
+	case ACPI_DRHD_DEV_SCOPE_IOAPIC:
+		printk("IOAPIC");
+		break;
+	case ACPI_DRHD_DEV_SCOPE_MSI_CAP_HPET:
+		printk("MSI Capable HPET");
+		break;
+	case ACPI_DRHD_DEV_SCOPE_NAMESPACE_DEV:
+		printk("ACPI name-space enumerated");
+		break;
+	default:
+		printk("unknown\n");
+		return;
+	}
+
+	printk("\n");
+
+	printk("\t\t\t. Enumeration ID %u\n", dev_scope->enumeration_id);
+	printk("\t\t\t. PCI Bus %u\n", dev_scope->start_bus_num);
+
+	path = z_acpi_get_dev_scope_paths(dev_scope, &n_path);
+	for (; n_path > 0; n_path--) {
+		printk("\t\t\t. Path D:%u F:%u\n",
+		       path->device, path->function);
+		path = (struct acpi_dmar_dev_path *)(POINTER_TO_UINT(path) +
+						     ACPI_DMAR_DEV_PATH_SIZE);
+	}
+
+	printk("\n");
+}
+
+static void vtd_drhd_info(struct acpi_drhd *drhd)
+{
+	struct acpi_dmar_dev_scope *dev_scope;
+	int n_ds, i;
+
+	if (drhd->flags & ACPI_DRHD_FLAG_INCLUDE_PCI_ALL) {
+		printk("\t\t- Includes all PCI devices");
+	} else {
+		printk("\t\t- Includes only listed PCI devices");
+	}
+
+	printk(" under given Segment\n");
+
+	printk("\t\t- Segment number %u\n", drhd->segment_num);
+	printk("\t\t- Base Address 0x%llx\n", drhd->base_address);
+
+	dev_scope = z_acpi_get_drhd_dev_scopes(drhd, &n_ds);
+	if (dev_scope == NULL) {
+		printk("\t\t- No device scopes\n");
+		return;
+	}
+
+	printk("\t\t- Device Scopes:\n");
+	for (i = 0; i < n_ds; i++) {
+		vtd_dev_scope_info(dev_scope);
+		dev_scope = (struct acpi_dmar_dev_scope *)(
+			POINTER_TO_UINT(dev_scope) + dev_scope->length);
+	}
+
+	printk("\n");
+}
+
+static void vtd_info(void)
+{
+	struct acpi_dmar *dmar;
+
+	dmar = z_acpi_find_dmar();
+	if (dmar == NULL) {
+		printk("\tIntel VT-D not supported or exposed\n");
+		return;
+	}
+
+	printk("\tIntel VT-D Supported:\n");
+
+	printk("\t-> X2APIC ");
+	if (dmar->flags & ACPI_DMAR_FLAG_X2APIC_OPT_OUT) {
+		printk("should be opted out\n");
+	} else {
+		printk("does not need to be opted out\n");
+	}
+
+	if (dmar->flags & ACPI_DMAR_FLAG_INTR_REMAP) {
+		struct acpi_drhd *drhd;
+		int hw_n, i;
+
+		printk("\t-> Interrupt remapping supported\n");
+
+		drhd = z_acpi_find_drhds(&hw_n);
+		printk("\t-> %u remapping hardware found:\n", hw_n);
+
+		for (i = 0; i < hw_n; i++) {
+			printk("\t\tDRHD %u:\n", i);
+			vtd_drhd_info(drhd);
+			drhd = (struct acpi_drhd *)(POINTER_TO_UINT(drhd) +
+						    drhd->entry.length);
+		}
+	} else {
+		printk("\t-> Interrupt remapping not supported\n");
+	}
+}
+
 void acpi(void)
 {
 	int nr_cpus;
@@ -26,4 +141,8 @@
 	}
 
 	printk("\n");
+
+	vtd_info();
+
+	printk("\n");
 }