From: Thomas Zimmermann Date: Tue, 7 Oct 2025 14:54:42 +0000 (+0200) Subject: drm/ast: Store DRAM clock table in struct ast_device X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4b3374d790567e5eb3c83f1f70c396ddc5da603d;p=thirdparty%2Fkernel%2Flinux.git drm/ast: Store DRAM clock table in struct ast_device Init the new field dclk_table in struct ast_device to the per-gen table of DRAM clock parameters. Use the field during modesetting. The table is static, so a setup is only required once. Removes the call to IS_AST_GEN() from the atomic commit's code path. Signed-off-by: Thomas Zimmermann Reviewed-by: Jocelyn Falempe Link: https://lore.kernel.org/r/20251007150343.273718-2-tzimmermann@suse.de --- diff --git a/drivers/gpu/drm/ast/ast_2000.c b/drivers/gpu/drm/ast/ast_2000.c index 03b0dcea43d1a..74a041e990612 100644 --- a/drivers/gpu/drm/ast/ast_2000.c +++ b/drivers/gpu/drm/ast/ast_2000.c @@ -230,6 +230,8 @@ struct drm_device *ast_2000_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2000_dclk_table; + ast_2000_detect_tx_chip(ast, need_post); if (need_post) { diff --git a/drivers/gpu/drm/ast/ast_2100.c b/drivers/gpu/drm/ast/ast_2100.c index 540972daec52c..eb3336c84833b 100644 --- a/drivers/gpu/drm/ast/ast_2100.c +++ b/drivers/gpu/drm/ast/ast_2100.c @@ -451,6 +451,8 @@ struct drm_device *ast_2100_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2000_dclk_table; + ast_2000_detect_tx_chip(ast, need_post); if (need_post) { diff --git a/drivers/gpu/drm/ast/ast_2200.c b/drivers/gpu/drm/ast/ast_2200.c index 4795966dc2a7c..391034d5f4250 100644 --- a/drivers/gpu/drm/ast/ast_2200.c +++ b/drivers/gpu/drm/ast/ast_2200.c @@ -62,6 +62,8 @@ struct drm_device *ast_2200_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2000_dclk_table; + ast_2000_detect_tx_chip(ast, need_post); if (need_post) { diff --git a/drivers/gpu/drm/ast/ast_2300.c b/drivers/gpu/drm/ast/ast_2300.c index d1d63e58f3d6a..3c9e1960b90c7 100644 --- a/drivers/gpu/drm/ast/ast_2300.c +++ b/drivers/gpu/drm/ast/ast_2300.c @@ -1426,6 +1426,8 @@ struct drm_device *ast_2300_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2000_dclk_table; + ast_2300_detect_tx_chip(ast); if (need_post) { diff --git a/drivers/gpu/drm/ast/ast_2400.c b/drivers/gpu/drm/ast/ast_2400.c index 596338ea22f4f..be866d1cd06af 100644 --- a/drivers/gpu/drm/ast/ast_2400.c +++ b/drivers/gpu/drm/ast/ast_2400.c @@ -63,6 +63,8 @@ struct drm_device *ast_2400_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2000_dclk_table; + ast_2300_detect_tx_chip(ast); if (need_post) { diff --git a/drivers/gpu/drm/ast/ast_2500.c b/drivers/gpu/drm/ast/ast_2500.c index 2c56db644f069..086c74682a551 100644 --- a/drivers/gpu/drm/ast/ast_2500.c +++ b/drivers/gpu/drm/ast/ast_2500.c @@ -637,6 +637,8 @@ struct drm_device *ast_2500_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2500_dclk_table; + ast_2300_detect_tx_chip(ast); if (need_post) { diff --git a/drivers/gpu/drm/ast/ast_2600.c b/drivers/gpu/drm/ast/ast_2600.c index 30490c473797e..1f709486f4918 100644 --- a/drivers/gpu/drm/ast/ast_2600.c +++ b/drivers/gpu/drm/ast/ast_2600.c @@ -78,6 +78,8 @@ struct drm_device *ast_2600_device_create(struct pci_dev *pdev, ast_device_init(ast, chip, config_mode, regs, ioregs); + ast->dclk_table = ast_2500_dclk_table; + ast_2300_detect_tx_chip(ast); switch (ast->tx_chip) { diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 35c476c85b9ad..b2b30a0e4ffbc 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h @@ -174,6 +174,8 @@ struct ast_device { enum ast_config_mode config_mode; enum ast_chip chip; + const struct ast_vbios_dclk_info *dclk_table; + void __iomem *vram; unsigned long vram_base; unsigned long vram_size; diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 6b9d510c509df..a9ffda1b1dea2 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -370,12 +370,7 @@ static void ast_set_dclk_reg(struct ast_device *ast, struct drm_display_mode *mode, const struct ast_vbios_enhtable *vmode) { - const struct ast_vbios_dclk_info *clk_info; - - if (IS_AST_GEN6(ast) || IS_AST_GEN7(ast)) - clk_info = &ast_2500_dclk_table[vmode->dclk_index]; - else - clk_info = &ast_2000_dclk_table[vmode->dclk_index]; + const struct ast_vbios_dclk_info *clk_info = &ast->dclk_table[vmode->dclk_index]; ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xc0, 0x00, clk_info->param1); ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xc1, 0x00, clk_info->param2);