Module Name:    src
Committed By:   thorpej
Date:           Sun Dec  3 02:17:06 UTC 2023

Modified Files:
        src/sys/arch/hppa/dev: uturn.c

Log Message:
Use vmem(9) rather than extent(9) to manage IOMMU mappings.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/hppa/dev/uturn.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/arch/hppa/dev/uturn.c
diff -u src/sys/arch/hppa/dev/uturn.c:1.6 src/sys/arch/hppa/dev/uturn.c:1.7
--- src/sys/arch/hppa/dev/uturn.c:1.6	Thu Sep 29 06:42:14 2022
+++ src/sys/arch/hppa/dev/uturn.c	Sun Dec  3 02:17:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: uturn.c,v 1.6 2022/09/29 06:42:14 skrll Exp $	*/
+/*	$NetBSD: uturn.c,v 1.7 2023/12/03 02:17:06 thorpej Exp $	*/
 
 /*	$OpenBSD: uturn.c,v 1.6 2007/12/29 01:26:14 kettenis Exp $	*/
 
@@ -85,7 +85,7 @@
 
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/extent.h>
+#include <sys/vmem.h>
 #include <sys/kmem.h>
 #include <sys/mbuf.h>
 #include <sys/reboot.h>
@@ -178,7 +178,7 @@ struct uturn_softc {
 	uint32_t sc_chainid_shift;
 
 	char sc_mapname[20];
-	struct extent *sc_map;
+	vmem_t *sc_map;
 
 	struct hppa_bus_dma_tag sc_dmatag;
 };
@@ -357,8 +357,17 @@ uturnattach(device_t parent, device_t se
 
 	snprintf(sc->sc_mapname, sizeof(sc->sc_mapname), "%s_map",
 	    device_xname(sc->sc_dv));
-	sc->sc_map = extent_create(sc->sc_mapname, 0, (1 << iova_bits),
-	    0, 0, EX_WAITOK);
+	sc->sc_map = vmem_create(sc->sc_mapname,
+				 0,			/* base */
+				 (1 << iova_bits),	/* size */
+				 PAGE_SIZE,		/* quantum */
+				 NULL,			/* allocfn */
+				 NULL,			/* freefn */
+				 NULL,			/* source */
+				 0,			/* qcache_max */
+				 VM_SLEEP,
+				 IPL_VM);
+	KASSERT(sc->sc_map != NULL);
 
 	sc->sc_dmatag = uturn_dmat;
 	sc->sc_dmatag._cookie = sc;
@@ -539,18 +548,18 @@ uturn_iomap_load_map(struct uturn_softc 
 	struct uturn_map_state *ums = map->_dm_cookie;
 	struct uturn_page_map *upm = &ums->ums_map;
 	struct uturn_page_entry *e;
-	int err, seg, s;
+	int err, seg;
 	paddr_t pa, paend;
 	vaddr_t va;
 	bus_size_t sgsize;
 	bus_size_t align, boundary;
-	u_long iovaddr;
+	vmem_addr_t iovaddr;
 	bus_addr_t iova;
 	int i;
 
 	/* XXX */
 	boundary = map->_dm_boundary;
-	align = PAGE_SIZE;
+	align = 0;	/* align to quantum */
 
 	uturn_iomap_clear_pages(ums);
 
@@ -570,12 +579,18 @@ uturn_iomap_load_map(struct uturn_softc 
 		}
 	}
 
+	const vm_flag_t vmflags = VM_BESTFIT |
+	    ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP);
+
 	sgsize = ums->ums_map.upm_pagecnt * PAGE_SIZE;
-	/* XXXNH */
-	s = splhigh();
-	err = extent_alloc(sc->sc_map, sgsize, align, boundary,
-	    EX_NOWAIT | EX_BOUNDZERO, &iovaddr);
-	splx(s);
+	err = vmem_xalloc(sc->sc_map, sgsize,
+			  align,		/* align */
+			  0,			/* phase */
+			  boundary,		/* nocross */
+			  VMEM_ADDR_MIN,	/* minaddr */
+			  VMEM_ADDR_MAX,	/* maxaddr */
+			  vmflags,
+			  &iovaddr);
 	if (err)
 		return (err);
 
@@ -653,7 +668,7 @@ uturn_dmamap_unload(void *v, bus_dmamap_
 	struct uturn_map_state *ums = map->_dm_cookie;
 	struct uturn_page_map *upm = &ums->ums_map;
 	struct uturn_page_entry *e;
-	int err, i, s;
+	int i;
 
 	/* Remove the IOMMU entries. */
 	for (i = 0, e = upm->upm_map; i < upm->upm_pagecnt; ++i, ++e)
@@ -664,14 +679,9 @@ uturn_dmamap_unload(void *v, bus_dmamap_
 
 	bus_dmamap_unload(sc->sc_dmat, map);
 
-	s = splhigh();
-	err = extent_free(sc->sc_map, ums->ums_iovastart,
-	    ums->ums_iovasize, EX_NOWAIT);
+	vmem_xfree(sc->sc_map, ums->ums_iovastart, ums->ums_iovasize);
 	ums->ums_iovastart = 0;
 	ums->ums_iovasize = 0;
-	splx(s);
-	if (err)
-		printf("warning: %ld of IOVA space lost\n", ums->ums_iovasize);
 }
 
 void

Reply via email to