From owner-svn-src-projects@FreeBSD.ORG Sun Jun 3 23:48:04 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id EE982106564A; Sun, 3 Jun 2012 23:48:04 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CFD2E8FC0C; Sun, 3 Jun 2012 23:48:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q53Nm47R092635; Sun, 3 Jun 2012 23:48:04 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q53Nm4Ci092630; Sun, 3 Jun 2012 23:48:04 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201206032348.q53Nm4Ci092630@svn.freebsd.org> From: Marcel Moolenaar Date: Sun, 3 Jun 2012 23:48:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r236532 - in projects/altix2/sys: conf kern sys X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 03 Jun 2012 23:48:05 -0000 Author: marcel Date: Sun Jun 3 23:48:04 2012 New Revision: 236532 URL: http://svn.freebsd.org/changeset/base/236532 Log: Hook-up and respin the busdma/mi IOMMU interface. In particular, rename busdma_mmu_t to busdma_mtag_t, because its use is for deriving the proper memory allocation restrictions based on the device DMA restrictions and the I/O MMUs involved when doing DMA. Modified: projects/altix2/sys/conf/files projects/altix2/sys/kern/busdma_if.m projects/altix2/sys/kern/subr_busdma.c projects/altix2/sys/sys/busdma.h Modified: projects/altix2/sys/conf/files ============================================================================== --- projects/altix2/sys/conf/files Sun Jun 3 22:40:32 2012 (r236531) +++ projects/altix2/sys/conf/files Sun Jun 3 23:48:04 2012 (r236532) @@ -2505,6 +2505,7 @@ fs/cd9660/cd9660_vfsops.c optional cd966 fs/cd9660/cd9660_vnops.c optional cd9660 fs/cd9660/cd9660_iconv.c optional cd9660_iconv kern/bus_if.m standard +kern/busdma_if.m standard kern/clock_if.m standard kern/cpufreq_if.m standard kern/device_if.m standard Modified: projects/altix2/sys/kern/busdma_if.m ============================================================================== --- projects/altix2/sys/kern/busdma_if.m Sun Jun 3 22:40:32 2012 (r236531) +++ projects/altix2/sys/kern/busdma_if.m Sun Jun 3 23:48:04 2012 (r236532) @@ -31,25 +31,14 @@ INTERFACE busdma; -busdma_mmu_t { - void * cookie; - vm_paddr_t minaddr; - vm_paddr_t maxaddr; - vm_size_t maxsz; - vm_paddr_t align; - vm_paddr_t bndry; -} - -METHOD int iommu_alloc { +METHOD int iommu_xlate { device_t dev; - busdma_md_t md; - busdma_mmu_t *mmu; + busdma_mtag_t mtag; }; METHOD int iommu_map { device_t dev; busdma_md_t md; - busdma_mmu_t *mmu; }; METHOD int iommu_unmap { Modified: projects/altix2/sys/kern/subr_busdma.c ============================================================================== --- projects/altix2/sys/kern/subr_busdma.c Sun Jun 3 22:40:32 2012 (r236531) +++ projects/altix2/sys/kern/subr_busdma.c Sun Jun 3 23:48:04 2012 (r236532) @@ -39,6 +39,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include "busdma_if.h" + struct busdma_tag { struct busdma_tag *dt_chain; struct busdma_tag *dt_child; @@ -357,21 +359,35 @@ busdma_mem_alloc(struct busdma_tag *tag, { struct busdma_md *md; struct busdma_md_seg *seg; + struct busdma_mtag mtag; + device_t bus; vm_size_t maxsz; u_int idx; + int error; md = _busdma_md_create(tag, BUSDMA_MD_FLAG_ALLOCATED); if (md == NULL) return (ENOMEM); + mtag.dmt_minaddr = tag->dt_minaddr; + mtag.dmt_maxaddr = tag->dt_maxaddr; + mtag.dmt_maxsz = tag->dt_maxsegsz; + mtag.dmt_align = tag->dt_align; + mtag.dmt_bndry = tag->dt_bndry; + + bus = device_get_parent(tag->dt_device); + error = BUSDMA_IOMMU_XLATE(bus, &mtag); + if (error) + printf("BUSDMA_IOMMU_XLATE: error=%d\n", error); + idx = 0; maxsz = tag->dt_maxsz; while (maxsz > 0 && idx < tag->dt_nsegs) { seg = &md->md_seg[idx]; - seg->mds_size = MIN(maxsz, tag->dt_maxsegsz); + seg->mds_size = MIN(maxsz, mtag.dmt_maxsz); seg->mds_vaddr = kmem_alloc_contig(kernel_map, seg->mds_size, - 0, tag->dt_minaddr, tag->dt_maxaddr, tag->dt_align, - tag->dt_bndry, VM_MEMATTR_DEFAULT); + 0, mtag.dmt_minaddr, mtag.dmt_maxaddr, mtag.dmt_align, + mtag.dmt_bndry, VM_MEMATTR_DEFAULT); if (seg->mds_vaddr == 0) { /* TODO: try a smaller segment size */ goto fail; @@ -383,6 +399,9 @@ busdma_mem_alloc(struct busdma_tag *tag, } if (maxsz == 0) { md->md_nsegs = idx; + error = BUSDMA_IOMMU_MAP(bus, md); + if (error) + printf("BUSDMA_IOMMU_MAP: error=%d\n", error); _busdma_md_dump(__func__, md); *md_p = md; return (0); @@ -401,11 +420,18 @@ busdma_mem_alloc(struct busdma_tag *tag, int busdma_mem_free(struct busdma_md *md) { + device_t bus; u_int idx; + int error; if ((md->md_flags & BUSDMA_MD_FLAG_ALLOCATED) == 0) return (EINVAL); + bus = device_get_parent(md->md_tag->dt_device); + error = BUSDMA_IOMMU_UNMAP(bus, md); + if (error) + printf("BUSDMA_IOMMU_UNMAP: error=%d\n", error); + for (idx = 0; idx < md->md_nsegs; idx++) kmem_free(kernel_map, md->md_seg[idx].mds_vaddr, md->md_seg[idx].mds_size); Modified: projects/altix2/sys/sys/busdma.h ============================================================================== --- projects/altix2/sys/sys/busdma.h Sun Jun 3 22:40:32 2012 (r236531) +++ projects/altix2/sys/sys/busdma.h Sun Jun 3 23:48:04 2012 (r236532) @@ -37,6 +37,15 @@ typedef struct busdma_tag *busdma_tag_t; struct busdma_md; typedef struct busdma_md *busdma_md_t; +struct busdma_mtag { + vm_paddr_t dmt_minaddr; + vm_paddr_t dmt_maxaddr; + vm_size_t dmt_maxsz; + vm_paddr_t dmt_align; + vm_paddr_t dmt_bndry; +}; +typedef struct busdma_mtag *busdma_mtag_t; + /* * busdma_tag_create * returns: errno value