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