From owner-svn-src-projects@FreeBSD.ORG Sat Jun 2 04:35:12 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 95F2A1065675; Sat, 2 Jun 2012 04:35:12 +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 778988FC08; Sat, 2 Jun 2012 04:35:12 +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 q524ZCxY065503; Sat, 2 Jun 2012 04:35:12 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q524ZCdL065501; Sat, 2 Jun 2012 04:35:12 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201206020435.q524ZCdL065501@svn.freebsd.org> From: Marcel Moolenaar Date: Sat, 2 Jun 2012 04:35:12 +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: r236434 - 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: Sat, 02 Jun 2012 04:35:12 -0000 Author: marcel Date: Sat Jun 2 04:35:11 2012 New Revision: 236434 URL: http://svn.freebsd.org/changeset/base/236434 Log: o Create MDs using a common support function: _busdma_md_create() o Implement busdma_md_create() o Implement busdma_md_destroy() o Stub busdma_md_load_linear() enough to have it return an error via the callback function o Use _busdma_md_create() in busdma_mem_alloc() to create the MD o Implement busdma_mem_free() Modified: projects/altix2/sys/kern/subr_busdma.c Modified: projects/altix2/sys/kern/subr_busdma.c ============================================================================== --- projects/altix2/sys/kern/subr_busdma.c Sat Jun 2 03:13:27 2012 (r236433) +++ projects/altix2/sys/kern/subr_busdma.c Sat Jun 2 04:35:11 2012 (r236434) @@ -191,6 +191,22 @@ _busdma_tag_make(device_t dev, struct bu return (0); } +static struct busdma_md * +_busdma_md_create(struct busdma_tag *tag, u_int flags) +{ + struct busdma_md *md; + size_t mdsz; + + mdsz = sizeof(struct busdma_md) + + sizeof(struct busdma_md_seg) * tag->dt_nsegs; + md = malloc(mdsz, M_BUSDMA_MD, M_NOWAIT | M_ZERO); + if (md != NULL) { + md->md_tag = tag; + md->md_flags = flags; + } + return (md); +} + 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, @@ -247,15 +263,28 @@ busdma_tag_destroy(struct busdma_tag *ta int busdma_md_create(struct busdma_tag *tag, u_int flags, struct busdma_md **md_p) { + struct busdma_md *md; - return (ENOSYS); + md = _busdma_md_create(tag, 0); + if (md == NULL) + return (ENOMEM); + + _busdma_md_dump(__func__, md); + *md_p = md; + return (0); } int busdma_md_destroy(struct busdma_md *md) { - return (ENOSYS); + if ((md->md_flags & BUSDMA_MD_FLAG_ALLOCATED) != 0) + return (EINVAL); + if (md->md_nsegs > 0) + return (EBUSY); + + free(md, M_BUSDMA_MD); + return (0); } bus_addr_t @@ -310,7 +339,10 @@ busdma_md_load_linear(struct busdma_md * busdma_callback_f cb, void *arg, u_int flags) { - return (ENOSYS); + printf("XXX: %s: md=%p, buf=%p, len=%lx\n", __func__, + md, buf, (u_long)len); + (*cb)(arg, md, ENOSYS); + return (0); } int @@ -325,14 +357,12 @@ busdma_mem_alloc(struct busdma_tag *tag, { struct busdma_md *md; struct busdma_md_seg *seg; - size_t mdsz; vm_size_t maxsz; u_int idx; - mdsz = sizeof(struct busdma_md) + - sizeof(struct busdma_md_seg) * tag->dt_nsegs; - md = malloc(mdsz, M_BUSDMA_MD, M_NOWAIT | M_ZERO); - md->md_tag = tag; + md = _busdma_md_create(tag, BUSDMA_MD_FLAG_ALLOCATED); + if (md == NULL) + return (ENOMEM); idx = 0; maxsz = tag->dt_maxsz; @@ -371,7 +401,14 @@ busdma_mem_alloc(struct busdma_tag *tag, int busdma_mem_free(struct busdma_md *md) { + u_int idx; + + if ((md->md_flags & BUSDMA_MD_FLAG_ALLOCATED) == 0) + return (EINVAL); + for (idx = 0; idx < md->md_nsegs; idx++) + kmem_free(kernel_map, md->md_seg[idx].mds_vaddr, + md->md_seg[idx].mds_size); free(md, M_BUSDMA_MD); return (0); }