Lines Matching refs:md

59 	struct proto_md *md;
147 struct proto_md *md)
150 LIST_REMOVE(md, mds);
151 LIST_REMOVE(md, peers);
152 if (md->physaddr)
153 bus_dmamap_unload(md->bd_tag, md->bd_map);
154 if (md->virtaddr != NULL)
155 bus_dmamem_free(md->bd_tag, md->virtaddr, md->bd_map);
157 bus_dmamap_destroy(md->bd_tag, md->bd_map);
158 bus_dma_tag_destroy(md->bd_tag);
159 free(md, M_PROTO_BUSDMA);
169 pcb->ioc->u.md.bus_nsegs = nseg;
170 pcb->ioc->u.md.bus_addr = segs[0].ds_addr;
178 struct proto_md *md;
181 md = malloc(sizeof(*md), M_PROTO_BUSDMA, M_WAITOK | M_ZERO);
182 md->tag = tag;
186 tag->nsegs, tag->maxsegsz, 0, NULL, NULL, &md->bd_tag);
188 free(md, M_PROTO_BUSDMA);
191 error = bus_dmamem_alloc(md->bd_tag, &md->virtaddr, 0, &md->bd_map);
193 bus_dma_tag_destroy(md->bd_tag);
194 free(md, M_PROTO_BUSDMA);
197 md->physaddr = pmap_kextract((uintptr_t)(md->virtaddr));
199 pcb.md = md;
201 error = bus_dmamap_load(md->bd_tag, md->bd_map, md->virtaddr,
204 bus_dmamem_free(md->bd_tag, md->virtaddr, md->bd_map);
205 bus_dma_tag_destroy(md->bd_tag);
206 free(md, M_PROTO_BUSDMA);
209 LIST_INSERT_HEAD(&tag->mds, md, peers);
210 LIST_INSERT_HEAD(&busdma->mds, md, mds);
211 ioc->u.md.virt_addr = (uintptr_t)md->virtaddr;
212 ioc->u.md.virt_size = tag->maxsz;
213 ioc->u.md.phys_nsegs = 1;
214 ioc->u.md.phys_addr = md->physaddr;
215 ioc->result = (uintptr_t)(void *)md;
220 proto_busdma_mem_free(struct proto_busdma *busdma, struct proto_md *md)
223 if (md->virtaddr == NULL)
225 return (proto_busdma_md_destroy_internal(busdma, md));
232 struct proto_md *md;
235 md = malloc(sizeof(*md), M_PROTO_BUSDMA, M_WAITOK | M_ZERO);
236 md->tag = tag;
240 tag->nsegs, tag->maxsegsz, 0, NULL, NULL, &md->bd_tag);
242 free(md, M_PROTO_BUSDMA);
245 error = bus_dmamap_create(md->bd_tag, 0, &md->bd_map);
247 bus_dma_tag_destroy(md->bd_tag);
248 free(md, M_PROTO_BUSDMA);
252 LIST_INSERT_HEAD(&tag->mds, md, peers);
253 LIST_INSERT_HEAD(&busdma->mds, md, mds);
254 ioc->result = (uintptr_t)(void *)md;
259 proto_busdma_md_destroy(struct proto_busdma *busdma, struct proto_md *md)
262 if (md->virtaddr != NULL)
264 return (proto_busdma_md_destroy_internal(busdma, md));
273 pcb->ioc->u.md.bus_nsegs = nseg;
274 pcb->ioc->u.md.bus_addr = segs[0].ds_addr;
278 proto_busdma_md_load(struct proto_busdma *busdma, struct proto_md *md,
287 iov.iov_base = (void *)(uintptr_t)ioc->u.md.virt_addr;
288 iov.iov_len = ioc->u.md.virt_size;
298 pcb.md = md;
300 error = bus_dmamap_load_uio(md->bd_tag, md->bd_map, &uio,
307 md->physaddr = pmap_extract(pmap, ioc->u.md.virt_addr);
308 ioc->u.md.phys_nsegs = 1; /* XXX */
309 ioc->u.md.phys_addr = md->physaddr;
314 proto_busdma_md_unload(struct proto_busdma *busdma, struct proto_md *md)
317 if (!md->physaddr)
319 bus_dmamap_unload(md->bd_tag, md->bd_map);
320 md->physaddr = 0;
325 proto_busdma_sync(struct proto_busdma *busdma, struct proto_md *md,
334 if (!md->physaddr)
336 bus_dmamap_sync(md->bd_tag, md->bd_map, ioc->u.sync.op);
343 struct proto_md *md;
345 LIST_FOREACH(md, &busdma->mds, mds) {
346 if ((void *)md == (void *)key)
347 return (md);
373 struct proto_md *md, *md1;
376 LIST_FOREACH_SAFE(md, &busdma->mds, mds, md1)
377 proto_busdma_md_destroy_internal(busdma, md);
388 struct proto_md *md;
414 tag = proto_busdma_tag_lookup(busdma, ioc->u.md.tag);
422 md = proto_busdma_md_lookup(busdma, ioc->key);
423 if (md == NULL) {
427 error = proto_busdma_mem_free(busdma, md);
430 tag = proto_busdma_tag_lookup(busdma, ioc->u.md.tag);
438 md = proto_busdma_md_lookup(busdma, ioc->key);
439 if (md == NULL) {
443 error = proto_busdma_md_destroy(busdma, md);
446 md = proto_busdma_md_lookup(busdma, ioc->key);
447 if (md == NULL) {
451 error = proto_busdma_md_load(busdma, md, ioc, td);
454 md = proto_busdma_md_lookup(busdma, ioc->key);
455 if (md == NULL) {
459 error = proto_busdma_md_unload(busdma, md);
462 md = proto_busdma_md_lookup(busdma, ioc->key);
463 if (md == NULL) {
467 error = proto_busdma_sync(busdma, md, ioc);
479 struct proto_md *md;
481 LIST_FOREACH(md, &busdma->mds, mds) {
482 if (physaddr >= trunc_page(md->physaddr) &&
483 physaddr <= trunc_page(md->physaddr + md->tag->maxsz))