Subject: Re: CVS commit: src/sys
To: None <>
From: Yorick Hardy <>
List: tech-kern
Date: 02/23/2007 16:36:33
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

> Log Message:
> add a pair of new bus_dma(9) functions:
> 	int _bus_dmatag_subregion(bus_dma_tag_t tag,
> 				  bus_addr_t min_addr,
> 				  bus_addr_t max_addr,
> 				  bus_dma_tag_t *newtag,
> 				  int flags)
> 	void _bus_dmatag_destroy(bus_dma_tag_t tag)
> that allow a (normally broken/limited) device to restrict the bus address
> range it can talk to.  this is used by bce(4) to limit DMA addresses to
> 1GB range, the maximum the chip can address.
> all this is from Yorick Hardy <> with input from several
> people on tech-kern.
> XXX: bus_dma(9) needs an update still.
How does this look? (Attached)

Kind regards,

Yorick Hardy

Content-Type: text/plain;
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;

--- share/man/man9/bus_dma.9.orig	2007-02-23 16:21:58.000000000 +0200
+++ share/man/man9/bus_dma.9	2007-02-23 16:33:57.000000000 +0200
@@ -52,7 +52,9 @@
 .Nm bus_dmamem_free ,
 .Nm bus_dmamem_map ,
 .Nm bus_dmamem_unmap ,
-.Nm bus_dmamem_mmap
+.Nm bus_dmamem_mmap ,
+.Nm bus_dmatag_subregion ,
+.Nm bus_dmatag_destroy
 .Nd Bus and Machine Independent DMA Mapping Interface
 .In machine/bus.h
@@ -92,6 +94,11 @@
 .Ft paddr_t
 .Fn bus_dmamem_mmap "bus_dma_tag_t tag" "bus_dma_segment_t *segs" \
 "int nsegs" "off_t off" "int prot" "int flags"
+.Ft int
+.Fn bus_dmatag_subregion "bus_dma_tag_t tag" "bus_addr_t min_addr" \
+"bus_addr_t max_addr" "bus_dma_tag_t *newtag" "int flags"
+.Ft void
+.Fn bus_dmatag_destroy "bus_dma_tag_t tag" 
 Provide a bus- and machine-independent "DMA mapping interface."
@@ -777,6 +784,53 @@
 Returns -1 to indicate failure.
 Otherwise, returns an opaque value to be interpreted by the device pager.
+.It Fn bus_dmatag_subregion "tag" "min_addr" "max_addr" "newtag" "flags"
+Creates a new bus_dma_tag_t in
+.Fa newtag
+.Fa tag
+with the added constraint that data will only be transferred to
+memory addresses in the range (subregion)
+.Fa min_addr
+.Fa max_addr.
+The arguments are as follows:
+.Bl -tag -width nsegs -compact
+.It Fa tag
+This is the bus_dma_tag_t passed down from the parent driver via
+.Fa \*[Lt]bus\*[Gt]_attach_args .
+.It Fa min_addr
+The low address constraint for DMA transfers.
+This address is included.
+.It Fa max_addr
+The high address constraint for DMA transfers.
+This address is not included.
+.It Fa newtag
+A pointer to a bus_dma_tag_t which will store
+the tag limited to the subregion.
+.It Fa flags
+Flags are defined as follows:
+.Bl -tag -width BUS_DMA_COHERENT -compact
+It is not safe to wait (sleep) for resources during this call.
+Returns 0 on success, or an error code to indicate mode of failure.
+Architectures which do not yet support this operation return EOPNOTSUPP.
+.It Fn bus_dmatag_destroy "tag"
+Frees any resources associated with
+.Fa tag
+when the tag is no longer needed.
+.Fn bus_dmatag_destroy
+should always be called when a 
+.Fa tag
+created by
+.Fn bus_dmatag_subregion
+is no longer needed.
+If given valid arguments,
+.Fn bus_dmatag_destroy
+always succeeds.
 .Xr bus_space 9