📄 nv_hw.c
字号:
Freq = (((par->CrystalFreqKHz << 2) * N) / M) >> P; if (Freq > VClk) DeltaNew = Freq - VClk; else DeltaNew = VClk - Freq; if (DeltaNew < DeltaOld) { *pllOut = (P << 16) | (N << 8) | M; *clockOut = Freq; DeltaOld = DeltaNew; } } } } }}/* * Calculate extended mode parameters (SVGA) and save in a * mode state structure. */void NVCalcStateExt(struct nvidia_par *par, RIVA_HW_STATE * state, int bpp, int width, int hDisplaySize, int height, int dotClock, int flags){ int pixelDepth, VClk = 0; /* * Save mode parameters. */ state->bpp = bpp; /* this is not bitsPerPixel, it's 8,15,16,32 */ state->width = width; state->height = height; /* * Extended RIVA registers. */ pixelDepth = (bpp + 1) / 8; if (par->twoStagePLL) CalcVClock2Stage(dotClock, &VClk, &state->pll, &state->pllB, par); else CalcVClock(dotClock, &VClk, &state->pll, par); switch (par->Architecture) { case NV_ARCH_04: nv4UpdateArbitrationSettings(VClk, pixelDepth * 8, &(state->arbitration0), &(state->arbitration1), par); state->cursor0 = 0x00; state->cursor1 = 0xbC; if (flags & FB_VMODE_DOUBLE) state->cursor1 |= 2; state->cursor2 = 0x00000000; state->pllsel = 0x10000700; state->config = 0x00001114; state->general = bpp == 16 ? 0x00101100 : 0x00100100; state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; break; case NV_ARCH_10: case NV_ARCH_20: case NV_ARCH_30: default: if ((par->Chipset & 0xfff0) == 0x0240) { state->arbitration0 = 256; state->arbitration1 = 0x0480; } else if (((par->Chipset & 0xffff) == 0x01A0) || ((par->Chipset & 0xffff) == 0x01f0)) { nForceUpdateArbitrationSettings(VClk, pixelDepth * 8, &(state->arbitration0), &(state->arbitration1), par); } else if (par->Architecture < NV_ARCH_30) { nv10UpdateArbitrationSettings(VClk, pixelDepth * 8, &(state->arbitration0), &(state->arbitration1), par); } else { nv30UpdateArbitrationSettings(par, &(state->arbitration0), &(state->arbitration1)); } state->cursor0 = 0x80 | (par->CursorStart >> 17); state->cursor1 = (par->CursorStart >> 11) << 2; state->cursor2 = par->CursorStart >> 24; if (flags & FB_VMODE_DOUBLE) state->cursor1 |= 2; state->pllsel = 0x10000700; state->config = NV_RD32(par->PFB, 0x00000200); state->general = bpp == 16 ? 0x00101100 : 0x00100100; state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; break; } if (bpp != 8) /* DirectColor */ state->general |= 0x00000030; state->repaint0 = (((width / 8) * pixelDepth) & 0x700) >> 3; state->pixel = (pixelDepth > 2) ? 3 : pixelDepth;}void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state){ int i; NV_WR32(par->PMC, 0x0140, 0x00000000); NV_WR32(par->PMC, 0x0200, 0xFFFF00FF); NV_WR32(par->PMC, 0x0200, 0xFFFFFFFF); NV_WR32(par->PTIMER, 0x0200 * 4, 0x00000008); NV_WR32(par->PTIMER, 0x0210 * 4, 0x00000003); NV_WR32(par->PTIMER, 0x0140 * 4, 0x00000000); NV_WR32(par->PTIMER, 0x0100 * 4, 0xFFFFFFFF); if (par->Architecture == NV_ARCH_04) { NV_WR32(par->PFB, 0x0200, state->config); } else if ((par->Architecture < NV_ARCH_40) || (par->Chipset & 0xfff0) == 0x0040) { for (i = 0; i < 8; i++) { NV_WR32(par->PFB, 0x0240 + (i * 0x10), 0); NV_WR32(par->PFB, 0x0244 + (i * 0x10), par->FbMapSize - 1); } } else { int regions = 12; if (((par->Chipset & 0xfff0) == 0x0090) || ((par->Chipset & 0xfff0) == 0x01D0) || ((par->Chipset & 0xfff0) == 0x02E0) || ((par->Chipset & 0xfff0) == 0x0290)) regions = 15; for(i = 0; i < regions; i++) { NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0); NV_WR32(par->PFB, 0x0604 + (i * 0x10), par->FbMapSize - 1); } } if (par->Architecture >= NV_ARCH_40) { NV_WR32(par->PRAMIN, 0x0000 * 4, 0x80000010); NV_WR32(par->PRAMIN, 0x0001 * 4, 0x00101202); NV_WR32(par->PRAMIN, 0x0002 * 4, 0x80000011); NV_WR32(par->PRAMIN, 0x0003 * 4, 0x00101204); NV_WR32(par->PRAMIN, 0x0004 * 4, 0x80000012); NV_WR32(par->PRAMIN, 0x0005 * 4, 0x00101206); NV_WR32(par->PRAMIN, 0x0006 * 4, 0x80000013); NV_WR32(par->PRAMIN, 0x0007 * 4, 0x00101208); NV_WR32(par->PRAMIN, 0x0008 * 4, 0x80000014); NV_WR32(par->PRAMIN, 0x0009 * 4, 0x0010120A); NV_WR32(par->PRAMIN, 0x000A * 4, 0x80000015); NV_WR32(par->PRAMIN, 0x000B * 4, 0x0010120C); NV_WR32(par->PRAMIN, 0x000C * 4, 0x80000016); NV_WR32(par->PRAMIN, 0x000D * 4, 0x0010120E); NV_WR32(par->PRAMIN, 0x000E * 4, 0x80000017); NV_WR32(par->PRAMIN, 0x000F * 4, 0x00101210); NV_WR32(par->PRAMIN, 0x0800 * 4, 0x00003000); NV_WR32(par->PRAMIN, 0x0801 * 4, par->FbMapSize - 1); NV_WR32(par->PRAMIN, 0x0802 * 4, 0x00000002); NV_WR32(par->PRAMIN, 0x0808 * 4, 0x02080062); NV_WR32(par->PRAMIN, 0x0809 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x080A * 4, 0x00001200); NV_WR32(par->PRAMIN, 0x080B * 4, 0x00001200); NV_WR32(par->PRAMIN, 0x080C * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0810 * 4, 0x02080043); NV_WR32(par->PRAMIN, 0x0811 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0812 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0813 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0814 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0815 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0818 * 4, 0x02080044); NV_WR32(par->PRAMIN, 0x0819 * 4, 0x02000000); NV_WR32(par->PRAMIN, 0x081A * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x081B * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x081C * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0820 * 4, 0x02080019); NV_WR32(par->PRAMIN, 0x0821 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0822 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0823 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0824 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0825 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0828 * 4, 0x020A005C); NV_WR32(par->PRAMIN, 0x0829 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x082A * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x082B * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x082C * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x082D * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0830 * 4, 0x0208009F); NV_WR32(par->PRAMIN, 0x0831 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0832 * 4, 0x00001200); NV_WR32(par->PRAMIN, 0x0833 * 4, 0x00001200); NV_WR32(par->PRAMIN, 0x0834 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0835 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0838 * 4, 0x0208004A); NV_WR32(par->PRAMIN, 0x0839 * 4, 0x02000000); NV_WR32(par->PRAMIN, 0x083A * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x083B * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x083C * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x083D * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0840 * 4, 0x02080077); NV_WR32(par->PRAMIN, 0x0841 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0842 * 4, 0x00001200); NV_WR32(par->PRAMIN, 0x0843 * 4, 0x00001200); NV_WR32(par->PRAMIN, 0x0844 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0845 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x084C * 4, 0x00003002); NV_WR32(par->PRAMIN, 0x084D * 4, 0x00007FFF); NV_WR32(par->PRAMIN, 0x084E * 4, par->FbUsableSize | 0x00000002);#ifdef __BIG_ENDIAN NV_WR32(par->PRAMIN, 0x080A * 4, NV_RD32(par->PRAMIN, 0x080A * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x0812 * 4, NV_RD32(par->PRAMIN, 0x0812 * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x081A * 4, NV_RD32(par->PRAMIN, 0x081A * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x0822 * 4, NV_RD32(par->PRAMIN, 0x0822 * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x082A * 4, NV_RD32(par->PRAMIN, 0x082A * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x0832 * 4, NV_RD32(par->PRAMIN, 0x0832 * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x083A * 4, NV_RD32(par->PRAMIN, 0x083A * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x0842 * 4, NV_RD32(par->PRAMIN, 0x0842 * 4) | 0x01000000); NV_WR32(par->PRAMIN, 0x0819 * 4, 0x01000000); NV_WR32(par->PRAMIN, 0x0839 * 4, 0x01000000);#endif } else { NV_WR32(par->PRAMIN, 0x0000 * 4, 0x80000010); NV_WR32(par->PRAMIN, 0x0001 * 4, 0x80011201); NV_WR32(par->PRAMIN, 0x0002 * 4, 0x80000011); NV_WR32(par->PRAMIN, 0x0003 * 4, 0x80011202); NV_WR32(par->PRAMIN, 0x0004 * 4, 0x80000012); NV_WR32(par->PRAMIN, 0x0005 * 4, 0x80011203); NV_WR32(par->PRAMIN, 0x0006 * 4, 0x80000013); NV_WR32(par->PRAMIN, 0x0007 * 4, 0x80011204); NV_WR32(par->PRAMIN, 0x0008 * 4, 0x80000014); NV_WR32(par->PRAMIN, 0x0009 * 4, 0x80011205); NV_WR32(par->PRAMIN, 0x000A * 4, 0x80000015); NV_WR32(par->PRAMIN, 0x000B * 4, 0x80011206); NV_WR32(par->PRAMIN, 0x000C * 4, 0x80000016); NV_WR32(par->PRAMIN, 0x000D * 4, 0x80011207); NV_WR32(par->PRAMIN, 0x000E * 4, 0x80000017); NV_WR32(par->PRAMIN, 0x000F * 4, 0x80011208); NV_WR32(par->PRAMIN, 0x0800 * 4, 0x00003000); NV_WR32(par->PRAMIN, 0x0801 * 4, par->FbMapSize - 1); NV_WR32(par->PRAMIN, 0x0802 * 4, 0x00000002); NV_WR32(par->PRAMIN, 0x0803 * 4, 0x00000002); if (par->Architecture >= NV_ARCH_10) NV_WR32(par->PRAMIN, 0x0804 * 4, 0x01008062); else NV_WR32(par->PRAMIN, 0x0804 * 4, 0x01008042); NV_WR32(par->PRAMIN, 0x0805 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0806 * 4, 0x12001200); NV_WR32(par->PRAMIN, 0x0807 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0808 * 4, 0x01008043); NV_WR32(par->PRAMIN, 0x0809 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x080A * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x080B * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x080C * 4, 0x01008044); NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000002); NV_WR32(par->PRAMIN, 0x080E * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x080F * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0810 * 4, 0x01008019); NV_WR32(par->PRAMIN, 0x0811 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0812 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0813 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0814 * 4, 0x0100A05C); NV_WR32(par->PRAMIN, 0x0815 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0816 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0817 * 4, 0x00000000); if (par->WaitVSyncPossible) NV_WR32(par->PRAMIN, 0x0818 * 4, 0x0100809F); else NV_WR32(par->PRAMIN, 0x0818 * 4, 0x0100805F); NV_WR32(par->PRAMIN, 0x0819 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x081A * 4, 0x12001200); NV_WR32(par->PRAMIN, 0x081B * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x081C * 4, 0x0100804A); NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000002); NV_WR32(par->PRAMIN, 0x081E * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x081F * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0820 * 4, 0x01018077); NV_WR32(par->PRAMIN, 0x0821 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0822 * 4, 0x12001200); NV_WR32(par->PRAMIN, 0x0823 * 4, 0x00000000); NV_WR32(par->PRAMIN, 0x0824 * 4, 0x00003002); NV_WR32(par->PRAMIN, 0x0825 * 4, 0x00007FFF); NV_WR32(par->PRAMIN, 0x0826 * 4, par->FbUsableSize | 0x00000002); NV_WR32(par->PRAMIN, 0x0827 * 4, 0x00000002);#ifdef __BIG_ENDIAN NV_WR32(par->PRAMIN, 0x0804 * 4, NV_RD32(par->PRAMIN, 0x0804 * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x0808 * 4, NV_RD32(par->PRAMIN, 0x0808 * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x080C * 4, NV_RD32(par->PRAMIN, 0x080C * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x0810 * 4, NV_RD32(par->PRAMIN, 0x0810 * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x0814 * 4, NV_RD32(par->PRAMIN, 0x0814 * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x0818 * 4, NV_RD32(par->PRAMIN, 0x0818 * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x081C * 4, NV_RD32(par->PRAMIN, 0x081C * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x0820 * 4, NV_RD32(par->PRAMIN, 0x0820 * 4) | 0x00080000); NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000001); NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000001);#endif } if (par->Architecture < NV_ARCH_10) { if ((par->Chipset & 0x0fff) == 0x0020) { NV_WR32(par->PRAMIN, 0x0824 * 4, NV_RD32(par->PRAMIN, 0x0824 * 4) | 0x00020000); NV_WR32(par->PRAMIN, 0x0826 * 4, NV_RD32(par->PRAMIN, 0x0826 * 4) + par->FbAddress); } NV_WR32(par->PGRAPH, 0x0080, 0x000001FF); NV_WR32(par->PGRAPH, 0x0080, 0x1230C000); NV_WR32(par->PGRAPH, 0x0084, 0x72111101); NV_WR32(par->PGRAPH, 0x0088, 0x11D5F071); NV_WR32(par->PGRAPH, 0x008C, 0x0004FF31); NV_WR32(par->PGRAPH, 0x008C, 0x4004FF31); NV_WR32(par->PGRAPH, 0x0140, 0x00000000); NV_WR32(par->PGRAPH, 0x0100, 0xFFFFFFFF); NV_WR32(par->PGRAPH, 0x0170, 0x10010100); NV_WR32(par->PGRAPH, 0x0710, 0xFFFFFFFF); NV_WR32(par->PGRAPH, 0x0720, 0x00000001); NV_WR32(par->PGRAPH, 0x0810, 0x00000000); NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); } else { NV_WR32(par->PGRAPH, 0x0080, 0xFFFFFFFF); NV_WR32(par->PGRAPH, 0x0080, 0x00000000); NV_WR32(par->PGRAPH, 0x0140, 0x00000000); NV_WR32(par->PGRAPH, 0x0100, 0xFFFFFFFF); NV_WR32(par->PGRAPH, 0x0144, 0x10010100); NV_WR32(par->PGRAPH, 0x0714, 0xFFFFFFFF); NV_WR32(par->PGRAPH, 0x0720, 0x00000001); NV_WR32(par->PGRAPH, 0x0710, NV_RD32(par->PGRAPH, 0x0710) & 0x0007ff00); NV_WR32(par->PGRAPH, 0x0710, NV_RD32(par->PGRAPH, 0x0710) | 0x00020100); if (par->Architecture == NV_ARCH_10) { NV_WR32(par->PGRAPH, 0x0084, 0x00118700); NV_WR32(par->PGRAPH, 0x0088, 0x24E00810); NV_WR32(par->PGRAPH, 0x008C, 0x55DE0030); for (i = 0; i < 32; i++) NV_WR32(&par->PGRAPH[(0x0B00 / 4) + i], 0, NV_RD32(&par->PFB[(0x0240 / 4) + i], 0)); NV_WR32(par->PGRAPH, 0x640, 0); NV_WR32(par->PGRAPH, 0x644, 0); NV_WR32(par->PGRAPH, 0x684, par->FbMapSize - 1); NV_WR32(par->PGRAPH, 0x688, par->FbMapSize - 1); NV_WR32(par->PGRAPH, 0x0810, 0x00000000); NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); } else { if (par->Architecture >= NV_ARCH_40) { u32 tmp; NV_WR32(par->PGRAPH, 0x0084, 0x401287c0); NV_WR32(par->PGRAPH, 0x008C, 0x60de8051); NV_WR32(par->PGRAPH, 0x0090, 0x00008000); NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f); tmp = NV_RD32(par->REGS, 0x1540) & 0xff; for(i = 0; tmp && !(tmp & 1); tmp >>= 1, i++); NV_WR32(par->PGRAPH, 0x5000, i); if ((par->Chipset & 0xfff0) == 0x0040) { NV_WR32(par->PGRAPH, 0x09b0, 0x83280fff); NV_WR32(par->PGRAPH, 0x09b4, 0x000000a0); } else { NV_WR32(par->PGRAPH, 0x0820, 0x83280eff); NV_WR32(par->PGRAPH, 0x0824, 0x000000a0); } switch (par->Chipset & 0xfff0) { case 0x0040: case 0x0210: NV_WR32(par->PGRAPH, 0x09b8, 0x0078e366); NV_WR32(par->PGRAPH, 0x09bc, 0x0000014c); NV_WR32(par->PFB, 0x033C, NV_RD32(par->PFB, 0x33C) & 0xffff7fff); break; case 0x00C0: case 0x0120: NV_WR32(par->PGRAPH, 0x0828, 0x007596ff); NV_WR32(par->PGRAPH, 0x082C, 0x00000108);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -