132b578d3Smrg/* 232b578d3Smrg * Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org 332b578d3Smrg * 432b578d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its 532b578d3Smrg * documentation for any purpose is hereby granted without fee, provided that 632b578d3Smrg * the above copyright notice appear in all copies and that both that copyright 732b578d3Smrg * notice and this permission notice appear in supporting documentation, and 832b578d3Smrg * that the name of Marc Aurele La France not be used in advertising or 932b578d3Smrg * publicity pertaining to distribution of the software without specific, 1032b578d3Smrg * written prior permission. Marc Aurele La France makes no representations 1132b578d3Smrg * about the suitability of this software for any purpose. It is provided 1232b578d3Smrg * "as-is" without express or implied warranty. 1332b578d3Smrg * 1432b578d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1532b578d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO 1632b578d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1732b578d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1832b578d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1932b578d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2032b578d3Smrg * PERFORMANCE OF THIS SOFTWARE. 2132b578d3Smrg */ 2232b578d3Smrg 2332b578d3Smrg#ifdef HAVE_CONFIG_H 2432b578d3Smrg#include "config.h" 2532b578d3Smrg#endif 2632b578d3Smrg 2732b578d3Smrg#include "ati.h" 2832b578d3Smrg#include "atibus.h" 2932b578d3Smrg#include "atichip.h" 3032b578d3Smrg#include "atimach64io.h" 3132b578d3Smrg#include "atimach64version.h" 3232b578d3Smrg 3332b578d3Smrgconst char *ATIFoundryNames[] = 3432b578d3Smrg { "SGS", "NEC", "KCS", "UMC", "TSMC", "5", "6", "UMC" }; 3532b578d3Smrg 3632b578d3Smrg/* 3732b578d3Smrg * ATIMach64ChipID -- 3832b578d3Smrg * 3932b578d3Smrg * Set variables whose value is dependent upon a Mach64's CONFIG_CHIP_ID 4032b578d3Smrg * register. 4132b578d3Smrg */ 4232b578d3Smrgvoid 4332b578d3SmrgATIMach64ChipID 4432b578d3Smrg( 4532b578d3Smrg ATIPtr pATI, 4632b578d3Smrg const CARD16 ExpectedChipType 4732b578d3Smrg) 4832b578d3Smrg{ 4932b578d3Smrg pATI->config_chip_id = inr(CONFIG_CHIP_ID); 5032b578d3Smrg pATI->ChipType = GetBits(pATI->config_chip_id, CFG_CHIP_TYPE); 5132b578d3Smrg pATI->ChipClass = GetBits(pATI->config_chip_id, CFG_CHIP_CLASS); 5232b578d3Smrg pATI->ChipRev = GetBits(pATI->config_chip_id, CFG_CHIP_REV); 5332b578d3Smrg pATI->ChipVersion = GetBits(pATI->config_chip_id, CFG_CHIP_VERSION); 5432b578d3Smrg pATI->ChipFoundry = GetBits(pATI->config_chip_id, CFG_CHIP_FOUNDRY); 5532b578d3Smrg pATI->ChipRevision = GetBits(pATI->config_chip_id, CFG_CHIP_REVISION); 5632b578d3Smrg switch (pATI->ChipType) 5732b578d3Smrg { 5832b578d3Smrg case OldChipID('G', 'X'): 5932b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 6032b578d3Smrg case NewChipID('G', 'X'): 6132b578d3Smrg switch (pATI->ChipRev) 6232b578d3Smrg { 6332b578d3Smrg case 0x00U: 6432b578d3Smrg pATI->Chip = ATI_CHIP_88800GXC; 6532b578d3Smrg break; 6632b578d3Smrg 6732b578d3Smrg case 0x01U: 6832b578d3Smrg pATI->Chip = ATI_CHIP_88800GXD; 6932b578d3Smrg break; 7032b578d3Smrg 7132b578d3Smrg case 0x02U: 7232b578d3Smrg pATI->Chip = ATI_CHIP_88800GXE; 7332b578d3Smrg break; 7432b578d3Smrg 7532b578d3Smrg case 0x03U: 7632b578d3Smrg pATI->Chip = ATI_CHIP_88800GXF; 7732b578d3Smrg break; 7832b578d3Smrg 7932b578d3Smrg default: 8032b578d3Smrg pATI->Chip = ATI_CHIP_88800GX; 8132b578d3Smrg break; 8232b578d3Smrg } 8332b578d3Smrg break; 8432b578d3Smrg 8532b578d3Smrg case OldChipID('C', 'X'): 8632b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 8732b578d3Smrg case NewChipID('C', 'X'): 8832b578d3Smrg pATI->Chip = ATI_CHIP_88800CX; 8932b578d3Smrg break; 9032b578d3Smrg 9132b578d3Smrg case OldChipID('C', 'T'): 9232b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 9332b578d3Smrg case NewChipID('C', 'T'): 9432b578d3Smrg pATI->Chip = ATI_CHIP_264CT; 9532b578d3Smrg pATI->BusType = ATI_BUS_PCI; 9632b578d3Smrg break; 9732b578d3Smrg 9832b578d3Smrg case OldChipID('E', 'T'): 9932b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 10032b578d3Smrg case NewChipID('E', 'T'): 10132b578d3Smrg pATI->Chip = ATI_CHIP_264ET; 10232b578d3Smrg pATI->BusType = ATI_BUS_PCI; 10332b578d3Smrg break; 10432b578d3Smrg 10532b578d3Smrg case OldChipID('V', 'T'): 10632b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 10732b578d3Smrg case NewChipID('V', 'T'): 10832b578d3Smrg pATI->Chip = ATI_CHIP_264VT; 10932b578d3Smrg pATI->BusType = ATI_BUS_PCI; 11032b578d3Smrg /* Some early GT's are detected as VT's */ 11132b578d3Smrg if (ExpectedChipType && (pATI->ChipType != ExpectedChipType)) 11232b578d3Smrg { 11332b578d3Smrg if (ExpectedChipType == NewChipID('G', 'T')) 11432b578d3Smrg pATI->Chip = ATI_CHIP_264GT; 11532b578d3Smrg else 11632b578d3Smrg xf86Msg(X_WARNING, 11732b578d3Smrg MACH64_NAME ": Mach64 chip type probe discrepancy" 11832b578d3Smrg " detected: PCI=0x%04X; CHIP_ID=0x%04X.\n", 11932b578d3Smrg ExpectedChipType, pATI->ChipType); 12032b578d3Smrg } 12132b578d3Smrg else if (pATI->ChipVersion) 12232b578d3Smrg pATI->Chip = ATI_CHIP_264VTB; 12332b578d3Smrg break; 12432b578d3Smrg 12532b578d3Smrg case OldChipID('G', 'T'): 12632b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 12732b578d3Smrg case NewChipID('G', 'T'): 12832b578d3Smrg pATI->BusType = ATI_BUS_PCI; 12932b578d3Smrg if (!pATI->ChipVersion) 13032b578d3Smrg pATI->Chip = ATI_CHIP_264GT; 13132b578d3Smrg else 13232b578d3Smrg pATI->Chip = ATI_CHIP_264GTB; 13332b578d3Smrg break; 13432b578d3Smrg 13532b578d3Smrg case OldChipID('V', 'U'): 13632b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 13732b578d3Smrg case NewChipID('V', 'U'): 13832b578d3Smrg pATI->Chip = ATI_CHIP_264VT3; 13932b578d3Smrg pATI->BusType = ATI_BUS_PCI; 14032b578d3Smrg break; 14132b578d3Smrg 14232b578d3Smrg case OldChipID('G', 'U'): 14332b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 14432b578d3Smrg case NewChipID('G', 'U'): 14532b578d3Smrg pATI->Chip = ATI_CHIP_264GTDVD; 14632b578d3Smrg pATI->BusType = ATI_BUS_PCI; 14732b578d3Smrg break; 14832b578d3Smrg 14932b578d3Smrg case OldChipID('L', 'G'): 15032b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 15132b578d3Smrg case NewChipID('L', 'G'): 15232b578d3Smrg pATI->Chip = ATI_CHIP_264LT; 15332b578d3Smrg pATI->BusType = ATI_BUS_PCI; 15432b578d3Smrg break; 15532b578d3Smrg 15632b578d3Smrg case OldChipID('V', 'V'): 15732b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 15832b578d3Smrg case NewChipID('V', 'V'): 15932b578d3Smrg pATI->Chip = ATI_CHIP_264VT4; 16032b578d3Smrg pATI->BusType = ATI_BUS_PCI; 16132b578d3Smrg break; 16232b578d3Smrg 16332b578d3Smrg case OldChipID('G', 'V'): 16432b578d3Smrg case OldChipID('G', 'Y'): 16532b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 16632b578d3Smrg case NewChipID('G', 'V'): 16732b578d3Smrg case NewChipID('G', 'Y'): 16832b578d3Smrg pATI->Chip = ATI_CHIP_264GT2C; 16932b578d3Smrg pATI->BusType = ATI_BUS_PCI; 17032b578d3Smrg break; 17132b578d3Smrg 17232b578d3Smrg case OldChipID('G', 'W'): 17332b578d3Smrg case OldChipID('G', 'Z'): 17432b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 17532b578d3Smrg case NewChipID('G', 'W'): 17632b578d3Smrg case NewChipID('G', 'Z'): 17732b578d3Smrg pATI->Chip = ATI_CHIP_264GT2C; 17832b578d3Smrg pATI->BusType = ATI_BUS_AGP; 17932b578d3Smrg break; 18032b578d3Smrg 18132b578d3Smrg case OldChipID('G', 'I'): 18232b578d3Smrg case OldChipID('G', 'P'): 18332b578d3Smrg case OldChipID('G', 'Q'): 18432b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 18532b578d3Smrg case NewChipID('G', 'I'): 18632b578d3Smrg case NewChipID('G', 'P'): 18732b578d3Smrg case NewChipID('G', 'Q'): 18832b578d3Smrg pATI->Chip = ATI_CHIP_264GTPRO; 18932b578d3Smrg pATI->BusType = ATI_BUS_PCI; 19032b578d3Smrg break; 19132b578d3Smrg 19232b578d3Smrg case OldChipID('G', 'B'): 19332b578d3Smrg case OldChipID('G', 'D'): 19432b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 19532b578d3Smrg case NewChipID('G', 'B'): 19632b578d3Smrg case NewChipID('G', 'D'): 19732b578d3Smrg pATI->Chip = ATI_CHIP_264GTPRO; 19832b578d3Smrg pATI->BusType = ATI_BUS_AGP; 19932b578d3Smrg break; 20032b578d3Smrg 20132b578d3Smrg case OldChipID('L', 'I'): 20232b578d3Smrg case OldChipID('L', 'P'): 20332b578d3Smrg case OldChipID('L', 'Q'): 20432b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 20532b578d3Smrg case NewChipID('L', 'I'): 20632b578d3Smrg case NewChipID('L', 'P'): 20732b578d3Smrg case NewChipID('L', 'Q'): 20832b578d3Smrg pATI->Chip = ATI_CHIP_264LTPRO; 20932b578d3Smrg pATI->BusType = ATI_BUS_PCI; 21032b578d3Smrg pATI->LCDVBlendFIFOSize = 800; 21132b578d3Smrg break; 21232b578d3Smrg 21332b578d3Smrg case OldChipID('L', 'B'): 21432b578d3Smrg case OldChipID('L', 'D'): 21532b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 21632b578d3Smrg case NewChipID('L', 'B'): 21732b578d3Smrg case NewChipID('L', 'D'): 21832b578d3Smrg pATI->Chip = ATI_CHIP_264LTPRO; 21932b578d3Smrg pATI->BusType = ATI_BUS_AGP; 22032b578d3Smrg pATI->LCDVBlendFIFOSize = 800; 22132b578d3Smrg break; 22232b578d3Smrg 22332b578d3Smrg case OldChipID('G', 'L'): 22432b578d3Smrg case OldChipID('G', 'O'): 22532b578d3Smrg case OldChipID('G', 'R'): 22632b578d3Smrg case OldChipID('G', 'S'): 22732b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 22832b578d3Smrg case NewChipID('G', 'L'): 22932b578d3Smrg case NewChipID('G', 'O'): 23032b578d3Smrg case NewChipID('G', 'R'): 23132b578d3Smrg case NewChipID('G', 'S'): 23232b578d3Smrg pATI->Chip = ATI_CHIP_264XL; 23332b578d3Smrg pATI->BusType = ATI_BUS_PCI; 23432b578d3Smrg pATI->LCDVBlendFIFOSize = 1024; 23532b578d3Smrg break; 23632b578d3Smrg 23732b578d3Smrg case OldChipID('G', 'M'): 23832b578d3Smrg case OldChipID('G', 'N'): 23932b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 24032b578d3Smrg case NewChipID('G', 'M'): 24132b578d3Smrg case NewChipID('G', 'N'): 24232b578d3Smrg pATI->Chip = ATI_CHIP_264XL; 24332b578d3Smrg pATI->BusType = ATI_BUS_AGP; 24432b578d3Smrg pATI->LCDVBlendFIFOSize = 1024; 24532b578d3Smrg break; 24632b578d3Smrg 24732b578d3Smrg case OldChipID('L', 'R'): 24832b578d3Smrg case OldChipID('L', 'S'): 24932b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 25032b578d3Smrg case NewChipID('L', 'R'): 25132b578d3Smrg case NewChipID('L', 'S'): 25232b578d3Smrg pATI->Chip = ATI_CHIP_MOBILITY; 25332b578d3Smrg pATI->BusType = ATI_BUS_PCI; 25432b578d3Smrg pATI->LCDVBlendFIFOSize = 1024; 25532b578d3Smrg break; 25632b578d3Smrg 25732b578d3Smrg case OldChipID('L', 'M'): 25832b578d3Smrg case OldChipID('L', 'N'): 25932b578d3Smrg pATI->ChipType = OldToNewChipID(pATI->ChipType); 26032b578d3Smrg case NewChipID('L', 'M'): 26132b578d3Smrg case NewChipID('L', 'N'): 26232b578d3Smrg pATI->Chip = ATI_CHIP_MOBILITY; 26332b578d3Smrg pATI->BusType = ATI_BUS_AGP; 26432b578d3Smrg pATI->LCDVBlendFIFOSize = 1024; 26532b578d3Smrg break; 26632b578d3Smrg 26732b578d3Smrg default: 26832b578d3Smrg pATI->Chip = ATI_CHIP_Mach64; 26932b578d3Smrg break; 27032b578d3Smrg } 27132b578d3Smrg} 272