Lines Matching defs:dma

71 aoa_dma_set_program(struct aoa_dma *dma)
76 addr = (u_int32_t) sndbuf_getbufaddr(dma->buf);
77 KASSERT(dma->bufsz == sndbuf_getsize(dma->buf), ("bad size"));
79 dma->slots = dma->bufsz / dma->blksz;
81 for (i = 0; i < dma->slots; ++i) {
82 dbdma_insert_command(dma->channel,
87 dma->blksz, /* count */
91 dma->slots + 1 /* branch_slot */
94 addr += dma->blksz;
98 dbdma_insert_branch(dma->channel, dma->slots, 0);
101 dbdma_insert_stop(dma->channel, dma->slots + 1);
104 dbdma_set_branch_selector(dma->channel, 1 << 0, 1 << 0);
105 dbdma_set_device_status(dma->channel, 1 << 0, 0);
107 dbdma_sync_commands(dma->channel, BUS_DMASYNC_PREWRITE);
115 struct aoa_dma *dma;
127 dma = malloc(sizeof(*dma), M_DEVBUF, M_WAITOK | M_ZERO);
128 dma->tag = tag;
129 dma->bufsz = AOA_BUFFER_SIZE;
130 dma->blksz = PAGE_SIZE; /* initial blocksize */
132 mtx_init(&dma->mutex, "AOA", NULL, MTX_DEF);
134 sc->sc_intrp = dma;
136 return (dma);
140 aoa_dma_delete(struct aoa_dma *dma)
142 bus_dma_tag_destroy(dma->tag);
143 mtx_destroy(&dma->mutex);
144 free(dma, M_DEVBUF);
150 struct aoa_dma *dma = data;
153 DPRINTF(("aoa_chan_setblocksize: blocksz = %u, dma->blksz = %u\n",
154 blocksz, dma->blksz));
155 KASSERT(!dma->running, ("dma is running"));
164 if (blocksz > dma->bufsz)
165 blocksz = dma->bufsz;
167 err = sndbuf_resize(dma->buf, dma->bufsz / blocksz, blocksz);
173 if (blocksz == dma->blksz)
174 return (dma->blksz);
177 err = dbdma_resize_channel(dma->channel, 2 + dma->bufsz / blocksz);
184 dma->blksz = blocksz;
185 aoa_dma_set_program(dma);
187 return (dma->blksz);
212 struct aoa_dma *dma = data;
214 if (!dma->running)
217 return (dma->slot * dma->blksz);
225 struct aoa_dma *dma;
230 dma = aoa_dma_create(sc);
231 if (!dma)
233 dma->pcm = c;
234 dma->buf = b;
235 dma->reg = sc->sc_odma;
238 max_slots = 2 + dma->bufsz / dma->blksz;
239 err = dbdma_allocate_channel(dma->reg, 0, bus_get_dma_tag(sc->sc_dev),
240 max_slots, &dma->channel );
242 aoa_dma_delete(dma);
246 if (sndbuf_alloc(dma->buf, dma->tag, 0, dma->bufsz) != 0) {
247 dbdma_free_channel(dma->channel);
248 aoa_dma_delete(dma);
252 aoa_dma_set_program(dma);
254 return (dma);
260 struct aoa_dma *dma = data;
267 dma->running = 1;
269 dma->slot = 0;
270 dbdma_set_current_cmd(dma->channel, dma->slot);
272 dbdma_run(dma->channel);
279 mtx_lock(&dma->mutex);
281 dma->running = 0;
284 dbdma_set_device_status(dma->channel, 1 << 0, 1 << 0);
290 dbdma_stop(dma->channel);
291 dbdma_set_device_status(dma->channel, 1 << 0, 0);
293 for (i = 0; i < dma->slots; ++i)
294 dbdma_clear_cmd_status(dma->channel, i);
296 mtx_unlock(&dma->mutex);
307 struct aoa_dma *dma = data;
309 sndbuf_free(dma->buf);
310 dbdma_free_channel(dma->channel);
311 aoa_dma_delete(dma);
320 struct aoa_dma *dma;
322 if (!(dma = sc->sc_intrp) || !dma->running)
325 mtx_lock(&dma->mutex);
327 while (dbdma_get_cmd_status(dma->channel, dma->slot)) {
329 dbdma_clear_cmd_status(dma->channel, dma->slot);
330 dma->slot = (dma->slot + 1) % dma->slots;
332 mtx_unlock(&dma->mutex);
333 chn_intr(dma->pcm);
334 mtx_lock(&dma->mutex);
337 mtx_unlock(&dma->mutex);