svn commit: r260283 - head/sys/arm/arm

Ian Lepore ian at FreeBSD.org
Sat Jan 4 21:18:23 UTC 2014


Author: ian
Date: Sat Jan  4 21:18:22 2014
New Revision: 260283
URL: http://svnweb.freebsd.org/changeset/base/260283

Log:
  Use bus_space_map() rather than pmap_mapdev() in nexus_activate_resource(),
  when running on FDT systems.  Unmap memory in nexus_deactivate_resource().
  
  Also, call rman_activate_resource() before mapping device memory, and only
  do the mapping if it returns success.
  
  Reviewed by:	nwhitehorn

Modified:
  head/sys/arm/arm/nexus.c

Modified: head/sys/arm/arm/nexus.c
==============================================================================
--- head/sys/arm/arm/nexus.c	Sat Jan  4 21:14:33 2014	(r260282)
+++ head/sys/arm/arm/nexus.c	Sat Jan  4 21:18:22 2014	(r260283)
@@ -278,36 +278,63 @@ static int
 nexus_activate_resource(device_t bus, device_t child, int type, int rid,
     struct resource *r)
 {
+	int err;
+	bus_addr_t paddr;
+	bus_size_t psize;
+	bus_space_handle_t vaddr;
+
+	if ((err = rman_activate_resource(r)) != 0)
+		return (err);
+
 	/*
 	 * If this is a memory resource, map it into the kernel.
 	 */
 	if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
-		caddr_t vaddr = 0;
-		u_int32_t paddr;
-		u_int32_t psize;
-		u_int32_t poffs;
-
-		paddr = rman_get_start(r);
-		psize = rman_get_size(r);
-		poffs = paddr - trunc_page(paddr);
-		vaddr = (caddr_t) pmap_mapdev(paddr-poffs, psize+poffs) + poffs;
-		rman_set_virtual(r, vaddr);
+		paddr = (bus_addr_t)rman_get_start(r);
+		psize = (bus_size_t)rman_get_size(r);
 #ifdef FDT
+		err = bus_space_map(fdtbus_bs_tag, paddr, psize, 0, &vaddr);
+		if (err != 0) {
+			rman_deactivate_resource(r);
+			return (err);
+		}
 		rman_set_bustag(r, fdtbus_bs_tag);
 #else
+		vaddr = (bus_space_handle_t)pmap_mapdev((vm_offset_t)paddr,
+		    (vm_size_t)psize);
+		if (vaddr == 0) {
+			rman_deactivate_resource(r);
+			return (ENOMEM);
+		}
 		rman_set_bustag(r, (void *)1);
 #endif
-		rman_set_bushandle(r, (bus_space_handle_t) vaddr);
+		rman_set_virtual(r, (void *)vaddr);
+		rman_set_bushandle(r, vaddr);
 	}
-	return (rman_activate_resource(r));
+	return (0);
 }
 
 static int
 nexus_deactivate_resource(device_t bus, device_t child, int type, int rid,
-    struct resource *res)
+    struct resource *r)
 {
+	bus_size_t psize;
+	bus_space_handle_t vaddr;
+
+	psize = (bus_size_t)rman_get_size(r);
+	vaddr = rman_get_bushandle(r);
+
+	if (vaddr != 0) {
+#ifdef FDT
+		bus_space_unmap(fdtbus_bs_tag, vaddr, psize);
+#else
+		pmap_unmapdev((vm_offset_t)vaddr, (vm_size_t)psize);
+#endif
+		rman_set_virtual(r, NULL);
+		rman_set_bushandle(r, 0);
+	}
 
-	return (rman_deactivate_resource(res));
+	return (rman_deactivate_resource(r));
 }
 
 #ifdef FDT


More information about the svn-src-all mailing list