diff options
Diffstat (limited to 'drivers/gpu/drm/ast/ast_mode.c')
-rw-r--r-- | drivers/gpu/drm/ast/ast_mode.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 5389350244f2..9dc0fd5c1ea4 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c | |||
@@ -80,6 +80,8 @@ static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, struct drm_display_mo | |||
80 | struct ast_private *ast = crtc->dev->dev_private; | 80 | struct ast_private *ast = crtc->dev->dev_private; |
81 | u32 refresh_rate_index = 0, mode_id, color_index, refresh_rate; | 81 | u32 refresh_rate_index = 0, mode_id, color_index, refresh_rate; |
82 | u32 hborder, vborder; | 82 | u32 hborder, vborder; |
83 | bool check_sync; | ||
84 | struct ast_vbios_enhtable *best = NULL; | ||
83 | 85 | ||
84 | switch (crtc->primary->fb->bits_per_pixel) { | 86 | switch (crtc->primary->fb->bits_per_pixel) { |
85 | case 8: | 87 | case 8: |
@@ -141,14 +143,34 @@ static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, struct drm_display_mo | |||
141 | } | 143 | } |
142 | 144 | ||
143 | refresh_rate = drm_mode_vrefresh(mode); | 145 | refresh_rate = drm_mode_vrefresh(mode); |
144 | while (vbios_mode->enh_table->refresh_rate < refresh_rate) { | 146 | check_sync = vbios_mode->enh_table->flags & WideScreenMode; |
145 | vbios_mode->enh_table++; | 147 | do { |
146 | if ((vbios_mode->enh_table->refresh_rate > refresh_rate) || | 148 | struct ast_vbios_enhtable *loop = vbios_mode->enh_table; |
147 | (vbios_mode->enh_table->refresh_rate == 0xff)) { | 149 | |
148 | vbios_mode->enh_table--; | 150 | while (loop->refresh_rate != 0xff) { |
149 | break; | 151 | if ((check_sync) && |
152 | (((mode->flags & DRM_MODE_FLAG_NVSYNC) && | ||
153 | (loop->flags & PVSync)) || | ||
154 | ((mode->flags & DRM_MODE_FLAG_PVSYNC) && | ||
155 | (loop->flags & NVSync)) || | ||
156 | ((mode->flags & DRM_MODE_FLAG_NHSYNC) && | ||
157 | (loop->flags & PHSync)) || | ||
158 | ((mode->flags & DRM_MODE_FLAG_PHSYNC) && | ||
159 | (loop->flags & NHSync)))) { | ||
160 | loop++; | ||
161 | continue; | ||
162 | } | ||
163 | if (loop->refresh_rate <= refresh_rate | ||
164 | && (!best || loop->refresh_rate > best->refresh_rate)) | ||
165 | best = loop; | ||
166 | loop++; | ||
150 | } | 167 | } |
151 | } | 168 | if (best || !check_sync) |
169 | break; | ||
170 | check_sync = 0; | ||
171 | } while (1); | ||
172 | if (best) | ||
173 | vbios_mode->enh_table = best; | ||
152 | 174 | ||
153 | hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0; | 175 | hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0; |
154 | vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0; | 176 | vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0; |
@@ -419,8 +441,10 @@ static void ast_set_sync_reg(struct drm_device *dev, struct drm_display_mode *mo | |||
419 | struct ast_private *ast = dev->dev_private; | 441 | struct ast_private *ast = dev->dev_private; |
420 | u8 jreg; | 442 | u8 jreg; |
421 | 443 | ||
422 | jreg = ast_io_read8(ast, AST_IO_MISC_PORT_READ); | 444 | jreg = ast_io_read8(ast, AST_IO_MISC_PORT_READ); |
423 | jreg |= (vbios_mode->enh_table->flags & SyncNN); | 445 | jreg &= ~0xC0; |
446 | if (vbios_mode->enh_table->flags & NVSync) jreg |= 0x80; | ||
447 | if (vbios_mode->enh_table->flags & NHSync) jreg |= 0x40; | ||
424 | ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, jreg); | 448 | ast_io_write8(ast, AST_IO_MISC_PORT_WRITE, jreg); |
425 | } | 449 | } |
426 | 450 | ||
@@ -1080,8 +1104,8 @@ static u32 copy_cursor_image(u8 *src, u8 *dst, int width, int height) | |||
1080 | srcdata32[1].ul = *((u32 *)(srcxor + 4)) & 0xf0f0f0f0; | 1104 | srcdata32[1].ul = *((u32 *)(srcxor + 4)) & 0xf0f0f0f0; |
1081 | data32.b[0] = srcdata32[0].b[1] | (srcdata32[0].b[0] >> 4); | 1105 | data32.b[0] = srcdata32[0].b[1] | (srcdata32[0].b[0] >> 4); |
1082 | data32.b[1] = srcdata32[0].b[3] | (srcdata32[0].b[2] >> 4); | 1106 | data32.b[1] = srcdata32[0].b[3] | (srcdata32[0].b[2] >> 4); |
1083 | data32.b[2] = srcdata32[0].b[1] | (srcdata32[1].b[0] >> 4); | 1107 | data32.b[2] = srcdata32[1].b[1] | (srcdata32[1].b[0] >> 4); |
1084 | data32.b[3] = srcdata32[0].b[3] | (srcdata32[1].b[2] >> 4); | 1108 | data32.b[3] = srcdata32[1].b[3] | (srcdata32[1].b[2] >> 4); |
1085 | 1109 | ||
1086 | writel(data32.ul, dstxor); | 1110 | writel(data32.ul, dstxor); |
1087 | csum += data32.ul; | 1111 | csum += data32.ul; |