On Fri, Oct 28, 2016 at 09:42:12AM +0200, Daniel Vetter wrote:
On Thu, Oct 27, 2016 at 05:37:10PM -0200, Gustavo Padovan wrote:
From: Gustavo Padovan gustavo.padovan@collabora.co.uk
Create one timeline context for each CRTC to be able to handle out-fences and signal them. It adds a few members to struct drm_crtc: fence_context, where we store the context we get from fence_context_alloc(), the fence seqno and the fence lock, that we pass in fence_init() to be used by the fence.
v2: Comment by Daniel Stone:
- add BUG_ON() to fence_to_crtc() macro
v3: Comment by Ville Syrjälä
- Use more meaningful name as crtc timeline name
v4: Comments by Brian Starkey
- Use even more meaninful name for the crtc timeline
- add doc for timeline_name
Comment by Daniel Vetter
use in-line style for comments
rebase after fence -> dma_fence rename
Signed-off-by: Gustavo Padovan gustavo.padovan@collabora.co.uk
drivers/gpu/drm/drm_crtc.c | 31 +++++++++++++++++++++++++++++++ include/drm/drm_crtc.h | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 7878bfd..e2a06c8 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -165,6 +165,32 @@ static void drm_crtc_crc_fini(struct drm_crtc *crtc) #endif }
+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.
@@ -222,6 +248,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);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 719b6a8..278dbdd 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -32,6 +32,8 @@ #include <linux/fb.h> #include <linux/hdmi.h> #include <linux/media-bus-format.h> +#include <linux/srcu.h> +#include <linux/dma-fence.h> #include <uapi/drm/drm_mode.h> #include <uapi/drm/drm_fourcc.h> #include <drm/drm_modeset_lock.h> @@ -726,8 +728,45 @@ struct drm_crtc { */ struct drm_crtc_crc crc; #endif
- /**
* @fence_context:
*
* timeline context used for fence operations.
*/
- unsigned int fence_context;
- /**
* @fence_lock:
*
* spinlock to protect the fences in the fence_context.
*/
- spinlock_t fence_lock;
- /**
* @fence_seqno:
*
* Seqno variable used as monotonic counter for the fences
* created on the CRTC's timeline.
*/
- unsigned long fence_seqno;
- /**
* @timeline_name:
*
* The name of the CRTC's fence timeline.
*/
- char timeline_name[32];
};
+extern const struct dma_fence_ops drm_crtc_fence_ops;
Kerneldoc please. With that addressed:
Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch
For my connector fences I exported a function to get the fence, then you can keep the ops and fence_to_crtc private to drm_crtc.c. In that case I think you can drop the BUG_ON.
Either way, lgtm.
Reviewed-by: Brian Starkey brian.starkey@arm.com
+static inline 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);
+}
/**
- struct drm_mode_set - new values for a CRTC config change
- @fb: framebuffer to use for new config
-- 2.5.5
-- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch