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