diff mbox series

[4/8] drm/ast: Handle primary-plane format setup in atomic_update

Message ID 20240627153638.8765-5-tzimmermann@suse.de (mailing list archive)
State New
Headers show
Series drm/ast: Untangle the chaos in mode setting | expand

Commit Message

Thomas Zimmermann June 27, 2024, 3:27 p.m. UTC
Several color registers are programmed in the DPMS code of the CRTC's
atomic_enable helper. This code will not be executed if the color format
changes without a full mode switch. The same code already exists in the
atomic_update helper of the primary plane. There, the code will not run
if only the display mode changes.

The color format is a property of the primary plane, so consolidate all
code in the plane's atomic_update.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/ast/ast_mode.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

Comments

Jocelyn Falempe June 28, 2024, 9:54 a.m. UTC | #1
On 27/06/2024 17:27, Thomas Zimmermann wrote:
> Several color registers are programmed in the DPMS code of the CRTC's
> atomic_enable helper. This code will not be executed if the color format
> changes without a full mode switch. The same code already exists in the
> atomic_update helper of the primary plane. There, the code will not run
> if only the display mode changes.

This last sentence is unclear to me.

> 
> The color format is a property of the primary plane, so consolidate all
> code in the plane's atomic_update.

With the comment clarified,

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/ast/ast_mode.c | 11 +++--------
>   1 file changed, 3 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index e8312b3472ed..6a81d657175d 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -649,12 +649,12 @@ static void ast_primary_plane_helper_atomic_update(struct drm_plane *plane,
>   	struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state, plane);
>   	struct drm_framebuffer *old_fb = old_plane_state->fb;
>   	struct ast_plane *ast_plane = to_ast_plane(plane);
> +	struct drm_crtc *crtc = plane_state->crtc;
> +	struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
>   	struct drm_rect damage;
>   	struct drm_atomic_helper_damage_iter iter;
>   
> -	if (!old_fb || (fb->format != old_fb->format)) {
> -		struct drm_crtc *crtc = plane_state->crtc;
> -		struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
> +	if (!old_fb || (fb->format != old_fb->format) || crtc_state->mode_changed) {
>   		struct ast_crtc_state *ast_crtc_state = to_ast_crtc_state(crtc_state);
>   		struct ast_vbios_mode_info *vbios_mode_info = &ast_crtc_state->vbios_mode_info;
>   
> @@ -1025,7 +1025,6 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
>   	u8 ch = AST_DPMS_VSYNC_OFF | AST_DPMS_HSYNC_OFF;
>   	struct ast_crtc_state *ast_state;
>   	const struct drm_format_info *format;
> -	struct ast_vbios_mode_info *vbios_mode_info;
>   
>   	/* TODO: Maybe control display signal generation with
>   	 *       Sync Enable (bit CR17.7).
> @@ -1039,10 +1038,6 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
>   		format = ast_state->format;
>   
>   		if (format) {
> -			vbios_mode_info = &ast_state->vbios_mode_info;
> -
> -			ast_set_color_reg(ast, format);
> -			ast_set_vbios_color_reg(ast, format, vbios_mode_info);
>   			if (crtc->state->gamma_lut)
>   				ast_crtc_set_gamma(ast, format, crtc->state->gamma_lut->data);
>   			else
Thomas Zimmermann June 28, 2024, 10:51 a.m. UTC | #2
Hi

Am 28.06.24 um 11:54 schrieb Jocelyn Falempe:
>
>
> On 27/06/2024 17:27, Thomas Zimmermann wrote:
>> Several color registers are programmed in the DPMS code of the CRTC's
>> atomic_enable helper. This code will not be executed if the color format
>> changes without a full mode switch. The same code already exists in the
>> atomic_update helper of the primary plane. There, the code will not run
>> if only the display mode changes.
>
> This last sentence is unclear to me.

OK, sure. It means that the plane's code might not run if the color 
format stays the same when the display mode changes. I'll try to reword.

Best regards
Thomas

>
>>
>> The color format is a property of the primary plane, so consolidate all
>> code in the plane's atomic_update.
>
> With the comment clarified,
>
> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
>
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> ---
>>   drivers/gpu/drm/ast/ast_mode.c | 11 +++--------
>>   1 file changed, 3 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/ast/ast_mode.c 
>> b/drivers/gpu/drm/ast/ast_mode.c
>> index e8312b3472ed..6a81d657175d 100644
>> --- a/drivers/gpu/drm/ast/ast_mode.c
>> +++ b/drivers/gpu/drm/ast/ast_mode.c
>> @@ -649,12 +649,12 @@ static void 
>> ast_primary_plane_helper_atomic_update(struct drm_plane *plane,
>>       struct drm_plane_state *old_plane_state = 
>> drm_atomic_get_old_plane_state(state, plane);
>>       struct drm_framebuffer *old_fb = old_plane_state->fb;
>>       struct ast_plane *ast_plane = to_ast_plane(plane);
>> +    struct drm_crtc *crtc = plane_state->crtc;
>> +    struct drm_crtc_state *crtc_state = 
>> drm_atomic_get_new_crtc_state(state, crtc);
>>       struct drm_rect damage;
>>       struct drm_atomic_helper_damage_iter iter;
>>   -    if (!old_fb || (fb->format != old_fb->format)) {
>> -        struct drm_crtc *crtc = plane_state->crtc;
>> -        struct drm_crtc_state *crtc_state = 
>> drm_atomic_get_new_crtc_state(state, crtc);
>> +    if (!old_fb || (fb->format != old_fb->format) || 
>> crtc_state->mode_changed) {
>>           struct ast_crtc_state *ast_crtc_state = 
>> to_ast_crtc_state(crtc_state);
>>           struct ast_vbios_mode_info *vbios_mode_info = 
>> &ast_crtc_state->vbios_mode_info;
>>   @@ -1025,7 +1025,6 @@ static void ast_crtc_dpms(struct drm_crtc 
>> *crtc, int mode)
>>       u8 ch = AST_DPMS_VSYNC_OFF | AST_DPMS_HSYNC_OFF;
>>       struct ast_crtc_state *ast_state;
>>       const struct drm_format_info *format;
>> -    struct ast_vbios_mode_info *vbios_mode_info;
>>         /* TODO: Maybe control display signal generation with
>>        *       Sync Enable (bit CR17.7).
>> @@ -1039,10 +1038,6 @@ static void ast_crtc_dpms(struct drm_crtc 
>> *crtc, int mode)
>>           format = ast_state->format;
>>             if (format) {
>> -            vbios_mode_info = &ast_state->vbios_mode_info;
>> -
>> -            ast_set_color_reg(ast, format);
>> -            ast_set_vbios_color_reg(ast, format, vbios_mode_info);
>>               if (crtc->state->gamma_lut)
>>                   ast_crtc_set_gamma(ast, format, 
>> crtc->state->gamma_lut->data);
>>               else
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index e8312b3472ed..6a81d657175d 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -649,12 +649,12 @@  static void ast_primary_plane_helper_atomic_update(struct drm_plane *plane,
 	struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state, plane);
 	struct drm_framebuffer *old_fb = old_plane_state->fb;
 	struct ast_plane *ast_plane = to_ast_plane(plane);
+	struct drm_crtc *crtc = plane_state->crtc;
+	struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
 	struct drm_rect damage;
 	struct drm_atomic_helper_damage_iter iter;
 
-	if (!old_fb || (fb->format != old_fb->format)) {
-		struct drm_crtc *crtc = plane_state->crtc;
-		struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+	if (!old_fb || (fb->format != old_fb->format) || crtc_state->mode_changed) {
 		struct ast_crtc_state *ast_crtc_state = to_ast_crtc_state(crtc_state);
 		struct ast_vbios_mode_info *vbios_mode_info = &ast_crtc_state->vbios_mode_info;
 
@@ -1025,7 +1025,6 @@  static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
 	u8 ch = AST_DPMS_VSYNC_OFF | AST_DPMS_HSYNC_OFF;
 	struct ast_crtc_state *ast_state;
 	const struct drm_format_info *format;
-	struct ast_vbios_mode_info *vbios_mode_info;
 
 	/* TODO: Maybe control display signal generation with
 	 *       Sync Enable (bit CR17.7).
@@ -1039,10 +1038,6 @@  static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
 		format = ast_state->format;
 
 		if (format) {
-			vbios_mode_info = &ast_state->vbios_mode_info;
-
-			ast_set_color_reg(ast, format);
-			ast_set_vbios_color_reg(ast, format, vbios_mode_info);
 			if (crtc->state->gamma_lut)
 				ast_crtc_set_gamma(ast, format, crtc->state->gamma_lut->data);
 			else