1 2#ifdef HAVE_CONFIG_H 3#include "config.h" 4#endif 5 6#include "xf86.h" 7#include "xf86_OSproc.h" 8#include "xf86Pci.h" 9#include "tdfx.h" 10 11#define AACLKOUTDEL 0x2 12#define CFGSWAPALGORITHM 0x1 13 14/* #define RD_ABORT_ERROR */ 15#define H3VDD 16 17Bool TDFXDisableSLI(TDFXPtr pTDFX) 18{ 19 int i; 20 uint32_t v; 21 22 for (i=0; i<pTDFX->numChips; i++) { 23 PCI_READ_LONG(v, CFG_INIT_ENABLE, i); 24 PCI_WRITE_LONG(v & ~(CFG_SNOOP_MEMBASE0 | CFG_SNOOP_EN | 25 CFG_SNOOP_MEMBASE0_EN | 26 CFG_SNOOP_MEMBASE1_EN | CFG_SNOOP_SLAVE | 27 CFG_SNOOP_FBIINIT_WR_EN | CFG_SWAP_ALGORITHM | 28 CFG_SWAP_QUICK), 29 CFG_INIT_ENABLE, i); 30 31 PCI_READ_LONG(v, CFG_SLI_LFB_CTRL, i); 32 PCI_WRITE_LONG(v & ~(CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN | 33 CFG_SLI_RD_EN), 34 CFG_SLI_LFB_CTRL, i); 35#ifdef H3VDD 36 pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 0); 37 pTDFX->writeChipLong(pTDFX, i, SST_3D_AACTRL, 0); 38#endif 39 40 PCI_READ_LONG(v, CFG_AA_LFB_CTRL, i); 41 PCI_WRITE_LONG(v & ~(CFG_AA_LFB_CPU_WR_EN | CFG_AA_LFB_DPTCH_WR_EN | 42 CFG_AA_LFB_RD_EN), 43 CFG_AA_LFB_CTRL, i); 44 45 PCI_READ_LONG(v, CFG_SLI_AA_MISC, i); 46 PCI_WRITE_LONG((v & ~CFG_VGA_VSYNC_OFFSET) | 47 (0 << CFG_VGA_VSYNC_OFFSET_PIXELS_SHIFT) | 48 (0 << CFG_VGA_VSYNC_OFFSET_CHARS_SHIFT) | 49 (0 << CFG_VGA_VSYNC_OFFSET_HXTRA_SHIFT), 50 CFG_SLI_AA_MISC, i); 51 52 PCI_WRITE_LONG(0, CFG_VIDEO_CTRL0, i); 53 PCI_WRITE_LONG(0, CFG_VIDEO_CTRL1, i); 54 PCI_WRITE_LONG(0, CFG_VIDEO_CTRL2, i); 55 56 if (pTDFX->numChips>1) { 57 v=pTDFX->readChipLong(pTDFX, i, PCIINIT0); 58 pTDFX->writeChipLong(pTDFX, i, PCIINIT0, 59 (v&~(SST_PCI_DISABLE_IO|SST_PCI_DISABLE_MEM| 60 SST_PCI_RETRY_INTERVAL)) | 61 (0<<SST_PCI_RETRY_INTERVAL_SHIFT) | 62 SST_PCI_FORCE_FB_HIGH); 63 } else { 64 v=pTDFX->readChipLong(pTDFX, i, PCIINIT0); 65 pTDFX->writeChipLong(pTDFX, i, PCIINIT0, 66 (v&~(SST_PCI_DISABLE_IO|SST_PCI_DISABLE_MEM| 67 SST_PCI_RETRY_INTERVAL)) | 68 (0<<SST_PCI_RETRY_INTERVAL_SHIFT)); 69 } 70 71#if 0 72 if (i>0) { 73 pTDFX->writeChipLong(pTDFX, i, DACMODE, 74 SST_DAC_DPMS_ON_VSYNC | SST_DAC_DPMS_ON_HSYNC); 75 v=pTDFX->readChipLong(pTDFX, i, VIDPROCCFG); 76 pTDFX->writeChipLong(pTDFX, i, VIDPROCCFG, v&~SST_VIDEO_PROCESSOR_EN); 77 } 78#endif 79 } 80 return TRUE; 81} 82 83Bool TDFXSetupSLI(ScrnInfoPtr pScrn, Bool sliEnable, int aaSamples) 84{ 85 TDFXPtr pTDFX; 86 uint32_t v; 87 int i, sliLines, sliLinesLog2, nChipsLog2; 88 int sli_renderMask, sli_compareMask, sli_scanMask; 89 int sliAnalog, dwFormat; 90 91 pTDFX=TDFXPTR(pScrn); 92 if (pScrn->depth == 24 || pScrn->depth==32) { 93 if ((aaSamples == 4) && (pTDFX->numChips>1)) { 94 pTDFX->pixelFormat=GR_PIXFMT_AA_4_ARGB_8888; 95 } else if (aaSamples >= 2) { 96 pTDFX->pixelFormat=GR_PIXFMT_AA_2_ARGB_8888; 97 } else { 98 pTDFX->pixelFormat=GR_PIXFMT_ARGB_8888; 99 } 100 } else if (pScrn->depth == 16) { 101 if ((aaSamples == 4) && (pTDFX->numChips>1)) { 102 pTDFX->pixelFormat=GR_PIXFMT_AA_4_RGB_565; 103 } else if (aaSamples >= 2) { 104 pTDFX->pixelFormat=GR_PIXFMT_AA_2_RGB_565; 105 } else { 106 pTDFX->pixelFormat=GR_PIXFMT_RGB_565; 107 } 108 } else if (pScrn->depth == 8) { 109 pTDFX->pixelFormat=GR_PIXFMT_I_8; 110 } 111 if (!sliEnable && !aaSamples) { /* Turn off */ 112 return TDFXDisableSLI(pTDFX); 113 } 114 115 if (pScrn->virtualY>768) sliLinesLog2=5; 116 else sliLinesLog2=4; 117 sliLines=1<<sliLinesLog2; 118 if (pScrn->virtualY*pScrn->virtualX>1600*1024) sliAnalog=1; 119 else sliAnalog=0; 120 /* XXX We need to avoid SLI in double scan modes somehow */ 121 122 switch (pTDFX->numChips) { 123 case 1: 124 nChipsLog2=0; 125 break; 126 case 2: 127 nChipsLog2=1; 128 break; 129 case 4: 130 nChipsLog2=2; 131 break; 132 default: 133 return FALSE; 134 /* XXX Huh? Unsupported configuration */ 135 } 136 137 for (i=0; i<pTDFX->numChips; i++) { 138 /* Do we want to set these differently for a VIA board? */ 139 v=pTDFX->readChipLong(pTDFX, i, PCIINIT0); 140 v=(v&~(SST_PCI_RETRY_INTERVAL|SST_PCI_FORCE_FB_HIGH)) | 141 SST_PCI_READ_WS | SST_PCI_WRITE_WS | 142 SST_PCI_DISABLE_IO | SST_PCI_DISABLE_MEM | 143 (5<<SST_PCI_RETRY_INTERVAL_SHIFT); 144 pTDFX->writeChipLong(pTDFX, i, PCIINIT0, 145 (v&~(SST_PCI_RETRY_INTERVAL|SST_PCI_FORCE_FB_HIGH)) | 146 SST_PCI_READ_WS | SST_PCI_WRITE_WS | 147 SST_PCI_DISABLE_IO | SST_PCI_DISABLE_MEM | 148 (5<<SST_PCI_RETRY_INTERVAL_SHIFT)); 149 v=pTDFX->readChipLong(pTDFX, i, TMUGBEINIT); 150 pTDFX->writeChipLong(pTDFX, i, TMUGBEINIT, 151 (v&~(SST_AA_CLK_DELAY | SST_AA_CLK_INVERT)) | 152 (AACLKOUTDEL<<SST_AA_CLK_DELAY_SHIFT) | 153 SST_AA_CLK_INVERT); 154 155 if (pTDFX->numChips>1) { 156 PCI_READ_LONG(v, CFG_INIT_ENABLE, i); 157 PCI_WRITE_LONG(v | 158 (CFGSWAPALGORITHM << CFG_SWAPBUFFER_ALGORITHM_SHIFT) | 159 CFG_SWAP_ALGORITHM | ((!i)? CFG_SWAP_MASTER : 0), 160 CFG_INIT_ENABLE, i); 161 if (!i) { 162 PCI_READ_LONG(v, CFG_INIT_ENABLE, i); 163 PCI_WRITE_LONG(v | CFG_SNOOP_EN, CFG_INIT_ENABLE, i); 164 PCI_READ_LONG(v, CFG_PCI_DECODE, i); 165 } else { 166 PCI_READ_LONG(v, CFG_INIT_ENABLE, i); 167 168 v = (v & ~CFG_SNOOP_MEMBASE0) | CFG_SNOOP_EN | 169 CFG_SNOOP_MEMBASE0_EN | CFG_SNOOP_MEMBASE1_EN | 170 CFG_SNOOP_SLAVE | CFG_SNOOP_FBIINIT_WR_EN | 171 (((pTDFX->MMIOAddr[0]>>22)&0x3ff)<<CFG_SNOOP_MEMBASE0_SHIFT) | 172 ((pTDFX->numChips>2)? CFG_SWAP_QUICK : 0); 173 174 PCI_WRITE_LONG(v, CFG_INIT_ENABLE, i); 175 176 PCI_READ_LONG(v, CFG_PCI_DECODE, i); 177 v = (v & ~CFG_SNOOP_MEMBASE1) | 178 ((pTDFX->LinearAddr[0]>>22)&0x3ff)<<CFG_SNOOP_MEMBASE1_SHIFT; 179 PCI_WRITE_LONG(v, CFG_PCI_DECODE, i); 180 } 181 } 182 183 if (sliEnable && aaSamples<4) { 184 /* SLI is on and we're using less than 4 AA samples */ 185 sli_renderMask = (pTDFX->numChips-1) << sliLinesLog2; 186 sli_compareMask = i << sliLinesLog2; 187 sli_scanMask = sliLines - 1; 188 v = (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) | 189 (sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) | 190 (sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) | 191 (nChipsLog2 << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT) | 192 CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN; 193#ifndef RD_ABORT_ERROR 194 v|=CFG_SLI_RD_EN; 195#endif 196 PCI_WRITE_LONG(v, CFG_SLI_LFB_CTRL, i); 197 198#ifdef H3VDD 199 pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 200 (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) | 201 (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) | 202 (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) | 203 (nChipsLog2 << SLICTL_3D_NUMCHIPS_LOG2_SHIFT) | 204 SLICTL_3D_EN); 205#endif 206 } else if (!sliEnable && aaSamples) { 207 /* SLI is off and AA is on */ 208 sli_renderMask = 0; 209 sli_compareMask = 0; 210 sli_scanMask = 0; 211 PCI_WRITE_LONG((sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) | 212 (sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) | 213 (sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) | 214 (0x0 << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT), 215 CFG_SLI_LFB_CTRL, i); 216#ifdef H3VDD 217 pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 218 (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) | 219 (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) | 220 (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) | 221 (0 << SLICTL_3D_NUMCHIPS_LOG2_SHIFT)); 222#endif 223 } else { 224 /* SLI is on && aaSamples=4 */ 225 sli_renderMask = ((pTDFX->numChips>>1)-1) << sliLinesLog2; 226 sli_compareMask = (i>>1) << sliLinesLog2; 227 sli_scanMask = sliLines - 1; 228 v = (sli_renderMask << CFG_SLI_LFB_RENDERMASK_SHIFT) | 229 (sli_compareMask << CFG_SLI_LFB_COMPAREMASK_SHIFT) | 230 (sli_scanMask << CFG_SLI_LFB_SCANMASK_SHIFT) | 231 ((nChipsLog2-1) << CFG_SLI_LFB_NUMCHIPS_LOG2_SHIFT) | 232 CFG_SLI_LFB_CPU_WR_EN | CFG_SLI_LFB_DPTCH_WR_EN; 233#ifndef RD_ABORT_ERROR 234 v|=CFG_SLI_RD_EN; 235#endif 236 PCI_WRITE_LONG(v, CFG_SLI_LFB_CTRL, i); 237#ifdef H3VDD 238 pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 239 (sli_renderMask << SLICTL_3D_RENDERMASK_SHIFT) | 240 (sli_compareMask << SLICTL_3D_COMPAREMASK_SHIFT) | 241 (sli_scanMask << SLICTL_3D_SCANMASK_SHIFT) | 242 ((nChipsLog2-1) << SLICTL_3D_NUMCHIPS_LOG2_SHIFT) | 243 SLICTL_3D_EN); 244#endif 245 } 246 247 TDFXSetLFBConfig(pTDFX); 248 if (pTDFX->cpp==2) dwFormat = CFG_AA_LFB_RD_FORMAT_16BPP; 249 else dwFormat = CFG_AA_LFB_RD_FORMAT_32BPP; 250 if (pTDFX->numChips==2 && !sliEnable && aaSamples==2) 251 dwFormat|=CFG_AA_LFB_RD_DIVIDE_BY_4; 252 /* Thess are wrong, because we don't know where the secondary buffers 253 are located */ 254 pTDFX->writeChipLong(pTDFX, i, CFG_AA_LFB_CTRL, 255 (pScrn->videoRam<<10 /* 2nd buf */ << CFG_AA_BASEADDR_SHIFT) | 256 CFG_AA_LFB_CPU_WR_EN | CFG_AA_LFB_DPTCH_WR_EN | 257 CFG_AA_LFB_RD_EN | dwFormat | 258 ((aaSamples==4)?CFG_AA_LFB_RD_DIVIDE_BY_4:0)); 259 pTDFX->writeChipLong(pTDFX, i, CFG_AA_ZBUFF_APERTURE, 260 ((pTDFX->depthOffset>>12)<<CFG_AA_DEPTH_BUFFER_BEG_SHIFT) | 261 ((pScrn->videoRam>>2)<<CFG_AA_DEPTH_BUFFER_END_SHIFT)); 262 263 if (pTDFX->numChips>1 && i && (aaSamples || sliEnable)) { 264 int vsyncOffsetPixels, vsyncOffsetChars, vsyncOffsetHXtra; 265 266 if (aaSamples || (pTDFX->numChips==4 && sliEnable && aaSamples==4 && 267 sliAnalog && i==3)) { 268 vsyncOffsetPixels=7; 269 vsyncOffsetChars=4; 270 vsyncOffsetHXtra=0; 271 } else { 272 vsyncOffsetPixels=7; 273 vsyncOffsetChars=5; 274 vsyncOffsetHXtra=0; 275 } 276 PCI_READ_LONG(v, CFG_SLI_AA_MISC, i); 277 PCI_WRITE_LONG((v & ~CFG_VGA_VSYNC_OFFSET) | 278 (vsyncOffsetPixels << CFG_VGA_VSYNC_OFFSET_PIXELS_SHIFT) | 279 (vsyncOffsetChars << CFG_VGA_VSYNC_OFFSET_CHARS_SHIFT) | 280 (vsyncOffsetHXtra << CFG_VGA_VSYNC_OFFSET_HXTRA_SHIFT), 281 CFG_SLI_AA_MISC, i); 282 } 283 if (pTDFX->numChips==1 && aaSamples) { 284 /* 1 chip 2 AA */ 285 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 286 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 287 CFG_VIDEO_OTHERMUX_SEL_PIPE<<CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT | 288 CFG_DIVIDE_VIDEO_BY_2, 289 CFG_VIDEO_CTRL0, i); 290 PCI_WRITE_LONG(0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT | 291 0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT | 292 0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT | 293 0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT, 294 CFG_VIDEO_CTRL1, i); 295 PCI_WRITE_LONG(0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT | 296 0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT, 297 CFG_VIDEO_CTRL2, i); 298 } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==4 && 299 !sliAnalog) { 300 /* 2 chips 4 digital AA */ 301 if (!i) { 302 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 303 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 304 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO << 305 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 306 CFG_DIVIDE_VIDEO_BY_4, 307 CFG_VIDEO_CTRL0, i); 308 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 309 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 310 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 311 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 312 CFG_VIDEO_CTRL1, i); 313 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 314 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 315 CFG_VIDEO_CTRL2, i); 316 } else { 317 PCI_WRITE_LONG((CFG_ENHANCED_VIDEO_EN | 318 CFG_ENHANCED_VIDEO_SLV | 319 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 320 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 321 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 322 CFG_DIVIDE_VIDEO_BY_1), 323 CFG_VIDEO_CTRL0, i); 324 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 325 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 326 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 327 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT), 328 CFG_VIDEO_CTRL1, i); 329 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 330 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 331 CFG_VIDEO_CTRL2, i); 332 } 333 } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==4 && sliAnalog) { 334 /* 2 chips 4 analog AA */ 335 if (!i) { 336 PCI_WRITE_LONG((CFG_ENHANCED_VIDEO_EN | 337 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 338 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 339 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 340 CFG_DIVIDE_VIDEO_BY_4), 341 CFG_VIDEO_CTRL0, i); 342 } else { 343 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 344 CFG_ENHANCED_VIDEO_SLV | 345 CFG_DAC_HSYNC_TRISTATE | 346 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 347 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 348 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 349 CFG_DIVIDE_VIDEO_BY_4, 350 CFG_VIDEO_CTRL0, i); 351 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 352 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 353 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 354 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 355 CFG_VIDEO_CTRL1, i); 356 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 357 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 358 CFG_VIDEO_CTRL2, i); 359 } 360 } else if (pTDFX->numChips==2 && sliEnable && !aaSamples && !sliAnalog) { 361 /* 2 chips 2 digital SLI */ 362 if (!i) { 363 PCI_WRITE_LONG((CFG_ENHANCED_VIDEO_EN | 364 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO << 365 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 366 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 367 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 368 CFG_DIVIDE_VIDEO_BY_1), 369 CFG_VIDEO_CTRL0, i); 370 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 371 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 372 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 373 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 374 CFG_VIDEO_CTRL1, i); 375 PCI_WRITE_LONG(((0x0<<sliLinesLog2) << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 376 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 377 CFG_VIDEO_CTRL2, i); 378 } else { 379 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 380 CFG_ENHANCED_VIDEO_SLV | 381 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 382 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 383 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 384 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 385 CFG_DIVIDE_VIDEO_BY_1, 386 CFG_VIDEO_CTRL0, i); 387 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 388 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 389 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 390 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 391 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT), 392 CFG_VIDEO_CTRL1, i); 393 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 394 CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 395 ((i<<sliLinesLog2) << 396 CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 397 CFG_VIDEO_CTRL2, i); 398 } 399 } else if (pTDFX->numChips>=2 && sliEnable && !aaSamples && sliAnalog) { 400 /* 2 or 4 chips 2/4 analog SLI */ 401 if (!i) { 402 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 403 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 404 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 405 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 406 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 407 CFG_DIVIDE_VIDEO_BY_1, 408 CFG_VIDEO_CTRL0, i); 409 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 410 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 411 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 412 (((pTDFX->numChips-1)<<sliLinesLog2) << 413 CFG_SLI_RENDERMASK_CRT_SHIFT) | 414 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 415 CFG_VIDEO_CTRL1, i); 416 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 417 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 418 CFG_VIDEO_CTRL2, i); 419 } else { 420 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 421 CFG_ENHANCED_VIDEO_SLV | 422 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 423 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 424 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 425 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 426 CFG_DIVIDE_VIDEO_BY_1, 427 CFG_VIDEO_CTRL0, i); 428 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 429 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 430 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 431 (((pTDFX->numChips-1)<<sliLinesLog2) << 432 CFG_SLI_RENDERMASK_CRT_SHIFT) | 433 ((i<<sliLinesLog2) << 434 CFG_SLI_COMPAREMASK_CRT_SHIFT), 435 CFG_VIDEO_CTRL1, i); 436 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 437 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 438 CFG_VIDEO_CTRL2, i); 439 } 440 } else if (pTDFX->numChips==2 && sliEnable && aaSamples==2 && !sliAnalog) { 441 /* 2 chips 2 AA 2 digital SLI */ 442 if (!i) { 443 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 444 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 445 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO << 446 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 447 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 448 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 449 CFG_DIVIDE_VIDEO_BY_2, 450 CFG_VIDEO_CTRL0, i); 451 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 452 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 453 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 454 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 455 CFG_VIDEO_CTRL1, i); 456 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 457 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 458 CFG_VIDEO_CTRL2, i); 459 } else { 460 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 461 CFG_ENHANCED_VIDEO_SLV | 462 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 463 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 464 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 465 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 466 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 467 CFG_DIVIDE_VIDEO_BY_1, 468 CFG_VIDEO_CTRL0, i); 469 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 470 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 471 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 472 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 473 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT), 474 CFG_VIDEO_CTRL1, i); 475 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 476 CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 477 ((i<<sliLinesLog2) << 478 CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 479 CFG_VIDEO_CTRL2, i); 480 } 481 } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==2 && !sliAnalog) { 482 /* 2 chips 2 digital AA */ 483 if (!i) { 484 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 485 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO << 486 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 487 CFG_DIVIDE_VIDEO_BY_2, 488 CFG_VIDEO_CTRL0, i); 489 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 490 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 491 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 492 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 493 CFG_VIDEO_CTRL1, i); 494 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 495 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 496 CFG_VIDEO_CTRL2, i); 497 } else { 498 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 499 CFG_ENHANCED_VIDEO_SLV | 500 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 501 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 502 CFG_DIVIDE_VIDEO_BY_1, 503 CFG_VIDEO_CTRL0, i); 504 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 505 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 506 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 507 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT), 508 CFG_VIDEO_CTRL1, i); 509 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 510 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 511 CFG_VIDEO_CTRL2, i); 512 } 513 } else if (pTDFX->numChips==2 && !sliEnable && aaSamples==2 && sliAnalog) { 514 /* 2 chips 2 analog AA */ 515 if (!i) { 516 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 517 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 518 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 519 CFG_DIVIDE_VIDEO_BY_2, 520 CFG_VIDEO_CTRL0, i); 521 } else { 522 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 523 CFG_ENHANCED_VIDEO_SLV | 524 CFG_DAC_HSYNC_TRISTATE | 525 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 526 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 527 CFG_DIVIDE_VIDEO_BY_2, 528 CFG_VIDEO_CTRL0, i); 529 } 530 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 531 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 532 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 533 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 534 CFG_VIDEO_CTRL1, i); 535 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 536 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 537 CFG_VIDEO_CTRL2, i); 538 } else if (pTDFX->numChips>=2 && sliEnable && aaSamples==2 && sliAnalog) { 539 /* 2 or 4 chips 2 AA 2 or 4 analog SLI */ 540 if (!i) { 541 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 542 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 543 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 544 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 545 CFG_DIVIDE_VIDEO_BY_2, 546 CFG_VIDEO_CTRL0, i); 547 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 548 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 549 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 550 (((pTDFX->numChips-1)<<sliLinesLog2) << 551 CFG_SLI_RENDERMASK_CRT_SHIFT) | 552 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 553 CFG_VIDEO_CTRL1, i); 554 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 555 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 556 CFG_VIDEO_CTRL2, i); 557 } else { 558 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 559 CFG_ENHANCED_VIDEO_SLV | 560 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 561 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 562 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 563 CFG_DIVIDE_VIDEO_BY_2, 564 CFG_VIDEO_CTRL0, i); 565 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 566 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 567 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 568 (((pTDFX->numChips-1)<<sliLinesLog2) << 569 CFG_SLI_RENDERMASK_CRT_SHIFT) | 570 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 571 CFG_VIDEO_CTRL1, i); 572 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 573 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 574 CFG_VIDEO_CTRL2, i); 575 } 576 } else if (pTDFX->numChips==4 && sliEnable && !aaSamples && !sliAnalog) { 577 /* 4 chips 4 digital SLI */ 578 if (!i) { 579 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 580 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO << 581 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 582 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 583 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 584 CFG_SLI_AAFIFO_COMPARE_INV | 585 CFG_DIVIDE_VIDEO_BY_1, 586 CFG_VIDEO_CTRL0, i); 587 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 588 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 589 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 590 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 591 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 592 CFG_VIDEO_CTRL1, i); 593 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 594 CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 595 ((0x0<<sliLinesLog2) << 596 CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 597 CFG_VIDEO_CTRL2, i); 598 } else { 599 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 600 CFG_ENHANCED_VIDEO_SLV | 601 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 602 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 603 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 604 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 605 CFG_DIVIDE_VIDEO_BY_1, 606 CFG_VIDEO_CTRL0, i); 607 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 608 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 609 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 610 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 611 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT), 612 CFG_VIDEO_CTRL1, i); 613 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 614 CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 615 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 616 CFG_VIDEO_CTRL2, i); 617 } 618 } else if (pTDFX->numChips==4 && sliEnable && aaSamples==2 && !sliAnalog) { 619 /* 4 chips 2 AA 4 digital SLI */ 620 if (!i) { 621 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 622 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 623 (CFG_VIDEO_OTHERMUX_SEL_AAFIFO << 624 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 625 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 626 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 627 CFG_SLI_AAFIFO_COMPARE_INV | 628 CFG_DIVIDE_VIDEO_BY_2, 629 CFG_VIDEO_CTRL0, i); 630 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 631 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 632 (0x0 << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 633 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 634 (0x0 << CFG_SLI_COMPAREMASK_CRT_SHIFT), 635 CFG_VIDEO_CTRL1, i); 636 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 637 CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 638 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 639 CFG_VIDEO_CTRL2, i); 640 } else { 641 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 642 CFG_ENHANCED_VIDEO_SLV | 643 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 644 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 645 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 646 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 647 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 648 CFG_DIVIDE_VIDEO_BY_1, 649 CFG_VIDEO_CTRL0, i); 650 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 651 CFG_SLI_RENDERMASK_FETCH_SHIFT) | 652 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 653 (0x0 << CFG_SLI_RENDERMASK_CRT_SHIFT) | 654 (0xff << CFG_SLI_COMPAREMASK_CRT_SHIFT), 655 CFG_VIDEO_CTRL1, i); 656 PCI_WRITE_LONG((((pTDFX->numChips-1)<<sliLinesLog2) << 657 CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 658 ((i<<sliLinesLog2) << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 659 CFG_VIDEO_CTRL2, i); 660 } 661 } else if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && !sliAnalog) { 662 /* 4 chips 4 AA 2 digital SLI */ 663 if (!i) { 664 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 665 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 666 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO << 667 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 668 CFG_DIVIDE_VIDEO_BY_4, 669 CFG_VIDEO_CTRL0, i); 670 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 671 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 672 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) | 673 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 674 CFG_VIDEO_CTRL1, i); 675 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 676 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 677 CFG_VIDEO_CTRL2, i); 678 } else if (i==1 || i==3) { 679 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 680 CFG_ENHANCED_VIDEO_SLV | 681 CFG_DAC_HSYNC_TRISTATE | 682 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 683 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 684 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 685 CFG_DIVIDE_VIDEO_BY_1, 686 CFG_VIDEO_CTRL0, i); 687 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 688 ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 689 ((0x0<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) | 690 ((0xff<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 691 CFG_VIDEO_CTRL1, i); 692 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 693 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 694 CFG_VIDEO_CTRL2, i); 695 } else { 696 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 697 CFG_ENHANCED_VIDEO_SLV | 698 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 699 (CFG_VIDEO_OTHERMUX_SEL_PIPE_PLUS_AAFIFO << 700 CFG_VIDEO_OTHERMUX_SEL_FALSE_SHIFT) | 701 CFG_DIVIDE_VIDEO_BY_4, 702 CFG_VIDEO_CTRL0, i); 703 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 704 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 705 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) | 706 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 707 CFG_VIDEO_CTRL1, i); 708 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 709 (0xff << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 710 CFG_VIDEO_CTRL2, i); 711 } 712 } else if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && sliAnalog) { 713 /* 4 chips 4 AA 2 analog SLI */ 714 if (!i) { 715 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 716 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 717 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 718 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 719 CFG_DIVIDE_VIDEO_BY_4, 720 CFG_VIDEO_CTRL0, i); 721 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 722 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 723 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) | 724 ((0x0<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 725 CFG_VIDEO_CTRL1, i); 726 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 727 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 728 CFG_VIDEO_CTRL2, i); 729 } else if (i==1 || i==3) { 730 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 731 CFG_ENHANCED_VIDEO_SLV | 732 CFG_DAC_HSYNC_TRISTATE | 733 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 734 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 735 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 736 CFG_DIVIDE_VIDEO_BY_4, 737 CFG_VIDEO_CTRL0, i); 738 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 739 ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 740 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) | 741 ((((i+1)>>2)<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 742 CFG_VIDEO_CTRL1, i); 743 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 744 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 745 CFG_VIDEO_CTRL2, i); 746 } else { 747 PCI_WRITE_LONG(CFG_ENHANCED_VIDEO_EN | 748 CFG_ENHANCED_VIDEO_SLV | 749 CFG_VIDEO_LOCALMUX_DESKTOP_PLUS_OVERLAY | 750 (CFG_VIDEO_OTHERMUX_SEL_PIPE << 751 CFG_VIDEO_OTHERMUX_SEL_TRUE_SHIFT) | 752 CFG_DIVIDE_VIDEO_BY_4, 753 CFG_VIDEO_CTRL0, i); 754 PCI_WRITE_LONG(((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_FETCH_SHIFT) | 755 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_FETCH_SHIFT) | 756 ((0x1<<sliLinesLog2) << CFG_SLI_RENDERMASK_CRT_SHIFT) | 757 ((0x1<<sliLinesLog2) << CFG_SLI_COMPAREMASK_CRT_SHIFT), 758 CFG_VIDEO_CTRL1, i); 759 PCI_WRITE_LONG((0x0 << CFG_SLI_RENDERMASK_AAFIFO_SHIFT) | 760 (0x0 << CFG_SLI_COMPAREMASK_AAFIFO_SHIFT), 761 CFG_VIDEO_CTRL2, i); 762 } 763 } 764 if (pTDFX->numChips==4 && sliEnable && aaSamples==4 && i==3) { 765 PCI_READ_LONG(v, CFG_SLI_AA_MISC, i); 766 PCI_WRITE_LONG(v | CFG_AA_LFB_RD_SLV_WAIT, CFG_SLI_AA_MISC, i); 767 } 768 if (i) { 769 PCI_READ_LONG(v, CFG_VIDEO_CTRL0, i); 770 PCI_WRITE_LONG(v | CFG_VIDPLL_SEL, CFG_VIDEO_CTRL0, i); 771 v=pTDFX->readChipLong(pTDFX, i, MISCINIT1); 772 pTDFX->writeChipLong(pTDFX, i, MISCINIT1, v|SST_POWERDOWN_DAC); 773 } 774 } 775 return TRUE; 776} 777