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