Author: wma
Date: Fri Jan 22 06:26:11 2016
New Revision: 294547
URL: https://svnweb.freebsd.org/changeset/base/294547

Log:
  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

Modified:
  head/sys/boot/kshim/bsd_kernel.c
  head/sys/boot/kshim/bsd_kernel.h

Modified: head/sys/boot/kshim/bsd_kernel.c
==============================================================================
--- head/sys/boot/kshim/bsd_kernel.c    Fri Jan 22 06:05:31 2016        
(r294546)
+++ head/sys/boot/kshim/bsd_kernel.c    Fri Jan 22 06:26:11 2016        
(r294547)
@@ -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)
 {

Modified: head/sys/boot/kshim/bsd_kernel.h
==============================================================================
--- head/sys/boot/kshim/bsd_kernel.h    Fri Jan 22 06:05:31 2016        
(r294546)
+++ head/sys/boot/kshim/bsd_kernel.h    Fri Jan 22 06:26:11 2016        
(r294547)
@@ -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)(d
 /* 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_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to