aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ast/ast_mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/ast/ast_mode.c')
-rw-r--r--drivers/gpu/drm/ast/ast_mode.c46
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;