diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2008-07-21 13:47:09 -0400 |
---|---|---|
committer | Brice Goglin <bgoglin@debian.org> | 2008-08-02 18:47:30 +0200 |
commit | d12e519bed2e91e4c19a39e26020fda1f4548956 (patch) | |
tree | 6a55e4083034ca993a3854994fb804bc0ee2362b | |
parent | 1574d11f66b1f5479b8b2fe6919f7f5a0c3e6cf7 (diff) | |
download | xf86-video-ati-frc-d12e519bed2e91e4c19a39e26020fda1f4548956.tar.gz xf86-video-ati-frc-d12e519bed2e91e4c19a39e26020fda1f4548956.tar.bz2 |
Interlaced mode fixups for AVIVO chips
(cherry picked from commit b0378bb145c8a915c943bef7d17f2cdecfccc891)
-rw-r--r-- | src/atombios_crtc.c | 6 | ||||
-rw-r--r-- | src/radeon_cursor.c | 10 | ||||
-rw-r--r-- | src/radeon_driver.c | 4 | ||||
-rw-r--r-- | src/radeon_output.c | 7 | ||||
-rw-r--r-- | src/radeon_probe.h | 1 | ||||
-rw-r--r-- | src/radeon_reg.h | 3 |
6 files changed, 26 insertions, 5 deletions
diff --git a/src/atombios_crtc.c b/src/atombios_crtc.c index 02478b1..06efe5c 100644 --- a/src/atombios_crtc.c +++ b/src/atombios_crtc.c @@ -490,6 +490,12 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc, /* unlock the mode regs */ OUTREG(AVIVO_D1SCL_UPDATE + radeon_crtc->crtc_offset, 0); + if (adjusted_mode->Flags & V_INTERLACE) + OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, + AVIVO_D1MODE_INTERLEAVE_EN); + else + OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, + 0); } atombios_crtc_set_pll(crtc, adjusted_mode, pll_flags); diff --git a/src/radeon_cursor.c b/src/radeon_cursor.c index d480416..13c2b9c 100644 --- a/src/radeon_cursor.c +++ b/src/radeon_cursor.c @@ -209,11 +209,6 @@ radeon_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) if (xorigin >= CURSOR_WIDTH) xorigin = CURSOR_WIDTH - 1; if (yorigin >= CURSOR_HEIGHT) yorigin = CURSOR_HEIGHT - 1; - if (mode->Flags & V_INTERLACE) - y /= 2; - else if (mode->Flags & V_DBLSCAN) - y *= 2; - if (IS_AVIVO_VARIANT) { /* avivo cursor spans the full fb width */ if (crtc->rotatedData == NULL) { @@ -226,6 +221,11 @@ radeon_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) OUTREG(AVIVO_D1CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin); avivo_lock_cursor(crtc, FALSE); } else { + if (mode->Flags & V_INTERLACE) + y /= 2; + else if (mode->Flags & V_DBLSCAN) + y *= 2; + if (crtc_id == 0) { OUTREG(RADEON_CUR_HORZ_VERT_OFF, (RADEON_CUR_LOCK | (xorigin << 16) diff --git a/src/radeon_driver.c b/src/radeon_driver.c index bb154de..e067cb7 100644 --- a/src/radeon_driver.c +++ b/src/radeon_driver.c @@ -4239,6 +4239,7 @@ avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save) state->grph1.desktop_height = INREG(AVIVO_D1MODE_DESKTOP_HEIGHT); state->grph1.viewport_start = INREG(AVIVO_D1MODE_VIEWPORT_START); state->grph1.viewport_size = INREG(AVIVO_D1MODE_VIEWPORT_SIZE); + state->grph1.mode_data_format = INREG(AVIVO_D1MODE_DATA_FORMAT); state->crtc2.pll_source = INREG(AVIVO_PCLK_CRTC2_CNTL); @@ -4279,6 +4280,7 @@ avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save) state->grph2.desktop_height = INREG(AVIVO_D2MODE_DESKTOP_HEIGHT); state->grph2.viewport_start = INREG(AVIVO_D2MODE_VIEWPORT_START); state->grph2.viewport_size = INREG(AVIVO_D2MODE_VIEWPORT_SIZE); + state->grph2.mode_data_format = INREG(AVIVO_D2MODE_DATA_FORMAT); if (IS_DCE3_VARIANT) { /* save DVOA regs */ @@ -4536,12 +4538,14 @@ avivo_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore) OUTREG(AVIVO_D1MODE_DESKTOP_HEIGHT, state->grph1.desktop_height); OUTREG(AVIVO_D1MODE_VIEWPORT_START, state->grph1.viewport_start); OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE, state->grph1.viewport_size); + OUTREG(AVIVO_D1MODE_DATA_FORMAT, state->grph1.mode_data_format); OUTREG(AVIVO_D1SCL_UPDATE, 0); OUTREG(AVIVO_D2SCL_UPDATE, AVIVO_D1SCL_UPDATE_LOCK); OUTREG(AVIVO_D2MODE_DESKTOP_HEIGHT, state->grph2.desktop_height); OUTREG(AVIVO_D2MODE_VIEWPORT_START, state->grph2.viewport_start); OUTREG(AVIVO_D2MODE_VIEWPORT_SIZE, state->grph2.viewport_size); + OUTREG(AVIVO_D2MODE_DATA_FORMAT, state->grph2.mode_data_format); OUTREG(AVIVO_D2SCL_UPDATE, 0); /* Set the PLL */ diff --git a/src/radeon_output.c b/src/radeon_output.c index ade0b00..b725e0a 100644 --- a/src/radeon_output.c +++ b/src/radeon_output.c @@ -580,6 +580,13 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, } } + if (IS_AVIVO_VARIANT) { + /* hw bug */ + if ((mode->Flags & V_INTERLACE) + && (mode->CrtcVSyncStart < (mode->CrtcVDisplay + 2))) + adjusted_mode->CrtcVSyncStart = adjusted_mode->CrtcVDisplay + 2; + } + return TRUE; } diff --git a/src/radeon_probe.h b/src/radeon_probe.h index 2837671..35d622d 100644 --- a/src/radeon_probe.h +++ b/src/radeon_probe.h @@ -313,6 +313,7 @@ struct avivo_grph_state { uint32_t desktop_height; uint32_t viewport_start; uint32_t viewport_size; + uint32_t mode_data_format; }; struct avivo_state diff --git a/src/radeon_reg.h b/src/radeon_reg.h index dd47dc4..3b3a8e5 100644 --- a/src/radeon_reg.h +++ b/src/radeon_reg.h @@ -3602,6 +3602,8 @@ #define AVIVO_DC_LUTA_WHITE_OFFSET_GREEN 0x64d4 #define AVIVO_DC_LUTA_WHITE_OFFSET_RED 0x64d8 +#define AVIVO_D1MODE_DATA_FORMAT 0x6528 +# define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) #define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652c #define AVIVO_D1MODE_VIEWPORT_START 0x6580 #define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584 @@ -3654,6 +3656,7 @@ #define AVIVO_D2CUR_SIZE 0x6c10 #define AVIVO_D2CUR_POSITION 0x6c14 +#define AVIVO_D2MODE_DATA_FORMAT 0x6d28 #define AVIVO_D2MODE_DESKTOP_HEIGHT 0x6d2c #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 |