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