Hi Gustavo,
On Thu, Oct 20, 2016 at 12:50:04PM -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
Signed-off-by: Gustavo Padovan gustavo.padovan@collabora.co.uk
drivers/gpu/drm/drm_crtc.c | 31 +++++++++++++++++++++++++++++++ include/drm/drm_crtc.h | 19 +++++++++++++++++++ 2 files changed, 50 insertions(+)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index fcb6453..b99090f 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 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 fence *fence) +{
- struct drm_crtc *crtc = fence_to_crtc(fence);
- return crtc->timeline_name;
+}
+static bool drm_crtc_fence_enable_signaling(struct fence *fence) +{
- return true;
+}
+const struct 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 = 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 = fence_context_alloc(1);
- spin_lock_init(&crtc->fence_lock);
- snprintf(crtc->timeline_name, sizeof(crtc->timeline_name),
"drm_crtc-%d", crtc->base.id);
I wondered about "[CRTC:id:name]" to be consistent with the DRM debug prints.
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 279132e..657a33a 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/fence.h> #include <uapi/drm/drm_mode.h> #include <uapi/drm/drm_fourcc.h> #include <drm/drm_modeset_lock.h> @@ -618,6 +620,9 @@ struct drm_crtc_funcs {
- @gamma_store: gamma ramp values
- @helper_private: mid-layer private data
- @properties: property tracking for this CRTC
- @fence_context: context for fence signalling
- @fence_lock: fence lock for the fence context
- @fence_seqno: seqno variable to create fences
@timeline_name ?
Cheers, Brian
- Each CRTC may have one or more connectors associated with it. This structure
- allows the CRTC to be controlled.
@@ -726,8 +731,22 @@ struct drm_crtc { */ struct drm_crtc_crc crc; #endif
- /* fence timelines info for DRM out-fences */
- unsigned int fence_context;
- spinlock_t fence_lock;
- unsigned long fence_seqno;
- char timeline_name[32];
};
+extern const struct fence_ops drm_crtc_fence_ops;
+static inline struct drm_crtc *fence_to_crtc(struct 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
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel