Changeset View
Standalone View
sys/arm64/include/bus_dma.h
/* $FreeBSD$ */ | /* $FreeBSD$ */ | ||||
#ifndef _MACHINE_BUS_DMA_H_ | #ifndef _MACHINE_BUS_DMA_H_ | ||||
#define _MACHINE_BUS_DMA_H_ | #define _MACHINE_BUS_DMA_H_ | ||||
#define WANT_INLINE_DMAMAP | |||||
#include <sys/bus_dma.h> | #include <sys/bus_dma.h> | ||||
#include <machine/bus_dma_impl.h> | |||||
andrew: This should be `machine/bus_dma_impl.h` | |||||
Not Done Inline ActionsGood catch, fixed. jah: Good catch, fixed. | |||||
/* | |||||
Not Done Inline ActionsShould this file be hidden behind _KERNEL? andrew: Should this file be hidden behind `_KERNEL`? | |||||
Not Done Inline ActionsGood question. We don't seem to have any history of doing that for busdma headers, which before this change still had bits and pieces of inlined/macro-ized functionality. What's the recommendation for keeping stuff away from userspace these days? jah: Good question. We don't seem to have any history of doing that for busdma headers, which… | |||||
Not Done Inline Actionsbusdma is clearly kernel-only stuff, it has no value for the userspace. If busdma headers ever included in the user mode compilation environment, then this is clearly a leak. Do you get any failures with the new headers and buildworld ? If not, I do not see a need in any protection applied to the inlined stuff. And yes, #ifdef _KERNEL is the semi-official way to avoid user env namespace pollution. kib: busdma is clearly kernel-only stuff, it has no value for the userspace. If busdma headers ever… | |||||
Not Done Inline Actionsbuildworld is fine on amd64/i386/sparc64, and arm64 after fixing the include path mistake Andrew caught. But at least camdd consumes these headers in userspace, although it looks like it may only do so to use bus_dma_segment_t. jah: buildworld is fine on amd64/i386/sparc64, and arm64 after fixing the include path mistake… | |||||
* Allocate a handle for mapping from kva/uva/physical | |||||
* address space into bus device space. | |||||
*/ | |||||
static inline int | |||||
bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->map_create(dmat, flags, mapp)); | |||||
} | |||||
/* | |||||
* Destroy a handle for mapping from kva/uva/physical | |||||
* address space into bus device space. | |||||
*/ | |||||
static inline int | |||||
bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->map_destroy(dmat, map)); | |||||
} | |||||
/* | |||||
* Allocate a piece of memory that can be efficiently mapped into | |||||
* bus device space based on the constraints listed in the dma tag. | |||||
* A dmamap to for use with dmamap_load is also allocated. | |||||
*/ | |||||
static inline int | |||||
bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, | |||||
bus_dmamap_t *mapp) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->mem_alloc(dmat, vaddr, flags, mapp)); | |||||
} | |||||
/* | |||||
* Free a piece of memory and it's allociated dmamap, that was allocated | |||||
* via bus_dmamem_alloc. Make the same choice for free/contigfree. | |||||
*/ | |||||
static inline void | |||||
bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
tc->impl->mem_free(dmat, vaddr, map); | |||||
} | |||||
/* | |||||
* Release the mapping held by map. | |||||
*/ | |||||
static inline void | |||||
bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
tc->impl->map_unload(dmat, map); | |||||
} | |||||
static inline void | |||||
bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
tc->impl->map_sync(dmat, map, op); | |||||
} | |||||
static inline int | |||||
_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, | |||||
bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->load_phys(dmat, map, buf, buflen, flags, segs, | |||||
segp)); | |||||
} | |||||
static inline int | |||||
_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma, | |||||
bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs, | |||||
int *segp) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->load_ma(dmat, map, ma, tlen, ma_offs, flags, | |||||
segs, segp)); | |||||
} | |||||
static inline int | |||||
_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, | |||||
bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs, | |||||
int *segp) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->load_buffer(dmat, map, buf, buflen, pmap, flags, segs, | |||||
segp)); | |||||
} | |||||
static inline void | |||||
_bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map, | |||||
struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
tc->impl->map_waitok(dmat, map, mem, callback, callback_arg); | |||||
} | |||||
static inline bus_dma_segment_t * | |||||
_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map, | |||||
bus_dma_segment_t *segs, int nsegs, int error) | |||||
{ | |||||
struct bus_dma_tag_common *tc; | |||||
tc = (struct bus_dma_tag_common *)dmat; | |||||
return (tc->impl->map_complete(dmat, map, segs, nsegs, error)); | |||||
} | |||||
#endif /* !_MACHINE_BUS_DMA_H_ */ | #endif /* !_MACHINE_BUS_DMA_H_ */ |
This should be machine/bus_dma_impl.h