savage_streams.c revision ab47cfaa
1ab47cfaaSmrg/* 2ab47cfaaSmrg * Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved. 3ab47cfaaSmrg * Copyright (c) 2003-2006, X.Org Foundation 4ab47cfaaSmrg * 5ab47cfaaSmrg * Permission is hereby granted, free of charge, to any person obtaining a 6ab47cfaaSmrg * copy of this software and associated documentation files (the "Software"), 7ab47cfaaSmrg * to deal in the Software without restriction, including without limitation 8ab47cfaaSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9ab47cfaaSmrg * and/or sell copies of the Software, and to permit persons to whom the 10ab47cfaaSmrg * Software is furnished to do so, subject to the following conditions: 11ab47cfaaSmrg * 12ab47cfaaSmrg * The above copyright notice and this permission notice shall be included in 13ab47cfaaSmrg * all copies or substantial portions of the Software. 14ab47cfaaSmrg * 15ab47cfaaSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16ab47cfaaSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17ab47cfaaSmrg * FITESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18ab47cfaaSmrg * COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19ab47cfaaSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20ab47cfaaSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21ab47cfaaSmrg * DEALINGS IN THE SOFTWARE. 22ab47cfaaSmrg * 23ab47cfaaSmrg * Except as contained in this notice, the name of the copyright holder(s) 24ab47cfaaSmrg * and author(s) shall not be used in advertising or otherwise to promote 25ab47cfaaSmrg * the sale, use or other dealings in this Software without prior written 26ab47cfaaSmrg * authorization from the copyright holder(s) and author(s). 27ab47cfaaSmrg */ 28ab47cfaaSmrg 29ab47cfaaSmrg#ifdef HAVE_CONFIG_H 30ab47cfaaSmrg#include "config.h" 31ab47cfaaSmrg#endif 32ab47cfaaSmrg 33ab47cfaaSmrg#include <X11/extensions/Xv.h> 34ab47cfaaSmrg#include "dix.h" 35ab47cfaaSmrg#include "dixstruct.h" 36ab47cfaaSmrg 37ab47cfaaSmrg#include "savage_driver.h" 38ab47cfaaSmrg#include "savage_streams.h" 39ab47cfaaSmrg 40ab47cfaaSmrg#define STREAMS_TRACE 4 41ab47cfaaSmrg 42ab47cfaaSmrgstatic void OverlayTwisterInit(ScrnInfoPtr pScrn); 43ab47cfaaSmrgstatic void OverlayParamInit(ScrnInfoPtr pScrn); 44ab47cfaaSmrgstatic void InitStreamsForExpansion(ScrnInfoPtr pScrn); 45ab47cfaaSmrgstatic void PatchEnableSPofPanel(ScrnInfoPtr pScrn); 46ab47cfaaSmrg 47ab47cfaaSmrgstatic void 48ab47cfaaSmrgSavageInitSecondaryStreamOld(ScrnInfoPtr pScrn) 49ab47cfaaSmrg{ 50ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 51ab47cfaaSmrg vgaHWPtr hwp; 52ab47cfaaSmrg unsigned short vgaIOBase, vgaCRIndex, vgaCRReg; 53ab47cfaaSmrg int offset = (psav->FBStart2nd - psav->FBStart); 54ab47cfaaSmrg int colorkey = pScrn->colorKey; 55ab47cfaaSmrg int pitch = pScrn->displayWidth * DEPTH_BPP(DEPTH_2ND(pScrn))/8; 56ab47cfaaSmrg CARD8 cr92; 57ab47cfaaSmrg 58ab47cfaaSmrg hwp = VGAHWPTR(pScrn); 59ab47cfaaSmrg vgaHWGetIOBase(hwp); 60ab47cfaaSmrg vgaIOBase = hwp->IOBase; 61ab47cfaaSmrg vgaCRIndex = vgaIOBase + 4; 62ab47cfaaSmrg vgaCRReg = vgaIOBase + 5; 63ab47cfaaSmrg 64ab47cfaaSmrg OUTREG(COL_CHROMA_KEY_CONTROL_REG, 0x37000000 | (colorkey & 0xFF)); 65ab47cfaaSmrg OUTREG(CHROMA_KEY_UPPER_BOUND_REG, 0x00000000 | (colorkey & 0xFF)); 66ab47cfaaSmrg OUTREG(BLEND_CONTROL_REG, 0x05000000 ); 67ab47cfaaSmrg OUTREG(SSTREAM_CONTROL_REG, SSTREAMS_MODE(DEPTH_BPP(DEPTH_2ND(pScrn))) 68ab47cfaaSmrg << 24 | pScrn->displayWidth ); 69ab47cfaaSmrg OUTREG(SSTREAM_STRETCH_REG, 1 << 15); 70ab47cfaaSmrg OUTREG(SSTREAM_VSCALE_REG, 1 << 15); 71ab47cfaaSmrg OUTREG(SSTREAM_LINES_REG, pScrn->virtualY ); 72ab47cfaaSmrg OUTREG(SSTREAM_VINITIAL_REG, 0 ); 73ab47cfaaSmrg OUTREG(SSTREAM_FBADDR0_REG, offset & 0x1ffffff & ~BASE_PAD); 74ab47cfaaSmrg OUTREG(SSTREAM_FBADDR1_REG, 0 ); 75ab47cfaaSmrg 76ab47cfaaSmrg OUTREG(SSTREAM_STRIDE_REG, pitch); 77ab47cfaaSmrg OUTREG(SSTREAM_WINDOW_START_REG, OS_XY(0,0)); 78ab47cfaaSmrg OUTREG(SSTREAM_WINDOW_SIZE_REG, 79ab47cfaaSmrg OS_WH(pScrn->displayWidth, pScrn->virtualY)); 80ab47cfaaSmrg 81ab47cfaaSmrg pitch = (pitch + 7) / 8; 82ab47cfaaSmrg VGAOUT8(vgaCRIndex, 0x92); 83ab47cfaaSmrg cr92 = VGAIN8(vgaCRReg); 84ab47cfaaSmrg VGAOUT8(vgaCRReg, (cr92 & 0x40) | (pitch >> 8) | 0x80); 85ab47cfaaSmrg VGAOUT8(vgaCRIndex, 0x93); 86ab47cfaaSmrg VGAOUT8(vgaCRReg, pitch); 87ab47cfaaSmrg OUTREG(STREAMS_FIFO_REG, 2 | 25 << 5 | 32 << 11); 88ab47cfaaSmrg} 89ab47cfaaSmrg 90ab47cfaaSmrgstatic void 91ab47cfaaSmrgSavageInitSecondaryStreamNew(ScrnInfoPtr pScrn) 92ab47cfaaSmrg{ 93ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 94ab47cfaaSmrg vgaHWPtr hwp; 95ab47cfaaSmrg unsigned short vgaIOBase, vgaCRIndex, vgaCRReg; 96ab47cfaaSmrg int offset = (psav->FBStart2nd - psav->FBStart); 97ab47cfaaSmrg int colorkey = pScrn->colorKey; 98ab47cfaaSmrg int pitch = pScrn->displayWidth * DEPTH_BPP(DEPTH_2ND(pScrn))/8; 99ab47cfaaSmrg CARD8 cr92; 100ab47cfaaSmrg 101ab47cfaaSmrg hwp = VGAHWPTR(pScrn); 102ab47cfaaSmrg 103ab47cfaaSmrg vgaHWGetIOBase(hwp); 104ab47cfaaSmrg vgaIOBase = hwp->IOBase; 105ab47cfaaSmrg vgaCRIndex = vgaIOBase + 4; 106ab47cfaaSmrg vgaCRReg = vgaIOBase + 5; 107ab47cfaaSmrg 108ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_LOW, 0x47000000 | (colorkey & 0xFF)); 109ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_UPPER, 0x47000000 | (colorkey & 0xFF)); 110ab47cfaaSmrg OUTREG( BLEND_CONTROL, SSTREAMS_MODE(DEPTH_BPP(DEPTH_2ND(pScrn))) << 9 111ab47cfaaSmrg | 0x08 ); 112ab47cfaaSmrg if( psav->Chipset == S3_SAVAGE2000 ) { 113ab47cfaaSmrg OUTREG(SEC_STREAM_HSCALING, 1 << 15); 114ab47cfaaSmrg OUTREG(SEC_STREAM_HSCALE_NORMALIZE, 2048 << 16 ); 115ab47cfaaSmrg OUTREG(SEC_STREAM_VSCALING, 1 << 15); 116ab47cfaaSmrg } else { 117ab47cfaaSmrg OUTREG(SEC_STREAM_HSCALING,((pScrn->displayWidth &0xfff)<<20) | 1<<15); 118ab47cfaaSmrg /* BUGBUG need to add 00040000 if src stride > 2048 */ 119ab47cfaaSmrg OUTREG(SEC_STREAM_VSCALING,((pScrn->virtualY &0xfff)<<20) | 1<<15); 120ab47cfaaSmrg } 121ab47cfaaSmrg 122ab47cfaaSmrg OUTREG(SEC_STREAM_FBUF_ADDR0, offset & (0x7ffffff & ~BASE_PAD)); 123ab47cfaaSmrg OUTREG(SEC_STREAM_STRIDE, pitch); 124ab47cfaaSmrg OUTREG(SEC_STREAM_WINDOW_START, OS_XY(0,0)); 125ab47cfaaSmrg /* ? width may need to be increased by 1 */ 126ab47cfaaSmrg OUTREG(SEC_STREAM_WINDOW_SZ, OS_WH(pScrn->displayWidth, pScrn->virtualY)); 127ab47cfaaSmrg 128ab47cfaaSmrg pitch = (pitch + 7) / 8; 129ab47cfaaSmrg VGAOUT8(vgaCRIndex, 0x92); 130ab47cfaaSmrg cr92 = VGAIN8(vgaCRReg); 131ab47cfaaSmrg VGAOUT8(vgaCRReg, (cr92 & 0x40) | (pitch >> 8) | 0x80); 132ab47cfaaSmrg VGAOUT8(vgaCRIndex, 0x93); 133ab47cfaaSmrg VGAOUT8(vgaCRReg, pitch); 134ab47cfaaSmrg} 135ab47cfaaSmrg 136ab47cfaaSmrgvoid 137ab47cfaaSmrgSavageInitSecondaryStream(ScrnInfoPtr pScrn) 138ab47cfaaSmrg{ 139ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 140ab47cfaaSmrg 141ab47cfaaSmrg if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) || 142ab47cfaaSmrg (psav->Chipset == S3_SAVAGE2000) ) 143ab47cfaaSmrg SavageInitSecondaryStreamNew(pScrn); 144ab47cfaaSmrg else 145ab47cfaaSmrg SavageInitSecondaryStreamOld(pScrn); 146ab47cfaaSmrg} 147ab47cfaaSmrg 148ab47cfaaSmrgvoid SavageInitStreamsOld(ScrnInfoPtr pScrn) 149ab47cfaaSmrg{ 150ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 151ab47cfaaSmrg /*unsigned long jDelta;*/ 152ab47cfaaSmrg unsigned long format = 0; 153ab47cfaaSmrg 154ab47cfaaSmrg /* 155ab47cfaaSmrg * For the OLD streams engine, several of these registers 156ab47cfaaSmrg * cannot be touched unless streams are on. Seems backwards to me; 157ab47cfaaSmrg * I'd want to set 'em up, then cut 'em loose. 158ab47cfaaSmrg */ 159ab47cfaaSmrg 160ab47cfaaSmrg xf86ErrorFVerb(STREAMS_TRACE, "SavageInitStreams\n" ); 161ab47cfaaSmrg 162ab47cfaaSmrg if (psav->FBStart2nd) { 163ab47cfaaSmrg unsigned long jDelta = pScrn->displayWidth; 164ab47cfaaSmrg format = 0 << 24; 165ab47cfaaSmrg OUTREG( PSTREAM_STRIDE_REG, jDelta ); 166ab47cfaaSmrg OUTREG( PSTREAM_FBSIZE_REG, jDelta * pScrn->virtualY >> 3 ); 167ab47cfaaSmrg OUTREG( PSTREAM_FBADDR0_REG, pScrn->fbOffset ); 168ab47cfaaSmrg OUTREG( PSTREAM_FBADDR1_REG, 0 ); 169ab47cfaaSmrg } else { 170ab47cfaaSmrg /*jDelta = pScrn->displayWidth * (pScrn->bitsPerPixel + 7) / 8;*/ 171ab47cfaaSmrg switch( pScrn->depth ) { 172ab47cfaaSmrg case 8: format = 0 << 24; break; 173ab47cfaaSmrg case 15: format = 3 << 24; break; 174ab47cfaaSmrg case 16: format = 5 << 24; break; 175ab47cfaaSmrg case 24: format = 7 << 24; break; 176ab47cfaaSmrg } 177ab47cfaaSmrg OUTREG(PSTREAM_FBSIZE_REG, 178ab47cfaaSmrg pScrn->virtualY * pScrn->virtualX * (pScrn->bitsPerPixel >> 3)); 179ab47cfaaSmrg } 180ab47cfaaSmrg 181ab47cfaaSmrg OUTREG(FIFO_CONTROL, 0x18ffeL); 182ab47cfaaSmrg 183ab47cfaaSmrg OUTREG( PSTREAM_WINDOW_START_REG, OS_XY(0,0) ); 184ab47cfaaSmrg OUTREG( PSTREAM_WINDOW_SIZE_REG, OS_WH(pScrn->displayWidth, pScrn->virtualY) ); 185ab47cfaaSmrg/* OUTREG( PSTREAM_FBADDR0_REG, pScrn->fbOffset ); 186ab47cfaaSmrg OUTREG( PSTREAM_FBADDR1_REG, 0 ); */ 187ab47cfaaSmrg /*OUTREG( PSTREAM_STRIDE_REG, jDelta );*/ 188ab47cfaaSmrg OUTREG( PSTREAM_CONTROL_REG, format ); 189ab47cfaaSmrg /*OUTREG( PSTREAM_FBSIZE_REG, jDelta * pScrn->virtualY >> 3 );*/ 190ab47cfaaSmrg 191ab47cfaaSmrg OUTREG( COL_CHROMA_KEY_CONTROL_REG, 0 ); 192ab47cfaaSmrg OUTREG( SSTREAM_CONTROL_REG, 0 ); 193ab47cfaaSmrg OUTREG( CHROMA_KEY_UPPER_BOUND_REG, 0 ); 194ab47cfaaSmrg OUTREG( SSTREAM_STRETCH_REG, 0 ); 195ab47cfaaSmrg OUTREG( COLOR_ADJUSTMENT_REG, 0 ); 196ab47cfaaSmrg OUTREG( BLEND_CONTROL_REG, 1 << 24 ); 197ab47cfaaSmrg OUTREG( DOUBLE_BUFFER_REG, 0 ); 198ab47cfaaSmrg OUTREG( SSTREAM_FBADDR0_REG, 0 ); 199ab47cfaaSmrg OUTREG( SSTREAM_FBADDR1_REG, 0 ); 200ab47cfaaSmrg OUTREG( SSTREAM_FBADDR2_REG, 0 ); 201ab47cfaaSmrg OUTREG( SSTREAM_FBSIZE_REG, 0 ); 202ab47cfaaSmrg OUTREG( SSTREAM_STRIDE_REG, 0 ); 203ab47cfaaSmrg OUTREG( SSTREAM_VSCALE_REG, 0 ); 204ab47cfaaSmrg OUTREG( SSTREAM_LINES_REG, 0 ); 205ab47cfaaSmrg OUTREG( SSTREAM_VINITIAL_REG, 0 ); 206ab47cfaaSmrg OUTREG( SSTREAM_WINDOW_START_REG, OS_XY(0xfffe, 0xfffe) ); 207ab47cfaaSmrg OUTREG( SSTREAM_WINDOW_SIZE_REG, OS_WH(10,2) ); 208ab47cfaaSmrg 209ab47cfaaSmrg if (S3_MOBILE_TWISTER_SERIES(psav->Chipset) && 210ab47cfaaSmrg psav->FPExpansion) { 211ab47cfaaSmrg OverlayTwisterInit(pScrn); 212ab47cfaaSmrg } 213ab47cfaaSmrg} 214ab47cfaaSmrg 215ab47cfaaSmrgvoid SavageInitStreamsNew(ScrnInfoPtr pScrn) 216ab47cfaaSmrg{ 217ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 218ab47cfaaSmrg /*unsigned long jDelta;*/ 219ab47cfaaSmrg 220ab47cfaaSmrg xf86ErrorFVerb(STREAMS_TRACE, "SavageInitStreams\n" ); 221ab47cfaaSmrg 222ab47cfaaSmrg if ( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) && 223ab47cfaaSmrg (psav->DisplayType == MT_LCD) && 224ab47cfaaSmrg !psav->CrtOnly && 225ab47cfaaSmrg !psav->TvOn ) 226ab47cfaaSmrg { 227ab47cfaaSmrg OverlayParamInit( pScrn ); 228ab47cfaaSmrg } 229ab47cfaaSmrg 230ab47cfaaSmrg if (psav->IsSecondary) { 231ab47cfaaSmrg OUTREG(PRI_STREAM2_BUFFERSIZE, 232ab47cfaaSmrg pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); 233ab47cfaaSmrg } else if (psav->IsPrimary){ 234ab47cfaaSmrg OUTREG(PRI_STREAM_BUFFERSIZE, 235ab47cfaaSmrg pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); 236ab47cfaaSmrg } else { 237ab47cfaaSmrg OUTREG(PRI_STREAM_BUFFERSIZE, 238ab47cfaaSmrg pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); 239ab47cfaaSmrg#if 0 240ab47cfaaSmrg OUTREG(PRI_STREAM2_BUFFERSIZE, 241ab47cfaaSmrg pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); 242ab47cfaaSmrg#endif 243ab47cfaaSmrg } 244ab47cfaaSmrg 245ab47cfaaSmrg if (psav->FBStart2nd) { 246ab47cfaaSmrg unsigned long jDelta = pScrn->displayWidth; 247ab47cfaaSmrg OUTREG( PRI_STREAM_BUFFERSIZE, jDelta * pScrn->virtualY >> 3 ); 248ab47cfaaSmrg OUTREG( PRI_STREAM_FBUF_ADDR0, pScrn->fbOffset ); 249ab47cfaaSmrg OUTREG( PRI_STREAM_STRIDE, jDelta ); 250ab47cfaaSmrg } 251ab47cfaaSmrg 252ab47cfaaSmrg if (psav->IsSecondary) { 253ab47cfaaSmrg OUTREG( SEC_STREAM2_CKEY_LOW, 0 ); 254ab47cfaaSmrg OUTREG( SEC_STREAM2_CKEY_UPPER, 0 ); 255ab47cfaaSmrg OUTREG( SEC_STREAM2_HSCALING, 0 ); 256ab47cfaaSmrg OUTREG( SEC_STREAM2_VSCALING, 0 ); 257ab47cfaaSmrg OUTREG( BLEND_CONTROL, 0 ); 258ab47cfaaSmrg OUTREG( SEC_STREAM2_FBUF_ADDR0, 0 ); 259ab47cfaaSmrg OUTREG( SEC_STREAM2_FBUF_ADDR1, 0 ); 260ab47cfaaSmrg OUTREG( SEC_STREAM2_FBUF_ADDR2, 0 ); 261ab47cfaaSmrg OUTREG( SEC_STREAM2_WINDOW_START, 0 ); 262ab47cfaaSmrg OUTREG( SEC_STREAM2_WINDOW_SZ, 0 ); 263ab47cfaaSmrg/* OUTREG( SEC_STREAM2_BUFFERSIZE, 0 ); */ 264ab47cfaaSmrg OUTREG( SEC_STREAM2_OPAQUE_OVERLAY, 0 ); 265ab47cfaaSmrg OUTREG( SEC_STREAM2_STRIDE_LPB, 0 ); 266ab47cfaaSmrg 267ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 268ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT1, 0x0000C892 ); 269ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT2, 0x00039F9A ); 270ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT3, 0x01F1547E ); 271ab47cfaaSmrg } else if (psav->IsPrimary) { 272ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_LOW, 0 ); 273ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_UPPER, 0 ); 274ab47cfaaSmrg OUTREG( SEC_STREAM_HSCALING, 0 ); 275ab47cfaaSmrg OUTREG( SEC_STREAM_VSCALING, 0 ); 276ab47cfaaSmrg OUTREG( BLEND_CONTROL, 0 ); 277ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR0, 0 ); 278ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR1, 0 ); 279ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR2, 0 ); 280ab47cfaaSmrg OUTREG( SEC_STREAM_WINDOW_START, 0 ); 281ab47cfaaSmrg OUTREG( SEC_STREAM_WINDOW_SZ, 0 ); 282ab47cfaaSmrg/* OUTREG( SEC_STREAM_BUFFERSIZE, 0 ); */ 283ab47cfaaSmrg OUTREG( SEC_STREAM_TILE_OFF, 0 ); 284ab47cfaaSmrg OUTREG( SEC_STREAM_OPAQUE_OVERLAY, 0 ); 285ab47cfaaSmrg OUTREG( SEC_STREAM_STRIDE, 0 ); 286ab47cfaaSmrg 287ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 288ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT1, 0x0000C892 ); 289ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT2, 0x00039F9A ); 290ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT3, 0x01F1547E ); 291ab47cfaaSmrg } else { 292ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_LOW, 0 ); 293ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_UPPER, 0 ); 294ab47cfaaSmrg OUTREG( SEC_STREAM_HSCALING, 0 ); 295ab47cfaaSmrg OUTREG( SEC_STREAM_VSCALING, 0 ); 296ab47cfaaSmrg OUTREG( BLEND_CONTROL, 0 ); 297ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR0, 0 ); 298ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR1, 0 ); 299ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR2, 0 ); 300ab47cfaaSmrg OUTREG( SEC_STREAM_WINDOW_START, 0 ); 301ab47cfaaSmrg OUTREG( SEC_STREAM_WINDOW_SZ, 0 ); 302ab47cfaaSmrg/* OUTREG( SEC_STREAM_BUFFERSIZE, 0 ); */ 303ab47cfaaSmrg OUTREG( SEC_STREAM_TILE_OFF, 0 ); 304ab47cfaaSmrg OUTREG( SEC_STREAM_OPAQUE_OVERLAY, 0 ); 305ab47cfaaSmrg OUTREG( SEC_STREAM_STRIDE, 0 ); 306ab47cfaaSmrg 307ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 308ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT1, 0x0000C892 ); 309ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT2, 0x00039F9A ); 310ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT3, 0x01F1547E ); 311ab47cfaaSmrg#if 0 312ab47cfaaSmrg sleep(1); 313ab47cfaaSmrg OUTREG( SEC_STREAM2_CKEY_LOW, 0 ); 314ab47cfaaSmrg OUTREG( SEC_STREAM2_CKEY_UPPER, 0 ); 315ab47cfaaSmrg OUTREG( SEC_STREAM2_HSCALING, 0 ); 316ab47cfaaSmrg OUTREG( SEC_STREAM2_VSCALING, 0 ); 317ab47cfaaSmrg OUTREG( BLEND_CONTROL, 0 ); 318ab47cfaaSmrg OUTREG( SEC_STREAM2_FBUF_ADDR0, 0 ); 319ab47cfaaSmrg OUTREG( SEC_STREAM2_FBUF_ADDR1, 0 ); 320ab47cfaaSmrg OUTREG( SEC_STREAM2_FBUF_ADDR2, 0 ); 321ab47cfaaSmrg OUTREG( SEC_STREAM2_WINDOW_START, 0 ); 322ab47cfaaSmrg OUTREG( SEC_STREAM2_WINDOW_SZ, 0 ); 323ab47cfaaSmrg/* OUTREG( SEC_STREAM2_BUFFERSIZE, 0 ); */ 324ab47cfaaSmrg OUTREG( SEC_STREAM2_OPAQUE_OVERLAY, 0 ); 325ab47cfaaSmrg OUTREG( SEC_STREAM2_STRIDE_LPB, 0 ); 326ab47cfaaSmrg 327ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 328ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT1, 0x0000C892 ); 329ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT2, 0x00039F9A ); 330ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT3, 0x01F1547E ); 331ab47cfaaSmrg#endif 332ab47cfaaSmrg } 333ab47cfaaSmrg} 334ab47cfaaSmrg 335ab47cfaaSmrgvoid SavageInitStreams2000(ScrnInfoPtr pScrn) 336ab47cfaaSmrg{ 337ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 338ab47cfaaSmrg /*unsigned long jDelta;*/ 339ab47cfaaSmrg 340ab47cfaaSmrg xf86ErrorFVerb(STREAMS_TRACE, "SavageInitStreams\n" ); 341ab47cfaaSmrg 342ab47cfaaSmrg OUTREG(PRI_STREAM_BUFFERSIZE, 343ab47cfaaSmrg pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); 344ab47cfaaSmrg OUTREG(PRI_STREAM2_BUFFERSIZE, 345ab47cfaaSmrg pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); 346ab47cfaaSmrg 347ab47cfaaSmrg 348ab47cfaaSmrg if (psav->FBStart2nd) { 349ab47cfaaSmrg unsigned long jDelta = pScrn->displayWidth; 350ab47cfaaSmrg OUTREG( PRI_STREAM_BUFFERSIZE, jDelta * pScrn->virtualY >> 3 ); 351ab47cfaaSmrg OUTREG( PRI_STREAM_FBUF_ADDR0, pScrn->fbOffset ); 352ab47cfaaSmrg OUTREG( PRI_STREAM_STRIDE, jDelta ); 353ab47cfaaSmrg } 354ab47cfaaSmrg 355ab47cfaaSmrg 356ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_LOW, (4L << 29) ); 357ab47cfaaSmrg OUTREG( SEC_STREAM_CKEY_UPPER, 0 ); 358ab47cfaaSmrg OUTREG( SEC_STREAM_HSCALING, 0 ); 359ab47cfaaSmrg OUTREG( SEC_STREAM_VSCALING, 0 ); 360ab47cfaaSmrg OUTREG(SEC_STREAM2_STRIDE_LPB, 0); 361ab47cfaaSmrg OUTREG( BLEND_CONTROL, 0 ); 362ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR0, 0 ); 363ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR1, 0 ); 364ab47cfaaSmrg OUTREG( SEC_STREAM_FBUF_ADDR2, 0 ); 365ab47cfaaSmrg OUTREG( SEC_STREAM_WINDOW_START, 0 ); 366ab47cfaaSmrg OUTREG( SEC_STREAM_WINDOW_SZ, 0 ); 367ab47cfaaSmrg/* OUTREG( SEC_STREAM_BUFFERSIZE, 0 ); */ 368ab47cfaaSmrg OUTREG( SEC_STREAM_TILE_OFF, 0 ); 369ab47cfaaSmrg OUTREG( SEC_STREAM_OPAQUE_OVERLAY, 0 ); 370ab47cfaaSmrg OUTREG( SEC_STREAM_STRIDE, 0 ); 371ab47cfaaSmrg 372ab47cfaaSmrg /* FIFO related regs */ 373ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x86); 374ab47cfaaSmrg OUTREG8(CRT_DATA_REG,0x2c); 375ab47cfaaSmrg 376ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x87); 377ab47cfaaSmrg OUTREG8(CRT_DATA_REG,0xf8); 378ab47cfaaSmrg 379ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x89); 380ab47cfaaSmrg OUTREG8(CRT_DATA_REG,0x40); 381ab47cfaaSmrg 382ab47cfaaSmrg 383ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 384ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT0_2000, 0x640092 /*0x0000C892*/ ); 385ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT1_2000, 0x19a0000 /*0x00033400*/ ); 386ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT2_2000, 0x001cf /*0x000001CF*/ ); 387ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT3_2000, 0xF8CA007E /*0x01F1547E*/ ); 388ab47cfaaSmrg 389ab47cfaaSmrg} 390ab47cfaaSmrg 391ab47cfaaSmrg/* 392ab47cfaaSmrg * Function to get lcd factor, display offset for overlay use 393ab47cfaaSmrg * Input: pScrn; Output: x,yfactor, displayoffset in pScrn 394ab47cfaaSmrg */ 395ab47cfaaSmrgstatic void OverlayTwisterInit(ScrnInfoPtr pScrn) 396ab47cfaaSmrg{ 397ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 398ab47cfaaSmrg 399ab47cfaaSmrg psav->cxScreen = psav->iResX; 400ab47cfaaSmrg InitStreamsForExpansion(pScrn); 401ab47cfaaSmrg PatchEnableSPofPanel(pScrn); 402ab47cfaaSmrg} 403ab47cfaaSmrg 404ab47cfaaSmrg/* Function to get lcd factor, display offset for overlay use 405ab47cfaaSmrg * Input: pScrn; Output: x,yfactor, displayoffset in pScrn 406ab47cfaaSmrg */ 407ab47cfaaSmrgstatic void OverlayParamInit(ScrnInfoPtr pScrn) 408ab47cfaaSmrg{ 409ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 410ab47cfaaSmrg 411ab47cfaaSmrg psav = SAVPTR(pScrn); 412ab47cfaaSmrg psav->cxScreen = pScrn->currentMode->HDisplay; 413ab47cfaaSmrg InitStreamsForExpansion(pScrn); 414ab47cfaaSmrg} 415ab47cfaaSmrg 416ab47cfaaSmrgstatic 417ab47cfaaSmrgvoid PatchEnableSPofPanel(ScrnInfoPtr pScrn) 418ab47cfaaSmrg{ 419ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 420ab47cfaaSmrg 421ab47cfaaSmrg UnLockExtRegs(); 422ab47cfaaSmrg 423ab47cfaaSmrg if (pScrn->bitsPerPixel == 8) { 424ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x90); 425ab47cfaaSmrg OUTREG8(CRT_DATA_REG,INREG8(CRT_DATA_REG)|0x40); 426ab47cfaaSmrg } 427ab47cfaaSmrg else { 428ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x90); 429ab47cfaaSmrg OUTREG8(CRT_DATA_REG,INREG8(CRT_DATA_REG)|0x48); 430ab47cfaaSmrg } 431ab47cfaaSmrg 432ab47cfaaSmrg VerticalRetraceWait(); 433ab47cfaaSmrg 434ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x67); 435ab47cfaaSmrg OUTREG8(CRT_DATA_REG,(INREG8(CRT_DATA_REG)&0xf3)|0x04); 436ab47cfaaSmrg 437ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x65); 438ab47cfaaSmrg OUTREG8(CRT_DATA_REG,INREG8(CRT_DATA_REG)|0xC0); 439ab47cfaaSmrg 440ab47cfaaSmrg if (pScrn->bitsPerPixel == 8) { 441ab47cfaaSmrg OUTREG32(PSTREAM_CONTROL_REG,0x00000000); 442ab47cfaaSmrg } else { 443ab47cfaaSmrg OUTREG32(PSTREAM_CONTROL_REG,0x02000000); 444ab47cfaaSmrg } 445ab47cfaaSmrg 446ab47cfaaSmrg OUTREG32(PSTREAM_WINDOW_SIZE_REG, 0x0); 447ab47cfaaSmrg /*OUTREG32(PSTREAM_WINDOW_SIZE_REG, OS_WH(pScrn->displayWidth, pScrn->virtualY));*/ 448ab47cfaaSmrg 449ab47cfaaSmrg} 450ab47cfaaSmrg 451ab47cfaaSmrg 452ab47cfaaSmrg/* Function to calculate lcd expansion x,y factor and offset for overlay 453ab47cfaaSmrg */ 454ab47cfaaSmrgstatic void InitStreamsForExpansion(ScrnInfoPtr pScrn) 455ab47cfaaSmrg{ 456ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 457ab47cfaaSmrg int PanelSizeX,PanelSizeY; 458ab47cfaaSmrg int ViewPortWidth,ViewPortHeight; 459ab47cfaaSmrg int XExpansion, YExpansion; 460ab47cfaaSmrg int XFactor, YFactor; 461ab47cfaaSmrg int Hstate, Vstate; 462ab47cfaaSmrg 463ab47cfaaSmrg static CARD32 Xfactors[] = { 464ab47cfaaSmrg 0x00010001, 465ab47cfaaSmrg 0x00010001, /* 1 */ 466ab47cfaaSmrg 0, 467ab47cfaaSmrg 0x00090008, /* 3 */ 468ab47cfaaSmrg 0x00050004, /* 4 */ 469ab47cfaaSmrg 0, 470ab47cfaaSmrg 0x00030002, /* 6 */ 471ab47cfaaSmrg 0x00020001 /* 7 */ 472ab47cfaaSmrg }; 473ab47cfaaSmrg 474ab47cfaaSmrg static CARD32 Yfactors[] = { 475ab47cfaaSmrg 0x00010001, 0x00010001, 476ab47cfaaSmrg 0, 0x00060005, 477ab47cfaaSmrg 0x00050004, 0x00040003, 478ab47cfaaSmrg 0, 0x00030002, 479ab47cfaaSmrg 0x00020001, 0x00050002, 480ab47cfaaSmrg 0x000C0005, 0x00080003, 481ab47cfaaSmrg 0x00090004, 0, 482ab47cfaaSmrg 0x00030001, 0x00040001, 483ab47cfaaSmrg }; 484ab47cfaaSmrg 485ab47cfaaSmrg 486ab47cfaaSmrg 487ab47cfaaSmrg PanelSizeX = psav->PanelX; 488ab47cfaaSmrg PanelSizeY = psav->PanelY; 489ab47cfaaSmrg ViewPortWidth = pScrn->currentMode->HDisplay; 490ab47cfaaSmrg ViewPortHeight = pScrn->currentMode->VDisplay; 491ab47cfaaSmrg 492ab47cfaaSmrg if( PanelSizeX == 1408 ) 493ab47cfaaSmrg PanelSizeX = 1400; 494ab47cfaaSmrg 495ab47cfaaSmrg XExpansion = 0x00010001; 496ab47cfaaSmrg YExpansion = 0x00010001; 497ab47cfaaSmrg 498ab47cfaaSmrg psav->displayXoffset = 0; 499ab47cfaaSmrg psav->displayYoffset = 0; 500ab47cfaaSmrg 501ab47cfaaSmrg VGAOUT8(0x3C4, HZEXP_COMP_1); 502ab47cfaaSmrg Hstate = VGAIN8(0x3C5); 503ab47cfaaSmrg VGAOUT8(0x3C4, VTEXP_COMP_1); 504ab47cfaaSmrg Vstate = VGAIN8(0x3C5); 505ab47cfaaSmrg VGAOUT8(0x3C4, HZEXP_FACTOR_IGA1); 506ab47cfaaSmrg XFactor = VGAIN8(0x3C5); 507ab47cfaaSmrg VGAOUT8(0x3C4, VTEXP_FACTOR_IGA1); 508ab47cfaaSmrg YFactor = VGAIN8(0x3C5); 509ab47cfaaSmrg 510ab47cfaaSmrg if( Hstate & EC1_EXPAND_ON ) 511ab47cfaaSmrg { 512ab47cfaaSmrg XExpansion = Xfactors[XFactor>>4]; 513ab47cfaaSmrg } 514ab47cfaaSmrg 515ab47cfaaSmrg if( Vstate & EC1_EXPAND_ON ) 516ab47cfaaSmrg { 517ab47cfaaSmrg YExpansion = Yfactors[YFactor>>4]; 518ab47cfaaSmrg } 519ab47cfaaSmrg 520ab47cfaaSmrg psav->XExp1 = XExpansion >> 16; 521ab47cfaaSmrg psav->XExp2 = XExpansion & 0xFFFF; 522ab47cfaaSmrg 523ab47cfaaSmrg psav->YExp1 = YExpansion >> 16; 524ab47cfaaSmrg psav->YExp2 = YExpansion & 0xFFFF; 525ab47cfaaSmrg 526ab47cfaaSmrg psav->displayXoffset = 527ab47cfaaSmrg ((PanelSizeX - (psav->XExp1 * ViewPortWidth) / psav->XExp2) / 2 + 7) & 0xfff8; 528ab47cfaaSmrg psav->displayYoffset = 529ab47cfaaSmrg ((PanelSizeY - (psav->YExp1 * ViewPortHeight) / psav->YExp2) / 2); 530ab47cfaaSmrg 531ab47cfaaSmrg} /* InitStreamsForExpansionPM */ 532ab47cfaaSmrg 533ab47cfaaSmrgvoid 534ab47cfaaSmrgSavageStreamsOn(ScrnInfoPtr pScrn) 535ab47cfaaSmrg{ 536ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 537ab47cfaaSmrg unsigned char jStreamsControl; 538ab47cfaaSmrg unsigned short vgaCRIndex = psav->vgaIOBase + 4; 539ab47cfaaSmrg unsigned short vgaCRReg = psav->vgaIOBase + 5; 540ab47cfaaSmrg 541ab47cfaaSmrg xf86ErrorFVerb(STREAMS_TRACE, "SavageStreamsOn\n" ); 542ab47cfaaSmrg 543ab47cfaaSmrg /* Sequence stolen from streams.c in M7 NT driver */ 544ab47cfaaSmrg 545ab47cfaaSmrg 546ab47cfaaSmrg xf86EnableIO(); 547ab47cfaaSmrg 548ab47cfaaSmrg /* Unlock extended registers. */ 549ab47cfaaSmrg 550ab47cfaaSmrg VGAOUT16(vgaCRIndex, 0x4838); 551ab47cfaaSmrg VGAOUT16(vgaCRIndex, 0xa039); 552ab47cfaaSmrg VGAOUT16(0x3c4, 0x0608); 553ab47cfaaSmrg 554ab47cfaaSmrg VGAOUT8( vgaCRIndex, EXT_MISC_CTRL2 ); 555ab47cfaaSmrg 556ab47cfaaSmrg if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ) 557ab47cfaaSmrg { 558ab47cfaaSmrg SavageInitStreamsNew( pScrn ); 559ab47cfaaSmrg 560ab47cfaaSmrg jStreamsControl = VGAIN8( vgaCRReg ) | ENABLE_STREAM1; 561ab47cfaaSmrg 562ab47cfaaSmrg if (psav->IsSecondary) { 563ab47cfaaSmrg SelectIGA2(); 564ab47cfaaSmrg /* Wait for VBLANK. */ 565ab47cfaaSmrg VerticalRetraceWait(); 566ab47cfaaSmrg /* Fire up streams! */ 567ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 568ab47cfaaSmrg SelectIGA1(); 569ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 570ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT1, 0x0000C892 ); 571ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT2, 0x00039F9A ); 572ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT3, 0x01F1547E ); 573ab47cfaaSmrg } else if (psav->IsPrimary) { 574ab47cfaaSmrg /* Wait for VBLANK. */ 575ab47cfaaSmrg VerticalRetraceWait(); 576ab47cfaaSmrg /* Fire up streams! */ 577ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 578ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 579ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT1, 0x0000C892 ); 580ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT2, 0x00039F9A ); 581ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT3, 0x01F1547E ); 582ab47cfaaSmrg } else { 583ab47cfaaSmrg /* Wait for VBLANK. */ 584ab47cfaaSmrg VerticalRetraceWait(); 585ab47cfaaSmrg /* Fire up streams! */ 586ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 587ab47cfaaSmrg#if 0 588ab47cfaaSmrg SelectIGA2(); 589ab47cfaaSmrg /* Wait for VBLANK. */ 590ab47cfaaSmrg VerticalRetraceWait(); 591ab47cfaaSmrg /* Fire up streams! */ 592ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 593ab47cfaaSmrg SelectIGA1(); 594ab47cfaaSmrg#endif 595ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 596ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT1, 0x0000C892 ); 597ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT2, 0x00039F9A ); 598ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT3, 0x01F1547E ); 599ab47cfaaSmrg#if 0 600ab47cfaaSmrg sleep(1); 601ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT1, 0x0000C892 ); 602ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT2, 0x00039F9A ); 603ab47cfaaSmrg OUTREG( SEC_STREAM2_COLOR_CONVERT3, 0x01F1547E ); 604ab47cfaaSmrg#endif 605ab47cfaaSmrg } 606ab47cfaaSmrg } 607ab47cfaaSmrg else if (psav->Chipset == S3_SAVAGE2000) 608ab47cfaaSmrg { 609ab47cfaaSmrg SavageInitStreams2000( pScrn ); 610ab47cfaaSmrg 611ab47cfaaSmrg jStreamsControl = VGAIN8( vgaCRReg ) | ENABLE_STREAM1; 612ab47cfaaSmrg 613ab47cfaaSmrg /* Wait for VBLANK. */ 614ab47cfaaSmrg VerticalRetraceWait(); 615ab47cfaaSmrg /* Fire up streams! */ 616ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 617ab47cfaaSmrg /* These values specify brightness, contrast, saturation and hue. */ 618ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT0_2000, 0x0000C892 ); 619ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT1_2000, 0x00033400 ); 620ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT2_2000, 0x000001CF ); 621ab47cfaaSmrg OUTREG( SEC_STREAM_COLOR_CONVERT3_2000, 0x01F1547E ); 622ab47cfaaSmrg } 623ab47cfaaSmrg else 624ab47cfaaSmrg { 625ab47cfaaSmrg jStreamsControl = VGAIN8( vgaCRReg ) | ENABLE_STREAMS_OLD; 626ab47cfaaSmrg 627ab47cfaaSmrg /* Wait for VBLANK. */ 628ab47cfaaSmrg 629ab47cfaaSmrg VerticalRetraceWait(); 630ab47cfaaSmrg 631ab47cfaaSmrg /* Fire up streams! */ 632ab47cfaaSmrg 633ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 634ab47cfaaSmrg 635ab47cfaaSmrg SavageInitStreamsOld( pScrn ); 636ab47cfaaSmrg } 637ab47cfaaSmrg 638ab47cfaaSmrg /* Wait for VBLANK. */ 639ab47cfaaSmrg 640ab47cfaaSmrg VerticalRetraceWait(); 641ab47cfaaSmrg 642ab47cfaaSmrg /* Turn on secondary stream TV flicker filter, once we support TV. */ 643ab47cfaaSmrg 644ab47cfaaSmrg /* SR70 |= 0x10 */ 645ab47cfaaSmrg 646ab47cfaaSmrg psav->videoFlags |= VF_STREAMS_ON; 647ab47cfaaSmrg 648ab47cfaaSmrg} 649ab47cfaaSmrg 650ab47cfaaSmrgvoid 651ab47cfaaSmrgSavageStreamsOff(ScrnInfoPtr pScrn) 652ab47cfaaSmrg{ 653ab47cfaaSmrg SavagePtr psav = SAVPTR(pScrn); 654ab47cfaaSmrg unsigned char jStreamsControl; 655ab47cfaaSmrg unsigned short vgaCRIndex = psav->vgaIOBase + 4; 656ab47cfaaSmrg unsigned short vgaCRReg = psav->vgaIOBase + 5; 657ab47cfaaSmrg 658ab47cfaaSmrg xf86ErrorFVerb(STREAMS_TRACE, "SavageStreamsOff\n" ); 659ab47cfaaSmrg 660ab47cfaaSmrg xf86EnableIO(); 661ab47cfaaSmrg 662ab47cfaaSmrg /* Unlock extended registers. */ 663ab47cfaaSmrg 664ab47cfaaSmrg VGAOUT16(vgaCRIndex, 0x4838); 665ab47cfaaSmrg VGAOUT16(vgaCRIndex, 0xa039); 666ab47cfaaSmrg VGAOUT16(0x3c4, 0x0608); 667ab47cfaaSmrg 668ab47cfaaSmrg VGAOUT8( vgaCRIndex, EXT_MISC_CTRL2 ); 669ab47cfaaSmrg if( S3_SAVAGE_MOBILE_SERIES(psav->Chipset) || 670ab47cfaaSmrg (psav->Chipset == S3_SAVAGE2000) ) 671ab47cfaaSmrg jStreamsControl = VGAIN8( vgaCRReg ) & NO_STREAMS; 672ab47cfaaSmrg else 673ab47cfaaSmrg jStreamsControl = VGAIN8( vgaCRReg ) & NO_STREAMS_OLD; 674ab47cfaaSmrg 675ab47cfaaSmrg /* Wait for VBLANK. */ 676ab47cfaaSmrg 677ab47cfaaSmrg VerticalRetraceWait(); 678ab47cfaaSmrg 679ab47cfaaSmrg /* Kill streams. */ 680ab47cfaaSmrg if (psav->IsSecondary) { 681ab47cfaaSmrg SelectIGA2(); 682ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 683ab47cfaaSmrg SelectIGA1(); 684ab47cfaaSmrg } else if (psav->IsPrimary) { 685ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 686ab47cfaaSmrg } else { 687ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 688ab47cfaaSmrg#if 0 689ab47cfaaSmrg SelectIGA2(); 690ab47cfaaSmrg VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); 691ab47cfaaSmrg SelectIGA1(); 692ab47cfaaSmrg#endif 693ab47cfaaSmrg } 694ab47cfaaSmrg 695ab47cfaaSmrg VGAOUT16( vgaCRIndex, 0x0093 ); 696ab47cfaaSmrg VGAOUT8( vgaCRIndex, 0x92 ); 697ab47cfaaSmrg VGAOUT8( vgaCRReg, VGAIN8(vgaCRReg) & 0x40 ); 698ab47cfaaSmrg 699ab47cfaaSmrg psav->videoFlags &= ~VF_STREAMS_ON; 700ab47cfaaSmrg 701ab47cfaaSmrg} 702ab47cfaaSmrg 703