diff mbox series

[3/3] drm/crtc-helper: Add a drm_crtc_helper_atomic_check() helper

Message ID 20221010170203.274949-4-javierm@redhat.com (mailing list archive)
State Superseded
Headers show
Series Add a drm_crtc_helper_atomic_check() helper | expand

Commit Message

Javier Martinez Canillas Oct. 10, 2022, 5:02 p.m. UTC
Provides a default CRTC state check handler for CRTCs that only have one
primary plane attached.

There are some drivers that duplicate this logic in their helpers, such as
simpledrm and ssd130x. Factor out this common code into a CRTC helper and
make drivers use it.

Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
---

 drivers/gpu/drm/drm_crtc_helper.c | 24 ++++++++++++++++++++++++
 drivers/gpu/drm/solomon/ssd130x.c | 14 ++------------
 drivers/gpu/drm/tiny/simpledrm.c  | 14 ++------------
 include/drm/drm_crtc_helper.h     |  2 ++
 4 files changed, 30 insertions(+), 24 deletions(-)

Comments

Thomas Zimmermann Oct. 11, 2022, 1:21 p.m. UTC | #1
Hi

Am 10.10.22 um 19:02 schrieb Javier Martinez Canillas:
> Provides a default CRTC state check handler for CRTCs that only have one
> primary plane attached.
> 
> There are some drivers that duplicate this logic in their helpers, such as
> simpledrm and ssd130x. Factor out this common code into a CRTC helper and
> make drivers use it.
> 
> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>

Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>

There really isn't much here for now. I suspect that there are more 
drivers that could use this helper. If you merge this before ofdrm, I'll 
rebase ofdrm on top.

Please also see my comment below.


