svn commit: r347930 - head/sys/dev/pci

Emmanuel Vadot manu at FreeBSD.org
Fri May 17 17:05:18 UTC 2019


Author: manu
Date: Fri May 17 17:05:16 2019
New Revision: 347930
URL: https://svnweb.freebsd.org/changeset/base/347930

Log:
  pci: ecam: Correctly parse memory and IO region
  
  When activating a resource do not compare the resource id to the adress.
  Treat IO region as MEMORY region too.
  
  Submitted by:	Tuan Phan <tphan at amperecomputing.com> (Original Version)
  Sponsored by:	Ampere Computing, LLC
  Differential Revision:	https://reviews.freebsd.org/D20214

Modified:
  head/sys/dev/pci/pci_host_generic.c
  head/sys/dev/pci/pci_host_generic_acpi.c

Modified: head/sys/dev/pci/pci_host_generic.c
==============================================================================
--- head/sys/dev/pci/pci_host_generic.c	Fri May 17 17:04:01 2019	(r347929)
+++ head/sys/dev/pci/pci_host_generic.c	Fri May 17 17:05:16 2019	(r347930)
@@ -359,29 +359,30 @@ generic_pcie_activate_resource(device_t dev, device_t 
 
 	switch (type) {
 	case SYS_RES_IOPORT:
+	case SYS_RES_MEMORY:
 		found = 0;
 		for (i = 0; i < MAX_RANGES_TUPLES; i++) {
 			pci_base = sc->ranges[i].pci_base;
 			phys_base = sc->ranges[i].phys_base;
 			size = sc->ranges[i].size;
 
-			if ((rid > pci_base) && (rid < (pci_base + size))) {
+			if ((rman_get_start(r) >= pci_base) && (rman_get_start(r) < (pci_base + size))) {
 				found = 1;
 				break;
 			}
 		}
 		if (found) {
-			rman_set_start(r, rman_get_start(r) + phys_base);
-			rman_set_end(r, rman_get_end(r) + phys_base);
+			rman_set_start(r, rman_get_start(r) - pci_base + phys_base);
+			rman_set_end(r, rman_get_end(r) - pci_base + phys_base);
 			res = BUS_ACTIVATE_RESOURCE(device_get_parent(dev),
 			    child, type, rid, r);
 		} else {
 			device_printf(dev,
-			    "Failed to activate IOPORT resource\n");
+			    "Failed to activate %s resource\n",
+			    type == SYS_RES_IOPORT ? "IOPORT" : "MEMORY");
 			res = 0;
 		}
 		break;
-	case SYS_RES_MEMORY:
 	case SYS_RES_IRQ:
 		res = BUS_ACTIVATE_RESOURCE(device_get_parent(dev), child,
 		    type, rid, r);

Modified: head/sys/dev/pci/pci_host_generic_acpi.c
==============================================================================
--- head/sys/dev/pci/pci_host_generic_acpi.c	Fri May 17 17:04:01 2019	(r347929)
+++ head/sys/dev/pci/pci_host_generic_acpi.c	Fri May 17 17:05:16 2019	(r347930)
@@ -148,8 +148,6 @@ pci_host_generic_acpi_parse_resource(ACPI_RESOURCE *re
 		off = res->Data.Address32.Address.TranslationOffset;
 		break;
 	case ACPI_RESOURCE_TYPE_ADDRESS64:
-		if (res->Data.Address.ResourceType != ACPI_MEMORY_RANGE)
-			break;
 		min = res->Data.Address64.Address.Minimum;
 		max = res->Data.Address64.Address.Maximum;
 		off = res->Data.Address64.Address.TranslationOffset;
@@ -293,7 +291,7 @@ pci_host_generic_acpi_attach(device_t dev)
 			continue; /* empty range element */
 		if (sc->base.ranges[tuple].flags & FLAG_MEM) {
 			error = rman_manage_region(&sc->base.mem_rman,
-			   phys_base, phys_base + size - 1);
+			   pci_base, pci_base + size - 1);
 		} else if (sc->base.ranges[tuple].flags & FLAG_IO) {
 			error = rman_manage_region(&sc->base.io_rman,
 			   pci_base + PCI_IO_WINDOW_OFFSET,


More information about the svn-src-all mailing list