Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1504956 > unrolled thread
| Started by | Gustavo Padovan <gustavo@padovan.org> |
|---|---|
| First post | 2016-10-20 17:00 +0200 |
| Last post | 2016-10-21 15:00 +0200 |
| Articles | 4 — 3 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH v5 3/4] drm/fence: add fence timeline to drm_crtc Gustavo Padovan <gustavo@padovan.org> - 2016-10-20 17:00 +0200
Re: [PATCH v5 3/4] drm/fence: add fence timeline to drm_crtc Brian Starkey <brian.starkey@arm.com> - 2016-10-20 19:30 +0200
Re: [PATCH v5 3/4] drm/fence: add fence timeline to drm_crtc Gustavo Padovan <gustavo@padovan.org> - 2016-10-20 22:20 +0200
Re: [PATCH v5 3/4] drm/fence: add fence timeline to drm_crtc Daniel Vetter <daniel@ffwll.ch> - 2016-10-21 15:00 +0200
| From | Gustavo Padovan <gustavo@padovan.org> |
|---|---|
| Date | 2016-10-20 17:00 +0200 |
| Subject | [PATCH v5 3/4] drm/fence: add fence timeline to drm_crtc |
| Message-ID | <sumZ3-wo-13@gated-at.bofh.it> |
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);
+
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
*
* 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
[toc] | [next] | [standalone]
| From | Brian Starkey <brian.starkey@arm.com> |
|---|---|
| Date | 2016-10-20 19:30 +0200 |
| Message-ID | <supkd-28v-17@gated-at.bofh.it> |
| In reply to | #1504956 |
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
[toc] | [prev] | [next] | [standalone]
| From | Gustavo Padovan <gustavo@padovan.org> |
|---|---|
| Date | 2016-10-20 22:20 +0200 |
| Message-ID | <surYJ-3VP-15@gated-at.bofh.it> |
| In reply to | #1505116 |
2016-10-20 Brian Starkey <brian.starkey@arm.com>:
> 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.
Yeah, sounds good to me.
>
> > +
> > 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 ?
Sure.
Gustavo
[toc] | [prev] | [next] | [standalone]
| From | Daniel Vetter <daniel@ffwll.ch> |
|---|---|
| Date | 2016-10-21 15:00 +0200 |
| Message-ID | <suHAv-5DG-57@gated-at.bofh.it> |
| In reply to | #1504956 |
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);
> +
> 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
For new stuff I much prefer in-line kerneldoc with structures, keeps the
comments much closer to the code ...
> *
> * 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 */
... and avoids duplicated comments like this one here.
Otherwise lgtm.
-Daniel
> + 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
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web