[PATCH 6/8] drm/ast: Only set VGA SCREEN_DISABLE bit in CRTC code
Jocelyn Falempe
jfalempe at redhat.com
Fri Jun 28 09:56:55 UTC 2024
On 27/06/2024 17:27, Thomas Zimmermann wrote:
> The SCREEN_DISABLE bit controls scanout from display memory. The bit
> affects all planes, so set it only in the CRTC's atomic enable and
> disable functions.
>
> A number of bugs affect this fix. First of all, ast_set_std_regs()
> tries to set VGASR1 except for the SD bit. Bit the read bitmask is
> invert, so it preserves anything exceptt the SD bit. Fix this by
> inverting the read mask.
>
> The second issue is that primary-plane and CRTC helpers modify the
> SD bit. The bit controls scanout for all planes, primary and HW
> cursor, so set it only in the CRTC code.
>
> Further add a constant to represent the SD bit in VGASR1. Keep the
> plane's atomic_disable around to make the DRM framework happy.
Thanks, it looks good te me.
Reviewed-by: Jocelyn Falempe <jfalempe at redhat.com>
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
> drivers/gpu/drm/ast/ast_mode.c | 14 +++++++-------
> drivers/gpu/drm/ast/ast_reg.h | 1 +
> 2 files changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index e90179bc0842..77358b587098 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -303,7 +303,7 @@ static void ast_set_std_reg(struct ast_device *ast,
>
> /* Set SEQ; except Screen Disable field */
> ast_set_index_reg(ast, AST_IO_VGASRI, 0x00, 0x03);
> - ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, stdtable->seq[0]);
> + ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0x20, stdtable->seq[0]);
> for (i = 1; i < 4; i++) {
> jreg = stdtable->seq[i];
> ast_set_index_reg(ast, AST_IO_VGASRI, (i + 1), jreg);
> @@ -690,15 +690,15 @@ static void ast_primary_plane_helper_atomic_enable(struct drm_plane *plane,
> * Therefore only reprogram the address after enabling the plane.
> */
> ast_set_start_address_crt1(ast, (u32)ast_plane->offset);
> - ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x1, 0xdf, 0x00);
> }
>
> static void ast_primary_plane_helper_atomic_disable(struct drm_plane *plane,
> struct drm_atomic_state *state)
> {
> - struct ast_device *ast = to_ast_device(plane->dev);
> -
> - ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x1, 0xdf, 0x20);
> + /*
> + * Keep this empty function to avoid calling
> + * atomic_update when disabling the plane.
> + */
> }
>
> static int ast_primary_plane_helper_get_scanout_buffer(struct drm_plane *plane,
> @@ -1029,14 +1029,14 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
> */
> switch (mode) {
> case DRM_MODE_DPMS_ON:
> - ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, 0);
> ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0xfc, 0);
> + ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, 0);
> break;
> case DRM_MODE_DPMS_STANDBY:
> case DRM_MODE_DPMS_SUSPEND:
> case DRM_MODE_DPMS_OFF:
> ch = mode;
> - ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, 0x20);
> + ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, AST_IO_VGASR1_SD);
> ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0xfc, ch);
> break;
> }
> diff --git a/drivers/gpu/drm/ast/ast_reg.h b/drivers/gpu/drm/ast/ast_reg.h
> index 62dddbf3fe56..6326cbdadc82 100644
> --- a/drivers/gpu/drm/ast/ast_reg.h
> +++ b/drivers/gpu/drm/ast/ast_reg.h
> @@ -22,6 +22,7 @@
> #define AST_IO_VGAER_VGA_ENABLE BIT(0)
>
> #define AST_IO_VGASRI (0x44)
> +#define AST_IO_VGASR1_SD BIT(5)
> #define AST_IO_VGADRR (0x47)
> #define AST_IO_VGADWR (0x48)
> #define AST_IO_VGAPDR (0x49)
More information about the dri-devel
mailing list