[PATCH] Add support for NEW_PCIB to ia64

John Baldwin <[email protected]>
Newsgroups gmane.os.freebsd.devel.ia64
Message-ID <[email protected]>
Since ia64 uses ACPI, I believe that all it needs is a bus_adjust_resource()
method in its nexus driver to support the new PCI-PCI bridge driver (and the
other patches I posted to current@ recently in regards to Host-PCI bridge
driver decoding ranges).  Can someone try this patch and boot with a kernel
with 'options NEW_PCIB' to check for any regressions?

--- //depot/vendor/freebsd/src/sys/ia64/ia64/nexus.c	2011-04-29 18:45:22.000000000 0000
+++ //depot/projects/pci/sys/ia64/ia64/nexus.c	2011-07-15 18:08:28.000000000 0000
@@ -86,6 +86,8 @@
 				int unit);
 static	struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
 					      u_long, u_long, u_long, u_int);
+static	int nexus_adjust_resource(device_t, device_t, int, struct resource *,
+				  u_long, u_long);
 static	int nexus_activate_resource(device_t, device_t, int, int,
 				    struct resource *);
 static	int nexus_deactivate_resource(device_t, device_t, int, int,
@@ -122,6 +124,7 @@
 	DEVMETHOD(bus_print_child,	nexus_print_child),
 	DEVMETHOD(bus_add_child,	nexus_add_child),
 	DEVMETHOD(bus_alloc_resource,	nexus_alloc_resource),
+	DEVMETHOD(bus_adjust_resource,	nexus_adjust_resource),
 	DEVMETHOD(bus_release_resource,	nexus_release_resource),
 	DEVMETHOD(bus_activate_resource, nexus_activate_resource),
 	DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource),
@@ -238,6 +241,20 @@
 	return(child);
 }
 
+static struct rman *
+nexus_rman(int type)
+{
+	switch (type) {
+	case SYS_RES_IRQ:
+		return (&irq_rman);
+	case SYS_RES_IOPORT:
+		return (&port_rman);
+	case SYS_RES_MEMORY:
+		return (&mem_rman);
+	default:
+		return (NULL);
+	}
+}
 
 /*
  * Allocate a resource on behalf of child.  NB: child is usually going to be a
@@ -271,24 +288,10 @@
 	}
 
 	flags &= ~RF_ACTIVE;
+	rm = nexus_rman(type);
+	if (rm == NULL)
+		return (NULL);
 
-	switch (type) {
-	case SYS_RES_IRQ:
-		rm = &irq_rman;
-		break;
-
-	case SYS_RES_IOPORT:
-		rm = &port_rman;
-		break;
-
-	case SYS_RES_MEMORY:
-		rm = &mem_rman;
-		break;
-
-	default:
-		return 0;
-	}
-
 	rv = rman_reserve_resource(rm, start, end, count, flags, child);
 	if (rv == 0)
 		return 0;
@@ -305,6 +308,20 @@
 }
 
 static int
+nexus_adjust_resource(device_t bus, device_t child, int type,
+    struct resource *r, u_long start, u_long end)
+{
+	struct rman *rm;
+
+	rm = nexus_rman(type);
+	if (rm == NULL)
+		return (ENXIO);
+	if (!rman_is_region_manager(r, rm))
+		return (EINVAL);
+	return (rman_adjust_resource(r, start, end));
+}
+
+static int
 nexus_activate_resource(device_t bus, device_t child, int type, int rid,
     struct resource *r)
 {

-- 
John Baldwin
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-ia64
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.