drm/ast: Find VBIOS mode from regular display size
The ast driver looks up supplied display modes from an internal list of display modes supported by the VBIOS. Do not use the crtc_-prefixed display values from struct drm_display_mode for looking up the VBIOS mode. The fields contain raw values that the driver programs to hardware. They are affected by display settings like double-scan or interlace. Instead use the regular vdisplay and hdisplay fields for lookup. As the programmed values can now differ from the values used for lookup, set struct drm_display_mode.crtc_vdisplay and .crtc_hdisplay from the VBIOS mode. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250131092257.115596-9-tzimmermann@suse.de
This commit is contained in:
@@ -131,7 +131,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (mode->crtc_hdisplay) {
|
||||
switch (mode->hdisplay) {
|
||||
case 640:
|
||||
vbios_mode->enh_table = &res_640x480[refresh_rate_index];
|
||||
break;
|
||||
@@ -145,7 +145,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1152x864[refresh_rate_index];
|
||||
break;
|
||||
case 1280:
|
||||
if (mode->crtc_vdisplay == 800)
|
||||
if (mode->vdisplay == 800)
|
||||
vbios_mode->enh_table = &res_1280x800[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1280x1024[refresh_rate_index];
|
||||
@@ -157,7 +157,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1440x900[refresh_rate_index];
|
||||
break;
|
||||
case 1600:
|
||||
if (mode->crtc_vdisplay == 900)
|
||||
if (mode->vdisplay == 900)
|
||||
vbios_mode->enh_table = &res_1600x900[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1600x1200[refresh_rate_index];
|
||||
@@ -166,7 +166,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1680x1050[refresh_rate_index];
|
||||
break;
|
||||
case 1920:
|
||||
if (mode->crtc_vdisplay == 1080)
|
||||
if (mode->vdisplay == 1080)
|
||||
vbios_mode->enh_table = &res_1920x1080[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1920x1200[refresh_rate_index];
|
||||
@@ -201,6 +201,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0;
|
||||
vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0;
|
||||
|
||||
adjusted_mode->crtc_hdisplay = vbios_mode->enh_table->hde;
|
||||
adjusted_mode->crtc_htotal = vbios_mode->enh_table->ht;
|
||||
adjusted_mode->crtc_hblank_start = vbios_mode->enh_table->hde + hborder;
|
||||
adjusted_mode->crtc_hblank_end = vbios_mode->enh_table->ht - hborder;
|
||||
@@ -210,6 +211,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table->hfp +
|
||||
vbios_mode->enh_table->hsync);
|
||||
|
||||
adjusted_mode->crtc_vdisplay = vbios_mode->enh_table->vde;
|
||||
adjusted_mode->crtc_vtotal = vbios_mode->enh_table->vt;
|
||||
adjusted_mode->crtc_vblank_start = vbios_mode->enh_table->vde + vborder;
|
||||
adjusted_mode->crtc_vblank_end = vbios_mode->enh_table->vt - vborder;
|
||||
|
||||
Reference in New Issue
Block a user