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