(file) Return to nv4arb.c CVS log (file) (dir) Up to [XFree86 CVS] / xc / programs / Xserver / hw / xfree86 / vga256 / drivers / nv / Attic

Diff for /xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/Attic/nv4arb.c between version 1.1 and 1.1.2.1

version 1.1, 1998/10/19 07:33:44 version 1.1.2.1, 1998/10/19 07:33:44
Line 0 
Line 1 
    /***************************************************************************\
   |*                                                                           *|
   |*       Copyright 1993-1998 NVIDIA, Corporation.  All rights reserved.      *|
   |*                                                                           *|
   |*     NOTICE TO USER:   The source code  is copyrighted under  U.S. and     *|
   |*     international laws.  Users and possessors of this source code are     *|
   |*     hereby granted a nonexclusive,  royalty-free copyright license to     *|
   |*     use this code in individual and commercial software.                  *|
   |*                                                                           *|
   |*     Any use of this source code must include,  in the user documenta-     *|
   |*     tion and  internal comments to the code,  notices to the end user     *|
   |*     as follows:                                                           *|
   |*                                                                           *|
   |*       Copyright 1993-1998 NVIDIA, Corporation.  All rights reserved.      *|
   |*                                                                           *|
   |*     NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY     *|
   |*     OF  THIS SOURCE  CODE  FOR ANY PURPOSE.  IT IS  PROVIDED  "AS IS"     *|
   |*     WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND.  NVIDIA, CORPOR-     *|
   |*     ATION DISCLAIMS ALL WARRANTIES  WITH REGARD  TO THIS SOURCE CODE,     *|
   |*     INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE-     *|
   |*     MENT,  AND FITNESS  FOR A PARTICULAR PURPOSE.   IN NO EVENT SHALL     *|
   |*     NVIDIA, CORPORATION  BE LIABLE FOR ANY SPECIAL,  INDIRECT,  INCI-     *|
   |*     DENTAL, OR CONSEQUENTIAL DAMAGES,  OR ANY DAMAGES  WHATSOEVER RE-     *|
   |*     SULTING FROM LOSS OF USE,  DATA OR PROFITS,  WHETHER IN AN ACTION     *|
   |*     OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,  ARISING OUT OF     *|
   |*     OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE.     *|
   |*                                                                           *|
   |*     U.S. Government  End  Users.   This source code  is a "commercial     *|
   |*     item,"  as that  term is  defined at  48 C.F.R. 2.101 (OCT 1995),     *|
   |*     consisting  of "commercial  computer  software"  and  "commercial     *|
   |*     computer  software  documentation,"  as such  terms  are  used in     *|
   |*     48 C.F.R. 12.212 (SEPT 1995)  and is provided to the U.S. Govern-     *|
   |*     ment only as  a commercial end item.   Consistent with  48 C.F.R.     *|
   |*     12.212 and  48 C.F.R. 227.7202-1 through  227.7202-4 (JUNE 1995),     *|
   |*     all U.S. Government End Users  acquire the source code  with only     *|
   |*     those rights set forth herein.                                        *|
   |*                                                                           *|
    \***************************************************************************/
   #include "nv4arb.h"
   #include "nv4ref.h"
   #include "nvreg.h"
   static void CalcArbitration
   (
       fifo_info *fifo,
       sim_state *arb
   )
   {
       int data, m,n,p, 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 xtal_freq, 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;
       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;
               mclk_extra--;
           }
           else if (video_enable)
           {
               if ((clwm > 511) || (vlwm > 255))
               {
                   fifo->valid = 0;
                   found = 0;
                   if (mclk_extra ==0)   found = 1;
                   mclk_extra--;
               }
           }
           else
           {
               if (clwm > 519)
               {
                   fifo->valid = 0;
                   found = 0;
                   if (mclk_extra ==0)   found = 1;
                   mclk_extra--;
               }
           }
           craw = clwm;
           vraw = vlwm;
           if (clwm < 384) clwm = 384;
           if (vlwm < 128) vlwm = 128;
           data = (int)(clwm);
           fifo->graphics_lwm = data;
           fifo->graphics_burst_size = 128;
           data = (int)((vlwm+15));
           fifo->video_lwm = data;
           fifo->video_burst_size = vbs;
       }
   }
   void nv4UpdateArbitrationSettings
   (
       unsigned int   VClk,
       unsigned int   pixelDepth,
       unsigned int   crystal,
       unsigned char *lwm,
       unsigned char *burst
   )
   {
       fifo_info fifo_data;
       sim_state sim_data;
       unsigned int M, N, P, pll, MClk, NVClk, cfg1;
   
       pll = PRAMDAC_Read(MPLL_COEFF);
       M = (pll >> 0)  & 0xFF;
       N = (pll >> 8)  & 0xFF;
       P = (pll >> 16) & 0x0F;
       MClk  = (N * crystal / M) >> P;
       pll = PRAMDAC_Read(NVPLL_COEFF);
       M = (pll >> 0)  & 0xFF;
       N = (pll >> 8)  & 0xFF;
       P = (pll >> 16) & 0x0F;
       NVClk  = (N * crystal / M) >> P;
       cfg1 = PFB_Read(CONFIG_1);
       sim_data.pix_bpp        = (char)pixelDepth;
       sim_data.enable_video   = 0;
       sim_data.enable_mp      = 0;
       sim_data.memory_width   = (PEXTDEV_Read(BOOT_0) & 0x10) ? 128 : 64;
       sim_data.mem_latency    = (char)cfg1 & 0x0F;
       sim_data.mem_aligned    = 1;
       sim_data.mem_page_miss  = (char)(((cfg1 >> 4) &0x0F) + ((cfg1 >> 31) &0x01));
       sim_data.gr_during_vid  = 0;
       sim_data.pclk_khz       = VClk;
       sim_data.mclk_khz       = MClk;
       sim_data.nvclk_khz      = NVClk;
       CalcArbitration(&fifo_data, &sim_data);
       if (fifo_data.valid)
       {
           /*
           *vlwm = fifo_data.video_lwm >> 1;
           REG_WR32(NV_PVIDEO_FIFO_THRES, fifo_data.video_lwm >> 1);
           switch (fifo_data.video_burst_size)
           {
               case 128:
                   *vburst = 3;
                   REG_WR32(NV_PVIDEO_FIFO_BURST, 3);
                   break;
               case 64:
                   *vburst = 2;
                   break;
               case 32:
                   *vburst = 1;
                   break;
           }
           CRTC_WR(NV_CIO_CRE_FFLWM__INDEX, fifo_data.graphics_lwm >> 3);
           */
           *lwm = fifo_data.graphics_lwm >> 3;
           switch (fifo_data.graphics_burst_size)
           {
               case 256:
                   *burst = 4;
   /*                CRTC_WR(NV_CIO_CRE_FF_INDEX, 4);*/
                   break;
               case 128:
                   *burst = 3;
                   break;
               case 64:
                   *burst = 2;
                   break;
               case 32:
                   *burst = 1;
                   break;
               case 16:
                   *burst = 0;
                   break;
           }
       }
   }
   


Legend:
Removed from v.1.1  
changed lines
  Added in v.1.1.2.1

Powered by
ViewCVS 0.9.2