From owner-svn-src-projects@FreeBSD.ORG Mon Jun 4 06:00:58 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2C30A106564A; Mon, 4 Jun 2012 06:00:58 +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 177048FC19; Mon, 4 Jun 2012 06:00:58 +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 q5460vc7008250; Mon, 4 Jun 2012 06:00:57 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q5460vuB008247; Mon, 4 Jun 2012 06:00:57 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201206040600.q5460vuB008247@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 4 Jun 2012 06:00:57 +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: r236536 - projects/altix2/sys/kern 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: Mon, 04 Jun 2012 06:00:58 -0000 Author: marcel Date: Mon Jun 4 06:00:57 2012 New Revision: 236536 URL: http://svn.freebsd.org/changeset/base/236536 Log: o Add a default implementation of busdma_iommu_xlate that yields an identify mapping (i.e. does not change the mtag and returns 0). o Add _busdma_iommu_xlate that walks the device hierarchy until it reaches the root. This allows all devices on the path from leaf to root to contribute to the final mtag. Modified: projects/altix2/sys/kern/busdma_if.m projects/altix2/sys/kern/subr_busdma.c Modified: projects/altix2/sys/kern/busdma_if.m ============================================================================== --- projects/altix2/sys/kern/busdma_if.m Mon Jun 4 04:24:59 2012 (r236535) +++ projects/altix2/sys/kern/busdma_if.m Mon Jun 4 06:00:57 2012 (r236536) @@ -31,10 +31,19 @@ INTERFACE busdma; +# Default implementations +CODE { + static int + default_iommu_xlate(device_t dev, busdma_mtag_t mtag) + { + return (0); + } +}; + METHOD int iommu_xlate { device_t dev; busdma_mtag_t mtag; -}; +} DEFAULT default_iommu_xlate; METHOD int iommu_map { device_t dev; Modified: projects/altix2/sys/kern/subr_busdma.c ============================================================================== --- projects/altix2/sys/kern/subr_busdma.c Mon Jun 4 04:24:59 2012 (r236535) +++ projects/altix2/sys/kern/subr_busdma.c Mon Jun 4 06:00:57 2012 (r236536) @@ -107,6 +107,17 @@ static MALLOC_DEFINE(M_BUSDMA_MD, "busdm static MALLOC_DEFINE(M_BUSDMA_TAG, "busdma_tag", "DMA tags"); static void +_busdma_mtag_dump(const char *func, device_t dev, struct busdma_mtag *mtag) +{ + + printf("[%s: %s: min=%#lx, max=%#lx, size=%#lx, align=%#lx, " + "bndry=%#lx]\n", __func__, + (dev != NULL) ? device_get_nameunit(dev) : "*", + mtag->dmt_minaddr, mtag->dmt_maxaddr, mtag->dmt_maxsz, + mtag->dmt_align, mtag->dmt_bndry); +} + +static void _busdma_tag_dump(const char *func, device_t dev, struct busdma_tag *tag) { @@ -209,6 +220,22 @@ _busdma_md_create(struct busdma_tag *tag return (md); } +static int +_busdma_iommu_xlate(device_t dev, struct busdma_mtag *mtag) +{ + int error; + + error = 0; + while (!error && dev != NULL) { + _busdma_mtag_dump(__func__, dev, mtag); + error = BUSDMA_IOMMU_XLATE(dev, mtag); + if (!error) + dev = device_get_parent(dev); + } + _busdma_mtag_dump(__func__, dev, mtag); + return (error); +} + int busdma_tag_create(device_t dev, bus_addr_t align, bus_addr_t bndry, bus_addr_t maxaddr, bus_size_t maxsz, u_int nsegs, bus_size_t maxsegsz, @@ -381,7 +408,6 @@ 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; @@ -390,18 +416,20 @@ busdma_mem_alloc(struct busdma_tag *tag, if (md == NULL) return (ENOMEM); + idx = 0; + 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); + error = _busdma_iommu_xlate(tag->dt_device, &mtag); + if (error) { + printf("_busdma_iommu_xlate: error=%d\n", error); + goto fail; + } - idx = 0; maxsz = tag->dt_maxsz; while (maxsz > 0 && idx < tag->dt_nsegs) { seg = &md->md_seg[idx]; @@ -420,7 +448,7 @@ busdma_mem_alloc(struct busdma_tag *tag, } if (maxsz == 0) { md->md_nsegs = idx; - error = BUSDMA_IOMMU_MAP(bus, md); + error = BUSDMA_IOMMU_MAP(tag->dt_device, md); if (error) printf("BUSDMA_IOMMU_MAP: error=%d\n", error); _busdma_md_dump(__func__, md);