/* * ATIMach32ChipID -- * * Set variables whose value is dependent upon an 68800's CHIP_ID register. */ void ATIMach32ChipID ( ATIPtr pATI ) { CARD16 IOValue = inw(CHIP_ID); pATI->ChipType = GetBits(IOValue, CHIP_CODE_0 | CHIP_CODE_1); pATI->ChipClass = GetBits(IOValue, CHIP_CLASS); pATI->ChipRevision = GetBits(IOValue, CHIP_REV); pATI->ChipRev = pATI->ChipRevision; if (IOValue == 0xFFFFU) IOValue = 0; switch (GetBits(IOValue, CHIP_CODE_0 | CHIP_CODE_1)) { case OldChipID('A', 'A'): pATI->Chip = ATI_CHIP_68800_3; break; case OldChipID('X', 'X'): pATI->Chip = ATI_CHIP_68800_6; break; case OldChipID('L', 'X'): pATI->Chip = ATI_CHIP_68800LX; break; case OldChipID('A', 'X'): pATI->Chip = ATI_CHIP_68800AX; break; default: pATI->Chip = ATI_CHIP_68800; break; } }
/* * ATIMach64ChipID -- * * Set variables whose value is dependent upon a Mach64's CONFIG_CHIP_ID * register. */ void ATIMach64ChipID ( ATIPtr pATI, const CARD16 ExpectedChipType ) { pATI->config_chip_id = inr(CONFIG_CHIP_ID); pATI->ChipType = GetBits(pATI->config_chip_id, CFG_CHIP_TYPE); pATI->ChipClass = GetBits(pATI->config_chip_id, CFG_CHIP_CLASS); pATI->ChipRev = GetBits(pATI->config_chip_id, CFG_CHIP_REV); pATI->ChipVersion = GetBits(pATI->config_chip_id, CFG_CHIP_VERSION); pATI->ChipFoundry = GetBits(pATI->config_chip_id, CFG_CHIP_FOUNDRY); pATI->ChipRevision = GetBits(pATI->config_chip_id, CFG_CHIP_REVISION); switch (pATI->ChipType) { case OldChipID('G', 'X'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'X'): switch (pATI->ChipRev) { case 0x00U: pATI->Chip = ATI_CHIP_88800GXC; break; case 0x01U: pATI->Chip = ATI_CHIP_88800GXD; break; case 0x02U: pATI->Chip = ATI_CHIP_88800GXE; break; case 0x03U: pATI->Chip = ATI_CHIP_88800GXF; break; default: pATI->Chip = ATI_CHIP_88800GX; break; } break; case OldChipID('C', 'X'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('C', 'X'): pATI->Chip = ATI_CHIP_88800CX; break; case OldChipID('C', 'T'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('C', 'T'): pATI->Chip = ATI_CHIP_264CT; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('E', 'T'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('E', 'T'): pATI->Chip = ATI_CHIP_264ET; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('V', 'T'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('V', 'T'): pATI->Chip = ATI_CHIP_264VT; pATI->BusType = ATI_BUS_PCI; /* Some early GT's are detected as VT's */ if (ExpectedChipType && (pATI->ChipType != ExpectedChipType)) { if (ExpectedChipType == NewChipID('G', 'T')) pATI->Chip = ATI_CHIP_264GT; else xf86Msg(X_WARNING, MACH64_NAME ": Mach64 chip type probe discrepancy" " detected: PCI=0x%04X; CHIP_ID=0x%04X.\n", ExpectedChipType, pATI->ChipType); } else if (pATI->ChipVersion) pATI->Chip = ATI_CHIP_264VTB; break; case OldChipID('G', 'T'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'T'): pATI->BusType = ATI_BUS_PCI; if (!pATI->ChipVersion) pATI->Chip = ATI_CHIP_264GT; else pATI->Chip = ATI_CHIP_264GTB; break; case OldChipID('V', 'U'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('V', 'U'): pATI->Chip = ATI_CHIP_264VT3; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('G', 'U'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'U'): pATI->Chip = ATI_CHIP_264GTDVD; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('L', 'G'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('L', 'G'): pATI->Chip = ATI_CHIP_264LT; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('V', 'V'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('V', 'V'): pATI->Chip = ATI_CHIP_264VT4; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('G', 'V'): case OldChipID('G', 'Y'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'V'): case NewChipID('G', 'Y'): pATI->Chip = ATI_CHIP_264GT2C; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('G', 'W'): case OldChipID('G', 'Z'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'W'): case NewChipID('G', 'Z'): pATI->Chip = ATI_CHIP_264GT2C; pATI->BusType = ATI_BUS_AGP; break; case OldChipID('G', 'I'): case OldChipID('G', 'P'): case OldChipID('G', 'Q'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'I'): case NewChipID('G', 'P'): case NewChipID('G', 'Q'): pATI->Chip = ATI_CHIP_264GTPRO; pATI->BusType = ATI_BUS_PCI; break; case OldChipID('G', 'B'): case OldChipID('G', 'D'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'B'): case NewChipID('G', 'D'): pATI->Chip = ATI_CHIP_264GTPRO; pATI->BusType = ATI_BUS_AGP; break; case OldChipID('L', 'I'): case OldChipID('L', 'P'): case OldChipID('L', 'Q'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('L', 'I'): case NewChipID('L', 'P'): case NewChipID('L', 'Q'): pATI->Chip = ATI_CHIP_264LTPRO; pATI->BusType = ATI_BUS_PCI; pATI->LCDVBlendFIFOSize = 800; break; case OldChipID('L', 'B'): case OldChipID('L', 'D'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('L', 'B'): case NewChipID('L', 'D'): pATI->Chip = ATI_CHIP_264LTPRO; pATI->BusType = ATI_BUS_AGP; pATI->LCDVBlendFIFOSize = 800; break; case OldChipID('G', 'L'): case OldChipID('G', 'O'): case OldChipID('G', 'R'): case OldChipID('G', 'S'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'L'): case NewChipID('G', 'O'): case NewChipID('G', 'R'): case NewChipID('G', 'S'): pATI->Chip = ATI_CHIP_264XL; pATI->BusType = ATI_BUS_PCI; pATI->LCDVBlendFIFOSize = 1024; break; case OldChipID('G', 'M'): case OldChipID('G', 'N'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('G', 'M'): case NewChipID('G', 'N'): pATI->Chip = ATI_CHIP_264XL; pATI->BusType = ATI_BUS_AGP; pATI->LCDVBlendFIFOSize = 1024; break; case OldChipID('L', 'R'): case OldChipID('L', 'S'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('L', 'R'): case NewChipID('L', 'S'): pATI->Chip = ATI_CHIP_MOBILITY; pATI->BusType = ATI_BUS_PCI; pATI->LCDVBlendFIFOSize = 1024; break; case OldChipID('L', 'M'): case OldChipID('L', 'N'): pATI->ChipType = OldToNewChipID(pATI->ChipType); case NewChipID('L', 'M'): case NewChipID('L', 'N'): pATI->Chip = ATI_CHIP_MOBILITY; pATI->BusType = ATI_BUS_AGP; pATI->LCDVBlendFIFOSize = 1024; break; default: pATI->Chip = ATI_CHIP_Mach64; break; } }
/* * ATIChipID -- * * This returns the ATI_CHIP_* value (generally) associated with a particular * ChipID/ChipRev combination. */ ATIChipType ATIChipID ( const CARD16 ChipID, const CARD8 ChipRev ) { switch (ChipID) { case OldChipID('A', 'A'): case NewChipID('A', 'A'): return ATI_CHIP_68800_3; case OldChipID('X', 'X'): case NewChipID('X', 'X'): return ATI_CHIP_68800_6; case OldChipID('L', 'X'): return ATI_CHIP_68800LX; case OldChipID('A', 'X'): case NewChipID('A', 'X'): return ATI_CHIP_68800AX; case OldChipID('G', 'X'): case NewChipID('G', 'X'): switch (ChipRev) { case 0x00U: return ATI_CHIP_88800GXC; case 0x01U: return ATI_CHIP_88800GXD; case 0x02U: return ATI_CHIP_88800GXE; case 0x03U: return ATI_CHIP_88800GXF; default: return ATI_CHIP_88800GX; } case OldChipID('C', 'X'): case NewChipID('C', 'X'): return ATI_CHIP_88800CX; case OldChipID('C', 'T'): case NewChipID('C', 'T'): return ATI_CHIP_264CT; case OldChipID('E', 'T'): case NewChipID('E', 'T'): return ATI_CHIP_264ET; case OldChipID('V', 'T'): case NewChipID('V', 'T'): /* For simplicity, ignore ChipID discrepancy that can occur here */ if (!(ChipRev & GetBits(CFG_CHIP_VERSION, CFG_CHIP_REV))) return ATI_CHIP_264VT; return ATI_CHIP_264VTB; case OldChipID('G', 'T'): case NewChipID('G', 'T'): if (!(ChipRev & GetBits(CFG_CHIP_VERSION, CFG_CHIP_REV))) return ATI_CHIP_264GT; return ATI_CHIP_264GTB; case OldChipID('V', 'U'): case NewChipID('V', 'U'): return ATI_CHIP_264VT3; case OldChipID('G', 'U'): case NewChipID('G', 'U'): return ATI_CHIP_264GTDVD; case OldChipID('L', 'G'): case NewChipID('L', 'G'): return ATI_CHIP_264LT; case OldChipID('V', 'V'): case NewChipID('V', 'V'): return ATI_CHIP_264VT4; case OldChipID('G', 'V'): case NewChipID('G', 'V'): case OldChipID('G', 'W'): case NewChipID('G', 'W'): case OldChipID('G', 'Y'): case NewChipID('G', 'Y'): case OldChipID('G', 'Z'): case NewChipID('G', 'Z'): return ATI_CHIP_264GT2C; case OldChipID('G', 'B'): case NewChipID('G', 'B'): case OldChipID('G', 'D'): case NewChipID('G', 'D'): case OldChipID('G', 'I'): case NewChipID('G', 'I'): case OldChipID('G', 'P'): case NewChipID('G', 'P'): case OldChipID('G', 'Q'): case NewChipID('G', 'Q'): return ATI_CHIP_264GTPRO; case OldChipID('L', 'B'): case NewChipID('L', 'B'): case OldChipID('L', 'D'): case NewChipID('L', 'D'): case OldChipID('L', 'I'): case NewChipID('L', 'I'): case OldChipID('L', 'P'): case NewChipID('L', 'P'): case OldChipID('L', 'Q'): case NewChipID('L', 'Q'): return ATI_CHIP_264LTPRO; case OldChipID('G', 'L'): case NewChipID('G', 'L'): case OldChipID('G', 'M'): case NewChipID('G', 'M'): case OldChipID('G', 'N'): case NewChipID('G', 'N'): case OldChipID('G', 'O'): case NewChipID('G', 'O'): case OldChipID('G', 'R'): case NewChipID('G', 'R'): case OldChipID('G', 'S'): case NewChipID('G', 'S'): return ATI_CHIP_264XL; case OldChipID('L', 'M'): case NewChipID('L', 'M'): case OldChipID('L', 'N'): case NewChipID('L', 'N'): case OldChipID('L', 'R'): case NewChipID('L', 'R'): case OldChipID('L', 'S'): case NewChipID('L', 'S'): return ATI_CHIP_MOBILITY; case NewChipID('R', 'E'): case NewChipID('R', 'F'): case NewChipID('R', 'G'): case NewChipID('S', 'K'): case NewChipID('S', 'L'): case NewChipID('S', 'M'): /* "SN" is listed as ATI_CHIP_RAGE128_4X in ATI docs */ case NewChipID('S', 'N'): return ATI_CHIP_RAGE128GL; case NewChipID('R', 'K'): case NewChipID('R', 'L'): /* * ATI documentation lists SE/SF/SG under both ATI_CHIP_RAGE128VR * and ATI_CHIP_RAGE128_4X, and lists SH/SK/SL under Rage 128 4X only. * I'm stuffing them here for now until this can be clarified as ATI * documentation doesn't mention their details. <*****@*****.**> */ case NewChipID('S', 'E'): case NewChipID('S', 'F'): case NewChipID('S', 'G'): case NewChipID('S', 'H'): return ATI_CHIP_RAGE128VR; /* case NewChipID('S', 'H'): */ /* case NewChipID('S', 'K'): */ /* case NewChipID('S', 'L'): */ /* case NewChipID('S', 'N'): */ /* return ATI_CHIP_RAGE128_4X; */ case NewChipID('P', 'A'): case NewChipID('P', 'B'): case NewChipID('P', 'C'): case NewChipID('P', 'D'): case NewChipID('P', 'E'): case NewChipID('P', 'F'): return ATI_CHIP_RAGE128PROGL; case NewChipID('P', 'G'): case NewChipID('P', 'H'): case NewChipID('P', 'I'): case NewChipID('P', 'J'): case NewChipID('P', 'K'): case NewChipID('P', 'L'): case NewChipID('P', 'M'): case NewChipID('P', 'N'): case NewChipID('P', 'O'): case NewChipID('P', 'P'): case NewChipID('P', 'Q'): case NewChipID('P', 'R'): case NewChipID('P', 'S'): case NewChipID('P', 'T'): case NewChipID('P', 'U'): case NewChipID('P', 'V'): case NewChipID('P', 'W'): case NewChipID('P', 'X'): return ATI_CHIP_RAGE128PROVR; case NewChipID('T', 'F'): case NewChipID('T', 'L'): case NewChipID('T', 'R'): case NewChipID('T', 'S'): case NewChipID('T', 'T'): case NewChipID('T', 'U'): return ATI_CHIP_RAGE128PROULTRA; case NewChipID('L', 'E'): case NewChipID('L', 'F'): /* * "LK" and "LL" are not in any ATI documentation I can find * - mharris */ case NewChipID('L', 'K'): case NewChipID('L', 'L'): return ATI_CHIP_RAGE128MOBILITY3; case NewChipID('M', 'F'): case NewChipID('M', 'L'): return ATI_CHIP_RAGE128MOBILITY4; case NewChipID('Q', 'D'): case NewChipID('Q', 'E'): case NewChipID('Q', 'F'): case NewChipID('Q', 'G'): return ATI_CHIP_RADEON; case NewChipID('Q', 'Y'): case NewChipID('Q', 'Z'): return ATI_CHIP_RADEONVE; case NewChipID('L', 'Y'): case NewChipID('L', 'Z'): return ATI_CHIP_RADEONMOBILITY6; case NewChipID('A', '6'): case NewChipID('C', '6'): return ATI_CHIP_RS100; case NewChipID('A', '7'): case NewChipID('C', '7'): return ATI_CHIP_RS200; case NewChipID('D', '7'): case NewChipID('B', '7'): return ATI_CHIP_RS250; case NewChipID('L', 'W'): case NewChipID('L', 'X'): return ATI_CHIP_RADEONMOBILITY7; case NewChipID('Q', 'H'): case NewChipID('Q', 'I'): case NewChipID('Q', 'J'): case NewChipID('Q', 'K'): case NewChipID('Q', 'L'): case NewChipID('Q', 'M'): case NewChipID('Q', 'N'): case NewChipID('Q', 'O'): case NewChipID('Q', 'h'): case NewChipID('Q', 'i'): case NewChipID('Q', 'j'): case NewChipID('Q', 'k'): case NewChipID('Q', 'l'): case NewChipID('B', 'B'): return ATI_CHIP_R200; case NewChipID('Q', 'W'): case NewChipID('Q', 'X'): return ATI_CHIP_RV200; case NewChipID('I', 'f'): case NewChipID('I', 'g'): return ATI_CHIP_RV250; case NewChipID('L', 'd'): case NewChipID('L', 'f'): case NewChipID('L', 'g'): return ATI_CHIP_RADEONMOBILITY9; case NewChipID('X', '4'): case NewChipID('X', '5'): return ATI_CHIP_RS300; case NewChipID('Y', '\''): case NewChipID('Y', 'a'): case NewChipID('Y', 'b'): case NewChipID('Y', 'd'): return ATI_CHIP_RV280; case NewChipID('\\', 'a'): case NewChipID('\\', 'c'): return ATI_CHIP_RADEONMOBILITY9PLUS; case NewChipID('A', 'D'): case NewChipID('A', 'E'): case NewChipID('A', 'F'): case NewChipID('A', 'G'): case NewChipID('N', 'D'): case NewChipID('N', 'E'): case NewChipID('N', 'F'): case NewChipID('N', 'G'): return ATI_CHIP_R300; case NewChipID('A', 'H'): case NewChipID('A', 'I'): case NewChipID('A', 'J'): case NewChipID('A', 'K'): case NewChipID('N', 'H'): case NewChipID('N', 'I'): case NewChipID('N', 'K'): return ATI_CHIP_R350; case NewChipID('A', 'P'): case NewChipID('A', 'Q'): case NewChipID('A', 'R'): case NewChipID('A', 'S'): case NewChipID('A', 'T'): case NewChipID('A', 'V'): case NewChipID('N', 'P'): case NewChipID('N', 'Q'): case NewChipID('N', 'R'): case NewChipID('N', 'S'): case NewChipID('N', 'T'): case NewChipID('N', 'V'): return ATI_CHIP_RV350; case NewChipID('N', 'J'): return ATI_CHIP_R360; case NewChipID('H', 'D'): return ATI_CHIP_HDTV; default: /* * Treat anything else as an unknown Radeon. Please keep the above * up-to-date however, as it serves as a central chip list. */ return ATI_CHIP_Radeon; } }