⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 riva_hw.c

📁 linux-2.4.29操作系统的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -