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