1 /***************************************************************************\
3 |* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *|
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. *|
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 *|
14 |* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *|
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. *|
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. *|
38 \***************************************************************************/
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
47 /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/riva_hw.c,v 1.33 2002/08/05 20:47:06 mvojkovi Exp $ */
49 #include <linux/kernel.h>
50 #include <linux/pci.h>
51 #include <linux/pci_ids.h>
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.
65 return ((NV_RD32(&chip
->Rop
->FifoFree
, 0) < chip
->FifoEmptyCount
) ||
66 NV_RD32(&chip
->PGRAPH
[0x000006B0/4], 0) & 0x01);
73 return ((NV_RD32(&chip
->Rop
->FifoFree
, 0) < chip
->FifoEmptyCount
) ||
74 NV_RD32(&chip
->PGRAPH
[0x00000700/4], 0) & 0x01);
81 return ((NV_RD32(&chip
->Rop
->FifoFree
, 0) < chip
->FifoEmptyCount
) ||
82 NV_RD32(&chip
->PGRAPH
[0x00000700/4], 0) & 0x01);
85 static void vgaLockUnlock
92 VGA_WR08(chip
->PCIO
, 0x3D4, 0x11);
93 cr11
= VGA_RD08(chip
->PCIO
, 0x3D5);
94 if(Lock
) cr11
|= 0x80;
96 VGA_WR08(chip
->PCIO
, 0x3D5, cr11
);
98 static void nv3LockUnlock
104 VGA_WR08(chip
->PVIO
, 0x3C4, 0x06);
105 VGA_WR08(chip
->PVIO
, 0x3C5, Lock
? 0x99 : 0x57);
106 vgaLockUnlock(chip
, Lock
);
108 static void nv4LockUnlock
114 VGA_WR08(chip
->PCIO
, 0x3D4, 0x1F);
115 VGA_WR08(chip
->PCIO
, 0x3D5, Lock
? 0x99 : 0x57);
116 vgaLockUnlock(chip
, Lock
);
119 static int ShowHideCursor
126 cursor
= chip
->CurrentState
->cursor1
;
127 chip
->CurrentState
->cursor1
= (chip
->CurrentState
->cursor1
& 0xFE) |
129 VGA_WR08(chip
->PCIO
, 0x3D4, 0x31);
130 VGA_WR08(chip
->PCIO
, 0x3D5, chip
->CurrentState
->cursor1
);
131 return (cursor
& 0x01);
134 /****************************************************************************\
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). *
140 \****************************************************************************/
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
150 #define GFIFO_SIZE 320
151 #define GFIFO_SIZE_128 256
152 #define MFIFO_SIZE 120
153 #define VFIFO_SIZE 256
163 int wcmocc
, wcgocc
, wcvocc
, wcvlwm
, wcglwm
;
181 int graphics_burst_size
;
182 int video_burst_size
;
183 int graphics_hi_priority
;
184 int media_hi_priority
;
204 int graphics_burst_size
;
205 int video_burst_size
;
224 int graphics_burst_size
;
225 int video_burst_size
;
242 static int nv3_iterate(nv3_fifo_info
*res_info
, nv3_sim_state
* state
, nv3_arb_info
*ainfo
)
246 int vfsize
, mfsize
, gfsize
;
247 int mburst_size
= 32;
248 int mmisses
, gmisses
, vmisses
;
250 int vlwm
, glwm
, mlwm
;
264 if (ainfo
->gburst_size
== 128) max_gfsize
= GFIFO_SIZE_128
;
265 else max_gfsize
= GFIFO_SIZE
;
266 max_gfsize
= GFIFO_SIZE
;
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
;
277 if (state
->enable_mp
)
279 if (ainfo
->wcmocc
> ainfo
->mocc
) ainfo
->wcmocc
= ainfo
->mocc
;
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
;
290 if (!state
->gr_during_vid
&& ainfo
->vid_en
)
291 if (ainfo
->vid_en
&& (ainfo
->vocc
< 0) && !ainfo
->vid_only_once
)
293 else if (ainfo
->mocc
< 0)
295 else if (ainfo
->gocc
< ainfo
->by_gfacc
)
298 else switch (ainfo
->priority
)
301 if (ainfo
->vid_en
&& ainfo
->vocc
<0 && !ainfo
->vid_only_once
)
303 else if (ainfo
->gr_en
&& ainfo
->gocc
<0 && !ainfo
->gr_only_once
)
305 else if (ainfo
->mocc
<0)
310 if (ainfo
->gr_en
&& ainfo
->gocc
<0 && !ainfo
->gr_only_once
)
312 else if (ainfo
->vid_en
&& ainfo
->vocc
<0 && !ainfo
->vid_only_once
)
314 else if (ainfo
->mocc
<0)
321 else if (ainfo
->gr_en
&& ainfo
->gocc
<0 && !ainfo
->gr_only_once
)
323 else if (ainfo
->vid_en
&& ainfo
->vocc
<0 && !ainfo
->vid_only_once
)
334 if (last
==cur
) misses
= 0;
335 else if (ainfo
->first_vacc
) misses
= vmisses
;
337 ainfo
->first_vacc
= 0;
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
;
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;
350 if (last
==cur
) misses
= 0;
351 else if (ainfo
->first_gacc
) misses
= gmisses
;
353 ainfo
->first_gacc
= 0;
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
;
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;
366 if (last
==cur
) misses
= 0;
367 else if (ainfo
->first_macc
) misses
= mmisses
;
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;
378 ainfo
->converged
= 0;
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
)
385 ainfo
->converged
= 0;
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
)
392 ainfo
->converged
= 0;
395 if (abs(ainfo
->gocc
) > max_gfsize
)
397 ainfo
->converged
= 0;
400 if (abs(ainfo
->vocc
) > VFIFO_SIZE
)
402 ainfo
->converged
= 0;
405 if (abs(ainfo
->mocc
) > MFIFO_SIZE
)
407 ainfo
->converged
= 0;
410 if (abs(vfsize
) > VFIFO_SIZE
)
412 ainfo
->converged
= 0;
415 if (abs(gfsize
) > max_gfsize
)
417 ainfo
->converged
= 0;
420 if (abs(mfsize
) > MFIFO_SIZE
)
422 ainfo
->converged
= 0;
427 static char nv3_arb(nv3_fifo_info
* res_info
, nv3_sim_state
* state
, nv3_arb_info
*ainfo
)
429 long ens
, vns
, mns
, gns
;
430 int mmisses
, gmisses
, vmisses
, eburst_size
, mburst_size
;
433 refresh_cycle
= 2*(state
->mclk_khz
/state
->pclk_khz
) + 5;
435 if (state
->mem_aligned
) gmisses
= 2;
438 eburst_size
= state
->memory_width
* 1;
440 gns
= 1000000 * (gmisses
*state
->mem_page_miss
+ state
->mem_latency
)/state
->mclk_khz
;
441 ainfo
->by_gfacc
= gns
*ainfo
->gdrain_rate
/1000000;
447 ainfo
->engine_en
= 1;
448 ainfo
->converged
= 1;
449 if (ainfo
->engine_en
)
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;
456 ainfo
->first_vacc
= 1;
457 ainfo
->first_gacc
= 1;
458 ainfo
->first_macc
= 1;
459 nv3_iterate(res_info
, state
,ainfo
);
461 if (state
->enable_mp
)
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;
468 ainfo
->first_vacc
= 1;
469 ainfo
->first_gacc
= 1;
470 ainfo
->first_macc
= 0;
471 nv3_iterate(res_info
, state
,ainfo
);
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
);
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 ;
495 nv3_iterate(res_info
, state
, ainfo
);
497 if (ainfo
->converged
)
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)
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;
516 if (res_info
->video_lwm
> 128)
518 res_info
->video_lwm
= 128;
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;
533 static char nv3_get_param(nv3_fifo_info
*res_info
, nv3_sim_state
* state
, nv3_arb_info
*ainfo
)
538 for (p
=0; p
< 2; p
++)
540 for (g
=128 ; g
> 32; g
= g
>> 1)
542 for (v
=128; v
>=32; v
= v
>> 1)
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)
560 static void nv3CalcArbitration
562 nv3_fifo_info
* res_info
,
563 nv3_sim_state
* state
566 nv3_fifo_info save_info
;
568 char res_gr
, res_vid
;
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
)
582 ainfo
.gr_only_once
= 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
;
590 ainfo
.vid_only_once
= 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
;
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
;
608 static void nv3UpdateArbitrationSettings
617 nv3_fifo_info fifo_data
;
618 nv3_sim_state sim_data
;
619 unsigned int M
, N
, P
, pll
, MClk
;
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) ?
630 sim_data
.memory_width
= 128;
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
);
641 int b
= fifo_data
.graphics_burst_size
>> 4;
645 *lwm
= fifo_data
.graphics_lwm
>> 3;
653 static void nv4CalcArbitration
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
;
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
;
677 align
= arb
->mem_aligned
;
678 mp_enable
= arb
->enable_mp
;
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
;
715 video_drain_rate
= pclk_freq
* 2;
716 crtc_drain_rate
= pclk_freq
* bpp
/8;
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
;
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);
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
;
734 video_fill_us
= vbs
*1000*1000 / (8 * width
) / mclk_freq
;
735 cpm_us
= crtpagemiss
* pagemiss
*1000*1000/ mclk_freq
;
742 clwm
= us_crt
* crtc_drain_rate
/(1000*1000);
747 crtc_drain_rate
= pclk_freq
* bpp
/8;
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);
755 m1
= clwm
+ cbs
- 512;
756 p1
= m1
* pclk_freq
/ mclk_freq
;
758 if ((p1
< m1
) && (m1
> 0))
762 if (mclk_extra
==0) found
= 1;
765 else if (video_enable
)
767 if ((clwm
> 511) || (vlwm
> 255))
771 if (mclk_extra
==0) found
= 1;
781 if (mclk_extra
==0) found
= 1;
787 if (clwm
< 384) clwm
= 384;
788 if (vlwm
< 128) vlwm
= 128;
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
;
797 static void nv4UpdateArbitrationSettings
806 nv4_fifo_info fifo_data
;
807 nv4_sim_state sim_data
;
808 unsigned int M
, N
, P
, pll
, MClk
, NVClk
, cfg1
;
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) ?
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
);
832 int b
= fifo_data
.graphics_burst_size
>> 4;
836 *lwm
= fifo_data
.graphics_lwm
>> 3;
839 static void nv10CalcArbitration
841 nv10_fifo_info
*fifo
,
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
;
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
;
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
;
868 align
= arb
->mem_aligned
;
869 mp_enable
= arb
->enable_mp
;
876 pclks
= 4; /* lwm detect. */
878 nvclks
= 3; /* lwm -> sync. */
879 nvclks
+= 2; /* fbi bus cycles (1 req + 1 busy) */
881 mclks
= 1; /* 2 edge sync. may be very close to edge so just put one. */
883 mclks
+= 1; /* arb_hp_req */
884 mclks
+= 5; /* ap_hp_req tiling pipeline */
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 */
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 */
897 if (arb
->memory_width
== 64) /* 64 bit bus */
902 if ((!video_enable
) && (arb
->memory_width
== 128))
904 mclk_extra
= (bpp
== 32) ? 31 : 42; /* Margin of error */
909 mclk_extra
= (bpp
== 32) ? 8 : 4; /* Margin of error */
910 /* mclk_extra = 4; */ /* Margin of error */
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 */
920 mclks
+=4; /* Mp can get in with a burst of 8. */
921 /* Extra clocks determined by heuristics */
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
;
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
;
945 video_drain_rate
= pclk_freq
* 4; /* MB/s */
946 crtc_drain_rate
= pclk_freq
* bpp
/8; /* MB/s */
948 vpagemiss
= 1; /* self generating page miss */
949 vpagemiss
+= 1; /* One higher priority before */
951 crtpagemiss
= 2; /* self generating page miss */
953 crtpagemiss
+= 1; /* if MA0 conflict */
955 vpm_us
= (vpagemiss
* pagemiss
)*1000*1000/mclk_freq
;
957 us_video
= vpm_us
+ vus_m
; /* Video has separate read return path */
959 cpm_us
= crtpagemiss
* pagemiss
*1000*1000/ mclk_freq
;
961 us_video
/* Wait for video */
962 +cpm_us
/* CRT Page miss */
963 +us_m
+ us_n
+us_p
/* other latency */
966 clwm
= us_crt
* crtc_drain_rate
/(1000*1000);
967 clwm
++; /* fixed point <= float_point - 1. Fixes that */
969 crtc_drain_rate
= pclk_freq
* bpp
/8; /* bpp * pclk/8 */
971 crtpagemiss
= 1; /* self generating page miss */
972 crtpagemiss
+= 1; /* MA0 page miss */
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 */
982 // Another concern, only for high pclks so don't do this
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
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);
995 /* Finally, a heuristic check when width == 64 bits */
997 nvclk_fill
= nvclk_freq
* 8;
998 if(crtc_drain_rate
* 100 >= nvclk_fill
* 102)
999 clwm
= 0xfff; /*Large number to fail */
1001 else if(crtc_drain_rate
* 100 >= nvclk_fill
* 98) {
1004 us_extra
= (cbs
* 1000 * 1000)/ (8*width
)/mclk_freq
;
1015 clwm_rnd_down
= ((int)clwm
/8)*8;
1016 if (clwm_rnd_down
< clwm
)
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
);
1023 /* pclk cycles to drain */
1024 p1clk
= m2us
* pclk_freq
/(1000*1000);
1025 p2
= p1clk
* bpp
/ 8; /* bytes drained. */
1027 if((p2
< m1
) && (m1
> 0)) {
1030 if(min_mclk_extra
== 0) {
1032 found
= 1; /* Can't adjust anymore! */
1034 cbs
= cbs
/2; /* reduce the burst size */
1040 if (clwm
> 1023){ /* Have some margin */
1043 if(min_mclk_extra
== 0)
1044 found
= 1; /* Can't adjust anymore! */
1051 if(clwm
< (1024-cbs
+8)) clwm
= 1024-cbs
+8;
1053 /* printf("CRT LWM: %f bytes, prog: 0x%x, bs: 256\n", clwm, data ); */
1054 fifo
->graphics_lwm
= data
; fifo
->graphics_burst_size
= cbs
;
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;
1060 static void nv10UpdateArbitrationSettings
1063 unsigned pixelDepth
,
1069 nv10_fifo_info fifo_data
;
1070 nv10_sim_state sim_data
;
1071 unsigned int M
, N
, P
, pll
, MClk
, NVClk
, cfg1
;
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) ?
1085 sim_data
.memory_width
= (NV_RD32(&chip
->PEXTDEV
[0x00000000/4], 0) & 0x10) ?
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
)
1097 int b
= fifo_data
.graphics_burst_size
>> 4;
1101 *lwm
= fifo_data
.graphics_lwm
>> 3;
1105 static void nForceUpdateArbitrationSettings
1108 unsigned pixelDepth
,
1112 struct pci_dev
*pdev
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
);
1122 dev
= pci_get_domain_bus_and_slot(domain
, 0, 3);
1123 pci_read_config_dword(dev
, 0x6C, &uMClkPostDiv
);
1125 uMClkPostDiv
= (uMClkPostDiv
>> 8) & 0xf;
1127 if(!uMClkPostDiv
) uMClkPostDiv
= 4;
1128 MClk
= 400000 / uMClkPostDiv
;
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;
1137 dev
= pci_get_domain_bus_and_slot(domain
, 0, 1);
1138 pci_read_config_dword(dev
, 0x7C, &sim_data
.memory_type
);
1140 sim_data
.memory_type
= (sim_data
.memory_type
>> 12) & 1;
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
)
1153 int b
= fifo_data
.graphics_burst_size
>> 4;
1157 *lwm
= fifo_data
.graphics_lwm
>> 3;
1161 /****************************************************************************\
1163 * RIVA Mode State Routines *
1165 \****************************************************************************/
1168 * Calculate the Video Clock parameters for the PLL.
1170 static int CalcVClock
1180 unsigned lowM
, highM
, highP
;
1181 unsigned DeltaNew
, DeltaOld
;
1182 unsigned VClk
, Freq
;
1185 DeltaOld
= 0xFFFFFFFF;
1187 VClk
= (unsigned)clockIn
;
1189 if (chip
->CrystalFreqKHz
== 13500)
1192 highM
= 13 - (chip
->Architecture
== NV_ARCH_03
);
1197 highM
= 14 - (chip
->Architecture
== NV_ARCH_03
);
1200 highP
= 4 - (chip
->Architecture
== NV_ARCH_03
);
1201 for (P
= 0; P
<= highP
; P
++)
1204 if ((Freq
>= 128000) && (Freq
<= chip
->MaxVClockFreqKHz
))
1206 for (M
= lowM
; M
<= highM
; M
++)
1208 N
= (VClk
<< P
) * M
/ chip
->CrystalFreqKHz
;
1210 Freq
= (chip
->CrystalFreqKHz
* N
/ M
) >> P
;
1212 DeltaNew
= Freq
- VClk
;
1214 DeltaNew
= VClk
- Freq
;
1215 if (DeltaNew
< DeltaOld
)
1221 DeltaOld
= DeltaNew
;
1228 /* non-zero: M/N/P/clock values assigned. zero: error (not set) */
1229 return (DeltaOld
!= 0xFFFFFFFF);
1232 * Calculate extended mode parameters (SVGA) and save in a
1233 * mode state structure.
1238 RIVA_HW_STATE
*state
,
1239 struct pci_dev
*pdev
,
1248 int uninitialized_var(VClk
),uninitialized_var(m
),
1249 uninitialized_var(n
), uninitialized_var(p
);
1252 * Save mode parameters.
1254 state
->bpp
= bpp
; /* this is not bitsPerPixel, it's 8,15,16,32 */
1255 state
->width
= width
;
1256 state
->height
= height
;
1258 * Extended RIVA registers.
1260 pixelDepth
= (bpp
+ 1)/8;
1261 if (!CalcVClock(dotClock
, &VClk
, &m
, &n
, &p
, chip
))
1264 switch (chip
->Architecture
)
1267 nv3UpdateArbitrationSettings(VClk
,
1269 &(state
->arbitration0
),
1270 &(state
->arbitration1
),
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)
1279 state
->general
= 0x00100100;
1280 state
->repaint1
= hDisplaySize
< 1280 ? 0x06 : 0x02;
1283 nv4UpdateArbitrationSettings(VClk
,
1285 &(state
->arbitration0
),
1286 &(state
->arbitration1
),
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;
1299 if((chip
->Chipset
== NV_CHIP_IGEFORCE2
) ||
1300 (chip
->Chipset
== NV_CHIP_0x01F0
))
1302 nForceUpdateArbitrationSettings(VClk
,
1304 &(state
->arbitration0
),
1305 &(state
->arbitration1
),
1308 nv10UpdateArbitrationSettings(VClk
,
1310 &(state
->arbitration0
),
1311 &(state
->arbitration1
),
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;
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;
1329 state
->vpll
= (p
<< 16) | (n
<< 8) | m
;
1330 state
->repaint0
= (((width
/8)*pixelDepth
) & 0x700) >> 3;
1331 state
->pixel
= pixelDepth
> 2 ? 3 : pixelDepth
;
1339 state
->pitch3
= pixelDepth
* width
;
1344 * Load fixed function state and pre-calculated/stored state.
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]
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])
1380 static void UpdateFifoState
1387 switch (chip
->Architecture
)
1390 LOAD_FIXED_STATE(nv4
,FIFO
);
1392 chip
->Tri05
= (RivaTexturedTriangle05 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1398 * Initialize state for the RivaTriangle3D05 routines.
1400 LOAD_FIXED_STATE(nv10tri05
,PGRAPH
);
1401 LOAD_FIXED_STATE(nv10
,FIFO
);
1403 chip
->Tri05
= (RivaTexturedTriangle05 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1407 static void LoadStateExt
1410 RIVA_HW_STATE
*state
1416 * Load HW fixed function state.
1418 LOAD_FIXED_STATE(Riva
,PMC
);
1419 LOAD_FIXED_STATE(Riva
,PTIMER
);
1420 switch (chip
->Architecture
)
1424 * Make sure frame buffer config gets set before loading PRAMIN.
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
);
1434 LOAD_FIXED_STATE_15BPP(nv3
,PRAMIN
);
1435 LOAD_FIXED_STATE_15BPP(nv3
,PGRAPH
);
1436 chip
->Tri03
= (RivaTexturedTriangle03 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1440 LOAD_FIXED_STATE_32BPP(nv3
,PRAMIN
);
1441 LOAD_FIXED_STATE_32BPP(nv3
,PGRAPH
);
1446 LOAD_FIXED_STATE_8BPP(nv3
,PRAMIN
);
1447 LOAD_FIXED_STATE_8BPP(nv3
,PGRAPH
);
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
);
1464 * Make sure frame buffer config gets set before loading PRAMIN.
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
);
1473 LOAD_FIXED_STATE_15BPP(nv4
,PRAMIN
);
1474 LOAD_FIXED_STATE_15BPP(nv4
,PGRAPH
);
1475 chip
->Tri03
= (RivaTexturedTriangle03 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1478 LOAD_FIXED_STATE_16BPP(nv4
,PRAMIN
);
1479 LOAD_FIXED_STATE_16BPP(nv4
,PGRAPH
);
1480 chip
->Tri03
= (RivaTexturedTriangle03 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1484 LOAD_FIXED_STATE_32BPP(nv4
,PRAMIN
);
1485 LOAD_FIXED_STATE_32BPP(nv4
,PGRAPH
);
1490 LOAD_FIXED_STATE_8BPP(nv4
,PRAMIN
);
1491 LOAD_FIXED_STATE_8BPP(nv4
,PGRAPH
);
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
);
1507 if(chip
->twoHeads
) {
1508 VGA_WR08(chip
->PCIO
, 0x03D4, 0x44);
1509 VGA_WR08(chip
->PCIO
, 0x03D5, state
->crtcOwner
);
1510 chip
->LockUnlock(chip
, 0);
1513 LOAD_FIXED_STATE(nv10
,PFIFO
);
1514 LOAD_FIXED_STATE(nv10
,PRAMIN
);
1515 LOAD_FIXED_STATE(nv10
,PGRAPH
);
1519 LOAD_FIXED_STATE_15BPP(nv10
,PRAMIN
);
1520 LOAD_FIXED_STATE_15BPP(nv10
,PGRAPH
);
1521 chip
->Tri03
= (RivaTexturedTriangle03 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1524 LOAD_FIXED_STATE_16BPP(nv10
,PRAMIN
);
1525 LOAD_FIXED_STATE_16BPP(nv10
,PGRAPH
);
1526 chip
->Tri03
= (RivaTexturedTriangle03 __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
1530 LOAD_FIXED_STATE_32BPP(nv10
,PRAMIN
);
1531 LOAD_FIXED_STATE_32BPP(nv10
,PGRAPH
);
1536 LOAD_FIXED_STATE_8BPP(nv10
,PRAMIN
);
1537 LOAD_FIXED_STATE_8BPP(nv10
,PGRAPH
);
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
);
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));
1566 if(chip
->twoHeads
) {
1567 NV_WR32(chip
->PCRTC0
, 0x00000860, state
->head
);
1568 NV_WR32(chip
->PCRTC0
, 0x00002860, state
->head2
);
1570 NV_WR32(chip
->PRAMDAC
, 0x00000404, NV_RD32(chip
->PRAMDAC
, 0x00000404) | (1 << 25));
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);
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);
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);
1663 NV_WR32(chip
->PCRTC
, 0x00000810, state
->cursorConfig
);
1665 if(chip
->flatPanel
) {
1666 if((chip
->Chipset
& 0x0ff0) == 0x0110) {
1667 NV_WR32(chip
->PRAMDAC
, 0x0528, state
->dither
);
1669 if((chip
->Chipset
& 0x0ff0) >= 0x0170) {
1670 NV_WR32(chip
->PRAMDAC
, 0x083C, state
->dither
);
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);
1681 VGA_WR08(chip
->PCIO
, 0x03D4, 0x41);
1682 VGA_WR08(chip
->PCIO
, 0x03D5, state
->extra
);
1684 LOAD_FIXED_STATE(Riva
,FIFO
);
1685 UpdateFifoState(chip
);
1687 * Load HW mode state.
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
);
1712 if(!chip
->flatPanel
) {
1713 NV_WR32(chip
->PRAMDAC0
, 0x00000508, state
->vpll
);
1714 NV_WR32(chip
->PRAMDAC0
, 0x0000050C, state
->pllsel
);
1716 NV_WR32(chip
->PRAMDAC0
, 0x00000520, state
->vpll2
);
1718 NV_WR32(chip
->PRAMDAC
, 0x00000848 , state
->scale
);
1720 NV_WR32(chip
->PRAMDAC
, 0x00000600 , state
->general
);
1723 * Turn off VBlank enable and reset.
1725 NV_WR32(chip
->PCRTC
, 0x00000140, 0);
1726 NV_WR32(chip
->PCRTC
, 0x00000100, chip
->VBlankBit
);
1728 * Set interrupt enable.
1730 NV_WR32(chip
->PMC
, 0x00000140, chip
->EnableIRQ
& 0x01);
1732 * Set current state pointer.
1734 chip
->CurrentState
= state
;
1736 * Reset FIFO free and empty counts.
1738 chip
->FifoFreeCount
= 0;
1739 /* Free count from first subchannel */
1740 chip
->FifoEmptyCount
= NV_RD32(&chip
->Rop
->FifoFree
, 0);
1742 static void UnloadStateExt
1745 RIVA_HW_STATE
*state
1749 * Save current HW state.
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
)
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);
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);
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);
1818 VGA_WR08(chip
->PCIO
, 0x03D4, 0x41);
1819 state
->extra
= VGA_RD08(chip
->PCIO
, 0x03D5);
1820 state
->cursorConfig
= NV_RD32(chip
->PCRTC
, 0x00000810);
1822 if((chip
->Chipset
& 0x0ff0) == 0x0110) {
1823 state
->dither
= NV_RD32(chip
->PRAMDAC
, 0x0528);
1825 if((chip
->Chipset
& 0x0ff0) >= 0x0170) {
1826 state
->dither
= NV_RD32(chip
->PRAMDAC
, 0x083C);
1831 static void SetStartAddress
1837 NV_WR32(chip
->PCRTC
, 0x800, start
);
1840 static void SetStartAddress3
1846 int offset
= start
>> 2;
1847 int pan
= (start
& 3) << 1;
1851 * Unlock extended registers.
1853 chip
->LockUnlock(chip
, 0);
1855 * Set start address.
1857 VGA_WR08(chip
->PCIO
, 0x3D4, 0x0D); VGA_WR08(chip
->PCIO
, 0x3D5, offset
);
1859 VGA_WR08(chip
->PCIO
, 0x3D4, 0x0C); VGA_WR08(chip
->PCIO
, 0x3D5, offset
);
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));
1866 * 4 pixel pan register.
1868 offset
= VGA_RD08(chip
->PCIO
, chip
->IO
+ 0x0A);
1869 VGA_WR08(chip
->PCIO
, 0x3C0, 0x13);
1870 VGA_WR08(chip
->PCIO
, 0x3C0, pan
);
1872 static void nv3SetSurfaces2D
1879 RivaSurface __iomem
*Surface
=
1880 (RivaSurface __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
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);
1889 static void nv4SetSurfaces2D
1896 RivaSurface __iomem
*Surface
=
1897 (RivaSurface __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
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);
1905 static void nv10SetSurfaces2D
1912 RivaSurface __iomem
*Surface
=
1913 (RivaSurface __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
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);
1921 static void nv3SetSurfaces3D
1928 RivaSurface __iomem
*Surface
=
1929 (RivaSurface __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
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);
1938 static void nv4SetSurfaces3D
1945 RivaSurface __iomem
*Surface
=
1946 (RivaSurface __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
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);
1954 static void nv10SetSurfaces3D
1961 RivaSurface3D __iomem
*Surfaces3D
=
1962 (RivaSurface3D __iomem
*)&(chip
->FIFO
[0x0000E000/4]);
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);
1971 /****************************************************************************\
1973 * Probe RIVA Chip Configuration *
1975 \****************************************************************************/
1977 static void nv3GetConfig
1983 * Fill in chip configuration.
1985 if (NV_RD32(&chip
->PFB
[0x00000000/4], 0) & 0x00000020)
1987 if (((NV_RD32(chip
->PMC
, 0x00000000) & 0xF0) == 0x20)
1988 && ((NV_RD32(chip
->PMC
, 0x00000000) & 0x0F) >= 0x02))
1993 chip
->RamBandwidthKBytesPerSec
= 800000;
1994 switch (NV_RD32(chip
->PFB
, 0x00000000) & 0x03)
1997 chip
->RamAmountKBytes
= 1024 * 4;
2000 chip
->RamAmountKBytes
= 1024 * 2;
2003 chip
->RamAmountKBytes
= 1024 * 8;
2009 chip
->RamBandwidthKBytesPerSec
= 1000000;
2010 chip
->RamAmountKBytes
= 1024 * 8;
2018 chip
->RamBandwidthKBytesPerSec
= 1000000;
2019 switch (NV_RD32(chip
->PFB
, 0x00000000) & 0x00000003)
2022 chip
->RamAmountKBytes
= 1024 * 8;
2025 chip
->RamAmountKBytes
= 1024 * 4;
2028 chip
->RamAmountKBytes
= 1024 * 2;
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;
2037 * Set chip functions.
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
;
2048 static void nv4GetConfig
2054 * Fill in chip configuration.
2056 if (NV_RD32(chip
->PFB
, 0x00000000) & 0x00000100)
2058 chip
->RamAmountKBytes
= ((NV_RD32(chip
->PFB
, 0x00000000) >> 12) & 0x0F) * 1024 * 2
2063 switch (NV_RD32(chip
->PFB
, 0x00000000) & 0x00000003)
2066 chip
->RamAmountKBytes
= 1024 * 32;
2069 chip
->RamAmountKBytes
= 1024 * 4;
2072 chip
->RamAmountKBytes
= 1024 * 8;
2076 chip
->RamAmountKBytes
= 1024 * 16;
2080 switch ((NV_RD32(chip
->PFB
, 0x00000000) >> 3) & 0x00000003)
2083 chip
->RamBandwidthKBytesPerSec
= 800000;
2086 chip
->RamBandwidthKBytesPerSec
= 1000000;
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;
2094 * Set chip functions.
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
;
2105 static void nv10GetConfig
2108 struct pci_dev
*pdev
,
2109 unsigned int chipset
2112 struct pci_dev
* dev
;
2113 int domain
= pci_domain_nr(pdev
->bus
);
2117 /* turn on big endian register access */
2118 if(!(NV_RD32(chip
->PMC
, 0x00000004) & 0x01000001))
2119 NV_WR32(chip
->PMC
, 0x00000004, 0x01000001);
2123 * Fill in chip configuration.
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
);
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
);
2134 chip
->RamAmountKBytes
= (((amt
>> 4) & 127) + 1) * 1024;
2136 switch ((NV_RD32(chip
->PFB
, 0x0000020C) >> 20) & 0x000000FF)
2139 chip
->RamAmountKBytes
= 1024 * 2;
2142 chip
->RamAmountKBytes
= 1024 * 4;
2145 chip
->RamAmountKBytes
= 1024 * 8;
2148 chip
->RamAmountKBytes
= 1024 * 16;
2151 chip
->RamAmountKBytes
= 1024 * 32;
2154 chip
->RamAmountKBytes
= 1024 * 64;
2157 chip
->RamAmountKBytes
= 1024 * 128;
2160 chip
->RamAmountKBytes
= 1024 * 16;
2164 switch ((NV_RD32(chip
->PFB
, 0x00000000) >> 3) & 0x00000003)
2167 chip
->RamBandwidthKBytesPerSec
= 800000;
2170 chip
->RamBandwidthKBytesPerSec
= 1000000;
2173 chip
->CrystalFreqKHz
= (NV_RD32(chip
->PEXTDEV
, 0x0000) & (1 << 6)) ?
2176 switch (chipset
& 0x0ff0) {
2187 if(NV_RD32(chip
->PEXTDEV
, 0x0000) & (1 << 22))
2188 chip
->CrystalFreqKHz
= 27000;
2194 chip
->CursorStart
= (chip
->RamAmountKBytes
- 128) * 1024;
2195 chip
->CURSOR
= NULL
; /* can't set this here */
2196 chip
->VBlankBit
= 0x00000001;
2197 chip
->MaxVClockFreqKHz
= 350000;
2199 * Set chip functions.
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
;
2210 switch(chipset
& 0x0ff0) {
2222 chip
->twoHeads
= TRUE
;
2225 chip
->twoHeads
= FALSE
;
2232 struct pci_dev
*pdev
,
2233 unsigned int chipset
2237 * Save this so future SW know whats it's dealing with.
2239 chip
->Version
= RIVA_SW_VERSION
;
2241 * Chip specific configuration.
2243 switch (chip
->Architecture
)
2254 nv10GetConfig(chip
, pdev
, chipset
);
2259 chip
->Chipset
= chipset
;
2261 * Fill in FIFO pointers.
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]);