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

📄 atilock.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
        }        else        {            /*             * Could not make CRTC[17] readable, so unprotect CRTC[0-7]             * replacing VSyncEnd with zero.  This zero will be replaced after             * acquiring the needed access.             */            unsigned int VSyncEnd, VBlankStart, VBlankEnd;            CARD8 crt07, crt09;            PutReg(CRTX(pATI->CPIO_VGABase), 0x11U, 0x20U);            /* Make CRTC[16-17] readable */            PutReg(CRTX(pATI->CPIO_VGABase), 0x03U, tmp | 0x80U);            /* Make vertical synch pulse as wide as possible */            crt07 = GetReg(CRTX(pATI->CPIO_VGABase), 0x07U);            crt09 = GetReg(CRTX(pATI->CPIO_VGABase), 0x09U);            VBlankStart = (((crt09 & 0x20U) << 4) | ((crt07 & 0x08U) << 5) |                GetReg(CRTX(pATI->CPIO_VGABase), 0x15U)) + 1;            VBlankEnd = (VBlankStart & 0x0300U) |                GetReg(CRTX(pATI->CPIO_VGABase), 0x16U);            if (VBlankEnd <= VBlankStart)                VBlankEnd += 0x0100U;            VSyncEnd = (((crt07 & 0x80U) << 2) | ((crt07 & 0x04U) << 6) |                GetReg(CRTX(pATI->CPIO_VGABase), 0x10U)) + 0x0FU;            if (VSyncEnd >= VBlankEnd)                VSyncEnd = VBlankEnd - 1;            pATI->LockData.crt11 = (VSyncEnd & 0x0FU) | 0x20U;            PutReg(CRTX(pATI->CPIO_VGABase), 0x11U, pATI->LockData.crt11);            pATI->LockData.crt11 |= 0x80U;        }        if (pATI->LCDPanelID >= 0)        {            /* Setup to unlock shadow registers */            lcd_gen_ctrl |= SHADOW_RW_EN;            if (pATI->Chip == ATI_CHIP_264LT)                outr(LCD_GEN_CTRL, lcd_gen_ctrl);            else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) ||                        (pATI->Chip == ATI_CHIP_264XL) ||                        (pATI->Chip == ATI_CHIP_MOBILITY)) */                ATIMach64PutLCDReg(LCD_GEN_CNTL, lcd_gen_ctrl);            /* Unlock shadow registers */            ATISetVGAIOBase(pATI, inb(R_GENMO));            pATI->LockData.shadow_crt03 = tmp =                GetReg(CRTX(pATI->CPIO_VGABase), 0x03U);            if ((tmp & 0x80U) ||                ((outb(CRTD(pATI->CPIO_VGABase), tmp | 0x80U),                    tmp = inb(CRTD(pATI->CPIO_VGABase))) & 0x80U))            {                /* CRTC[16-17] should be readable */                pATI->LockData.shadow_crt11 = tmp =                    GetReg(CRTX(pATI->CPIO_VGABase), 0x11U);                if (tmp & 0x80U)            /* Unprotect CRTC[0-7] */                {                    outb(CRTD(pATI->CPIO_VGABase), tmp & 0x7FU);                }                else if (!tmp && pATI->LockData.crt11)                {                    pATI->LockData.shadow_crt11 = tmp = pATI->LockData.crt11;                    outb(CRTD(pATI->CPIO_VGABase), tmp & 0x7FU);                }            }            else            {                /*                 * Could not make CRTC[17] readable, so unprotect CRTC[0-7]                 * replacing VSyncEnd with zero.  This zero will be replaced                 * after acquiring the needed access.                 */                unsigned int VSyncEnd, VBlankStart, VBlankEnd;                CARD8 crt07, crt09;                PutReg(CRTX(pATI->CPIO_VGABase), 0x11U, 0x20U);                /* Make CRTC[16-17] readable */                PutReg(CRTX(pATI->CPIO_VGABase), 0x03U, tmp | 0x80U);                /* Make vertical synch pulse as wide as possible */                crt07 = GetReg(CRTX(pATI->CPIO_VGABase), 0x07U);                crt09 = GetReg(CRTX(pATI->CPIO_VGABase), 0x09U);                VBlankStart = (((crt09 & 0x20U) << 4) |                    ((crt07 & 0x08U) << 5) |                    GetReg(CRTX(pATI->CPIO_VGABase), 0x15U)) + 1;                VBlankEnd = (VBlankStart & 0x0300U) |                    GetReg(CRTX(pATI->CPIO_VGABase), 0x16U);                if (VBlankEnd <= VBlankStart)                    VBlankEnd += 0x0100U;                VSyncEnd = (((crt07 & 0x80U) << 2) | ((crt07 & 0x04U) << 6) |                    GetReg(CRTX(pATI->CPIO_VGABase), 0x10U)) + 0x0FU;                if (VSyncEnd >= VBlankEnd)                    VSyncEnd = VBlankEnd - 1;                pATI->LockData.shadow_crt11 = (VSyncEnd & 0x0FU) | 0x20U;                PutReg(CRTX(pATI->CPIO_VGABase), 0x11U,                    pATI->LockData.shadow_crt11);                pATI->LockData.shadow_crt11 |= 0x80U;            }            /* Restore selection */            if (pATI->Chip == ATI_CHIP_264LT)            {                outr(LCD_GEN_CTRL, saved_lcd_gen_ctrl);            }            else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) ||                        (pATI->Chip == ATI_CHIP_264XL) ||                        (pATI->Chip == ATI_CHIP_MOBILITY)) */            {                ATIMach64PutLCDReg(LCD_GEN_CNTL, saved_lcd_gen_ctrl);                /* Restore LCD index */                out8(LCD_INDEX, GetByte(pATI->LockData.lcd_index, 0));            }        }#endif /* AVOID_CPIO */    }}/* * ATILock -- * * This function restores the state saved by ATIUnlock() above. */voidATILock(    ATIPtr pATI){#ifndef AVOID_CPIO    CARD32 tmp, saved_lcd_gen_ctrl = 0, lcd_gen_ctrl = 0;#endif /* AVOID_CPIO */    if (!pATI->Unlocked)        return;    pATI->Unlocked = FALSE;#ifndef AVOID_CPIO    if (pATI->VGAAdapter != ATI_ADAPTER_NONE)    {        if (pATI->LCDPanelID >= 0)        {            if (pATI->Chip == ATI_CHIP_264LT)            {                saved_lcd_gen_ctrl = inr(LCD_GEN_CTRL);                /* Setup to lock non-shadow registers */                lcd_gen_ctrl = saved_lcd_gen_ctrl & ~SHADOW_RW_EN;                outr(LCD_GEN_CTRL, lcd_gen_ctrl);            }            else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) ||                        (pATI->Chip == ATI_CHIP_264XL) ||                        (pATI->Chip == ATI_CHIP_MOBILITY)) */            {                saved_lcd_gen_ctrl = ATIMach64GetLCDReg(LCD_GEN_CNTL);                /* Setup to lock non-shadow registers */                lcd_gen_ctrl = saved_lcd_gen_ctrl &                    ~(CRTC_RW_SELECT | SHADOW_RW_EN);                ATIMach64PutLCDReg(LCD_GEN_CNTL, lcd_gen_ctrl);            }        }        ATISetVGAIOBase(pATI, inb(R_GENMO));        /* Restore VGA locks */        PutReg(CRTX(pATI->CPIO_VGABase), 0x03U, pATI->LockData.crt03);        PutReg(CRTX(pATI->CPIO_VGABase), 0x11U, pATI->LockData.crt11);        if (pATI->LCDPanelID >= 0)        {            /* Setup to lock shadow registers */            lcd_gen_ctrl |= SHADOW_RW_EN;            if (pATI->Chip == ATI_CHIP_264LT)                outr(LCD_GEN_CTRL, lcd_gen_ctrl);            else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) ||                        (pATI->Chip == ATI_CHIP_264XL) ||                        (pATI->Chip == ATI_CHIP_MOBILITY)) */                ATIMach64PutLCDReg(LCD_GEN_CNTL, lcd_gen_ctrl);            /* Lock shadow registers */            ATISetVGAIOBase(pATI, inb(R_GENMO));            PutReg(CRTX(pATI->CPIO_VGABase), 0x03U,                pATI->LockData.shadow_crt03);            PutReg(CRTX(pATI->CPIO_VGABase), 0x11U,                pATI->LockData.shadow_crt11);            /* Restore selection */            if (pATI->Chip == ATI_CHIP_264LT)                outr(LCD_GEN_CTRL, saved_lcd_gen_ctrl);            else /* if ((pATI->Chip == ATI_CHIP_264LTPRO) ||                        (pATI->Chip == ATI_CHIP_264XL) ||                        (pATI->Chip == ATI_CHIP_MOBILITY)) */                ATIMach64PutLCDReg(LCD_GEN_CNTL, saved_lcd_gen_ctrl);        }        if (pATI->CPIO_VGAWonder)        {            /*             * Restore emulation and protection bits in ATI extended VGA             * registers.             */            ATIModifyExtReg(pATI, 0xB1U, -1, 0xFCU, pATI->LockData.b1);            ATIModifyExtReg(pATI, 0xB4U, -1, 0x00U, pATI->LockData.b4);            ATIModifyExtReg(pATI, 0xB5U, -1, 0xBFU, pATI->LockData.b5);            ATIModifyExtReg(pATI, 0xB6U, -1, 0xDDU, pATI->LockData.b6);            ATIModifyExtReg(pATI, 0xB8U, -1, 0xC0U, pATI->LockData.b8 & 0x03U);            ATIModifyExtReg(pATI, 0xB9U, -1, 0x7FU, pATI->LockData.b9);            if (pATI->Chip > ATI_CHIP_18800)            {                ATIModifyExtReg(pATI, 0xBEU, -1, 0xFAU, pATI->LockData.be);                if (pATI->Chip >= ATI_CHIP_28800_2)                {                    ATIModifyExtReg(pATI, 0xA6U, -1, 0x7FU, pATI->LockData.a6);                    ATIModifyExtReg(pATI, 0xABU, -1, 0xE7U, pATI->LockData.ab);                }            }            ATIModifyExtReg(pATI, 0xB8U, -1, 0xC0U, pATI->LockData.b8);        }    }    if (pATI->ChipHasSUBSYS_CNTL)    {        tmp = inw(SUBSYS_STAT) & _8PLANE;        /* Reset the 8514/A and disable all interrupts */        outw(SUBSYS_CNTL, tmp | (GPCTRL_RESET | CHPTEST_NORMAL));        outw(SUBSYS_CNTL, tmp | (GPCTRL_ENAB | CHPTEST_NORMAL | RVBLNKFLG |            RPICKFLAG | RINVALIDIO | RGPIDLE));        /* Restore modified accelerator registers */        outw(CLOCK_SEL, pATI->LockData.clock_sel);        if (pATI->Chip >= ATI_CHIP_68800)        {            outw(MISC_OPTIONS, pATI->LockData.misc_options);            outw(MEM_BNDRY, pATI->LockData.mem_bndry);            outw(MEM_CFG, pATI->LockData.mem_cfg);        }        /* Wait for all activity to die down */        ProbeWaitIdleEmpty();    }    else if (pATI->Chip >= ATI_CHIP_88800GXC)#endif /* AVOID_CPIO */    {        /* Reset everything */        outr(BUS_CNTL, pATI->LockData.bus_cntl);        outr(CRTC_INT_CNTL, pATI->LockData.crtc_int_cntl);        outr(GEN_TEST_CNTL, pATI->LockData.gen_test_cntl | GEN_GUI_EN);        outr(GEN_TEST_CNTL, pATI->LockData.gen_test_cntl);        outr(GEN_TEST_CNTL, pATI->LockData.gen_test_cntl | GEN_GUI_EN);        outr(CRTC_GEN_CNTL, pATI->LockData.crtc_gen_cntl | CRTC_EN);        outr(CRTC_GEN_CNTL, pATI->LockData.crtc_gen_cntl);        outr(CRTC_GEN_CNTL, pATI->LockData.crtc_gen_cntl | CRTC_EN);#ifndef AVOID_CPIO        outr(CONFIG_CNTL, pATI->LockData.config_cntl);#endif /* AVOID_CPIO */        outr(DAC_CNTL, pATI->LockData.dac_cntl);        if (pATI->Chip < ATI_CHIP_264CT)            outr(MEM_CNTL, pATI->LockData.mem_cntl);        if ((pATI->LCDPanelID >= 0) && (pATI->Chip != ATI_CHIP_264LT))        {            outr(LCD_INDEX, pATI->LockData.lcd_index);#ifndef TV_OUT            if (!pATI->OptionBIOSDisplay && (pATI->Chip != ATI_CHIP_264XL))                outr(SCRATCH_REG3, pATI->LockData.scratch_reg3);#endif /* TV_OUT */        }        if (pATI->Chip >= ATI_CHIP_264VTB)        {            outr(MPP_CONFIG, pATI->LockData.mpp_config);            outr(MPP_STROBE_SEQ, pATI->LockData.mpp_strobe_seq);#ifndef TV_OUT            outr(TVO_CNTL, pATI->LockData.tvo_cntl);#endif /* TV_OUT */            if (pATI->Chip >= ATI_CHIP_264GT2C)            {                outr(HW_DEBUG, pATI->LockData.hw_debug);                if (pATI->Chip >= ATI_CHIP_264GTPRO)                {                    outr(I2C_CNTL_0, pATI->LockData.i2c_cntl_0);                    outr(I2C_CNTL_1, pATI->LockData.i2c_cntl_1);                }            }        }    }}

⌨️ 快捷键说明

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