diff options
author | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2010-02-10 15:32:54 +0000 |
---|---|---|
committer | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2010-02-10 15:32:54 +0000 |
commit | b924a4cafb256ae5aa8daa1e2d3ef825c83def64 (patch) | |
tree | f4645194cf92e5e14b04be43c7898ea909d5c117 | |
parent | a89fe6a2c1f2d911f9c03f703e6ca7027e89c622 (diff) |
Fix bug with suspend and VT switch on VX800 chipset and 64bit systems
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/via_driver.h | 2 | ||||
-rw-r--r-- | src/via_video.c | 75 | ||||
-rw-r--r-- | src/via_video.h | 6 |
4 files changed, 77 insertions, 15 deletions
@@ -1,3 +1,12 @@ +2010-02-10 Bartosz Kosiorek <gang65@poczta.onet.pl> + + Fix bug with suspend and VT switch on VX800 and 64bit systems + + * src/via_driver.h: + * src/via_video.c: (viaResetVideo), (viaSaveVideo), + (viaRestoreVideo), (viaExitVideo): + * src/via_video.h: + 2010-01-24 Bartosz Kosiorek <gang65@poczta.onet.pl> Fix starting address restore and save (initial 64-bit support) diff --git a/src/via_driver.h b/src/via_driver.h index 15b551c..9e31b98 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -419,10 +419,10 @@ typedef struct _VIA { Bool PrintVGARegs; Bool PrintTVRegs; Bool I2CScan; +#endif /* HAVE_DEBUG */ Bool UseLegacyModeSwitch ; video_via_regs* VideoRegs ; -#endif /* HAVE_DEBUG */ } VIARec, *VIAPtr; #define VIAPTR(p) ((VIAPtr)((p)->driverPrivate)) diff --git a/src/via_video.c b/src/via_video.c index 00a8861..94ae300 100644 --- a/src/via_video.c +++ b/src/via_video.c @@ -466,8 +466,8 @@ viaResetVideo(ScrnInfoPtr pScrn) viaVidEng->video1_ctl = 0; viaVidEng->video3_ctl = 0; - viaVidEng->compose = 0x80000000; - viaVidEng->compose = 0x40000000; + viaVidEng->compose = V1_COMMAND_FIRE; + viaVidEng->compose = V3_COMMAND_FIRE; viaVidEng->color_key = 0x821; viaVidEng->snd_color_key = 0x821; @@ -479,16 +479,16 @@ viaSaveVideo(ScrnInfoPtr pScrn) VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + DBG_DD(ErrorF(" via_video.c : viaSaveVideo : \n")); /* Save video registers */ - /* TODO: Identify which registers should be saved and restored */ memcpy(pVia->VideoRegs, (void*)viaVidEng, sizeof(video_via_regs)); pVia->dwV1 = ((vmmtr) viaVidEng)->video1_ctl; pVia->dwV3 = ((vmmtr) viaVidEng)->video3_ctl; viaVidEng->video1_ctl = 0; viaVidEng->video3_ctl = 0; - viaVidEng->compose = 0x80000000; - viaVidEng->compose = 0x40000000; + viaVidEng->compose = V1_COMMAND_FIRE; + viaVidEng->compose = V3_COMMAND_FIRE; } void @@ -496,16 +496,65 @@ viaRestoreVideo(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) pVia->VidMapBase; + video_via_regs *localVidEng = pVia->VideoRegs; + + DBG_DD(ErrorF(" via_video.c : viaRestoreVideo : \n")); /* Restore video registers */ - /* TODO: Identify which registers should be saved and restored */ - memcpy((void*)viaVidEng, pVia->VideoRegs, sizeof(video_via_regs)); - + /* flush restored video engines' setting to VidMapBase */ + + viaVidEng->alphawin_hvstart = localVidEng->alphawin_hvstart; + viaVidEng->alphawin_size = localVidEng->alphawin_size; + viaVidEng->alphawin_ctl = localVidEng->alphawin_ctl; + viaVidEng->alphafb_stride = localVidEng->alphafb_stride; + viaVidEng->color_key = localVidEng->color_key; + viaVidEng->alphafb_addr = localVidEng->alphafb_addr; + viaVidEng->chroma_low = localVidEng->chroma_low; + viaVidEng->chroma_up = localVidEng->chroma_up; + + if (pVia->ChipId != PCI_CHIP_VT3314) + { + /*VT3314 only has V3*/ + viaVidEng->video1_ctl = localVidEng->video1_ctl; + viaVidEng->video1_fetch = localVidEng->video1_fetch; + viaVidEng->video1y_addr1 = localVidEng->video1y_addr1; + viaVidEng->video1_stride = localVidEng->video1_stride; + viaVidEng->video1_hvstart = localVidEng->video1_hvstart; + viaVidEng->video1_size = localVidEng->video1_size; + viaVidEng->video1y_addr2 = localVidEng->video1y_addr2; + viaVidEng->video1_zoom = localVidEng->video1_zoom; + viaVidEng->video1_mictl = localVidEng->video1_mictl; + viaVidEng->video1y_addr0 = localVidEng->video1y_addr0; + viaVidEng->video1_fifo = localVidEng->video1_fifo; + viaVidEng->video1y_addr3 = localVidEng->video1y_addr3; + viaVidEng->v1_source_w_h = localVidEng->v1_source_w_h ; + viaVidEng->video1_CSC1 = localVidEng->video1_CSC1; + viaVidEng->video1_CSC2 = localVidEng->video1_CSC2; + } + viaVidEng->snd_color_key = localVidEng->snd_color_key; + viaVidEng->v3alpha_prefifo = localVidEng->v3alpha_prefifo; + viaVidEng->v3alpha_fifo = localVidEng->v3alpha_fifo; + viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; + viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; + viaVidEng->v3_source_width = localVidEng->v3_source_width; + viaVidEng->video3_ctl = localVidEng->video3_ctl; + viaVidEng->video3_addr0 = localVidEng->video3_addr0; + viaVidEng->video3_addr1 = localVidEng->video3_addr1; + viaVidEng->video3_stride = localVidEng->video3_stride; + viaVidEng->video3_hvstart = localVidEng->video3_hvstart; + viaVidEng->video3_size = localVidEng->video3_size; + viaVidEng->v3alpha_fetch = localVidEng->v3alpha_fetch; + viaVidEng->video3_zoom = localVidEng->video3_zoom; + viaVidEng->video3_mictl = localVidEng->video3_mictl; + viaVidEng->video3_CSC1 = localVidEng->video3_CSC1; + viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; + viaVidEng->compose = localVidEng->compose; + viaVidEng->video1_ctl = pVia->dwV1; viaVidEng->video3_ctl = pVia->dwV3; - viaVidEng->compose = 0x80000000; - viaVidEng->compose = 0x40000000; - + if (pVia->ChipId != PCI_CHIP_VT3314) + viaVidEng->compose = V1_COMMAND_FIRE; + viaVidEng->compose = V3_COMMAND_FIRE; } void @@ -524,8 +573,8 @@ viaExitVideo(ScrnInfoPtr pScrn) viaVidEng->video1_ctl = 0; viaVidEng->video3_ctl = 0; - viaVidEng->compose = 0x80000000; - viaVidEng->compose = 0x40000000; + viaVidEng->compose = V1_COMMAND_FIRE; + viaVidEng->compose = V3_COMMAND_FIRE; /* * Free all adaptor info allocated in viaInitVideo. diff --git a/src/via_video.h b/src/via_video.h index 47a4d24..feb600d 100644 --- a/src/via_video.h +++ b/src/via_video.h @@ -44,6 +44,10 @@ #define VIDEO_BPP 2 + +#define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */ +#define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */ + typedef struct { CARD32 interruptflag; /* 200 */ @@ -89,7 +93,7 @@ typedef struct CARD32 video3_ctl; /* 2a0 */ CARD32 video3_addr0; /* 2a4 */ CARD32 video3_addr1; /* 2a8 */ - CARD32 video3_stribe; /* 2ac */ + CARD32 video3_stride; /* 2ac */ CARD32 video3_hvstart; /* 2b0 */ CARD32 video3_size; /* 2b4 */ CARD32 v3alpha_fetch; /* 2b8 */ |