Sync with other platforms:
- make dflt_lock() always panic, - add kludge to use contigmalloc() when the alignment is larger than the size and print a diagnostic when we didn't satisfy the alignment.
This commit is contained in:
parent
67d60b1481
commit
4539e94b61
@ -182,11 +182,8 @@ busdma_lock_mutex(void *arg, bus_dma_lock_op_t op)
|
||||
static void
|
||||
dflt_lock(void *arg, bus_dma_lock_op_t op)
|
||||
{
|
||||
#ifdef INVARIANTS
|
||||
|
||||
panic("driver error: busdma dflt_lock called");
|
||||
#else
|
||||
printf("DRIVER_ERROR: busdma dflt_lock called\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -631,9 +628,18 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags,
|
||||
if (flags & BUS_DMA_ZERO)
|
||||
mflags |= M_ZERO;
|
||||
|
||||
if ((dmat->dt_maxsize <= PAGE_SIZE)) {
|
||||
/*
|
||||
* XXX:
|
||||
* (dmat->dt_alignment < dmat->dt_maxsize) is just a quick hack; the
|
||||
* exact alignment guarantees of malloc need to be nailed down, and
|
||||
* the code below should be rewritten to take that into account.
|
||||
*
|
||||
* In the meantime, we'll warn the user if malloc gets it wrong.
|
||||
*/
|
||||
if (dmat->dt_maxsize <= PAGE_SIZE &&
|
||||
dmat->dt_alignment < dmat->dt_maxsize)
|
||||
*vaddr = malloc(dmat->dt_maxsize, M_DEVBUF, mflags);
|
||||
} else {
|
||||
else {
|
||||
/*
|
||||
* XXX use contigmalloc until it is merged into this
|
||||
* facility and handles multi-seg allocations. Nobody
|
||||
@ -646,6 +652,8 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags,
|
||||
}
|
||||
if (*vaddr == NULL)
|
||||
return (ENOMEM);
|
||||
if ((uintptr_t)*vaddr % dmat->dt_alignment)
|
||||
printf("%s: failed to align memory properly.\n", __func__);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -657,11 +665,11 @@ static void
|
||||
nexus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
|
||||
{
|
||||
|
||||
if ((dmat->dt_maxsize <= PAGE_SIZE))
|
||||
if (dmat->dt_maxsize <= PAGE_SIZE &&
|
||||
dmat->dt_alignment < dmat->dt_maxsize)
|
||||
free(vaddr, M_DEVBUF);
|
||||
else {
|
||||
else
|
||||
contigfree(vaddr, dmat->dt_maxsize, M_DEVBUF);
|
||||
}
|
||||
}
|
||||
|
||||
struct bus_dma_methods nexus_dma_methods = {
|
||||
|
@ -181,11 +181,8 @@ busdma_lock_mutex(void *arg, bus_dma_lock_op_t op)
|
||||
static void
|
||||
dflt_lock(void *arg, bus_dma_lock_op_t op)
|
||||
{
|
||||
#ifdef INVARIANTS
|
||||
|
||||
panic("driver error: busdma dflt_lock called");
|
||||
#else
|
||||
printf("DRIVER_ERROR: busdma dflt_lock called\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -647,9 +644,18 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags,
|
||||
if (flags & BUS_DMA_ZERO)
|
||||
mflags |= M_ZERO;
|
||||
|
||||
if ((dmat->dt_maxsize <= PAGE_SIZE)) {
|
||||
/*
|
||||
* XXX:
|
||||
* (dmat->dt_alignment < dmat->dt_maxsize) is just a quick hack; the
|
||||
* exact alignment guarantees of malloc need to be nailed down, and
|
||||
* the code below should be rewritten to take that into account.
|
||||
*
|
||||
* In the meantime, we'll warn the user if malloc gets it wrong.
|
||||
*/
|
||||
if (dmat->dt_maxsize <= PAGE_SIZE &&
|
||||
dmat->dt_alignment < dmat->dt_maxsize)
|
||||
*vaddr = malloc(dmat->dt_maxsize, M_DEVBUF, mflags);
|
||||
} else {
|
||||
else {
|
||||
/*
|
||||
* XXX use contigmalloc until it is merged into this
|
||||
* facility and handles multi-seg allocations. Nobody
|
||||
@ -662,6 +668,8 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags,
|
||||
}
|
||||
if (*vaddr == NULL)
|
||||
return (ENOMEM);
|
||||
if ((uintptr_t)*vaddr % dmat->dt_alignment)
|
||||
printf("%s: failed to align memory properly.\n", __func__);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -673,11 +681,11 @@ static void
|
||||
nexus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
|
||||
{
|
||||
|
||||
if ((dmat->dt_maxsize <= PAGE_SIZE))
|
||||
if (dmat->dt_maxsize <= PAGE_SIZE &&
|
||||
dmat->dt_alignment < dmat->dt_maxsize)
|
||||
free(vaddr, M_DEVBUF);
|
||||
else {
|
||||
else
|
||||
contigfree(vaddr, dmat->dt_maxsize, M_DEVBUF);
|
||||
}
|
||||
}
|
||||
|
||||
struct bus_dma_methods nexus_dma_methods = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user