1 /***************************************************************************\ 2 |* *| 3 |* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| 4 |* *| 5 |* NOTICE TO USER: The source code is copyrighted under U.S. and *| 6 |* international laws. Users and possessors of this source code are *| 7 |* hereby granted a nonexclusive, royalty-free copyright license to *| 8 |* use this code in individual and commercial software. *| 9 |* *| 10 |* Any use of this source code must include, in the user documenta- *| 11 |* tion and internal comments to the code, notices to the end user *| 12 |* as follows: *| 13 |* *| 14 |* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| 15 |* *| 16 |* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| 17 |* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| 18 |* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| 19 |* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| 20 |* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| 21 |* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| 22 |* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| 23 |* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| 24 |* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| 25 |* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| 26 |* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| 27 |* *| 28 |* U.S. Government End Users. This source code is a "commercial *| 29 |* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| 30 |* consisting of "commercial computer software" and "commercial *| 31 |* computer software documentation," as such terms are used in *| 32 |* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| 33 |* ment only as a commercial end item. Consistent with 48 C.F.R. *| 34 |* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| 35 |* all U.S. Government End Users acquire the source code with only *| 36 |* those rights set forth herein. *| 37 |* *| 38 \***************************************************************************/ 39 40 /* 41 * GPL licensing note -- nVidia is allowing a liberal interpretation of 42 * the documentation restriction above, to merely say that this nVidia's 43 * copyright and disclaimer should be included with all code derived 44 * from this source. -- Jeff Garzik <jgarzik@pobox.com>, 01/Nov/99 45 */ 46 47 /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/riva_hw.c,v 1.33 2002/08/05 20:47:06 mvojkovi Exp $ */ 48 49 #include <linux/kernel.h> 50 #include <linux/pci.h> 51 #include <linux/pci_ids.h> 52 #include "riva_hw.h" 53 #include "riva_tbl.h" 54 #include "nv_type.h" 55 56 /* 57 * This file is an OS-agnostic file used to make RIVA 128 and RIVA TNT 58 * operate identically (except TNT has more memory and better 3D quality. 59 */ 60 static int nv3Busy 61 ( 62 RIVA_HW_INST *chip 63 ) 64 { 65 return ((NV_RD32(&chip->Rop->FifoFree, 0) < chip->FifoEmptyCount) || 66 NV_RD32(&chip->PGRAPH[0x000006B0/4], 0) & 0x01); 67 } 68 static int nv4Busy 69 ( 70 RIVA_HW_INST *chip 71 ) 72 { 73 return ((NV_RD32(&chip->Rop->FifoFree, 0) < chip->FifoEmptyCount) || 74 NV_RD32(&chip->PGRAPH[0x00000700/4], 0) & 0x01); 75 } 76 static int nv10Busy 77 ( 78 RIVA_HW_INST *chip 79 ) 80 { 81 return ((NV_RD32(&chip->Rop->FifoFree, 0) < chip->FifoEmptyCount) || 82 NV_RD32(&chip->PGRAPH[0x00000700/4], 0) & 0x01); 83 } 84 85 static void vgaLockUnlock 86 ( 87 RIVA_HW_INST *chip, 88 int Lock 89 ) 90 { 91 U008 cr11; 92 VGA_WR08(chip->PCIO, 0x3D4, 0x11); 93 cr11 = VGA_RD08(chip->PCIO, 0x3D5); 94 if(Lock) cr11 |= 0x80; 95 else cr11 &= ~0x80; 96 VGA_WR08(chip->PCIO, 0x3D5, cr11); 97 } 98 static void nv3LockUnlock 99 ( 100 RIVA_HW_INST *chip, 101 int Lock 102 ) 103 { 104 VGA_WR08(chip->PVIO, 0x3C4, 0x06); 105 VGA_WR08(chip->PVIO, 0x3C5, Lock ? 0x99 : 0x57); 106 vgaLockUnlock(chip, Lock); 107 } 108 static void nv4LockUnlock 109 ( 110 RIVA_HW_INST *chip, 111 int Lock 112 ) 113 { 114 VGA_WR08(chip->PCIO, 0x3D4, 0x1F); 115 VGA_WR08(chip->PCIO, 0x3D5, Lock ? 0x99 : 0x57); 116 vgaLockUnlock(chip, Lock); 117 } 118 119 static int ShowHideCursor 120 ( 121 RIVA_HW_INST *chip, 122 int ShowHide 123 ) 124 { 125 int cursor; 126 cursor = chip->CurrentState->cursor1; 127 chip->CurrentState->cursor1 = (chip->CurrentState->cursor1 & 0xFE) | 128 (ShowHide & 0x01); 129 VGA_WR08(chip->PCIO, 0x3D4, 0x31); 130 VGA_WR08(chip->PCIO, 0x3D5, chip->CurrentState->cursor1); 131 return (cursor & 0x01); 132 } 133 134 /****************************************************************************\ 135 * * 136 * The video arbitration routines calculate some "magic" numbers. Fixes * 137 * the snow seen when accessing the framebuffer without it. * 138 * It just works (I hope). * 139 * * 140 \****************************************************************************/ 141 142 #define DEFAULT_GR_LWM 100 143 #define DEFAULT_VID_LWM 100 144 #define DEFAULT_GR_BURST_SIZE 256 145 #define DEFAULT_VID_BURST_SIZE 128 146 #define VIDEO 0 147 #define GRAPHICS 1 148 #define MPORT 2 149 #define ENGINE 3 150 #define GFIFO_SIZE 320 151 #define GFIFO_SIZE_128 256 152 #define MFIFO_SIZE 120 153 #define VFIFO_SIZE 256 154 155 typedef struct { 156 int gdrain_rate; 157 int vdrain_rate; 158 int mdrain_rate; 159 int gburst_size; 160 int vburst_size; 161 char vid_en; 162 char gr_en; 163 int wcmocc, wcgocc, wcvocc, wcvlwm, wcglwm; 164 int by_gfacc; 165 char vid_only_once; 166 char gr_only_once; 167 char first_vacc; 168 char first_gacc; 169 char first_macc; 170 int vocc; 171 int gocc; 172 int mocc; 173 char cur; 174 char engine_en; 175 char converged; 176 int priority; 177 } nv3_arb_info; 178 typedef struct { 179 int graphics_lwm; 180 int video_lwm; 181 int graphics_burst_size; 182 int video_burst_size; 183 int graphics_hi_priority; 184 int media_hi_priority; 185 int rtl_values; 186 int valid; 187 } nv3_fifo_info; 188 typedef struct { 189 char pix_bpp; 190 char enable_video; 191 char gr_during_vid; 192 char enable_mp; 193 int memory_width; 194 int video_scale; 195 int pclk_khz; 196 int mclk_khz; 197 int mem_page_miss; 198 int mem_latency; 199 char mem_aligned; 200 } nv3_sim_state; 201 typedef struct { 202 int graphics_lwm; 203 int video_lwm; 204 int graphics_burst_size; 205 int video_burst_size; 206 int valid; 207 } nv4_fifo_info; 208 typedef struct { 209 int pclk_khz; 210 int mclk_khz; 211 int nvclk_khz; 212 char mem_page_miss; 213 char mem_latency; 214 int memory_width; 215 char enable_video; 216 char gr_during_vid; 217 char pix_bpp; 218 char mem_aligned; 219 char enable_mp; 220 } nv4_sim_state; 221 typedef struct { 222 int graphics_lwm; 223 int video_lwm; 224 int graphics_burst_size; 225 int video_burst_size; 226 int valid; 227 } nv10_fifo_info; 228 typedef struct { 229 int pclk_khz; 230 int mclk_khz; 231 int nvclk_khz; 232 char mem_page_miss; 233 char mem_latency; 234 u32 memory_type; 235 int memory_width; 236 char enable_video; 237 char gr_during_vid; 238 char pix_bpp; 239 char mem_aligned; 240 char enable_mp; 241 } nv10_sim_state; 242 static int nv3_iterate(nv3_fifo_info *res_info, nv3_sim_state * state, nv3_arb_info *ainfo) 243 { 244 int iter = 0; 245 int tmp; 246 int vfsize, mfsize, gfsize; 247 int mburst_size = 32; 248 int mmisses, gmisses, vmisses; 249 int misses; 250 int vlwm, glwm, mlwm; 251 int last, next, cur; 252 int max_gfsize ; 253 long ns; 254 255 vlwm = 0; 256 glwm = 0; 257 mlwm = 0; 258 vfsize = 0; 259 gfsize = 0; 260 cur = ainfo->cur; 261 mmisses = 2; 262 gmisses = 2; 263 vmisses = 2; 264 if (ainfo->gburst_size == 128) max_gfsize = GFIFO_SIZE_128; 265 else max_gfsize = GFIFO_SIZE; 266 max_gfsize = GFIFO_SIZE; 267 while (1) 268 { 269 if (ainfo->vid_en) 270 { 271 if (ainfo->wcvocc > ainfo->vocc) ainfo->wcvocc = ainfo->vocc; 272 if (ainfo->wcvlwm > vlwm) ainfo->wcvlwm = vlwm ; 273 ns = 1000000 * ainfo->vburst_size/(state->memory_width/8)/state->mclk_khz; 274 vfsize = ns * ainfo->vdrain_rate / 1000000; 275 vfsize = ainfo->wcvlwm - ainfo->vburst_size + vfsize; 276 } 277 if (state->enable_mp) 278 { 279 if (ainfo->wcmocc > ainfo->mocc) ainfo->wcmocc = ainfo->mocc; 280 } 281 if (ainfo->gr_en) 282 { 283 if (ainfo->wcglwm > glwm) ainfo->wcglwm = glwm ; 284 if (ainfo->wcgocc > ainfo->gocc) ainfo->wcgocc = ainfo->gocc; 285 ns = 1000000 * (ainfo->gburst_size/(state->memory_width/8))/state->mclk_khz; 286 gfsize = (ns * (long) ainfo->gdrain_rate)/1000000; 287 gfsize = ainfo->wcglwm - ainfo->gburst_size + gfsize; 288 } 289 mfsize = 0; 290 if (!state->gr_during_vid && ainfo->vid_en) 291 if (ainfo->vid_en && (ainfo->vocc < 0) && !ainfo->vid_only_once) 292 next = VIDEO; 293 else if (ainfo->mocc < 0) 294 next = MPORT; 295 else if (ainfo->gocc< ainfo->by_gfacc) 296 next = GRAPHICS; 297 else return (0); 298 else switch (ainfo->priority) 299 { 300 case VIDEO: 301 if (ainfo->vid_en && ainfo->vocc<0 && !ainfo->vid_only_once) 302 next = VIDEO; 303 else if (ainfo->gr_en && ainfo->gocc<0 && !ainfo->gr_only_once) 304 next = GRAPHICS; 305 else if (ainfo->mocc<0) 306 next = MPORT; 307 else return (0); 308 break; 309 case GRAPHICS: 310 if (ainfo->gr_en && ainfo->gocc<0 && !ainfo->gr_only_once) 311 next = GRAPHICS; 312 else if (ainfo->vid_en && ainfo->vocc<0 && !ainfo->vid_only_once) 313 next = VIDEO; 314 else if (ainfo->mocc<0) 315 next = MPORT; 316 else return (0); 317 break; 318 default: 319 if (ainfo->mocc<0) 320 next = MPORT; 321 else if (ainfo->gr_en && ainfo->gocc<0 && !ainfo->gr_only_once) 322 next = GRAPHICS; 323 else if (ainfo->vid_en && ainfo->vocc<0 && !ainfo->vid_only_once) 324 next = VIDEO; 325 else return (0); 326 break; 327 } 328 last = cur; 329 cur = next; 330 iter++; 331 switch (cur) 332 { 333 case VIDEO: 334 if (last==cur) misses = 0; 335 else if (ainfo->first_vacc) misses = vmisses; 336 else misses = 1; 337 ainfo->first_vacc = 0; 338 if (last!=cur) 339 { 340 ns = 1000000 * (vmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz; 341 vlwm = ns * ainfo->vdrain_rate/ 1000000; 342 vlwm = ainfo->vocc - vlwm; 343 } 344 ns = 1000000*(misses*state->mem_page_miss + ainfo->vburst_size)/(state->memory_width/8)/state->mclk_khz; 345 ainfo->vocc = ainfo->vocc + ainfo->vburst_size - ns*ainfo->vdrain_rate/1000000; 346 ainfo->gocc = ainfo->gocc - ns*ainfo->gdrain_rate/1000000; 347 ainfo->mocc = ainfo->mocc - ns*ainfo->mdrain_rate/1000000; 348 break; 349 case GRAPHICS: 350 if (last==cur) misses = 0; 351 else if (ainfo->first_gacc) misses = gmisses; 352 else misses = 1; 353 ainfo->first_gacc = 0; 354 if (last!=cur) 355 { 356 ns = 1000000*(gmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz ; 357 glwm = ns * ainfo->gdrain_rate/1000000; 358 glwm = ainfo->gocc - glwm; 359 } 360 ns = 1000000*(misses*state->mem_page_miss + ainfo->gburst_size/(state->memory_width/8))/state->mclk_khz; 361 ainfo->vocc = ainfo->vocc + 0 - ns*ainfo->vdrain_rate/1000000; 362 ainfo->gocc = ainfo->gocc + ainfo->gburst_size - ns*ainfo->gdrain_rate/1000000; 363 ainfo->mocc = ainfo->mocc + 0 - ns*ainfo->mdrain_rate/1000000; 364 break; 365 default: 366 if (last==cur) misses = 0; 367 else if (ainfo->first_macc) misses = mmisses; 368 else misses = 1; 369 ainfo->first_macc = 0; 370 ns = 1000000*(misses*state->mem_page_miss + mburst_size/(state->memory_width/8))/state->mclk_khz; 371 ainfo->vocc = ainfo->vocc + 0 - ns*ainfo->vdrain_rate/1000000; 372 ainfo->gocc = ainfo->gocc + 0 - ns*ainfo->gdrain_rate/1000000; 373 ainfo->mocc = ainfo->mocc + mburst_size - ns*ainfo->mdrain_rate/1000000; 374 break; 375 } 376 if (iter>100) 377 { 378 ainfo->converged = 0; 379 return (1); 380 } 381 ns = 1000000*ainfo->gburst_size/(state->memory_width/8)/state->mclk_khz; 382 tmp = ns * ainfo->gdrain_rate/1000000; 383 if (abs(ainfo->gburst_size) + ((abs(ainfo->wcglwm) + 16 ) & ~0x7) - tmp > max_gfsize) 384 { 385 ainfo->converged = 0; 386 return (1); 387 } 388 ns = 1000000*ainfo->vburst_size/(state->memory_width/8)/state->mclk_khz; 389 tmp = ns * ainfo->vdrain_rate/1000000; 390 if (abs(ainfo->vburst_size) + (abs(ainfo->wcvlwm + 32) & ~0xf) - tmp> VFIFO_SIZE) 391 { 392 ainfo->converged = 0; 393 return (1); 394 } 395 if (abs(ainfo->gocc) > max_gfsize) 396 { 397 ainfo->converged = 0; 398 return (1); 399 } 400 if (abs(ainfo->vocc) > VFIFO_SIZE) 401 { 402 ainfo->converged = 0; 403 return (1); 404 } 405 if (abs(ainfo->mocc) > MFIFO_SIZE) 406 { 407 ainfo->converged = 0; 408 return (1); 409 } 410 if (abs(vfsize) > VFIFO_SIZE) 411 { 412 ainfo->converged = 0; 413 return (1); 414 } 415 if (abs(gfsize) > max_gfsize) 416 { 417 ainfo->converged = 0; 418 return (1); 419 } 420 if (abs(mfsize) > MFIFO_SIZE) 421 { 422 ainfo->converged = 0; 423 return (1); 424 } 425 } 426 } 427 static char nv3_arb(nv3_fifo_info * res_info, nv3_sim_state * state, nv3_arb_info *ainfo) 428 { 429 long ens, vns, mns, gns; 430 int mmisses, gmisses, vmisses, eburst_size, mburst_size; 431 int refresh_cycle; 432 433 refresh_cycle = 2*(state->mclk_khz/state->pclk_khz) + 5; 434 mmisses = 2; 435 if (state->mem_aligned) gmisses = 2; 436 else gmisses = 3; 437 vmisses = 2; 438 eburst_size = state->memory_width * 1; 439 mburst_size = 32; 440 gns = 1000000 * (gmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz; 441 ainfo->by_gfacc = gns*ainfo->gdrain_rate/1000000; 442 ainfo->wcmocc = 0; 443 ainfo->wcgocc = 0; 444 ainfo->wcvocc = 0; 445 ainfo->wcvlwm = 0; 446 ainfo->wcglwm = 0; 447 ainfo->engine_en = 1; 448 ainfo->converged = 1; 449 if (ainfo->engine_en) 450 { 451 ens = 1000000*(state->mem_page_miss + eburst_size/(state->memory_width/8) +refresh_cycle)/state->mclk_khz; 452 ainfo->mocc = state->enable_mp ? 0-ens*ainfo->mdrain_rate/1000000 : 0; 453 ainfo->vocc = ainfo->vid_en ? 0-ens*ainfo->vdrain_rate/1000000 : 0; 454 ainfo->gocc = ainfo->gr_en ? 0-ens*ainfo->gdrain_rate/1000000 : 0; 455 ainfo->cur = ENGINE; 456 ainfo->first_vacc = 1; 457 ainfo->first_gacc = 1; 458 ainfo->first_macc = 1; 459 nv3_iterate(res_info, state,ainfo); 460 } 461 if (state->enable_mp) 462 { 463 mns = 1000000 * (mmisses*state->mem_page_miss + mburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; 464 ainfo->mocc = state->enable_mp ? 0 : mburst_size - mns*ainfo->mdrain_rate/1000000; 465 ainfo->vocc = ainfo->vid_en ? 0 : 0- mns*ainfo->vdrain_rate/1000000; 466 ainfo->gocc = ainfo->gr_en ? 0: 0- mns*ainfo->gdrain_rate/1000000; 467 ainfo->cur = MPORT; 468 ainfo->first_vacc = 1; 469 ainfo->first_gacc = 1; 470 ainfo->first_macc = 0; 471 nv3_iterate(res_info, state,ainfo); 472 } 473 if (ainfo->gr_en) 474 { 475 ainfo->first_vacc = 1; 476 ainfo->first_gacc = 0; 477 ainfo->first_macc = 1; 478 gns = 1000000*(gmisses*state->mem_page_miss + ainfo->gburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; 479 ainfo->gocc = ainfo->gburst_size - gns*ainfo->gdrain_rate/1000000; 480 ainfo->vocc = ainfo->vid_en? 0-gns*ainfo->vdrain_rate/1000000 : 0; 481 ainfo->mocc = state->enable_mp ? 0-gns*ainfo->mdrain_rate/1000000: 0; 482 ainfo->cur = GRAPHICS; 483 nv3_iterate(res_info, state,ainfo); 484 } 485 if (ainfo->vid_en) 486 { 487 ainfo->first_vacc = 0; 488 ainfo->first_gacc = 1; 489 ainfo->first_macc = 1; 490 vns = 1000000*(vmisses*state->mem_page_miss + ainfo->vburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; 491 ainfo->vocc = ainfo->vburst_size - vns*ainfo->vdrain_rate/1000000; 492 ainfo->gocc = ainfo->gr_en? (0-vns*ainfo->gdrain_rate/1000000) : 0; 493 ainfo->mocc = state->enable_mp? 0-vns*ainfo->mdrain_rate/1000000 :0 ; 494 ainfo->cur = VIDEO; 495 nv3_iterate(res_info, state, ainfo); 496 } 497 if (ainfo->converged) 498 { 499 res_info->graphics_lwm = (int)abs(ainfo->wcglwm) + 16; 500 res_info->video_lwm = (int)abs(ainfo->wcvlwm) + 32; 501 res_info->graphics_burst_size = ainfo->gburst_size; 502 res_info->video_burst_size = ainfo->vburst_size; 503 res_info->graphics_hi_priority = (ainfo->priority == GRAPHICS); 504 res_info->media_hi_priority = (ainfo->priority == MPORT); 505 if (res_info->video_lwm > 160) 506 { 507 res_info->graphics_lwm = 256; 508 res_info->video_lwm = 128; 509 res_info->graphics_burst_size = 64; 510 res_info->video_burst_size = 64; 511 res_info->graphics_hi_priority = 0; 512 res_info->media_hi_priority = 0; 513 ainfo->converged = 0; 514 return (0); 515 } 516 if (res_info->video_lwm > 128) 517 { 518 res_info->video_lwm = 128; 519 } 520 return (1); 521 } 522 else 523 { 524 res_info->graphics_lwm = 256; 525 res_info->video_lwm = 128; 526 res_info->graphics_burst_size = 64; 527 res_info->video_burst_size = 64; 528 res_info->graphics_hi_priority = 0; 529 res_info->media_hi_priority = 0; 530 return (0); 531 } 532 } 533 static char nv3_get_param(nv3_fifo_info *res_info, nv3_sim_state * state, nv3_arb_info *ainfo) 534 { 535 int done, g,v, p; 536 537 done = 0; 538 for (p=0; p < 2; p++) 539 { 540 for (g=128 ; g > 32; g= g>> 1) 541 { 542 for (v=128; v >=32; v = v>> 1) 543 { 544 ainfo->priority = p; 545 ainfo->gburst_size = g; 546 ainfo->vburst_size = v; 547 done = nv3_arb(res_info, state,ainfo); 548 if (done && (g==128)) 549 if ((res_info->graphics_lwm + g) > 256) 550 done = 0; 551 if (done) 552 goto Done; 553 } 554 } 555 } 556 557 Done: 558 return done; 559 } 560 static void nv3CalcArbitration 561 ( 562 nv3_fifo_info * res_info, 563 nv3_sim_state * state 564 ) 565 { 566 nv3_fifo_info save_info; 567 nv3_arb_info ainfo; 568 char res_gr, res_vid; 569 570 ainfo.gr_en = 1; 571 ainfo.vid_en = state->enable_video; 572 ainfo.vid_only_once = 0; 573 ainfo.gr_only_once = 0; 574 ainfo.gdrain_rate = (int) state->pclk_khz * (state->pix_bpp/8); 575 ainfo.vdrain_rate = (int) state->pclk_khz * 2; 576 if (state->video_scale != 0) 577 ainfo.vdrain_rate = ainfo.vdrain_rate/state->video_scale; 578 ainfo.mdrain_rate = 33000; 579 res_info->rtl_values = 0; 580 if (!state->gr_during_vid && state->enable_video) 581 { 582 ainfo.gr_only_once = 1; 583 ainfo.gr_en = 1; 584 ainfo.gdrain_rate = 0; 585 res_vid = nv3_get_param(res_info, state, &ainfo); 586 res_vid = ainfo.converged; 587 save_info.video_lwm = res_info->video_lwm; 588 save_info.video_burst_size = res_info->video_burst_size; 589 ainfo.vid_en = 1; 590 ainfo.vid_only_once = 1; 591 ainfo.gr_en = 1; 592 ainfo.gdrain_rate = (int) state->pclk_khz * (state->pix_bpp/8); 593 ainfo.vdrain_rate = 0; 594 res_gr = nv3_get_param(res_info, state, &ainfo); 595 res_gr = ainfo.converged; 596 res_info->video_lwm = save_info.video_lwm; 597 res_info->video_burst_size = save_info.video_burst_size; 598 res_info->valid = res_gr & res_vid; 599 } 600 else 601 { 602 if (!ainfo.gr_en) ainfo.gdrain_rate = 0; 603 if (!ainfo.vid_en) ainfo.vdrain_rate = 0; 604 res_gr = nv3_get_param(res_info, state, &ainfo); 605 res_info->valid = ainfo.converged; 606 } 607 } 608 static void nv3UpdateArbitrationSettings 609 ( 610 unsigned VClk, 611 unsigned pixelDepth, 612 unsigned *burst, 613 unsigned *lwm, 614 RIVA_HW_INST *chip 615 ) 616 { 617 nv3_fifo_info fifo_data; 618 nv3_sim_state sim_data; 619 unsigned int M, N, P, pll, MClk; 620 621 pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0); 622 M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; 623 MClk = (N * chip->CrystalFreqKHz / M) >> P; 624 sim_data.pix_bpp = (char)pixelDepth; 625 sim_data.enable_video = 0; 626 sim_data.enable_mp = 0; 627 sim_data.video_scale = 1; 628 sim_data.memory_width = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 0) & 0x10) ? 629 128 : 64; 630 sim_data.memory_width = 128; 631 632 sim_data.mem_latency = 9; 633 sim_data.mem_aligned = 1; 634 sim_data.mem_page_miss = 11; 635 sim_data.gr_during_vid = 0; 636 sim_data.pclk_khz = VClk; 637 sim_data.mclk_khz = MClk; 638 nv3CalcArbitration(&fifo_data, &sim_data); 639 if (fifo_data.valid) 640 { 641 int b = fifo_data.graphics_burst_size >> 4; 642 *burst = 0; 643 while (b >>= 1) 644 (*burst)++; 645 *lwm = fifo_data.graphics_lwm >> 3; 646 } 647 else 648 { 649 *lwm = 0x24; 650 *burst = 0x2; 651 } 652 } 653 static void nv4CalcArbitration 654 ( 655 nv4_fifo_info *fifo, 656 nv4_sim_state *arb 657 ) 658 { 659 int data, pagemiss, cas,width, video_enable, color_key_enable, bpp, align; 660 int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs; 661 int found, mclk_extra, mclk_loop, cbs, m1, p1; 662 int mclk_freq, pclk_freq, nvclk_freq, mp_enable; 663 int us_m, us_n, us_p, video_drain_rate, crtc_drain_rate; 664 int vpm_us, us_video, vlwm, video_fill_us, cpm_us, us_crt,clwm; 665 int craw, vraw; 666 667 fifo->valid = 1; 668 pclk_freq = arb->pclk_khz; 669 mclk_freq = arb->mclk_khz; 670 nvclk_freq = arb->nvclk_khz; 671 pagemiss = arb->mem_page_miss; 672 cas = arb->mem_latency; 673 width = arb->memory_width >> 6; 674 video_enable = arb->enable_video; 675 color_key_enable = arb->gr_during_vid; 676 bpp = arb->pix_bpp; 677 align = arb->mem_aligned; 678 mp_enable = arb->enable_mp; 679 clwm = 0; 680 vlwm = 0; 681 cbs = 128; 682 pclks = 2; 683 nvclks = 2; 684 nvclks += 2; 685 nvclks += 1; 686 mclks = 5; 687 mclks += 3; 688 mclks += 1; 689 mclks += cas; 690 mclks += 1; 691 mclks += 1; 692 mclks += 1; 693 mclks += 1; 694 mclk_extra = 3; 695 nvclks += 2; 696 nvclks += 1; 697 nvclks += 1; 698 nvclks += 1; 699 if (mp_enable) 700 mclks+=4; 701 nvclks += 0; 702 pclks += 0; 703 found = 0; 704 vbs = 0; 705 while (found != 1) 706 { 707 fifo->valid = 1; 708 found = 1; 709 mclk_loop = mclks+mclk_extra; 710 us_m = mclk_loop *1000*1000 / mclk_freq; 711 us_n = nvclks*1000*1000 / nvclk_freq; 712 us_p = nvclks*1000*1000 / pclk_freq; 713 if (video_enable) 714 { 715 video_drain_rate = pclk_freq * 2; 716 crtc_drain_rate = pclk_freq * bpp/8; 717 vpagemiss = 2; 718 vpagemiss += 1; 719 crtpagemiss = 2; 720 vpm_us = (vpagemiss * pagemiss)*1000*1000/mclk_freq; 721 if (nvclk_freq * 2 > mclk_freq * width) 722 video_fill_us = cbs*1000*1000 / 16 / nvclk_freq ; 723 else 724 video_fill_us = cbs*1000*1000 / (8 * width) / mclk_freq; 725 us_video = vpm_us + us_m + us_n + us_p + video_fill_us; 726 vlwm = us_video * video_drain_rate/(1000*1000); 727 vlwm++; 728 vbs = 128; 729 if (vlwm > 128) vbs = 64; 730 if (vlwm > (256-64)) vbs = 32; 731 if (nvclk_freq * 2 > mclk_freq * width) 732 video_fill_us = vbs *1000*1000/ 16 / nvclk_freq ; 733 else 734 video_fill_us = vbs*1000*1000 / (8 * width) / mclk_freq; 735 cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; 736 us_crt = 737 us_video 738 +video_fill_us 739 +cpm_us 740 +us_m + us_n +us_p 741 ; 742 clwm = us_crt * crtc_drain_rate/(1000*1000); 743 clwm++; 744 } 745 else 746 { 747 crtc_drain_rate = pclk_freq * bpp/8; 748 crtpagemiss = 2; 749 crtpagemiss += 1; 750 cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; 751 us_crt = cpm_us + us_m + us_n + us_p ; 752 clwm = us_crt * crtc_drain_rate/(1000*1000); 753 clwm++; 754 } 755 m1 = clwm + cbs - 512; 756 p1 = m1 * pclk_freq / mclk_freq; 757 p1 = p1 * bpp / 8; 758 if ((p1 < m1) && (m1 > 0)) 759 { 760 fifo->valid = 0; 761 found = 0; 762 if (mclk_extra ==0) found = 1; 763 mclk_extra--; 764 } 765 else if (video_enable) 766 { 767 if ((clwm > 511) || (vlwm > 255)) 768 { 769 fifo->valid = 0; 770 found = 0; 771 if (mclk_extra ==0) found = 1; 772 mclk_extra--; 773 } 774 } 775 else 776 { 777 if (clwm > 519) 778 { 779 fifo->valid = 0; 780 found = 0; 781 if (mclk_extra ==0) found = 1; 782 mclk_extra--; 783 } 784 } 785 craw = clwm; 786 vraw = vlwm; 787 if (clwm < 384) clwm = 384; 788 if (vlwm < 128) vlwm = 128; 789 data = (int)(clwm); 790 fifo->graphics_lwm = data; 791 fifo->graphics_burst_size = 128; 792 data = (int)((vlwm+15)); 793 fifo->video_lwm = data; 794 fifo->video_burst_size = vbs; 795 } 796 } 797 static void nv4UpdateArbitrationSettings 798 ( 799 unsigned VClk, 800 unsigned pixelDepth, 801 unsigned *burst, 802 unsigned *lwm, 803 RIVA_HW_INST *chip 804 ) 805 { 806 nv4_fifo_info fifo_data; 807 nv4_sim_state sim_data; 808 unsigned int M, N, P, pll, MClk, NVClk, cfg1; 809 810 pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0); 811 M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; 812 MClk = (N * chip->CrystalFreqKHz / M) >> P; 813 pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0); 814 M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; 815 NVClk = (N * chip->CrystalFreqKHz / M) >> P; 816 cfg1 = NV_RD32(&chip->PFB[0x00000204/4], 0); 817 sim_data.pix_bpp = (char)pixelDepth; 818 sim_data.enable_video = 0; 819 sim_data.enable_mp = 0; 820 sim_data.memory_width = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 0) & 0x10) ? 821 128 : 64; 822 sim_data.mem_latency = (char)cfg1 & 0x0F; 823 sim_data.mem_aligned = 1; 824 sim_data.mem_page_miss = (char)(((cfg1 >> 4) &0x0F) + ((cfg1 >> 31) & 0x01)); 825 sim_data.gr_during_vid = 0; 826 sim_data.pclk_khz = VClk; 827 sim_data.mclk_khz = MClk; 828 sim_data.nvclk_khz = NVClk; 829 nv4CalcArbitration(&fifo_data, &sim_data); 830 if (fifo_data.valid) 831 { 832 int b = fifo_data.graphics_burst_size >> 4; 833 *burst = 0; 834 while (b >>= 1) 835 (*burst)++; 836 *lwm = fifo_data.graphics_lwm >> 3; 837 } 838 } 839 static void nv10CalcArbitration 840 ( 841 nv10_fifo_info *fifo, 842 nv10_sim_state *arb 843 ) 844 { 845 int data, pagemiss, cas,width, video_enable, color_key_enable, bpp, align; 846 int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs; 847 int nvclk_fill, us_extra; 848 int found, mclk_extra, mclk_loop, cbs, m1; 849 int mclk_freq, pclk_freq, nvclk_freq, mp_enable; 850 int us_m, us_m_min, us_n, us_p, video_drain_rate, crtc_drain_rate; 851 int vus_m, vus_n, vus_p; 852 int vpm_us, us_video, vlwm, cpm_us, us_crt,clwm; 853 int clwm_rnd_down; 854 int craw, m2us, us_pipe, us_pipe_min, vus_pipe, p1clk, p2; 855 int pclks_2_top_fifo, min_mclk_extra; 856 int us_min_mclk_extra; 857 858 fifo->valid = 1; 859 pclk_freq = arb->pclk_khz; /* freq in KHz */ 860 mclk_freq = arb->mclk_khz; 861 nvclk_freq = arb->nvclk_khz; 862 pagemiss = arb->mem_page_miss; 863 cas = arb->mem_latency; 864 width = arb->memory_width/64; 865 video_enable = arb->enable_video; 866 color_key_enable = arb->gr_during_vid; 867 bpp = arb->pix_bpp; 868 align = arb->mem_aligned; 869 mp_enable = arb->enable_mp; 870 clwm = 0; 871 vlwm = 1024; 872 873 cbs = 512; 874 vbs = 512; 875 876 pclks = 4; /* lwm detect. */ 877 878 nvclks = 3; /* lwm -> sync. */ 879 nvclks += 2; /* fbi bus cycles (1 req + 1 busy) */ 880 881 mclks = 1; /* 2 edge sync. may be very close to edge so just put one. */ 882 883 mclks += 1; /* arb_hp_req */ 884 mclks += 5; /* ap_hp_req tiling pipeline */ 885 886 mclks += 2; /* tc_req latency fifo */ 887 mclks += 2; /* fb_cas_n_ memory request to fbio block */ 888 mclks += 7; /* sm_d_rdv data returned from fbio block */ 889 890 /* fb.rd.d.Put_gc need to accumulate 256 bits for read */ 891 if (arb->memory_type == 0) 892 if (arb->memory_width == 64) /* 64 bit bus */ 893 mclks += 4; 894 else 895 mclks += 2; 896 else 897 if (arb->memory_width == 64) /* 64 bit bus */ 898 mclks += 2; 899 else 900 mclks += 1; 901 902 if ((!video_enable) && (arb->memory_width == 128)) 903 { 904 mclk_extra = (bpp == 32) ? 31 : 42; /* Margin of error */ 905 min_mclk_extra = 17; 906 } 907 else 908 { 909 mclk_extra = (bpp == 32) ? 8 : 4; /* Margin of error */ 910 /* mclk_extra = 4; */ /* Margin of error */ 911 min_mclk_extra = 18; 912 } 913 914 nvclks += 1; /* 2 edge sync. may be very close to edge so just put one. */ 915 nvclks += 1; /* fbi_d_rdv_n */ 916 nvclks += 1; /* Fbi_d_rdata */ 917 nvclks += 1; /* crtfifo load */ 918 919 if(mp_enable) 920 mclks+=4; /* Mp can get in with a burst of 8. */ 921 /* Extra clocks determined by heuristics */ 922 923 nvclks += 0; 924 pclks += 0; 925 found = 0; 926 while(found != 1) { 927 fifo->valid = 1; 928 found = 1; 929 mclk_loop = mclks+mclk_extra; 930 us_m = mclk_loop *1000*1000 / mclk_freq; /* Mclk latency in us */ 931 us_m_min = mclks * 1000*1000 / mclk_freq; /* Minimum Mclk latency in us */ 932 us_min_mclk_extra = min_mclk_extra *1000*1000 / mclk_freq; 933 us_n = nvclks*1000*1000 / nvclk_freq;/* nvclk latency in us */ 934 us_p = pclks*1000*1000 / pclk_freq;/* nvclk latency in us */ 935 us_pipe = us_m + us_n + us_p; 936 us_pipe_min = us_m_min + us_n + us_p; 937 us_extra = 0; 938 939 vus_m = mclk_loop *1000*1000 / mclk_freq; /* Mclk latency in us */ 940 vus_n = (4)*1000*1000 / nvclk_freq;/* nvclk latency in us */ 941 vus_p = 0*1000*1000 / pclk_freq;/* pclk latency in us */ 942 vus_pipe = vus_m + vus_n + vus_p; 943 944 if(video_enable) { 945 video_drain_rate = pclk_freq * 4; /* MB/s */ 946 crtc_drain_rate = pclk_freq * bpp/8; /* MB/s */ 947 948 vpagemiss = 1; /* self generating page miss */ 949 vpagemiss += 1; /* One higher priority before */ 950 951 crtpagemiss = 2; /* self generating page miss */ 952 if(mp_enable) 953 crtpagemiss += 1; /* if MA0 conflict */ 954 955 vpm_us = (vpagemiss * pagemiss)*1000*1000/mclk_freq; 956 957 us_video = vpm_us + vus_m; /* Video has separate read return path */ 958 959 cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; 960 us_crt = 961 us_video /* Wait for video */ 962 +cpm_us /* CRT Page miss */ 963 +us_m + us_n +us_p /* other latency */ 964 ; 965 966 clwm = us_crt * crtc_drain_rate/(1000*1000); 967 clwm++; /* fixed point <= float_point - 1. Fixes that */ 968 } else { 969 crtc_drain_rate = pclk_freq * bpp/8; /* bpp * pclk/8 */ 970 971 crtpagemiss = 1; /* self generating page miss */ 972 crtpagemiss += 1; /* MA0 page miss */ 973 if(mp_enable) 974 crtpagemiss += 1; /* if MA0 conflict */ 975 cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; 976 us_crt = cpm_us + us_m + us_n + us_p ; 977 clwm = us_crt * crtc_drain_rate/(1000*1000); 978 clwm++; /* fixed point <= float_point - 1. Fixes that */ 979 980 /* 981 // 982 // Another concern, only for high pclks so don't do this 983 // with video: 984 // What happens if the latency to fetch the cbs is so large that 985 // fifo empties. In that case we need to have an alternate clwm value 986 // based off the total burst fetch 987 // 988 us_crt = (cbs * 1000 * 1000)/ (8*width)/mclk_freq ; 989 us_crt = us_crt + us_m + us_n + us_p + (4 * 1000 * 1000)/mclk_freq; 990 clwm_mt = us_crt * crtc_drain_rate/(1000*1000); 991 clwm_mt ++; 992 if(clwm_mt > clwm) 993 clwm = clwm_mt; 994 */ 995 /* Finally, a heuristic check when width == 64 bits */ 996 if(width == 1){ 997 nvclk_fill = nvclk_freq * 8; 998 if(crtc_drain_rate * 100 >= nvclk_fill * 102) 999 clwm = 0xfff; /*Large number to fail */ 1000 1001 else if(crtc_drain_rate * 100 >= nvclk_fill * 98) { 1002 clwm = 1024; 1003 cbs = 512; 1004 us_extra = (cbs * 1000 * 1000)/ (8*width)/mclk_freq ; 1005 } 1006 } 1007 } 1008 1009 1010 /* 1011 Overfill check: 1012 1013 */ 1014 1015 clwm_rnd_down = ((int)clwm/8)*8; 1016 if (clwm_rnd_down < clwm) 1017 clwm += 8; 1018 1019 m1 = clwm + cbs - 1024; /* Amount of overfill */ 1020 m2us = us_pipe_min + us_min_mclk_extra; 1021 pclks_2_top_fifo = (1024-clwm)/(8*width); 1022 1023 /* pclk cycles to drain */ 1024 p1clk = m2us * pclk_freq/(1000*1000); 1025 p2 = p1clk * bpp / 8; /* bytes drained. */ 1026 1027 if((p2 < m1) && (m1 > 0)) { 1028 fifo->valid = 0; 1029 found = 0; 1030 if(min_mclk_extra == 0) { 1031 if(cbs <= 32) { 1032 found = 1; /* Can't adjust anymore! */ 1033 } else { 1034 cbs = cbs/2; /* reduce the burst size */ 1035 } 1036 } else { 1037 min_mclk_extra--; 1038 } 1039 } else { 1040 if (clwm > 1023){ /* Have some margin */ 1041 fifo->valid = 0; 1042 found = 0; 1043 if(min_mclk_extra == 0) 1044 found = 1; /* Can't adjust anymore! */ 1045 else 1046 min_mclk_extra--; 1047 } 1048 } 1049 craw = clwm; 1050 1051 if(clwm < (1024-cbs+8)) clwm = 1024-cbs+8; 1052 data = (int)(clwm); 1053 /* printf("CRT LWM: %f bytes, prog: 0x%x, bs: 256\n", clwm, data ); */ 1054 fifo->graphics_lwm = data; fifo->graphics_burst_size = cbs; 1055 1056 /* printf("VID LWM: %f bytes, prog: 0x%x, bs: %d\n, ", vlwm, data, vbs ); */ 1057 fifo->video_lwm = 1024; fifo->video_burst_size = 512; 1058 } 1059 } 1060 static void nv10UpdateArbitrationSettings 1061 ( 1062 unsigned VClk, 1063 unsigned pixelDepth, 1064 unsigned *burst, 1065 unsigned *lwm, 1066 RIVA_HW_INST *chip 1067 ) 1068 { 1069 nv10_fifo_info fifo_data; 1070 nv10_sim_state sim_data; 1071 unsigned int M, N, P, pll, MClk, NVClk, cfg1; 1072 1073 pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0); 1074 M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; 1075 MClk = (N * chip->CrystalFreqKHz / M) >> P; 1076 pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0); 1077 M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; 1078 NVClk = (N * chip->CrystalFreqKHz / M) >> P; 1079 cfg1 = NV_RD32(&chip->PFB[0x00000204/4], 0); 1080 sim_data.pix_bpp = (char)pixelDepth; 1081 sim_data.enable_video = 0; 1082 sim_data.enable_mp = 0; 1083 sim_data.memory_type = (NV_RD32(&chip->PFB[0x00000200/4], 0) & 0x01) ? 1084 1 : 0; 1085 sim_data.memory_width = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 0) & 0x10) ? 1086 128 : 64; 1087 sim_data.mem_latency = (char)cfg1 & 0x0F; 1088 sim_data.mem_aligned = 1; 1089 sim_data.mem_page_miss = (char)(((cfg1 >> 4) &0x0F) + ((cfg1 >> 31) & 0x01)); 1090 sim_data.gr_during_vid = 0; 1091 sim_data.pclk_khz = VClk; 1092 sim_data.mclk_khz = MClk; 1093 sim_data.nvclk_khz = NVClk; 1094 nv10CalcArbitration(&fifo_data, &sim_data); 1095 if (fifo_data.valid) 1096 { 1097 int b = fifo_data.graphics_burst_size >> 4; 1098 *burst = 0; 1099 while (b >>= 1) 1100 (*burst)++; 1101 *lwm = fifo_data.graphics_lwm >> 3; 1102 } 1103 } 1104 1105 static void nForceUpdateArbitrationSettings 1106 ( 1107 unsigned VClk, 1108 unsigned pixelDepth, 1109 unsigned *burst, 1110 unsigned *lwm, 1111 RIVA_HW_INST *chip, 1112 struct pci_dev *pdev 1113 ) 1114 { 1115 nv10_fifo_info fifo_data; 1116 nv10_sim_state sim_data; 1117 unsigned int M, N, P, pll, MClk, NVClk; 1118 unsigned int uMClkPostDiv; 1119 struct pci_dev *dev; 1120 int domain = pci_domain_nr(pdev->bus); 1121 1122 dev = pci_get_domain_bus_and_slot(domain, 0, 3); 1123 pci_read_config_dword(dev, 0x6C, &uMClkPostDiv); 1124 pci_dev_put(dev); 1125 uMClkPostDiv = (uMClkPostDiv >> 8) & 0xf; 1126 1127 if(!uMClkPostDiv) uMClkPostDiv = 4; 1128 MClk = 400000 / uMClkPostDiv; 1129 1130 pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0); 1131 M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; 1132 NVClk = (N * chip->CrystalFreqKHz / M) >> P; 1133 sim_data.pix_bpp = (char)pixelDepth; 1134 sim_data.enable_video = 0; 1135 sim_data.enable_mp = 0; 1136 1137 dev = pci_get_domain_bus_and_slot(domain, 0, 1); 1138 pci_read_config_dword(dev, 0x7C, &sim_data.memory_type); 1139 pci_dev_put(dev); 1140 sim_data.memory_type = (sim_data.memory_type >> 12) & 1; 1141 1142 sim_data.memory_width = 64; 1143 sim_data.mem_latency = 3; 1144 sim_data.mem_aligned = 1; 1145 sim_data.mem_page_miss = 10; 1146 sim_data.gr_during_vid = 0; 1147 sim_data.pclk_khz = VClk; 1148 sim_data.mclk_khz = MClk; 1149 sim_data.nvclk_khz = NVClk; 1150 nv10CalcArbitration(&fifo_data, &sim_data); 1151 if (fifo_data.valid) 1152 { 1153 int b = fifo_data.graphics_burst_size >> 4; 1154 *burst = 0; 1155 while (b >>= 1) 1156 (*burst)++; 1157 *lwm = fifo_data.graphics_lwm >> 3; 1158 } 1159 } 1160 1161 /****************************************************************************\ 1162 * * 1163 * RIVA Mode State Routines * 1164 * * 1165 \****************************************************************************/ 1166 1167 /* 1168 * Calculate the Video Clock parameters for the PLL. 1169 */ 1170 static int CalcVClock 1171 ( 1172 int clockIn, 1173 int *clockOut, 1174 int *mOut, 1175 int *nOut, 1176 int *pOut, 1177 RIVA_HW_INST *chip 1178 ) 1179 { 1180 unsigned lowM, highM, highP; 1181 unsigned DeltaNew, DeltaOld; 1182 unsigned VClk, Freq; 1183 unsigned M, N, P; 1184 1185 DeltaOld = 0xFFFFFFFF; 1186 1187 VClk = (unsigned)clockIn; 1188 1189 if (chip->CrystalFreqKHz == 13500) 1190 { 1191 lowM = 7; 1192 highM = 13 - (chip->Architecture == NV_ARCH_03); 1193 } 1194 else 1195 { 1196 lowM = 8; 1197 highM = 14 - (chip->Architecture == NV_ARCH_03); 1198 } 1199 1200 highP = 4 - (chip->Architecture == NV_ARCH_03); 1201 for (P = 0; P <= highP; P ++) 1202 { 1203 Freq = VClk << P; 1204 if ((Freq >= 128000) && (Freq <= chip->MaxVClockFreqKHz)) 1205 { 1206 for (M = lowM; M <= highM; M++) 1207 { 1208 N = (VClk << P) * M / chip->CrystalFreqKHz; 1209 if(N <= 255) { 1210 Freq = (chip->CrystalFreqKHz * N / M) >> P; 1211 if (Freq > VClk) 1212 DeltaNew = Freq - VClk; 1213 else 1214 DeltaNew = VClk - Freq; 1215 if (DeltaNew < DeltaOld) 1216 { 1217 *mOut = M; 1218 *nOut = N; 1219 *pOut = P; 1220 *clockOut = Freq; 1221 DeltaOld = DeltaNew; 1222 } 1223 } 1224 } 1225 } 1226 } 1227 1228 /* non-zero: M/N/P/clock values assigned. zero: error (not set) */ 1229 return (DeltaOld != 0xFFFFFFFF); 1230 } 1231 /* 1232 * Calculate extended mode parameters (SVGA) and save in a 1233 * mode state structure. 1234 */ 1235 int CalcStateExt 1236 ( 1237 RIVA_HW_INST *chip, 1238 RIVA_HW_STATE *state, 1239 struct pci_dev *pdev, 1240 int bpp, 1241 int width, 1242 int hDisplaySize, 1243 int height, 1244 int dotClock 1245 ) 1246 { 1247 int pixelDepth; 1248 int uninitialized_var(VClk),uninitialized_var(m), 1249 uninitialized_var(n), uninitialized_var(p); 1250 1251 /* 1252 * Save mode parameters. 1253 */ 1254 state->bpp = bpp; /* this is not bitsPerPixel, it's 8,15,16,32 */ 1255 state->width = width; 1256 state->height = height; 1257 /* 1258 * Extended RIVA registers. 1259 */ 1260 pixelDepth = (bpp + 1)/8; 1261 if (!CalcVClock(dotClock, &VClk, &m, &n, &p, chip)) 1262 return -EINVAL; 1263 1264 switch (chip->Architecture) 1265 { 1266 case NV_ARCH_03: 1267 nv3UpdateArbitrationSettings(VClk, 1268 pixelDepth * 8, 1269 &(state->arbitration0), 1270 &(state->arbitration1), 1271 chip); 1272 state->cursor0 = 0x00; 1273 state->cursor1 = 0x78; 1274 state->cursor2 = 0x00000000; 1275 state->pllsel = 0x10010100; 1276 state->config = ((width + 31)/32) 1277 | (((pixelDepth > 2) ? 3 : pixelDepth) << 8) 1278 | 0x1000; 1279 state->general = 0x00100100; 1280 state->repaint1 = hDisplaySize < 1280 ? 0x06 : 0x02; 1281 break; 1282 case NV_ARCH_04: 1283 nv4UpdateArbitrationSettings(VClk, 1284 pixelDepth * 8, 1285 &(state->arbitration0), 1286 &(state->arbitration1), 1287 chip); 1288 state->cursor0 = 0x00; 1289 state->cursor1 = 0xFC; 1290 state->cursor2 = 0x00000000; 1291 state->pllsel = 0x10000700; 1292 state->config = 0x00001114; 1293 state->general = bpp == 16 ? 0x00101100 : 0x00100100; 1294 state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; 1295 break; 1296 case NV_ARCH_10: 1297 case NV_ARCH_20: 1298 case NV_ARCH_30: 1299 if((chip->Chipset == NV_CHIP_IGEFORCE2) || 1300 (chip->Chipset == NV_CHIP_0x01F0)) 1301 { 1302 nForceUpdateArbitrationSettings(VClk, 1303 pixelDepth * 8, 1304 &(state->arbitration0), 1305 &(state->arbitration1), 1306 chip, pdev); 1307 } else { 1308 nv10UpdateArbitrationSettings(VClk, 1309 pixelDepth * 8, 1310 &(state->arbitration0), 1311 &(state->arbitration1), 1312 chip); 1313 } 1314 state->cursor0 = 0x80 | (chip->CursorStart >> 17); 1315 state->cursor1 = (chip->CursorStart >> 11) << 2; 1316 state->cursor2 = chip->CursorStart >> 24; 1317 state->pllsel = 0x10000700; 1318 state->config = NV_RD32(&chip->PFB[0x00000200/4], 0); 1319 state->general = bpp == 16 ? 0x00101100 : 0x00100100; 1320 state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; 1321 break; 1322 } 1323 1324 /* Paul Richards: below if block borks things in kernel for some reason */ 1325 /* Tony: Below is needed to set hardware in DirectColor */ 1326 if((bpp != 8) && (chip->Architecture != NV_ARCH_03)) 1327 state->general |= 0x00000030; 1328 1329 state->vpll = (p << 16) | (n << 8) | m; 1330 state->repaint0 = (((width/8)*pixelDepth) & 0x700) >> 3; 1331 state->pixel = pixelDepth > 2 ? 3 : pixelDepth; 1332 state->offset0 = 1333 state->offset1 = 1334 state->offset2 = 1335 state->offset3 = 0; 1336 state->pitch0 = 1337 state->pitch1 = 1338 state->pitch2 = 1339 state->pitch3 = pixelDepth * width; 1340 1341 return 0; 1342 } 1343 /* 1344 * Load fixed function state and pre-calculated/stored state. 1345 */ 1346 #if 0 1347 #define LOAD_FIXED_STATE(tbl,dev) \ 1348 for (i = 0; i < sizeof(tbl##Table##dev)/8; i++) \ 1349 chip->dev[tbl##Table##dev[i][0]] = tbl##Table##dev[i][1] 1350 #define LOAD_FIXED_STATE_8BPP(tbl,dev) \ 1351 for (i = 0; i < sizeof(tbl##Table##dev##_8BPP)/8; i++) \ 1352 chip->dev[tbl##Table##dev##_8BPP[i][0]] = tbl##Table##dev##_8BPP[i][1] 1353 #define LOAD_FIXED_STATE_15BPP(tbl,dev) \ 1354 for (i = 0; i < sizeof(tbl##Table##dev##_15BPP)/8; i++) \ 1355 chip->dev[tbl##Table##dev##_15BPP[i][0]] = tbl##Table##dev##_15BPP[i][1] 1356 #define LOAD_FIXED_STATE_16BPP(tbl,dev) \ 1357 for (i = 0; i < sizeof(tbl##Table##dev##_16BPP)/8; i++) \ 1358 chip->dev[tbl##Table##dev##_16BPP[i][0]] = tbl##Table##dev##_16BPP[i][1] 1359 #define LOAD_FIXED_STATE_32BPP(tbl,dev) \ 1360 for (i = 0; i < sizeof(tbl##Table##dev##_32BPP)/8; i++) \ 1361 chip->dev[tbl##Table##dev##_32BPP[i][0]] = tbl##Table##dev##_32BPP[i][1] 1362 #endif 1363 1364 #define LOAD_FIXED_STATE(tbl,dev) \ 1365 for (i = 0; i < sizeof(tbl##Table##dev)/8; i++) \ 1366 NV_WR32(&chip->dev[tbl##Table##dev[i][0]], 0, tbl##Table##dev[i][1]) 1367 #define LOAD_FIXED_STATE_8BPP(tbl,dev) \ 1368 for (i = 0; i < sizeof(tbl##Table##dev##_8BPP)/8; i++) \ 1369 NV_WR32(&chip->dev[tbl##Table##dev##_8BPP[i][0]], 0, tbl##Table##dev##_8BPP[i][1]) 1370 #define LOAD_FIXED_STATE_15BPP(tbl,dev) \ 1371 for (i = 0; i < sizeof(tbl##Table##dev##_15BPP)/8; i++) \ 1372 NV_WR32(&chip->dev[tbl##Table##dev##_15BPP[i][0]], 0, tbl##Table##dev##_15BPP[i][1]) 1373 #define LOAD_FIXED_STATE_16BPP(tbl,dev) \ 1374 for (i = 0; i < sizeof(tbl##Table##dev##_16BPP)/8; i++) \ 1375 NV_WR32(&chip->dev[tbl##Table##dev##_16BPP[i][0]], 0, tbl##Table##dev##_16BPP[i][1]) 1376 #define LOAD_FIXED_STATE_32BPP(tbl,dev) \ 1377 for (i = 0; i < sizeof(tbl##Table##dev##_32BPP)/8; i++) \ 1378 NV_WR32(&chip->dev[tbl##Table##dev##_32BPP[i][0]], 0, tbl##Table##dev##_32BPP[i][1]) 1379 1380 static void UpdateFifoState 1381 ( 1382 RIVA_HW_INST *chip 1383 ) 1384 { 1385 int i; 1386 1387 switch (chip->Architecture) 1388 { 1389 case NV_ARCH_04: 1390 LOAD_FIXED_STATE(nv4,FIFO); 1391 chip->Tri03 = NULL; 1392 chip->Tri05 = (RivaTexturedTriangle05 __iomem *)&(chip->FIFO[0x0000E000/4]); 1393 break; 1394 case NV_ARCH_10: 1395 case NV_ARCH_20: 1396 case NV_ARCH_30: 1397 /* 1398 * Initialize state for the RivaTriangle3D05 routines. 1399 */ 1400 LOAD_FIXED_STATE(nv10tri05,PGRAPH); 1401 LOAD_FIXED_STATE(nv10,FIFO); 1402 chip->Tri03 = NULL; 1403 chip->Tri05 = (RivaTexturedTriangle05 __iomem *)&(chip->FIFO[0x0000E000/4]); 1404 break; 1405 } 1406 } 1407 static void LoadStateExt 1408 ( 1409 RIVA_HW_INST *chip, 1410 RIVA_HW_STATE *state 1411 ) 1412 { 1413 int i; 1414 1415 /* 1416 * Load HW fixed function state. 1417 */ 1418 LOAD_FIXED_STATE(Riva,PMC); 1419 LOAD_FIXED_STATE(Riva,PTIMER); 1420 switch (chip->Architecture) 1421 { 1422 case NV_ARCH_03: 1423 /* 1424 * Make sure frame buffer config gets set before loading PRAMIN. 1425 */ 1426 NV_WR32(chip->PFB, 0x00000200, state->config); 1427 LOAD_FIXED_STATE(nv3,PFIFO); 1428 LOAD_FIXED_STATE(nv3,PRAMIN); 1429 LOAD_FIXED_STATE(nv3,PGRAPH); 1430 switch (state->bpp) 1431 { 1432 case 15: 1433 case 16: 1434 LOAD_FIXED_STATE_15BPP(nv3,PRAMIN); 1435 LOAD_FIXED_STATE_15BPP(nv3,PGRAPH); 1436 chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); 1437 break; 1438 case 24: 1439 case 32: 1440 LOAD_FIXED_STATE_32BPP(nv3,PRAMIN); 1441 LOAD_FIXED_STATE_32BPP(nv3,PGRAPH); 1442 chip->Tri03 = NULL; 1443 break; 1444 case 8: 1445 default: 1446 LOAD_FIXED_STATE_8BPP(nv3,PRAMIN); 1447 LOAD_FIXED_STATE_8BPP(nv3,PGRAPH); 1448 chip->Tri03 = NULL; 1449 break; 1450 } 1451 for (i = 0x00000; i < 0x00800; i++) 1452 NV_WR32(&chip->PRAMIN[0x00000502 + i], 0, (i << 12) | 0x03); 1453 NV_WR32(chip->PGRAPH, 0x00000630, state->offset0); 1454 NV_WR32(chip->PGRAPH, 0x00000634, state->offset1); 1455 NV_WR32(chip->PGRAPH, 0x00000638, state->offset2); 1456 NV_WR32(chip->PGRAPH, 0x0000063C, state->offset3); 1457 NV_WR32(chip->PGRAPH, 0x00000650, state->pitch0); 1458 NV_WR32(chip->PGRAPH, 0x00000654, state->pitch1); 1459 NV_WR32(chip->PGRAPH, 0x00000658, state->pitch2); 1460 NV_WR32(chip->PGRAPH, 0x0000065C, state->pitch3); 1461 break; 1462 case NV_ARCH_04: 1463 /* 1464 * Make sure frame buffer config gets set before loading PRAMIN. 1465 */ 1466 NV_WR32(chip->PFB, 0x00000200, state->config); 1467 LOAD_FIXED_STATE(nv4,PFIFO); 1468 LOAD_FIXED_STATE(nv4,PRAMIN); 1469 LOAD_FIXED_STATE(nv4,PGRAPH); 1470 switch (state->bpp) 1471 { 1472 case 15: 1473 LOAD_FIXED_STATE_15BPP(nv4,PRAMIN); 1474 LOAD_FIXED_STATE_15BPP(nv4,PGRAPH); 1475 chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); 1476 break; 1477 case 16: 1478 LOAD_FIXED_STATE_16BPP(nv4,PRAMIN); 1479 LOAD_FIXED_STATE_16BPP(nv4,PGRAPH); 1480 chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); 1481 break; 1482 case 24: 1483 case 32: 1484 LOAD_FIXED_STATE_32BPP(nv4,PRAMIN); 1485 LOAD_FIXED_STATE_32BPP(nv4,PGRAPH); 1486 chip->Tri03 = NULL; 1487 break; 1488 case 8: 1489 default: 1490 LOAD_FIXED_STATE_8BPP(nv4,PRAMIN); 1491 LOAD_FIXED_STATE_8BPP(nv4,PGRAPH); 1492 chip->Tri03 = NULL; 1493 break; 1494 } 1495 NV_WR32(chip->PGRAPH, 0x00000640, state->offset0); 1496 NV_WR32(chip->PGRAPH, 0x00000644, state->offset1); 1497 NV_WR32(chip->PGRAPH, 0x00000648, state->offset2); 1498 NV_WR32(chip->PGRAPH, 0x0000064C, state->offset3); 1499 NV_WR32(chip->PGRAPH, 0x00000670, state->pitch0); 1500 NV_WR32(chip->PGRAPH, 0x00000674, state->pitch1); 1501 NV_WR32(chip->PGRAPH, 0x00000678, state->pitch2); 1502 NV_WR32(chip->PGRAPH, 0x0000067C, state->pitch3); 1503 break; 1504 case NV_ARCH_10: 1505 case NV_ARCH_20: 1506 case NV_ARCH_30: 1507 if(chip->twoHeads) { 1508 VGA_WR08(chip->PCIO, 0x03D4, 0x44); 1509 VGA_WR08(chip->PCIO, 0x03D5, state->crtcOwner); 1510 chip->LockUnlock(chip, 0); 1511 } 1512 1513 LOAD_FIXED_STATE(nv10,PFIFO); 1514 LOAD_FIXED_STATE(nv10,PRAMIN); 1515 LOAD_FIXED_STATE(nv10,PGRAPH); 1516 switch (state->bpp) 1517 { 1518 case 15: 1519 LOAD_FIXED_STATE_15BPP(nv10,PRAMIN); 1520 LOAD_FIXED_STATE_15BPP(nv10,PGRAPH); 1521 chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); 1522 break; 1523 case 16: 1524 LOAD_FIXED_STATE_16BPP(nv10,PRAMIN); 1525 LOAD_FIXED_STATE_16BPP(nv10,PGRAPH); 1526 chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); 1527 break; 1528 case 24: 1529 case 32: 1530 LOAD_FIXED_STATE_32BPP(nv10,PRAMIN); 1531 LOAD_FIXED_STATE_32BPP(nv10,PGRAPH); 1532 chip->Tri03 = NULL; 1533 break; 1534 case 8: 1535 default: 1536 LOAD_FIXED_STATE_8BPP(nv10,PRAMIN); 1537 LOAD_FIXED_STATE_8BPP(nv10,PGRAPH); 1538 chip->Tri03 = NULL; 1539 break; 1540 } 1541 1542 if(chip->Architecture == NV_ARCH_10) { 1543 NV_WR32(chip->PGRAPH, 0x00000640, state->offset0); 1544 NV_WR32(chip->PGRAPH, 0x00000644, state->offset1); 1545 NV_WR32(chip->PGRAPH, 0x00000648, state->offset2); 1546 NV_WR32(chip->PGRAPH, 0x0000064C, state->offset3); 1547 NV_WR32(chip->PGRAPH, 0x00000670, state->pitch0); 1548 NV_WR32(chip->PGRAPH, 0x00000674, state->pitch1); 1549 NV_WR32(chip->PGRAPH, 0x00000678, state->pitch2); 1550 NV_WR32(chip->PGRAPH, 0x0000067C, state->pitch3); 1551 NV_WR32(chip->PGRAPH, 0x00000680, state->pitch3); 1552 } else { 1553 NV_WR32(chip->PGRAPH, 0x00000820, state->offset0); 1554 NV_WR32(chip->PGRAPH, 0x00000824, state->offset1); 1555 NV_WR32(chip->PGRAPH, 0x00000828, state->offset2); 1556 NV_WR32(chip->PGRAPH, 0x0000082C, state->offset3); 1557 NV_WR32(chip->PGRAPH, 0x00000850, state->pitch0); 1558 NV_WR32(chip->PGRAPH, 0x00000854, state->pitch1); 1559 NV_WR32(chip->PGRAPH, 0x00000858, state->pitch2); 1560 NV_WR32(chip->PGRAPH, 0x0000085C, state->pitch3); 1561 NV_WR32(chip->PGRAPH, 0x00000860, state->pitch3); 1562 NV_WR32(chip->PGRAPH, 0x00000864, state->pitch3); 1563 NV_WR32(chip->PGRAPH, 0x000009A4, NV_RD32(chip->PFB, 0x00000200)); 1564 NV_WR32(chip->PGRAPH, 0x000009A8, NV_RD32(chip->PFB, 0x00000204)); 1565 } 1566 if(chip->twoHeads) { 1567 NV_WR32(chip->PCRTC0, 0x00000860, state->head); 1568 NV_WR32(chip->PCRTC0, 0x00002860, state->head2); 1569 } 1570 NV_WR32(chip->PRAMDAC, 0x00000404, NV_RD32(chip->PRAMDAC, 0x00000404) | (1 << 25)); 1571 1572 NV_WR32(chip->PMC, 0x00008704, 1); 1573 NV_WR32(chip->PMC, 0x00008140, 0); 1574 NV_WR32(chip->PMC, 0x00008920, 0); 1575 NV_WR32(chip->PMC, 0x00008924, 0); 1576 NV_WR32(chip->PMC, 0x00008908, 0x01ffffff); 1577 NV_WR32(chip->PMC, 0x0000890C, 0x01ffffff); 1578 NV_WR32(chip->PMC, 0x00001588, 0); 1579 1580 NV_WR32(chip->PFB, 0x00000240, 0); 1581 NV_WR32(chip->PFB, 0x00000250, 0); 1582 NV_WR32(chip->PFB, 0x00000260, 0); 1583 NV_WR32(chip->PFB, 0x00000270, 0); 1584 NV_WR32(chip->PFB, 0x00000280, 0); 1585 NV_WR32(chip->PFB, 0x00000290, 0); 1586 NV_WR32(chip->PFB, 0x000002A0, 0); 1587 NV_WR32(chip->PFB, 0x000002B0, 0); 1588 1589 NV_WR32(chip->PGRAPH, 0x00000B00, NV_RD32(chip->PFB, 0x00000240)); 1590 NV_WR32(chip->PGRAPH, 0x00000B04, NV_RD32(chip->PFB, 0x00000244)); 1591 NV_WR32(chip->PGRAPH, 0x00000B08, NV_RD32(chip->PFB, 0x00000248)); 1592 NV_WR32(chip->PGRAPH, 0x00000B0C, NV_RD32(chip->PFB, 0x0000024C)); 1593 NV_WR32(chip->PGRAPH, 0x00000B10, NV_RD32(chip->PFB, 0x00000250)); 1594 NV_WR32(chip->PGRAPH, 0x00000B14, NV_RD32(chip->PFB, 0x00000254)); 1595 NV_WR32(chip->PGRAPH, 0x00000B18, NV_RD32(chip->PFB, 0x00000258)); 1596 NV_WR32(chip->PGRAPH, 0x00000B1C, NV_RD32(chip->PFB, 0x0000025C)); 1597 NV_WR32(chip->PGRAPH, 0x00000B20, NV_RD32(chip->PFB, 0x00000260)); 1598 NV_WR32(chip->PGRAPH, 0x00000B24, NV_RD32(chip->PFB, 0x00000264)); 1599 NV_WR32(chip->PGRAPH, 0x00000B28, NV_RD32(chip->PFB, 0x00000268)); 1600 NV_WR32(chip->PGRAPH, 0x00000B2C, NV_RD32(chip->PFB, 0x0000026C)); 1601 NV_WR32(chip->PGRAPH, 0x00000B30, NV_RD32(chip->PFB, 0x00000270)); 1602 NV_WR32(chip->PGRAPH, 0x00000B34, NV_RD32(chip->PFB, 0x00000274)); 1603 NV_WR32(chip->PGRAPH, 0x00000B38, NV_RD32(chip->PFB, 0x00000278)); 1604 NV_WR32(chip->PGRAPH, 0x00000B3C, NV_RD32(chip->PFB, 0x0000027C)); 1605 NV_WR32(chip->PGRAPH, 0x00000B40, NV_RD32(chip->PFB, 0x00000280)); 1606 NV_WR32(chip->PGRAPH, 0x00000B44, NV_RD32(chip->PFB, 0x00000284)); 1607 NV_WR32(chip->PGRAPH, 0x00000B48, NV_RD32(chip->PFB, 0x00000288)); 1608 NV_WR32(chip->PGRAPH, 0x00000B4C, NV_RD32(chip->PFB, 0x0000028C)); 1609 NV_WR32(chip->PGRAPH, 0x00000B50, NV_RD32(chip->PFB, 0x00000290)); 1610 NV_WR32(chip->PGRAPH, 0x00000B54, NV_RD32(chip->PFB, 0x00000294)); 1611 NV_WR32(chip->PGRAPH, 0x00000B58, NV_RD32(chip->PFB, 0x00000298)); 1612 NV_WR32(chip->PGRAPH, 0x00000B5C, NV_RD32(chip->PFB, 0x0000029C)); 1613 NV_WR32(chip->PGRAPH, 0x00000B60, NV_RD32(chip->PFB, 0x000002A0)); 1614 NV_WR32(chip->PGRAPH, 0x00000B64, NV_RD32(chip->PFB, 0x000002A4)); 1615 NV_WR32(chip->PGRAPH, 0x00000B68, NV_RD32(chip->PFB, 0x000002A8)); 1616 NV_WR32(chip->PGRAPH, 0x00000B6C, NV_RD32(chip->PFB, 0x000002AC)); 1617 NV_WR32(chip->PGRAPH, 0x00000B70, NV_RD32(chip->PFB, 0x000002B0)); 1618 NV_WR32(chip->PGRAPH, 0x00000B74, NV_RD32(chip->PFB, 0x000002B4)); 1619 NV_WR32(chip->PGRAPH, 0x00000B78, NV_RD32(chip->PFB, 0x000002B8)); 1620 NV_WR32(chip->PGRAPH, 0x00000B7C, NV_RD32(chip->PFB, 0x000002BC)); 1621 NV_WR32(chip->PGRAPH, 0x00000F40, 0x10000000); 1622 NV_WR32(chip->PGRAPH, 0x00000F44, 0x00000000); 1623 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000040); 1624 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000008); 1625 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000200); 1626 for (i = 0; i < (3*16); i++) 1627 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1628 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000040); 1629 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1630 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000800); 1631 for (i = 0; i < (16*16); i++) 1632 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1633 NV_WR32(chip->PGRAPH, 0x00000F40, 0x30000000); 1634 NV_WR32(chip->PGRAPH, 0x00000F44, 0x00000004); 1635 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00006400); 1636 for (i = 0; i < (59*4); i++) 1637 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1638 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00006800); 1639 for (i = 0; i < (47*4); i++) 1640 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1641 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00006C00); 1642 for (i = 0; i < (3*4); i++) 1643 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1644 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00007000); 1645 for (i = 0; i < (19*4); i++) 1646 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1647 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00007400); 1648 for (i = 0; i < (12*4); i++) 1649 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1650 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00007800); 1651 for (i = 0; i < (12*4); i++) 1652 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1653 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00004400); 1654 for (i = 0; i < (8*4); i++) 1655 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1656 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000000); 1657 for (i = 0; i < 16; i++) 1658 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1659 NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000040); 1660 for (i = 0; i < 4; i++) 1661 NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); 1662 1663 NV_WR32(chip->PCRTC, 0x00000810, state->cursorConfig); 1664 1665 if(chip->flatPanel) { 1666 if((chip->Chipset & 0x0ff0) == 0x0110) { 1667 NV_WR32(chip->PRAMDAC, 0x0528, state->dither); 1668 } else 1669 if((chip->Chipset & 0x0ff0) >= 0x0170) { 1670 NV_WR32(chip->PRAMDAC, 0x083C, state->dither); 1671 } 1672 1673 VGA_WR08(chip->PCIO, 0x03D4, 0x53); 1674 VGA_WR08(chip->PCIO, 0x03D5, 0); 1675 VGA_WR08(chip->PCIO, 0x03D4, 0x54); 1676 VGA_WR08(chip->PCIO, 0x03D5, 0); 1677 VGA_WR08(chip->PCIO, 0x03D4, 0x21); 1678 VGA_WR08(chip->PCIO, 0x03D5, 0xfa); 1679 } 1680 1681 VGA_WR08(chip->PCIO, 0x03D4, 0x41); 1682 VGA_WR08(chip->PCIO, 0x03D5, state->extra); 1683 } 1684 LOAD_FIXED_STATE(Riva,FIFO); 1685 UpdateFifoState(chip); 1686 /* 1687 * Load HW mode state. 1688 */ 1689 VGA_WR08(chip->PCIO, 0x03D4, 0x19); 1690 VGA_WR08(chip->PCIO, 0x03D5, state->repaint0); 1691 VGA_WR08(chip->PCIO, 0x03D4, 0x1A); 1692 VGA_WR08(chip->PCIO, 0x03D5, state->repaint1); 1693 VGA_WR08(chip->PCIO, 0x03D4, 0x25); 1694 VGA_WR08(chip->PCIO, 0x03D5, state->screen); 1695 VGA_WR08(chip->PCIO, 0x03D4, 0x28); 1696 VGA_WR08(chip->PCIO, 0x03D5, state->pixel); 1697 VGA_WR08(chip->PCIO, 0x03D4, 0x2D); 1698 VGA_WR08(chip->PCIO, 0x03D5, state->horiz); 1699 VGA_WR08(chip->PCIO, 0x03D4, 0x1B); 1700 VGA_WR08(chip->PCIO, 0x03D5, state->arbitration0); 1701 VGA_WR08(chip->PCIO, 0x03D4, 0x20); 1702 VGA_WR08(chip->PCIO, 0x03D5, state->arbitration1); 1703 VGA_WR08(chip->PCIO, 0x03D4, 0x30); 1704 VGA_WR08(chip->PCIO, 0x03D5, state->cursor0); 1705 VGA_WR08(chip->PCIO, 0x03D4, 0x31); 1706 VGA_WR08(chip->PCIO, 0x03D5, state->cursor1); 1707 VGA_WR08(chip->PCIO, 0x03D4, 0x2F); 1708 VGA_WR08(chip->PCIO, 0x03D5, state->cursor2); 1709 VGA_WR08(chip->PCIO, 0x03D4, 0x39); 1710 VGA_WR08(chip->PCIO, 0x03D5, state->interlace); 1711 1712 if(!chip->flatPanel) { 1713 NV_WR32(chip->PRAMDAC0, 0x00000508, state->vpll); 1714 NV_WR32(chip->PRAMDAC0, 0x0000050C, state->pllsel); 1715 if(chip->twoHeads) 1716 NV_WR32(chip->PRAMDAC0, 0x00000520, state->vpll2); 1717 } else { 1718 NV_WR32(chip->PRAMDAC, 0x00000848 , state->scale); 1719 } 1720 NV_WR32(chip->PRAMDAC, 0x00000600 , state->general); 1721 1722 /* 1723 * Turn off VBlank enable and reset. 1724 */ 1725 NV_WR32(chip->PCRTC, 0x00000140, 0); 1726 NV_WR32(chip->PCRTC, 0x00000100, chip->VBlankBit); 1727 /* 1728 * Set interrupt enable. 1729 */ 1730 NV_WR32(chip->PMC, 0x00000140, chip->EnableIRQ & 0x01); 1731 /* 1732 * Set current state pointer. 1733 */ 1734 chip->CurrentState = state; 1735 /* 1736 * Reset FIFO free and empty counts. 1737 */ 1738 chip->FifoFreeCount = 0; 1739 /* Free count from first subchannel */ 1740 chip->FifoEmptyCount = NV_RD32(&chip->Rop->FifoFree, 0); 1741 } 1742 static void UnloadStateExt 1743 ( 1744 RIVA_HW_INST *chip, 1745 RIVA_HW_STATE *state 1746 ) 1747 { 1748 /* 1749 * Save current HW state. 1750 */ 1751 VGA_WR08(chip->PCIO, 0x03D4, 0x19); 1752 state->repaint0 = VGA_RD08(chip->PCIO, 0x03D5); 1753 VGA_WR08(chip->PCIO, 0x03D4, 0x1A); 1754 state->repaint1 = VGA_RD08(chip->PCIO, 0x03D5); 1755 VGA_WR08(chip->PCIO, 0x03D4, 0x25); 1756 state->screen = VGA_RD08(chip->PCIO, 0x03D5); 1757 VGA_WR08(chip->PCIO, 0x03D4, 0x28); 1758 state->pixel = VGA_RD08(chip->PCIO, 0x03D5); 1759 VGA_WR08(chip->PCIO, 0x03D4, 0x2D); 1760 state->horiz = VGA_RD08(chip->PCIO, 0x03D5); 1761 VGA_WR08(chip->PCIO, 0x03D4, 0x1B); 1762 state->arbitration0 = VGA_RD08(chip->PCIO, 0x03D5); 1763 VGA_WR08(chip->PCIO, 0x03D4, 0x20); 1764 state->arbitration1 = VGA_RD08(chip->PCIO, 0x03D5); 1765 VGA_WR08(chip->PCIO, 0x03D4, 0x30); 1766 state->cursor0 = VGA_RD08(chip->PCIO, 0x03D5); 1767 VGA_WR08(chip->PCIO, 0x03D4, 0x31); 1768 state->cursor1 = VGA_RD08(chip->PCIO, 0x03D5); 1769 VGA_WR08(chip->PCIO, 0x03D4, 0x2F); 1770 state->cursor2 = VGA_RD08(chip->PCIO, 0x03D5); 1771 VGA_WR08(chip->PCIO, 0x03D4, 0x39); 1772 state->interlace = VGA_RD08(chip->PCIO, 0x03D5); 1773 state->vpll = NV_RD32(chip->PRAMDAC0, 0x00000508); 1774 state->vpll2 = NV_RD32(chip->PRAMDAC0, 0x00000520); 1775 state->pllsel = NV_RD32(chip->PRAMDAC0, 0x0000050C); 1776 state->general = NV_RD32(chip->PRAMDAC, 0x00000600); 1777 state->scale = NV_RD32(chip->PRAMDAC, 0x00000848); 1778 state->config = NV_RD32(chip->PFB, 0x00000200); 1779 switch (chip->Architecture) 1780 { 1781 case NV_ARCH_03: 1782 state->offset0 = NV_RD32(chip->PGRAPH, 0x00000630); 1783 state->offset1 = NV_RD32(chip->PGRAPH, 0x00000634); 1784 state->offset2 = NV_RD32(chip->PGRAPH, 0x00000638); 1785 state->offset3 = NV_RD32(chip->PGRAPH, 0x0000063C); 1786 state->pitch0 = NV_RD32(chip->PGRAPH, 0x00000650); 1787 state->pitch1 = NV_RD32(chip->PGRAPH, 0x00000654); 1788 state->pitch2 = NV_RD32(chip->PGRAPH, 0x00000658); 1789 state->pitch3 = NV_RD32(chip->PGRAPH, 0x0000065C); 1790 break; 1791 case NV_ARCH_04: 1792 state->offset0 = NV_RD32(chip->PGRAPH, 0x00000640); 1793 state->offset1 = NV_RD32(chip->PGRAPH, 0x00000644); 1794 state->offset2 = NV_RD32(chip->PGRAPH, 0x00000648); 1795 state->offset3 = NV_RD32(chip->PGRAPH, 0x0000064C); 1796 state->pitch0 = NV_RD32(chip->PGRAPH, 0x00000670); 1797 state->pitch1 = NV_RD32(chip->PGRAPH, 0x00000674); 1798 state->pitch2 = NV_RD32(chip->PGRAPH, 0x00000678); 1799 state->pitch3 = NV_RD32(chip->PGRAPH, 0x0000067C); 1800 break; 1801 case NV_ARCH_10: 1802 case NV_ARCH_20: 1803 case NV_ARCH_30: 1804 state->offset0 = NV_RD32(chip->PGRAPH, 0x00000640); 1805 state->offset1 = NV_RD32(chip->PGRAPH, 0x00000644); 1806 state->offset2 = NV_RD32(chip->PGRAPH, 0x00000648); 1807 state->offset3 = NV_RD32(chip->PGRAPH, 0x0000064C); 1808 state->pitch0 = NV_RD32(chip->PGRAPH, 0x00000670); 1809 state->pitch1 = NV_RD32(chip->PGRAPH, 0x00000674); 1810 state->pitch2 = NV_RD32(chip->PGRAPH, 0x00000678); 1811 state->pitch3 = NV_RD32(chip->PGRAPH, 0x0000067C); 1812 if(chip->twoHeads) { 1813 state->head = NV_RD32(chip->PCRTC0, 0x00000860); 1814 state->head2 = NV_RD32(chip->PCRTC0, 0x00002860); 1815 VGA_WR08(chip->PCIO, 0x03D4, 0x44); 1816 state->crtcOwner = VGA_RD08(chip->PCIO, 0x03D5); 1817 } 1818 VGA_WR08(chip->PCIO, 0x03D4, 0x41); 1819 state->extra = VGA_RD08(chip->PCIO, 0x03D5); 1820 state->cursorConfig = NV_RD32(chip->PCRTC, 0x00000810); 1821 1822 if((chip->Chipset & 0x0ff0) == 0x0110) { 1823 state->dither = NV_RD32(chip->PRAMDAC, 0x0528); 1824 } else 1825 if((chip->Chipset & 0x0ff0) >= 0x0170) { 1826 state->dither = NV_RD32(chip->PRAMDAC, 0x083C); 1827 } 1828 break; 1829 } 1830 } 1831 static void SetStartAddress 1832 ( 1833 RIVA_HW_INST *chip, 1834 unsigned start 1835 ) 1836 { 1837 NV_WR32(chip->PCRTC, 0x800, start); 1838 } 1839 1840 static void SetStartAddress3 1841 ( 1842 RIVA_HW_INST *chip, 1843 unsigned start 1844 ) 1845 { 1846 int offset = start >> 2; 1847 int pan = (start & 3) << 1; 1848 unsigned char tmp; 1849 1850 /* 1851 * Unlock extended registers. 1852 */ 1853 chip->LockUnlock(chip, 0); 1854 /* 1855 * Set start address. 1856 */ 1857 VGA_WR08(chip->PCIO, 0x3D4, 0x0D); VGA_WR08(chip->PCIO, 0x3D5, offset); 1858 offset >>= 8; 1859 VGA_WR08(chip->PCIO, 0x3D4, 0x0C); VGA_WR08(chip->PCIO, 0x3D5, offset); 1860 offset >>= 8; 1861 VGA_WR08(chip->PCIO, 0x3D4, 0x19); tmp = VGA_RD08(chip->PCIO, 0x3D5); 1862 VGA_WR08(chip->PCIO, 0x3D5, (offset & 0x01F) | (tmp & ~0x1F)); 1863 VGA_WR08(chip->PCIO, 0x3D4, 0x2D); tmp = VGA_RD08(chip->PCIO, 0x3D5); 1864 VGA_WR08(chip->PCIO, 0x3D5, (offset & 0x60) | (tmp & ~0x60)); 1865 /* 1866 * 4 pixel pan register. 1867 */ 1868 offset = VGA_RD08(chip->PCIO, chip->IO + 0x0A); 1869 VGA_WR08(chip->PCIO, 0x3C0, 0x13); 1870 VGA_WR08(chip->PCIO, 0x3C0, pan); 1871 } 1872 static void nv3SetSurfaces2D 1873 ( 1874 RIVA_HW_INST *chip, 1875 unsigned surf0, 1876 unsigned surf1 1877 ) 1878 { 1879 RivaSurface __iomem *Surface = 1880 (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); 1881 1882 RIVA_FIFO_FREE(*chip,Tri03,5); 1883 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000003); 1884 NV_WR32(&Surface->Offset, 0, surf0); 1885 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000004); 1886 NV_WR32(&Surface->Offset, 0, surf1); 1887 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000013); 1888 } 1889 static void nv4SetSurfaces2D 1890 ( 1891 RIVA_HW_INST *chip, 1892 unsigned surf0, 1893 unsigned surf1 1894 ) 1895 { 1896 RivaSurface __iomem *Surface = 1897 (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); 1898 1899 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000003); 1900 NV_WR32(&Surface->Offset, 0, surf0); 1901 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000004); 1902 NV_WR32(&Surface->Offset, 0, surf1); 1903 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); 1904 } 1905 static void nv10SetSurfaces2D 1906 ( 1907 RIVA_HW_INST *chip, 1908 unsigned surf0, 1909 unsigned surf1 1910 ) 1911 { 1912 RivaSurface __iomem *Surface = 1913 (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); 1914 1915 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000003); 1916 NV_WR32(&Surface->Offset, 0, surf0); 1917 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000004); 1918 NV_WR32(&Surface->Offset, 0, surf1); 1919 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); 1920 } 1921 static void nv3SetSurfaces3D 1922 ( 1923 RIVA_HW_INST *chip, 1924 unsigned surf0, 1925 unsigned surf1 1926 ) 1927 { 1928 RivaSurface __iomem *Surface = 1929 (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); 1930 1931 RIVA_FIFO_FREE(*chip,Tri03,5); 1932 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000005); 1933 NV_WR32(&Surface->Offset, 0, surf0); 1934 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000006); 1935 NV_WR32(&Surface->Offset, 0, surf1); 1936 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000013); 1937 } 1938 static void nv4SetSurfaces3D 1939 ( 1940 RIVA_HW_INST *chip, 1941 unsigned surf0, 1942 unsigned surf1 1943 ) 1944 { 1945 RivaSurface __iomem *Surface = 1946 (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); 1947 1948 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000005); 1949 NV_WR32(&Surface->Offset, 0, surf0); 1950 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000006); 1951 NV_WR32(&Surface->Offset, 0, surf1); 1952 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); 1953 } 1954 static void nv10SetSurfaces3D 1955 ( 1956 RIVA_HW_INST *chip, 1957 unsigned surf0, 1958 unsigned surf1 1959 ) 1960 { 1961 RivaSurface3D __iomem *Surfaces3D = 1962 (RivaSurface3D __iomem *)&(chip->FIFO[0x0000E000/4]); 1963 1964 RIVA_FIFO_FREE(*chip,Tri03,4); 1965 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000007); 1966 NV_WR32(&Surfaces3D->RenderBufferOffset, 0, surf0); 1967 NV_WR32(&Surfaces3D->ZBufferOffset, 0, surf1); 1968 NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); 1969 } 1970 1971 /****************************************************************************\ 1972 * * 1973 * Probe RIVA Chip Configuration * 1974 * * 1975 \****************************************************************************/ 1976 1977 static void nv3GetConfig 1978 ( 1979 RIVA_HW_INST *chip 1980 ) 1981 { 1982 /* 1983 * Fill in chip configuration. 1984 */ 1985 if (NV_RD32(&chip->PFB[0x00000000/4], 0) & 0x00000020) 1986 { 1987 if (((NV_RD32(chip->PMC, 0x00000000) & 0xF0) == 0x20) 1988 && ((NV_RD32(chip->PMC, 0x00000000) & 0x0F) >= 0x02)) 1989 { 1990 /* 1991 * SDRAM 128 ZX. 1992 */ 1993 chip->RamBandwidthKBytesPerSec = 800000; 1994 switch (NV_RD32(chip->PFB, 0x00000000) & 0x03) 1995 { 1996 case 2: 1997 chip->RamAmountKBytes = 1024 * 4; 1998 break; 1999 case 1: 2000 chip->RamAmountKBytes = 1024 * 2; 2001 break; 2002 default: 2003 chip->RamAmountKBytes = 1024 * 8; 2004 break; 2005 } 2006 } 2007 else 2008 { 2009 chip->RamBandwidthKBytesPerSec = 1000000; 2010 chip->RamAmountKBytes = 1024 * 8; 2011 } 2012 } 2013 else 2014 { 2015 /* 2016 * SGRAM 128. 2017 */ 2018 chip->RamBandwidthKBytesPerSec = 1000000; 2019 switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) 2020 { 2021 case 0: 2022 chip->RamAmountKBytes = 1024 * 8; 2023 break; 2024 case 2: 2025 chip->RamAmountKBytes = 1024 * 4; 2026 break; 2027 default: 2028 chip->RamAmountKBytes = 1024 * 2; 2029 break; 2030 } 2031 } 2032 chip->CrystalFreqKHz = (NV_RD32(chip->PEXTDEV, 0x00000000) & 0x00000040) ? 14318 : 13500; 2033 chip->CURSOR = &(chip->PRAMIN[0x00008000/4 - 0x0800/4]); 2034 chip->VBlankBit = 0x00000100; 2035 chip->MaxVClockFreqKHz = 256000; 2036 /* 2037 * Set chip functions. 2038 */ 2039 chip->Busy = nv3Busy; 2040 chip->ShowHideCursor = ShowHideCursor; 2041 chip->LoadStateExt = LoadStateExt; 2042 chip->UnloadStateExt = UnloadStateExt; 2043 chip->SetStartAddress = SetStartAddress3; 2044 chip->SetSurfaces2D = nv3SetSurfaces2D; 2045 chip->SetSurfaces3D = nv3SetSurfaces3D; 2046 chip->LockUnlock = nv3LockUnlock; 2047 } 2048 static void nv4GetConfig 2049 ( 2050 RIVA_HW_INST *chip 2051 ) 2052 { 2053 /* 2054 * Fill in chip configuration. 2055 */ 2056 if (NV_RD32(chip->PFB, 0x00000000) & 0x00000100) 2057 { 2058 chip->RamAmountKBytes = ((NV_RD32(chip->PFB, 0x00000000) >> 12) & 0x0F) * 1024 * 2 2059 + 1024 * 2; 2060 } 2061 else 2062 { 2063 switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) 2064 { 2065 case 0: 2066 chip->RamAmountKBytes = 1024 * 32; 2067 break; 2068 case 1: 2069 chip->RamAmountKBytes = 1024 * 4; 2070 break; 2071 case 2: 2072 chip->RamAmountKBytes = 1024 * 8; 2073 break; 2074 case 3: 2075 default: 2076 chip->RamAmountKBytes = 1024 * 16; 2077 break; 2078 } 2079 } 2080 switch ((NV_RD32(chip->PFB, 0x00000000) >> 3) & 0x00000003) 2081 { 2082 case 3: 2083 chip->RamBandwidthKBytesPerSec = 800000; 2084 break; 2085 default: 2086 chip->RamBandwidthKBytesPerSec = 1000000; 2087 break; 2088 } 2089 chip->CrystalFreqKHz = (NV_RD32(chip->PEXTDEV, 0x00000000) & 0x00000040) ? 14318 : 13500; 2090 chip->CURSOR = &(chip->PRAMIN[0x00010000/4 - 0x0800/4]); 2091 chip->VBlankBit = 0x00000001; 2092 chip->MaxVClockFreqKHz = 350000; 2093 /* 2094 * Set chip functions. 2095 */ 2096 chip->Busy = nv4Busy; 2097 chip->ShowHideCursor = ShowHideCursor; 2098 chip->LoadStateExt = LoadStateExt; 2099 chip->UnloadStateExt = UnloadStateExt; 2100 chip->SetStartAddress = SetStartAddress; 2101 chip->SetSurfaces2D = nv4SetSurfaces2D; 2102 chip->SetSurfaces3D = nv4SetSurfaces3D; 2103 chip->LockUnlock = nv4LockUnlock; 2104 } 2105 static void nv10GetConfig 2106 ( 2107 RIVA_HW_INST *chip, 2108 struct pci_dev *pdev, 2109 unsigned int chipset 2110 ) 2111 { 2112 struct pci_dev* dev; 2113 int domain = pci_domain_nr(pdev->bus); 2114 u32 amt; 2115 2116 #ifdef __BIG_ENDIAN 2117 /* turn on big endian register access */ 2118 if(!(NV_RD32(chip->PMC, 0x00000004) & 0x01000001)) 2119 NV_WR32(chip->PMC, 0x00000004, 0x01000001); 2120 #endif 2121 2122 /* 2123 * Fill in chip configuration. 2124 */ 2125 if(chipset == NV_CHIP_IGEFORCE2) { 2126 dev = pci_get_domain_bus_and_slot(domain, 0, 1); 2127 pci_read_config_dword(dev, 0x7C, &amt); 2128 pci_dev_put(dev); 2129 chip->RamAmountKBytes = (((amt >> 6) & 31) + 1) * 1024; 2130 } else if(chipset == NV_CHIP_0x01F0) { 2131 dev = pci_get_domain_bus_and_slot(domain, 0, 1); 2132 pci_read_config_dword(dev, 0x84, &amt); 2133 pci_dev_put(dev); 2134 chip->RamAmountKBytes = (((amt >> 4) & 127) + 1) * 1024; 2135 } else { 2136 switch ((NV_RD32(chip->PFB, 0x0000020C) >> 20) & 0x000000FF) 2137 { 2138 case 0x02: 2139 chip->RamAmountKBytes = 1024 * 2; 2140 break; 2141 case 0x04: 2142 chip->RamAmountKBytes = 1024 * 4; 2143 break; 2144 case 0x08: 2145 chip->RamAmountKBytes = 1024 * 8; 2146 break; 2147 case 0x10: 2148 chip->RamAmountKBytes = 1024 * 16; 2149 break; 2150 case 0x20: 2151 chip->RamAmountKBytes = 1024 * 32; 2152 break; 2153 case 0x40: 2154 chip->RamAmountKBytes = 1024 * 64; 2155 break; 2156 case 0x80: 2157 chip->RamAmountKBytes = 1024 * 128; 2158 break; 2159 default: 2160 chip->RamAmountKBytes = 1024 * 16; 2161 break; 2162 } 2163 } 2164 switch ((NV_RD32(chip->PFB, 0x00000000) >> 3) & 0x00000003) 2165 { 2166 case 3: 2167 chip->RamBandwidthKBytesPerSec = 800000; 2168 break; 2169 default: 2170 chip->RamBandwidthKBytesPerSec = 1000000; 2171 break; 2172 } 2173 chip->CrystalFreqKHz = (NV_RD32(chip->PEXTDEV, 0x0000) & (1 << 6)) ? 2174 14318 : 13500; 2175 2176 switch (chipset & 0x0ff0) { 2177 case 0x0170: 2178 case 0x0180: 2179 case 0x01F0: 2180 case 0x0250: 2181 case 0x0280: 2182 case 0x0300: 2183 case 0x0310: 2184 case 0x0320: 2185 case 0x0330: 2186 case 0x0340: 2187 if(NV_RD32(chip->PEXTDEV, 0x0000) & (1 << 22)) 2188 chip->CrystalFreqKHz = 27000; 2189 break; 2190 default: 2191 break; 2192 } 2193 2194 chip->CursorStart = (chip->RamAmountKBytes - 128) * 1024; 2195 chip->CURSOR = NULL; /* can't set this here */ 2196 chip->VBlankBit = 0x00000001; 2197 chip->MaxVClockFreqKHz = 350000; 2198 /* 2199 * Set chip functions. 2200 */ 2201 chip->Busy = nv10Busy; 2202 chip->ShowHideCursor = ShowHideCursor; 2203 chip->LoadStateExt = LoadStateExt; 2204 chip->UnloadStateExt = UnloadStateExt; 2205 chip->SetStartAddress = SetStartAddress; 2206 chip->SetSurfaces2D = nv10SetSurfaces2D; 2207 chip->SetSurfaces3D = nv10SetSurfaces3D; 2208 chip->LockUnlock = nv4LockUnlock; 2209 2210 switch(chipset & 0x0ff0) { 2211 case 0x0110: 2212 case 0x0170: 2213 case 0x0180: 2214 case 0x01F0: 2215 case 0x0250: 2216 case 0x0280: 2217 case 0x0300: 2218 case 0x0310: 2219 case 0x0320: 2220 case 0x0330: 2221 case 0x0340: 2222 chip->twoHeads = TRUE; 2223 break; 2224 default: 2225 chip->twoHeads = FALSE; 2226 break; 2227 } 2228 } 2229 int RivaGetConfig 2230 ( 2231 RIVA_HW_INST *chip, 2232 struct pci_dev *pdev, 2233 unsigned int chipset 2234 ) 2235 { 2236 /* 2237 * Save this so future SW know whats it's dealing with. 2238 */ 2239 chip->Version = RIVA_SW_VERSION; 2240 /* 2241 * Chip specific configuration. 2242 */ 2243 switch (chip->Architecture) 2244 { 2245 case NV_ARCH_03: 2246 nv3GetConfig(chip); 2247 break; 2248 case NV_ARCH_04: 2249 nv4GetConfig(chip); 2250 break; 2251 case NV_ARCH_10: 2252 case NV_ARCH_20: 2253 case NV_ARCH_30: 2254 nv10GetConfig(chip, pdev, chipset); 2255 break; 2256 default: 2257 return (-1); 2258 } 2259 chip->Chipset = chipset; 2260 /* 2261 * Fill in FIFO pointers. 2262 */ 2263 chip->Rop = (RivaRop __iomem *)&(chip->FIFO[0x00000000/4]); 2264 chip->Clip = (RivaClip __iomem *)&(chip->FIFO[0x00002000/4]); 2265 chip->Patt = (RivaPattern __iomem *)&(chip->FIFO[0x00004000/4]); 2266 chip->Pixmap = (RivaPixmap __iomem *)&(chip->FIFO[0x00006000/4]); 2267 chip->Blt = (RivaScreenBlt __iomem *)&(chip->FIFO[0x00008000/4]); 2268 chip->Bitmap = (RivaBitmap __iomem *)&(chip->FIFO[0x0000A000/4]); 2269 chip->Line = (RivaLine __iomem *)&(chip->FIFO[0x0000C000/4]); 2270 chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); 2271 return (0); 2272 } 2273 2274