Provide busdma stubs for loader/kshim
Simple bus space stubs require the VA-PA mapping to be identical. Approved by: hselasky, cognet (mentor) Differential revision: https://reviews.freebsd.org/D4314
This commit is contained in:
parent
9526c20a50
commit
a8d8da1b1f
@ -47,6 +47,74 @@ mtx_system_init(void *arg)
|
||||
}
|
||||
SYSINIT(mtx_system_init, SI_SUB_LOCK, SI_ORDER_MIDDLE, mtx_system_init, NULL);
|
||||
|
||||
int
|
||||
bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment,
|
||||
bus_size_t boundary, bus_addr_t lowaddr,
|
||||
bus_addr_t highaddr, bus_dma_filter_t *filter,
|
||||
void *filterarg, bus_size_t maxsize, int nsegments,
|
||||
bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
|
||||
void *lockfuncarg, bus_dma_tag_t *dmat)
|
||||
{
|
||||
struct bus_dma_tag *ret;
|
||||
|
||||
ret = malloc(sizeof(struct bus_dma_tag), XXX, XXX);
|
||||
if (*dmat == NULL)
|
||||
return (ENOMEM);
|
||||
ret->alignment = alignment;
|
||||
ret->maxsize = maxsize;
|
||||
|
||||
*dmat = ret;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
|
||||
bus_dmamap_t *mapp)
|
||||
{
|
||||
void *addr;
|
||||
|
||||
addr = malloc(dmat->maxsize + dmat->alignment, XXX, XXX);
|
||||
if (addr == 0)
|
||||
return (ENOMEM);
|
||||
|
||||
*mapp = addr;
|
||||
addr = (void*)(((uintptr_t)addr + dmat->alignment - 1) & ~(dmat->alignment - 1));
|
||||
|
||||
*vaddr = addr;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
|
||||
bus_size_t buflen, bus_dmamap_callback_t *callback,
|
||||
void *callback_arg, int flags)
|
||||
{
|
||||
bus_dma_segment_t segs[1];
|
||||
|
||||
segs[0].ds_addr = (uintptr_t)buf;
|
||||
segs[0].ds_len = buflen;
|
||||
|
||||
(*callback)(callback_arg, segs, 1, 0);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
|
||||
{
|
||||
|
||||
free(map, XXX);
|
||||
}
|
||||
|
||||
int
|
||||
bus_dma_tag_destroy(bus_dma_tag_t dmat)
|
||||
{
|
||||
|
||||
free(dmat, XXX);
|
||||
return (0);
|
||||
}
|
||||
|
||||
struct resource *
|
||||
bus_alloc_resource_any(device_t dev, int type, int *rid, unsigned int flags)
|
||||
{
|
||||
|
@ -48,8 +48,15 @@
|
||||
#define USB_BUS_EXPLORE_PROC(bus) (usb_process + 0)
|
||||
#define USB_BUS_CONTROL_XFER_PROC(bus) (usb_process + 1)
|
||||
#define SYSCTL_DECL(...)
|
||||
struct sysctl_req {
|
||||
void *newptr;
|
||||
};
|
||||
#define SYSCTL_HANDLER_ARGS void *oidp, void *arg1, \
|
||||
uint32_t arg2, struct sysctl_req *req
|
||||
#define SYSCTL_NODE(name,...) struct { } name __used
|
||||
#define SYSCTL_INT(...)
|
||||
#define SYSCTL_UINT(...)
|
||||
#define SYSCTL_PROC(...)
|
||||
#define TUNABLE_INT(...)
|
||||
#define MALLOC_DECLARE(...)
|
||||
#define MALLOC_DEFINE(...)
|
||||
@ -65,6 +72,7 @@
|
||||
#define MOD_UNLOAD 2
|
||||
#define DEVMETHOD(what,func) { #what, (void *)&func }
|
||||
#define DEVMETHOD_END {0,0}
|
||||
#define EARLY_DRIVER_MODULE(a, b, c, d, e, f, g) DRIVER_MODULE(a, b, c, d, e, f)
|
||||
#define DRIVER_MODULE(name, busname, driver, devclass, evh, arg) \
|
||||
static struct module_data bsd_##name##_##busname##_driver_mod = { \
|
||||
evh, arg, #busname, #name, #busname "/" #name, \
|
||||
@ -202,11 +210,30 @@ typedef unsigned long u_long;
|
||||
typedef unsigned long bus_addr_t;
|
||||
typedef unsigned long bus_size_t;
|
||||
|
||||
typedef struct bus_dma_segment {
|
||||
bus_addr_t ds_addr; /* DMA address */
|
||||
bus_size_t ds_len; /* length of transfer */
|
||||
} bus_dma_segment_t;
|
||||
|
||||
struct bus_dma_tag {
|
||||
uint32_t alignment;
|
||||
uint32_t maxsize;
|
||||
};
|
||||
|
||||
typedef void *bus_dmamap_t;
|
||||
typedef void *bus_dma_tag_t;
|
||||
typedef struct bus_dma_tag *bus_dma_tag_t;
|
||||
|
||||
typedef enum {
|
||||
BUS_DMA_LOCK = 0x01,
|
||||
BUS_DMA_UNLOCK = 0x02,
|
||||
} bus_dma_lock_op_t;
|
||||
|
||||
typedef void *bus_space_tag_t;
|
||||
typedef uint8_t *bus_space_handle_t;
|
||||
typedef int bus_dma_filter_t(void *, bus_addr_t);
|
||||
typedef void bus_dma_lock_t(void *, bus_dma_lock_op_t);
|
||||
|
||||
typedef uint32_t bool;
|
||||
|
||||
/* SYSINIT API */
|
||||
|
||||
@ -582,4 +609,37 @@ extern int (*ofw_bus_is_compatible_cb)(device_t dev, char *name);
|
||||
/* Should be defined in user application since it is machine-dependent */
|
||||
extern int delay(unsigned int);
|
||||
|
||||
/* BUS dma */
|
||||
#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF
|
||||
#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
|
||||
#define BUS_SPACE_MAXADDR 0xFFFFFFFF
|
||||
#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF
|
||||
#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
|
||||
#define BUS_SPACE_MAXSIZE 0xFFFFFFFF
|
||||
|
||||
#define BUS_DMA_WAITOK 0x00 /* safe to sleep (pseudo-flag) */
|
||||
#define BUS_DMA_NOWAIT 0x01 /* not safe to sleep */
|
||||
#define BUS_DMA_ALLOCNOW 0x02 /* perform resource allocation now */
|
||||
#define BUS_DMA_COHERENT 0x04 /* hint: map memory in a coherent way */
|
||||
#define BUS_DMA_ZERO 0x08 /* allocate zero'ed memory */
|
||||
#define BUS_DMA_BUS1 0x10 /* placeholders for bus functions... */
|
||||
#define BUS_DMA_BUS2 0x20
|
||||
#define BUS_DMA_BUS3 0x40
|
||||
#define BUS_DMA_BUS4 0x80
|
||||
|
||||
typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
|
||||
|
||||
int
|
||||
bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment,
|
||||
bus_size_t boundary, bus_addr_t lowaddr,
|
||||
bus_addr_t highaddr, bus_dma_filter_t *filter,
|
||||
void *filterarg, bus_size_t maxsize, int nsegments,
|
||||
bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
|
||||
void *lockfuncarg, bus_dma_tag_t *dmat);
|
||||
|
||||
int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
|
||||
bus_dmamap_t *mapp);
|
||||
void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map);
|
||||
int bus_dma_tag_destroy(bus_dma_tag_t dmat);
|
||||
|
||||
#endif /* _BSD_KERNEL_H_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user