svn commit: r323326 - head/sys/x86/iommu

Konstantin Belousov kib at FreeBSD.org
Fri Sep 8 19:45:39 UTC 2017


Author: kib
Date: Fri Sep  8 19:45:37 2017
New Revision: 323326
URL: https://svnweb.freebsd.org/changeset/base/323326

Log:
  Use IOAPIC PCI rid as the interrupt TLP source id for DMAR interrupt
  remapping.
  
  VT-d specification requires use of PCI rid as source id for IOAPICs
  enumerated by PCI bus.  The values from the DMAR ACPI table should be
  only used when IOAPIC is not on PCI.
  
  Reviewed by:	jhb
  Sponsored by:	The FreeBSD Foundation
  Hardware provided by:	Intel
  MFC after:	2 weeks
  Differential revision:	https://reviews.freebsd.org/D12205

Modified:
  head/sys/x86/iommu/intel_drv.c

Modified: head/sys/x86/iommu/intel_drv.c
==============================================================================
--- head/sys/x86/iommu/intel_drv.c	Fri Sep  8 19:39:20 2017	(r323325)
+++ head/sys/x86/iommu/intel_drv.c	Fri Sep  8 19:45:37 2017	(r323326)
@@ -71,6 +71,9 @@ __FBSDID("$FreeBSD$");
 
 #ifdef DEV_APIC
 #include "pcib_if.h"
+#include <machine/intr_machdep.h>
+#include <x86/apicreg.h>
+#include <x86/apicvar.h>
 #endif
 
 #define	DMAR_FAULT_IRQ_RID	0
@@ -788,6 +791,9 @@ dmar_find_nonpci(u_int id, u_int entry_type, uint16_t 
 	ACPI_DMAR_DEVICE_SCOPE *devscope;
 	ACPI_DMAR_PCI_PATH *path;
 	char *ptr, *ptrend;
+#ifdef DEV_APIC
+	int error;
+#endif
 	int i;
 
 	for (i = 0; i < dmar_devcnt; i++) {
@@ -809,6 +815,17 @@ dmar_find_nonpci(u_int id, u_int entry_type, uint16_t 
 				continue;
 			if (devscope->EnumerationId != id)
 				continue;
+#ifdef DEV_APIC
+			if (entry_type == ACPI_DMAR_SCOPE_TYPE_IOAPIC) {
+				error = ioapic_get_rid(id, rid);
+				/*
+				 * If our IOAPIC has PCI bindings then
+				 * use the PCI device rid.
+				 */
+				if (error == 0)
+					return (unit);
+			}
+#endif
 			if (devscope->Length - sizeof(ACPI_DMAR_DEVICE_SCOPE)
 			    == 2) {
 				if (rid != NULL) {
@@ -818,12 +835,11 @@ dmar_find_nonpci(u_int id, u_int entry_type, uint16_t 
 					    path->Device, path->Function);
 				}
 				return (unit);
-			} else {
-				/* XXXKIB */
-				printf(
-		       "dmar_find_nonpci: id %d type %d path length != 2\n",
-				    id, entry_type);
 			}
+			printf(
+		           "dmar_find_nonpci: id %d type %d path length != 2\n",
+			    id, entry_type);
+			break;
 		}
 	}
 	return (NULL);


More information about the svn-src-head mailing list