Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:34:30 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/include/linux: io-mapping.h

Log Message:
io_mapping_init/fini


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/include/linux/io-mapping.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/include/linux/io-mapping.h
diff -u src/sys/external/bsd/drm2/include/linux/io-mapping.h:1.6 src/sys/external/bsd/drm2/include/linux/io-mapping.h:1.7
--- src/sys/external/bsd/drm2/include/linux/io-mapping.h:1.6	Sun Dec 19 01:25:28 2021
+++ src/sys/external/bsd/drm2/include/linux/io-mapping.h	Sun Dec 19 01:34:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: io-mapping.h,v 1.6 2021/12/19 01:25:28 riastradh Exp $	*/
+/*	$NetBSD: io-mapping.h,v 1.7 2021/12/19 01:34:30 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -48,11 +48,10 @@ struct io_mapping {
 	bool			diom_mapped;
 };
 
-static inline struct io_mapping *
-bus_space_io_mapping_create_wc(bus_space_tag_t bst, bus_addr_t addr,
-    bus_size_t size)
+static inline bool
+bus_space_io_mapping_init_wc(bus_space_tag_t bst, struct io_mapping *mapping,
+    bus_addr_t addr, bus_size_t size)
 {
-	struct io_mapping *mapping;
 	bus_size_t offset;
 
 	KASSERT(PAGE_SIZE <= size);
@@ -71,11 +70,10 @@ bus_space_io_mapping_create_wc(bus_space
 		if (bus_space_mmap(bst, addr, offset, PROT_READ|PROT_WRITE,
 			BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE)
 		    == (paddr_t)-1)
-			return NULL;
+			return false;
 	}
 
-	/* Create a mapping record.  */
-	mapping = kmem_alloc(sizeof(*mapping), KM_SLEEP);
+	/* Initialize the mapping record.  */
 	mapping->diom_bst = bst;
 	mapping->diom_addr = addr;
 	mapping->diom_size = size;
@@ -86,16 +84,39 @@ bus_space_io_mapping_create_wc(bus_space
 	    UVM_KMF_VAONLY | UVM_KMF_WAITVA);
 	KASSERT(mapping->diom_va != 0);
 
-	return mapping;
+	return true;
 }
 
 static inline void
-io_mapping_free(struct io_mapping *mapping)
+io_mapping_fini(struct io_mapping *mapping)
 {
 
 	KASSERT(!mapping->diom_mapped);
 
 	uvm_km_free(kernel_map, mapping->diom_va, PAGE_SIZE, UVM_KMF_VAONLY);
+	mapping->diom_va = 0;	/* paranoia */
+}
+
+static inline struct io_mapping *
+bus_space_io_mapping_create_wc(bus_space_tag_t bst, bus_addr_t addr,
+    bus_size_t size)
+{
+	struct io_mapping *mapping;
+
+	mapping = kmem_alloc(sizeof(*mapping), KM_SLEEP);
+	if (!bus_space_io_mapping_init_wc(bst, mapping, addr, size)) {
+		kmem_free(mapping, sizeof(*mapping));
+		return NULL;
+	}
+
+	return mapping;
+}
+
+static inline void
+io_mapping_free(struct io_mapping *mapping)
+{
+
+	io_mapping_fini(mapping);
 	kmem_free(mapping, sizeof(*mapping));
 }
 

Reply via email to