102be438aSmrg
202be438aSmrg#ifdef HAVE_CONFIG_H
302be438aSmrg#include "config.h"
402be438aSmrg#endif
502be438aSmrg
602be438aSmrg#include "xf86.h"
702be438aSmrg#include "xf86_OSproc.h"
802be438aSmrg#include "xf86Pci.h"
902be438aSmrg#include "tdfx.h"
1002be438aSmrg
1102be438aSmrg#define AACLKOUTDEL 0x2
1202be438aSmrg#define CFGSWAPALGORITHM 0x1
1302be438aSmrg
1402be438aSmrg/* #define RD_ABORT_ERROR */
1502be438aSmrg#define H3VDD
1602be438aSmrg
1702be438aSmrgBool TDFXDisableSLI(TDFXPtr pTDFX)
1802be438aSmrg{
1902be438aSmrg  int i;
20909209eeSmrg  uint32_t v;
2102be438aSmrg
2202be438aSmrg  for (i=0; i<pTDFX->numChips; i++) {
23880ed95aSmrg      PCI_READ_LONG(v, CFG_INIT_ENABLE, i);
24880ed95aSmrg      PCI_WRITE_LONG(v & ~(CFG_SNOOP_MEMBASE0 | CFG_SNOOP_EN |
25880ed95aSmrg			   CFG_SNOOP_MEMBASE0_EN |
26880ed95aSmrg			   CFG_SNOOP_MEMBASE1_EN | CFG_SNOOP_SLAVE |
27880ed95aSmrg			   CFG_SNOOP_FBIINIT_WR_EN | CFG_SWAP_ALGORITHM |
28880ed95aSmrg			   CFG_SWAP_QUICK),
29880ed95aSmrg		     CFG_INIT_ENABLE, i);
30880ed95aSmrg
31880ed95aSmrg      PCI_READ_LONG(v, CFG_SLI_LFB_CTRL, i);
32880ed95aSmrg      PCI_WRITE_LONG(v & ~(CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN |
33880ed95aSmrg			   CFG_SLI_RD_EN),
34880ed95aSmrg		     CFG_SLI_LFB_CTRL, i);
3502be438aSmrg#ifdef H3VDD
3602be438aSmrg    pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 0);
3702be438aSmrg    pTDFX->writeChipLong(pTDFX, i, SST_3D_AACTRL, 0);
3802be438aSmrg#endif
39880ed95aSmrg
40880ed95aSmrg      PCI_READ_LONG(v, CFG_AA_LFB_CTRL, i);
41880ed95aSmrg      PCI_WRITE_LONG(v & ~(CFG_AA_LFB_CPU_WR_EN | CFG_AA_LFB_DPTCH_WR_EN |
42880ed95aSmrg			   CFG_AA_LFB_RD_EN),
43880ed95aSmrg		     CFG_AA_LFB_CTRL, i);
44880ed95aSmrg
45880ed95aSmrg      PCI_READ_LONG(v, CFG_SLI_AA_MISC, i);
46880ed95aSmrg      PCI_WRITE_LONG((v & ~CFG_VGA_VSYNC_OFFSET) |
47880ed95aSmrg		     (0 << CFG_VGA_VSYNC_OFFSET_PIXELS_SHIFT) |
48880ed95aSmrg		     (0 << CFG_VGA_VSYNC_OFFSET_CHARS_SHIFT) |
49880ed95aSmrg		     (0 << CFG_VGA_VSYNC_OFFSET_HXTRA_SHIFT),
50880ed95aSmrg		     CFG_SLI_AA_MISC, i);
51880ed95aSmrg
52880ed95aSmrg      PCI_WRITE_LONG(0, CFG_VIDEO_CTRL0, i);
53880ed95aSmrg      PCI_WRITE_LONG(0, CFG_VIDEO_CTRL1, i);
54880ed95aSmrg      PCI_WRITE_LONG(0, CFG_VIDEO_CTRL2, i);
5502be438aSmrg
5602be438aSmrg    if (pTDFX->numChips>1) {
5702be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, PCIINIT0);
5802be438aSmrg      pTDFX->writeChipLong(pTDFX, i, PCIINIT0,
5902be438aSmrg			   (v&~(SST_PCI_DISABLE_IO|SST_PCI_DISABLE_MEM|
6002be438aSmrg				SST_PCI_RETRY_INTERVAL)) |
6102be438aSmrg			   (0<<SST_PCI_RETRY_INTERVAL_SHIFT) |
6202be438aSmrg			   SST_PCI_FORCE_FB_HIGH);
6302be438aSmrg    } else {
6402be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, PCIINIT0);
6502be438aSmrg      pTDFX->writeChipLong(pTDFX, i, PCIINIT0,
6602be438aSmrg			   (v&~(SST_PCI_DISABLE_IO|SST_PCI_DISABLE_MEM|
6702be438aSmrg				SST_PCI_RETRY_INTERVAL)) |
6802be438aSmrg			   (0<<SST_PCI_RETRY_INTERVAL_SHIFT));
6902be438aSmrg    }
7002be438aSmrg
7102be438aSmrg#if 0
7202be438aSmrg    if (i>0) {
7302be438aSmrg      pTDFX->writeChipLong(pTDFX, i, DACMODE,
7402be438aSmrg			   SST_DAC_DPMS_ON_VSYNC | SST_DAC_DPMS_ON_HSYNC);
7502be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, VIDPROCCFG);
7602be438aSmrg      pTDFX->writeChipLong(pTDFX, i, VIDPROCCFG, v&~SST_VIDEO_PROCESSOR_EN);
7702be438aSmrg    }
7802be438aSmrg#endif
7902be438aSmrg  }
8002be438aSmrg  return TRUE;
8102be438aSmrg}
8202be438aSmrg
8302be438aSmrgBool TDFXSetupSLI(ScrnInfoPtr pScrn, Bool sliEnable, int aaSamples)
8402be438aSmrg{
8502be438aSmrg  TDFXPtr pTDFX;
86909209eeSmrg  uint32_t v;
87909209eeSmrg  int i, sliLines, sliLinesLog2, nChipsLog2;
8802be438aSmrg  int sli_renderMask, sli_compareMask, sli_scanMask;
8902be438aSmrg  int sliAnalog, dwFormat;
9002be438aSmrg
9102be438aSmrg  pTDFX=TDFXPTR(pScrn);
9202be438aSmrg  if (pScrn->depth == 24 || pScrn->depth==32) {
9302be438aSmrg    if ((aaSamples == 4) && (pTDFX->numChips>1)) {
9402be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_4_ARGB_8888;
9502be438aSmrg    } else if (aaSamples >= 2) {
9602be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_2_ARGB_8888;
9702be438aSmrg    } else {
9802be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_ARGB_8888;
9902be438aSmrg    }
10002be438aSmrg  } else if (pScrn->depth == 16) {
10102be438aSmrg    if ((aaSamples == 4) && (pTDFX->numChips>1)) {
10202be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_4_RGB_565;
10302be438aSmrg    } else if (aaSamples >= 2) {
10402be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_2_RGB_565;
10502be438aSmrg    } else {
10602be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_RGB_565;
10702be438aSmrg    }
10802be438aSmrg  } else if (pScrn->depth == 8) {
10902be438aSmrg    pTDFX->pixelFormat=GR_PIXFMT_I_8;
11002be438aSmrg  }
11102be438aSmrg  if (!sliEnable && !aaSamples) { /* Turn off */
11202be438aSmrg    return TDFXDisableSLI(pTDFX);
11302be438aSmrg  }
11402be438aSmrg
11502be438aSmrg  if (pScrn->virtualY>768) sliLinesLog2=5;
11602be438aSmrg  else sliLinesLog2=4;
11702be438aSmrg  sliLines=1<<sliLinesLog2;
11802be438aSmrg  if (pScrn->virtualY*pScrn->virtualX>1600*1024) sliAnalog=1;
11902be438aSmrg  else sliAnalog=0;
12002be438aSmrg  /* XXX We need to avoid SLI in double scan modes somehow */
12102be438aSmrg
12202be438aSmrg  switch (pTDFX->numChips) {
12302be438aSmrg  case 1:
12402be438aSmrg    nChipsLog2=0;
12502be438aSmrg    break;
12602be438aSmrg  case 2:
12702be438aSmrg    nChipsLog2=1;
12802be438aSmrg    break;
12902be438aSmrg  case 4:
13002be438aSmrg    nChipsLog2=2;
13102be438aSmrg    break;
13202be438aSmrg  default:
13302be438aSmrg    return FALSE;
13402be438aSmrg    /* XXX Huh? Unsupported configuration */
13502be438aSmrg  }
13602be438aSmrg
13702be438aSmrg  for (i=0; i<pTDFX->numChips; i++) {
13802be438aSmrg    /* Do we want to set these differently for a VIA board? */
13902be438aSmrg    v=pTDFX->readChipLong(pTDFX, i, PCIINIT0);
14002be438aSmrg    v=(v&~(SST_PCI_RETRY_INTERVAL|SST_PCI_FORCE_FB_HIGH)) |
14102be438aSmrg		     SST_PCI_READ_WS | SST_PCI_WRITE_WS |
14202be438aSmrg		     SST_PCI_DISABLE_IO | SST_PCI_DISABLE_MEM |
14302be438aSmrg		     (5<<SST_PCI_RETRY_INTERVAL_SHIFT);
14402be438aSmrg    pTDFX->writeChipLong(pTDFX, i, PCIINIT0,
14502be438aSmrg			 (v&~(SST_PCI_RETRY_INTERVAL|SST_PCI_FORCE_FB_HIGH)) |
14602be438aSmrg			 SST_PCI_READ_WS | SST_PCI_WRITE_WS |
14702be438aSmrg			 SST_PCI_DISABLE_IO | SST_PCI_DISABLE_MEM |
14802be438aSmrg			 (5<<SST_PCI_RETRY_INTERVAL_SHIFT));
14902be438aSmrg    v=pTDFX->readChipLong(pTDFX, i, TMUGBEINIT);
15002be438aSmrg    pTDFX->writeChipLong(pTDFX, i, TMUGBEINIT,
15102be438aSmrg			 (v&~(SST_AA_CLK_DELAY | SST_AA_CLK_INVERT)) |
15202be438aSmrg			 (AACLKOUTDEL<<SST_AA_CLK_DELAY_SHIFT) |
15302be438aSmrg			 SST_AA_CLK_INVERT);
15402be438aSmrg
15502be438aSmrg    if (pTDFX->numChips>1) {
156880ed95aSmrg	PCI_READ_LONG(v, CFG_INIT_ENABLE, i);
157880ed95aSmrg	PCI_WRITE_LONG(v |
158880ed95aSmrg		       (CFGSWAPALGORITHM << CFG_SWAPBUFFER_ALGORITHM_SHIFT) |
159880ed95aSmrg		       CFG_SWAP_ALGORITHM | ((!i)? CFG_SWAP_MASTER : 0),
160880ed95aSmrg		       CFG_INIT_ENABLE, i);
16102be438aSmrg      if (!i) {
162880ed95aSmrg	  PCI_READ_LONG(v, CFG_INIT_ENABLE, i);
163880ed95aSmrg	  PCI_WRITE_LONG(v | CFG_SNOOP_EN, CFG_INIT_ENABLE, i);
164880ed95aSmrg	  PCI_READ_LONG(v, CFG_PCI_DECODE, i);
16502be438aSmrg      } else {
166880ed95aSmrg	  PCI_READ_LONG(v, CFG_INIT_ENABLE, i);
167880ed95aSmrg
168880ed95aSmrg	  v = (v & ~CFG_SNOOP_MEMBASE0) | CFG_SNOOP_EN |
169880ed95aSmrg	      CFG_SNOOP_MEMBASE0_EN | CFG_SNOOP_MEMBASE1_EN |
170880ed95aSmrg	      CFG_SNOOP_SLAVE | CFG_SNOOP_FBIINIT_WR_EN |
171880ed95aSmrg	      (((pTDFX->MMIOAddr[0]>>22)&0x3ff)<<CFG_SNOOP_MEMBASE0_SHIFT) |
172880ed95aSmrg	      ((pTDFX->numChips>2)? CFG_SWAP_QUICK : 0);
173880ed95aSmrg
174880ed95aSmrg	  PCI_WRITE_LONG(v, CFG_INIT_ENABLE, i);
175880ed95aSmrg
176880ed95aSmrg	  PCI_READ_LONG(v, CFG_PCI_DECODE, i);
177880ed95aSmrg	  v = (v & ~CFG_SNOOP_MEMBASE1) |
178880ed95aSmrg	      ((pTDFX->LinearAddr[0]>>22)&0x3ff)<<CFG_SNOOP_MEMBASE1_SHIFT;
179880ed95aSmrg	  PCI_WRITE_LONG(v, CFG_PCI_DECODE, i);
18002be438aSmrg      }
18102be438aSmrg    }
18202be438aSmrg
18302be438aSmrg    if (sliEnable && aaSamples<4) {
18402be438aSmrg      /* SLI is on and we're using less than 4 AA samples */
18502be438aSmrg      sli_renderMask = (pTDFX->numChips-1) << sliLinesLog2;
18602be438aSmrg      sli_compareMask = i << sliLinesLog2;
18702be438aSmrg      sli_scanMask = sliLines - 1;
18802be438aSmrg      v = (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) |
18902be438aSmrg	(sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) |
19002be438aSmrg	(sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) |
19102be438aSmrg	(nChipsLog2 << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT) |
19202be438aSmrg	CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN;
19302be438aSmrg#ifndef RD_ABORT_ERROR
19402be438aSmrg      v|=CFG_SLI_RD_EN;
19502be438aSmrg#endif
196880ed95aSmrg	PCI_WRITE_LONG(v, CFG_SLI_LFB_CTRL, i);
19702be438aSmrg
19802be438aSmrg#ifdef H3VDD
19902be438aSmrg      pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL,
20002be438aSmrg			   (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) |
20102be438aSmrg			   (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) |
20202be438aSmrg			   (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) |
20302be438aSmrg			   (nChipsLog2 << SLICTL_3D_NUMCHIPS_LOG2_SHIFT) |
20402be438aSmrg			   SLICTL_3D_EN);
20502be438aSmrg#endif
20602be438aSmrg    } else if (!sliEnable && aaSamples) {
20702be438aSmrg      /* SLI is off and AA is on */
20802be438aSmrg      sli_renderMask = 0;
20902be438aSmrg      sli_compareMask = 0;
21002be438aSmrg      sli_scanMask = 0;
211880ed95aSmrg      PCI_WRITE_LONG((sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) |
212880ed95aSmrg		     (sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) |
213880ed95aSmrg		     (sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) |
214880ed95aSmrg		     (0x0 << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT),
215880ed95aSmrg		     CFG_SLI_LFB_CTRL, i);
21602be438aSmrg#ifdef H3VDD
21702be438aSmrg      pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL,
21802be438aSmrg			   (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) |
21902be438aSmrg			   (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) |
22002be438aSmrg			   (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) |
22102be438aSmrg			   (0 << SLICTL_3D_NUMCHIPS_LOG2_SHIFT));
22202be438aSmrg#endif
22302be438aSmrg    } else {
22402be438aSmrg      /* SLI is on && aaSamples=4 */
22502be438aSmrg      sli_renderMask = ((pTDFX->numChips>>1)-1) << sliLinesLog2;
22602be438aSmrg      sli_compareMask = (i>>1) << sliLinesLog2;
22702be438aSmrg      sli_scanMask = sliLines - 1;
22802be438aSmrg      v = (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) |
22902be438aSmrg	(sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) |
23002be438aSmrg	(sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) |
23102be438aSmrg	((nChipsLog2-1) << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT) |
23202be438aSmrg	CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN;
23302be438aSmrg#ifndef RD_ABORT_ERROR
23402be438aSmrg      v|=CFG_SLI_RD_EN;
23502be438aSmrg#endif
236880ed95aSmrg      PCI_WRITE_LONG(v, CFG_SLI_LFB_CTRL, i);
23702be438aSmrg#ifdef H3VDD
23802be438aSmrg      pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL,
23902be438aSmrg			   (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) |
24002be438aSmrg			   (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) |
24102be438aSmrg			   (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) |
24202be438aSmrg			   ((nChipsLog2-1) << SLICTL_3D_NUMCHIPS_LOG2_SHIFT) |
24302be438aSmrg			   SLICTL_3D_EN);
24402be438aSmrg#endif
24502be438aSmrg    }
24602be438aSmrg
24702be438aSmrg    TDFXSetLFBConfig(pTDFX);
24802be438aSmrg    if (pTDFX->cpp==2) dwFormat = CFG_AA_LFB_RD_FORMAT_16BPP;
24902be438aSmrg    else dwFormat = CFG_AA_LFB_RD_FORMAT_32BPP;
25002be438aSmrg    if (pTDFX->numChips==2 && !sliEnable && aaSamples==2)
25102be438aSmrg      dwFormat|=CFG_AA_LFB_RD_DIVIDE_BY_4;
25202be438aSmrg    /* Thess are wrong, because we don't know where the secondary buffers
25302be438aSmrg       are located */
25402be438aSmrg    pTDFX->writeChipLong(pTDFX, i, CFG_AA_LFB_CTRL,
25502be438aSmrg			 (pScrn->videoRam<<10 /* 2nd buf */ << CFG_AA_BASEADDR_SHIFT) |
25602be438aSmrg			 CFG_AA_LFB_CPU_WR_EN | CFG_AA_LFB_DPTCH_WR_EN |
25702be438aSmrg			 CFG_AA_LFB_RD_EN | dwFormat |
25802be438aSmrg			 ((aaSamples==4)?CFG_AA_LFB_RD_DIVIDE_BY_4:0));
25902be438aSmrg    pTDFX->writeChipLong(pTDFX, i, CFG_AA_ZBUFF_APERTURE,
26002be438aSmrg			 ((pTDFX->depthOffset>>12)<<CFG_AA_DEPTH_BUFFER_BEG_SHIFT) |
26102be438aSmrg			 ((pScrn->videoRam>>2)<<CFG_AA_DEPTH_BUFFER_END_SHIFT));
26202be438aSmrg
26302be438aSmrg    if (pTDFX->numChips>1 && i && (aaSamples || sliEnable)) {
26402be438aSmrg      int vsyncOffsetPixels, vsyncOffsetChars, vsyncOffsetHXtra;
26502be438aSmrg
26602be438aSmrg      if (aaSamples || (pTDFX->numChips==4 && sliEnable && aaSamples==4 &&
26702be438aSmrg			sliAnalog && i==3)) {
26802be438aSmrg	vsyncOffsetPixels=7;
26902be438aSmrg	vsyncOffsetChars=4;
27002be438aSmrg	vsyncOffsetHXtra=0;
27102be438aSmrg      } else {
27202be438aSmrg	vsyncOffsetPixels=7;
27302be438aSmrg	vsyncOffsetChars=5;
27402be438aSmrg	vsyncOffsetHXtra=0;
27502be438aSmrg      }
276880ed95aSmrg      PCI_READ_LONG(v, CFG_SLI_AA_MISC, i);
277880ed95aSmrg      PCI_WRITE_LONG((v & ~CFG_VGA_VSYNC_OFFSET) |
278880ed95aSmrg		     (vsyncOffsetPixels << CFG_VGA_VSYNC_OFFSET_PIXELS_SHIFT) |
279880ed95aSmrg		     (vsyncOffsetChars << CFG_VGA_VSYNC_OFFSET_CHARS_SHIFT) |
280880ed95aSmrg		     (vsyncOffsetHXtra << CFG_VGA_VSYNC_OFFSET_HXTRA_SHIFT),
281880ed95aSmrg		     CFG_SLI_AA_MISC, i);
28202be438aSmrg    }
28302be438aSmrg    if (pTDFX->numChips==1 && aaSamples) {
284880ed95aSmrg	/* 1 chip 2 AA */
285880ed95aSmrg	PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
286880ed95aSmrg		       CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
287880ed95aSmrg		       CFG_VIDEO_OTHERMUX_SEL_PIPE<<CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT |
288880ed95aSmrg		       CFG_DIVIDE_VIDEO_BY_2,
289880ed95aSmrg		       CFG_VIDEO_CTRL0, i);
290880ed95aSmrg	PCI_WRITE_LONG(0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT |
291880ed95aSmrg		       0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT |
292880ed95aSmrg		       0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT |
293880ed95aSmrg		       0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT,
294880ed95aSmrg		       CFG_VIDEO_CTRL1, i);
295880ed95aSmrg	PCI_WRITE_LONG(0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT |
296880ed95aSmrg		       0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT,
297880ed95aSmrg		       CFG_VIDEO_CTRL2, i);
29802be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==4 &&
29902be438aSmrg	       !sliAnalog) {
30002be438aSmrg      /* 2 chips 4 digital AA */
30102be438aSmrg      if (!i) {
302880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
303880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
304880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
305880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
306880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
307880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
308880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
309880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
310880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
311880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
312880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
313880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
314880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
315880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
31602be438aSmrg      } else {
317880ed95aSmrg	  PCI_WRITE_LONG((CFG_ENHANCED_VIDEO_EN |
318880ed95aSmrg			  CFG_ENHANCED_VIDEO_SLV |
319880ed95aSmrg			  CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
320880ed95aSmrg			  (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
321880ed95aSmrg			   CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
322880ed95aSmrg			  CFG_DIVIDE_VIDEO_BY_1),
323880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
324880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
325880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
326880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
327880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT),
328880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
329880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
330880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
331880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
33202be438aSmrg      }
33302be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==4 && sliAnalog) {
33402be438aSmrg      /* 2 chips 4 analog AA */
33502be438aSmrg      if (!i) {
336880ed95aSmrg	PCI_WRITE_LONG((CFG_ENHANCED_VIDEO_EN |
337880ed95aSmrg			CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
338880ed95aSmrg			(CFG_VIDEO_OTHERMUX_SEL_PIPE <<
339880ed95aSmrg			 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
340880ed95aSmrg			CFG_DIVIDE_VIDEO_BY_4),
341880ed95aSmrg		       CFG_VIDEO_CTRL0, i);
34202be438aSmrg      } else {
343880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
344880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
345880ed95aSmrg			 CFG_DAC_HSYNC_TRISTATE |
346880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
347880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
348880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
349880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
350880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
351880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
352880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
353880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
354880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
355880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
356880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
357880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
358880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
35902be438aSmrg      }
36002be438aSmrg    } else if (pTDFX->numChips==2 && sliEnable && !aaSamples && !sliAnalog) {
36102be438aSmrg      /* 2 chips 2 digital SLI */
36202be438aSmrg      if (!i) {
363880ed95aSmrg	  PCI_WRITE_LONG((CFG_ENHANCED_VIDEO_EN |
364880ed95aSmrg			  (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
365880ed95aSmrg			   CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
366880ed95aSmrg			  (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
367880ed95aSmrg			   CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
368880ed95aSmrg			  CFG_DIVIDE_VIDEO_BY_1),
369880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
370880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
371880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
372880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
373880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
374880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
375880ed95aSmrg	  PCI_WRITE_LONG(((0x0<<sliLinesLog2) << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
376880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
377880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
37802be438aSmrg      } else {
379880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
380880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
381880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
382880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
383880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
384880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
385880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
386880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
387880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
388880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
389880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
390880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
391880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT),
392880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
393880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
394880ed95aSmrg			  CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
395880ed95aSmrg			 ((i<<sliLinesLog2) <<
396880ed95aSmrg			  CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
397880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
39802be438aSmrg      }
39902be438aSmrg    } else if (pTDFX->numChips>=2 && sliEnable && !aaSamples && sliAnalog) {
40002be438aSmrg      /* 2 or 4 chips 2/4 analog SLI */
40102be438aSmrg      if (!i) {
402880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
403880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
404880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
405880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
406880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
407880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
408880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
409880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
410880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
411880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
412880ed95aSmrg			 (((pTDFX->numChips-1)<<sliLinesLog2) <<
413880ed95aSmrg			  CFG_SLI_RENDERMASK_CRT_SHIFT) |
414880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
415880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
416880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
417880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
418880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
41902be438aSmrg      } else {
420880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
421880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
422880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
423880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
424880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
425880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
426880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
427880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
428880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
429880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
430880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
431880ed95aSmrg			 (((pTDFX->numChips-1)<<sliLinesLog2) <<
432880ed95aSmrg			  CFG_SLI_RENDERMASK_CRT_SHIFT) |
433880ed95aSmrg			 ((i<<sliLinesLog2) <<
434880ed95aSmrg			  CFG_SLI_COMPAREMASK_CRT_SHIFT),
435880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
436880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
437880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
438880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
43902be438aSmrg      }
44002be438aSmrg    } else if (pTDFX->numChips==2 && sliEnable && aaSamples==2 && !sliAnalog) {
44102be438aSmrg      /* 2 chips 2 AA 2 digital SLI */
44202be438aSmrg      if (!i) {
443880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
444880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
445880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
446880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
447880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
448880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
449880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
450880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
451880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
452880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
453880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
454880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
455880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
456880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
457880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
458880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
45902be438aSmrg      } else {
460880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
461880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
462880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
463880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
464880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
465880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
466880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
467880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
468880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
469880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
470880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
471880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
472880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
473880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT),
474880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
475880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
476880ed95aSmrg			  CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
477880ed95aSmrg			 ((i<<sliLinesLog2) <<
478880ed95aSmrg			  CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
479880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
48002be438aSmrg      }
48102be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==2 && !sliAnalog) {
48202be438aSmrg      /* 2 chips 2 digital AA */
48302be438aSmrg      if (!i) {
484880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
485880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
486880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
487880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
488880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
489880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
490880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
491880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
492880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
493880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
494880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
495880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
496880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
49702be438aSmrg      } else {
498880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
499880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
500880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
501880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
502880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
503880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
504880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
505880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
506880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
507880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT),
508880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
509880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
510880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
511880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
51202be438aSmrg      }
51302be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==2 && sliAnalog) {
51402be438aSmrg      /* 2 chips 2 analog AA */
51502be438aSmrg      if (!i) {
516880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
517880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
518880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
519880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
520880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
52102be438aSmrg      } else {
522880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
523880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
524880ed95aSmrg			 CFG_DAC_HSYNC_TRISTATE |
525880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
526880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
527880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
528880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
52902be438aSmrg      }
530880ed95aSmrg	PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
531880ed95aSmrg		       (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
532880ed95aSmrg		       (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
533880ed95aSmrg		       (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
534880ed95aSmrg		       CFG_VIDEO_CTRL1, i);
535880ed95aSmrg	PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
536880ed95aSmrg		       (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
537880ed95aSmrg		       CFG_VIDEO_CTRL2, i);
53802be438aSmrg    } else if (pTDFX->numChips>=2 && sliEnable && aaSamples==2 && sliAnalog) {
53902be438aSmrg      /* 2 or 4 chips 2 AA 2 or 4 analog SLI */
54002be438aSmrg      if (!i) {
541880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
542880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
543880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
544880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
545880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
546880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
547880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
548880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
549880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
550880ed95aSmrg			 (((pTDFX->numChips-1)<<sliLinesLog2) <<
551880ed95aSmrg			  CFG_SLI_RENDERMASK_CRT_SHIFT) |
552880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
553880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
554880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
555880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
556880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
55702be438aSmrg      } else {
558880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
559880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
560880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
561880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
562880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
563880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
564880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
565880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
566880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
567880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
568880ed95aSmrg			 (((pTDFX->numChips-1)<<sliLinesLog2) <<
569880ed95aSmrg			  CFG_SLI_RENDERMASK_CRT_SHIFT) |
570880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
571880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
572880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
573880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
574880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
57502be438aSmrg      }
57602be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && !aaSamples && !sliAnalog) {
57702be438aSmrg      /* 4 chips 4 digital SLI */
57802be438aSmrg      if (!i) {
579880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
580880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
581880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
582880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
583880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
584880ed95aSmrg			 CFG_SLI_AAFIFO_COMPARE_INV |
585880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
586880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
587880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
588880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
589880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
590880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
591880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
592880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
593880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
594880ed95aSmrg			  CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
595880ed95aSmrg			 ((0x0<<sliLinesLog2) <<
596880ed95aSmrg			  CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
597880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
59802be438aSmrg      } else {
599880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
600880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
601880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
602880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
603880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
604880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
605880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
606880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
607880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
608880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
609880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
610880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
611880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT),
612880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
613880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
614880ed95aSmrg			  CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
615880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
616880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
61702be438aSmrg      }
61802be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && aaSamples==2 && !sliAnalog) {
61902be438aSmrg      /* 4 chips 2 AA 4 digital SLI */
62002be438aSmrg      if (!i) {
621880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
622880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
623880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
624880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
625880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
626880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
627880ed95aSmrg			 CFG_SLI_AAFIFO_COMPARE_INV |
628880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_2,
629880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
630880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
631880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
632880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
633880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
634880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT),
635880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
636880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
637880ed95aSmrg			  CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
638880ed95aSmrg			 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
639880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
64002be438aSmrg      } else {
641880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
642880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
643880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
644880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
645880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
646880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
647880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
648880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
649880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
650880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
651880ed95aSmrg			  CFG_SLI_RENDERMASK_FETCH_SHIFT) |
652880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
653880ed95aSmrg			 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
654880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT),
655880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
656880ed95aSmrg	  PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) <<
657880ed95aSmrg			  CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
658880ed95aSmrg			 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
659880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
66002be438aSmrg      }
66102be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && !sliAnalog) {
66202be438aSmrg      /* 4 chips 4 AA 2 digital SLI */
66302be438aSmrg      if (!i) {
664880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
665880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
666880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
667880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
668880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
669880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
670880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
671880ed95aSmrg			 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
672880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
673880ed95aSmrg			 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
674880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
675880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
676880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
677880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
67802be438aSmrg      } else if (i==1 || i==3) {
679880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
680880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
681880ed95aSmrg			 CFG_DAC_HSYNC_TRISTATE |
682880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
683880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
684880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
685880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_1,
686880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
687880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
688880ed95aSmrg			 ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
689880ed95aSmrg			 ((0x0<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
690880ed95aSmrg			 ((0xff<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
691880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
692880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
693880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
694880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
69502be438aSmrg      } else {
696880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
697880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
698880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
699880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
700880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
701880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
702880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
703880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
704880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
705880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
706880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
707880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
708880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
709880ed95aSmrg			 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
710880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
71102be438aSmrg      }
71202be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && sliAnalog) {
71302be438aSmrg      /* 4 chips 4 AA 2 analog SLI */
71402be438aSmrg      if (!i) {
715880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
716880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
717880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
718880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
719880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
720880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
721880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
722880ed95aSmrg			 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
723880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
724880ed95aSmrg			 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
725880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
726880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
727880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
728880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
72902be438aSmrg      } else if (i==1 || i==3) {
730880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
731880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
732880ed95aSmrg			 CFG_DAC_HSYNC_TRISTATE |
733880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
734880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
735880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
736880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
737880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
738880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
739880ed95aSmrg			 ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
740880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
741880ed95aSmrg			 ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
742880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
743880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
744880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
745880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
74602be438aSmrg      } else {
747880ed95aSmrg	  PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN |
748880ed95aSmrg			 CFG_ENHANCED_VIDEO_SLV |
749880ed95aSmrg			 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
750880ed95aSmrg			 (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
751880ed95aSmrg			  CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
752880ed95aSmrg			 CFG_DIVIDE_VIDEO_BY_4,
753880ed95aSmrg			 CFG_VIDEO_CTRL0, i);
754880ed95aSmrg	  PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
755880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
756880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
757880ed95aSmrg			 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT),
758880ed95aSmrg			 CFG_VIDEO_CTRL1, i);
759880ed95aSmrg	  PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
760880ed95aSmrg			 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT),
761880ed95aSmrg			 CFG_VIDEO_CTRL2, i);
76202be438aSmrg      }
76302be438aSmrg    }
76402be438aSmrg    if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && i==3) {
765880ed95aSmrg	PCI_READ_LONG(v, CFG_SLI_AA_MISC, i);
766880ed95aSmrg	PCI_WRITE_LONG(v | CFG_AA_LFB_RD_SLV_WAIT, CFG_SLI_AA_MISC, i);
76702be438aSmrg    }
76802be438aSmrg    if (i) {
769880ed95aSmrg	PCI_READ_LONG(v, CFG_VIDEO_CTRL0, i);
770880ed95aSmrg	PCI_WRITE_LONG(v | CFG_VIDPLL_SEL, CFG_VIDEO_CTRL0, i);
77102be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, MISCINIT1);
77202be438aSmrg      pTDFX->writeChipLong(pTDFX, i, MISCINIT1, v|SST_POWERDOWN_DAC);
77302be438aSmrg    }
77402be438aSmrg  }
77502be438aSmrg  return TRUE;
77602be438aSmrg}
777