Index: sys/boot/kshim/bsd_kernel.h =================================================================== --- sys/boot/kshim/bsd_kernel.h +++ sys/boot/kshim/bsd_kernel.h @@ -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 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 */ @@ -579,4 +606,37 @@ #define strlcpy(d,s,n) snprintf((d),(n),"%s",(s)) #endif +/* 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_ */ Index: sys/boot/kshim/bsd_kernel.c =================================================================== --- sys/boot/kshim/bsd_kernel.c +++ sys/boot/kshim/bsd_kernel.c @@ -47,6 +47,74 @@ } 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) {