Message ID | 20240903132601.91618-1-tzimmermann@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/ast: Remove TX-chip bitmask | expand |
On 03/09/2024 15:25, Thomas Zimmermann wrote: > The CRTC has only one output attached to it. Store the output's type > of TX chip in a single field and remove the related bitmask. > > Turn the type-less output field in struct ast_device into a union, as > only one of its fields will be used at a time. Thanks for this simplification. Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > --- > drivers/gpu/drm/ast/ast_dp501.c | 2 +- > drivers/gpu/drm/ast/ast_drv.h | 10 +++------- > drivers/gpu/drm/ast/ast_main.c | 27 +++++++++++++-------------- > drivers/gpu/drm/ast/ast_mode.c | 26 +++++++++++--------------- > drivers/gpu/drm/ast/ast_post.c | 4 ++-- > 5 files changed, 30 insertions(+), 39 deletions(-) > > diff --git a/drivers/gpu/drm/ast/ast_dp501.c b/drivers/gpu/drm/ast/ast_dp501.c > index e4c636f45082..99bf44eec7b3 100644 > --- a/drivers/gpu/drm/ast/ast_dp501.c > +++ b/drivers/gpu/drm/ast/ast_dp501.c > @@ -466,7 +466,7 @@ void ast_init_3rdtx(struct drm_device *dev) > ast_init_dvo(dev); > break; > default: > - if (ast->tx_chip_types & BIT(AST_TX_SIL164)) > + if (ast->tx_chip == AST_TX_SIL164) > ast_init_dvo(dev); > else > ast_init_analog(dev); > diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h > index 91fe07cf7b07..b6ca14a3b967 100644 > --- a/drivers/gpu/drm/ast/ast_drv.h > +++ b/drivers/gpu/drm/ast/ast_drv.h > @@ -91,11 +91,6 @@ enum ast_tx_chip { > AST_TX_ASTDP, > }; > > -#define AST_TX_NONE_BIT BIT(AST_TX_NONE) > -#define AST_TX_SIL164_BIT BIT(AST_TX_SIL164) > -#define AST_TX_DP501_BIT BIT(AST_TX_DP501) > -#define AST_TX_ASTDP_BIT BIT(AST_TX_ASTDP) > - > enum ast_config_mode { > ast_use_p2a, > ast_use_dt, > @@ -187,10 +182,12 @@ struct ast_device { > > struct mutex modeset_lock; /* Protects access to modeset I/O registers in ioregs */ > > + enum ast_tx_chip tx_chip; > + > struct ast_plane primary_plane; > struct ast_plane cursor_plane; > struct drm_crtc crtc; > - struct { > + union { > struct { > struct drm_encoder encoder; > struct ast_connector connector; > @@ -211,7 +208,6 @@ struct ast_device { > > bool support_wide_screen; > > - unsigned long tx_chip_types; /* bitfield of enum ast_chip_type */ > u8 *dp501_fw_addr; > const struct firmware *dp501_fw; /* dp501 fw */ > }; > diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c > index d836f2a4f9f3..d7d503e78e25 100644 > --- a/drivers/gpu/drm/ast/ast_main.c > +++ b/drivers/gpu/drm/ast/ast_main.c > @@ -68,11 +68,18 @@ static void ast_detect_widescreen(struct ast_device *ast) > > static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) > { > + static const char * const info_str[] = { > + "analog VGA", > + "Sil164 TMDS transmitter", > + "DP501 DisplayPort transmitter", > + "ASPEED DisplayPort transmitter", > + }; > + > struct drm_device *dev = &ast->base; > u8 jreg; > > /* Check 3rd Tx option (digital output afaik) */ > - ast->tx_chip_types |= AST_TX_NONE_BIT; > + ast->tx_chip = AST_TX_NONE; > > /* > * VGACRA3 Enhanced Color Mode Register, check if DVO is already > @@ -85,7 +92,7 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) > if (!need_post) { > jreg = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xa3, 0xff); > if (jreg & 0x80) > - ast->tx_chip_types = AST_TX_SIL164_BIT; > + ast->tx_chip = AST_TX_SIL164; > } > > if (IS_AST_GEN4(ast) || IS_AST_GEN5(ast) || IS_AST_GEN6(ast)) { > @@ -97,7 +104,7 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) > jreg = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xd1, 0xff); > switch (jreg) { > case 0x04: > - ast->tx_chip_types = AST_TX_SIL164_BIT; > + ast->tx_chip = AST_TX_SIL164; > break; > case 0x08: > ast->dp501_fw_addr = drmm_kzalloc(dev, 32*1024, GFP_KERNEL); > @@ -110,7 +117,7 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) > } > fallthrough; > case 0x0c: > - ast->tx_chip_types = AST_TX_DP501_BIT; > + ast->tx_chip = AST_TX_DP501; > } > } else if (IS_AST_GEN7(ast)) { > if (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, TX_TYPE_MASK) == > @@ -118,19 +125,11 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) > int ret = ast_dp_launch(ast); > > if (!ret) > - ast->tx_chip_types = AST_TX_ASTDP_BIT; > + ast->tx_chip = AST_TX_ASTDP; > } > } > > - /* Print stuff for diagnostic purposes */ > - if (ast->tx_chip_types & AST_TX_NONE_BIT) > - drm_info(dev, "Using analog VGA\n"); > - if (ast->tx_chip_types & AST_TX_SIL164_BIT) > - drm_info(dev, "Using Sil164 TMDS transmitter\n"); > - if (ast->tx_chip_types & AST_TX_DP501_BIT) > - drm_info(dev, "Using DP501 DisplayPort transmitter\n"); > - if (ast->tx_chip_types & AST_TX_ASTDP_BIT) > - drm_info(dev, "Using ASPEED DisplayPort transmitter\n"); > + drm_info(dev, "Using %s\n", info_str[ast->tx_chip]); > } > > static int ast_get_dram_info(struct drm_device *dev) > diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c > index ed496fb32bf3..784e8ac0e668 100644 > --- a/drivers/gpu/drm/ast/ast_mode.c > +++ b/drivers/gpu/drm/ast/ast_mode.c > @@ -1398,26 +1398,22 @@ int ast_mode_config_init(struct ast_device *ast) > > ast_crtc_init(dev); > > - if (ast->tx_chip_types & AST_TX_NONE_BIT) { > + switch (ast->tx_chip) { > + case AST_TX_NONE: > ret = ast_vga_output_init(ast); > - if (ret) > - return ret; > - } > - if (ast->tx_chip_types & AST_TX_SIL164_BIT) { > + break; > + case AST_TX_SIL164: > ret = ast_sil164_output_init(ast); > - if (ret) > - return ret; > - } > - if (ast->tx_chip_types & AST_TX_DP501_BIT) { > + break; > + case AST_TX_DP501: > ret = ast_dp501_output_init(ast); > - if (ret) > - return ret; > - } > - if (ast->tx_chip_types & AST_TX_ASTDP_BIT) { > + break; > + case AST_TX_ASTDP: > ret = ast_astdp_output_init(ast); > - if (ret) > - return ret; > + break; > } > + if (ret) > + return ret; > > drm_mode_config_reset(dev); > > diff --git a/drivers/gpu/drm/ast/ast_post.c b/drivers/gpu/drm/ast/ast_post.c > index 65755798ab94..902bf8114b6e 100644 > --- a/drivers/gpu/drm/ast/ast_post.c > +++ b/drivers/gpu/drm/ast/ast_post.c > @@ -350,7 +350,7 @@ void ast_post_gpu(struct drm_device *dev) > ast_set_def_ext_reg(dev); > > if (IS_AST_GEN7(ast)) { > - if (ast->tx_chip_types & AST_TX_ASTDP_BIT) > + if (ast->tx_chip == AST_TX_ASTDP) > ast_dp_launch(ast); > } else if (ast->config_mode == ast_use_p2a) { > if (IS_AST_GEN6(ast)) > @@ -362,7 +362,7 @@ void ast_post_gpu(struct drm_device *dev) > > ast_init_3rdtx(dev); > } else { > - if (ast->tx_chip_types & AST_TX_SIL164_BIT) > + if (ast->tx_chip == AST_TX_SIL164) > ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xa3, 0xcf, 0x80); /* Enable DVO */ > } > }
diff --git a/drivers/gpu/drm/ast/ast_dp501.c b/drivers/gpu/drm/ast/ast_dp501.c index e4c636f45082..99bf44eec7b3 100644 --- a/drivers/gpu/drm/ast/ast_dp501.c +++ b/drivers/gpu/drm/ast/ast_dp501.c @@ -466,7 +466,7 @@ void ast_init_3rdtx(struct drm_device *dev) ast_init_dvo(dev); break; default: - if (ast->tx_chip_types & BIT(AST_TX_SIL164)) + if (ast->tx_chip == AST_TX_SIL164) ast_init_dvo(dev); else ast_init_analog(dev); diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 91fe07cf7b07..b6ca14a3b967 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h @@ -91,11 +91,6 @@ enum ast_tx_chip { AST_TX_ASTDP, }; -#define AST_TX_NONE_BIT BIT(AST_TX_NONE) -#define AST_TX_SIL164_BIT BIT(AST_TX_SIL164) -#define AST_TX_DP501_BIT BIT(AST_TX_DP501) -#define AST_TX_ASTDP_BIT BIT(AST_TX_ASTDP) - enum ast_config_mode { ast_use_p2a, ast_use_dt, @@ -187,10 +182,12 @@ struct ast_device { struct mutex modeset_lock; /* Protects access to modeset I/O registers in ioregs */ + enum ast_tx_chip tx_chip; + struct ast_plane primary_plane; struct ast_plane cursor_plane; struct drm_crtc crtc; - struct { + union { struct { struct drm_encoder encoder; struct ast_connector connector; @@ -211,7 +208,6 @@ struct ast_device { bool support_wide_screen; - unsigned long tx_chip_types; /* bitfield of enum ast_chip_type */ u8 *dp501_fw_addr; const struct firmware *dp501_fw; /* dp501 fw */ }; diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c index d836f2a4f9f3..d7d503e78e25 100644 --- a/drivers/gpu/drm/ast/ast_main.c +++ b/drivers/gpu/drm/ast/ast_main.c @@ -68,11 +68,18 @@ static void ast_detect_widescreen(struct ast_device *ast) static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) { + static const char * const info_str[] = { + "analog VGA", + "Sil164 TMDS transmitter", + "DP501 DisplayPort transmitter", + "ASPEED DisplayPort transmitter", + }; + struct drm_device *dev = &ast->base; u8 jreg; /* Check 3rd Tx option (digital output afaik) */ - ast->tx_chip_types |= AST_TX_NONE_BIT; + ast->tx_chip = AST_TX_NONE; /* * VGACRA3 Enhanced Color Mode Register, check if DVO is already @@ -85,7 +92,7 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) if (!need_post) { jreg = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xa3, 0xff); if (jreg & 0x80) - ast->tx_chip_types = AST_TX_SIL164_BIT; + ast->tx_chip = AST_TX_SIL164; } if (IS_AST_GEN4(ast) || IS_AST_GEN5(ast) || IS_AST_GEN6(ast)) { @@ -97,7 +104,7 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) jreg = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xd1, 0xff); switch (jreg) { case 0x04: - ast->tx_chip_types = AST_TX_SIL164_BIT; + ast->tx_chip = AST_TX_SIL164; break; case 0x08: ast->dp501_fw_addr = drmm_kzalloc(dev, 32*1024, GFP_KERNEL); @@ -110,7 +117,7 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) } fallthrough; case 0x0c: - ast->tx_chip_types = AST_TX_DP501_BIT; + ast->tx_chip = AST_TX_DP501; } } else if (IS_AST_GEN7(ast)) { if (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xD1, TX_TYPE_MASK) == @@ -118,19 +125,11 @@ static void ast_detect_tx_chip(struct ast_device *ast, bool need_post) int ret = ast_dp_launch(ast); if (!ret) - ast->tx_chip_types = AST_TX_ASTDP_BIT; + ast->tx_chip = AST_TX_ASTDP; } } - /* Print stuff for diagnostic purposes */ - if (ast->tx_chip_types & AST_TX_NONE_BIT) - drm_info(dev, "Using analog VGA\n"); - if (ast->tx_chip_types & AST_TX_SIL164_BIT) - drm_info(dev, "Using Sil164 TMDS transmitter\n"); - if (ast->tx_chip_types & AST_TX_DP501_BIT) - drm_info(dev, "Using DP501 DisplayPort transmitter\n"); - if (ast->tx_chip_types & AST_TX_ASTDP_BIT) - drm_info(dev, "Using ASPEED DisplayPort transmitter\n"); + drm_info(dev, "Using %s\n", info_str[ast->tx_chip]); } static int ast_get_dram_info(struct drm_device *dev) diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index ed496fb32bf3..784e8ac0e668 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -1398,26 +1398,22 @@ int ast_mode_config_init(struct ast_device *ast) ast_crtc_init(dev); - if (ast->tx_chip_types & AST_TX_NONE_BIT) { + switch (ast->tx_chip) { + case AST_TX_NONE: ret = ast_vga_output_init(ast); - if (ret) - return ret; - } - if (ast->tx_chip_types & AST_TX_SIL164_BIT) { + break; + case AST_TX_SIL164: ret = ast_sil164_output_init(ast); - if (ret) - return ret; - } - if (ast->tx_chip_types & AST_TX_DP501_BIT) { + break; + case AST_TX_DP501: ret = ast_dp501_output_init(ast); - if (ret) - return ret; - } - if (ast->tx_chip_types & AST_TX_ASTDP_BIT) { + break; + case AST_TX_ASTDP: ret = ast_astdp_output_init(ast); - if (ret) - return ret; + break; } + if (ret) + return ret; drm_mode_config_reset(dev); diff --git a/drivers/gpu/drm/ast/ast_post.c b/drivers/gpu/drm/ast/ast_post.c index 65755798ab94..902bf8114b6e 100644 --- a/drivers/gpu/drm/ast/ast_post.c +++ b/drivers/gpu/drm/ast/ast_post.c @@ -350,7 +350,7 @@ void ast_post_gpu(struct drm_device *dev) ast_set_def_ext_reg(dev); if (IS_AST_GEN7(ast)) { - if (ast->tx_chip_types & AST_TX_ASTDP_BIT) + if (ast->tx_chip == AST_TX_ASTDP) ast_dp_launch(ast); } else if (ast->config_mode == ast_use_p2a) { if (IS_AST_GEN6(ast)) @@ -362,7 +362,7 @@ void ast_post_gpu(struct drm_device *dev) ast_init_3rdtx(dev); } else { - if (ast->tx_chip_types & AST_TX_SIL164_BIT) + if (ast->tx_chip == AST_TX_SIL164) ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xa3, 0xcf, 0x80); /* Enable DVO */ } }
The CRTC has only one output attached to it. Store the output's type of TX chip in a single field and remove the related bitmask. Turn the type-less output field in struct ast_device into a union, as only one of its fields will be used at a time. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/gpu/drm/ast/ast_dp501.c | 2 +- drivers/gpu/drm/ast/ast_drv.h | 10 +++------- drivers/gpu/drm/ast/ast_main.c | 27 +++++++++++++-------------- drivers/gpu/drm/ast/ast_mode.c | 26 +++++++++++--------------- drivers/gpu/drm/ast/ast_post.c | 4 ++-- 5 files changed, 30 insertions(+), 39 deletions(-)