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

📄 riva_hw.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
    unsigned int M, N, P, pll, MClk, NVClk, cfg1;    pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0);    M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;    MClk  = (N * chip->CrystalFreqKHz / M) >> P;    pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0);    M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;    NVClk  = (N * chip->CrystalFreqKHz / M) >> P;    cfg1 = NV_RD32(&chip->PFB[0x00000204/4], 0);    sim_data.pix_bpp        = (char)pixelDepth;    sim_data.enable_video   = 0;    sim_data.enable_mp      = 0;    sim_data.memory_type    = (NV_RD32(&chip->PFB[0x00000200/4], 0) & 0x01) ?	1 : 0;    sim_data.memory_width   = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 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;    nv10CalcArbitration(&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;    }}static void nForceUpdateArbitrationSettings(    unsigned      VClk,    unsigned      pixelDepth,    unsigned     *burst,    unsigned     *lwm,    RIVA_HW_INST *chip){    nv10_fifo_info fifo_data;    nv10_sim_state sim_data;    unsigned int M, N, P, pll, MClk, NVClk;    unsigned int uMClkPostDiv;    struct pci_dev *dev;    dev = pci_find_slot(0, 3);    pci_read_config_dword(dev, 0x6C, &uMClkPostDiv);    uMClkPostDiv = (uMClkPostDiv >> 8) & 0xf;    if(!uMClkPostDiv) uMClkPostDiv = 4;    MClk = 400000 / uMClkPostDiv;    pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0);    M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;    NVClk  = (N * chip->CrystalFreqKHz / M) >> P;    sim_data.pix_bpp        = (char)pixelDepth;    sim_data.enable_video   = 0;    sim_data.enable_mp      = 0;    dev = pci_find_slot(0, 1);    pci_read_config_dword(dev, 0x7C, &sim_data.memory_type);    sim_data.memory_type    = (sim_data.memory_type >> 12) & 1;    sim_data.memory_width   = 64;    sim_data.mem_latency    = 3;    sim_data.mem_aligned    = 1;    sim_data.mem_page_miss  = 10;    sim_data.gr_during_vid  = 0;    sim_data.pclk_khz       = VClk;    sim_data.mclk_khz       = MClk;    sim_data.nvclk_khz      = NVClk;    nv10CalcArbitration(&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;    }}/****************************************************************************\*                                                                            **                          RIVA Mode State Routines                          **                                                                            *\****************************************************************************//* * Calculate the Video Clock parameters for the PLL. */static int CalcVClock(    int           clockIn,    int          *clockOut,    int          *mOut,    int          *nOut,    int          *pOut,    RIVA_HW_INST *chip){    unsigned lowM, highM, highP;    unsigned DeltaNew, DeltaOld;    unsigned VClk, Freq;    unsigned M, N, P;        DeltaOld = 0xFFFFFFFF;    VClk     = (unsigned)clockIn;        if (chip->CrystalFreqKHz == 13500)    {        lowM  = 7;        highM = 13 - (chip->Architecture == NV_ARCH_03);    }    else    {        lowM  = 8;        highM = 14 - (chip->Architecture == NV_ARCH_03);    }                          highP = 4 - (chip->Architecture == NV_ARCH_03);    for (P = 0; P <= highP; P ++)    {        Freq = VClk << P;        if ((Freq >= 128000) && (Freq <= chip->MaxVClockFreqKHz))        {            for (M = lowM; M <= highM; M++)            {                N    = (VClk << P) * M / chip->CrystalFreqKHz;                if(N <= 255) {                Freq = (chip->CrystalFreqKHz * N / M) >> P;                if (Freq > VClk)                    DeltaNew = Freq - VClk;                else                    DeltaNew = VClk - Freq;                if (DeltaNew < DeltaOld)                {                    *mOut     = M;                    *nOut     = N;                    *pOut     = P;                    *clockOut = Freq;                    DeltaOld  = DeltaNew;                }            }        }    }    }    return (DeltaOld != 0xFFFFFFFF);}/* * Calculate extended mode parameters (SVGA) and save in a  * mode state structure. */static void CalcStateExt(    RIVA_HW_INST  *chip,    RIVA_HW_STATE *state,    int            bpp,    int            width,    int            hDisplaySize,    int            height,    int            dotClock){    int pixelDepth, VClk, m, n, p;    /*     * 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;    CalcVClock(dotClock, &VClk, &m, &n, &p, chip);    switch (chip->Architecture)    {        case NV_ARCH_03:            nv3UpdateArbitrationSettings(VClk,                                          pixelDepth * 8,                                         &(state->arbitration0),                                        &(state->arbitration1),                                         chip);            state->cursor0  = 0x00;            state->cursor1  = 0x78;            state->cursor2  = 0x00000000;            state->pllsel   = 0x10010100;            state->config   = ((width + 31)/32)                            | (((pixelDepth > 2) ? 3 : pixelDepth) << 8)                            | 0x1000;            state->general  = 0x00100100;            state->repaint1 = hDisplaySize < 1280 ? 0x06 : 0x02;            break;        case NV_ARCH_04:            nv4UpdateArbitrationSettings(VClk,                                          pixelDepth * 8,                                         &(state->arbitration0),                                        &(state->arbitration1),                                         chip);            state->cursor0  = 0x00;            state->cursor1  = 0xFC;            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:            if((chip->Chipset == NV_CHIP_IGEFORCE2) ||               (chip->Chipset == NV_CHIP_0x01F0))            {                nForceUpdateArbitrationSettings(VClk,                                          pixelDepth * 8,                                         &(state->arbitration0),                                         &(state->arbitration1),                                          chip);            } else {                nv10UpdateArbitrationSettings(VClk,                                           pixelDepth * 8,                                          &(state->arbitration0),                                         &(state->arbitration1),                                          chip);            }            state->cursor0  = 0x80 | (chip->CursorStart >> 17);            state->cursor1  = (chip->CursorStart >> 11) << 2;            state->cursor2  = chip->CursorStart >> 24;            state->pllsel   = 0x10000700;            state->config   = NV_RD32(&chip->PFB[0x00000200/4], 0);            state->general  = bpp == 16 ? 0x00101100 : 0x00100100;            state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00;            break;    }     /* Paul Richards: below if block borks things in kernel for some reason */     /* Tony: Below is needed to set hardware in DirectColor */    if((bpp != 8) && (chip->Architecture != NV_ARCH_03))	    state->general |= 0x00000030;    state->vpll     = (p << 16) | (n << 8) | m;    state->repaint0 = (((width/8)*pixelDepth) & 0x700) >> 3;    state->pixel    = pixelDepth > 2   ? 3    : pixelDepth;    state->offset0  =    state->offset1  =    state->offset2  =    state->offset3  = 0;    state->pitch0   =    state->pitch1   =    state->pitch2   =    state->pitch3   = pixelDepth * width;}/* * Load fixed function state and pre-calculated/stored state. */#if 0#define LOAD_FIXED_STATE(tbl,dev)                                       \    for (i = 0; i < sizeof(tbl##Table##dev)/8; i++)                 \        chip->dev[tbl##Table##dev[i][0]] = tbl##Table##dev[i][1]#define LOAD_FIXED_STATE_8BPP(tbl,dev)                                  \    for (i = 0; i < sizeof(tbl##Table##dev##_8BPP)/8; i++)            \        chip->dev[tbl##Table##dev##_8BPP[i][0]] = tbl##Table##dev##_8BPP[i][1]#define LOAD_FIXED_STATE_15BPP(tbl,dev)                                 \    for (i = 0; i < sizeof(tbl##Table##dev##_15BPP)/8; i++)           \        chip->dev[tbl##Table##dev##_15BPP[i][0]] = tbl##Table##dev##_15BPP[i][1]#define LOAD_FIXED_STATE_16BPP(tbl,dev)                                 \    for (i = 0; i < sizeof(tbl##Table##dev##_16BPP)/8; i++)           \        chip->dev[tbl##Table##dev##_16BPP[i][0]] = tbl##Table##dev##_16BPP[i][1]#define LOAD_FIXED_STATE_32BPP(tbl,dev)                                 \    for (i = 0; i < sizeof(tbl##Table##dev##_32BPP)/8; i++)           \        chip->dev[tbl##Table##dev##_32BPP[i][0]] = tbl##Table##dev##_32BPP[i][1]#endif#define LOAD_FIXED_STATE(tbl,dev)                                       \    for (i = 0; i < sizeof(tbl##Table##dev)/8; i++)                 \        NV_WR32(&chip->dev[tbl##Table##dev[i][0]], 0, tbl##Table##dev[i][1])#define LOAD_FIXED_STATE_8BPP(tbl,dev)                                  \    for (i = 0; i < sizeof(tbl##Table##dev##_8BPP)/8; i++)            \        NV_WR32(&chip->dev[tbl##Table##dev##_8BPP[i][0]], 0, tbl##Table##dev##_8BPP[i][1])#define LOAD_FIXED_STATE_15BPP(tbl,dev)                                 \    for (i = 0; i < sizeof(tbl##Table##dev##_15BPP)/8; i++)           \        NV_WR32(&chip->dev[tbl##Table##dev##_15BPP[i][0]], 0, tbl##Table##dev##_15BPP[i][1])#define LOAD_FIXED_STATE_16BPP(tbl,dev)                                 \    for (i = 0; i < sizeof(tbl##Table##dev##_16BPP)/8; i++)           \        NV_WR32(&chip->dev[tbl##Table##dev##_16BPP[i][0]], 0, tbl##Table##dev##_16BPP[i][1])#define LOAD_FIXED_STATE_32BPP(tbl,dev)                                 \    for (i = 0; i < sizeof(tbl##Table##dev##_32BPP)/8; i++)           \        NV_WR32(&chip->dev[tbl##Table##dev##_32BPP[i][0]], 0, tbl##Table##dev##_32BPP[i][1])static void UpdateFifoState(    RIVA_HW_INST  *chip){    int i;    switch (chip->Architecture)    {        case NV_ARCH_04:            LOAD_FIXED_STATE(nv4,FIFO);            chip->Tri03 = NULL;            chip->Tri05 = (RivaTexturedTriangle05 __iomem *)&(chip->FIFO[0x0000E000/4]);            break;        case NV_ARCH_10:        case NV_ARCH_20:        case NV_ARCH_30:            /*             * Initialize state for the RivaTriangle3D05 routines.             */            LOAD_FIXED_STATE(nv10tri05,PGRAPH);            LOAD_FIXED_STATE(nv10,FIFO);            chip->Tri03 = NULL;            chip->Tri05 = (RivaTexturedTriangle05 __iomem *)&(chip->FIFO[0x0000E000/4]);            break;    }}static void LoadStateExt(    RIVA_HW_INST  *chip,    RIVA_HW_STATE *state){    int i;    /*     * Load HW fixed function state.     */    LOAD_FIXED_STATE(Riva,PMC);    LOAD_FIXED_STATE(Riva,PTIMER);    switch (chip->Architecture)    {        case NV_ARCH_03:            /*             * Make sure frame buffer config gets set before loading PRAMIN.             */            NV_WR32(chip->PFB, 0x00000200, state->config);            LOAD_FIXED_STATE(nv3,PFIFO);            LOAD_FIXED_STATE(nv3,PRAMIN);            LOAD_FIXED_STATE(nv3,PGRAPH);            switch (state->bpp)            {                case 15:                case 16:                    LOAD_FIXED_STATE_15BPP(nv3,PRAMIN);                    LOAD_FIXED_STATE_15BPP(nv3,PGRAPH);                    chip->Tri03 = (RivaTexturedTriangle03  __iomem *)&(chip->FIFO[0x0000E000/4]);                    break;                case 24:                case 32:                    LOAD_FIXED_STATE_32BPP(nv3,PRAMIN);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -