tdfx_sli.c revision 02be438a
102be438aSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_sli.c,v 1.6 2000/12/15 15:19:35 dawes Exp $ */
202be438aSmrg
302be438aSmrg#ifdef HAVE_CONFIG_H
402be438aSmrg#include "config.h"
502be438aSmrg#endif
602be438aSmrg
702be438aSmrg#include "xf86.h"
802be438aSmrg#include "xf86_OSproc.h"
902be438aSmrg#include "xf86Pci.h"
1002be438aSmrg#include "tdfx.h"
1102be438aSmrg
1202be438aSmrg#define AACLKOUTDEL 0x2
1302be438aSmrg#define CFGSWAPALGORITHM 0x1
1402be438aSmrg
1502be438aSmrg/* #define RD_ABORT_ERROR */
1602be438aSmrg#define H3VDD
1702be438aSmrg
1802be438aSmrgBool TDFXDisableSLI(TDFXPtr pTDFX)
1902be438aSmrg{
2002be438aSmrg  int i;
2102be438aSmrg  int v;
2202be438aSmrg
2302be438aSmrg  for (i=0; i<pTDFX->numChips; i++) {
2402be438aSmrg    v=pciReadLong(pTDFX->PciTag[i], CFG_INIT_ENABLE);
2502be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_INIT_ENABLE,
2602be438aSmrg		 v&~(CFG_SNOOP_MEMBASE0 | CFG_SNOOP_EN | CFG_SNOOP_MEMBASE0_EN |
2702be438aSmrg		     CFG_SNOOP_MEMBASE1_EN | CFG_SNOOP_SLAVE |
2802be438aSmrg		     CFG_SNOOP_FBIINIT_WR_EN | CFG_SWAP_ALGORITHM |
2902be438aSmrg		     CFG_SWAP_QUICK));
3002be438aSmrg    v=pciReadLong(pTDFX->PciTag[i], CFG_SLI_LFB_CTRL);
3102be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_SLI_LFB_CTRL,
3202be438aSmrg		 v&~(CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN |
3302be438aSmrg		     CFG_SLI_RD_EN));
3402be438aSmrg#ifdef H3VDD
3502be438aSmrg    pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 0);
3602be438aSmrg    pTDFX->writeChipLong(pTDFX, i, SST_3D_AACTRL, 0);
3702be438aSmrg#endif
3802be438aSmrg    v=pciReadLong(pTDFX->PciTag[i], CFG_AA_LFB_CTRL);
3902be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_AA_LFB_CTRL,
4002be438aSmrg		 v&~(CFG_AA_LFB_CPU_WR_EN | CFG_AA_LFB_DPTCH_WR_EN |
4102be438aSmrg		     CFG_AA_LFB_RD_EN));
4202be438aSmrg    v=pciReadLong(pTDFX->PciTag[i], CFG_SLI_AA_MISC);
4302be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_SLI_AA_MISC,
4402be438aSmrg		 (v&~CFG_VGA_VSYNC_OFFSET) |
4502be438aSmrg		 (0 << CFG_VGA_VSYNC_OFFSET_PIXELS_SHIFT) |
4602be438aSmrg		 (0 << CFG_VGA_VSYNC_OFFSET_CHARS_SHIFT) |
4702be438aSmrg		 (0 << CFG_VGA_VSYNC_OFFSET_HXTRA_SHIFT));
4802be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0, 0);
4902be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1, 0);
5002be438aSmrg    pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2, 0);
5102be438aSmrg
5202be438aSmrg    if (pTDFX->numChips>1) {
5302be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, PCIINIT0);
5402be438aSmrg      pTDFX->writeChipLong(pTDFX, i, PCIINIT0,
5502be438aSmrg			   (v&~(SST_PCI_DISABLE_IO|SST_PCI_DISABLE_MEM|
5602be438aSmrg				SST_PCI_RETRY_INTERVAL)) |
5702be438aSmrg			   (0<<SST_PCI_RETRY_INTERVAL_SHIFT) |
5802be438aSmrg			   SST_PCI_FORCE_FB_HIGH);
5902be438aSmrg    } else {
6002be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, PCIINIT0);
6102be438aSmrg      pTDFX->writeChipLong(pTDFX, i, PCIINIT0,
6202be438aSmrg			   (v&~(SST_PCI_DISABLE_IO|SST_PCI_DISABLE_MEM|
6302be438aSmrg				SST_PCI_RETRY_INTERVAL)) |
6402be438aSmrg			   (0<<SST_PCI_RETRY_INTERVAL_SHIFT));
6502be438aSmrg    }
6602be438aSmrg
6702be438aSmrg#if 0
6802be438aSmrg    if (i>0) {
6902be438aSmrg      pTDFX->writeChipLong(pTDFX, i, DACMODE,
7002be438aSmrg			   SST_DAC_DPMS_ON_VSYNC | SST_DAC_DPMS_ON_HSYNC);
7102be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, VIDPROCCFG);
7202be438aSmrg      pTDFX->writeChipLong(pTDFX, i, VIDPROCCFG, v&~SST_VIDEO_PROCESSOR_EN);
7302be438aSmrg    }
7402be438aSmrg#endif
7502be438aSmrg  }
7602be438aSmrg  return TRUE;
7702be438aSmrg}
7802be438aSmrg
7902be438aSmrgBool TDFXSetupSLI(ScrnInfoPtr pScrn, Bool sliEnable, int aaSamples)
8002be438aSmrg{
8102be438aSmrg  TDFXPtr pTDFX;
8202be438aSmrg  int i, sliLines, sliLinesLog2, nChipsLog2, v;
8302be438aSmrg  int sli_renderMask, sli_compareMask, sli_scanMask;
8402be438aSmrg  int sliAnalog, dwFormat;
8502be438aSmrg
8602be438aSmrg  pTDFX=TDFXPTR(pScrn);
8702be438aSmrg  if (pScrn->depth == 24 || pScrn->depth==32) {
8802be438aSmrg    if ((aaSamples == 4) && (pTDFX->numChips>1)) {
8902be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_4_ARGB_8888;
9002be438aSmrg    } else if (aaSamples >= 2) {
9102be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_2_ARGB_8888;
9202be438aSmrg    } else {
9302be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_ARGB_8888;
9402be438aSmrg    }
9502be438aSmrg  } else if (pScrn->depth == 16) {
9602be438aSmrg    if ((aaSamples == 4) && (pTDFX->numChips>1)) {
9702be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_4_RGB_565;
9802be438aSmrg    } else if (aaSamples >= 2) {
9902be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_AA_2_RGB_565;
10002be438aSmrg    } else {
10102be438aSmrg      pTDFX->pixelFormat=GR_PIXFMT_RGB_565;
10202be438aSmrg    }
10302be438aSmrg  } else if (pScrn->depth == 8) {
10402be438aSmrg    pTDFX->pixelFormat=GR_PIXFMT_I_8;
10502be438aSmrg  }
10602be438aSmrg  if (!sliEnable && !aaSamples) { /* Turn off */
10702be438aSmrg    return TDFXDisableSLI(pTDFX);
10802be438aSmrg  }
10902be438aSmrg
11002be438aSmrg  if (pScrn->virtualY>768) sliLinesLog2=5;
11102be438aSmrg  else sliLinesLog2=4;
11202be438aSmrg  sliLines=1<<sliLinesLog2;
11302be438aSmrg  if (pScrn->virtualY*pScrn->virtualX>1600*1024) sliAnalog=1;
11402be438aSmrg  else sliAnalog=0;
11502be438aSmrg  /* XXX We need to avoid SLI in double scan modes somehow */
11602be438aSmrg
11702be438aSmrg  switch (pTDFX->numChips) {
11802be438aSmrg  case 1:
11902be438aSmrg    nChipsLog2=0;
12002be438aSmrg    break;
12102be438aSmrg  case 2:
12202be438aSmrg    nChipsLog2=1;
12302be438aSmrg    break;
12402be438aSmrg  case 4:
12502be438aSmrg    nChipsLog2=2;
12602be438aSmrg    break;
12702be438aSmrg  default:
12802be438aSmrg    return FALSE;
12902be438aSmrg    /* XXX Huh? Unsupported configuration */
13002be438aSmrg  }
13102be438aSmrg
13202be438aSmrg  for (i=0; i<pTDFX->numChips; i++) {
13302be438aSmrg    /* Do we want to set these differently for a VIA board? */
13402be438aSmrg    v=pTDFX->readChipLong(pTDFX, i, PCIINIT0);
13502be438aSmrg    v=(v&~(SST_PCI_RETRY_INTERVAL|SST_PCI_FORCE_FB_HIGH)) |
13602be438aSmrg		     SST_PCI_READ_WS | SST_PCI_WRITE_WS |
13702be438aSmrg		     SST_PCI_DISABLE_IO | SST_PCI_DISABLE_MEM |
13802be438aSmrg		     (5<<SST_PCI_RETRY_INTERVAL_SHIFT);
13902be438aSmrg    pTDFX->writeChipLong(pTDFX, i, PCIINIT0,
14002be438aSmrg			 (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    v=pTDFX->readChipLong(pTDFX, i, TMUGBEINIT);
14502be438aSmrg    pTDFX->writeChipLong(pTDFX, i, TMUGBEINIT,
14602be438aSmrg			 (v&~(SST_AA_CLK_DELAY | SST_AA_CLK_INVERT)) |
14702be438aSmrg			 (AACLKOUTDEL<<SST_AA_CLK_DELAY_SHIFT) |
14802be438aSmrg			 SST_AA_CLK_INVERT);
14902be438aSmrg
15002be438aSmrg    if (pTDFX->numChips>1) {
15102be438aSmrg      v=pciReadLong(pTDFX->PciTag[i], CFG_INIT_ENABLE);
15202be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_INIT_ENABLE, v |
15302be438aSmrg		   (CFGSWAPALGORITHM << CFG_SWAPBUFFER_ALGORITHM_SHIFT) |
15402be438aSmrg		   CFG_SWAP_ALGORITHM | ((!i)? CFG_SWAP_MASTER : 0));
15502be438aSmrg      if (!i) {
15602be438aSmrg	v=pciReadLong(pTDFX->PciTag[i], CFG_INIT_ENABLE);
15702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_INIT_ENABLE,
15802be438aSmrg			 v | CFG_SNOOP_EN);
15902be438aSmrg	v=pciReadLong(pTDFX->PciTag[i], CFG_PCI_DECODE);
16002be438aSmrg      } else {
16102be438aSmrg	v=pciReadLong(pTDFX->PciTag[i], CFG_INIT_ENABLE);
16202be438aSmrg	v=(v & ~CFG_SNOOP_MEMBASE0) | CFG_SNOOP_EN |
16302be438aSmrg	  CFG_SNOOP_MEMBASE0_EN | CFG_SNOOP_MEMBASE1_EN |
16402be438aSmrg	  CFG_SNOOP_SLAVE | CFG_SNOOP_FBIINIT_WR_EN |
16502be438aSmrg	  (((pTDFX->MMIOAddr[0]>>22)&0x3ff)<<CFG_SNOOP_MEMBASE0_SHIFT) |
16602be438aSmrg	  ((pTDFX->numChips>2)? CFG_SWAP_QUICK : 0);
16702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_INIT_ENABLE, v);
16802be438aSmrg	v=pciReadLong(pTDFX->PciTag[i], CFG_PCI_DECODE);
16902be438aSmrg	v=(v & ~CFG_SNOOP_MEMBASE1) |
17002be438aSmrg	  ((pTDFX->LinearAddr[0]>>22)&0x3ff)<<CFG_SNOOP_MEMBASE1_SHIFT;
17102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_PCI_DECODE, v);
17202be438aSmrg      }
17302be438aSmrg    }
17402be438aSmrg
17502be438aSmrg    if (sliEnable && aaSamples<4) {
17602be438aSmrg      /* SLI is on and we're using less than 4 AA samples */
17702be438aSmrg      sli_renderMask = (pTDFX->numChips-1) << sliLinesLog2;
17802be438aSmrg      sli_compareMask = i << sliLinesLog2;
17902be438aSmrg      sli_scanMask = sliLines - 1;
18002be438aSmrg      v = (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) |
18102be438aSmrg	(sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) |
18202be438aSmrg	(sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) |
18302be438aSmrg	(nChipsLog2 << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT) |
18402be438aSmrg	CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN;
18502be438aSmrg#ifndef RD_ABORT_ERROR
18602be438aSmrg      v|=CFG_SLI_RD_EN;
18702be438aSmrg#endif
18802be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_SLI_LFB_CTRL, v);
18902be438aSmrg
19002be438aSmrg#ifdef H3VDD
19102be438aSmrg      pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL,
19202be438aSmrg			   (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) |
19302be438aSmrg			   (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) |
19402be438aSmrg			   (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) |
19502be438aSmrg			   (nChipsLog2 << SLICTL_3D_NUMCHIPS_LOG2_SHIFT) |
19602be438aSmrg			   SLICTL_3D_EN);
19702be438aSmrg#endif
19802be438aSmrg    } else if (!sliEnable && aaSamples) {
19902be438aSmrg      /* SLI is off and AA is on */
20002be438aSmrg      sli_renderMask = 0;
20102be438aSmrg      sli_compareMask = 0;
20202be438aSmrg      sli_scanMask = 0;
20302be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_SLI_LFB_CTRL,
20402be438aSmrg		   (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) |
20502be438aSmrg		   (sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) |
20602be438aSmrg		   (sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) |
20702be438aSmrg		   (0x0 << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT));
20802be438aSmrg#ifdef H3VDD
20902be438aSmrg      pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL,
21002be438aSmrg			   (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) |
21102be438aSmrg			   (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) |
21202be438aSmrg			   (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) |
21302be438aSmrg			   (0 << SLICTL_3D_NUMCHIPS_LOG2_SHIFT));
21402be438aSmrg#endif
21502be438aSmrg    } else {
21602be438aSmrg      /* SLI is on && aaSamples=4 */
21702be438aSmrg      sli_renderMask = ((pTDFX->numChips>>1)-1) << sliLinesLog2;
21802be438aSmrg      sli_compareMask = (i>>1) << sliLinesLog2;
21902be438aSmrg      sli_scanMask = sliLines - 1;
22002be438aSmrg      v = (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) |
22102be438aSmrg	(sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) |
22202be438aSmrg	(sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) |
22302be438aSmrg	((nChipsLog2-1) << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT) |
22402be438aSmrg	CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN;
22502be438aSmrg#ifndef RD_ABORT_ERROR
22602be438aSmrg      v|=CFG_SLI_RD_EN;
22702be438aSmrg#endif
22802be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_SLI_LFB_CTRL, v);
22902be438aSmrg#ifdef H3VDD
23002be438aSmrg      pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL,
23102be438aSmrg			   (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) |
23202be438aSmrg			   (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) |
23302be438aSmrg			   (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) |
23402be438aSmrg			   ((nChipsLog2-1) << SLICTL_3D_NUMCHIPS_LOG2_SHIFT) |
23502be438aSmrg			   SLICTL_3D_EN);
23602be438aSmrg#endif
23702be438aSmrg    }
23802be438aSmrg
23902be438aSmrg    TDFXSetLFBConfig(pTDFX);
24002be438aSmrg    if (pTDFX->cpp==2) dwFormat = CFG_AA_LFB_RD_FORMAT_16BPP;
24102be438aSmrg    else dwFormat = CFG_AA_LFB_RD_FORMAT_32BPP;
24202be438aSmrg    if (pTDFX->numChips==2 && !sliEnable && aaSamples==2)
24302be438aSmrg      dwFormat|=CFG_AA_LFB_RD_DIVIDE_BY_4;
24402be438aSmrg    /* Thess are wrong, because we don't know where the secondary buffers
24502be438aSmrg       are located */
24602be438aSmrg    pTDFX->writeChipLong(pTDFX, i, CFG_AA_LFB_CTRL,
24702be438aSmrg			 (pScrn->videoRam<<10 /* 2nd buf */ << CFG_AA_BASEADDR_SHIFT) |
24802be438aSmrg			 CFG_AA_LFB_CPU_WR_EN | CFG_AA_LFB_DPTCH_WR_EN |
24902be438aSmrg			 CFG_AA_LFB_RD_EN | dwFormat |
25002be438aSmrg			 ((aaSamples==4)?CFG_AA_LFB_RD_DIVIDE_BY_4:0));
25102be438aSmrg    pTDFX->writeChipLong(pTDFX, i, CFG_AA_ZBUFF_APERTURE,
25202be438aSmrg			 ((pTDFX->depthOffset>>12)<<CFG_AA_DEPTH_BUFFER_BEG_SHIFT) |
25302be438aSmrg			 ((pScrn->videoRam>>2)<<CFG_AA_DEPTH_BUFFER_END_SHIFT));
25402be438aSmrg
25502be438aSmrg    if (pTDFX->numChips>1 && i && (aaSamples || sliEnable)) {
25602be438aSmrg      int vsyncOffsetPixels, vsyncOffsetChars, vsyncOffsetHXtra;
25702be438aSmrg
25802be438aSmrg      if (aaSamples || (pTDFX->numChips==4 && sliEnable && aaSamples==4 &&
25902be438aSmrg			sliAnalog && i==3)) {
26002be438aSmrg	vsyncOffsetPixels=7;
26102be438aSmrg	vsyncOffsetChars=4;
26202be438aSmrg	vsyncOffsetHXtra=0;
26302be438aSmrg      } else {
26402be438aSmrg	vsyncOffsetPixels=7;
26502be438aSmrg	vsyncOffsetChars=5;
26602be438aSmrg	vsyncOffsetHXtra=0;
26702be438aSmrg      }
26802be438aSmrg      v=pciReadLong(pTDFX->PciTag[i], CFG_SLI_AA_MISC);
26902be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_SLI_AA_MISC,
27002be438aSmrg		   (v&~CFG_VGA_VSYNC_OFFSET) |
27102be438aSmrg		   (vsyncOffsetPixels << CFG_VGA_VSYNC_OFFSET_PIXELS_SHIFT) |
27202be438aSmrg		   (vsyncOffsetChars << CFG_VGA_VSYNC_OFFSET_CHARS_SHIFT) |
27302be438aSmrg		   (vsyncOffsetHXtra <<
27402be438aSmrg		    CFG_VGA_VSYNC_OFFSET_HXTRA_SHIFT));
27502be438aSmrg    }
27602be438aSmrg    if (pTDFX->numChips==1 && aaSamples) {
27702be438aSmrg      /* 1 chip 2 AA */
27802be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
27902be438aSmrg		   CFG_ENHANCED_VIDEO_EN |
28002be438aSmrg		   CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
28102be438aSmrg		   CFG_VIDEO_OTHERMUX_SEL_PIPE<<CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT |
28202be438aSmrg		   CFG_DIVIDE_VIDEO_BY_2);
28302be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
28402be438aSmrg		   0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT |
28502be438aSmrg		   0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT |
28602be438aSmrg		   0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT |
28702be438aSmrg		   0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT);
28802be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
28902be438aSmrg		   0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT |
29002be438aSmrg		   0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT);
29102be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==4 &&
29202be438aSmrg	       !sliAnalog) {
29302be438aSmrg      /* 2 chips 4 digital AA */
29402be438aSmrg      if (!i) {
29502be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
29602be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
29702be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
29802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
29902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
30002be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
30102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
30202be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
30302be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
30402be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
30502be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
30602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
30702be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
30802be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
30902be438aSmrg      } else {
31002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
31102be438aSmrg		     (CFG_ENHANCED_VIDEO_EN |
31202be438aSmrg		      CFG_ENHANCED_VIDEO_SLV |
31302be438aSmrg		      CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
31402be438aSmrg		      (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
31502be438aSmrg		       CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
31602be438aSmrg		      CFG_DIVIDE_VIDEO_BY_1));
31702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
31802be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
31902be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
32002be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
32102be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT));
32202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
32302be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
32402be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
32502be438aSmrg      }
32602be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==4 && sliAnalog) {
32702be438aSmrg      /* 2 chips 4 analog AA */
32802be438aSmrg      if (!i) {
32902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
33002be438aSmrg		     (CFG_ENHANCED_VIDEO_EN |
33102be438aSmrg		      CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
33202be438aSmrg		      (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
33302be438aSmrg		       CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
33402be438aSmrg		      CFG_DIVIDE_VIDEO_BY_4));
33502be438aSmrg      } else {
33602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
33702be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
33802be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
33902be438aSmrg		     CFG_DAC_HSYNC_TRISTATE |
34002be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
34102be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
34202be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
34302be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
34402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
34502be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
34602be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
34702be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
34802be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
34902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
35002be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
35102be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
35202be438aSmrg      }
35302be438aSmrg    } else if (pTDFX->numChips==2 && sliEnable && !aaSamples && !sliAnalog) {
35402be438aSmrg      /* 2 chips 2 digital SLI */
35502be438aSmrg      if (!i) {
35602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
35702be438aSmrg		     (CFG_ENHANCED_VIDEO_EN |
35802be438aSmrg		      (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
35902be438aSmrg		       CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
36002be438aSmrg		      (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
36102be438aSmrg		       CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
36202be438aSmrg		      CFG_DIVIDE_VIDEO_BY_1));
36302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
36402be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
36502be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
36602be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
36702be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
36802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
36902be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
37002be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
37102be438aSmrg      } else {
37202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
37302be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
37402be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
37502be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
37602be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
37702be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
37802be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
37902be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
38002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
38102be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
38202be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
38302be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
38402be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
38502be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT));
38602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
38702be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
38802be438aSmrg		      CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
38902be438aSmrg		     ((i<<sliLinesLog2) <<
39002be438aSmrg		      CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
39102be438aSmrg      }
39202be438aSmrg    } else if (pTDFX->numChips>=2 && sliEnable && !aaSamples && sliAnalog) {
39302be438aSmrg      /* 2 or 4 chips 2/4 analog SLI */
39402be438aSmrg      if (!i) {
39502be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
39602be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
39702be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
39802be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
39902be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
40002be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
40102be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
40202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
40302be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
40402be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
40502be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
40602be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
40702be438aSmrg		      CFG_SLI_RENDERMASK_CRT_SHIFT) |
40802be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
40902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
41002be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
41102be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
41202be438aSmrg      } else {
41302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
41402be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
41502be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
41602be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
41702be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
41802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
41902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
42002be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
42102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
42202be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
42302be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
42402be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
42502be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
42602be438aSmrg		      CFG_SLI_RENDERMASK_CRT_SHIFT) |
42702be438aSmrg		     ((i<<sliLinesLog2) <<
42802be438aSmrg		      CFG_SLI_COMPAREMASK_CRT_SHIFT));
42902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
43002be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
43102be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
43202be438aSmrg      }
43302be438aSmrg    } else if (pTDFX->numChips==2 && sliEnable && aaSamples==2 && !sliAnalog) {
43402be438aSmrg      /* 2 chips 2 AA 2 digital SLI */
43502be438aSmrg      if (!i) {
43602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
43702be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
43802be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
43902be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
44002be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
44102be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
44202be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
44302be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
44402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
44502be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
44602be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
44702be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
44802be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
44902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
45002be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
45102be438aSmrg		     ((0x1<<sliLinesLog2) <<
45202be438aSmrg		      CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
45302be438aSmrg      } else {
45402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
45502be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
45602be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
45702be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
45802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
45902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
46002be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
46102be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
46202be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
46302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
46402be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
46502be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
46602be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
46702be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
46802be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT));
46902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
47002be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
47102be438aSmrg		      CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
47202be438aSmrg		     ((i<<sliLinesLog2) <<
47302be438aSmrg		      CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
47402be438aSmrg      }
47502be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==2 && !sliAnalog) {
47602be438aSmrg      /* 2 chips 2 digital AA */
47702be438aSmrg      if (!i) {
47802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
47902be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
48002be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
48102be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
48202be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
48302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
48402be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
48502be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
48602be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
48702be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
48802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
48902be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
49002be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
49102be438aSmrg      } else {
49202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
49302be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
49402be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
49502be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
49602be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
49702be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
49802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
49902be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
50002be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
50102be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
50202be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT));
50302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
50402be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
50502be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
50602be438aSmrg      }
50702be438aSmrg    } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==2 && sliAnalog) {
50802be438aSmrg      /* 2 chips 2 analog AA */
50902be438aSmrg      if (!i) {
51002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
51102be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
51202be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
51302be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
51402be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
51502be438aSmrg      } else {
51602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
51702be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
51802be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
51902be438aSmrg		     CFG_DAC_HSYNC_TRISTATE |
52002be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
52102be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
52202be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
52302be438aSmrg      }
52402be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
52502be438aSmrg		   (0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
52602be438aSmrg		   (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
52702be438aSmrg		   (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
52802be438aSmrg		   (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
52902be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
53002be438aSmrg		   (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
53102be438aSmrg		   (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
53202be438aSmrg    } else if (pTDFX->numChips>=2 && sliEnable && aaSamples==2 && sliAnalog) {
53302be438aSmrg      /* 2 or 4 chips 2 AA 2 or 4 analog SLI */
53402be438aSmrg      if (!i) {
53502be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
53602be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
53702be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
53802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
53902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
54002be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
54102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
54202be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
54302be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
54402be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
54502be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
54602be438aSmrg		      CFG_SLI_RENDERMASK_CRT_SHIFT) |
54702be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
54802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
54902be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
55002be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
55102be438aSmrg      } else {
55202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
55302be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
55402be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
55502be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
55602be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
55702be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
55802be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
55902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
56002be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
56102be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
56202be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
56302be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
56402be438aSmrg		      CFG_SLI_RENDERMASK_CRT_SHIFT) |
56502be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
56602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
56702be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
56802be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
56902be438aSmrg      }
57002be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && !aaSamples && !sliAnalog) {
57102be438aSmrg      /* 4 chips 4 digital SLI */
57202be438aSmrg      if (!i) {
57302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
57402be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
57502be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
57602be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
57702be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
57802be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
57902be438aSmrg		     CFG_SLI_AAFIFO_COMPARE_INV |
58002be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
58102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
58202be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
58302be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
58402be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
58502be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
58602be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
58702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
58802be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
58902be438aSmrg		      CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
59002be438aSmrg		     ((0x0<<sliLinesLog2) <<
59102be438aSmrg		      CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
59202be438aSmrg      } else {
59302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
59402be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
59502be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
59602be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
59702be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
59802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
59902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
60002be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
60102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
60202be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
60302be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
60402be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
60502be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
60602be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT));
60702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
60802be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
60902be438aSmrg		      CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
61002be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
61102be438aSmrg      }
61202be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && aaSamples==2 && !sliAnalog) {
61302be438aSmrg      /* 4 chips 2 AA 4 digital SLI */
61402be438aSmrg      if (!i) {
61502be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
61602be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
61702be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
61802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_AAFIFO <<
61902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
62002be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
62102be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
62202be438aSmrg		     CFG_SLI_AAFIFO_COMPARE_INV |
62302be438aSmrg		     CFG_DIVIDE_VIDEO_BY_2);
62402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
62502be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
62602be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
62702be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
62802be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
62902be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT));
63002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
63102be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
63202be438aSmrg		      CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
63302be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
63402be438aSmrg      } else {
63502be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
63602be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
63702be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
63802be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
63902be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
64002be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
64102be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
64202be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
64302be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
64402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
64502be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
64602be438aSmrg		      CFG_SLI_RENDERMASK_FETCH_SHIFT) |
64702be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
64802be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) |
64902be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT));
65002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
65102be438aSmrg		     (((pTDFX->numChips-1)<<sliLinesLog2) <<
65202be438aSmrg		      CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
65302be438aSmrg		     ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
65402be438aSmrg      }
65502be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && !sliAnalog) {
65602be438aSmrg      /* 4 chips 4 AA 2 digital SLI */
65702be438aSmrg      if (!i) {
65802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
65902be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
66002be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
66102be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
66202be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
66302be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
66402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
66502be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
66602be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
66702be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
66802be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
66902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
67002be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
67102be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
67202be438aSmrg      } else if (i==1 || i==3) {
67302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
67402be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
67502be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
67602be438aSmrg		     CFG_DAC_HSYNC_TRISTATE |
67702be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
67802be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
67902be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
68002be438aSmrg		     CFG_DIVIDE_VIDEO_BY_1);
68102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
68202be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
68302be438aSmrg		     ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
68402be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
68502be438aSmrg		     ((0xff<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
68602be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
68702be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
68802be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
68902be438aSmrg      } else {
69002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
69102be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
69202be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
69302be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
69402be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO <<
69502be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) |
69602be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
69702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
69802be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
69902be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
70002be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
70102be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
70202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
70302be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
70402be438aSmrg		     (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
70502be438aSmrg      }
70602be438aSmrg    } else if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && sliAnalog) {
70702be438aSmrg      /* 4 chips 4 AA 2 analog SLI */
70802be438aSmrg      if (!i) {
70902be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
71002be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
71102be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
71202be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
71302be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
71402be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
71502be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
71602be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
71702be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
71802be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
71902be438aSmrg		     ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
72002be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
72102be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
72202be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
72302be438aSmrg      } else if (i==1 || i==3) {
72402be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
72502be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
72602be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
72702be438aSmrg		     CFG_DAC_HSYNC_TRISTATE |
72802be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
72902be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
73002be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
73102be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
73202be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
73302be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
73402be438aSmrg		     ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
73502be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
73602be438aSmrg		     ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
73702be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
73802be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
73902be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
74002be438aSmrg      } else {
74102be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
74202be438aSmrg		     CFG_ENHANCED_VIDEO_EN |
74302be438aSmrg		     CFG_ENHANCED_VIDEO_SLV |
74402be438aSmrg		     CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY |
74502be438aSmrg		     (CFG_VIDEO_OTHERMUX_SEL_PIPE <<
74602be438aSmrg		      CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) |
74702be438aSmrg		     CFG_DIVIDE_VIDEO_BY_4);
74802be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL1,
74902be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) |
75002be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) |
75102be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) |
75202be438aSmrg		     ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT));
75302be438aSmrg	pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2,
75402be438aSmrg		     (0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) |
75502be438aSmrg		     (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT));
75602be438aSmrg      }
75702be438aSmrg    }
75802be438aSmrg    if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && i==3) {
75902be438aSmrg      v=pciReadLong(pTDFX->PciTag[i], CFG_SLI_AA_MISC);
76002be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_SLI_AA_MISC,
76102be438aSmrg		   v | CFG_AA_LFB_RD_SLV_WAIT);
76202be438aSmrg    }
76302be438aSmrg    if (i) {
76402be438aSmrg      v=pciReadLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0);
76502be438aSmrg      pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL0,
76602be438aSmrg		   v|CFG_VIDPLL_SEL);
76702be438aSmrg      v=pTDFX->readChipLong(pTDFX, i, MISCINIT1);
76802be438aSmrg      pTDFX->writeChipLong(pTDFX, i, MISCINIT1, v|SST_POWERDOWN_DAC);
76902be438aSmrg    }
77002be438aSmrg  }
77102be438aSmrg  return TRUE;
77202be438aSmrg}
773