18c2ecf20Sopenharmony_ci /***************************************************************************\
28c2ecf20Sopenharmony_ci|*                                                                           *|
38c2ecf20Sopenharmony_ci|*       Copyright 1993-2003 NVIDIA, Corporation.  All rights reserved.      *|
48c2ecf20Sopenharmony_ci|*                                                                           *|
58c2ecf20Sopenharmony_ci|*     NOTICE TO USER:   The source code  is copyrighted under  U.S. and     *|
68c2ecf20Sopenharmony_ci|*     international laws.  Users and possessors of this source code are     *|
78c2ecf20Sopenharmony_ci|*     hereby granted a nonexclusive,  royalty-free copyright license to     *|
88c2ecf20Sopenharmony_ci|*     use this code in individual and commercial software.                  *|
98c2ecf20Sopenharmony_ci|*                                                                           *|
108c2ecf20Sopenharmony_ci|*     Any use of this source code must include,  in the user documenta-     *|
118c2ecf20Sopenharmony_ci|*     tion and  internal comments to the code,  notices to the end user     *|
128c2ecf20Sopenharmony_ci|*     as follows:                                                           *|
138c2ecf20Sopenharmony_ci|*                                                                           *|
148c2ecf20Sopenharmony_ci|*       Copyright 1993-2003 NVIDIA, Corporation.  All rights reserved.      *|
158c2ecf20Sopenharmony_ci|*                                                                           *|
168c2ecf20Sopenharmony_ci|*     NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY     *|
178c2ecf20Sopenharmony_ci|*     OF  THIS SOURCE  CODE  FOR ANY PURPOSE.  IT IS  PROVIDED  "AS IS"     *|
188c2ecf20Sopenharmony_ci|*     WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND.  NVIDIA, CORPOR-     *|
198c2ecf20Sopenharmony_ci|*     ATION DISCLAIMS ALL WARRANTIES  WITH REGARD  TO THIS SOURCE CODE,     *|
208c2ecf20Sopenharmony_ci|*     INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE-     *|
218c2ecf20Sopenharmony_ci|*     MENT,  AND FITNESS  FOR A PARTICULAR PURPOSE.   IN NO EVENT SHALL     *|
228c2ecf20Sopenharmony_ci|*     NVIDIA, CORPORATION  BE LIABLE FOR ANY SPECIAL,  INDIRECT,  INCI-     *|
238c2ecf20Sopenharmony_ci|*     DENTAL, OR CONSEQUENTIAL DAMAGES,  OR ANY DAMAGES  WHATSOEVER RE-     *|
248c2ecf20Sopenharmony_ci|*     SULTING FROM LOSS OF USE,  DATA OR PROFITS,  WHETHER IN AN ACTION     *|
258c2ecf20Sopenharmony_ci|*     OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,  ARISING OUT OF     *|
268c2ecf20Sopenharmony_ci|*     OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE.     *|
278c2ecf20Sopenharmony_ci|*                                                                           *|
288c2ecf20Sopenharmony_ci|*     U.S. Government  End  Users.   This source code  is a "commercial     *|
298c2ecf20Sopenharmony_ci|*     item,"  as that  term is  defined at  48 C.F.R. 2.101 (OCT 1995),     *|
308c2ecf20Sopenharmony_ci|*     consisting  of "commercial  computer  software"  and  "commercial     *|
318c2ecf20Sopenharmony_ci|*     computer  software  documentation,"  as such  terms  are  used in     *|
328c2ecf20Sopenharmony_ci|*     48 C.F.R. 12.212 (SEPT 1995)  and is provided to the U.S. Govern-     *|
338c2ecf20Sopenharmony_ci|*     ment only as  a commercial end item.   Consistent with  48 C.F.R.     *|
348c2ecf20Sopenharmony_ci|*     12.212 and  48 C.F.R. 227.7202-1 through  227.7202-4 (JUNE 1995),     *|
358c2ecf20Sopenharmony_ci|*     all U.S. Government End Users  acquire the source code  with only     *|
368c2ecf20Sopenharmony_ci|*     those rights set forth herein.                                        *|
378c2ecf20Sopenharmony_ci|*                                                                           *|
388c2ecf20Sopenharmony_ci \***************************************************************************/
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/*
418c2ecf20Sopenharmony_ci * GPL Licensing Note - According to Mark Vojkovich, author of the Xorg/
428c2ecf20Sopenharmony_ci * XFree86 'nv' driver, this source code is provided under MIT-style licensing
438c2ecf20Sopenharmony_ci * where the source code is provided "as is" without warranty of any kind.
448c2ecf20Sopenharmony_ci * The only usage restriction is for the copyright notices to be retained
458c2ecf20Sopenharmony_ci * whenever code is used.
468c2ecf20Sopenharmony_ci *
478c2ecf20Sopenharmony_ci * Antonino Daplas <adaplas@pol.net> 2005-03-11
488c2ecf20Sopenharmony_ci */
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_hw.c,v 1.4 2003/11/03 05:11:25 tsi Exp $ */
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci#include <linux/pci.h>
538c2ecf20Sopenharmony_ci#include "nv_type.h"
548c2ecf20Sopenharmony_ci#include "nv_local.h"
558c2ecf20Sopenharmony_ci#include "nv_proto.h"
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_civoid NVLockUnlock(struct nvidia_par *par, int Lock)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	u8 cr11;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x3D4, 0x1F);
628c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x3D5, Lock ? 0x99 : 0x57);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x3D4, 0x11);
658c2ecf20Sopenharmony_ci	cr11 = VGA_RD08(par->PCIO, 0x3D5);
668c2ecf20Sopenharmony_ci	if (Lock)
678c2ecf20Sopenharmony_ci		cr11 |= 0x80;
688c2ecf20Sopenharmony_ci	else
698c2ecf20Sopenharmony_ci		cr11 &= ~0x80;
708c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x3D5, cr11);
718c2ecf20Sopenharmony_ci}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ciint NVShowHideCursor(struct nvidia_par *par, int ShowHide)
748c2ecf20Sopenharmony_ci{
758c2ecf20Sopenharmony_ci	int cur = par->CurrentState->cursor1;
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	par->CurrentState->cursor1 = (par->CurrentState->cursor1 & 0xFE) |
788c2ecf20Sopenharmony_ci	    (ShowHide & 0x01);
798c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x3D4, 0x31);
808c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x3D5, par->CurrentState->cursor1);
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	if (par->Architecture == NV_ARCH_40)
838c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMDAC, 0x0300, NV_RD32(par->PRAMDAC, 0x0300));
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci	return (cur & 0x01);
868c2ecf20Sopenharmony_ci}
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci/****************************************************************************\
898c2ecf20Sopenharmony_ci*                                                                            *
908c2ecf20Sopenharmony_ci* The video arbitration routines calculate some "magic" numbers.  Fixes      *
918c2ecf20Sopenharmony_ci* the snow seen when accessing the framebuffer without it.                   *
928c2ecf20Sopenharmony_ci* It just works (I hope).                                                    *
938c2ecf20Sopenharmony_ci*                                                                            *
948c2ecf20Sopenharmony_ci\****************************************************************************/
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_citypedef struct {
978c2ecf20Sopenharmony_ci	int graphics_lwm;
988c2ecf20Sopenharmony_ci	int video_lwm;
998c2ecf20Sopenharmony_ci	int graphics_burst_size;
1008c2ecf20Sopenharmony_ci	int video_burst_size;
1018c2ecf20Sopenharmony_ci	int valid;
1028c2ecf20Sopenharmony_ci} nv4_fifo_info;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_citypedef struct {
1058c2ecf20Sopenharmony_ci	int pclk_khz;
1068c2ecf20Sopenharmony_ci	int mclk_khz;
1078c2ecf20Sopenharmony_ci	int nvclk_khz;
1088c2ecf20Sopenharmony_ci	char mem_page_miss;
1098c2ecf20Sopenharmony_ci	char mem_latency;
1108c2ecf20Sopenharmony_ci	int memory_width;
1118c2ecf20Sopenharmony_ci	char enable_video;
1128c2ecf20Sopenharmony_ci	char gr_during_vid;
1138c2ecf20Sopenharmony_ci	char pix_bpp;
1148c2ecf20Sopenharmony_ci	char mem_aligned;
1158c2ecf20Sopenharmony_ci	char enable_mp;
1168c2ecf20Sopenharmony_ci} nv4_sim_state;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_citypedef struct {
1198c2ecf20Sopenharmony_ci	int graphics_lwm;
1208c2ecf20Sopenharmony_ci	int video_lwm;
1218c2ecf20Sopenharmony_ci	int graphics_burst_size;
1228c2ecf20Sopenharmony_ci	int video_burst_size;
1238c2ecf20Sopenharmony_ci	int valid;
1248c2ecf20Sopenharmony_ci} nv10_fifo_info;
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_citypedef struct {
1278c2ecf20Sopenharmony_ci	int pclk_khz;
1288c2ecf20Sopenharmony_ci	int mclk_khz;
1298c2ecf20Sopenharmony_ci	int nvclk_khz;
1308c2ecf20Sopenharmony_ci	char mem_page_miss;
1318c2ecf20Sopenharmony_ci	char mem_latency;
1328c2ecf20Sopenharmony_ci	u32 memory_type;
1338c2ecf20Sopenharmony_ci	int memory_width;
1348c2ecf20Sopenharmony_ci	char enable_video;
1358c2ecf20Sopenharmony_ci	char gr_during_vid;
1368c2ecf20Sopenharmony_ci	char pix_bpp;
1378c2ecf20Sopenharmony_ci	char mem_aligned;
1388c2ecf20Sopenharmony_ci	char enable_mp;
1398c2ecf20Sopenharmony_ci} nv10_sim_state;
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_cistatic void nvGetClocks(struct nvidia_par *par, unsigned int *MClk,
1428c2ecf20Sopenharmony_ci			unsigned int *NVClk)
1438c2ecf20Sopenharmony_ci{
1448c2ecf20Sopenharmony_ci	unsigned int pll, N, M, MB, NB, P;
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_40) {
1478c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PMC, 0x4020);
1488c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x07;
1498c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PMC, 0x4024);
1508c2ecf20Sopenharmony_ci		M = pll & 0xFF;
1518c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
1528c2ecf20Sopenharmony_ci		if (((par->Chipset & 0xfff0) == 0x0290) ||
1538c2ecf20Sopenharmony_ci		    ((par->Chipset & 0xfff0) == 0x0390)) {
1548c2ecf20Sopenharmony_ci			MB = 1;
1558c2ecf20Sopenharmony_ci			NB = 1;
1568c2ecf20Sopenharmony_ci		} else {
1578c2ecf20Sopenharmony_ci			MB = (pll >> 16) & 0xFF;
1588c2ecf20Sopenharmony_ci			NB = (pll >> 24) & 0xFF;
1598c2ecf20Sopenharmony_ci		}
1608c2ecf20Sopenharmony_ci		*MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PMC, 0x4000);
1638c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x07;
1648c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PMC, 0x4004);
1658c2ecf20Sopenharmony_ci		M = pll & 0xFF;
1668c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
1678c2ecf20Sopenharmony_ci		MB = (pll >> 16) & 0xFF;
1688c2ecf20Sopenharmony_ci		NB = (pll >> 24) & 0xFF;
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci		*NVClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
1718c2ecf20Sopenharmony_ci	} else if (par->twoStagePLL) {
1728c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0504);
1738c2ecf20Sopenharmony_ci		M = pll & 0xFF;
1748c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
1758c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x0F;
1768c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0574);
1778c2ecf20Sopenharmony_ci		if (pll & 0x80000000) {
1788c2ecf20Sopenharmony_ci			MB = pll & 0xFF;
1798c2ecf20Sopenharmony_ci			NB = (pll >> 8) & 0xFF;
1808c2ecf20Sopenharmony_ci		} else {
1818c2ecf20Sopenharmony_ci			MB = 1;
1828c2ecf20Sopenharmony_ci			NB = 1;
1838c2ecf20Sopenharmony_ci		}
1848c2ecf20Sopenharmony_ci		*MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0500);
1878c2ecf20Sopenharmony_ci		M = pll & 0xFF;
1888c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
1898c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x0F;
1908c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0570);
1918c2ecf20Sopenharmony_ci		if (pll & 0x80000000) {
1928c2ecf20Sopenharmony_ci			MB = pll & 0xFF;
1938c2ecf20Sopenharmony_ci			NB = (pll >> 8) & 0xFF;
1948c2ecf20Sopenharmony_ci		} else {
1958c2ecf20Sopenharmony_ci			MB = 1;
1968c2ecf20Sopenharmony_ci			NB = 1;
1978c2ecf20Sopenharmony_ci		}
1988c2ecf20Sopenharmony_ci		*NVClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
1998c2ecf20Sopenharmony_ci	} else
2008c2ecf20Sopenharmony_ci	    if (((par->Chipset & 0x0ff0) == 0x0300) ||
2018c2ecf20Sopenharmony_ci		((par->Chipset & 0x0ff0) == 0x0330)) {
2028c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0504);
2038c2ecf20Sopenharmony_ci		M = pll & 0x0F;
2048c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
2058c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x07;
2068c2ecf20Sopenharmony_ci		if (pll & 0x00000080) {
2078c2ecf20Sopenharmony_ci			MB = (pll >> 4) & 0x07;
2088c2ecf20Sopenharmony_ci			NB = (pll >> 19) & 0x1f;
2098c2ecf20Sopenharmony_ci		} else {
2108c2ecf20Sopenharmony_ci			MB = 1;
2118c2ecf20Sopenharmony_ci			NB = 1;
2128c2ecf20Sopenharmony_ci		}
2138c2ecf20Sopenharmony_ci		*MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0500);
2168c2ecf20Sopenharmony_ci		M = pll & 0x0F;
2178c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
2188c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x07;
2198c2ecf20Sopenharmony_ci		if (pll & 0x00000080) {
2208c2ecf20Sopenharmony_ci			MB = (pll >> 4) & 0x07;
2218c2ecf20Sopenharmony_ci			NB = (pll >> 19) & 0x1f;
2228c2ecf20Sopenharmony_ci		} else {
2238c2ecf20Sopenharmony_ci			MB = 1;
2248c2ecf20Sopenharmony_ci			NB = 1;
2258c2ecf20Sopenharmony_ci		}
2268c2ecf20Sopenharmony_ci		*NVClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
2278c2ecf20Sopenharmony_ci	} else {
2288c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0504);
2298c2ecf20Sopenharmony_ci		M = pll & 0xFF;
2308c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
2318c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x0F;
2328c2ecf20Sopenharmony_ci		*MClk = (N * par->CrystalFreqKHz / M) >> P;
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci		pll = NV_RD32(par->PRAMDAC0, 0x0500);
2358c2ecf20Sopenharmony_ci		M = pll & 0xFF;
2368c2ecf20Sopenharmony_ci		N = (pll >> 8) & 0xFF;
2378c2ecf20Sopenharmony_ci		P = (pll >> 16) & 0x0F;
2388c2ecf20Sopenharmony_ci		*NVClk = (N * par->CrystalFreqKHz / M) >> P;
2398c2ecf20Sopenharmony_ci	}
2408c2ecf20Sopenharmony_ci}
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_cistatic void nv4CalcArbitration(nv4_fifo_info * fifo, nv4_sim_state * arb)
2438c2ecf20Sopenharmony_ci{
2448c2ecf20Sopenharmony_ci	int data, pagemiss, cas, width, video_enable, bpp;
2458c2ecf20Sopenharmony_ci	int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs;
2468c2ecf20Sopenharmony_ci	int found, mclk_extra, mclk_loop, cbs, m1, p1;
2478c2ecf20Sopenharmony_ci	int mclk_freq, pclk_freq, nvclk_freq, mp_enable;
2488c2ecf20Sopenharmony_ci	int us_m, us_n, us_p, video_drain_rate, crtc_drain_rate;
2498c2ecf20Sopenharmony_ci	int vpm_us, us_video, vlwm, video_fill_us, cpm_us, us_crt, clwm;
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci	fifo->valid = 1;
2528c2ecf20Sopenharmony_ci	pclk_freq = arb->pclk_khz;
2538c2ecf20Sopenharmony_ci	mclk_freq = arb->mclk_khz;
2548c2ecf20Sopenharmony_ci	nvclk_freq = arb->nvclk_khz;
2558c2ecf20Sopenharmony_ci	pagemiss = arb->mem_page_miss;
2568c2ecf20Sopenharmony_ci	cas = arb->mem_latency;
2578c2ecf20Sopenharmony_ci	width = arb->memory_width >> 6;
2588c2ecf20Sopenharmony_ci	video_enable = arb->enable_video;
2598c2ecf20Sopenharmony_ci	bpp = arb->pix_bpp;
2608c2ecf20Sopenharmony_ci	mp_enable = arb->enable_mp;
2618c2ecf20Sopenharmony_ci	clwm = 0;
2628c2ecf20Sopenharmony_ci	vlwm = 0;
2638c2ecf20Sopenharmony_ci	cbs = 128;
2648c2ecf20Sopenharmony_ci	pclks = 2;
2658c2ecf20Sopenharmony_ci	nvclks = 2;
2668c2ecf20Sopenharmony_ci	nvclks += 2;
2678c2ecf20Sopenharmony_ci	nvclks += 1;
2688c2ecf20Sopenharmony_ci	mclks = 5;
2698c2ecf20Sopenharmony_ci	mclks += 3;
2708c2ecf20Sopenharmony_ci	mclks += 1;
2718c2ecf20Sopenharmony_ci	mclks += cas;
2728c2ecf20Sopenharmony_ci	mclks += 1;
2738c2ecf20Sopenharmony_ci	mclks += 1;
2748c2ecf20Sopenharmony_ci	mclks += 1;
2758c2ecf20Sopenharmony_ci	mclks += 1;
2768c2ecf20Sopenharmony_ci	mclk_extra = 3;
2778c2ecf20Sopenharmony_ci	nvclks += 2;
2788c2ecf20Sopenharmony_ci	nvclks += 1;
2798c2ecf20Sopenharmony_ci	nvclks += 1;
2808c2ecf20Sopenharmony_ci	nvclks += 1;
2818c2ecf20Sopenharmony_ci	if (mp_enable)
2828c2ecf20Sopenharmony_ci		mclks += 4;
2838c2ecf20Sopenharmony_ci	nvclks += 0;
2848c2ecf20Sopenharmony_ci	pclks += 0;
2858c2ecf20Sopenharmony_ci	found = 0;
2868c2ecf20Sopenharmony_ci	vbs = 0;
2878c2ecf20Sopenharmony_ci	while (found != 1) {
2888c2ecf20Sopenharmony_ci		fifo->valid = 1;
2898c2ecf20Sopenharmony_ci		found = 1;
2908c2ecf20Sopenharmony_ci		mclk_loop = mclks + mclk_extra;
2918c2ecf20Sopenharmony_ci		us_m = mclk_loop * 1000 * 1000 / mclk_freq;
2928c2ecf20Sopenharmony_ci		us_n = nvclks * 1000 * 1000 / nvclk_freq;
2938c2ecf20Sopenharmony_ci		us_p = nvclks * 1000 * 1000 / pclk_freq;
2948c2ecf20Sopenharmony_ci		if (video_enable) {
2958c2ecf20Sopenharmony_ci			video_drain_rate = pclk_freq * 2;
2968c2ecf20Sopenharmony_ci			crtc_drain_rate = pclk_freq * bpp / 8;
2978c2ecf20Sopenharmony_ci			vpagemiss = 2;
2988c2ecf20Sopenharmony_ci			vpagemiss += 1;
2998c2ecf20Sopenharmony_ci			crtpagemiss = 2;
3008c2ecf20Sopenharmony_ci			vpm_us =
3018c2ecf20Sopenharmony_ci			    (vpagemiss * pagemiss) * 1000 * 1000 / mclk_freq;
3028c2ecf20Sopenharmony_ci			if (nvclk_freq * 2 > mclk_freq * width)
3038c2ecf20Sopenharmony_ci				video_fill_us =
3048c2ecf20Sopenharmony_ci				    cbs * 1000 * 1000 / 16 / nvclk_freq;
3058c2ecf20Sopenharmony_ci			else
3068c2ecf20Sopenharmony_ci				video_fill_us =
3078c2ecf20Sopenharmony_ci				    cbs * 1000 * 1000 / (8 * width) /
3088c2ecf20Sopenharmony_ci				    mclk_freq;
3098c2ecf20Sopenharmony_ci			us_video = vpm_us + us_m + us_n + us_p + video_fill_us;
3108c2ecf20Sopenharmony_ci			vlwm = us_video * video_drain_rate / (1000 * 1000);
3118c2ecf20Sopenharmony_ci			vlwm++;
3128c2ecf20Sopenharmony_ci			vbs = 128;
3138c2ecf20Sopenharmony_ci			if (vlwm > 128)
3148c2ecf20Sopenharmony_ci				vbs = 64;
3158c2ecf20Sopenharmony_ci			if (vlwm > (256 - 64))
3168c2ecf20Sopenharmony_ci				vbs = 32;
3178c2ecf20Sopenharmony_ci			if (nvclk_freq * 2 > mclk_freq * width)
3188c2ecf20Sopenharmony_ci				video_fill_us =
3198c2ecf20Sopenharmony_ci				    vbs * 1000 * 1000 / 16 / nvclk_freq;
3208c2ecf20Sopenharmony_ci			else
3218c2ecf20Sopenharmony_ci				video_fill_us =
3228c2ecf20Sopenharmony_ci				    vbs * 1000 * 1000 / (8 * width) /
3238c2ecf20Sopenharmony_ci				    mclk_freq;
3248c2ecf20Sopenharmony_ci			cpm_us =
3258c2ecf20Sopenharmony_ci			    crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq;
3268c2ecf20Sopenharmony_ci			us_crt =
3278c2ecf20Sopenharmony_ci			    us_video + video_fill_us + cpm_us + us_m + us_n +
3288c2ecf20Sopenharmony_ci			    us_p;
3298c2ecf20Sopenharmony_ci			clwm = us_crt * crtc_drain_rate / (1000 * 1000);
3308c2ecf20Sopenharmony_ci			clwm++;
3318c2ecf20Sopenharmony_ci		} else {
3328c2ecf20Sopenharmony_ci			crtc_drain_rate = pclk_freq * bpp / 8;
3338c2ecf20Sopenharmony_ci			crtpagemiss = 2;
3348c2ecf20Sopenharmony_ci			crtpagemiss += 1;
3358c2ecf20Sopenharmony_ci			cpm_us =
3368c2ecf20Sopenharmony_ci			    crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq;
3378c2ecf20Sopenharmony_ci			us_crt = cpm_us + us_m + us_n + us_p;
3388c2ecf20Sopenharmony_ci			clwm = us_crt * crtc_drain_rate / (1000 * 1000);
3398c2ecf20Sopenharmony_ci			clwm++;
3408c2ecf20Sopenharmony_ci		}
3418c2ecf20Sopenharmony_ci		m1 = clwm + cbs - 512;
3428c2ecf20Sopenharmony_ci		p1 = m1 * pclk_freq / mclk_freq;
3438c2ecf20Sopenharmony_ci		p1 = p1 * bpp / 8;
3448c2ecf20Sopenharmony_ci		if ((p1 < m1) && (m1 > 0)) {
3458c2ecf20Sopenharmony_ci			fifo->valid = 0;
3468c2ecf20Sopenharmony_ci			found = 0;
3478c2ecf20Sopenharmony_ci			if (mclk_extra == 0)
3488c2ecf20Sopenharmony_ci				found = 1;
3498c2ecf20Sopenharmony_ci			mclk_extra--;
3508c2ecf20Sopenharmony_ci		} else if (video_enable) {
3518c2ecf20Sopenharmony_ci			if ((clwm > 511) || (vlwm > 255)) {
3528c2ecf20Sopenharmony_ci				fifo->valid = 0;
3538c2ecf20Sopenharmony_ci				found = 0;
3548c2ecf20Sopenharmony_ci				if (mclk_extra == 0)
3558c2ecf20Sopenharmony_ci					found = 1;
3568c2ecf20Sopenharmony_ci				mclk_extra--;
3578c2ecf20Sopenharmony_ci			}
3588c2ecf20Sopenharmony_ci		} else {
3598c2ecf20Sopenharmony_ci			if (clwm > 519) {
3608c2ecf20Sopenharmony_ci				fifo->valid = 0;
3618c2ecf20Sopenharmony_ci				found = 0;
3628c2ecf20Sopenharmony_ci				if (mclk_extra == 0)
3638c2ecf20Sopenharmony_ci					found = 1;
3648c2ecf20Sopenharmony_ci				mclk_extra--;
3658c2ecf20Sopenharmony_ci			}
3668c2ecf20Sopenharmony_ci		}
3678c2ecf20Sopenharmony_ci		if (clwm < 384)
3688c2ecf20Sopenharmony_ci			clwm = 384;
3698c2ecf20Sopenharmony_ci		if (vlwm < 128)
3708c2ecf20Sopenharmony_ci			vlwm = 128;
3718c2ecf20Sopenharmony_ci		data = (int)(clwm);
3728c2ecf20Sopenharmony_ci		fifo->graphics_lwm = data;
3738c2ecf20Sopenharmony_ci		fifo->graphics_burst_size = 128;
3748c2ecf20Sopenharmony_ci		data = (int)((vlwm + 15));
3758c2ecf20Sopenharmony_ci		fifo->video_lwm = data;
3768c2ecf20Sopenharmony_ci		fifo->video_burst_size = vbs;
3778c2ecf20Sopenharmony_ci	}
3788c2ecf20Sopenharmony_ci}
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_cistatic void nv4UpdateArbitrationSettings(unsigned VClk,
3818c2ecf20Sopenharmony_ci					 unsigned pixelDepth,
3828c2ecf20Sopenharmony_ci					 unsigned *burst,
3838c2ecf20Sopenharmony_ci					 unsigned *lwm, struct nvidia_par *par)
3848c2ecf20Sopenharmony_ci{
3858c2ecf20Sopenharmony_ci	nv4_fifo_info fifo_data;
3868c2ecf20Sopenharmony_ci	nv4_sim_state sim_data;
3878c2ecf20Sopenharmony_ci	unsigned int MClk, NVClk, cfg1;
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	nvGetClocks(par, &MClk, &NVClk);
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci	cfg1 = NV_RD32(par->PFB, 0x00000204);
3928c2ecf20Sopenharmony_ci	sim_data.pix_bpp = (char)pixelDepth;
3938c2ecf20Sopenharmony_ci	sim_data.enable_video = 0;
3948c2ecf20Sopenharmony_ci	sim_data.enable_mp = 0;
3958c2ecf20Sopenharmony_ci	sim_data.memory_width = (NV_RD32(par->PEXTDEV, 0x0000) & 0x10) ?
3968c2ecf20Sopenharmony_ci	    128 : 64;
3978c2ecf20Sopenharmony_ci	sim_data.mem_latency = (char)cfg1 & 0x0F;
3988c2ecf20Sopenharmony_ci	sim_data.mem_aligned = 1;
3998c2ecf20Sopenharmony_ci	sim_data.mem_page_miss =
4008c2ecf20Sopenharmony_ci	    (char)(((cfg1 >> 4) & 0x0F) + ((cfg1 >> 31) & 0x01));
4018c2ecf20Sopenharmony_ci	sim_data.gr_during_vid = 0;
4028c2ecf20Sopenharmony_ci	sim_data.pclk_khz = VClk;
4038c2ecf20Sopenharmony_ci	sim_data.mclk_khz = MClk;
4048c2ecf20Sopenharmony_ci	sim_data.nvclk_khz = NVClk;
4058c2ecf20Sopenharmony_ci	nv4CalcArbitration(&fifo_data, &sim_data);
4068c2ecf20Sopenharmony_ci	if (fifo_data.valid) {
4078c2ecf20Sopenharmony_ci		int b = fifo_data.graphics_burst_size >> 4;
4088c2ecf20Sopenharmony_ci		*burst = 0;
4098c2ecf20Sopenharmony_ci		while (b >>= 1)
4108c2ecf20Sopenharmony_ci			(*burst)++;
4118c2ecf20Sopenharmony_ci		*lwm = fifo_data.graphics_lwm >> 3;
4128c2ecf20Sopenharmony_ci	}
4138c2ecf20Sopenharmony_ci}
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_cistatic void nv10CalcArbitration(nv10_fifo_info * fifo, nv10_sim_state * arb)
4168c2ecf20Sopenharmony_ci{
4178c2ecf20Sopenharmony_ci	int data, pagemiss, width, video_enable, bpp;
4188c2ecf20Sopenharmony_ci	int nvclks, mclks, pclks, vpagemiss, crtpagemiss;
4198c2ecf20Sopenharmony_ci	int nvclk_fill;
4208c2ecf20Sopenharmony_ci	int found, mclk_extra, mclk_loop, cbs, m1;
4218c2ecf20Sopenharmony_ci	int mclk_freq, pclk_freq, nvclk_freq, mp_enable;
4228c2ecf20Sopenharmony_ci	int us_m, us_m_min, us_n, us_p, crtc_drain_rate;
4238c2ecf20Sopenharmony_ci	int vus_m;
4248c2ecf20Sopenharmony_ci	int vpm_us, us_video, cpm_us, us_crt, clwm;
4258c2ecf20Sopenharmony_ci	int clwm_rnd_down;
4268c2ecf20Sopenharmony_ci	int m2us, us_pipe_min, p1clk, p2;
4278c2ecf20Sopenharmony_ci	int min_mclk_extra;
4288c2ecf20Sopenharmony_ci	int us_min_mclk_extra;
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci	fifo->valid = 1;
4318c2ecf20Sopenharmony_ci	pclk_freq = arb->pclk_khz;	/* freq in KHz */
4328c2ecf20Sopenharmony_ci	mclk_freq = arb->mclk_khz;
4338c2ecf20Sopenharmony_ci	nvclk_freq = arb->nvclk_khz;
4348c2ecf20Sopenharmony_ci	pagemiss = arb->mem_page_miss;
4358c2ecf20Sopenharmony_ci	width = arb->memory_width / 64;
4368c2ecf20Sopenharmony_ci	video_enable = arb->enable_video;
4378c2ecf20Sopenharmony_ci	bpp = arb->pix_bpp;
4388c2ecf20Sopenharmony_ci	mp_enable = arb->enable_mp;
4398c2ecf20Sopenharmony_ci	clwm = 0;
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_ci	cbs = 512;
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ci	pclks = 4;	/* lwm detect. */
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ci	nvclks = 3;	/* lwm -> sync. */
4468c2ecf20Sopenharmony_ci	nvclks += 2;	/* fbi bus cycles (1 req + 1 busy) */
4478c2ecf20Sopenharmony_ci	/* 2 edge sync.  may be very close to edge so just put one. */
4488c2ecf20Sopenharmony_ci	mclks = 1;
4498c2ecf20Sopenharmony_ci	mclks += 1;	/* arb_hp_req */
4508c2ecf20Sopenharmony_ci	mclks += 5;	/* ap_hp_req   tiling pipeline */
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci	mclks += 2;	/* tc_req     latency fifo */
4538c2ecf20Sopenharmony_ci	mclks += 2;	/* fb_cas_n_  memory request to fbio block */
4548c2ecf20Sopenharmony_ci	mclks += 7;	/* sm_d_rdv   data returned from fbio block */
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci	/* fb.rd.d.Put_gc   need to accumulate 256 bits for read */
4578c2ecf20Sopenharmony_ci	if (arb->memory_type == 0)
4588c2ecf20Sopenharmony_ci		if (arb->memory_width == 64)	/* 64 bit bus */
4598c2ecf20Sopenharmony_ci			mclks += 4;
4608c2ecf20Sopenharmony_ci		else
4618c2ecf20Sopenharmony_ci			mclks += 2;
4628c2ecf20Sopenharmony_ci	else if (arb->memory_width == 64)	/* 64 bit bus */
4638c2ecf20Sopenharmony_ci		mclks += 2;
4648c2ecf20Sopenharmony_ci	else
4658c2ecf20Sopenharmony_ci		mclks += 1;
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	if ((!video_enable) && (arb->memory_width == 128)) {
4688c2ecf20Sopenharmony_ci		mclk_extra = (bpp == 32) ? 31 : 42;	/* Margin of error */
4698c2ecf20Sopenharmony_ci		min_mclk_extra = 17;
4708c2ecf20Sopenharmony_ci	} else {
4718c2ecf20Sopenharmony_ci		mclk_extra = (bpp == 32) ? 8 : 4;	/* Margin of error */
4728c2ecf20Sopenharmony_ci		/* mclk_extra = 4; *//* Margin of error */
4738c2ecf20Sopenharmony_ci		min_mclk_extra = 18;
4748c2ecf20Sopenharmony_ci	}
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ci	/* 2 edge sync.  may be very close to edge so just put one. */
4778c2ecf20Sopenharmony_ci	nvclks += 1;
4788c2ecf20Sopenharmony_ci	nvclks += 1;		/* fbi_d_rdv_n */
4798c2ecf20Sopenharmony_ci	nvclks += 1;		/* Fbi_d_rdata */
4808c2ecf20Sopenharmony_ci	nvclks += 1;		/* crtfifo load */
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci	if (mp_enable)
4838c2ecf20Sopenharmony_ci		mclks += 4;	/* Mp can get in with a burst of 8. */
4848c2ecf20Sopenharmony_ci	/* Extra clocks determined by heuristics */
4858c2ecf20Sopenharmony_ci
4868c2ecf20Sopenharmony_ci	nvclks += 0;
4878c2ecf20Sopenharmony_ci	pclks += 0;
4888c2ecf20Sopenharmony_ci	found = 0;
4898c2ecf20Sopenharmony_ci	while (found != 1) {
4908c2ecf20Sopenharmony_ci		fifo->valid = 1;
4918c2ecf20Sopenharmony_ci		found = 1;
4928c2ecf20Sopenharmony_ci		mclk_loop = mclks + mclk_extra;
4938c2ecf20Sopenharmony_ci		/* Mclk latency in us */
4948c2ecf20Sopenharmony_ci		us_m = mclk_loop * 1000 * 1000 / mclk_freq;
4958c2ecf20Sopenharmony_ci		/* Minimum Mclk latency in us */
4968c2ecf20Sopenharmony_ci		us_m_min = mclks * 1000 * 1000 / mclk_freq;
4978c2ecf20Sopenharmony_ci		us_min_mclk_extra = min_mclk_extra * 1000 * 1000 / mclk_freq;
4988c2ecf20Sopenharmony_ci		/* nvclk latency in us */
4998c2ecf20Sopenharmony_ci		us_n = nvclks * 1000 * 1000 / nvclk_freq;
5008c2ecf20Sopenharmony_ci		/* nvclk latency in us */
5018c2ecf20Sopenharmony_ci		us_p = pclks * 1000 * 1000 / pclk_freq;
5028c2ecf20Sopenharmony_ci		us_pipe_min = us_m_min + us_n + us_p;
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci		/* Mclk latency in us */
5058c2ecf20Sopenharmony_ci		vus_m = mclk_loop * 1000 * 1000 / mclk_freq;
5068c2ecf20Sopenharmony_ci
5078c2ecf20Sopenharmony_ci		if (video_enable) {
5088c2ecf20Sopenharmony_ci			crtc_drain_rate = pclk_freq * bpp / 8;	/* MB/s */
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci			vpagemiss = 1;	/* self generating page miss */
5118c2ecf20Sopenharmony_ci			vpagemiss += 1;	/* One higher priority before */
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci			crtpagemiss = 2;	/* self generating page miss */
5148c2ecf20Sopenharmony_ci			if (mp_enable)
5158c2ecf20Sopenharmony_ci				crtpagemiss += 1;	/* if MA0 conflict */
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ci			vpm_us =
5188c2ecf20Sopenharmony_ci			    (vpagemiss * pagemiss) * 1000 * 1000 / mclk_freq;
5198c2ecf20Sopenharmony_ci
5208c2ecf20Sopenharmony_ci			/* Video has separate read return path */
5218c2ecf20Sopenharmony_ci			us_video = vpm_us + vus_m;
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_ci			cpm_us =
5248c2ecf20Sopenharmony_ci			    crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq;
5258c2ecf20Sopenharmony_ci			/* Wait for video */
5268c2ecf20Sopenharmony_ci			us_crt = us_video
5278c2ecf20Sopenharmony_ci			    + cpm_us	/* CRT Page miss */
5288c2ecf20Sopenharmony_ci			    + us_m + us_n + us_p	/* other latency */
5298c2ecf20Sopenharmony_ci			    ;
5308c2ecf20Sopenharmony_ci
5318c2ecf20Sopenharmony_ci			clwm = us_crt * crtc_drain_rate / (1000 * 1000);
5328c2ecf20Sopenharmony_ci			/* fixed point <= float_point - 1.  Fixes that */
5338c2ecf20Sopenharmony_ci			clwm++;
5348c2ecf20Sopenharmony_ci		} else {
5358c2ecf20Sopenharmony_ci		    /* bpp * pclk/8 */
5368c2ecf20Sopenharmony_ci			crtc_drain_rate = pclk_freq * bpp / 8;
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_ci			crtpagemiss = 1;	/* self generating page miss */
5398c2ecf20Sopenharmony_ci			crtpagemiss += 1;	/* MA0 page miss */
5408c2ecf20Sopenharmony_ci			if (mp_enable)
5418c2ecf20Sopenharmony_ci				crtpagemiss += 1;	/* if MA0 conflict */
5428c2ecf20Sopenharmony_ci			cpm_us =
5438c2ecf20Sopenharmony_ci			    crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq;
5448c2ecf20Sopenharmony_ci			us_crt = cpm_us + us_m + us_n + us_p;
5458c2ecf20Sopenharmony_ci			clwm = us_crt * crtc_drain_rate / (1000 * 1000);
5468c2ecf20Sopenharmony_ci			/* fixed point <= float_point - 1.  Fixes that */
5478c2ecf20Sopenharmony_ci			clwm++;
5488c2ecf20Sopenharmony_ci
5498c2ecf20Sopenharmony_ci			/* Finally, a heuristic check when width == 64 bits */
5508c2ecf20Sopenharmony_ci			if (width == 1) {
5518c2ecf20Sopenharmony_ci				nvclk_fill = nvclk_freq * 8;
5528c2ecf20Sopenharmony_ci				if (crtc_drain_rate * 100 >= nvclk_fill * 102)
5538c2ecf20Sopenharmony_ci					/*Large number to fail */
5548c2ecf20Sopenharmony_ci					clwm = 0xfff;
5558c2ecf20Sopenharmony_ci
5568c2ecf20Sopenharmony_ci				else if (crtc_drain_rate * 100 >=
5578c2ecf20Sopenharmony_ci					 nvclk_fill * 98) {
5588c2ecf20Sopenharmony_ci					clwm = 1024;
5598c2ecf20Sopenharmony_ci					cbs = 512;
5608c2ecf20Sopenharmony_ci				}
5618c2ecf20Sopenharmony_ci			}
5628c2ecf20Sopenharmony_ci		}
5638c2ecf20Sopenharmony_ci
5648c2ecf20Sopenharmony_ci		/*
5658c2ecf20Sopenharmony_ci		   Overfill check:
5668c2ecf20Sopenharmony_ci		 */
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci		clwm_rnd_down = ((int)clwm / 8) * 8;
5698c2ecf20Sopenharmony_ci		if (clwm_rnd_down < clwm)
5708c2ecf20Sopenharmony_ci			clwm += 8;
5718c2ecf20Sopenharmony_ci
5728c2ecf20Sopenharmony_ci		m1 = clwm + cbs - 1024;	/* Amount of overfill */
5738c2ecf20Sopenharmony_ci		m2us = us_pipe_min + us_min_mclk_extra;
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ci		/* pclk cycles to drain */
5768c2ecf20Sopenharmony_ci		p1clk = m2us * pclk_freq / (1000 * 1000);
5778c2ecf20Sopenharmony_ci		p2 = p1clk * bpp / 8;	/* bytes drained. */
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ci		if ((p2 < m1) && (m1 > 0)) {
5808c2ecf20Sopenharmony_ci			fifo->valid = 0;
5818c2ecf20Sopenharmony_ci			found = 0;
5828c2ecf20Sopenharmony_ci			if (min_mclk_extra == 0) {
5838c2ecf20Sopenharmony_ci				if (cbs <= 32) {
5848c2ecf20Sopenharmony_ci					/* Can't adjust anymore! */
5858c2ecf20Sopenharmony_ci					found = 1;
5868c2ecf20Sopenharmony_ci				} else {
5878c2ecf20Sopenharmony_ci					/* reduce the burst size */
5888c2ecf20Sopenharmony_ci					cbs = cbs / 2;
5898c2ecf20Sopenharmony_ci				}
5908c2ecf20Sopenharmony_ci			} else {
5918c2ecf20Sopenharmony_ci				min_mclk_extra--;
5928c2ecf20Sopenharmony_ci			}
5938c2ecf20Sopenharmony_ci		} else {
5948c2ecf20Sopenharmony_ci			if (clwm > 1023) {	/* Have some margin */
5958c2ecf20Sopenharmony_ci				fifo->valid = 0;
5968c2ecf20Sopenharmony_ci				found = 0;
5978c2ecf20Sopenharmony_ci				if (min_mclk_extra == 0)
5988c2ecf20Sopenharmony_ci					/* Can't adjust anymore! */
5998c2ecf20Sopenharmony_ci					found = 1;
6008c2ecf20Sopenharmony_ci				else
6018c2ecf20Sopenharmony_ci					min_mclk_extra--;
6028c2ecf20Sopenharmony_ci			}
6038c2ecf20Sopenharmony_ci		}
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci		if (clwm < (1024 - cbs + 8))
6068c2ecf20Sopenharmony_ci			clwm = 1024 - cbs + 8;
6078c2ecf20Sopenharmony_ci		data = (int)(clwm);
6088c2ecf20Sopenharmony_ci		/*  printf("CRT LWM: %f bytes, prog: 0x%x, bs: 256\n",
6098c2ecf20Sopenharmony_ci		    clwm, data ); */
6108c2ecf20Sopenharmony_ci		fifo->graphics_lwm = data;
6118c2ecf20Sopenharmony_ci		fifo->graphics_burst_size = cbs;
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci		fifo->video_lwm = 1024;
6148c2ecf20Sopenharmony_ci		fifo->video_burst_size = 512;
6158c2ecf20Sopenharmony_ci	}
6168c2ecf20Sopenharmony_ci}
6178c2ecf20Sopenharmony_ci
6188c2ecf20Sopenharmony_cistatic void nv10UpdateArbitrationSettings(unsigned VClk,
6198c2ecf20Sopenharmony_ci					  unsigned pixelDepth,
6208c2ecf20Sopenharmony_ci					  unsigned *burst,
6218c2ecf20Sopenharmony_ci					  unsigned *lwm,
6228c2ecf20Sopenharmony_ci					  struct nvidia_par *par)
6238c2ecf20Sopenharmony_ci{
6248c2ecf20Sopenharmony_ci	nv10_fifo_info fifo_data;
6258c2ecf20Sopenharmony_ci	nv10_sim_state sim_data;
6268c2ecf20Sopenharmony_ci	unsigned int MClk, NVClk, cfg1;
6278c2ecf20Sopenharmony_ci
6288c2ecf20Sopenharmony_ci	nvGetClocks(par, &MClk, &NVClk);
6298c2ecf20Sopenharmony_ci
6308c2ecf20Sopenharmony_ci	cfg1 = NV_RD32(par->PFB, 0x0204);
6318c2ecf20Sopenharmony_ci	sim_data.pix_bpp = (char)pixelDepth;
6328c2ecf20Sopenharmony_ci	sim_data.enable_video = 1;
6338c2ecf20Sopenharmony_ci	sim_data.enable_mp = 0;
6348c2ecf20Sopenharmony_ci	sim_data.memory_type = (NV_RD32(par->PFB, 0x0200) & 0x01) ? 1 : 0;
6358c2ecf20Sopenharmony_ci	sim_data.memory_width = (NV_RD32(par->PEXTDEV, 0x0000) & 0x10) ?
6368c2ecf20Sopenharmony_ci	    128 : 64;
6378c2ecf20Sopenharmony_ci	sim_data.mem_latency = (char)cfg1 & 0x0F;
6388c2ecf20Sopenharmony_ci	sim_data.mem_aligned = 1;
6398c2ecf20Sopenharmony_ci	sim_data.mem_page_miss =
6408c2ecf20Sopenharmony_ci	    (char)(((cfg1 >> 4) & 0x0F) + ((cfg1 >> 31) & 0x01));
6418c2ecf20Sopenharmony_ci	sim_data.gr_during_vid = 0;
6428c2ecf20Sopenharmony_ci	sim_data.pclk_khz = VClk;
6438c2ecf20Sopenharmony_ci	sim_data.mclk_khz = MClk;
6448c2ecf20Sopenharmony_ci	sim_data.nvclk_khz = NVClk;
6458c2ecf20Sopenharmony_ci	nv10CalcArbitration(&fifo_data, &sim_data);
6468c2ecf20Sopenharmony_ci	if (fifo_data.valid) {
6478c2ecf20Sopenharmony_ci		int b = fifo_data.graphics_burst_size >> 4;
6488c2ecf20Sopenharmony_ci		*burst = 0;
6498c2ecf20Sopenharmony_ci		while (b >>= 1)
6508c2ecf20Sopenharmony_ci			(*burst)++;
6518c2ecf20Sopenharmony_ci		*lwm = fifo_data.graphics_lwm >> 3;
6528c2ecf20Sopenharmony_ci	}
6538c2ecf20Sopenharmony_ci}
6548c2ecf20Sopenharmony_ci
6558c2ecf20Sopenharmony_cistatic void nv30UpdateArbitrationSettings (
6568c2ecf20Sopenharmony_ci    struct nvidia_par *par,
6578c2ecf20Sopenharmony_ci    unsigned int      *burst,
6588c2ecf20Sopenharmony_ci    unsigned int      *lwm
6598c2ecf20Sopenharmony_ci)
6608c2ecf20Sopenharmony_ci{
6618c2ecf20Sopenharmony_ci    unsigned int MClk, NVClk;
6628c2ecf20Sopenharmony_ci    unsigned int fifo_size, burst_size, graphics_lwm;
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_ci    fifo_size = 2048;
6658c2ecf20Sopenharmony_ci    burst_size = 512;
6668c2ecf20Sopenharmony_ci    graphics_lwm = fifo_size - burst_size;
6678c2ecf20Sopenharmony_ci
6688c2ecf20Sopenharmony_ci    nvGetClocks(par, &MClk, &NVClk);
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_ci    *burst = 0;
6718c2ecf20Sopenharmony_ci    burst_size >>= 5;
6728c2ecf20Sopenharmony_ci    while(burst_size >>= 1) (*burst)++;
6738c2ecf20Sopenharmony_ci    *lwm = graphics_lwm >> 3;
6748c2ecf20Sopenharmony_ci}
6758c2ecf20Sopenharmony_ci
6768c2ecf20Sopenharmony_cistatic void nForceUpdateArbitrationSettings(unsigned VClk,
6778c2ecf20Sopenharmony_ci					    unsigned pixelDepth,
6788c2ecf20Sopenharmony_ci					    unsigned *burst,
6798c2ecf20Sopenharmony_ci					    unsigned *lwm,
6808c2ecf20Sopenharmony_ci					    struct nvidia_par *par)
6818c2ecf20Sopenharmony_ci{
6828c2ecf20Sopenharmony_ci	nv10_fifo_info fifo_data;
6838c2ecf20Sopenharmony_ci	nv10_sim_state sim_data;
6848c2ecf20Sopenharmony_ci	unsigned int M, N, P, pll, MClk, NVClk, memctrl;
6858c2ecf20Sopenharmony_ci	struct pci_dev *dev;
6868c2ecf20Sopenharmony_ci	int domain = pci_domain_nr(par->pci_dev->bus);
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_ci	if ((par->Chipset & 0x0FF0) == 0x01A0) {
6898c2ecf20Sopenharmony_ci		unsigned int uMClkPostDiv;
6908c2ecf20Sopenharmony_ci		dev = pci_get_domain_bus_and_slot(domain, 0, 3);
6918c2ecf20Sopenharmony_ci		pci_read_config_dword(dev, 0x6C, &uMClkPostDiv);
6928c2ecf20Sopenharmony_ci		uMClkPostDiv = (uMClkPostDiv >> 8) & 0xf;
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci		if (!uMClkPostDiv)
6958c2ecf20Sopenharmony_ci			uMClkPostDiv = 4;
6968c2ecf20Sopenharmony_ci		MClk = 400000 / uMClkPostDiv;
6978c2ecf20Sopenharmony_ci	} else {
6988c2ecf20Sopenharmony_ci		dev = pci_get_domain_bus_and_slot(domain, 0, 5);
6998c2ecf20Sopenharmony_ci		pci_read_config_dword(dev, 0x4c, &MClk);
7008c2ecf20Sopenharmony_ci		MClk /= 1000;
7018c2ecf20Sopenharmony_ci	}
7028c2ecf20Sopenharmony_ci	pci_dev_put(dev);
7038c2ecf20Sopenharmony_ci	pll = NV_RD32(par->PRAMDAC0, 0x0500);
7048c2ecf20Sopenharmony_ci	M = (pll >> 0) & 0xFF;
7058c2ecf20Sopenharmony_ci	N = (pll >> 8) & 0xFF;
7068c2ecf20Sopenharmony_ci	P = (pll >> 16) & 0x0F;
7078c2ecf20Sopenharmony_ci	NVClk = (N * par->CrystalFreqKHz / M) >> P;
7088c2ecf20Sopenharmony_ci	sim_data.pix_bpp = (char)pixelDepth;
7098c2ecf20Sopenharmony_ci	sim_data.enable_video = 0;
7108c2ecf20Sopenharmony_ci	sim_data.enable_mp = 0;
7118c2ecf20Sopenharmony_ci	dev = pci_get_domain_bus_and_slot(domain, 0, 1);
7128c2ecf20Sopenharmony_ci	pci_read_config_dword(dev, 0x7C, &sim_data.memory_type);
7138c2ecf20Sopenharmony_ci	pci_dev_put(dev);
7148c2ecf20Sopenharmony_ci	sim_data.memory_type = (sim_data.memory_type >> 12) & 1;
7158c2ecf20Sopenharmony_ci	sim_data.memory_width = 64;
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_ci	dev = pci_get_domain_bus_and_slot(domain, 0, 3);
7188c2ecf20Sopenharmony_ci	pci_read_config_dword(dev, 0, &memctrl);
7198c2ecf20Sopenharmony_ci	pci_dev_put(dev);
7208c2ecf20Sopenharmony_ci	memctrl >>= 16;
7218c2ecf20Sopenharmony_ci
7228c2ecf20Sopenharmony_ci	if ((memctrl == 0x1A9) || (memctrl == 0x1AB) || (memctrl == 0x1ED)) {
7238c2ecf20Sopenharmony_ci		u32 dimm[3];
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_ci		dev = pci_get_domain_bus_and_slot(domain, 0, 2);
7268c2ecf20Sopenharmony_ci		pci_read_config_dword(dev, 0x40, &dimm[0]);
7278c2ecf20Sopenharmony_ci		dimm[0] = (dimm[0] >> 8) & 0x4f;
7288c2ecf20Sopenharmony_ci		pci_read_config_dword(dev, 0x44, &dimm[1]);
7298c2ecf20Sopenharmony_ci		dimm[1] = (dimm[1] >> 8) & 0x4f;
7308c2ecf20Sopenharmony_ci		pci_read_config_dword(dev, 0x48, &dimm[2]);
7318c2ecf20Sopenharmony_ci		dimm[2] = (dimm[2] >> 8) & 0x4f;
7328c2ecf20Sopenharmony_ci
7338c2ecf20Sopenharmony_ci		if ((dimm[0] + dimm[1]) != dimm[2]) {
7348c2ecf20Sopenharmony_ci			printk("nvidiafb: your nForce DIMMs are not arranged "
7358c2ecf20Sopenharmony_ci			       "in optimal banks!\n");
7368c2ecf20Sopenharmony_ci		}
7378c2ecf20Sopenharmony_ci		pci_dev_put(dev);
7388c2ecf20Sopenharmony_ci	}
7398c2ecf20Sopenharmony_ci
7408c2ecf20Sopenharmony_ci	sim_data.mem_latency = 3;
7418c2ecf20Sopenharmony_ci	sim_data.mem_aligned = 1;
7428c2ecf20Sopenharmony_ci	sim_data.mem_page_miss = 10;
7438c2ecf20Sopenharmony_ci	sim_data.gr_during_vid = 0;
7448c2ecf20Sopenharmony_ci	sim_data.pclk_khz = VClk;
7458c2ecf20Sopenharmony_ci	sim_data.mclk_khz = MClk;
7468c2ecf20Sopenharmony_ci	sim_data.nvclk_khz = NVClk;
7478c2ecf20Sopenharmony_ci	nv10CalcArbitration(&fifo_data, &sim_data);
7488c2ecf20Sopenharmony_ci	if (fifo_data.valid) {
7498c2ecf20Sopenharmony_ci		int b = fifo_data.graphics_burst_size >> 4;
7508c2ecf20Sopenharmony_ci		*burst = 0;
7518c2ecf20Sopenharmony_ci		while (b >>= 1)
7528c2ecf20Sopenharmony_ci			(*burst)++;
7538c2ecf20Sopenharmony_ci		*lwm = fifo_data.graphics_lwm >> 3;
7548c2ecf20Sopenharmony_ci	}
7558c2ecf20Sopenharmony_ci}
7568c2ecf20Sopenharmony_ci
7578c2ecf20Sopenharmony_ci/****************************************************************************\
7588c2ecf20Sopenharmony_ci*                                                                            *
7598c2ecf20Sopenharmony_ci*                          RIVA Mode State Routines                          *
7608c2ecf20Sopenharmony_ci*                                                                            *
7618c2ecf20Sopenharmony_ci\****************************************************************************/
7628c2ecf20Sopenharmony_ci
7638c2ecf20Sopenharmony_ci/*
7648c2ecf20Sopenharmony_ci * Calculate the Video Clock parameters for the PLL.
7658c2ecf20Sopenharmony_ci */
7668c2ecf20Sopenharmony_cistatic void CalcVClock(int clockIn,
7678c2ecf20Sopenharmony_ci		       int *clockOut, u32 * pllOut, struct nvidia_par *par)
7688c2ecf20Sopenharmony_ci{
7698c2ecf20Sopenharmony_ci	unsigned lowM, highM;
7708c2ecf20Sopenharmony_ci	unsigned DeltaNew, DeltaOld;
7718c2ecf20Sopenharmony_ci	unsigned VClk, Freq;
7728c2ecf20Sopenharmony_ci	unsigned M, N, P;
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci	DeltaOld = 0xFFFFFFFF;
7758c2ecf20Sopenharmony_ci
7768c2ecf20Sopenharmony_ci	VClk = (unsigned)clockIn;
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_ci	if (par->CrystalFreqKHz == 13500) {
7798c2ecf20Sopenharmony_ci		lowM = 7;
7808c2ecf20Sopenharmony_ci		highM = 13;
7818c2ecf20Sopenharmony_ci	} else {
7828c2ecf20Sopenharmony_ci		lowM = 8;
7838c2ecf20Sopenharmony_ci		highM = 14;
7848c2ecf20Sopenharmony_ci	}
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci	for (P = 0; P <= 4; P++) {
7878c2ecf20Sopenharmony_ci		Freq = VClk << P;
7888c2ecf20Sopenharmony_ci		if ((Freq >= 128000) && (Freq <= 350000)) {
7898c2ecf20Sopenharmony_ci			for (M = lowM; M <= highM; M++) {
7908c2ecf20Sopenharmony_ci				N = ((VClk << P) * M) / par->CrystalFreqKHz;
7918c2ecf20Sopenharmony_ci				if (N <= 255) {
7928c2ecf20Sopenharmony_ci					Freq =
7938c2ecf20Sopenharmony_ci					    ((par->CrystalFreqKHz * N) /
7948c2ecf20Sopenharmony_ci					     M) >> P;
7958c2ecf20Sopenharmony_ci					if (Freq > VClk)
7968c2ecf20Sopenharmony_ci						DeltaNew = Freq - VClk;
7978c2ecf20Sopenharmony_ci					else
7988c2ecf20Sopenharmony_ci						DeltaNew = VClk - Freq;
7998c2ecf20Sopenharmony_ci					if (DeltaNew < DeltaOld) {
8008c2ecf20Sopenharmony_ci						*pllOut =
8018c2ecf20Sopenharmony_ci						    (P << 16) | (N << 8) | M;
8028c2ecf20Sopenharmony_ci						*clockOut = Freq;
8038c2ecf20Sopenharmony_ci						DeltaOld = DeltaNew;
8048c2ecf20Sopenharmony_ci					}
8058c2ecf20Sopenharmony_ci				}
8068c2ecf20Sopenharmony_ci			}
8078c2ecf20Sopenharmony_ci		}
8088c2ecf20Sopenharmony_ci	}
8098c2ecf20Sopenharmony_ci}
8108c2ecf20Sopenharmony_ci
8118c2ecf20Sopenharmony_cistatic void CalcVClock2Stage(int clockIn,
8128c2ecf20Sopenharmony_ci			     int *clockOut,
8138c2ecf20Sopenharmony_ci			     u32 * pllOut,
8148c2ecf20Sopenharmony_ci			     u32 * pllBOut, struct nvidia_par *par)
8158c2ecf20Sopenharmony_ci{
8168c2ecf20Sopenharmony_ci	unsigned DeltaNew, DeltaOld;
8178c2ecf20Sopenharmony_ci	unsigned VClk, Freq;
8188c2ecf20Sopenharmony_ci	unsigned M, N, P;
8198c2ecf20Sopenharmony_ci
8208c2ecf20Sopenharmony_ci	DeltaOld = 0xFFFFFFFF;
8218c2ecf20Sopenharmony_ci
8228c2ecf20Sopenharmony_ci	*pllBOut = 0x80000401;	/* fixed at x4 for now */
8238c2ecf20Sopenharmony_ci
8248c2ecf20Sopenharmony_ci	VClk = (unsigned)clockIn;
8258c2ecf20Sopenharmony_ci
8268c2ecf20Sopenharmony_ci	for (P = 0; P <= 6; P++) {
8278c2ecf20Sopenharmony_ci		Freq = VClk << P;
8288c2ecf20Sopenharmony_ci		if ((Freq >= 400000) && (Freq <= 1000000)) {
8298c2ecf20Sopenharmony_ci			for (M = 1; M <= 13; M++) {
8308c2ecf20Sopenharmony_ci				N = ((VClk << P) * M) /
8318c2ecf20Sopenharmony_ci				    (par->CrystalFreqKHz << 2);
8328c2ecf20Sopenharmony_ci				if ((N >= 5) && (N <= 255)) {
8338c2ecf20Sopenharmony_ci					Freq =
8348c2ecf20Sopenharmony_ci					    (((par->CrystalFreqKHz << 2) * N) /
8358c2ecf20Sopenharmony_ci					     M) >> P;
8368c2ecf20Sopenharmony_ci					if (Freq > VClk)
8378c2ecf20Sopenharmony_ci						DeltaNew = Freq - VClk;
8388c2ecf20Sopenharmony_ci					else
8398c2ecf20Sopenharmony_ci						DeltaNew = VClk - Freq;
8408c2ecf20Sopenharmony_ci					if (DeltaNew < DeltaOld) {
8418c2ecf20Sopenharmony_ci						*pllOut =
8428c2ecf20Sopenharmony_ci						    (P << 16) | (N << 8) | M;
8438c2ecf20Sopenharmony_ci						*clockOut = Freq;
8448c2ecf20Sopenharmony_ci						DeltaOld = DeltaNew;
8458c2ecf20Sopenharmony_ci					}
8468c2ecf20Sopenharmony_ci				}
8478c2ecf20Sopenharmony_ci			}
8488c2ecf20Sopenharmony_ci		}
8498c2ecf20Sopenharmony_ci	}
8508c2ecf20Sopenharmony_ci}
8518c2ecf20Sopenharmony_ci
8528c2ecf20Sopenharmony_ci/*
8538c2ecf20Sopenharmony_ci * Calculate extended mode parameters (SVGA) and save in a
8548c2ecf20Sopenharmony_ci * mode state structure.
8558c2ecf20Sopenharmony_ci */
8568c2ecf20Sopenharmony_civoid NVCalcStateExt(struct nvidia_par *par,
8578c2ecf20Sopenharmony_ci		    RIVA_HW_STATE * state,
8588c2ecf20Sopenharmony_ci		    int bpp,
8598c2ecf20Sopenharmony_ci		    int width,
8608c2ecf20Sopenharmony_ci		    int hDisplaySize, int height, int dotClock, int flags)
8618c2ecf20Sopenharmony_ci{
8628c2ecf20Sopenharmony_ci	int pixelDepth, VClk = 0;
8638c2ecf20Sopenharmony_ci	/*
8648c2ecf20Sopenharmony_ci	 * Save mode parameters.
8658c2ecf20Sopenharmony_ci	 */
8668c2ecf20Sopenharmony_ci	state->bpp = bpp;	/* this is not bitsPerPixel, it's 8,15,16,32 */
8678c2ecf20Sopenharmony_ci	state->width = width;
8688c2ecf20Sopenharmony_ci	state->height = height;
8698c2ecf20Sopenharmony_ci	/*
8708c2ecf20Sopenharmony_ci	 * Extended RIVA registers.
8718c2ecf20Sopenharmony_ci	 */
8728c2ecf20Sopenharmony_ci	pixelDepth = (bpp + 1) / 8;
8738c2ecf20Sopenharmony_ci	if (par->twoStagePLL)
8748c2ecf20Sopenharmony_ci		CalcVClock2Stage(dotClock, &VClk, &state->pll, &state->pllB,
8758c2ecf20Sopenharmony_ci				 par);
8768c2ecf20Sopenharmony_ci	else
8778c2ecf20Sopenharmony_ci		CalcVClock(dotClock, &VClk, &state->pll, par);
8788c2ecf20Sopenharmony_ci
8798c2ecf20Sopenharmony_ci	switch (par->Architecture) {
8808c2ecf20Sopenharmony_ci	case NV_ARCH_04:
8818c2ecf20Sopenharmony_ci		nv4UpdateArbitrationSettings(VClk,
8828c2ecf20Sopenharmony_ci					     pixelDepth * 8,
8838c2ecf20Sopenharmony_ci					     &(state->arbitration0),
8848c2ecf20Sopenharmony_ci					     &(state->arbitration1), par);
8858c2ecf20Sopenharmony_ci		state->cursor0 = 0x00;
8868c2ecf20Sopenharmony_ci		state->cursor1 = 0xbC;
8878c2ecf20Sopenharmony_ci		if (flags & FB_VMODE_DOUBLE)
8888c2ecf20Sopenharmony_ci			state->cursor1 |= 2;
8898c2ecf20Sopenharmony_ci		state->cursor2 = 0x00000000;
8908c2ecf20Sopenharmony_ci		state->pllsel = 0x10000700;
8918c2ecf20Sopenharmony_ci		state->config = 0x00001114;
8928c2ecf20Sopenharmony_ci		state->general = bpp == 16 ? 0x00101100 : 0x00100100;
8938c2ecf20Sopenharmony_ci		state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00;
8948c2ecf20Sopenharmony_ci		break;
8958c2ecf20Sopenharmony_ci	case NV_ARCH_40:
8968c2ecf20Sopenharmony_ci		if (!par->FlatPanel)
8978c2ecf20Sopenharmony_ci			state->control = NV_RD32(par->PRAMDAC0, 0x0580) &
8988c2ecf20Sopenharmony_ci				0xeffffeff;
8998c2ecf20Sopenharmony_ci		fallthrough;
9008c2ecf20Sopenharmony_ci	case NV_ARCH_10:
9018c2ecf20Sopenharmony_ci	case NV_ARCH_20:
9028c2ecf20Sopenharmony_ci	case NV_ARCH_30:
9038c2ecf20Sopenharmony_ci	default:
9048c2ecf20Sopenharmony_ci		if ((par->Chipset & 0xfff0) == 0x0240 ||
9058c2ecf20Sopenharmony_ci		    (par->Chipset & 0xfff0) == 0x03d0) {
9068c2ecf20Sopenharmony_ci			state->arbitration0 = 256;
9078c2ecf20Sopenharmony_ci			state->arbitration1 = 0x0480;
9088c2ecf20Sopenharmony_ci		} else if (((par->Chipset & 0xffff) == 0x01A0) ||
9098c2ecf20Sopenharmony_ci		    ((par->Chipset & 0xffff) == 0x01f0)) {
9108c2ecf20Sopenharmony_ci			nForceUpdateArbitrationSettings(VClk,
9118c2ecf20Sopenharmony_ci							pixelDepth * 8,
9128c2ecf20Sopenharmony_ci							&(state->arbitration0),
9138c2ecf20Sopenharmony_ci							&(state->arbitration1),
9148c2ecf20Sopenharmony_ci							par);
9158c2ecf20Sopenharmony_ci		} else if (par->Architecture < NV_ARCH_30) {
9168c2ecf20Sopenharmony_ci			nv10UpdateArbitrationSettings(VClk,
9178c2ecf20Sopenharmony_ci						      pixelDepth * 8,
9188c2ecf20Sopenharmony_ci						      &(state->arbitration0),
9198c2ecf20Sopenharmony_ci						      &(state->arbitration1),
9208c2ecf20Sopenharmony_ci						      par);
9218c2ecf20Sopenharmony_ci		} else {
9228c2ecf20Sopenharmony_ci			nv30UpdateArbitrationSettings(par,
9238c2ecf20Sopenharmony_ci						      &(state->arbitration0),
9248c2ecf20Sopenharmony_ci						      &(state->arbitration1));
9258c2ecf20Sopenharmony_ci		}
9268c2ecf20Sopenharmony_ci
9278c2ecf20Sopenharmony_ci		state->cursor0 = 0x80 | (par->CursorStart >> 17);
9288c2ecf20Sopenharmony_ci		state->cursor1 = (par->CursorStart >> 11) << 2;
9298c2ecf20Sopenharmony_ci		state->cursor2 = par->CursorStart >> 24;
9308c2ecf20Sopenharmony_ci		if (flags & FB_VMODE_DOUBLE)
9318c2ecf20Sopenharmony_ci			state->cursor1 |= 2;
9328c2ecf20Sopenharmony_ci		state->pllsel = 0x10000700;
9338c2ecf20Sopenharmony_ci		state->config = NV_RD32(par->PFB, 0x00000200);
9348c2ecf20Sopenharmony_ci		state->general = bpp == 16 ? 0x00101100 : 0x00100100;
9358c2ecf20Sopenharmony_ci		state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00;
9368c2ecf20Sopenharmony_ci		break;
9378c2ecf20Sopenharmony_ci	}
9388c2ecf20Sopenharmony_ci
9398c2ecf20Sopenharmony_ci	if (bpp != 8)		/* DirectColor */
9408c2ecf20Sopenharmony_ci		state->general |= 0x00000030;
9418c2ecf20Sopenharmony_ci
9428c2ecf20Sopenharmony_ci	state->repaint0 = (((width / 8) * pixelDepth) & 0x700) >> 3;
9438c2ecf20Sopenharmony_ci	state->pixel = (pixelDepth > 2) ? 3 : pixelDepth;
9448c2ecf20Sopenharmony_ci}
9458c2ecf20Sopenharmony_ci
9468c2ecf20Sopenharmony_civoid NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state)
9478c2ecf20Sopenharmony_ci{
9488c2ecf20Sopenharmony_ci	int i, j;
9498c2ecf20Sopenharmony_ci
9508c2ecf20Sopenharmony_ci	NV_WR32(par->PMC, 0x0140, 0x00000000);
9518c2ecf20Sopenharmony_ci	NV_WR32(par->PMC, 0x0200, 0xFFFF00FF);
9528c2ecf20Sopenharmony_ci	NV_WR32(par->PMC, 0x0200, 0xFFFFFFFF);
9538c2ecf20Sopenharmony_ci
9548c2ecf20Sopenharmony_ci	NV_WR32(par->PTIMER, 0x0200 * 4, 0x00000008);
9558c2ecf20Sopenharmony_ci	NV_WR32(par->PTIMER, 0x0210 * 4, 0x00000003);
9568c2ecf20Sopenharmony_ci	NV_WR32(par->PTIMER, 0x0140 * 4, 0x00000000);
9578c2ecf20Sopenharmony_ci	NV_WR32(par->PTIMER, 0x0100 * 4, 0xFFFFFFFF);
9588c2ecf20Sopenharmony_ci
9598c2ecf20Sopenharmony_ci	if (par->Architecture == NV_ARCH_04) {
9608c2ecf20Sopenharmony_ci		if (state)
9618c2ecf20Sopenharmony_ci			NV_WR32(par->PFB, 0x0200, state->config);
9628c2ecf20Sopenharmony_ci	} else if ((par->Architecture < NV_ARCH_40) ||
9638c2ecf20Sopenharmony_ci		   (par->Chipset & 0xfff0) == 0x0040) {
9648c2ecf20Sopenharmony_ci		for (i = 0; i < 8; i++) {
9658c2ecf20Sopenharmony_ci			NV_WR32(par->PFB, 0x0240 + (i * 0x10), 0);
9668c2ecf20Sopenharmony_ci			NV_WR32(par->PFB, 0x0244 + (i * 0x10),
9678c2ecf20Sopenharmony_ci				par->FbMapSize - 1);
9688c2ecf20Sopenharmony_ci		}
9698c2ecf20Sopenharmony_ci	} else {
9708c2ecf20Sopenharmony_ci		int regions = 12;
9718c2ecf20Sopenharmony_ci
9728c2ecf20Sopenharmony_ci		if (((par->Chipset & 0xfff0) == 0x0090) ||
9738c2ecf20Sopenharmony_ci		    ((par->Chipset & 0xfff0) == 0x01D0) ||
9748c2ecf20Sopenharmony_ci		    ((par->Chipset & 0xfff0) == 0x0290) ||
9758c2ecf20Sopenharmony_ci		    ((par->Chipset & 0xfff0) == 0x0390) ||
9768c2ecf20Sopenharmony_ci		    ((par->Chipset & 0xfff0) == 0x03D0))
9778c2ecf20Sopenharmony_ci			regions = 15;
9788c2ecf20Sopenharmony_ci		for(i = 0; i < regions; i++) {
9798c2ecf20Sopenharmony_ci			NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0);
9808c2ecf20Sopenharmony_ci			NV_WR32(par->PFB, 0x0604 + (i * 0x10),
9818c2ecf20Sopenharmony_ci				par->FbMapSize - 1);
9828c2ecf20Sopenharmony_ci		}
9838c2ecf20Sopenharmony_ci	}
9848c2ecf20Sopenharmony_ci
9858c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_40) {
9868c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0000 * 4, 0x80000010);
9878c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0001 * 4, 0x00101202);
9888c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0002 * 4, 0x80000011);
9898c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0003 * 4, 0x00101204);
9908c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0004 * 4, 0x80000012);
9918c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0005 * 4, 0x00101206);
9928c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0006 * 4, 0x80000013);
9938c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0007 * 4, 0x00101208);
9948c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0008 * 4, 0x80000014);
9958c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0009 * 4, 0x0010120A);
9968c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000A * 4, 0x80000015);
9978c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000B * 4, 0x0010120C);
9988c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000C * 4, 0x80000016);
9998c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000D * 4, 0x0010120E);
10008c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000E * 4, 0x80000017);
10018c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000F * 4, 0x00101210);
10028c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0800 * 4, 0x00003000);
10038c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0801 * 4, par->FbMapSize - 1);
10048c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0802 * 4, 0x00000002);
10058c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0808 * 4, 0x02080062);
10068c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0809 * 4, 0x00000000);
10078c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080A * 4, 0x00001200);
10088c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080B * 4, 0x00001200);
10098c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080C * 4, 0x00000000);
10108c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000000);
10118c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0810 * 4, 0x02080043);
10128c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0811 * 4, 0x00000000);
10138c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0812 * 4, 0x00000000);
10148c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0813 * 4, 0x00000000);
10158c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0814 * 4, 0x00000000);
10168c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0815 * 4, 0x00000000);
10178c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0818 * 4, 0x02080044);
10188c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0819 * 4, 0x02000000);
10198c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081A * 4, 0x00000000);
10208c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081B * 4, 0x00000000);
10218c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081C * 4, 0x00000000);
10228c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000000);
10238c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0820 * 4, 0x02080019);
10248c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0821 * 4, 0x00000000);
10258c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0822 * 4, 0x00000000);
10268c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0823 * 4, 0x00000000);
10278c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0824 * 4, 0x00000000);
10288c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0825 * 4, 0x00000000);
10298c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0828 * 4, 0x020A005C);
10308c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0829 * 4, 0x00000000);
10318c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x082A * 4, 0x00000000);
10328c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x082B * 4, 0x00000000);
10338c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x082C * 4, 0x00000000);
10348c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x082D * 4, 0x00000000);
10358c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0830 * 4, 0x0208009F);
10368c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0831 * 4, 0x00000000);
10378c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0832 * 4, 0x00001200);
10388c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0833 * 4, 0x00001200);
10398c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0834 * 4, 0x00000000);
10408c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0835 * 4, 0x00000000);
10418c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0838 * 4, 0x0208004A);
10428c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0839 * 4, 0x02000000);
10438c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x083A * 4, 0x00000000);
10448c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x083B * 4, 0x00000000);
10458c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x083C * 4, 0x00000000);
10468c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x083D * 4, 0x00000000);
10478c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0840 * 4, 0x02080077);
10488c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0841 * 4, 0x00000000);
10498c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0842 * 4, 0x00001200);
10508c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0843 * 4, 0x00001200);
10518c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0844 * 4, 0x00000000);
10528c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0845 * 4, 0x00000000);
10538c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x084C * 4, 0x00003002);
10548c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x084D * 4, 0x00007FFF);
10558c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x084E * 4,
10568c2ecf20Sopenharmony_ci			par->FbUsableSize | 0x00000002);
10578c2ecf20Sopenharmony_ci
10588c2ecf20Sopenharmony_ci#ifdef __BIG_ENDIAN
10598c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080A * 4,
10608c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x080A * 4) | 0x01000000);
10618c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0812 * 4,
10628c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0812 * 4) | 0x01000000);
10638c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081A * 4,
10648c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x081A * 4) | 0x01000000);
10658c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0822 * 4,
10668c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0822 * 4) | 0x01000000);
10678c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x082A * 4,
10688c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x082A * 4) | 0x01000000);
10698c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0832 * 4,
10708c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0832 * 4) | 0x01000000);
10718c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x083A * 4,
10728c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x083A * 4) | 0x01000000);
10738c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0842 * 4,
10748c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0842 * 4) | 0x01000000);
10758c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0819 * 4, 0x01000000);
10768c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0839 * 4, 0x01000000);
10778c2ecf20Sopenharmony_ci#endif
10788c2ecf20Sopenharmony_ci	} else {
10798c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0000 * 4, 0x80000010);
10808c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0001 * 4, 0x80011201);
10818c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0002 * 4, 0x80000011);
10828c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0003 * 4, 0x80011202);
10838c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0004 * 4, 0x80000012);
10848c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0005 * 4, 0x80011203);
10858c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0006 * 4, 0x80000013);
10868c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0007 * 4, 0x80011204);
10878c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0008 * 4, 0x80000014);
10888c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0009 * 4, 0x80011205);
10898c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000A * 4, 0x80000015);
10908c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000B * 4, 0x80011206);
10918c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000C * 4, 0x80000016);
10928c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000D * 4, 0x80011207);
10938c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000E * 4, 0x80000017);
10948c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x000F * 4, 0x80011208);
10958c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0800 * 4, 0x00003000);
10968c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0801 * 4, par->FbMapSize - 1);
10978c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0802 * 4, 0x00000002);
10988c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0803 * 4, 0x00000002);
10998c2ecf20Sopenharmony_ci		if (par->Architecture >= NV_ARCH_10)
11008c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMIN, 0x0804 * 4, 0x01008062);
11018c2ecf20Sopenharmony_ci		else
11028c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMIN, 0x0804 * 4, 0x01008042);
11038c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0805 * 4, 0x00000000);
11048c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0806 * 4, 0x12001200);
11058c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0807 * 4, 0x00000000);
11068c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0808 * 4, 0x01008043);
11078c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0809 * 4, 0x00000000);
11088c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080A * 4, 0x00000000);
11098c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080B * 4, 0x00000000);
11108c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080C * 4, 0x01008044);
11118c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000002);
11128c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080E * 4, 0x00000000);
11138c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080F * 4, 0x00000000);
11148c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0810 * 4, 0x01008019);
11158c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0811 * 4, 0x00000000);
11168c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0812 * 4, 0x00000000);
11178c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0813 * 4, 0x00000000);
11188c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0814 * 4, 0x0100A05C);
11198c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0815 * 4, 0x00000000);
11208c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0816 * 4, 0x00000000);
11218c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0817 * 4, 0x00000000);
11228c2ecf20Sopenharmony_ci		if (par->WaitVSyncPossible)
11238c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMIN, 0x0818 * 4, 0x0100809F);
11248c2ecf20Sopenharmony_ci		else
11258c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMIN, 0x0818 * 4, 0x0100805F);
11268c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0819 * 4, 0x00000000);
11278c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081A * 4, 0x12001200);
11288c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081B * 4, 0x00000000);
11298c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081C * 4, 0x0100804A);
11308c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000002);
11318c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081E * 4, 0x00000000);
11328c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081F * 4, 0x00000000);
11338c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0820 * 4, 0x01018077);
11348c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0821 * 4, 0x00000000);
11358c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0822 * 4, 0x12001200);
11368c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0823 * 4, 0x00000000);
11378c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0824 * 4, 0x00003002);
11388c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0825 * 4, 0x00007FFF);
11398c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0826 * 4,
11408c2ecf20Sopenharmony_ci			par->FbUsableSize | 0x00000002);
11418c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0827 * 4, 0x00000002);
11428c2ecf20Sopenharmony_ci#ifdef __BIG_ENDIAN
11438c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0804 * 4,
11448c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0804 * 4) | 0x00080000);
11458c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0808 * 4,
11468c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0808 * 4) | 0x00080000);
11478c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080C * 4,
11488c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x080C * 4) | 0x00080000);
11498c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0810 * 4,
11508c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0810 * 4) | 0x00080000);
11518c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0814 * 4,
11528c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0814 * 4) | 0x00080000);
11538c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0818 * 4,
11548c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0818 * 4) | 0x00080000);
11558c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081C * 4,
11568c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x081C * 4) | 0x00080000);
11578c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x0820 * 4,
11588c2ecf20Sopenharmony_ci			NV_RD32(par->PRAMIN, 0x0820 * 4) | 0x00080000);
11598c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000001);
11608c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000001);
11618c2ecf20Sopenharmony_ci#endif
11628c2ecf20Sopenharmony_ci	}
11638c2ecf20Sopenharmony_ci	if (par->Architecture < NV_ARCH_10) {
11648c2ecf20Sopenharmony_ci		if ((par->Chipset & 0x0fff) == 0x0020) {
11658c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMIN, 0x0824 * 4,
11668c2ecf20Sopenharmony_ci				NV_RD32(par->PRAMIN, 0x0824 * 4) | 0x00020000);
11678c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMIN, 0x0826 * 4,
11688c2ecf20Sopenharmony_ci				NV_RD32(par->PRAMIN,
11698c2ecf20Sopenharmony_ci					0x0826 * 4) + par->FbAddress);
11708c2ecf20Sopenharmony_ci		}
11718c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0080, 0x000001FF);
11728c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0080, 0x1230C000);
11738c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0084, 0x72111101);
11748c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0088, 0x11D5F071);
11758c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x008C, 0x0004FF31);
11768c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x008C, 0x4004FF31);
11778c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0140, 0x00000000);
11788c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0100, 0xFFFFFFFF);
11798c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0170, 0x10010100);
11808c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0710, 0xFFFFFFFF);
11818c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0720, 0x00000001);
11828c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0810, 0x00000000);
11838c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF);
11848c2ecf20Sopenharmony_ci	} else {
11858c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0080, 0xFFFFFFFF);
11868c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0080, 0x00000000);
11878c2ecf20Sopenharmony_ci
11888c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0140, 0x00000000);
11898c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0100, 0xFFFFFFFF);
11908c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0144, 0x10010100);
11918c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0714, 0xFFFFFFFF);
11928c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0720, 0x00000001);
11938c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0710,
11948c2ecf20Sopenharmony_ci			NV_RD32(par->PGRAPH, 0x0710) & 0x0007ff00);
11958c2ecf20Sopenharmony_ci		NV_WR32(par->PGRAPH, 0x0710,
11968c2ecf20Sopenharmony_ci			NV_RD32(par->PGRAPH, 0x0710) | 0x00020100);
11978c2ecf20Sopenharmony_ci
11988c2ecf20Sopenharmony_ci		if (par->Architecture == NV_ARCH_10) {
11998c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x0084, 0x00118700);
12008c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x0088, 0x24E00810);
12018c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x008C, 0x55DE0030);
12028c2ecf20Sopenharmony_ci
12038c2ecf20Sopenharmony_ci			for (i = 0; i < 32; i++)
12048c2ecf20Sopenharmony_ci				NV_WR32(&par->PGRAPH[(0x0B00 / 4) + i], 0,
12058c2ecf20Sopenharmony_ci					NV_RD32(&par->PFB[(0x0240 / 4) + i],
12068c2ecf20Sopenharmony_ci						0));
12078c2ecf20Sopenharmony_ci
12088c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x640, 0);
12098c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x644, 0);
12108c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x684, par->FbMapSize - 1);
12118c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x688, par->FbMapSize - 1);
12128c2ecf20Sopenharmony_ci
12138c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x0810, 0x00000000);
12148c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF);
12158c2ecf20Sopenharmony_ci		} else {
12168c2ecf20Sopenharmony_ci			if (par->Architecture >= NV_ARCH_40) {
12178c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0084, 0x401287c0);
12188c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x008C, 0x60de8051);
12198c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0090, 0x00008000);
12208c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f);
12218c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0bc4,
12228c2ecf20Sopenharmony_ci					NV_RD32(par->PGRAPH, 0x0bc4) |
12238c2ecf20Sopenharmony_ci					0x00008000);
12248c2ecf20Sopenharmony_ci
12258c2ecf20Sopenharmony_ci				j = NV_RD32(par->REGS, 0x1540) & 0xff;
12268c2ecf20Sopenharmony_ci
12278c2ecf20Sopenharmony_ci				if (j) {
12288c2ecf20Sopenharmony_ci					for (i = 0; !(j & 1); j >>= 1, i++);
12298c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x5000, i);
12308c2ecf20Sopenharmony_ci				}
12318c2ecf20Sopenharmony_ci
12328c2ecf20Sopenharmony_ci				if ((par->Chipset & 0xfff0) == 0x0040) {
12338c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x09b0,
12348c2ecf20Sopenharmony_ci						0x83280fff);
12358c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x09b4,
12368c2ecf20Sopenharmony_ci						0x000000a0);
12378c2ecf20Sopenharmony_ci				} else {
12388c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0820,
12398c2ecf20Sopenharmony_ci						0x83280eff);
12408c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0824,
12418c2ecf20Sopenharmony_ci						0x000000a0);
12428c2ecf20Sopenharmony_ci				}
12438c2ecf20Sopenharmony_ci
12448c2ecf20Sopenharmony_ci				switch (par->Chipset & 0xfff0) {
12458c2ecf20Sopenharmony_ci				case 0x0040:
12468c2ecf20Sopenharmony_ci				case 0x0210:
12478c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x09b8,
12488c2ecf20Sopenharmony_ci						0x0078e366);
12498c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x09bc,
12508c2ecf20Sopenharmony_ci						0x0000014c);
12518c2ecf20Sopenharmony_ci					NV_WR32(par->PFB, 0x033C,
12528c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x33C) &
12538c2ecf20Sopenharmony_ci						0xffff7fff);
12548c2ecf20Sopenharmony_ci					break;
12558c2ecf20Sopenharmony_ci				case 0x00C0:
12568c2ecf20Sopenharmony_ci				case 0x0120:
12578c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0828,
12588c2ecf20Sopenharmony_ci						0x007596ff);
12598c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x082C,
12608c2ecf20Sopenharmony_ci						0x00000108);
12618c2ecf20Sopenharmony_ci					break;
12628c2ecf20Sopenharmony_ci				case 0x0160:
12638c2ecf20Sopenharmony_ci				case 0x01D0:
12648c2ecf20Sopenharmony_ci				case 0x0240:
12658c2ecf20Sopenharmony_ci				case 0x03D0:
12668c2ecf20Sopenharmony_ci					NV_WR32(par->PMC, 0x1700,
12678c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x020C));
12688c2ecf20Sopenharmony_ci					NV_WR32(par->PMC, 0x1704, 0);
12698c2ecf20Sopenharmony_ci					NV_WR32(par->PMC, 0x1708, 0);
12708c2ecf20Sopenharmony_ci					NV_WR32(par->PMC, 0x170C,
12718c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x020C));
12728c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0860, 0);
12738c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0864, 0);
12748c2ecf20Sopenharmony_ci					NV_WR32(par->PRAMDAC, 0x0608,
12758c2ecf20Sopenharmony_ci						NV_RD32(par->PRAMDAC,
12768c2ecf20Sopenharmony_ci							0x0608) | 0x00100000);
12778c2ecf20Sopenharmony_ci					break;
12788c2ecf20Sopenharmony_ci				case 0x0140:
12798c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0828,
12808c2ecf20Sopenharmony_ci						0x0072cb77);
12818c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x082C,
12828c2ecf20Sopenharmony_ci						0x00000108);
12838c2ecf20Sopenharmony_ci					break;
12848c2ecf20Sopenharmony_ci				case 0x0220:
12858c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0860, 0);
12868c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0864, 0);
12878c2ecf20Sopenharmony_ci					NV_WR32(par->PRAMDAC, 0x0608,
12888c2ecf20Sopenharmony_ci						NV_RD32(par->PRAMDAC, 0x0608) |
12898c2ecf20Sopenharmony_ci						0x00100000);
12908c2ecf20Sopenharmony_ci					break;
12918c2ecf20Sopenharmony_ci				case 0x0090:
12928c2ecf20Sopenharmony_ci				case 0x0290:
12938c2ecf20Sopenharmony_ci				case 0x0390:
12948c2ecf20Sopenharmony_ci					NV_WR32(par->PRAMDAC, 0x0608,
12958c2ecf20Sopenharmony_ci						NV_RD32(par->PRAMDAC, 0x0608) |
12968c2ecf20Sopenharmony_ci						0x00100000);
12978c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0828,
12988c2ecf20Sopenharmony_ci						0x07830610);
12998c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x082C,
13008c2ecf20Sopenharmony_ci						0x0000016A);
13018c2ecf20Sopenharmony_ci					break;
13028c2ecf20Sopenharmony_ci				default:
13038c2ecf20Sopenharmony_ci					break;
13048c2ecf20Sopenharmony_ci				}
13058c2ecf20Sopenharmony_ci
13068c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0b38, 0x2ffff800);
13078c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0b3c, 0x00006000);
13088c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x032C, 0x01000000);
13098c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0220, 0x00001200);
13108c2ecf20Sopenharmony_ci			} else if (par->Architecture == NV_ARCH_30) {
13118c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0084, 0x40108700);
13128c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0890, 0x00140000);
13138c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x008C, 0xf00e0431);
13148c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0090, 0x00008000);
13158c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0610, 0xf04b1f36);
13168c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0B80, 0x1002d888);
13178c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0B88, 0x62ff007f);
13188c2ecf20Sopenharmony_ci			} else {
13198c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0084, 0x00118700);
13208c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x008C, 0xF20E0431);
13218c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0090, 0x00000000);
13228c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x009C, 0x00000040);
13238c2ecf20Sopenharmony_ci
13248c2ecf20Sopenharmony_ci				if ((par->Chipset & 0x0ff0) >= 0x0250) {
13258c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0890,
13268c2ecf20Sopenharmony_ci						0x00080000);
13278c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0610,
13288c2ecf20Sopenharmony_ci						0x304B1FB6);
13298c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0B80,
13308c2ecf20Sopenharmony_ci						0x18B82880);
13318c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0B84,
13328c2ecf20Sopenharmony_ci						0x44000000);
13338c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0098,
13348c2ecf20Sopenharmony_ci						0x40000080);
13358c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0B88,
13368c2ecf20Sopenharmony_ci						0x000000ff);
13378c2ecf20Sopenharmony_ci				} else {
13388c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0880,
13398c2ecf20Sopenharmony_ci						0x00080000);
13408c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0094,
13418c2ecf20Sopenharmony_ci						0x00000005);
13428c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0B80,
13438c2ecf20Sopenharmony_ci						0x45CAA208);
13448c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0B84,
13458c2ecf20Sopenharmony_ci						0x24000000);
13468c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0098,
13478c2ecf20Sopenharmony_ci						0x00000040);
13488c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0750,
13498c2ecf20Sopenharmony_ci						0x00E00038);
13508c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0754,
13518c2ecf20Sopenharmony_ci						0x00000030);
13528c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0750,
13538c2ecf20Sopenharmony_ci						0x00E10038);
13548c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0754,
13558c2ecf20Sopenharmony_ci						0x00000030);
13568c2ecf20Sopenharmony_ci				}
13578c2ecf20Sopenharmony_ci			}
13588c2ecf20Sopenharmony_ci
13598c2ecf20Sopenharmony_ci			if ((par->Architecture < NV_ARCH_40) ||
13608c2ecf20Sopenharmony_ci			    ((par->Chipset & 0xfff0) == 0x0040)) {
13618c2ecf20Sopenharmony_ci				for (i = 0; i < 32; i++) {
13628c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0900 + i*4,
13638c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0240 +i*4));
13648c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x6900 + i*4,
13658c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0240 +i*4));
13668c2ecf20Sopenharmony_ci				}
13678c2ecf20Sopenharmony_ci			} else {
13688c2ecf20Sopenharmony_ci				if (((par->Chipset & 0xfff0) == 0x0090) ||
13698c2ecf20Sopenharmony_ci				    ((par->Chipset & 0xfff0) == 0x01D0) ||
13708c2ecf20Sopenharmony_ci				    ((par->Chipset & 0xfff0) == 0x0290) ||
13718c2ecf20Sopenharmony_ci				    ((par->Chipset & 0xfff0) == 0x0390) ||
13728c2ecf20Sopenharmony_ci				    ((par->Chipset & 0xfff0) == 0x03D0)) {
13738c2ecf20Sopenharmony_ci					for (i = 0; i < 60; i++) {
13748c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH,
13758c2ecf20Sopenharmony_ci							0x0D00 + i*4,
13768c2ecf20Sopenharmony_ci							NV_RD32(par->PFB,
13778c2ecf20Sopenharmony_ci								0x0600 + i*4));
13788c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH,
13798c2ecf20Sopenharmony_ci							0x6900 + i*4,
13808c2ecf20Sopenharmony_ci							NV_RD32(par->PFB,
13818c2ecf20Sopenharmony_ci								0x0600 + i*4));
13828c2ecf20Sopenharmony_ci					}
13838c2ecf20Sopenharmony_ci				} else {
13848c2ecf20Sopenharmony_ci					for (i = 0; i < 48; i++) {
13858c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH,
13868c2ecf20Sopenharmony_ci							0x0900 + i*4,
13878c2ecf20Sopenharmony_ci							NV_RD32(par->PFB,
13888c2ecf20Sopenharmony_ci								0x0600 + i*4));
13898c2ecf20Sopenharmony_ci						if(((par->Chipset & 0xfff0)
13908c2ecf20Sopenharmony_ci						    != 0x0160) &&
13918c2ecf20Sopenharmony_ci						   ((par->Chipset & 0xfff0)
13928c2ecf20Sopenharmony_ci						    != 0x0220) &&
13938c2ecf20Sopenharmony_ci						   ((par->Chipset & 0xfff0)
13948c2ecf20Sopenharmony_ci						    != 0x240))
13958c2ecf20Sopenharmony_ci							NV_WR32(par->PGRAPH,
13968c2ecf20Sopenharmony_ci								0x6900 + i*4,
13978c2ecf20Sopenharmony_ci								NV_RD32(par->PFB,
13988c2ecf20Sopenharmony_ci									0x0600 + i*4));
13998c2ecf20Sopenharmony_ci					}
14008c2ecf20Sopenharmony_ci				}
14018c2ecf20Sopenharmony_ci			}
14028c2ecf20Sopenharmony_ci
14038c2ecf20Sopenharmony_ci			if (par->Architecture >= NV_ARCH_40) {
14048c2ecf20Sopenharmony_ci				if ((par->Chipset & 0xfff0) == 0x0040) {
14058c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x09A4,
14068c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0200));
14078c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x09A8,
14088c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0204));
14098c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x69A4,
14108c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0200));
14118c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x69A8,
14128c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0204));
14138c2ecf20Sopenharmony_ci
14148c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0820, 0);
14158c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0824, 0);
14168c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0864,
14178c2ecf20Sopenharmony_ci						par->FbMapSize - 1);
14188c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0868,
14198c2ecf20Sopenharmony_ci						par->FbMapSize - 1);
14208c2ecf20Sopenharmony_ci				} else {
14218c2ecf20Sopenharmony_ci					if ((par->Chipset & 0xfff0) == 0x0090 ||
14228c2ecf20Sopenharmony_ci					    (par->Chipset & 0xfff0) == 0x01D0 ||
14238c2ecf20Sopenharmony_ci					    (par->Chipset & 0xfff0) == 0x0290 ||
14248c2ecf20Sopenharmony_ci					    (par->Chipset & 0xfff0) == 0x0390) {
14258c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH, 0x0DF0,
14268c2ecf20Sopenharmony_ci							NV_RD32(par->PFB, 0x0200));
14278c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH, 0x0DF4,
14288c2ecf20Sopenharmony_ci							NV_RD32(par->PFB, 0x0204));
14298c2ecf20Sopenharmony_ci					} else {
14308c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH, 0x09F0,
14318c2ecf20Sopenharmony_ci							NV_RD32(par->PFB, 0x0200));
14328c2ecf20Sopenharmony_ci						NV_WR32(par->PGRAPH, 0x09F4,
14338c2ecf20Sopenharmony_ci							NV_RD32(par->PFB, 0x0204));
14348c2ecf20Sopenharmony_ci					}
14358c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x69F0,
14368c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0200));
14378c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x69F4,
14388c2ecf20Sopenharmony_ci						NV_RD32(par->PFB, 0x0204));
14398c2ecf20Sopenharmony_ci
14408c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0840, 0);
14418c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x0844, 0);
14428c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x08a0,
14438c2ecf20Sopenharmony_ci						par->FbMapSize - 1);
14448c2ecf20Sopenharmony_ci					NV_WR32(par->PGRAPH, 0x08a4,
14458c2ecf20Sopenharmony_ci						par->FbMapSize - 1);
14468c2ecf20Sopenharmony_ci				}
14478c2ecf20Sopenharmony_ci			} else {
14488c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x09A4,
14498c2ecf20Sopenharmony_ci					NV_RD32(par->PFB, 0x0200));
14508c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x09A8,
14518c2ecf20Sopenharmony_ci					NV_RD32(par->PFB, 0x0204));
14528c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0750, 0x00EA0000);
14538c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0754,
14548c2ecf20Sopenharmony_ci					NV_RD32(par->PFB, 0x0200));
14558c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0750, 0x00EA0004);
14568c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0754,
14578c2ecf20Sopenharmony_ci					NV_RD32(par->PFB, 0x0204));
14588c2ecf20Sopenharmony_ci
14598c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0820, 0);
14608c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0824, 0);
14618c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0864,
14628c2ecf20Sopenharmony_ci					par->FbMapSize - 1);
14638c2ecf20Sopenharmony_ci				NV_WR32(par->PGRAPH, 0x0868,
14648c2ecf20Sopenharmony_ci					par->FbMapSize - 1);
14658c2ecf20Sopenharmony_ci			}
14668c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x0B20, 0x00000000);
14678c2ecf20Sopenharmony_ci			NV_WR32(par->PGRAPH, 0x0B04, 0xFFFFFFFF);
14688c2ecf20Sopenharmony_ci		}
14698c2ecf20Sopenharmony_ci	}
14708c2ecf20Sopenharmony_ci	NV_WR32(par->PGRAPH, 0x053C, 0);
14718c2ecf20Sopenharmony_ci	NV_WR32(par->PGRAPH, 0x0540, 0);
14728c2ecf20Sopenharmony_ci	NV_WR32(par->PGRAPH, 0x0544, 0x00007FFF);
14738c2ecf20Sopenharmony_ci	NV_WR32(par->PGRAPH, 0x0548, 0x00007FFF);
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0140 * 4, 0x00000000);
14768c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0141 * 4, 0x00000001);
14778c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0480 * 4, 0x00000000);
14788c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0494 * 4, 0x00000000);
14798c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_40)
14808c2ecf20Sopenharmony_ci		NV_WR32(par->PFIFO, 0x0481 * 4, 0x00010000);
14818c2ecf20Sopenharmony_ci	else
14828c2ecf20Sopenharmony_ci		NV_WR32(par->PFIFO, 0x0481 * 4, 0x00000100);
14838c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0490 * 4, 0x00000000);
14848c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0491 * 4, 0x00000000);
14858c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_40)
14868c2ecf20Sopenharmony_ci		NV_WR32(par->PFIFO, 0x048B * 4, 0x00001213);
14878c2ecf20Sopenharmony_ci	else
14888c2ecf20Sopenharmony_ci		NV_WR32(par->PFIFO, 0x048B * 4, 0x00001209);
14898c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0400 * 4, 0x00000000);
14908c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0414 * 4, 0x00000000);
14918c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0084 * 4, 0x03000100);
14928c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0085 * 4, 0x00000110);
14938c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0086 * 4, 0x00000112);
14948c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0143 * 4, 0x0000FFFF);
14958c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0496 * 4, 0x0000FFFF);
14968c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0050 * 4, 0x00000000);
14978c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0040 * 4, 0xFFFFFFFF);
14988c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0415 * 4, 0x00000001);
14998c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x048C * 4, 0x00000000);
15008c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x04A0 * 4, 0x00000000);
15018c2ecf20Sopenharmony_ci#ifdef __BIG_ENDIAN
15028c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0489 * 4, 0x800F0078);
15038c2ecf20Sopenharmony_ci#else
15048c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0489 * 4, 0x000F0078);
15058c2ecf20Sopenharmony_ci#endif
15068c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0488 * 4, 0x00000001);
15078c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0480 * 4, 0x00000001);
15088c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0494 * 4, 0x00000001);
15098c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0495 * 4, 0x00000001);
15108c2ecf20Sopenharmony_ci	NV_WR32(par->PFIFO, 0x0140 * 4, 0x00000001);
15118c2ecf20Sopenharmony_ci
15128c2ecf20Sopenharmony_ci    if (!state) {
15138c2ecf20Sopenharmony_ci	    par->CurrentState = NULL;
15148c2ecf20Sopenharmony_ci	    return;
15158c2ecf20Sopenharmony_ci    }
15168c2ecf20Sopenharmony_ci
15178c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_10) {
15188c2ecf20Sopenharmony_ci		if (par->twoHeads) {
15198c2ecf20Sopenharmony_ci			NV_WR32(par->PCRTC0, 0x0860, state->head);
15208c2ecf20Sopenharmony_ci			NV_WR32(par->PCRTC0, 0x2860, state->head2);
15218c2ecf20Sopenharmony_ci		}
15228c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMDAC, 0x0404, NV_RD32(par->PRAMDAC, 0x0404) |
15238c2ecf20Sopenharmony_ci			(1 << 25));
15248c2ecf20Sopenharmony_ci
15258c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x8704, 1);
15268c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x8140, 0);
15278c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x8920, 0);
15288c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x8924, 0);
15298c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x8908, par->FbMapSize - 1);
15308c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x890C, par->FbMapSize - 1);
15318c2ecf20Sopenharmony_ci		NV_WR32(par->PMC, 0x1588, 0);
15328c2ecf20Sopenharmony_ci
15338c2ecf20Sopenharmony_ci		NV_WR32(par->PCRTC, 0x0810, state->cursorConfig);
15348c2ecf20Sopenharmony_ci		NV_WR32(par->PCRTC, 0x0830, state->displayV - 3);
15358c2ecf20Sopenharmony_ci		NV_WR32(par->PCRTC, 0x0834, state->displayV - 1);
15368c2ecf20Sopenharmony_ci
15378c2ecf20Sopenharmony_ci		if (par->FlatPanel) {
15388c2ecf20Sopenharmony_ci			if ((par->Chipset & 0x0ff0) == 0x0110) {
15398c2ecf20Sopenharmony_ci				NV_WR32(par->PRAMDAC, 0x0528, state->dither);
15408c2ecf20Sopenharmony_ci			} else if (par->twoHeads) {
15418c2ecf20Sopenharmony_ci				NV_WR32(par->PRAMDAC, 0x083C, state->dither);
15428c2ecf20Sopenharmony_ci			}
15438c2ecf20Sopenharmony_ci
15448c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D4, 0x53);
15458c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D5, state->timingH);
15468c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D4, 0x54);
15478c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D5, state->timingV);
15488c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D4, 0x21);
15498c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D5, 0xfa);
15508c2ecf20Sopenharmony_ci		}
15518c2ecf20Sopenharmony_ci
15528c2ecf20Sopenharmony_ci		VGA_WR08(par->PCIO, 0x03D4, 0x41);
15538c2ecf20Sopenharmony_ci		VGA_WR08(par->PCIO, 0x03D5, state->extra);
15548c2ecf20Sopenharmony_ci	}
15558c2ecf20Sopenharmony_ci
15568c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x19);
15578c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->repaint0);
15588c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x1A);
15598c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->repaint1);
15608c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x25);
15618c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->screen);
15628c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x28);
15638c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->pixel);
15648c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x2D);
15658c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->horiz);
15668c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x1C);
15678c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->fifo);
15688c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x1B);
15698c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->arbitration0);
15708c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x20);
15718c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->arbitration1);
15728c2ecf20Sopenharmony_ci
15738c2ecf20Sopenharmony_ci	if(par->Architecture >= NV_ARCH_30) {
15748c2ecf20Sopenharmony_ci		VGA_WR08(par->PCIO, 0x03D4, 0x47);
15758c2ecf20Sopenharmony_ci		VGA_WR08(par->PCIO, 0x03D5, state->arbitration1 >> 8);
15768c2ecf20Sopenharmony_ci	}
15778c2ecf20Sopenharmony_ci
15788c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x30);
15798c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->cursor0);
15808c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x31);
15818c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->cursor1);
15828c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x2F);
15838c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->cursor2);
15848c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x39);
15858c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D5, state->interlace);
15868c2ecf20Sopenharmony_ci
15878c2ecf20Sopenharmony_ci	if (!par->FlatPanel) {
15888c2ecf20Sopenharmony_ci		if (par->Architecture >= NV_ARCH_40)
15898c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMDAC0, 0x0580, state->control);
15908c2ecf20Sopenharmony_ci
15918c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMDAC0, 0x050C, state->pllsel);
15928c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMDAC0, 0x0508, state->vpll);
15938c2ecf20Sopenharmony_ci		if (par->twoHeads)
15948c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMDAC0, 0x0520, state->vpll2);
15958c2ecf20Sopenharmony_ci		if (par->twoStagePLL) {
15968c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMDAC0, 0x0578, state->vpllB);
15978c2ecf20Sopenharmony_ci			NV_WR32(par->PRAMDAC0, 0x057C, state->vpll2B);
15988c2ecf20Sopenharmony_ci		}
15998c2ecf20Sopenharmony_ci	} else {
16008c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMDAC, 0x0848, state->scale);
16018c2ecf20Sopenharmony_ci		NV_WR32(par->PRAMDAC, 0x0828, state->crtcSync +
16028c2ecf20Sopenharmony_ci			par->PanelTweak);
16038c2ecf20Sopenharmony_ci	}
16048c2ecf20Sopenharmony_ci
16058c2ecf20Sopenharmony_ci	NV_WR32(par->PRAMDAC, 0x0600, state->general);
16068c2ecf20Sopenharmony_ci
16078c2ecf20Sopenharmony_ci	NV_WR32(par->PCRTC, 0x0140, 0);
16088c2ecf20Sopenharmony_ci	NV_WR32(par->PCRTC, 0x0100, 1);
16098c2ecf20Sopenharmony_ci
16108c2ecf20Sopenharmony_ci	par->CurrentState = state;
16118c2ecf20Sopenharmony_ci}
16128c2ecf20Sopenharmony_ci
16138c2ecf20Sopenharmony_civoid NVUnloadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) {
16148c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x19);
16158c2ecf20Sopenharmony_ci	state->repaint0 = VGA_RD08(par->PCIO, 0x03D5);
16168c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x1A);
16178c2ecf20Sopenharmony_ci	state->repaint1 = VGA_RD08(par->PCIO, 0x03D5);
16188c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x25);
16198c2ecf20Sopenharmony_ci	state->screen = VGA_RD08(par->PCIO, 0x03D5);
16208c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x28);
16218c2ecf20Sopenharmony_ci	state->pixel = VGA_RD08(par->PCIO, 0x03D5);
16228c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x2D);
16238c2ecf20Sopenharmony_ci	state->horiz = VGA_RD08(par->PCIO, 0x03D5);
16248c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x1C);
16258c2ecf20Sopenharmony_ci	state->fifo         = VGA_RD08(par->PCIO, 0x03D5);
16268c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x1B);
16278c2ecf20Sopenharmony_ci	state->arbitration0 = VGA_RD08(par->PCIO, 0x03D5);
16288c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x20);
16298c2ecf20Sopenharmony_ci	state->arbitration1 = VGA_RD08(par->PCIO, 0x03D5);
16308c2ecf20Sopenharmony_ci
16318c2ecf20Sopenharmony_ci	if(par->Architecture >= NV_ARCH_30) {
16328c2ecf20Sopenharmony_ci		VGA_WR08(par->PCIO, 0x03D4, 0x47);
16338c2ecf20Sopenharmony_ci		state->arbitration1 |= (VGA_RD08(par->PCIO, 0x03D5) & 1) << 8;
16348c2ecf20Sopenharmony_ci	}
16358c2ecf20Sopenharmony_ci
16368c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x30);
16378c2ecf20Sopenharmony_ci	state->cursor0 = VGA_RD08(par->PCIO, 0x03D5);
16388c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x31);
16398c2ecf20Sopenharmony_ci	state->cursor1 = VGA_RD08(par->PCIO, 0x03D5);
16408c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x2F);
16418c2ecf20Sopenharmony_ci	state->cursor2 = VGA_RD08(par->PCIO, 0x03D5);
16428c2ecf20Sopenharmony_ci	VGA_WR08(par->PCIO, 0x03D4, 0x39);
16438c2ecf20Sopenharmony_ci	state->interlace = VGA_RD08(par->PCIO, 0x03D5);
16448c2ecf20Sopenharmony_ci	state->vpll = NV_RD32(par->PRAMDAC0, 0x0508);
16458c2ecf20Sopenharmony_ci	if (par->twoHeads)
16468c2ecf20Sopenharmony_ci		state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520);
16478c2ecf20Sopenharmony_ci	if (par->twoStagePLL) {
16488c2ecf20Sopenharmony_ci		state->vpllB = NV_RD32(par->PRAMDAC0, 0x0578);
16498c2ecf20Sopenharmony_ci		state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C);
16508c2ecf20Sopenharmony_ci	}
16518c2ecf20Sopenharmony_ci	state->pllsel = NV_RD32(par->PRAMDAC0, 0x050C);
16528c2ecf20Sopenharmony_ci	state->general = NV_RD32(par->PRAMDAC, 0x0600);
16538c2ecf20Sopenharmony_ci	state->scale = NV_RD32(par->PRAMDAC, 0x0848);
16548c2ecf20Sopenharmony_ci	state->config = NV_RD32(par->PFB, 0x0200);
16558c2ecf20Sopenharmony_ci
16568c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_40 && !par->FlatPanel)
16578c2ecf20Sopenharmony_ci		state->control  = NV_RD32(par->PRAMDAC0, 0x0580);
16588c2ecf20Sopenharmony_ci
16598c2ecf20Sopenharmony_ci	if (par->Architecture >= NV_ARCH_10) {
16608c2ecf20Sopenharmony_ci		if (par->twoHeads) {
16618c2ecf20Sopenharmony_ci			state->head = NV_RD32(par->PCRTC0, 0x0860);
16628c2ecf20Sopenharmony_ci			state->head2 = NV_RD32(par->PCRTC0, 0x2860);
16638c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D4, 0x44);
16648c2ecf20Sopenharmony_ci			state->crtcOwner = VGA_RD08(par->PCIO, 0x03D5);
16658c2ecf20Sopenharmony_ci		}
16668c2ecf20Sopenharmony_ci		VGA_WR08(par->PCIO, 0x03D4, 0x41);
16678c2ecf20Sopenharmony_ci		state->extra = VGA_RD08(par->PCIO, 0x03D5);
16688c2ecf20Sopenharmony_ci		state->cursorConfig = NV_RD32(par->PCRTC, 0x0810);
16698c2ecf20Sopenharmony_ci
16708c2ecf20Sopenharmony_ci		if ((par->Chipset & 0x0ff0) == 0x0110) {
16718c2ecf20Sopenharmony_ci			state->dither = NV_RD32(par->PRAMDAC, 0x0528);
16728c2ecf20Sopenharmony_ci		} else if (par->twoHeads) {
16738c2ecf20Sopenharmony_ci			state->dither = NV_RD32(par->PRAMDAC, 0x083C);
16748c2ecf20Sopenharmony_ci		}
16758c2ecf20Sopenharmony_ci
16768c2ecf20Sopenharmony_ci		if (par->FlatPanel) {
16778c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D4, 0x53);
16788c2ecf20Sopenharmony_ci			state->timingH = VGA_RD08(par->PCIO, 0x03D5);
16798c2ecf20Sopenharmony_ci			VGA_WR08(par->PCIO, 0x03D4, 0x54);
16808c2ecf20Sopenharmony_ci			state->timingV = VGA_RD08(par->PCIO, 0x03D5);
16818c2ecf20Sopenharmony_ci		}
16828c2ecf20Sopenharmony_ci	}
16838c2ecf20Sopenharmony_ci}
16848c2ecf20Sopenharmony_ci
16858c2ecf20Sopenharmony_civoid NVSetStartAddress(struct nvidia_par *par, u32 start)
16868c2ecf20Sopenharmony_ci{
16878c2ecf20Sopenharmony_ci	NV_WR32(par->PCRTC, 0x800, start);
16888c2ecf20Sopenharmony_ci}
1689