Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Jan 2015 20:35:09 +0000
From:      =?utf-8?Q?SalvageDrive.com?= <info@salvagedrive.com>
To:        =?utf-8?Q??= <arch@freebsd.org>
Subject:   =?utf-8?Q?Cars=20Cars=20Cars?=
Message-ID:  <38668d8a390eaafe346aac8d5c538f13530.20150129203500@mail54.atl51.rsgsv.net>

next in thread | raw e-mail | index | archive | help
https://www.salvagedrive.com


** Special Deals from Salvage Drive
------------------------------------------------------------

TOP 5 REASONS TO BUY FROM
SALVAGE DRIVE:

1. Free and Easy Registration
2. Best Customer Service in the industry
3. Lowest fees on the market
4. We Ship Worldwide
5. Free Storage for International Shipping

NO AUCTION FEE DEALS!!! (https://www.salvagedrive.com)


** 2004 LEXUS RX 330
------------------------------------------------------------
Clean Title
170=2C451 miles
$7=2C400
https://www.salvagedrive.com/Cars/Category?SysId=3D901024315
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1024315)


** 2005 TOYOTA COROLLA
------------------------------------------------------------
Clean Title
131=2C459 miles
$3=2C800
https://www.salvagedrive.com/Cars/Category?SysId=3D900002667
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
0002667)


** 2005 TOYOTA CAMRY
------------------------------------------------------------
Clean Title
184=2C864 miles
$4=2C255
https://www.salvagedrive.com/Cars/Category?SysId=3D901020825
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1020825)


** 2012 Honda Accord
------------------------------------------------------------
Rebuilt Title
25=2C500 miles
$9=2C900
https://www.salvagedrive.com/Cars/Category?SysId=3D901024320
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1024320)


** 2005 LEXUS RX 330
------------------------------------------------------------
Clean Title
98=2C145 miles
$8=2C700
https://www.salvagedrive.com/Cars/Category?SysId=3D901024316
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1024316)


** 2006 TOYOTA COROLLA
------------------------------------------------------------
Clean Title
93=2C752 miles
$4=2C150
https://www.salvagedrive.com/Cars/Category?SysId=3D900002690
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
0002690)


** 2006 TOYOTA CAMRY
------------------------------------------------------------
Clean Title
237=2C267 miles
$3=2C795
https://www.salvagedrive.com/Cars/Category?SysId=3D901020293
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1020293)


** 2006 NISSAN MURANO
------------------------------------------------------------
Clean Title
122=2C700 miles
$4=2C999
https://www.salvagedrive.com/Cars/Category?SysId=3D901024319
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1024319)


** 2006 LEXUS RX 330
------------------------------------------------------------
Clean Title
184=2C841 miles
$9=2C800
https://www.salvagedrive.com/Cars/Category?SysId=3D901024317
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1024317)


** 2007 TOYOTA COROLLA
------------------------------------------------------------
Clean Title
107=2C474 miles
$6=2C380
https://www.salvagedrive.com/Cars/Category?SysId=3D901019125
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1019125)


** 2007 TOYOTA CAMRY
------------------------------------------------------------
Clean Title
124=2C800 miles
$7=2C800
https://www.salvagedrive.com/Cars/Category?SysId=3D900002666
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
0002666)


