Date: Sat, 8 Apr 2006 05:18:42 GMT From: John-Mark Gurney <jmg@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 94788 for review Message-ID: <200604080518.k385IgN3081745@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=94788 Change 94788 by jmg@jmg_carbon-60 on 2006/04/08 05:18:33 add ability to enter mappings into the iotte... we'll see if this works.. Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/hviommu.c#3 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/hviommu.c#3 (text+ko) ==== @@ -225,7 +225,7 @@ return him; } -/* XXX - vm_stat_t better be signed */ +/* XXX - vm_size_t better be signed */ static void hviommu_remove(struct hviommu *him, vm_offset_t va, vm_size_t len) { @@ -233,11 +233,11 @@ pages_t demapped; KASSERT(va >= him->him_dvmabase, - ("hviommu_remove: va 0x%lx not in DVMA space", (u_long)va)); + ("%s: va 0x%lx not in DVMA space", __func__, (u_long)va)); KASSERT(va + len >= va, - ("hviommu_remove: va 0x%lx + len 0x%lx wraps", (long)va, (long)len)); + ("%s: va 0x%lx + len 0x%lx wraps", __func__, (long)va, (long)len)); va = trunc_io_page(va); - while (len >= 0) { + while (len > 0) { if ((error = hvio_iommu_demap(him->him_handle, VA_TO_TSBID(him, va), len >> IO_PAGE_SHIFT, &demapped))) { printf("%s: demap: va: %#lx, npages: %#lx, err: %ld\n", @@ -527,6 +527,35 @@ return (0); } +#define IOTTE_CNT 64 +#define HVIOMMU_TSBID(him, dvmaddr) \ + (((dvmaddr) - (him)->him_dvmabase) >> IO_PAGE_SHIFT) + +static void +hviommu_map_pages(struct hviommu *him, bus_addr_t dvmaddr, uint64_t *iottes, pages_t iottecnt) +{ + uint64_t iotteaddr[IOTTE_CNT]; + uint64_t err; + pages_t mapcnt; + int cntdone; + int i; + + for (i = 0; i < cnt; i++) + iotteaddr[i] = pmap_kextract(&iottes[i]); + + /* push tte's */ + cntdone = 0; + while (cntdone < iottecnt) { + if ((err = hvio_iommu_map(him->him_handle, HVIOMMU_TSBID(him, + dvmaddr), iottecnt, PCI_MAP_ATTR_READ | PCI_MAP_ATTR_WRITE, + pmap_kextract(&iotteaddr[0]), &mapcnt))) { + printf("iommu_map: err: %ld\n", err); + mapcnt = 1; + } + cntdone += mapcnt; + } +} + /* * IOMMU DVMA operations, common to SBUS and PCI. */ @@ -535,12 +564,14 @@ bus_dmamap_t map, void *buf, bus_size_t buflen, struct thread *td, int flags, bus_dma_segment_t *segs, int *segp, int align) { - bus_addr_t amask, dvmaddr; + uint64_t iottes[IOTTE_CNT]; + bus_addr_t amask, dvmaddr, iottebase; bus_size_t sgsize, esize; vm_offset_t vaddr, voffs; vm_paddr_t curaddr; int error, sgcnt, firstpg; pmap_t pmap = NULL; + pages_t iottecnt; KASSERT(buflen != 0, ("hviommu_dvmamap_load_buffer: buflen == 0!")); if (buflen > dt->dt_maxsize) @@ -561,6 +592,7 @@ sgcnt = *segp; firstpg = 1; + iottecnt = 0; for (; buflen > 0; ) { /* * Get the physical address for this page. @@ -584,7 +616,13 @@ hviommu_enter(him, trunc_io_page(dvmaddr), trunc_io_page(curaddr), flags); #else - panic("enter page into iommu"); + if (iottecnt == 0) + iottebase = trunc_io_page(dvmaddr); + iottes[iottecnt] = MAKEIOTTE(trunc_io_page(curaddr) + if (iottecnt >= IOTTE_CNT) { + hviommu_map_pages(him, dvmaddr, iottes, iottecnt); + iottecnt = 0; + } #endif /* @@ -618,6 +656,7 @@ firstpg = 0; } + hviommu_map_pages(him, dvmaddr, iottes, iottecnt); *segp = sgcnt; return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604080518.k385IgN3081745>