r300: Use chip caps for something.
[mesa.git] / src / gallium / drivers / r300 / r300_chipset.c
1 /*
2 * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE. */
22
23 #include "r300_chipset.h"
24
25 /* r300_chipset: A file all to itself for deducing the various properties of
26 * Radeons. */
27
28 /* Parse a PCI ID and fill an r300_capabilities struct with information. */
29 void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
30 {
31 /* Reasonable defaults */
32 caps->pci_id = pci_id;
33 caps->has_tcl = TRUE;
34 caps->is_r500 = FALSE;
35
36 /* Note: These are not ordered by PCI ID. I leave that task to GCC,
37 * which will perform the ordering while collating jump tables. Instead,
38 * I've tried to group them according to capabilities and age. */
39 switch (pci_id) {
40 case 0x4144:
41 caps->family = CHIP_FAMILY_R300;
42 caps->num_pipes = 1;
43 break;
44
45 case 0x4145:
46 case 0x4146:
47 case 0x4147:
48 case 0x4E44:
49 case 0x4E45:
50 case 0x4E46:
51 case 0x4E47:
52 caps->family = CHIP_FAMILY_R300;
53 caps->num_pipes = 2;
54 break;
55
56 case 0x4150:
57 case 0x4151:
58 case 0x4152:
59 case 0x4153:
60 case 0x4154:
61 case 0x4155:
62 case 0x4156:
63 case 0x4E50:
64 case 0x4E51:
65 case 0x4E52:
66 case 0x4E53:
67 case 0x4E54:
68 case 0x4E56:
69 caps->family = CHIP_FAMILY_RV350;
70 caps->num_pipes = 1;
71 break;
72
73 case 0x4148:
74 case 0x4149:
75 case 0x414A:
76 case 0x414B:
77 case 0x4E48:
78 case 0x4E49:
79 case 0x4E4B:
80 caps->family = CHIP_FAMILY_R350;
81 caps->num_pipes = 2;
82 break;
83
84 case 0x4E4A:
85 caps->family = CHIP_FAMILY_R360;
86 caps->num_pipes = 2;
87 break;
88
89 case 0x5460:
90 case 0x5462:
91 case 0x5464:
92 case 0x5B60:
93 case 0x5B62:
94 case 0x5B63:
95 case 0x5B64:
96 case 0x5B65:
97 caps->family = CHIP_FAMILY_RV370;
98 caps->num_pipes = 1;
99 break;
100
101 case 0x3150:
102 case 0x3152:
103 case 0x3154:
104 case 0x3E50:
105 case 0x3E54:
106 caps->family = CHIP_FAMILY_RV380;
107 caps->num_pipes = 1;
108 break;
109
110 case 0x4A48:
111 case 0x4A49:
112 case 0x4A4A:
113 case 0x4A4B:
114 case 0x4A4C:
115 case 0x4A4D:
116 case 0x4A4E:
117 case 0x4A4F:
118 case 0x4A50:
119 case 0x4A54:
120 caps->family = CHIP_FAMILY_R420;
121 caps->num_pipes = 4;
122 break;
123
124 case 0x5548:
125 case 0x5549:
126 case 0x554A:
127 case 0x554B:
128 case 0x5550:
129 case 0x5551:
130 case 0x5552:
131 case 0x5554:
132 case 0x5D57:
133 caps->family = CHIP_FAMILY_R423;
134 caps->num_pipes = 4;
135 break;
136
137 case 0x554C:
138 case 0x554D:
139 case 0x554E:
140 case 0x554F:
141 case 0x5D48:
142 case 0x5D49:
143 case 0x5D4A:
144 caps->family = CHIP_FAMILY_R430;
145 caps->num_pipes = 4;
146 break;
147
148 case 0x5D4C:
149 case 0x5D4D:
150 case 0x5D4E:
151 case 0x5D4F:
152 case 0x5D50:
153 case 0x5D52:
154 caps->family = CHIP_FAMILY_R480;
155 caps->num_pipes = 4;
156 break;
157
158 case 0x4B49:
159 case 0x4B4A:
160 case 0x4B4B:
161 case 0x4B4C:
162 caps->family = CHIP_FAMILY_R481;
163 caps->num_pipes = 4;
164 break;
165
166 case 0x5E4C:
167 case 0x5E4F:
168 case 0x564A:
169 case 0x564B:
170 case 0x564F:
171 case 0x5652:
172 case 0x5653:
173 case 0x5657:
174 case 0x5E48:
175 case 0x5E4A:
176 case 0x5E4B:
177 case 0x5E4D:
178 caps->family = CHIP_FAMILY_RV410;
179 caps->num_pipes = 1;
180 break;
181
182 case 0x5954:
183 case 0x5955:
184 caps->family = CHIP_FAMILY_RS480;
185 caps->num_pipes = 1; /* CHECK ME */
186 caps->has_tcl = FALSE;
187 break;
188
189 case 0x5974:
190 case 0x5975:
191 caps->family = CHIP_FAMILY_RS482;
192 caps->num_pipes = 1; /* CHECK ME */
193 caps->has_tcl = FALSE;
194 break;
195
196 case 0x5A41:
197 case 0x5A42:
198 caps->family = CHIP_FAMILY_RS400;
199 caps->num_pipes = 1; /* CHECK ME */
200 caps->has_tcl = FALSE;
201 break;
202
203 case 0x5A61:
204 case 0x5A62:
205 caps->family = CHIP_FAMILY_RC410;
206 caps->num_pipes = 1; /* CHECK ME */
207 caps->has_tcl = FALSE;
208 break;
209
210 case 0x791E:
211 case 0x791F:
212 caps->family = CHIP_FAMILY_RS690;
213 caps->num_pipes = 1; /* CHECK ME */
214 caps->has_tcl = FALSE;
215 break;
216
217 case 0x796C:
218 case 0x796D:
219 case 0x796E:
220 case 0x796F:
221 caps->family = CHIP_FAMILY_RS740;
222 caps->num_pipes = 1; /* CHECK ME */
223 caps->has_tcl = FALSE;
224 break;
225
226 case 0x7100:
227 case 0x7101:
228 case 0x7102:
229 case 0x7103:
230 case 0x7104:
231 case 0x7105:
232 case 0x7106:
233 case 0x7108:
234 case 0x7109:
235 case 0x710A:
236 case 0x710B:
237 case 0x710C:
238 case 0x710E:
239 case 0x710F:
240 caps->family = CHIP_FAMILY_R520;
241 caps->num_pipes = 4;
242 caps->is_r500 = TRUE;
243 break;
244
245 case 0x7140:
246 case 0x7141:
247 case 0x7142:
248 case 0x7143:
249 case 0x7144:
250 case 0x7145:
251 case 0x7146:
252 case 0x7147:
253 case 0x7149:
254 case 0x714A:
255 case 0x714B:
256 case 0x714C:
257 case 0x714D:
258 case 0x714E:
259 case 0x714F:
260 case 0x7151:
261 case 0x7152:
262 case 0x7153:
263 case 0x715E:
264 case 0x715F:
265 case 0x7180:
266 case 0x7181:
267 case 0x7183:
268 case 0x7186:
269 case 0x7187:
270 case 0x7188:
271 case 0x718A:
272 case 0x718B:
273 case 0x718C:
274 case 0x718D:
275 case 0x718F:
276 case 0x7193:
277 case 0x7196:
278 case 0x719B:
279 case 0x719F:
280 case 0x7200:
281 case 0x7210:
282 case 0x7211:
283 caps->family = CHIP_FAMILY_RV515;
284 caps->num_pipes = 1;
285 caps->is_r500 = TRUE;
286 break;
287
288 case 0x71C0:
289 case 0x71C1:
290 case 0x71C2:
291 case 0x71C3:
292 case 0x71C4:
293 case 0x71C5:
294 case 0x71C6:
295 case 0x71C7:
296 case 0x71CD:
297 case 0x71CE:
298 case 0x71D2:
299 case 0x71D4:
300 case 0x71D5:
301 case 0x71D6:
302 case 0x71DA:
303 case 0x71DE:
304 caps->family = CHIP_FAMILY_RV530;
305 caps->num_pipes = 1;
306 caps->is_r500 = TRUE;
307 break;
308
309 case 0x7240:
310 case 0x7243:
311 case 0x7244:
312 case 0x7245:
313 case 0x7246:
314 case 0x7247:
315 case 0x7248:
316 case 0x7249:
317 case 0x724A:
318 case 0x724B:
319 case 0x724C:
320 case 0x724D:
321 case 0x724E:
322 case 0x724F:
323 case 0x7284:
324 caps->family = CHIP_FAMILY_R580;
325 caps->num_pipes = 4;
326 caps->is_r500 = TRUE;
327 break;
328
329 case 0x7280:
330 caps->family = CHIP_FAMILY_RV570;
331 caps->num_pipes = 4;
332 caps->is_r500 = TRUE;
333 break;
334
335 case 0x7281:
336 case 0x7283:
337 case 0x7287:
338 case 0x7288:
339 case 0x7289:
340 case 0x728B:
341 case 0x728C:
342 case 0x7290:
343 case 0x7291:
344 case 0x7293:
345 case 0x7297:
346 caps->family = CHIP_FAMILY_RV560;
347 caps->num_pipes = 4;
348 caps->is_r500 = TRUE;
349 break;
350
351 default:
352 /* XXX not an r300?! */
353 break;
354 }
355 }