|
@@ -33,6 +33,7 @@
|
|
|
#include <linux/list.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/export.h>
|
|
|
+#include <linux/dma-fence.h>
|
|
|
#include <drm/drmP.h>
|
|
|
#include <drm/drm_crtc.h>
|
|
|
#include <drm/drm_edid.h>
|
|
@@ -151,6 +152,38 @@ static void drm_crtc_crc_fini(struct drm_crtc *crtc)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+static struct drm_crtc *fence_to_crtc(struct dma_fence *fence)
|
|
|
+{
|
|
|
+ BUG_ON(fence->ops != &drm_crtc_fence_ops);
|
|
|
+ return container_of(fence->lock, struct drm_crtc, fence_lock);
|
|
|
+}
|
|
|
+
|
|
|
+static const char *drm_crtc_fence_get_driver_name(struct dma_fence *fence)
|
|
|
+{
|
|
|
+ struct drm_crtc *crtc = fence_to_crtc(fence);
|
|
|
+
|
|
|
+ return crtc->dev->driver->name;
|
|
|
+}
|
|
|
+
|
|
|
+static const char *drm_crtc_fence_get_timeline_name(struct dma_fence *fence)
|
|
|
+{
|
|
|
+ struct drm_crtc *crtc = fence_to_crtc(fence);
|
|
|
+
|
|
|
+ return crtc->timeline_name;
|
|
|
+}
|
|
|
+
|
|
|
+static bool drm_crtc_fence_enable_signaling(struct dma_fence *fence)
|
|
|
+{
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+const struct dma_fence_ops drm_crtc_fence_ops = {
|
|
|
+ .get_driver_name = drm_crtc_fence_get_driver_name,
|
|
|
+ .get_timeline_name = drm_crtc_fence_get_timeline_name,
|
|
|
+ .enable_signaling = drm_crtc_fence_enable_signaling,
|
|
|
+ .wait = dma_fence_default_wait,
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* drm_crtc_init_with_planes - Initialise a new CRTC object with
|
|
|
* specified primary and cursor planes.
|
|
@@ -208,6 +241,11 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
+ crtc->fence_context = dma_fence_context_alloc(1);
|
|
|
+ spin_lock_init(&crtc->fence_lock);
|
|
|
+ snprintf(crtc->timeline_name, sizeof(crtc->timeline_name),
|
|
|
+ "CRTC:%d-%s", crtc->base.id, crtc->name);
|
|
|
+
|
|
|
crtc->base.properties = &crtc->properties;
|
|
|
|
|
|
list_add_tail(&crtc->head, &config->crtc_list);
|