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

📄 atipreinit.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
             * Graphics PRO TURBO 1600's are unusual in that an ICS2595 is used             * to generate clocks for VGA modes, and an IBM RGB514 is used for             * accelerator modes.             */            if ((pATI->ProgrammableClock == ATI_CLOCK_ICS2595) &&                (pATI->DAC == ATI_DAC_IBMRGB514) &&                (pScreenInfo->depth >= 8) &&                (pATI->Chipset == ATI_CHIPSET_ATI))                pATI->ProgrammableClock = ATI_CLOCK_IBMRGB514;            pATI->ClockDescriptor =                ATIClockDescriptors[pATI->ProgrammableClock];        }        ClockDac = pATI->DAC;        switch (pATI->ProgrammableClock)        {            case ATI_CLOCK_ICS2595:                /*                 * Pick up reference divider (43 or 46) appropriate to the chip                 * revision level.                 */                if (ClockTable > 0)                    pATI->ClockDescriptor.MinM =                        pATI->ClockDescriptor.MaxM =                            BIOSWord(ClockTable + 0x0AU);                else if (!xf86NameCmp(pGDev->clockchip, "ATI 18818-0"))                    pATI->ClockDescriptor.MinM =                        pATI->ClockDescriptor.MaxM = 43;                else if (!xf86NameCmp(pGDev->clockchip, "ATI 18818-1"))                    pATI->ClockDescriptor.MinM =                        pATI->ClockDescriptor.MaxM = 46;                else                    pATI->ProgrammableClock = ATI_CLOCK_UNKNOWN;                break;            case ATI_CLOCK_STG1703:                /* This one's also a RAMDAC */                ClockDac = ATI_DAC_STG1703;                break;            case ATI_CLOCK_CH8398:                /* This one's also a RAMDAC */                ClockDac = ATI_DAC_CH8398;                break;            case ATI_CLOCK_INTERNAL:                /*                 * The reference divider has already been programmed by BIOS                 * initialisation.  Because, there is only one reference                 * divider for all generated frequencies (including MCLK), it                 * cannot be changed without reprogramming all clocks every                 * time one of them needs a different reference divider.                 *                 * Besides, it's not a good idea to change the reference                 * divider.  BIOS initialisation sets it to a value that                 * effectively prevents generating frequencies beyond the                 * graphics controller's tolerance.                 */                pATI->ClockDescriptor.MinM = pATI->ClockDescriptor.MaxM =                    ATIMach64GetPLLReg(PLL_REF_DIV);                /* The DAC is also integrated */                if ((pATI->DAC & ~0x0FU) != ATI_DAC_INTERNAL)                    ClockDac = ATI_DAC_INTERNAL;                break;            case ATI_CLOCK_ATT20C408:                /* This one's also a RAMDAC */                ClockDac = ATI_DAC_ATT20C408;                break;            case ATI_CLOCK_IBMRGB514:                /* This one's also a RAMDAC */                ClockDac = ATI_DAC_IBMRGB514;                pATI->ClockNumberToProgramme = 7;                break;            default:                break;        }        /*         * We now have up to two indications of what RAMDAC the adapter uses.         * They should be the same.  The following test and corresponding         * action are under construction.         */        if (pATI->DAC != ClockDac)        {            xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,                       "Mach64 RAMDAC probe discrepancy detected:\n"                       "  DAC=0x%02X;  ClockDac=0x%02X.\n",                       pATI->DAC, ClockDac);            if (pATI->DAC == ATI_DAC_IBMRGB514)            {                pATI->ProgrammableClock = ATI_CLOCK_IBMRGB514;                pATI->ClockDescriptor =                    ATIClockDescriptors[ATI_CLOCK_IBMRGB514];                pATI->ClockNumberToProgramme = 7;            }            else            {                pATI->DAC = ClockDac;   /* For now */            }        }        /*         * Pick up multimedia information, which will be at different         * displacements depending on table revision.         */        if (VideoTable > 0)        {            switch (BIOSByte(VideoTable - 0x02U))            {                case 0x00U:                    pATI->Tuner = BIOSByte(VideoTable) & 0x1FU;                    /*                     * XXX  The VideoTable[1] byte is known to have been                     *      omitted in LTPro and Mobility BIOS'es.  Any others?                     */                    switch (pATI->Chip)                    {                        case ATI_CHIP_264LTPRO:                        case ATI_CHIP_MOBILITY:                            pATI->Decoder =                                BIOSByte(VideoTable + 0x01U) & 0x07U;                            pATI->Audio =                                BIOSByte(VideoTable + 0x02U) & 0x0FU;                            break;                        default:                            pATI->Decoder =                                BIOSByte(VideoTable + 0x02U) & 0x07U;                            pATI->Audio =                                BIOSByte(VideoTable + 0x03U) & 0x0FU;                            break;                    }                    break;                case 0x01U:                    pATI->Tuner = BIOSByte(VideoTable) & 0x1FU;                    pATI->Audio = BIOSByte(VideoTable + 0x01U) & 0x0FU;                    pATI->Decoder = BIOSByte(VideoTable + 0x05U) & 0x0FU;                    break;                default:                    break;            }        }        /* Determine panel dimensions */        if (pATI->LCDPanelID >= 0)        {            LCDTable = BIOSWord(0x78U);            if ((LCDTable + BIOSByte(LCDTable + 5)) > BIOSSize)                LCDTable = 0;            if (LCDTable > 0)            {                LCDPanelInfo = BIOSWord(LCDTable + 0x0AU);                if (((LCDPanelInfo + 0x1DU) > BIOSSize) ||                    ((BIOSByte(LCDPanelInfo) != pATI->LCDPanelID) &&                     (pATI->LCDPanelID || (BIOSByte(LCDPanelInfo) > 0x1FU) ||                      (pATI->Chip <= ATI_CHIP_264LTPRO))))                    LCDPanelInfo = 0;            }            if (!LCDPanelInfo)            {                /*                 * Scan BIOS for panel info table.                 */                for (i = 0;  i <= (int)(BIOSSize - 0x1DU);  i++)                {                    /* Look for panel ID ... */                    if ((BIOSByte(i) != pATI->LCDPanelID) &&                        (pATI->LCDPanelID || (BIOSByte(i) > 0x1FU) ||                         (pATI->Chip <= ATI_CHIP_264LTPRO)))                        continue;                    /* ... followed by 24-byte panel model name ... */                    for (j = 0;  j < 24;  j++)                    {                        if ((CARD8)(BIOSByte(i + j + 1) - 0x20U) > 0x5FU)                        {                            i += j;                            goto NextBIOSByte;                        }                    }                    /* ... verify panel width ... */                    if (pATI->LCDHorizontal &&                        (pATI->LCDHorizontal != BIOSWord(i + 0x19U)))                        continue;                    /* ... and verify panel height */                    if (pATI->LCDVertical &&                        (pATI->LCDVertical != BIOSWord(i + 0x1BU)))                        continue;                    if (LCDPanelInfo)                    {                        /*                         * More than one possibility, but don't care if all                         * tables describe panels of the same size.                         */                        if ((BIOSByte(LCDPanelInfo + 0x19U) ==                             BIOSByte(i + 0x19U)) &&                            (BIOSByte(LCDPanelInfo + 0x1AU) ==                             BIOSByte(i + 0x1AU)) &&                            (BIOSByte(LCDPanelInfo + 0x1BU) ==                             BIOSByte(i + 0x1BU)) &&                            (BIOSByte(LCDPanelInfo + 0x1CU) ==                             BIOSByte(i + 0x1CU)))                            continue;                        LCDPanelInfo = 0;                        break;                    }                    LCDPanelInfo = i;            NextBIOSByte:  ;                }            }            if (LCDPanelInfo > 0)            {                pATI->LCDPanelID = BIOSByte(LCDPanelInfo);                pATI->LCDHorizontal = BIOSWord(LCDPanelInfo + 0x19U);                pATI->LCDVertical = BIOSWord(LCDPanelInfo + 0x1BU);            }        }        xf86DrvMsgVerb(pScreenInfo->scrnIndex, X_INFO, 3,            "BIOS Data:  BIOSSize=0x%04X, ROMTable=0x%04X.\n",            BIOSSize, ROMTable);        xf86DrvMsgVerb(pScreenInfo->scrnIndex, X_INFO, 3,            "BIOS Data:  ClockTable=0x%04X, FrequencyTable=0x%04X.\n",            ClockTable, FrequencyTable);        xf86DrvMsgVerb(pScreenInfo->scrnIndex, X_INFO, 3,            "BIOS Data:  LCDTable=0x%04X, LCDPanelInfo=0x%04X.\n",            LCDTable, LCDPanelInfo);        xf86DrvMsgVerb(pScreenInfo->scrnIndex, X_INFO, 3,            "BIOS Data:  VideoTable=0x%04X, HardwareTable=0x%04X.\n",            VideoTable, HardwareTable);        xf86DrvMsgVerb(pScreenInfo->scrnIndex, X_INFO, 3,            "BIOS Data:  I2CType=0x%02X, Tuner=0x%02X, Decoder=0x%02X,"            " Audio=0x%02X.\n",            pATI->I2CType, pATI->Tuner, pATI->Decoder, pATI->Audio);    }    ATIUnlock(pATI);            /* Unlock registers */#ifndef AVOID_CPIO    /* Sometimes, the BIOS lies about the chip */    if ((pATI->Chip >= ATI_CHIP_28800_4) && (pATI->Chip <= ATI_CHIP_28800_6))    {        IOValue = GetBits(ATIGetExtReg(0xAAU), 0x0FU) +            (ATI_CHIP_28800_4 - 4);        if ((IOValue <= ATI_CHIP_28800_6) && (IOValue > pATI->Chip))            pATI->Chip = IOValue;    }#endif /* AVOID_CPIO */    /* Report what was found */    xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,        "%s graphics controller detected.\n", ATIChipNames[pATI->Chip]);#ifndef AVOID_CPIO    if ((pATI->Chip >= ATI_CHIP_68800) && (pATI->Chip != ATI_CHIP_68800_3))#endif /* AVOID_CPIO */    {        Message = Buffer + snprintf(Buffer, SizeOf(Buffer), "Chip type %04X",            pATI->ChipType);        if (!(pATI->ChipType & ~(CHIP_CODE_0 | CHIP_CODE_1)))            Message += snprintf(Message, Buffer + SizeOf(Buffer) - Message,                " (%c%c)",                GetBits(pATI->ChipType, CHIP_CODE_1) + 0x41U,                GetBits(pATI->ChipType, CHIP_CODE_0) + 0x41U);        else if ((pATI->ChipType & 0x4040U) == 0x4040U)            Message += snprintf(Message, Buffer + SizeOf(Buffer) - Message,                " \"%c%c\"",                GetByte(pATI->ChipType, 1), GetByte(pATI->ChipType, 0));        if ((pATI->Chip >= ATI_CHIP_264CT) && (pATI->Chip != ATI_CHIP_Mach64))            Message += snprintf(Message, Buffer + SizeOf(Buffer) - Message,                ", version %d, foundry %s",                pATI->ChipVersion, ATIFoundryNames[pATI->ChipFoundry]);        xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,            "%s, class %d, revision 0x%02X.\n",            Buffer, pATI->ChipClass, pATI->ChipRevision);    }#ifndef AVOID_CPIO    if (pATI->Adapter >= ATI_ADAPTER_MACH8)#endif /* AVOID_CPIO */    {        Message = Buffer + snprintf(Buffer, SizeOf(Buffer),            "%s bus interface detected", ATIBusNames[pATI->BusType]);#ifndef AVOID_CPIO        if (pATI->Adapter >= ATI_ADAPTER_MACH64)        {            Message += snprintf(Message, Buffer + SizeOf(Buffer) - Message,                ";  %s I/O base is 0x%04lX",                (pATI->CPIODecoding == SPARSE_IO) ? "sparse" : "block",                pATI->CPIOBase);        }#endif /* AVOID_CPIO */        xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED, "%s.\n", Buffer);    }#ifndef AVOID_CPIO    if (pATI->CPIO_VGAWonder)        xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,            "VGA Wonder registers at I/O port 0x%04lX.\n",            pATI->CPIO_VGAWonder);    if (pATI->Coprocessor != ATI_CHIP_NONE)        xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,            "%s graphics accelerator detected,\n with %d kB of coprocessor"            " memory.\n",            ATIChipNames[pATI->Coprocessor], pATI->VideoRAM);#endif /* AVOID_CPIO */    xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,        "%s adapter detected.\n", ATIAdapterNames[pATI->Adapter]);    if (pATI->Chip >= ATI_CHIP_264GT)        xf86DrvMsg(pScreenInfo->scrnIndex, X_NOTICE,            "For information on using the multimedia capabilities\n\tof this"            " adapter, please see http://gatos.sf.net.\n");    if ((pATI->DAC & ~0x0FU) == ATI_DAC_INTERNAL)    {        xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,            "Internal RAMDAC (subtype %d) detected.\n", pATI->DAC & 0x0FU);    }    else    {        const SymTabRec *DAC;        for (DAC = ATIDACDescriptors;  ;  DAC++)        {            if (pATI->DAC == DAC->token)            {                xf86DrvMsg(pScreenInfo->scrnIndex, X_PROBED,                    "%s RAMDAC detected.\n", DAC->name);                break;            }            if (pATI->DAC < DAC->token)            {                xf86DrvMsgVerb(pScreenInfo->scrnIndex, X_WARNING, 0,                    "Unknown RAMDAC type 0x%02X detected.\n", pATI->DAC);                break;            }        }    }#ifdef AVOID_CPIO    if (!xf86LinearVidMem())    {        xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,            "A linear aperture is not available.\n");        ATILock(pATI);        ATIPrintNoiseIfRequested(pATI, BIOS, BIOSSize);        ATIUnmapApertures(pScreenInfo->scrnIndex, pATI);        return FALSE;

⌨️ 快捷键说明

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