** 2008 TOYOTA TACOMA
------------------------------------------------------------
Clean Title
189=2C341 miles
$7=2C950
https://www.salvagedrive.com/Cars/Category?SysId=3D901024318
CLICK FOR MORE INFO (https://www.salvagedrive.com/Cars/Category?SysId=3D90=
1024318)

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
** LET US SEARCH FOR YOU! TELL US WHAT YOU ARE LOOKING FOR AND OUR EXPERTS=
 WILL SEARCH FOR YOU BASED ON YOUR SPECIFIC BUDGET AND REQUIREMENTS. (http=
s://www.salvagedrive.com)
** (https://www.salvagedrive.com)

** SalvageDrive.com (https://www.salvagedrive.com)
1-844-227-7411 Toll Free

1-347-492-1727 Tel.

Skype: salvagedrive

** info@SalvageDrive.com (mailto:info@SalvageDrive.com)

Don't forget to add info@salvagedrive.com to your Address Book to keep it=
 from skipping your inbox or getting caught in spam filters.

We want your experience with the Salvage Drive to be as smooth and reassur=
ing as possible. Accordingly=2C we diligently safeguard your privacy. If y=
ou wish to review our Privacy Policy at any time=2C please click on the li=
nk below=2C or copy and paste it into your web browser's location window
** Salvage Drive Privacy Policy (http://sdimages.salvagedrive.com/salvaged=
rive/PrivacyPolicy.pdf)
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
_______________________

You can choose to unsubscribe from our Email Newsletters service by replyi=
ng to this email with the word "STOP" and we will remove you from any futu=
re mailings.
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
__________________________________________________________________________=
_______________________

=C2=A9 2014 SalvageDrive=2C Inc.   |   All rights reserved
Salvage Drive=2C Inc. | 217 Broadway | Suite 505 | New York | NY | 10007

This email was sent to arch@freebsd.org (mailto:arch@freebsd.org)
why did I get this? (http://salvagedrive.us8.list-manage.com/about?u=3D386=
68d8a390eaafe346aac8d5&id=3Db173b821c7&e=3Dc538f13530&c=3Db20b661509)     un=
subscribe from this list (http://salvagedrive.us8.list-manage.com/unsubscr=
ibe?u=3D38668d8a390eaafe346aac8d5&id=3Db173b821c7&e=3Dc538f13530&c=3Db20b661=
509)     update subscription preferences (http://salvagedrive.us8.list-man=
age.com/profile?u=3D38668d8a390eaafe346aac8d5&id=3Db173b821c7&e=3Dc538f13530=
)
Salvage Drive=2C Inc. =C2=B7 217 Broadway =C2=B7 Suite 505 =C2=B7 New York=
=2C NY 10007 =C2=B7 USA
From owner-freebsd-arch@FreeBSD.ORG  Thu Jan 29 21:04:23 2015
Return-Path: <owner-freebsd-arch@FreeBSD.ORG>
Delivered-To: freebsd-arch@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by hub.freebsd.org (Postfix) with ESMTPS id 2480B514
 for <freebsd-arch@freebsd.org>; Thu, 29 Jan 2015 21:04:23 +0000 (UTC)
Received: from bigwig.baldwin.cx (bigwig.baldwin.cx [IPv6:2001:470:1f11:75::1])
 (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id D69869C8
 for <freebsd-arch@freebsd.org>; Thu, 29 Jan 2015 21:04:22 +0000 (UTC)
Received: from ralph.baldwin.cx (pool-173-70-85-31.nwrknj.fios.verizon.net
 [173.70.85.31])
 by bigwig.baldwin.cx (Postfix) with ESMTPSA id AD060B96C
 for <freebsd-arch@freebsd.org>; Thu, 29 Jan 2015 16:04:21 -0500 (EST)
From: John Baldwin <jhb@freebsd.org>
To: 'freebsd-arch' <freebsd-arch@freebsd.org>
Subject: Wrapper API for static bus_dma allocations
Date: Thu, 29 Jan 2015 15:37:19 -0500
Message-ID: <2800970.jY4xzTy9Hz@ralph.baldwin.cx>
User-Agent: KMail/4.14.2 (FreeBSD/10.1-STABLE; KDE/4.14.2; amd64; ; )
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7
 (bigwig.baldwin.cx); Thu, 29 Jan 2015 16:04:21 -0500 (EST)
X-BeenThere: freebsd-arch@freebsd.org
X-Mailman-Version: 2.1.18-1
Precedence: list
List-Id: Discussion related to FreeBSD architecture <freebsd-arch.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/freebsd-arch>,
 <mailto:freebsd-arch-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/freebsd-arch/>;
List-Post: <mailto:freebsd-arch@freebsd.org>
List-Help: <mailto:freebsd-arch-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/freebsd-arch>,
 <mailto:freebsd-arch-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 29 Jan 2015 21:04:23 -0000

The bus_dma API to allocate a chunk of static DMA'able memory (e.g. for 
descriptor rings) can be a bit obtuse to use in that it require a bit of 
boilerplate to create a tag, allocate memory for the tag, then load it to get 
the bus address.  Similarly, freeing it also requires several steps.  In 
addition, some of the steps are a bit subtle (e.g. the need to check for an 
error in the bus_dma callback instead of from bus_dmamap_load()) and not all 
drivers get those correct.

To try to make this simpler I've written a little wrapper API that tries to 
provide a single call to allocate a buffer and a single call to free a buffer.  
Each buffer is described by a structure defined by the API, and if the call to 
allocate a buffer succeeds, the structure contains both a pointer to the 
buffer in the kernel's address space as well as a bus address of the buffer.

In the interests of simplicity, this API does not allow the buffer to be quite 
as fully configured as the underlying bus_dma API, instead it aims to handle 
the most common cases that are used in most drivers.  As such, it assumes that 
the buffer must be one contiguous range of DMA address space, and the only
parameters that can be specified are the parent tag, the alignment of the 
buffer, the lowaddr parameter, the size of the buffer to allocate, and the 
flags parameter that is normally passed to bus_dmamem_alloc().  I believe that 
this should be sufficient to cover the vast majority of the drivers in our 
tree.

I've included below a patch that contains the wrapper API along with a sample 
conversion of the ndis driver (chosen at random).  If folks like this idea I 
will update the patch to include manpage changes as well.

--- //depot/vendor/freebsd/src/sys/compat/ndis/subr_ndis.c
+++ //depot/user/jhb/cleanup/sys/compat/ndis/subr_ndis.c
@@ -186,7 +186,6 @@
 static ndis_status NdisMAllocateMapRegisters(ndis_handle,
 	uint32_t, uint8_t, uint32_t, uint32_t);
 static void NdisMFreeMapRegisters(ndis_handle);
-static void ndis_mapshared_cb(void *, bus_dma_segment_t *, int, int);
 static void NdisMAllocateSharedMemory(ndis_handle, uint32_t,
 	uint8_t, void **, ndis_physaddr *);
 static void ndis_asyncmem_complete(device_object *, void *);
@@ -1387,23 +1386,6 @@
 	bus_dma_tag_destroy(sc->ndis_mtag);
 }
 
-static void
-ndis_mapshared_cb(arg, segs, nseg, error)
-	void			*arg;
-	bus_dma_segment_t	*segs;
-	int			nseg;
-	int			error;
-{
-	ndis_physaddr		*p;
-
-	if (error || nseg > 1)
-		return;
-
-	p = arg;
-
-	p->np_quad = segs[0].ds_addr;
-}
-
 /*
  * This maps to bus_dmamem_alloc().
  */
@@ -1443,35 +1425,17 @@
 	 * than 1GB of physical memory.
 	 */
 
-	error = bus_dma_tag_create(sc->ndis_parent_tag, 64,
-	    0, NDIS_BUS_SPACE_SHARED_MAXADDR, BUS_SPACE_MAXADDR, NULL,
-	    NULL, len, 1, len, BUS_DMA_ALLOCNOW, NULL, NULL,
-	    &sh->ndis_stag);
+	error = bus_dma_mem_create(&sh->ndis_mem, sc->ndis_parent_tag, 64,
+	    NDIS_BUS_SPACE_SHARED_MAXADDR, len, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
 
 	if (error) {
 		free(sh, M_DEVBUF);
 		return;
 	}
 
-	error = bus_dmamem_alloc(sh->ndis_stag, vaddr,
-	    BUS_DMA_NOWAIT | BUS_DMA_ZERO, &sh->ndis_smap);
-
-	if (error) {
-		bus_dma_tag_destroy(sh->ndis_stag);
-		free(sh, M_DEVBUF);
-		return;
-	}
+	*vaddr = sh->ndis_mem.dma_vaddr;
+	paddr->np_quad = sh->ndis_mem.dma_baddr;
 
-	error = bus_dmamap_load(sh->ndis_stag, sh->ndis_smap, *vaddr,
-	    len, ndis_mapshared_cb, (void *)paddr, BUS_DMA_NOWAIT);
-
-	if (error) {
-		bus_dmamem_free(sh->ndis_stag, *vaddr, sh->ndis_smap);
-		bus_dma_tag_destroy(sh->ndis_stag);
-		free(sh, M_DEVBUF);
-		return;
-	}
-
 	/*
 	 * Save the physical address along with the source address.
 	 * The AirGo MIMO driver will call NdisMFreeSharedMemory()
@@ -1482,8 +1446,6 @@
 	 */
 
 	NDIS_LOCK(sc);
-	sh->ndis_paddr.np_quad = paddr->np_quad;
-	sh->ndis_saddr = *vaddr;
 	InsertHeadList((&sc->ndis_shlist), (&sh->ndis_list));
 	NDIS_UNLOCK(sc);
 }
@@ -1581,13 +1543,13 @@
 	l = sc->ndis_shlist.nle_flink;
 	while (l != &sc->ndis_shlist) {
 		sh = CONTAINING_RECORD(l, struct ndis_shmem, ndis_list);
-		if (sh->ndis_saddr == vaddr)
+		if (sh->ndis_mem.dma_vaddr == vaddr)
 			break;
 		/*
 		 * Check the physaddr too, just in case the driver lied
 		 * about the virtual address.
 		 */
-		if (sh->ndis_paddr.np_quad == paddr.np_quad)
+		if (sh->ndis_mem.dma_baddr == paddr.np_quad)
 			break;
 		l = l->nle_flink;
 	}
@@ -1604,9 +1566,7 @@
 
 	NDIS_UNLOCK(sc);
 
-	bus_dmamap_unload(sh->ndis_stag, sh->ndis_smap);
-	bus_dmamem_free(sh->ndis_stag, sh->ndis_saddr, sh->ndis_smap);
-	bus_dma_tag_destroy(sh->ndis_stag);
+	bus_dma_mem_free(&sh->ndis_mem);
 
 	free(sh, M_DEVBUF);
 }
--- //depot/vendor/freebsd/src/sys/dev/if_ndis/if_ndisvar.h
+++ //depot/user/jhb/cleanup/sys/dev/if_ndis/if_ndisvar.h
@@ -66,10 +66,7 @@
 
 struct ndis_shmem {
 	list_entry		ndis_list;
-	bus_dma_tag_t		ndis_stag;
-	bus_dmamap_t		ndis_smap;
-	void			*ndis_saddr;
-	ndis_physaddr		ndis_paddr;
+	struct bus_dmamem	ndis_mem;
 };
 
 struct ndis_cfglist {
--- //depot/vendor/freebsd/src/sys/kern/subr_bus_dma.c
+++ //depot/user/jhb/cleanup/sys/kern/subr_bus_dma.c
@@ -540,3 +540,66 @@
 
 	return (0);
 }
+
+struct bus_dma_mem_cb_data {
+	struct bus_dmamem *mem;
+	int	error;
+};
+
+static void
+bus_dma_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
+{
+	struct bus_dma_mem_cb_data *d;
+
+	d = arg;
+	d->error = error;
+	if (error)
+		return;
+	d->mem->dma_baddr = segs[0].ds_addr;
+}
+
+int
+bus_dma_mem_create(struct bus_dmamem *mem, bus_dma_tag_t parent,
+    bus_size_t alignment, bus_addr_t lowaddr, bus_size_t len, int flags)
+{
+	struct bus_dma_mem_cb_data d;
+	int error;
+
+	bzero(mem, sizeof(*mem));
+	error = bus_dma_tag_create(parent, alignment, 0, lowaddr,
+	    BUS_SPACE_MAXADDR, NULL, NULL, len, 1, len, 0, NULL, NULL,
+	    &mem->dma_tag);
+	if (error) {
+		bus_dma_mem_free(mem);
+		return (error);
+	}
+	error = bus_dmamem_alloc(mem->dma_tag, &mem->dma_vaddr, flags,
+	    &mem->dma_map);
+	if (error) {
+		bus_dma_mem_free(mem);
+		return (error);
+	}
+	d.mem = mem;
+	error = bus_dmamap_load(mem->dma_tag, mem->dma_map, mem->dma_vaddr, len,
+	    bus_dma_mem_cb, &d, BUS_DMA_NOWAIT);
+	if (error == 0)
+		error = d.error;
+	if (error) {
+		bus_dma_mem_free(mem);
+		return (error);
+	}
+	return (0);
+}
+
+void
+bus_dma_mem_free(struct bus_dmamem *mem)
+{
+
+	if (mem->dma_baddr != 0)
+		bus_dmamap_unload(mem->dma_tag, mem->dma_map);
+	if (mem->dma_vaddr != NULL)
+		bus_dmamem_free(mem->dma_tag, mem->dma_vaddr, mem->dma_map);
+	if (mem->dma_tag != NULL)
+		bus_dma_tag_destroy(mem->dma_tag);
+	bzero(mem, sizeof(*mem));
+}
--- //depot/vendor/freebsd/src/sys/sys/bus_dma.h
+++ //depot/user/jhb/cleanup/sys/sys/bus_dma.h
@@ -337,4 +337,29 @@
 
 #endif /* __sparc64__ */
 
+/*
+ * A wrapper API to simplify management of static mappings.
+ */
+
+struct bus_dmamem {
+	bus_dma_tag_t	dma_tag;
+	bus_dmamap_t	dma_map;
+	void		*dma_vaddr;
+	bus_addr_t	dma_baddr;
+};
+
+/*
+ * Allocate a mapping.  On success, zero is returned and the 'dma_vaddr'
+ * and 'dma_baddr' fields are populated with the virtual and bus addresses,
+ * respectively, of the mapping.
+ */
+int bus_dma_mem_create(struct bus_dmamem *mem, bus_dma_tag_t parent,
+		       bus_size_t alignment, bus_addr_t lowaddr,
+		       bus_size_t len, int flags);
+
+/*
+ * Release a mapping created by bus_dma_mem_create().
+ */
+void bus_dma_mem_free(struct bus_dmamem *mem);
+
 #endif /* _BUS_DMA_H_ */


-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?38668d8a390eaafe346aac8d5c538f13530.20150129203500>