diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2008-07-21 13:47:09 -0400 |
---|---|---|
committer | Alex Deucher <alexdeucher@gmail.com> | 2008-07-21 13:47:09 -0400 |
commit | b0378bb145c8a915c943bef7d17f2cdecfccc891 (patch) | |
tree | 091b235a7706f14115ebcdb86513798fb763defe /src | |
parent | c18fad622a3c4f9572051120d83af68b625b5686 (diff) |
Interlaced mode fixups for AVIVO chips
Diffstat (limited to 'src')
-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 12a20bb8..406e7864 100644 --- a/src/atombios_crtc.c +++ b/src/atombios_crtc.c @@ -502,6 +502,12 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc, OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, (mode->HDisplay << 16) | mode->VDisplay); + 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 d4804169..13c2b9cb 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 8d6edff6..4de7bae2 100644 --- a/src/radeon_driver.c +++ b/src/radeon_driver.c @@ -4246,6 +4246,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); @@ -4286,6 +4287,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 */ @@ -4543,12 +4545,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 64f14c26..77533cc1 100644 --- a/src/radeon_output.c +++ b/src/radeon_output.c @@ -582,6 +582,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 28376717..35d622dd 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 5c0e8520..b7503032 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 |