📄 atipreinit.c
字号:
* 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 + -