Load the allocated memory and return both the physical
address and the bus address to the application.
This commit is contained in:
parent
cad814eedf
commit
90a1793cce
@ -129,6 +129,16 @@ proto_busdma_tag_lookup(struct proto_busdma *busdma, u_long key)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
proto_busdma_mem_alloc_callback(void *arg, bus_dma_segment_t *segs, int nseg,
|
||||
int error)
|
||||
{
|
||||
struct proto_ioc_busdma *ioc = arg;
|
||||
|
||||
ioc->u.mem.bus_nsegs = nseg;
|
||||
ioc->u.mem.bus_addr = segs[0].ds_addr;
|
||||
}
|
||||
|
||||
static int
|
||||
proto_busdma_mem_alloc(struct proto_busdma *busdma, struct proto_tag *tag,
|
||||
struct proto_ioc_busdma *ioc)
|
||||
@ -153,10 +163,18 @@ proto_busdma_mem_alloc(struct proto_busdma *busdma, struct proto_tag *tag,
|
||||
return (error);
|
||||
}
|
||||
md->physaddr = pmap_kextract((uintptr_t)(md->virtaddr));
|
||||
error = bus_dmamap_load(md->bd_tag, md->bd_map, md->virtaddr,
|
||||
tag->maxsz, proto_busdma_mem_alloc_callback, ioc, BUS_DMA_NOWAIT);
|
||||
if (error) {
|
||||
bus_dmamem_free(md->bd_tag, md->virtaddr, md->bd_map);
|
||||
bus_dma_tag_destroy(md->bd_tag);
|
||||
free(md, M_PROTO_BUSDMA);
|
||||
return (error);
|
||||
}
|
||||
LIST_INSERT_HEAD(&tag->mds, md, peers);
|
||||
LIST_INSERT_HEAD(&busdma->mds, md, mds);
|
||||
ioc->u.mem.nsegs = 1;
|
||||
ioc->u.mem.physaddr = md->physaddr;
|
||||
ioc->u.mem.phys_nsegs = 1;
|
||||
ioc->u.mem.phys_addr = md->physaddr;
|
||||
ioc->result = (uintptr_t)(void *)md;
|
||||
return (0);
|
||||
}
|
||||
|
@ -62,8 +62,10 @@ struct proto_ioc_busdma {
|
||||
struct {
|
||||
unsigned long tag;
|
||||
unsigned int flags;
|
||||
unsigned int nsegs;
|
||||
unsigned long physaddr;
|
||||
unsigned int phys_nsegs;
|
||||
unsigned long phys_addr;
|
||||
unsigned long bus_addr;
|
||||
unsigned int bus_nsegs;
|
||||
} mem;
|
||||
} u;
|
||||
unsigned long result;
|
||||
|
Loading…
x
Reference in New Issue
Block a user