> ---
> 
>   drivers/gpu/drm/drm_crtc_helper.c | 24 ++++++++++++++++++++++++
>   drivers/gpu/drm/solomon/ssd130x.c | 14 ++------------
>   drivers/gpu/drm/tiny/simpledrm.c  | 14 ++------------
>   include/drm/drm_crtc_helper.h     |  2 ++
>   4 files changed, 30 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
> index 457448cc60f7..4ad3abaa98f4 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> @@ -421,6 +421,30 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
>   }
>   EXPORT_SYMBOL(drm_crtc_helper_set_mode);
>   
> +/**
> + * drm_crtc_helper_atomic_check() - Helper to check CRTC atomic-state
> + * @crtc: CRTC to check
> + * @state: atomic state object
> + *
> + * Provides a default CRTC-state check handler for CRTCs that only have
> + * one primary plane attached to it.
> + *
> + * This is often the case for the CRTC of simple framebuffers.

I'd add a reference to drm_plane_helper_atomic_check() to this 
paragraph. Like

   See drm_plane_helper_atomic_check() for the respective plane helpers.

And also reference back from the plane-check helper to the CRTC-check 
helper.

Best regards
Thomas

> + *
> + * RETURNS:
> + * Zero on success, or an errno code otherwise.
> + */
> +int drm_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *state)
> +{
> +	struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
> +
> +	if (!new_crtc_state->enable)
> +		return 0;
> +
> +	return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
> +}
> +EXPORT_SYMBOL(drm_crtc_helper_atomic_check);
> +
>   static void
>   drm_crtc_helper_disable(struct drm_crtc *crtc)
>   {
> diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c
> index 0d4ab65233db..f2795f90ea69 100644
> --- a/drivers/gpu/drm/solomon/ssd130x.c
> +++ b/drivers/gpu/drm/solomon/ssd130x.c
> @@ -20,6 +20,7 @@
>   
>   #include <drm/drm_atomic.h>
>   #include <drm/drm_atomic_helper.h>
> +#include <drm/drm_crtc_helper.h>
>   #include <drm/drm_damage_helper.h>
>   #include <drm/drm_edid.h>
>   #include <drm/drm_fb_helper.h>
> @@ -645,17 +646,6 @@ static enum drm_mode_status ssd130x_crtc_helper_mode_valid(struct drm_crtc *crtc
>   	return MODE_OK;
>   }
>   
> -static int ssd130x_crtc_helper_atomic_check(struct drm_crtc *crtc,
> -					    struct drm_atomic_state *new_state)
> -{
> -	struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc);
> -
> -	if (!new_crtc_state->enable)
> -		return 0;
> -
> -	return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
> -}
> -
>   /*
>    * The CRTC is always enabled. Screen updates are performed by
>    * the primary plane's atomic_update function. Disabling clears
> @@ -663,7 +653,7 @@ static int ssd130x_crtc_helper_atomic_check(struct drm_crtc *crtc,
>    */
>   static const struct drm_crtc_helper_funcs ssd130x_crtc_helper_funcs = {
>   	.mode_valid = ssd130x_crtc_helper_mode_valid,
> -	.atomic_check = ssd130x_crtc_helper_atomic_check,
> +	.atomic_check = drm_crtc_helper_atomic_check,
>   };
>   
>   static void ssd130x_crtc_reset(struct drm_crtc *crtc)
> diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
> index f03f17f62a56..cbb100753154 100644
> --- a/drivers/gpu/drm/tiny/simpledrm.c
> +++ b/drivers/gpu/drm/tiny/simpledrm.c
> @@ -11,6 +11,7 @@
>   #include <drm/drm_atomic.h>
>   #include <drm/drm_atomic_state_helper.h>
>   #include <drm/drm_connector.h>
> +#include <drm/drm_crtc_helper.h>
>   #include <drm/drm_damage_helper.h>
>   #include <drm/drm_device.h>
>   #include <drm/drm_drv.h>
> @@ -545,17 +546,6 @@ static enum drm_mode_status simpledrm_crtc_helper_mode_valid(struct drm_crtc *cr
>   	return drm_crtc_helper_mode_valid_fixed(crtc, mode, &sdev->mode);
>   }
>   
> -static int simpledrm_crtc_helper_atomic_check(struct drm_crtc *crtc,
> -					      struct drm_atomic_state *new_state)
> -{
> -	struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc);
> -
> -	if (!new_crtc_state->enable)
> -		return 0;
> -
> -	return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
> -}
> -
>   /*
>    * The CRTC is always enabled. Screen updates are performed by
>    * the primary plane's atomic_update function. Disabling clears
> @@ -563,7 +553,7 @@ static int simpledrm_crtc_helper_atomic_check(struct drm_crtc *crtc,
>    */
>   static const struct drm_crtc_helper_funcs simpledrm_crtc_helper_funcs = {
>   	.mode_valid = simpledrm_crtc_helper_mode_valid,
> -	.atomic_check = simpledrm_crtc_helper_atomic_check,
> +	.atomic_check = drm_crtc_helper_atomic_check,
>   };
>   
>   static const struct drm_crtc_funcs simpledrm_crtc_funcs = {
> diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
> index a6d520d5b6ca..1840db247f69 100644
> --- a/include/drm/drm_crtc_helper.h
> +++ b/include/drm/drm_crtc_helper.h
> @@ -50,6 +50,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
>   			      struct drm_display_mode *mode,
>   			      int x, int y,
>   			      struct drm_framebuffer *old_fb);
> +int drm_crtc_helper_atomic_check(struct drm_crtc *crtc,
> +				 struct drm_atomic_state *state);
>   bool drm_helper_crtc_in_use(struct drm_crtc *crtc);
>   bool drm_helper_encoder_in_use(struct drm_encoder *encoder);
>
Javier Martinez Canillas Oct. 11, 2022, 1:26 p.m. UTC | #2
On 10/11/22 15:21, Thomas Zimmermann wrote:
> Hi
> 
> Am 10.10.22 um 19:02 schrieb Javier Martinez Canillas:
>> Provides a default CRTC state check handler for CRTCs that only have one
>> primary plane attached.
>>
>> There are some drivers that duplicate this logic in their helpers, such as
>> simpledrm and ssd130x. Factor out this common code into a CRTC helper and
>> make drivers use it.
>>
>> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
> 
> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
> 
> There really isn't much here for now. I suspect that there are more 
> drivers that could use this helper. If you merge this before ofdrm, I'll 
> rebase ofdrm on top.
>

