📄 riva_hw.c
字号:
tmp = ns * ainfo->vdrain_rate/1000000; if (ABS(ainfo->vburst_size) + (ABS(ainfo->wcvlwm + 32) & ~0xf) - tmp> VFIFO_SIZE) { ainfo->converged = 0; return (1); } if (ABS(ainfo->gocc) > max_gfsize) { ainfo->converged = 0; return (1); } if (ABS(ainfo->vocc) > VFIFO_SIZE) { ainfo->converged = 0; return (1); } if (ABS(ainfo->mocc) > MFIFO_SIZE) { ainfo->converged = 0; return (1); } if (ABS(vfsize) > VFIFO_SIZE) { ainfo->converged = 0; return (1); } if (ABS(gfsize) > max_gfsize) { ainfo->converged = 0; return (1); } if (ABS(mfsize) > MFIFO_SIZE) { ainfo->converged = 0; return (1); } }}static char nv3_arb(nv3_fifo_info * res_info, nv3_sim_state * state, nv3_arb_info *ainfo) { long ens, vns, mns, gns; int mmisses, gmisses, vmisses, eburst_size, mburst_size; int refresh_cycle; refresh_cycle = 0; refresh_cycle = 2*(state->mclk_khz/state->pclk_khz) + 5; mmisses = 2; if (state->mem_aligned) gmisses = 2; else gmisses = 3; vmisses = 2; eburst_size = state->memory_width * 1; mburst_size = 32; gns = 1000000 * (gmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz; ainfo->by_gfacc = gns*ainfo->gdrain_rate/1000000; ainfo->wcmocc = 0; ainfo->wcgocc = 0; ainfo->wcvocc = 0; ainfo->wcvlwm = 0; ainfo->wcglwm = 0; ainfo->engine_en = 1; ainfo->converged = 1; if (ainfo->engine_en) { ens = 1000000*(state->mem_page_miss + eburst_size/(state->memory_width/8) +refresh_cycle)/state->mclk_khz; ainfo->mocc = state->enable_mp ? 0-ens*ainfo->mdrain_rate/1000000 : 0; ainfo->vocc = ainfo->vid_en ? 0-ens*ainfo->vdrain_rate/1000000 : 0; ainfo->gocc = ainfo->gr_en ? 0-ens*ainfo->gdrain_rate/1000000 : 0; ainfo->cur = ENGINE; ainfo->first_vacc = 1; ainfo->first_gacc = 1; ainfo->first_macc = 1; nv3_iterate(res_info, state,ainfo); } if (state->enable_mp) { mns = 1000000 * (mmisses*state->mem_page_miss + mburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; ainfo->mocc = state->enable_mp ? 0 : mburst_size - mns*ainfo->mdrain_rate/1000000; ainfo->vocc = ainfo->vid_en ? 0 : 0- mns*ainfo->vdrain_rate/1000000; ainfo->gocc = ainfo->gr_en ? 0: 0- mns*ainfo->gdrain_rate/1000000; ainfo->cur = MPORT; ainfo->first_vacc = 1; ainfo->first_gacc = 1; ainfo->first_macc = 0; nv3_iterate(res_info, state,ainfo); } if (ainfo->gr_en) { ainfo->first_vacc = 1; ainfo->first_gacc = 0; ainfo->first_macc = 1; gns = 1000000*(gmisses*state->mem_page_miss + ainfo->gburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; ainfo->gocc = ainfo->gburst_size - gns*ainfo->gdrain_rate/1000000; ainfo->vocc = ainfo->vid_en? 0-gns*ainfo->vdrain_rate/1000000 : 0; ainfo->mocc = state->enable_mp ? 0-gns*ainfo->mdrain_rate/1000000: 0; ainfo->cur = GRAPHICS; nv3_iterate(res_info, state,ainfo); } if (ainfo->vid_en) { ainfo->first_vacc = 0; ainfo->first_gacc = 1; ainfo->first_macc = 1; vns = 1000000*(vmisses*state->mem_page_miss + ainfo->vburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; ainfo->vocc = ainfo->vburst_size - vns*ainfo->vdrain_rate/1000000; ainfo->gocc = ainfo->gr_en? (0-vns*ainfo->gdrain_rate/1000000) : 0; ainfo->mocc = state->enable_mp? 0-vns*ainfo->mdrain_rate/1000000 :0 ; ainfo->cur = VIDEO; nv3_iterate(res_info, state, ainfo); } if (ainfo->converged) { res_info->graphics_lwm = (int)ABS(ainfo->wcglwm) + 16; res_info->video_lwm = (int)ABS(ainfo->wcvlwm) + 32; res_info->graphics_burst_size = ainfo->gburst_size; res_info->video_burst_size = ainfo->vburst_size; res_info->graphics_hi_priority = (ainfo->priority == GRAPHICS); res_info->media_hi_priority = (ainfo->priority == MPORT); if (res_info->video_lwm > 160) { res_info->graphics_lwm = 256; res_info->video_lwm = 128; res_info->graphics_burst_size = 64; res_info->video_burst_size = 64; res_info->graphics_hi_priority = 0; res_info->media_hi_priority = 0; ainfo->converged = 0; return (0); } if (res_info->video_lwm > 128) { res_info->video_lwm = 128; } return (1); } else { res_info->graphics_lwm = 256; res_info->video_lwm = 128; res_info->graphics_burst_size = 64; res_info->video_burst_size = 64; res_info->graphics_hi_priority = 0; res_info->media_hi_priority = 0; return (0); }}static char nv3_get_param(nv3_fifo_info *res_info, nv3_sim_state * state, nv3_arb_info *ainfo){ int done, g,v, p; done = 0; for (p=0; p < 2; p++) { for (g=128 ; g > 32; g= g>> 1) { for (v=128; v >=32; v = v>> 1) { ainfo->priority = p; ainfo->gburst_size = g; ainfo->vburst_size = v; done = nv3_arb(res_info, state,ainfo); if (done && (g==128)) if ((res_info->graphics_lwm + g) > 256) done = 0; if (done) goto Done; } } } Done: return done;}static void nv3CalcArbitration ( nv3_fifo_info * res_info, nv3_sim_state * state){ nv3_fifo_info save_info; nv3_arb_info ainfo; char res_gr, res_vid; ainfo.gr_en = 1; ainfo.vid_en = state->enable_video; ainfo.vid_only_once = 0; ainfo.gr_only_once = 0; ainfo.gdrain_rate = (int) state->pclk_khz * (state->pix_bpp/8); ainfo.vdrain_rate = (int) state->pclk_khz * 2; if (state->video_scale != 0) ainfo.vdrain_rate = ainfo.vdrain_rate/state->video_scale; ainfo.mdrain_rate = 33000; res_info->rtl_values = 0; if (!state->gr_during_vid && state->enable_video) { ainfo.gr_only_once = 1; ainfo.gr_en = 1; ainfo.gdrain_rate = 0; res_vid = nv3_get_param(res_info, state, &ainfo); res_vid = ainfo.converged; save_info.video_lwm = res_info->video_lwm; save_info.video_burst_size = res_info->video_burst_size; ainfo.vid_en = 1; ainfo.vid_only_once = 1; ainfo.gr_en = 1; ainfo.gdrain_rate = (int) state->pclk_khz * (state->pix_bpp/8); ainfo.vdrain_rate = 0; res_gr = nv3_get_param(res_info, state, &ainfo); res_gr = ainfo.converged; res_info->video_lwm = save_info.video_lwm; res_info->video_burst_size = save_info.video_burst_size; res_info->valid = res_gr & res_vid; } else { if (!ainfo.gr_en) ainfo.gdrain_rate = 0; if (!ainfo.vid_en) ainfo.vdrain_rate = 0; res_gr = nv3_get_param(res_info, state, &ainfo); res_info->valid = ainfo.converged; }}static void nv3UpdateArbitrationSettings( unsigned VClk, unsigned pixelDepth, unsigned *burst, unsigned *lwm, RIVA_HW_INST *chip){ nv3_fifo_info fifo_data; nv3_sim_state sim_data; unsigned int M, N, P, pll, MClk; pll = chip->PRAMDAC[0x00000504/4]; M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; MClk = (N * chip->CrystalFreqKHz / M) >> P; sim_data.pix_bpp = (char)pixelDepth; sim_data.enable_video = 0; sim_data.enable_mp = 0; sim_data.video_scale = 1; sim_data.memory_width = (chip->PEXTDEV[0x00000000/4] & 0x10) ? 128 : 64; sim_data.memory_width = 128; sim_data.mem_latency = 9; sim_data.mem_aligned = 1; sim_data.mem_page_miss = 11; sim_data.gr_during_vid = 0; sim_data.pclk_khz = VClk; sim_data.mclk_khz = MClk; nv3CalcArbitration(&fifo_data, &sim_data); if (fifo_data.valid) { int b = fifo_data.graphics_burst_size >> 4; *burst = 0; while (b >>= 1) (*burst)++; *lwm = fifo_data.graphics_lwm >> 3; } else { *lwm = 0x24; *burst = 0x2; }}static void nv4CalcArbitration ( nv4_fifo_info *fifo, nv4_sim_state *arb){ int data, pagemiss, cas,width, video_enable, color_key_enable, bpp, align; int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs; int found, mclk_extra, mclk_loop, cbs, m1, p1; int mclk_freq, pclk_freq, nvclk_freq, mp_enable; int us_m, us_n, us_p, video_drain_rate, crtc_drain_rate; int vpm_us, us_video, vlwm, video_fill_us, cpm_us, us_crt,clwm; int craw, vraw; fifo->valid = 1; pclk_freq = arb->pclk_khz; mclk_freq = arb->mclk_khz; nvclk_freq = arb->nvclk_khz; pagemiss = arb->mem_page_miss; cas = arb->mem_latency; width = arb->memory_width >> 6; video_enable = arb->enable_video; color_key_enable = arb->gr_during_vid; bpp = arb->pix_bpp; align = arb->mem_aligned; mp_enable = arb->enable_mp; clwm = 0; vlwm = 0; cbs = 128; pclks = 2; nvclks = 2; nvclks += 2; nvclks += 1; mclks = 5; mclks += 3; mclks += 1; mclks += cas; mclks += 1; mclks += 1; mclks += 1; mclks += 1; mclk_extra = 3; nvclks += 2; nvclks += 1; nvclks += 1; nvclks += 1; if (mp_enable) mclks+=4; nvclks += 0; pclks += 0; found = 0; vbs = 0; while (found != 1) { fifo->valid = 1; found = 1; mclk_loop = mclks+mclk_extra; us_m = mclk_loop *1000*1000 / mclk_freq; us_n = nvclks*1000*1000 / nvclk_freq; us_p = nvclks*1000*1000 / pclk_freq; if (video_enable) { video_drain_rate = pclk_freq * 2; crtc_drain_rate = pclk_freq * bpp/8; vpagemiss = 2; vpagemiss += 1; crtpagemiss = 2; vpm_us = (vpagemiss * pagemiss)*1000*1000/mclk_freq; if (nvclk_freq * 2 > mclk_freq * width) video_fill_us = cbs*1000*1000 / 16 / nvclk_freq ; else video_fill_us = cbs*1000*1000 / (8 * width) / mclk_freq; us_video = vpm_us + us_m + us_n + us_p + video_fill_us; vlwm = us_video * video_drain_rate/(1000*1000); vlwm++; vbs = 128; if (vlwm > 128) vbs = 64; if (vlwm > (256-64)) vbs = 32; if (nvclk_freq * 2 > mclk_freq * width) video_fill_us = vbs *1000*1000/ 16 / nvclk_freq ; else video_fill_us = vbs*1000*1000 / (8 * width) / mclk_freq; cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; us_crt = us_video +video_fill_us +cpm_us +us_m + us_n +us_p ; clwm = us_crt * crtc_drain_rate/(1000*1000); clwm++; } else { crtc_drain_rate = pclk_freq * bpp/8; crtpagemiss = 2; crtpagemiss += 1; cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; us_crt = cpm_us + us_m + us_n + us_p ; clwm = us_crt * crtc_drain_rate/(1000*1000); clwm++; } m1 = clwm + cbs - 512; p1 = m1 * pclk_freq / mclk_freq; p1 = p1 * bpp / 8; if ((p1 < m1) && (m1 > 0)) { fifo->valid = 0; found = 0; if (mclk_extra ==0) found = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -