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