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

📄 atipreinit.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
    pATI->BankInfo.SetSourceAndDestinationBanks = ATIx8800SetReadWrite;    pATI->BankInfo.BankSize = 0x00010000U;      /* 64kB */#endif /* AVOID_CPIO */    pATI->LCDPanelID = -1;    pATI->nFIFOEntries = 16;                    /* For now */    pATI->Audio = ATI_AUDIO_NONE;    /* Finish probing the adapter */    switch (pATI->Adapter)    {#ifndef AVOID_CPIO        case ATI_ADAPTER_NONE:        case ATI_ADAPTER_EGA:        case ATI_ADAPTER_EGA_PLUS:        case ATI_ADAPTER_VGA:        case ATI_ADAPTER_BASIC:            pATI->NewHW.SetBank = (ATIBankProcPtr)NoopDDA;            pATI->BankInfo.SetSourceBank =                pATI->BankInfo.SetDestinationBank =                pATI->BankInfo.SetSourceAndDestinationBanks =                    (miBankProcPtr)NoopDDA;            break;        case ATI_ADAPTER_V3:            pATI->NewHW.SetBank = ATIV3SetBank;            pATI->BankInfo.SetSourceBank = ATIV3SetRead;            pATI->BankInfo.SetDestinationBank = ATIV3SetWrite;            pATI->BankInfo.SetSourceAndDestinationBanks = ATIV3SetReadWrite;            break;        case ATI_ADAPTER_V4:        case ATI_ADAPTER_V5:            pATI->NewHW.SetBank = ATIV4V5SetBank;            pATI->BankInfo.SetSourceBank = ATIV4V5SetRead;            pATI->BankInfo.SetDestinationBank = ATIV4V5SetWrite;            pATI->BankInfo.SetSourceAndDestinationBanks = ATIV4V5SetReadWrite;            break;        case ATI_ADAPTER_XL:            pATI->DAC = ATI_DAC_SC11483;            break;        case ATI_ADAPTER_8514A:            pATI->VideoRAM =                videoRamSizes[GetBits(inw(SUBSYS_STAT), _8PLANE) + 2];            break;        case ATI_ADAPTER_MACH8:            pATI->VideoRAM =                videoRamSizes[GetBits(inw(CONFIG_STATUS_1), MEM_INSTALLED) + 2];            break;        case ATI_ADAPTER_MACH32:            IOValue = inw(CONFIG_STATUS_1);            pATI->DAC = ATI_DAC(GetBits(IOValue, DACTYPE), 0);            pATI->MemoryType = GetBits(IOValue, MEM_TYPE);            IOValue = inw(MISC_OPTIONS);            pATI->VideoRAM =                videoRamSizes[GetBits(IOValue, MEM_SIZE_ALIAS) + 2];            /*             * The 68800-6 doesn't necessarily report the correct video memory             * size.             */            if ((pATI->Chip == ATI_CHIP_68800_6) && (pATI->VideoRAM == 1024))                pATI->VideoRAM = ATIMach32videoRam();            break;#endif /* AVOID_CPIO */        case ATI_ADAPTER_MACH64:            do            {                /*                 * Find and mmap() MMIO area.  Allow only auxiliary aperture if                 * it exists.                 */                if (!(Block0Base = pATI->Block0Base))                {                    if (pVideo)                    {                        /* Check tail end of linear (8MB or 4MB) aperture */                        if ((pATI->Block0Base = pVideo->memBase[0]))                        {                            pATI->Block0Base += 0x007FFC00U;                            ATIMach64Map(pScreenInfo->scrnIndex, pATI);                            if (pATI->pBlock[0])                                break;                            pATI->Block0Base -= 0x00400000U;                            ATIMach64Map(pScreenInfo->scrnIndex, pATI);                            if (pATI->pBlock[0])                                break;                        }                    }                    /* Check VGA MMIO aperture */                    pATI->Block0Base = 0x000BFC00U;                }                ATIMach64Map(pScreenInfo->scrnIndex, pATI);            } while (0);            pATI->Block0Base = Block0Base;#ifdef AVOID_CPIO            if (!pATI->pBlock[0])            {                xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,                    "Unable to mmap() adapter registers.\n");                return FALSE;            }#endif /* AVOID_CPIO */            pATIHW->crtc_gen_cntl = inr(CRTC_GEN_CNTL);            if (!(pATIHW->crtc_gen_cntl & CRTC_EN) &&                (pATI->Chip >= ATI_CHIP_264CT))            {                xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,                    "Adapter has not been initialised.\n");                ATIPrintNoiseIfRequested(pATI, BIOS, BIOSSize);                ATIUnmapApertures(pScreenInfo->scrnIndex, pATI);                return FALSE;            }#ifdef AVOID_CPIO            if (!(pATIHW->crtc_gen_cntl & CRTC_EXT_DISP_EN))            {                xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,                    "Adapters found to be in VGA mode on server entry are not"                    " supported by the MMIO-only version of this driver.\n");                ATIPrintNoiseIfRequested(pATI, BIOS, BIOSSize);                ATIUnmapApertures(pScreenInfo->scrnIndex, pATI);                return FALSE;            }#endif /* AVOID_CPIO */            pATIHW->mem_cntl = inr(MEM_CNTL);            if (pATI->Chip < ATI_CHIP_264VTB)            {                pATI->VideoRAM =                    videoRamSizes[GetBits(pATIHW->mem_cntl, CTL_MEM_SIZE) + 2];            }            else            {                pATI->nFIFOEntries =            /* Don't care */                    (unsigned int)(-1) >> 1;                IOValue = GetBits(pATIHW->mem_cntl, CTL_MEM_SIZEB);                if (IOValue < 8)                    pATI->VideoRAM = (IOValue + 1) * 512;                else if (IOValue < 12)                    pATI->VideoRAM = (IOValue - 3) * 1024;                else                    pATI->VideoRAM = (IOValue - 7) * 2048;            }            pATI->DAC = GetBits(inr(DAC_CNTL), DAC_TYPE);            IOValue = inr(CONFIG_STATUS64_0);            if (pATI->Chip >= ATI_CHIP_264CT)            {                pATI->MemoryType = GetBits(IOValue, CFG_MEM_TYPE_T);                /* Get LCD panel id */                if (pATI->Chip == ATI_CHIP_264LT)                {                    pATI->LCDPanelID = GetBits(IOValue, CFG_PANEL_ID);                    pATIHW->horz_stretching = inr(HORZ_STRETCHING);                    pATIHW->vert_stretching = inr(VERT_STRETCHING);                    pATIHW->lcd_gen_ctrl = inr(LCD_GEN_CTRL);                }                else if ((pATI->Chip == ATI_CHIP_264LTPRO) ||                         (pATI->Chip == ATI_CHIP_264XL) ||                         (pATI->Chip == ATI_CHIP_MOBILITY))                {                    pATI->LCDPanelID = GetBits(IOValue, CFG_PANEL_ID);                    pATIHW->lcd_index = inr(LCD_INDEX);                    pATIHW->horz_stretching =                        ATIMach64GetLCDReg(LCD_HORZ_STRETCHING);                    pATI->LCDHorizontal =                        GetBits(pATIHW->horz_stretching, HORZ_PANEL_SIZE);                    if (pATI->LCDHorizontal)                    {                        if (pATI->LCDHorizontal == MaxBits(HORZ_PANEL_SIZE))                            pATI->LCDHorizontal = 0;                        else                            pATI->LCDHorizontal =                                (pATI->LCDHorizontal + 1) << 3;                    }                    pATIHW->ext_vert_stretch =                        ATIMach64GetLCDReg(LCD_EXT_VERT_STRETCH);                    pATI->LCDVertical =                        GetBits(pATIHW->ext_vert_stretch, VERT_PANEL_SIZE);                    if (pATI->LCDVertical)                    {                        if (pATI->LCDVertical == MaxBits(VERT_PANEL_SIZE))                            pATI->LCDVertical = 0;                        else                            pATI->LCDVertical++;                    }                    pATIHW->vert_stretching =                        ATIMach64GetLCDReg(LCD_VERT_STRETCHING);                    pATIHW->lcd_gen_ctrl = ATIMach64GetLCDReg(LCD_GEN_CNTL);                    outr(LCD_INDEX, pATIHW->lcd_index);                }                /*                 * Don't bother with panel support if it hasn't been previously                 * enabled.                 */                if ((pATI->LCDPanelID >= 0) &&                    !(pATIHW->horz_stretching & HORZ_STRETCH_EN) &&                    !(pATIHW->vert_stretching & VERT_STRETCH_EN) &&                    !(pATIHW->lcd_gen_ctrl & LCD_ON))                {                    /*                     * At this point, if an XL or Mobility BIOS hasn't set                     * panel dimensions, then there is no panel.  Otherwise,                     * keep any panel disabled to allow for modes greater than                     * the panel's dimensions.                     */                    if ((pATI->Chip >= ATI_CHIP_264XL) &&                        (!pATI->LCDHorizontal || !pATI->LCDVertical))                        pATI->LCDPanelID = -1;                    else                        pATI->OptionPanelDisplay = FALSE;                }            }            else            {                pATI->MemoryType = GetBits(IOValue, CFG_MEM_TYPE);                /* Factor in what the BIOS says the DAC is */                pATI->DAC = ATI_DAC(pATI->DAC,                    GetBits(inr(SCRATCH_REG1), BIOS_INIT_DAC_SUBTYPE));            }            /*             * RAMDAC types 0 & 1 for Mach64's are different than those for             * Mach32's.             */            if (pATI->DAC < ATI_DAC_ATI68875)                pATI->DAC += ATI_DAC_INTERNAL;            break;        default:            break;    }    /*     * For Mach64 adapters, pick up, from the BIOS, the type of programmable     * clock generator (if any), and various information about it.     */#ifndef AVOID_CPIO    if (pATI->Chip >= ATI_CHIP_88800GXC)#endif /* AVOID_CPIO */    {        CARD16 ClockDac;        /* Set up non-zero defaults */        pATI->ClockDescriptor = ATIClockDescriptors[ATI_CLOCK_FIXED];        pATI->ClockNumberToProgramme = -1;        ROMTable = BIOSWord(0x48U);        if ((ROMTable < 0x0002U) ||            (BIOSWord(ROMTable - 0x02U) < 0x0012U) ||            ((ROMTable + BIOSWord(ROMTable - 0x02U)) > BIOSSize))            ROMTable = 0;        if (ROMTable > 0)        {            ClockTable = BIOSWord(ROMTable + 0x10U);            if ((ClockTable + 0x20U) > BIOSSize)                ClockTable = 0;            if (BIOSWord(ROMTable - 0x02U) >= 0x0048U)            {                VideoTable = BIOSWord(ROMTable + 0x46U);                if ((VideoTable < 0x08U) ||                    (BIOSByte(VideoTable - 0x01U) < 0x08U) ||                    (BIOSByte(VideoTable - 0x02U) > 0x01U) ||                    ((VideoTable + BIOSByte(VideoTable - 0x01U)) > BIOSSize))                    VideoTable = 0;            }            if (BIOSWord(ROMTable - 0x02U) >= 0x004AU)            {                HardwareTable = BIOSWord(ROMTable + 0x48U);                if (((HardwareTable + 0x08U) <= BIOSSize) &&                    !memcmp(BIOS + HardwareTable, "$ATI", 4))                    pATI->I2CType = BIOSByte(HardwareTable + 0x06U) & 0x0FU;                else                    HardwareTable = 0;            }        }        if (ClockTable > 0)        {            FrequencyTable = BIOSWord(ClockTable - 0x02U);            if ((FrequencyTable > 0) &&                ((FrequencyTable + 0x20U) <= BIOSSize))            {                for (i = 0;  i < 16;  i++)                {                    pATI->BIOSClocks[i] = BIOSWord(FrequencyTable);                    FrequencyTable += 2;                }            }            pATI->ProgrammableClock = BIOSByte(ClockTable);            pATI->ClockNumberToProgramme = BIOSByte(ClockTable + 0x06U);            switch (BIOSWord(ClockTable + 0x08U) / 10)            {                case 143:                    pATI->ReferenceNumerator = 157500;                    pATI->ReferenceDenominator = 11;                    break;                case 286:                    pATI->ReferenceNumerator = 315000;                    pATI->ReferenceDenominator = 11;                    break;                default:                    pATI->ReferenceNumerator =                        BIOSWord(ClockTable + 0x08U) * 10;                    pATI->ReferenceDenominator = 1;                    break;            }        }        else        {            /*             * Compensate for BIOS absence.  Note that the reference             * frequency has already been set by option processing.             */            if ((pATI->DAC & ~0x0FU) == ATI_DAC_INTERNAL)            {                pATI->ProgrammableClock = ATI_CLOCK_INTERNAL;            }            else switch (pATI->DAC)            {                case ATI_DAC_STG1703:                    pATI->ProgrammableClock = ATI_CLOCK_STG1703;                    break;                case ATI_DAC_CH8398:                    pATI->ProgrammableClock = ATI_CLOCK_CH8398;                    break;                case ATI_DAC_ATT20C408:                    pATI->ProgrammableClock = ATI_CLOCK_ATT20C408;                    break;                case ATI_DAC_IBMRGB514:                    pATI->ProgrammableClock = ATI_CLOCK_IBMRGB514;                    break;                default:        /* Provisional */                    pATI->ProgrammableClock = ATI_CLOCK_ICS2595;                    break;            }            /* This should be safe for all generators except IBM's RGB514 */            pATI->ClockNumberToProgramme = 3;        }        if ((pATI->ProgrammableClock > ATI_CLOCK_FIXED) &&            (pATI->ProgrammableClock < ATI_CLOCK_MAX))        {            /*

⌨️ 快捷键说明

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