Module Name: src
Committed By: msaitoh
Date: Tue Mar 14 08:27:13 UTC 2017
Modified Files:
src/sys/dev/pci: pci_subr.c
Log Message:
ECN: Change Root Complex Event Collector Class Code
- Old RCEC has subclass 0x06. It's the same as IOMMU. Read the type in PCIe
extend capability to know whether it's RCEC or IOMMU.
To generate a diff of this commit:
cvs rdiff -u -r1.165 -r1.166 src/sys/dev/pci/pci_subr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/pci_subr.c
diff -u src/sys/dev/pci/pci_subr.c:1.165 src/sys/dev/pci/pci_subr.c:1.166
--- src/sys/dev/pci/pci_subr.c:1.165 Tue Mar 14 08:25:35 2017
+++ src/sys/dev/pci/pci_subr.c Tue Mar 14 08:27:13 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_subr.c,v 1.165 2017/03/14 08:25:35 msaitoh Exp $ */
+/* $NetBSD: pci_subr.c,v 1.166 2017/03/14 08:27:13 msaitoh Exp $ */
/*
* Copyright (c) 1997 Zubin D. Dittia. All rights reserved.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.165 2017/03/14 08:25:35 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.166 2017/03/14 08:27:13 msaitoh Exp $");
#ifdef _KERNEL_OPT
#include "opt_pci.h"
@@ -819,12 +819,31 @@ pci_conf_print_common(
if (class == classp->val)
break;
}
+
+ /*
+ * ECN: Change Root Complex Event Collector Class Code
+ * Old RCEC has subclass 0x06. It's the same as IOMMU. Read the type
+ * in PCIe extend capability to know whether it's RCEC or IOMMU.
+ */
+ if ((class == PCI_CLASS_SYSTEM)
+ && (subclass == PCI_SUBCLASS_SYSTEM_IOMMU)) {
+ int pcie_capoff;
+ pcireg_t reg;
+
+ if (pci_conf_find_cap(regs, PCI_CAPLISTPTR_REG,
+ PCI_CAP_PCIEXPRESS, &pcie_capoff)) {
+ reg = regs[o2i(pcie_capoff + PCIE_XCAP)];
+ if (PCIE_XCAP_TYPE(reg) == PCIE_XCAP_TYPE_ROOT_EVNTC)
+ subclass = PCI_SUBCLASS_SYSTEM_RCEC;
+ }
+ }
subclassp = (classp->name != NULL) ? classp->subclasses : NULL;
while (subclassp && subclassp->name != NULL) {
if (subclass == subclassp->val)
break;
subclassp++;
}
+
interfacep = (subclassp && subclassp->name != NULL) ?
subclassp->subclasses : NULL;
while (interfacep && interfacep->name != NULL) {