Sure. I probably won't post a v2 until tomorrow and I believe ofdrm is
ready to be merged, so I'll just rebase this series on top of that once
just push it.

> Please also see my comment below.
> 
> 

[...]

>> +/**
>> + * drm_crtc_helper_atomic_check() - Helper to check CRTC atomic-state
>> + * @crtc: CRTC to check
>> + * @state: atomic state object
>> + *
>> + * Provides a default CRTC-state check handler for CRTCs that only have
>> + * one primary plane attached to it.
>> + *
>> + * This is often the case for the CRTC of simple framebuffers.
> 
> I'd add a reference to drm_plane_helper_atomic_check() to this 
> paragraph. Like
> 
>    See drm_plane_helper_atomic_check() for the respective plane helpers.
> 
> And also reference back from the plane-check helper to the CRTC-check 
> helper.
>

Good idea, I'll do that. Thanks for your review.
 
> Best regards
> Thomas
>
Thomas Zimmermann Oct. 11, 2022, 3:01 p.m. UTC | #3
Hi

Am 11.10.22 um 15:26 schrieb Javier Martinez Canillas:
> On 10/11/22 15:21, Thomas Zimmermann wrote:
>> Hi
>>
>> Am 10.10.22 um 19:02 schrieb Javier Martinez Canillas:
>>> Provides a default CRTC state check handler for CRTCs that only have one
>>> primary plane attached.
>>>
>>> There are some drivers that duplicate this logic in their helpers, such as
>>> simpledrm and ssd130x. Factor out this common code into a CRTC helper and
>>> make drivers use it.
>>>
>>> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
>>
>> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
>>
>> There really isn't much here for now. I suspect that there are more
>> drivers that could use this helper. If you merge this before ofdrm, I'll
>> rebase ofdrm on top.
>>
> 
> Sure. I probably won't post a v2 until tomorrow and I believe ofdrm is
> ready to be merged, so I'll just rebase this series on top of that once
> just push it.

I just realized that this function in ofdrm has additional code for 
color management. There won't be anything to convert.

Best regards
Thomas

> 
>> Please also see my comment below.
>>
>>
> 
> [...]
> 
>>> +/**
>>> + * drm_crtc_helper_atomic_check() - Helper to check CRTC atomic-state
>>> + * @crtc: CRTC to check
>>> + * @state: atomic state object
>>> + *
>>> + * Provides a default CRTC-state check handler for CRTCs that only have
>>> + * one primary plane attached to it.
>>> + *
>>> + * This is often the case for the CRTC of simple framebuffers.
>>
>> I'd add a reference to drm_plane_helper_atomic_check() to this
>> paragraph. Like
>>
>>     See drm_plane_helper_atomic_check() for the respective plane helpers.
>>
>> And also reference back from the plane-check helper to the CRTC-check
>> helper.
>>
> 
> Good idea, I'll do that. Thanks for your review.
>   
>> Best regards
>> Thomas
>>
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 457448cc60f7..4ad3abaa98f4 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -421,6 +421,30 @@  bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
 }
 EXPORT_SYMBOL(drm_crtc_helper_set_mode);
 
+/**
+ * drm_crtc_helper_atomic_check() - Helper to check CRTC atomic-state
+ * @crtc: CRTC to check
+ * @state: atomic state object
+ *
+ * Provides a default CRTC-state check handler for CRTCs that only have
+ * one primary plane attached to it.
+ *
+ * This is often the case for the CRTC of simple framebuffers.
+ *
+ * RETURNS:
+ * Zero on success, or an errno code otherwise.
+ */
+int drm_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *state)
+{
+	struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+
+	if (!new_crtc_state->enable)
+		return 0;
+
+	return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
+}
+EXPORT_SYMBOL(drm_crtc_helper_atomic_check);
+
 static void
 drm_crtc_helper_disable(struct drm_crtc *crtc)
 {
diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c
index 0d4ab65233db..f2795f90ea69 100644
--- a/drivers/gpu/drm/solomon/ssd130x.c
+++ b/drivers/gpu/drm/solomon/ssd130x.c
@@ -20,6 +20,7 @@ 
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_fb_helper.h>
@@ -645,17 +646,6 @@  static enum drm_mode_status ssd130x_crtc_helper_mode_valid(struct drm_crtc *crtc
 	return MODE_OK;
 }
 
-static int ssd130x_crtc_helper_atomic_check(struct drm_crtc *crtc,
-					    struct drm_atomic_state *new_state)
-{
-	struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc);
-
-	if (!new_crtc_state->enable)
-		return 0;
-
-	return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
-}
-
 /*
  * The CRTC is always enabled. Screen updates are performed by
  * the primary plane's atomic_update function. Disabling clears
@@ -663,7 +653,7 @@  static int ssd130x_crtc_helper_atomic_check(struct drm_crtc *crtc,
  */
 static const struct drm_crtc_helper_funcs ssd130x_crtc_helper_funcs = {
 	.mode_valid = ssd130x_crtc_helper_mode_valid,
-	.atomic_check = ssd130x_crtc_helper_atomic_check,
+	.atomic_check = drm_crtc_helper_atomic_check,
 };
 
 static void ssd130x_crtc_reset(struct drm_crtc *crtc)
diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
index f03f17f62a56..cbb100753154 100644
--- a/drivers/gpu/drm/tiny/simpledrm.c
+++ b/drivers/gpu/drm/tiny/simpledrm.c
@@ -11,6 +11,7 @@ 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_state_helper.h>
 #include <drm/drm_connector.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
@@ -545,17 +546,6 @@  static enum drm_mode_status simpledrm_crtc_helper_mode_valid(struct drm_crtc *cr
 	return drm_crtc_helper_mode_valid_fixed(crtc, mode, &sdev->mode);
 }
 
-static int simpledrm_crtc_helper_atomic_check(struct drm_crtc *crtc,
-					      struct drm_atomic_state *new_state)
-{
-	struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc);
-
-	if (!new_crtc_state->enable)
-		return 0;
-
-	return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
-}
-
 /*
  * The CRTC is always enabled. Screen updates are performed by
  * the primary plane's atomic_update function. Disabling clears
@@ -563,7 +553,7 @@  static int simpledrm_crtc_helper_atomic_check(struct drm_crtc *crtc,
  */
 static const struct drm_crtc_helper_funcs simpledrm_crtc_helper_funcs = {
 	.mode_valid = simpledrm_crtc_helper_mode_valid,
-	.atomic_check = simpledrm_crtc_helper_atomic_check,
+	.atomic_check = drm_crtc_helper_atomic_check,
 };
 
 static const struct drm_crtc_funcs simpledrm_crtc_funcs = {
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
index a6d520d5b6ca..1840db247f69 100644
--- a/include/drm/drm_crtc_helper.h
+++ b/include/drm/drm_crtc_helper.h
@@ -50,6 +50,8 @@  bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
 			      struct drm_display_mode *mode,
 			      int x, int y,
 			      struct drm_framebuffer *old_fb);
+int drm_crtc_helper_atomic_check(struct drm_crtc *crtc,
+				 struct drm_atomic_state *state);
 bool drm_helper_crtc_in_use(struct drm_crtc *crtc);
 bool drm_helper_encoder_in_use(struct drm_encoder *encoder);