libkms: move sources lists to makefile.sources
[platform/upstream/libdrm.git] / freedreno / freedreno_priv.h
index 433bd30..b204e53 100644 (file)
 #ifndef FREEDRENO_PRIV_H_
 #define FREEDRENO_PRIV_H_
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <pthread.h>
+#include <stdio.h>
+#include <assert.h>
 
+#include "libdrm.h"
 #include "xf86drm.h"
 #include "xf86atomic.h"
 
 #include "list.h"
 
 #include "freedreno_drmif.h"
-#include "msm_kgsl.h"
-#include "kgsl_drm.h"
+#include "freedreno_ringbuffer.h"
+#include "drm.h"
+
+struct fd_device_funcs {
+       int (*bo_new_handle)(struct fd_device *dev, uint32_t size,
+                       uint32_t flags, uint32_t *handle);
+       struct fd_bo * (*bo_from_handle)(struct fd_device *dev,
+                       uint32_t size, uint32_t handle);
+       struct fd_pipe * (*pipe_new)(struct fd_device *dev, enum fd_pipe_id id);
+       void (*destroy)(struct fd_device *dev);
+};
+
+struct fd_bo_bucket {
+       uint32_t size;
+       struct list_head list;
+};
 
 struct fd_device {
        int fd;
@@ -62,65 +83,76 @@ struct fd_device {
         * open in the process first, before calling gem-open.
         */
        void *handle_table, *name_table;
+
+       struct fd_device_funcs *funcs;
+
+       struct fd_bo_bucket cache_bucket[14 * 4];
+       int num_buckets;
+       time_t time;
+
+       int closefd;        /* call close(fd) upon destruction */
+};
+
+void fd_cleanup_bo_cache(struct fd_device *dev, time_t time);
+
+/* for where @table_lock is already held: */
+void fd_device_del_locked(struct fd_device *dev);
+
+struct fd_pipe_funcs {
+       struct fd_ringbuffer * (*ringbuffer_new)(struct fd_pipe *pipe, uint32_t size);
+       int (*get_param)(struct fd_pipe *pipe, enum fd_param_id param, uint64_t *value);
+       int (*wait)(struct fd_pipe *pipe, uint32_t timestamp);
+       void (*destroy)(struct fd_pipe *pipe);
 };
 
 struct fd_pipe {
        struct fd_device *dev;
        enum fd_pipe_id id;
-       int fd;
-       uint32_t drawctxt_id;
-
-       /* device properties: */
-       struct kgsl_version version;
-       struct kgsl_devinfo devinfo;
-
-       /* list of bo's that are referenced in ringbuffer but not
-        * submitted yet:
-        */
-       struct list_head submit_list;
+       struct fd_pipe_funcs *funcs;
+};
 
-       /* list of bo's that have been submitted but timestamp has
-        * not passed yet (so still ref'd in active cmdstream)
-        */
-       struct list_head pending_list;
+struct fd_ringmarker {
+       struct fd_ringbuffer *ring;
+       uint32_t *cur;
+};
 
-       /* if we are the 2d pipe, and want to wait on a timestamp
-        * from 3d, we need to also internally open the 3d pipe:
-        */
-       struct fd_pipe *p3d;
+struct fd_ringbuffer_funcs {
+       void * (*hostptr)(struct fd_ringbuffer *ring);
+       int (*flush)(struct fd_ringbuffer *ring, uint32_t *last_start);
+       void (*reset)(struct fd_ringbuffer *ring);
+       void (*emit_reloc)(struct fd_ringbuffer *ring,
+                       const struct fd_reloc *reloc);
+       void (*emit_reloc_ring)(struct fd_ringbuffer *ring,
+                       struct fd_ringmarker *target, struct fd_ringmarker *end);
+       void (*destroy)(struct fd_ringbuffer *ring);
 };
 
-void fd_pipe_add_submit(struct fd_pipe *pipe, struct fd_bo *bo);
-void fd_pipe_pre_submit(struct fd_pipe *pipe);
-void fd_pipe_post_submit(struct fd_pipe *pipe, uint32_t timestamp);
-void fd_pipe_process_pending(struct fd_pipe *pipe, uint32_t timestamp);
+struct fd_bo_funcs {
+       int (*offset)(struct fd_bo *bo, uint64_t *offset);
+       int (*cpu_prep)(struct fd_bo *bo, struct fd_pipe *pipe, uint32_t op);
+       void (*cpu_fini)(struct fd_bo *bo);
+       void (*destroy)(struct fd_bo *bo);
+};
 
 struct fd_bo {
        struct fd_device *dev;
        uint32_t size;
        uint32_t handle;
        uint32_t name;
-       uint32_t gpuaddr;
+       int fd;          /* dmabuf handle */
        void *map;
-       uint64_t offset;
-       /* timestamp (per pipe) for bo's in a pipe's pending_list: */
-       uint32_t timestamp[FD_PIPE_MAX];
-       /* list-node for pipe's submit_list or pending_list */
-       struct list_head list[FD_PIPE_MAX];
        atomic_t refcnt;
-};
+       struct fd_bo_funcs *funcs;
 
-/* not exposed publicly, because won't be needed when we have
- * a proper kernel driver
- */
-uint32_t fd_bo_gpuaddr(struct fd_bo *bo, uint32_t offset);
-void fb_bo_set_timestamp(struct fd_bo *bo, uint32_t timestamp);
-uint32_t fd_bo_get_timestamp(struct fd_bo *bo);
+       int bo_reuse;
+       struct list_head list;   /* bucket-list entry */
+       time_t free_time;        /* time when added to bucket-list */
+};
 
 #define ALIGN(v,a) (((v) + (a) - 1) & ~((a) - 1))
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
-#define enable_debug 1  /* TODO make dynamic */
+#define enable_debug 0  /* TODO make dynamic */
 
 #define INFO_MSG(fmt, ...) \
                do { drmMsg("[I] "fmt " (%s:%d)\n", \
@@ -135,4 +167,7 @@ uint32_t fd_bo_get_timestamp(struct fd_bo *bo);
                do { drmMsg("[E] " fmt " (%s:%d)\n", \
                                ##__VA_ARGS__, __FUNCTION__, __LINE__); } while (0)
 
+#define U642VOID(x) ((void *)(unsigned long)(x))
+#define VOID2U64(x) ((uint64_t)(unsigned long)(x))
+
 #endif /* FREEDRENO_PRIV_H_ */