atichip.c revision 32b578d3
1/*
2 * Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of Marc Aurele La France not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission.  Marc Aurele La France makes no representations
11 * about the suitability of this software for any purpose.  It is provided
12 * "as-is" without express or implied warranty.
13 *
14 * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
16 * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include "config.h"
25#endif
26
27#include "ati.h"
28#include "atibus.h"
29#include "atichip.h"
30#include "atimach64io.h"
31#include "atimach64version.h"
32
33const char *ATIFoundryNames[] =
34    { "SGS", "NEC", "KCS", "UMC", "TSMC", "5", "6", "UMC" };
35
36/*
37 * ATIMach64ChipID --
38 *
39 * Set variables whose value is dependent upon a Mach64's CONFIG_CHIP_ID
40 * register.
41 */
42void
43ATIMach64ChipID
44(
45    ATIPtr       pATI,
46    const CARD16 ExpectedChipType
47)
48{
49    pATI->config_chip_id = inr(CONFIG_CHIP_ID);
50    pATI->ChipType       = GetBits(pATI->config_chip_id, CFG_CHIP_TYPE);
51    pATI->ChipClass      = GetBits(pATI->config_chip_id, CFG_CHIP_CLASS);
52    pATI->ChipRev        = GetBits(pATI->config_chip_id, CFG_CHIP_REV);
53    pATI->ChipVersion    = GetBits(pATI->config_chip_id, CFG_CHIP_VERSION);
54    pATI->ChipFoundry    = GetBits(pATI->config_chip_id, CFG_CHIP_FOUNDRY);
55    pATI->ChipRevision   = GetBits(pATI->config_chip_id, CFG_CHIP_REVISION);
56    switch (pATI->ChipType)
57    {
58        case OldChipID('G', 'X'):
59            pATI->ChipType = OldToNewChipID(pATI->ChipType);
60        case NewChipID('G', 'X'):
61            switch (pATI->ChipRev)
62            {
63                case 0x00U:
64                    pATI->Chip = ATI_CHIP_88800GXC;
65                    break;
66
67                case 0x01U:
68                    pATI->Chip = ATI_CHIP_88800GXD;
69                    break;
70
71                case 0x02U:
72                    pATI->Chip = ATI_CHIP_88800GXE;
73                    break;
74
75                case 0x03U:
76                    pATI->Chip = ATI_CHIP_88800GXF;
77                    break;
78
79                default:
80                    pATI->Chip = ATI_CHIP_88800GX;
81                    break;
82            }
83            break;
84
85        case OldChipID('C', 'X'):
86            pATI->ChipType = OldToNewChipID(pATI->ChipType);
87        case NewChipID('C', 'X'):
88            pATI->Chip = ATI_CHIP_88800CX;
89            break;
90
91        case OldChipID('C', 'T'):
92            pATI->ChipType = OldToNewChipID(pATI->ChipType);
93        case NewChipID('C', 'T'):
94            pATI->Chip = ATI_CHIP_264CT;
95            pATI->BusType = ATI_BUS_PCI;
96            break;
97
98        case OldChipID('E', 'T'):
99            pATI->ChipType = OldToNewChipID(pATI->ChipType);
100        case NewChipID('E', 'T'):
101            pATI->Chip = ATI_CHIP_264ET;
102            pATI->BusType = ATI_BUS_PCI;
103            break;
104
105        case OldChipID('V', 'T'):
106            pATI->ChipType = OldToNewChipID(pATI->ChipType);
107        case NewChipID('V', 'T'):
108            pATI->Chip = ATI_CHIP_264VT;
109            pATI->BusType = ATI_BUS_PCI;
110            /* Some early GT's are detected as VT's */
111            if (ExpectedChipType && (pATI->ChipType != ExpectedChipType))
112            {
113                if (ExpectedChipType == NewChipID('G', 'T'))
114                    pATI->Chip = ATI_CHIP_264GT;
115                else
116                    xf86Msg(X_WARNING,
117                            MACH64_NAME ":  Mach64 chip type probe discrepancy"
118                            " detected:  PCI=0x%04X;  CHIP_ID=0x%04X.\n",
119                            ExpectedChipType, pATI->ChipType);
120            }
121            else if (pATI->ChipVersion)
122                pATI->Chip = ATI_CHIP_264VTB;
123            break;
124
125        case OldChipID('G', 'T'):
126            pATI->ChipType = OldToNewChipID(pATI->ChipType);
127        case NewChipID('G', 'T'):
128            pATI->BusType = ATI_BUS_PCI;
129            if (!pATI->ChipVersion)
130                pATI->Chip = ATI_CHIP_264GT;
131            else
132                pATI->Chip = ATI_CHIP_264GTB;
133            break;
134
135        case OldChipID('V', 'U'):
136            pATI->ChipType = OldToNewChipID(pATI->ChipType);
137        case NewChipID('V', 'U'):
138            pATI->Chip = ATI_CHIP_264VT3;
139            pATI->BusType = ATI_BUS_PCI;
140            break;
141
142        case OldChipID('G', 'U'):
143            pATI->ChipType = OldToNewChipID(pATI->ChipType);
144        case NewChipID('G', 'U'):
145            pATI->Chip = ATI_CHIP_264GTDVD;
146            pATI->BusType = ATI_BUS_PCI;
147            break;
148
149        case OldChipID('L', 'G'):
150            pATI->ChipType = OldToNewChipID(pATI->ChipType);
151        case NewChipID('L', 'G'):
152            pATI->Chip = ATI_CHIP_264LT;
153            pATI->BusType = ATI_BUS_PCI;
154            break;
155
156        case OldChipID('V', 'V'):
157            pATI->ChipType = OldToNewChipID(pATI->ChipType);
158        case NewChipID('V', 'V'):
159            pATI->Chip = ATI_CHIP_264VT4;
160            pATI->BusType = ATI_BUS_PCI;
161            break;
162
163        case OldChipID('G', 'V'):
164        case OldChipID('G', 'Y'):
165            pATI->ChipType = OldToNewChipID(pATI->ChipType);
166        case NewChipID('G', 'V'):
167        case NewChipID('G', 'Y'):
168            pATI->Chip = ATI_CHIP_264GT2C;
169            pATI->BusType = ATI_BUS_PCI;
170            break;
171
172        case OldChipID('G', 'W'):
173        case OldChipID('G', 'Z'):
174            pATI->ChipType = OldToNewChipID(pATI->ChipType);
175        case NewChipID('G', 'W'):
176        case NewChipID('G', 'Z'):
177            pATI->Chip = ATI_CHIP_264GT2C;
178            pATI->BusType = ATI_BUS_AGP;
179            break;
180
181        case OldChipID('G', 'I'):
182        case OldChipID('G', 'P'):
183        case OldChipID('G', 'Q'):
184            pATI->ChipType = OldToNewChipID(pATI->ChipType);
185        case NewChipID('G', 'I'):
186        case NewChipID('G', 'P'):
187        case NewChipID('G', 'Q'):
188            pATI->Chip = ATI_CHIP_264GTPRO;
189            pATI->BusType = ATI_BUS_PCI;
190            break;
191
192        case OldChipID('G', 'B'):
193        case OldChipID('G', 'D'):
194            pATI->ChipType = OldToNewChipID(pATI->ChipType);
195        case NewChipID('G', 'B'):
196        case NewChipID('G', 'D'):
197            pATI->Chip = ATI_CHIP_264GTPRO;
198            pATI->BusType = ATI_BUS_AGP;
199            break;
200
201        case OldChipID('L', 'I'):
202        case OldChipID('L', 'P'):
203        case OldChipID('L', 'Q'):
204            pATI->ChipType = OldToNewChipID(pATI->ChipType);
205        case NewChipID('L', 'I'):
206        case NewChipID('L', 'P'):
207        case NewChipID('L', 'Q'):
208            pATI->Chip = ATI_CHIP_264LTPRO;
209            pATI->BusType = ATI_BUS_PCI;
210            pATI->LCDVBlendFIFOSize = 800;
211            break;
212
213        case OldChipID('L', 'B'):
214        case OldChipID('L', 'D'):
215            pATI->ChipType = OldToNewChipID(pATI->ChipType);
216        case NewChipID('L', 'B'):
217        case NewChipID('L', 'D'):
218            pATI->Chip = ATI_CHIP_264LTPRO;
219            pATI->BusType = ATI_BUS_AGP;
220            pATI->LCDVBlendFIFOSize = 800;
221            break;
222
223        case OldChipID('G', 'L'):
224        case OldChipID('G', 'O'):
225        case OldChipID('G', 'R'):
226        case OldChipID('G', 'S'):
227            pATI->ChipType = OldToNewChipID(pATI->ChipType);
228        case NewChipID('G', 'L'):
229        case NewChipID('G', 'O'):
230        case NewChipID('G', 'R'):
231        case NewChipID('G', 'S'):
232            pATI->Chip = ATI_CHIP_264XL;
233            pATI->BusType = ATI_BUS_PCI;
234            pATI->LCDVBlendFIFOSize = 1024;
235            break;
236
237        case OldChipID('G', 'M'):
238        case OldChipID('G', 'N'):
239            pATI->ChipType = OldToNewChipID(pATI->ChipType);
240        case NewChipID('G', 'M'):
241        case NewChipID('G', 'N'):
242            pATI->Chip = ATI_CHIP_264XL;
243            pATI->BusType = ATI_BUS_AGP;
244            pATI->LCDVBlendFIFOSize = 1024;
245            break;
246
247        case OldChipID('L', 'R'):
248        case OldChipID('L', 'S'):
249            pATI->ChipType = OldToNewChipID(pATI->ChipType);
250        case NewChipID('L', 'R'):
251        case NewChipID('L', 'S'):
252            pATI->Chip = ATI_CHIP_MOBILITY;
253            pATI->BusType = ATI_BUS_PCI;
254            pATI->LCDVBlendFIFOSize = 1024;
255            break;
256
257        case OldChipID('L', 'M'):
258        case OldChipID('L', 'N'):
259            pATI->ChipType = OldToNewChipID(pATI->ChipType);
260        case NewChipID('L', 'M'):
261        case NewChipID('L', 'N'):
262            pATI->Chip = ATI_CHIP_MOBILITY;
263            pATI->BusType = ATI_BUS_AGP;
264            pATI->LCDVBlendFIFOSize = 1024;
265            break;
266
267        default:
268            pATI->Chip = ATI_CHIP_Mach64;
269            break;
270    }
271}
272