Module Name: src Committed By: thorpej Date: Sun Dec 3 02:03:18 UTC 2023
Modified Files: src/sys/arch/hppa/dev: astro.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.5 -r1.6 src/sys/arch/hppa/dev/astro.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/astro.c diff -u src/sys/arch/hppa/dev/astro.c:1.5 src/sys/arch/hppa/dev/astro.c:1.6 --- src/sys/arch/hppa/dev/astro.c:1.5 Thu Sep 29 06:42:14 2022 +++ src/sys/arch/hppa/dev/astro.c Sun Dec 3 02:03:18 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: astro.c,v 1.5 2022/09/29 06:42:14 skrll Exp $ */ +/* $NetBSD: astro.c,v 1.6 2023/12/03 02:03:18 thorpej Exp $ */ /* $OpenBSD: astro.c,v 1.8 2007/10/06 23:50:54 krw Exp $ */ @@ -22,7 +22,7 @@ #include <sys/systm.h> #include <sys/device.h> -#include <sys/extent.h> +#include <sys/vmem.h> #include <sys/kmem.h> #include <sys/reboot.h> #include <sys/tree.h> @@ -124,7 +124,7 @@ struct astro_softc { uint64_t *sc_pdir; char sc_dvmamapname[20]; - struct extent *sc_dvmamap; + vmem_t *sc_dvmamap; struct hppa_bus_dma_tag sc_dmatag; }; @@ -328,8 +328,17 @@ astro_attach(device_t parent, device_t s */ snprintf(sc->sc_dvmamapname, sizeof(sc->sc_dvmamapname), "%s_dvma", device_xname(sc->sc_dv)); - sc->sc_dvmamap = extent_create(sc->sc_dvmamapname, 0, (1 << iova_bits), - 0, 0, EX_WAITOK); + sc->sc_dvmamap = vmem_create(sc->sc_dvmamapname, + 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_dvmamap != NULL); sc->sc_dmatag = astro_dmat; sc->sc_dmatag._cookie = sc; @@ -401,18 +410,18 @@ iommu_iomap_load_map(struct astro_softc struct iommu_map_state *ims = map->_dm_cookie; struct iommu_page_map *ipm = &ims->ims_map; struct iommu_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 dvmaddr; + vmem_addr_t dvmaddr; bus_addr_t dva; int i; /* XXX */ boundary = map->_dm_boundary; - align = PAGE_SIZE; + align = 0; /* align to quantum */ iommu_iomap_clear_pages(ims); @@ -432,12 +441,18 @@ iommu_iomap_load_map(struct astro_softc } } + const vm_flag_t vmflags = VM_BESTFIT | + ((flags & BUS_DMA_NOWAIT) ? VM_NOSLEEP : VM_SLEEP); + sgsize = ims->ims_map.ipm_pagecnt * PAGE_SIZE; - /* XXXNH */ - s = splhigh(); - err = extent_alloc(sc->sc_dvmamap, sgsize, align, boundary, - EX_NOWAIT | EX_BOUNDZERO, &dvmaddr); - splx(s); + err = vmem_xalloc(sc->sc_dvmamap, sgsize, + align, /* align */ + 0, /* phase */ + boundary, /* nocross */ + VMEM_ADDR_MIN, /* minaddr */ + VMEM_ADDR_MAX, /* maxaddr */ + vmflags, + &dvmaddr); if (err) return (err); @@ -514,7 +529,7 @@ iommu_dvmamap_unload(void *v, bus_dmamap struct iommu_map_state *ims = map->_dm_cookie; struct iommu_page_map *ipm = &ims->ims_map; struct iommu_page_entry *e; - int err, i, s; + int i; /* Remove the IOMMU entries. */ for (i = 0, e = ipm->ipm_map; i < ipm->ipm_pagecnt; ++i, ++e) @@ -525,14 +540,9 @@ iommu_dvmamap_unload(void *v, bus_dmamap bus_dmamap_unload(sc->sc_dmat, map); - s = splhigh(); - err = extent_free(sc->sc_dvmamap, ims->ims_dvmastart, - ims->ims_dvmasize, EX_NOWAIT); + vmem_xfree(sc->sc_dvmamap, ims->ims_dvmastart, ims->ims_dvmasize); ims->ims_dvmastart = 0; ims->ims_dvmasize = 0; - splx(s); - if (err) - printf("warning: %ld of DVMA space lost\n", ims->ims_dvmasize); } void @@ -736,7 +746,7 @@ iommu_enter(struct astro_softc *sc, bus_ if (tte & IOTTE_V) { printf("Overwriting valid tte entry (dva %lx pa %lx " "&tte %p tte %llx)\n", dva, pa, tte_ptr, tte); - extent_print(sc->sc_dvmamap); + /* vmem_print(sc->sc_dvmamap); XXX */ panic("IOMMU overwrite"); } #endif @@ -773,7 +783,7 @@ iommu_remove(struct astro_softc *sc, bus if ((tte & IOTTE_V) == 0) { printf("Removing invalid tte entry (dva %lx &tte %p " "tte %llx)\n", dva, tte_ptr, tte); - extent_print(sc->sc_dvmamap); + /* vmem_print(sc->sc_dvmamap); XXX */ panic("IOMMU remove overwrite"); } #endif