Date: Sat, 2 Jun 2012 04:35:12 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r236434 - projects/altix2/sys/kern Message-ID: <201206020435.q524ZCdL065501@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206020435.q524ZCdL065501>