drm/qxl: rework to new fence interface
[deliverable/linux.git] / drivers / gpu / drm / qxl / qxl_drv.h
index f6022b703645f1bcc081fa8eea50b18d652187b2..116eeae843b4d098aa0659ecaff8a77a7ca09b7e 100644 (file)
@@ -31,6 +31,7 @@
  * Definitions taken from spice-protocol, plus kernel driver specific bits.
  */
 
+#include <linux/fence.h>
 #include <linux/workqueue.h>
 #include <linux/firmware.h>
 #include <linux/platform_device.h>
@@ -95,13 +96,6 @@ enum {
        QXL_INTERRUPT_IO_CMD |\
        QXL_INTERRUPT_CLIENT_MONITORS_CONFIG)
 
-struct qxl_fence {
-       struct qxl_device *qdev;
-       uint32_t num_active_releases;
-       uint32_t *release_ids;
-       struct radix_tree_root tree;
-};
-
 struct qxl_bo {
        /* Protected by gem.mutex */
        struct list_head                list;
@@ -113,13 +107,13 @@ struct qxl_bo {
        unsigned                        pin_count;
        void                            *kptr;
        int                             type;
+
        /* Constant after initialization */
        struct drm_gem_object           gem_base;
        bool is_primary; /* is this now a primary surface */
        bool hw_surf_alloc;
        struct qxl_surface surf;
        uint32_t surface_id;
-       struct qxl_fence fence; /* per bo fence  - list of releases */
        struct qxl_release *surf_create;
 };
 #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, gem_base)
@@ -191,6 +185,8 @@ enum {
  * spice-protocol/qxl_dev.h */
 #define QXL_MAX_RES 96
 struct qxl_release {
+       struct fence base;
+
        int id;
        int type;
        uint32_t release_offset;
@@ -284,7 +280,11 @@ struct qxl_device {
        uint8_t         slot_gen_bits;
        uint64_t        va_slot_mask;
 
+       /* XXX: when rcu becomes available, release_lock can be killed */
+       spinlock_t      release_lock;
+       spinlock_t      fence_lock;
        struct idr      release_idr;
+       uint32_t        release_seqno;
        spinlock_t release_idr_lock;
        struct mutex    async_io_mutex;
        unsigned int last_sent_io_cmd;
@@ -561,10 +561,4 @@ qxl_surface_lookup(struct drm_device *dev, int surface_id);
 void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing);
 int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf);
 
-/* qxl_fence.c */
-void qxl_fence_add_release_locked(struct qxl_fence *qfence, uint32_t rel_id);
-int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id);
-int qxl_fence_init(struct qxl_device *qdev, struct qxl_fence *qfence);
-void qxl_fence_fini(struct qxl_fence *qfence);
-
 #endif
This page took 0.040373 seconds and 5 git commands to generate.