📄 atiprobe.c
字号:
" not be enabled\n because it conflicts with" " another %s Mach64 at sparse I/O base" " 0x%04lX.\n", pVideo->bus, pVideo->device, pVideo->func, ATIBusNames[pATI->BusType], Mach64SparseIOBases[j]); break;#endif /* AVOID_NON_PCI */ default: /* Must be DoProbe */ if (!xf86CheckPciSlot(pVideo->bus, pVideo->device, pVideo->func)) continue; /* Possibly fix block I/O indicator */ if (PciReg & 0x00000004U) pciWriteLong(pPCI->tag, PCI_REG_USERCONFIG, PciReg & ~0x00000004U); xf86SetPciVideo(pVideo, MEM_IO); Chip = ATIChipID(pVideo->chipType, pVideo->chipRev); pATI = ATIMach64Probe(pVideo, Mach64SparseIOBases[j], SPARSE_IO, Chip); if (!pATI) { xf86Msg(X_WARNING, ATI_NAME ": PCI Mach64 in slot %d:%d:%d could" " not be detected!\n", pVideo->bus, pVideo->device, pVideo->func); } else { sprintf(Identifier, "Shared PCI Mach64 in slot %d:%d:%d", pVideo->bus, pVideo->device, pVideo->func); xf86MsgVerb(X_INFO, 3, ATI_NAME ": %s with sparse PIO base 0x%04lX" " detected.\n", Identifier, Mach64SparseIOBases[j]); AddAdapter(pATI); pATI->SharedAccelerator = TRUE; pATI->PCIInfo = pVideo; if (pATI->VGAAdapter != ATI_ADAPTER_NONE) ATIFindVGA(pVideo, &pVGA, &pATI, p8514, ProbeFlags); } xf86SetPciVideo(NULL, NONE); break; } }#else /* AVOID_CPIO */ for (i = 0; (pVideo = xf86PciVideoInfo[i++]); ) { if ((pVideo->vendor != PCI_VENDOR_ATI) || (pVideo->chipType == PCI_CHIP_MACH32) || pVideo->size[1]) continue; /* Check if this one has already been detected */ for (j = 0; j < nATIPtr; j++) { pATI = ATIPtrs[j]; if (pATI->PCIInfo == pVideo) goto SkipThisSlot; } if (!xf86CheckPciSlot(pVideo->bus, pVideo->device, pVideo->func)) continue; xf86SetPciVideo(pVideo, MEM_IO); Chip = ATIChipID(pVideo->chipType, pVideo->chipRev); /* The adapter's CPIO base is of little concern here */ pATI = ATIMach64Probe(pVideo, 0, SPARSE_IO, Chip); if (pATI) { sprintf(Identifier, "Shared PCI Mach64 in slot %d:%d:%d", pVideo->bus, pVideo->device, pVideo->func); xf86MsgVerb(X_INFO, 3, ATI_NAME ": %s with Block 0 base 0x%08lX detected.\n", Identifier, pATI->Block0Base); AddAdapter(pATI); pATI->SharedAccelerator = TRUE; pATI->PCIInfo = pVideo; } else { xf86Msg(X_WARNING, ATI_NAME ": PCI Mach64 in slot %d:%d:%d could not be" " detected!\n", pVideo->bus, pVideo->device, pVideo->func); } xf86SetPciVideo(NULL, NONE); SkipThisSlot:; }#endif /* AVOID_CPIO */ } /* Lastly, look for block I/O devices */ for (i = 0; (pVideo = xf86PciVideoInfo[i++]); ) { if ((pVideo->vendor != PCI_VENDOR_ATI) || (pVideo->chipType == PCI_CHIP_MACH32) || !pVideo->size[1]) continue; /* Check for Rage128's, Radeon's and later adapters */ Chip = ATIChipID(pVideo->chipType, pVideo->chipRev); if (Chip > ATI_CHIP_Mach64) { if (Chip <= ATI_CHIP_Rage128) DoRage128 = TRUE; else if (Chip <= ATI_CHIP_Radeon) DoRadeon = TRUE; continue; } if (!nATIGDev) continue; /* Check if this one has already been detected */ for (j = 0; j < nATIPtr; j++) { pATI = ATIPtrs[j]; if (pATI->CPIOBase == pVideo->ioBase[1]) goto SetPCIInfo; } if (!xf86CheckPciSlot(pVideo->bus, pVideo->device, pVideo->func)) continue; /* Probe for it */ xf86SetPciVideo(pVideo, MEM_IO); pATI = ATIMach64Probe(pVideo, pVideo->ioBase[1], BLOCK_IO, Chip); if (pATI) { sprintf(Identifier, "Shared PCI/AGP Mach64 in slot %d:%d:%d", pVideo->bus, pVideo->device, pVideo->func); xf86MsgVerb(X_INFO, 3, ATI_NAME ": %s detected.\n", Identifier); AddAdapter(pATI); pATI->SharedAccelerator = TRUE;#ifndef AVOID_CPIO if (pATI->VGAAdapter != ATI_ADAPTER_NONE) ATIFindVGA(pVideo, &pVGA, &pATI, p8514, ProbeFlags);#endif /* AVOID_CPIO */ } xf86SetPciVideo(NULL, NONE); if (!pATI) { xf86Msg(X_WARNING, ATI_NAME ": PCI/AGP Mach64 in slot %d:%d:%d could not be" " detected!\n", pVideo->bus, pVideo->device, pVideo->func); continue; } SetPCIInfo: pATI->PCIInfo = pVideo; } }#ifndef AVOID_CPIO /* * At this point, if there's a non-shareable VGA with its own framebuffer, * find out if it's an ATI VGA Wonder. */ do { if (!nATIGDev || !pVGA || (pVGA->VGAAdapter > ATI_ADAPTER_VGA)) break; /* If it has not been assigned to a coprocessor, keep track of it */ if (pVGA->Coprocessor == ATI_CHIP_NONE) AddAdapter(pVGA); /* * A VGA should have installed its int 10 vector. Use that to find the * VGA BIOS. If this fails, scan all legacy BIOS segments, in 512-byte * increments. */ if (xf86ReadBIOS(0U, 0x42U, BIOS, 2) != 2) goto NoVGAWonder; pATI = NULL; BIOSBase = 0; if (!(BIOS[0] & 0x1FU)) /* Otherwise there's no 512-byte alignment */ BIOSBase = ((BIOS[1] << 8) | BIOS[0]) << 4; /* Look for its BIOS */ for(; ; BIOSBase += 0x00000200U) { if (!BIOSBase) goto SkipBiosSegment; if (BIOSBase >= 0x000F8000U) goto NoVGAWonder; /* Skip over those that are already known */ for (i = 0; i < nATIPtr; i++) if (ATIPtrs[i]->BIOSBase == BIOSBase) goto SkipBiosSegment; /* Get first 80 bytes of video BIOS */ if (xf86ReadBIOS(BIOSBase, 0, BIOS, SizeOf(BIOS)) != SizeOf(BIOS)) goto NoVGAWonder; if ((BIOS[0x00U] != 0x55U) || (BIOS[0x01U] != 0xAAU)) goto SkipBiosSegment; if ((BIOS[0x1EU] == 'I') && (BIOS[0x1FU] == 'B') && (BIOS[0x20U] == 'M')) break; /* XXX Should PCI BIOS signature be checked for here ? */ if ((BIOS[0x20U] == 'P') && (BIOS[0x21U] == 'C') && (BIOS[0x22U] == 'I')) break; SkipBiosSegment: if (pATI) continue; pATI = pVGA; BIOSBase = 0x000C0000U - 0x00000200U; } pVGA->BIOSBase = BIOSBase; /* Look for the ATI signature string */ if (memcmp(BIOS + BIOSSignature, ATISignature, SignatureSize)) break; if (BIOS[0x40U] != '3') break; switch (BIOS[0x41U]) { case '1': /* This is a Mach8 or VGA Wonder adapter of some kind */ if ((BIOS[0x43U] >= '1') && (BIOS[0x43U] <= '6')) pVGA->Chip = BIOS[0x43U] - ('1' - ATI_CHIP_18800); switch (BIOS[0x43U]) { case '1': /* ATI_CHIP_18800 */ pVGA->VGAOffset = 0xB0U; pVGA->VGAAdapter = ATI_ADAPTER_V3; break; case '2': /* ATI_CHIP_18800_1 */ pVGA->VGAOffset = 0xB0U; if (BIOS[0x42U] & 0x10U) pVGA->VGAAdapter = ATI_ADAPTER_V5; else pVGA->VGAAdapter = ATI_ADAPTER_V4; break; case '3': /* ATI_CHIP_28800_2 */ case '4': /* ATI_CHIP_28800_4 */ case '5': /* ATI_CHIP_28800_5 */ case '6': /* ATI_CHIP_28800_6 */ pVGA->VGAOffset = 0xA0U; if (BIOS[0x44U] & 0x80U) pVGA->VGAAdapter = ATI_ADAPTER_XL; else pVGA->VGAAdapter = ATI_ADAPTER_PLUS; break; case 'a': /* A crippled Mach32 */ case 'b': case 'c': pVGA->VGAOffset = 0x80U; pVGA->VGAAdapter = ATI_ADAPTER_NONISA; ATIMach32ChipID(pVGA); ProbeWaitIdleEmpty(); if (inw(SUBSYS_STAT) != (CARD16)(-1)) pVGA->ChipHasSUBSYS_CNTL = TRUE; break;#if 0 case ' ': /* A crippled Mach64 */ pVGA->VGAOffset = 0x80U; pVGA->VGAAdapter = ATI_ADAPTER_NONISA; ATIMach64ChipID(pVGA, 0); break;#endif default: break; } if (pVGA->VGAAdapter == ATI_ADAPTER_NONE) break; /* Set VGA Wonder I/O port */ pVGA->CPIO_VGAWonder = BIOSWord(0x10U) & SPARSE_IO_PORT; if (!pVGA->CPIO_VGAWonder) pVGA->CPIO_VGAWonder = 0x01CEU; ATIVGAWonderProbe(NULL, pVGA, p8514, ProbeFlags); break;#if 0 case '2': pVGA->VGAOffset = 0xB0U; /* Presumably */ pVGA->VGAAdapter = ATI_ADAPTER_EGA_PLUS; break; case '3': pVGA->VGAOffset = 0xB0U; /* Presumably */ pVGA->VGAAdapter = ATI_ADAPTER_BASIC; break; case '?': /* A crippled Mach64 */ pVGA->VGAAdapter = ATI_ADAPTER_NONISA; ATIMach64ChipID(pVGA, 0); break;#endif default: break; } if (pVGA->Adapter <= ATI_ADAPTER_VGA) pVGA->Adapter = pVGA->VGAAdapter;NoVGAWonder:; } while (0);#endif /* AVOID_CPIO */ /* * Re-order list of detected devices so that the primary device is before * any other PCI device. */ for (i = 0; i < nATIPtr; i++) { if (!ATIPtrs[i]->PCIInfo) continue; for (j = i; j < nATIPtr; j++) { pATI = ATIPtrs[j]; if (!xf86IsPrimaryPci(pATI->PCIInfo)) continue; for (; j > i; j--) ATIPtrs[j] = ATIPtrs[j - 1]; ATIPtrs[j] = pATI; break; } break; } if (flags & PROBE_DETECT) { /* * No XF86Config information available, so use the default Chipset of * "ati", and as many device sections as there are adapters. */ for (i = 0; i < nATIPtr; i++) { pATI = ATIPtrs[i];#ifndef AVOID_CPIO if ((pATI->Adapter != ATI_ADAPTER_VGA) && ((pATI->Adapter != ATI_ADAPTER_8514A) || ((pATI->VGAAdapter != ATI_ADAPTER_VGA) && (pATI->VGAAdapter != ATI_ADAPTER_NONE))))#endif /* AVOID_CPIO */ { ProbeSuccess = TRUE; pGDev = xf86AddDeviceToConfigure(ATI_DRIVER_NAME, pATI->PCIInfo, ATI_CHIPSET_ATI); if (pGDev) { /* Fill in additional information */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -