svn commit: r236434 - projects/altix2/sys/kern

Marcel Moolenaar marcel at FreeBSD.org
Sat Jun 2 04:35:12 UTC 2012


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);
 }


More information about the svn-src-projects mailing list