diff options
author | Adam Jackson <ajax@redhat.com> | 2012-04-25 15:25:46 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2014-05-21 10:24:36 -0400 |
commit | 568a695a164687b732a9127832154501dbb7a13c (patch) | |
tree | 54ee35cd753450589e47b104affc800e49009d07 | |
parent | 3d1c12f600e579ebde64f9900396c126e1bd6e5f (diff) |
randr: Add G200SE display priority tweak
Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r-- | src/mga_g_crtc.c | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/src/mga_g_crtc.c b/src/mga_g_crtc.c index 181f240..d46fe4e 100644 --- a/src/mga_g_crtc.c +++ b/src/mga_g_crtc.c @@ -519,8 +519,9 @@ MGAGSetPCLK(xf86CrtcPtr crtc, MgaCrtcStatePtr state, long f_out) /* Pixel clock values */ int m, n, p; + state->clock = f_out; + if (MGAISGx50(pMga)) { - state->clock = f_out; return; } @@ -915,6 +916,66 @@ state_restore(xf86CrtcPtr crtc, MgaCrtcStatePtr state, if (vga_flags & VGA_SR_FONTS) MGAG200SERestoreFonts(scrn, vga); + + /* + This function optimize the Priority Request control + Higher HiPriLvl will reduce drawing performance + We need to give enough bandwith to crtc to avoid visual artifact + */ + if (pMga->reg_1e24 >= 0x02) + { + /* Calulate CRTC Priority value */ + CARD8 ucHiPriLvl; + CARD32 ulBitsPerPixel; + CARD32 ulMemoryBandwidth; + + /* uiBitsPerPixel can only be 8,16 or32 */ + if (scrn->bitsPerPixel > 16) + { + ulBitsPerPixel = 32; + } + else if (scrn->bitsPerPixel > 8) + { + ulBitsPerPixel = 16; + } + else + { + ulBitsPerPixel = 8; + } + + ulMemoryBandwidth = (state->clock * ulBitsPerPixel) / 1000; + + if (ulMemoryBandwidth > 3100) ucHiPriLvl = 0; + else if (ulMemoryBandwidth > 2600) ucHiPriLvl = 1; + else if (ulMemoryBandwidth > 1900) ucHiPriLvl = 2; + else if (ulMemoryBandwidth > 1160) ucHiPriLvl = 3; + else if (ulMemoryBandwidth > 440) ucHiPriLvl = 4; + else ucHiPriLvl = 5; + + OUTREG8(0x1FDE, 0x06); + OUTREG8(0x1FDF, ucHiPriLvl); + + xf86DrvMsg(scrn->scrnIndex, X_INFO, "Clock == %d\n", state->clock); + xf86DrvMsg(scrn->scrnIndex, X_INFO, "BitsPerPixel == %d\n", scrn->bitsPerPixel); + xf86DrvMsg(scrn->scrnIndex, X_INFO, "MemoryBandwidth == %d\n", ulMemoryBandwidth); + xf86DrvMsg(scrn->scrnIndex, X_INFO, "HiPriLvl == %02X\n", ucHiPriLvl); + } + else + { + xf86DrvMsg(scrn->scrnIndex, X_INFO, "Clock == %d\n", state->clock); + xf86DrvMsg(scrn->scrnIndex, X_INFO, "BitsPerPixel == %d\n", scrn->bitsPerPixel); + OUTREG8(0x1FDE, 0x06); + if (pMga->reg_1e24 >= 0x01) + { + OUTREG8(0x1FDF, 0x03); + xf86DrvMsg(scrn->scrnIndex, X_INFO, "HiPriLvl == 03\n"); + } + else + { + OUTREG8(0x1FDF, 0x14); + xf86DrvMsg(scrn->scrnIndex, X_INFO, "HiPriLvl == 14h\n"); + } + } } else vgaHWRestore(scrn, vga, vga_flags & ~VGA_SR_CMAP); |