From 4b3374d790567e5eb3c83f1f70c396ddc5da603d Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Tue, 7 Oct 2025 16:54:42 +0200 Subject: 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 --- drivers/gpu/drm/ast/ast_mode.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'drivers/gpu/drm/ast/ast_mode.c') diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 6b9d510c509d..a9ffda1b1dea 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); -- cgit v1.2.3 From 2f9d9041adbe9193f69de3aae8f09db4f23699f1 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Tue, 7 Oct 2025 16:54:44 +0200 Subject: drm/ast: Store CRTC memory request threshold in device quirks Store each hardware's CRTC memory threshold in the specific instance of struct ast_device_quirks. Removes the calls to IS_AST_GENn() from ast_set_crtthd_reg(). The values stored in the registers appear to be plain limits. Hence write them in the driver in decimal format instead of hexadecimal. Signed-off-by: Thomas Zimmermann Reviewed-by: Jocelyn Falempe Link: https://lore.kernel.org/r/20251007150343.273718-4-tzimmermann@suse.de --- drivers/gpu/drm/ast/ast_2000.c | 2 ++ drivers/gpu/drm/ast/ast_2100.c | 2 ++ drivers/gpu/drm/ast/ast_2200.c | 2 ++ drivers/gpu/drm/ast/ast_2300.c | 2 ++ drivers/gpu/drm/ast/ast_2400.c | 2 ++ drivers/gpu/drm/ast/ast_2500.c | 2 ++ drivers/gpu/drm/ast/ast_2600.c | 2 ++ drivers/gpu/drm/ast/ast_drv.h | 5 +++++ drivers/gpu/drm/ast/ast_mode.c | 19 +++++-------------- 9 files changed, 24 insertions(+), 14 deletions(-) (limited to 'drivers/gpu/drm/ast/ast_mode.c') diff --git a/drivers/gpu/drm/ast/ast_2000.c b/drivers/gpu/drm/ast/ast_2000.c index ae4d7a2a0ec8..fa3bc23ce098 100644 --- a/drivers/gpu/drm/ast/ast_2000.c +++ b/drivers/gpu/drm/ast/ast_2000.c @@ -212,6 +212,8 @@ void ast_2000_detect_tx_chip(struct ast_device *ast, bool need_post) } static const struct ast_device_quirks ast_2000_device_quirks = { + .crtc_mem_req_threshold_low = 31, + .crtc_mem_req_threshold_high = 47, }; struct drm_device *ast_2000_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2100.c b/drivers/gpu/drm/ast/ast_2100.c index 01e064e67cf7..05aeb0624d41 100644 --- a/drivers/gpu/drm/ast/ast_2100.c +++ b/drivers/gpu/drm/ast/ast_2100.c @@ -433,6 +433,8 @@ static void ast_2100_detect_widescreen(struct ast_device *ast) } static const struct ast_device_quirks ast_2100_device_quirks = { + .crtc_mem_req_threshold_low = 47, + .crtc_mem_req_threshold_high = 63, }; struct drm_device *ast_2100_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2200.c b/drivers/gpu/drm/ast/ast_2200.c index 46b6fc6cf7eb..b64345d11ffa 100644 --- a/drivers/gpu/drm/ast/ast_2200.c +++ b/drivers/gpu/drm/ast/ast_2200.c @@ -44,6 +44,8 @@ static void ast_2200_detect_widescreen(struct ast_device *ast) } static const struct ast_device_quirks ast_2200_device_quirks = { + .crtc_mem_req_threshold_low = 47, + .crtc_mem_req_threshold_high = 63, }; struct drm_device *ast_2200_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2300.c b/drivers/gpu/drm/ast/ast_2300.c index b76a80d6aea6..5f50d9f91ffd 100644 --- a/drivers/gpu/drm/ast/ast_2300.c +++ b/drivers/gpu/drm/ast/ast_2300.c @@ -1408,6 +1408,8 @@ static void ast_2300_detect_widescreen(struct ast_device *ast) } static const struct ast_device_quirks ast_2300_device_quirks = { + .crtc_mem_req_threshold_low = 96, + .crtc_mem_req_threshold_high = 120, }; struct drm_device *ast_2300_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2400.c b/drivers/gpu/drm/ast/ast_2400.c index 2b41ff69ab0b..2e6befd24f91 100644 --- a/drivers/gpu/drm/ast/ast_2400.c +++ b/drivers/gpu/drm/ast/ast_2400.c @@ -45,6 +45,8 @@ static void ast_2400_detect_widescreen(struct ast_device *ast) } static const struct ast_device_quirks ast_2400_device_quirks = { + .crtc_mem_req_threshold_low = 96, + .crtc_mem_req_threshold_high = 120, }; struct drm_device *ast_2400_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2500.c b/drivers/gpu/drm/ast/ast_2500.c index 6d305a8ccc51..416bce9ea757 100644 --- a/drivers/gpu/drm/ast/ast_2500.c +++ b/drivers/gpu/drm/ast/ast_2500.c @@ -619,6 +619,8 @@ static void ast_2500_detect_widescreen(struct ast_device *ast) } static const struct ast_device_quirks ast_2500_device_quirks = { + .crtc_mem_req_threshold_low = 96, + .crtc_mem_req_threshold_high = 120, }; struct drm_device *ast_2500_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2600.c b/drivers/gpu/drm/ast/ast_2600.c index df3b429e8174..bb0a50b25766 100644 --- a/drivers/gpu/drm/ast/ast_2600.c +++ b/drivers/gpu/drm/ast/ast_2600.c @@ -60,6 +60,8 @@ static void ast_2600_detect_widescreen(struct ast_device *ast) } static const struct ast_device_quirks ast_2600_device_quirks = { + .crtc_mem_req_threshold_low = 160, + .crtc_mem_req_threshold_high = 224, }; struct drm_device *ast_2600_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 2a2c28693dc6..926e1c7de6f8 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h @@ -165,6 +165,11 @@ to_ast_connector(struct drm_connector *connector) */ struct ast_device_quirks { + /* + * CRTC memory request threshold + */ + unsigned char crtc_mem_req_threshold_low; + unsigned char crtc_mem_req_threshold_high; }; struct ast_device { diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index a9ffda1b1dea..da374af9596d 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -410,20 +410,11 @@ static void ast_set_color_reg(struct ast_device *ast, static void ast_set_crtthd_reg(struct ast_device *ast) { - /* Set Threshold */ - if (IS_AST_GEN7(ast)) { - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa7, 0xe0); - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa6, 0xa0); - } else if (IS_AST_GEN6(ast) || IS_AST_GEN5(ast) || IS_AST_GEN4(ast)) { - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa7, 0x78); - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa6, 0x60); - } else if (IS_AST_GEN3(ast) || IS_AST_GEN2(ast)) { - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa7, 0x3f); - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa6, 0x2f); - } else { - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa7, 0x2f); - ast_set_index_reg(ast, AST_IO_VGACRI, 0xa6, 0x1f); - } + u8 vgacra6 = ast->quirks->crtc_mem_req_threshold_low; + u8 vgacra7 = ast->quirks->crtc_mem_req_threshold_high; + + ast_set_index_reg(ast, AST_IO_VGACRI, 0xa7, vgacra7); + ast_set_index_reg(ast, AST_IO_VGACRI, 0xa6, vgacra6); } static void ast_set_sync_reg(struct ast_device *ast, -- cgit v1.2.3 From d251db1f31be975b4d37ed71cbfe23d6560a5134 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Tue, 7 Oct 2025 16:54:45 +0200 Subject: drm/ast: Store precatch settings in struct ast_device_quirks Add a precatch flag in struct ast_device_info and set it on AST2500 and AST2600. Remove calls to IS_AST_GENn() from ast_set_crtc_reg(). Also fix the coding style in several places. Signed-off-by: Thomas Zimmermann Reviewed-by: Jocelyn Falempe Link: https://lore.kernel.org/r/20251007150343.273718-5-tzimmermann@suse.de --- drivers/gpu/drm/ast/ast_2500.c | 1 + drivers/gpu/drm/ast/ast_2600.c | 1 + drivers/gpu/drm/ast/ast_drv.h | 6 ++++++ drivers/gpu/drm/ast/ast_mode.c | 17 ++++++++--------- 4 files changed, 16 insertions(+), 9 deletions(-) (limited to 'drivers/gpu/drm/ast/ast_mode.c') diff --git a/drivers/gpu/drm/ast/ast_2500.c b/drivers/gpu/drm/ast/ast_2500.c index 416bce9ea757..2a52af0ded56 100644 --- a/drivers/gpu/drm/ast/ast_2500.c +++ b/drivers/gpu/drm/ast/ast_2500.c @@ -621,6 +621,7 @@ static void ast_2500_detect_widescreen(struct ast_device *ast) static const struct ast_device_quirks ast_2500_device_quirks = { .crtc_mem_req_threshold_low = 96, .crtc_mem_req_threshold_high = 120, + .crtc_hsync_precatch_needed = true, }; struct drm_device *ast_2500_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_2600.c b/drivers/gpu/drm/ast/ast_2600.c index bb0a50b25766..7cde5ce9c41f 100644 --- a/drivers/gpu/drm/ast/ast_2600.c +++ b/drivers/gpu/drm/ast/ast_2600.c @@ -62,6 +62,7 @@ static void ast_2600_detect_widescreen(struct ast_device *ast) static const struct ast_device_quirks ast_2600_device_quirks = { .crtc_mem_req_threshold_low = 160, .crtc_mem_req_threshold_high = 224, + .crtc_hsync_precatch_needed = true, }; struct drm_device *ast_2600_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 926e1c7de6f8..76969244d36f 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h @@ -170,6 +170,12 @@ struct ast_device_quirks { */ unsigned char crtc_mem_req_threshold_low; unsigned char crtc_mem_req_threshold_high; + + /* + * Adjust hsync values to load next scanline early. Signalled + * by AST2500PreCatchCRT in VBIOS mode flags. + */ + bool crtc_hsync_precatch_needed; }; struct ast_device { diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index da374af9596d..ebb1ec82d904 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -241,16 +241,15 @@ static void ast_set_std_reg(struct ast_device *ast, ast_set_index_reg(ast, AST_IO_VGAGRI, i, stdtable->gr[i]); } -static void ast_set_crtc_reg(struct ast_device *ast, - struct drm_display_mode *mode, +static void ast_set_crtc_reg(struct ast_device *ast, struct drm_display_mode *mode, const struct ast_vbios_enhtable *vmode) { u8 jreg05 = 0, jreg07 = 0, jreg09 = 0, jregAC = 0, jregAD = 0, jregAE = 0; - u16 temp, precache = 0; + u16 temp; + unsigned char crtc_hsync_precatch = 0; - if ((IS_AST_GEN6(ast) || IS_AST_GEN7(ast)) && - (vmode->flags & AST2500PreCatchCRT)) - precache = 40; + if (ast->quirks->crtc_hsync_precatch_needed && (vmode->flags & AST2500PreCatchCRT)) + crtc_hsync_precatch = 40; ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x11, 0x7f, 0x00); @@ -276,12 +275,12 @@ static void ast_set_crtc_reg(struct ast_device *ast, jregAD |= 0x01; /* HBE D[5] */ ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x03, 0xE0, (temp & 0x1f)); - temp = ((mode->crtc_hsync_start-precache) >> 3) - 1; + temp = ((mode->crtc_hsync_start - crtc_hsync_precatch) >> 3) - 1; if (temp & 0x100) jregAC |= 0x40; /* HRS D[5] */ ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x04, 0x00, temp); - temp = (((mode->crtc_hsync_end-precache) >> 3) - 1) & 0x3f; + temp = (((mode->crtc_hsync_end - crtc_hsync_precatch) >> 3) - 1) & 0x3f; if (temp & 0x20) jregAD |= 0x04; /* HRE D[5] */ ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x05, 0x60, (u8)((temp & 0x1f) | jreg05)); @@ -348,7 +347,7 @@ static void ast_set_crtc_reg(struct ast_device *ast, ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x09, 0xdf, jreg09); ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xAE, 0x00, (jregAE | 0x80)); - if (precache) + if (crtc_hsync_precatch) ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0x3f, 0x80); else ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0x3f, 0x00); -- cgit v1.2.3 From b245bc23ff5840f1f0d54d2d76ff5facc03a51bb Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Tue, 7 Oct 2025 16:54:46 +0200 Subject: drm/ast: Store HSync adjustment in device quirks Add the add4 flag to struct ast_device_quirks and set it on AST2600. Replaces a call to IS_AST_GEN7() in ast_set_crtc_reg(). Signed-off-by: Thomas Zimmermann Reviewed-by: Jocelyn Falempe > Link: https://lore.kernel.org/r/20251007150343.273718-6-tzimmermann@suse.de --- drivers/gpu/drm/ast/ast_2600.c | 1 + drivers/gpu/drm/ast/ast_drv.h | 6 ++++++ drivers/gpu/drm/ast/ast_mode.c | 3 +-- 3 files changed, 8 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/ast/ast_mode.c') diff --git a/drivers/gpu/drm/ast/ast_2600.c b/drivers/gpu/drm/ast/ast_2600.c index 7cde5ce9c41f..dee78fd5b022 100644 --- a/drivers/gpu/drm/ast/ast_2600.c +++ b/drivers/gpu/drm/ast/ast_2600.c @@ -63,6 +63,7 @@ static const struct ast_device_quirks ast_2600_device_quirks = { .crtc_mem_req_threshold_low = 160, .crtc_mem_req_threshold_high = 224, .crtc_hsync_precatch_needed = true, + .crtc_hsync_add4_needed = true, }; struct drm_device *ast_2600_device_create(struct pci_dev *pdev, diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 76969244d36f..7be36a358e74 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h @@ -176,6 +176,12 @@ struct ast_device_quirks { * by AST2500PreCatchCRT in VBIOS mode flags. */ bool crtc_hsync_precatch_needed; + + /* + * Workaround for modes with HSync Time that is not a multiple + * of 8 (e.g., 1920x1080@60Hz, HSync +44 pixels). + */ + bool crtc_hsync_add4_needed; }; struct ast_device { diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index ebb1ec82d904..a8917ab7028c 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -288,8 +288,7 @@ static void ast_set_crtc_reg(struct ast_device *ast, struct drm_display_mode *mo ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xAC, 0x00, jregAC); ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xAD, 0x00, jregAD); - // Workaround for HSync Time non octave pixels (1920x1080@60Hz HSync 44 pixels); - if (IS_AST_GEN7(ast) && (mode->crtc_vdisplay == 1080)) + if (ast->quirks->crtc_hsync_add4_needed && mode->crtc_vdisplay == 1080) ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xFC, 0xFD, 0x02); else ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xFC, 0xFD, 0x00); -- cgit v1.2.3