On Wed April 7 2010 17:18:35 Thor Lancelot Simon wrote: > On Wed, Apr 07, 2010 at 04:38:37PM -0600, Sverre Froyen wrote: > > On Wed April 7 2010 15:54:49 Thor Lancelot Simon wrote: > > > Doesn't this memory need to be dma-safe? > > > > It does. I assume it needs to be contiguous and properly aligned, which > > malloc(9) seems to imply. Does it also need to be wired? I notice that > > the malloc man page says it's deprecated and to use pool_cache(9) or > > kmem(9) instead. kmem provides wired memory. > > If you want memory you can DMA to/from, I think you need to use > bus_dmamem_alloc().
Yes, reading the man page for bus_dmamap_load etc. I see that is required. Is this a requirement for NetBSD but not for OpenBSD? Look at this code fragment from the OpenBSD iwn driver: data->m = MCLGETI(NULL, M_DONTWAIT, NULL, IWN_RBUF_SIZE); if (data->m == NULL) { printf("%s: could not allocate RX mbuf\n", sc->sc_dev.dv_xname); error = ENOBUFS; goto fail; } error = bus_dmamap_load(sc->sc_dmat, data->map, mtod(data->m, void *), IWN_RBUF_SIZE, NULL, BUS_DMA_NOWAIT | BUS_DMA_READ); MCLGETI returns an mbuf cluster where the mbuf data buffer is allocated like this (from uipc_mbuf.c): data->m->m_ext.ext_buf = pool_get(&mclpools[pi], how == M_WAIT ? PR_WAITOK : 0); This seems to imply that, at least for OpenBSD, pool_get returns an address that can be used by bus_dmamap_load etc. I am probably missing something. Thanks, Sverre