1 | /*␊ |
2 | * ATI Graphics Card Enabler, part of the Chameleon Boot Loader Project␊ |
3 | *␊ |
4 | * Copyright 2010 by Islam M. Ahmed Zaid. All rights reserved.␊ |
5 | *␊ |
6 | */␊ |
7 | ␊ |
8 | #include "libsa.h"␊ |
9 | #include "saio_internal.h"␊ |
10 | #include "bootstruct.h"␊ |
11 | #include "pci.h"␊ |
12 | #include "platform.h"␊ |
13 | #include "device_inject.h"␊ |
14 | #include "ati_reg.h"␊ |
15 | ␊ |
16 | #define OFFSET_TO_GET_ATOMBIOS_STRINGS_START 0x6e␊ |
17 | ␊ |
18 | #define kUseAtiROM␉␉␉␉"UseAtiROM"␊ |
19 | #define kAtiConfig␉␉␉␉"AtiConfig"␊ |
20 | #define kAtiPorts␉␉␉␉"AtiPorts"␊ |
21 | #define kATYbinimage␉␉␉␉"ATYbinimage"␊ |
22 | ␊ |
23 | #define Reg32(reg)␉␉␉␉(*(volatile uint32_t *)(card->mmio + reg))␊ |
24 | #define RegRead32(reg)␉␉␉(Reg32(reg))␊ |
25 | #define RegWrite32(reg, value)␉(Reg32(reg) = value)␊ |
26 | ␊ |
27 | typedef enum {␊ |
28 | ␉kNul,␊ |
29 | ␉kStr,␊ |
30 | ␉kPtr,␊ |
31 | ␉kCst␊ |
32 | } type_t;␊ |
33 | ␊ |
34 | typedef enum {␊ |
35 | ␉CHIP_FAMILY_UNKNOW,␊ |
36 | ␉/* IGP */␊ |
37 | ␉CHIP_FAMILY_RS600,␊ |
38 | ␉CHIP_FAMILY_RS690,␊ |
39 | ␉CHIP_FAMILY_RS740,␊ |
40 | ␉CHIP_FAMILY_RS780,␊ |
41 | ␉CHIP_FAMILY_RS880,␊ |
42 | ␉/* R600 */␊ |
43 | ␉CHIP_FAMILY_R600,␊ |
44 | ␉CHIP_FAMILY_RV610,␊ |
45 | ␉CHIP_FAMILY_RV620,␊ |
46 | ␉CHIP_FAMILY_RV630,␊ |
47 | ␉CHIP_FAMILY_RV635,␊ |
48 | ␉CHIP_FAMILY_RV670,␊ |
49 | ␉/* R700 */␊ |
50 | ␉CHIP_FAMILY_RV710,␊ |
51 | ␉CHIP_FAMILY_RV730,␊ |
52 | ␉CHIP_FAMILY_RV740,␊ |
53 | ␉CHIP_FAMILY_RV772,␊ |
54 | ␉CHIP_FAMILY_RV770,␊ |
55 | ␉CHIP_FAMILY_RV790,␊ |
56 | ␉/* Evergreen */␊ |
57 | ␉CHIP_FAMILY_CEDAR,␊ |
58 | ␉CHIP_FAMILY_CYPRESS,␊ |
59 | ␉CHIP_FAMILY_HEMLOCK,␊ |
60 | ␉CHIP_FAMILY_JUNIPER,␊ |
61 | ␉CHIP_FAMILY_REDWOOD,␊ |
62 | ␉CHIP_FAMILY_BROADWAY,␊ |
63 | ␉/* Northern Islands */␊ |
64 | ␉CHIP_FAMILY_ANTILLES,␊ |
65 | ␉CHIP_FAMILY_BARTS,␊ |
66 | ␉CHIP_FAMILY_CAICOS,␊ |
67 | ␉CHIP_FAMILY_CAYMAN,␊ |
68 | ␉CHIP_FAMILY_TURKS,␊ |
69 | ␉/* Southern Islands */␊ |
70 | //␉CHIP_FAMILY_TAITI␊ |
71 | //␉CHIP_FAMILY_THAMES␊ |
72 | //␉CHIP_FAMILY_LOMBOK␊ |
73 | //␉CHIP_FAMILY_NEW_ZEALAND␊ |
74 | ␉CHIP_FAMILY_LAST␊ |
75 | } chip_family_t;␊ |
76 | ␊ |
77 | static const char *chip_family_name[] = {␊ |
78 | ␉"UNKNOW",␊ |
79 | ␉/* IGP */␊ |
80 | ␉"RS600",␊ |
81 | ␉"RS690",␊ |
82 | ␉"RS740",␊ |
83 | ␉"RS780",␊ |
84 | ␉"RS880",␊ |
85 | ␉/* R600 */␊ |
86 | ␉"R600",␊ |
87 | ␉"RV610",␊ |
88 | ␉"RV620",␊ |
89 | ␉"RV630",␊ |
90 | ␉"RV635",␊ |
91 | ␉"RV670",␊ |
92 | ␉/* R700 */␊ |
93 | ␉"RV710",␊ |
94 | ␉"RV730",␊ |
95 | ␉"RV740",␊ |
96 | ␉"RV772",␊ |
97 | ␉"RV770",␊ |
98 | ␉"RV790",␊ |
99 | ␉/* Evergreen */␊ |
100 | ␉"Cedar",␊ |
101 | ␉"Cypress",␊ |
102 | ␉"Hemlock",␊ |
103 | ␉"Juniper",␊ |
104 | ␉"Redwood",␊ |
105 | ␉"Broadway",␊ |
106 | ␉/* Northern Islands */␊ |
107 | ␉"Antilles",␊ |
108 | ␉"Barts",␊ |
109 | ␉"Caicos",␊ |
110 | ␉"Cayman",␊ |
111 | ␉"Turks",␊ |
112 | ␉/* Southern Islands */␊ |
113 | //␉"Tahiti"␊ |
114 | //␉"Thames"␊ |
115 | //␉"Lombok"␊ |
116 | //␉"New_Zealand"␊ |
117 | ␉""␊ |
118 | };␊ |
119 | ␊ |
120 | typedef struct {␊ |
121 | ␉const char␉␉*name;␊ |
122 | ␉uint8_t␉␉␉ports;␊ |
123 | } card_config_t;␊ |
124 | ␊ |
125 | static card_config_t card_configs[] = {␊ |
126 | ␉{NULL,␉␉␉0},␊ |
127 | ␉{"Alopias",␉␉2},␊ |
128 | ␉{"Alouatta",␉4},␊ |
129 | ␉{"Baboon",␉␉3},␊ |
130 | ␉{"Cardinal",␉2},␊ |
131 | ␉{"Caretta",␉␉1},␊ |
132 | ␉{"Colobus",␉␉2},␊ |
133 | ␉{"Douc",␉␉2},␊ |
134 | ␉{"Eulemur",␉␉3},␊ |
135 | ␉{"Flicker",␉␉3},␊ |
136 | ␉{"Galago",␉␉2},␊ |
137 | ␉{"Gliff",␉␉3},␊ |
138 | ␉{"Hoolock",␉␉3},␊ |
139 | ␉{"Hypoprion",␉2},␊ |
140 | ␉{"Iago",␉␉2},␊ |
141 | ␉{"Kakapo",␉␉3},␊ |
142 | ␉{"Kipunji",␉␉4},␊ |
143 | ␉{"Lamna",␉␉2},␊ |
144 | ␉{"Langur",␉␉3},␊ |
145 | ␉{"Megalodon",␉3},␊ |
146 | ␉{"Motmot",␉␉2},␊ |
147 | ␉{"Nomascus",␉5},␊ |
148 | ␉{"Orangutan",␉2},␊ |
149 | ␉{"Peregrine",␉2},␊ |
150 | ␉{"Quail",␉␉3},␊ |
151 | ␉{"Raven",␉␉3},␊ |
152 | ␉{"Shrike",␉␉3},␊ |
153 | ␉{"Sphyrna",␉␉1},␊ |
154 | ␉{"Triakis",␉␉2},␊ |
155 | ␉{"Uakari",␉␉4},␊ |
156 | ␉{"Vervet",␉␉4},␊ |
157 | ␉{"Zonalis",␉␉6},␊ |
158 | ␉{"Pithecia",␉3},␊ |
159 | ␉{"Bulrushes",␉6},␊ |
160 | ␉{"Cattail",␉␉4},␊ |
161 | ␉{"Hydrilla",␉5},␊ |
162 | ␉{"Duckweed",␉4},␊ |
163 | ␉{"Fanwort",␉␉4},␊ |
164 | ␉{"Elodea",␉␉5},␊ |
165 | ␉{"Kudzu",␉␉2},␊ |
166 | ␉{"Gibba",␉␉5},␊ |
167 | ␉{"Lotus",␉␉3},␊ |
168 | ␉{"Ipomoea",␉␉3},␊ |
169 | ␉{"Mangabey",␉2},␊ |
170 | ␉{"Muskgrass",␉4},␊ |
171 | ␉{"Juncus",␉␉4}␊ |
172 | };␊ |
173 | ␊ |
174 | typedef enum {␊ |
175 | ␉kNull,␊ |
176 | ␉kAlopias,␊ |
177 | ␉kAlouatta,␊ |
178 | ␉kBaboon,␊ |
179 | ␉kCardinal,␊ |
180 | ␉kCaretta,␊ |
181 | ␉kColobus,␊ |
182 | ␉kDouc,␊ |
183 | ␉kEulemur,␊ |
184 | ␉kFlicker,␊ |
185 | ␉kGalago,␊ |
186 | ␉kGliff,␊ |
187 | ␉kHoolock,␊ |
188 | ␉kHypoprion,␊ |
189 | ␉kIago,␊ |
190 | ␉kKakapo,␊ |
191 | ␉kKipunji,␊ |
192 | ␉kLamna,␊ |
193 | ␉kLangur,␊ |
194 | ␉kMegalodon,␊ |
195 | ␉kMotmot,␊ |
196 | ␉kNomascus,␊ |
197 | ␉kOrangutan,␊ |
198 | ␉kPeregrine,␊ |
199 | ␉kQuail,␊ |
200 | ␉kRaven,␊ |
201 | ␉kShrike,␊ |
202 | ␉kSphyrna,␊ |
203 | ␉kTriakis,␊ |
204 | ␉kUakari,␊ |
205 | ␉kVervet,␊ |
206 | ␉kZonalis,␊ |
207 | ␉kPithecia,␊ |
208 | ␉kBulrushes,␊ |
209 | ␉kCattail,␊ |
210 | ␉kHydrilla,␊ |
211 | ␉kDuckweed,␊ |
212 | ␉kFanwort,␊ |
213 | ␉kElodea,␊ |
214 | ␉kKudzu,␊ |
215 | ␉kGibba,␊ |
216 | ␉kLotus,␊ |
217 | ␉kIpomoea,␊ |
218 | ␉kMangabey,␊ |
219 | ␉kMuskgrass,␊ |
220 | ␉kJuncus,␊ |
221 | ␉kCfgEnd␊ |
222 | } config_name_t;␊ |
223 | ␊ |
224 | typedef struct {␊ |
225 | ␉uint16_t␉␉␉␉device_id;␊ |
226 | ␉uint32_t␉␉␉␉subsys_id;␊ |
227 | ␉chip_family_t␉␉␉chip_family;␊ |
228 | ␉const char␉␉␉␉*model_name;␊ |
229 | ␉config_name_t␉␉␉cfg_name;␊ |
230 | ␉uint8_t␉␉␉␉max_ports;␊ |
231 | } radeon_card_info_t;␊ |
232 | ␊ |
233 | static radeon_card_info_t radeon_cards[] = {␊ |
234 | ␉␊ |
235 | ␉// Earlier cards are not supported␊ |
236 | ␉//␊ |
237 | ␉// Layout is device_id, subsys_id (subsystem id plus vendor id), chip_family_name, display name, frame buffer␊ |
238 | ␉// Cards are grouped by device id and vendor id then sorted by subsystem id to make it easier to add new cards␊ |
239 | ␉// ␊ |
240 | ␉{ 0x9400,␉0x25521002, CHIP_FAMILY_R600,␉␉"ATI Radeon HD 2900 XT",␉␉␉kNull␉␉, 0 },␊ |
241 | ␉{ 0x9400,␉0x30001002, CHIP_FAMILY_R600,␉␉"ATI Radeon HD 2900 PRO",␉␉␉kNull␉␉, 0 },␊ |
242 | ␊ |
243 | ␉{ 0x9440,␉0x0851174B, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870",␉␉␉␉kMotmot␉␉, 0 }, // ErmaC␊ |
244 | ␉{ 0x9440,␉0x114A174B, CHIP_FAMILY_RV770,␉␉"Sapphire Radeon HD4870 Vapor-X",␉␉kCardinal␉, 0 }, // ErmaC␊ |
245 | ␉{ 0x9440,␉0x24401682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870",␉␉␉␉kMotmot␉␉, 0 },␊ |
246 | ␉{ 0x9440,␉0x24411682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870",␉␉␉␉kMotmot␉␉, 0 },␊ |
247 | ␉{ 0x9440,␉0x24441682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870",␉␉␉␉kMotmot␉␉, 0 },␊ |
248 | ␉{ 0x9440,␉0x24451682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870",␉␉␉␉kMotmot␉␉, 0 },␊ |
249 | ␊ |
250 | ␉{ 0x9441,␉0x24401682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870 X2",␉␉␉kMotmot␉␉, 0 },␊ |
251 | ␊ |
252 | ␉{ 0x9442,␉0x080110B0, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4850",␉␉␉␉kMotmot␉␉, 0 },␊ |
253 | ␊ |
254 | ␉{ 0x9442,␉0x24701682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4850",␉␉␉␉kMotmot␉␉, 0 },␊ |
255 | ␉{ 0x9442,␉0x24711682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4850",␉␉␉␉kMotmot␉␉, 0 },␊ |
256 | ␊ |
257 | ␉{ 0x9442,␉0xE104174B, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4850",␉␉␉␉kMotmot␉␉, 0 },␊ |
258 | ␊ |
259 | ␉{ 0x944A,␉0x30001043, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
260 | ␊ |
261 | ␉{ 0x944A,␉0x30001458, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
262 | ␊ |
263 | ␉{ 0x944A,␉0x30001462, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
264 | ␊ |
265 | ␉{ 0x944A,␉0x30001545, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
266 | ␊ |
267 | ␉{ 0x944A,␉0x30001682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
268 | ␊ |
269 | ␉{ 0x944A,␉0x3000174B, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
270 | ␊ |
271 | ␉{ 0x944A,␉0x30001787, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
272 | ␊ |
273 | ␉{ 0x944A,␉0x300017AF, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
274 | ␊ |
275 | ␉{ 0x944C,␉0x24801682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4830",␉␉␉␉kMotmot␉␉, 0 },␊ |
276 | ␉{ 0x944C,␉0x24811682, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4830",␉␉␉␉kMotmot␉␉, 0 },␊ |
277 | ␊ |
278 | ␉{ 0x944E,␉0x3260174B, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4810 Series",␉␉␉kMotmot␉␉, 0 },␊ |
279 | ␉{ 0x944E,␉0x3261174B, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4810 series",␉␉␉kMotmot␉␉, 0 },␊ |
280 | ␊ |
281 | ␉{ 0x944E,␉0x30001787, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4730 Series",␉␉␉kMotmot␉␉, 0 },␊ |
282 | ␉{ 0x944E,␉0x30101787, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4810 Series",␉␉␉kMotmot␉␉, 0 },␊ |
283 | ␉{ 0x944E,␉0x31001787, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4820",␉␉␉␉kMotmot␉␉, 0 },␊ |
284 | ␉␊ |
285 | ␉{ 0x9480,␉0x3628103C, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4650M",␉␉␉␉kGliff␉␉, 0 },␊ |
286 | ␉␊ |
287 | ␉{ 0x9480,␉0x9035104D, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4650M",␉␉␉␉kGliff␉␉, 0 },␊ |
288 | ␉␊ |
289 | ␉{ 0x9490,␉0x4710174B, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4710",␉␉␉␉kNull␉␉, 0 },␊ |
290 | ␉␊ |
291 | ␉{ 0x9490,␉0x20031787, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4670",␉␉␉␉kFlicker␉, 0 },␊ |
292 | ␉{ 0x9490,␉0x30501787, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4710",␉␉␉␉kNull␉␉, 0 },␊ |
293 | ␉␊ |
294 | ␉{ 0x9490,␉0x300017AF, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4710",␉␉␉␉kNull␉␉, 0 },␊ |
295 | ␉␊ |
296 | ␉{ 0x9498,␉0x21CF1458, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4600 Series",␉␉␉kNull␉␉, 0 },␊ |
297 | ␉␊ |
298 | ␉{ 0x9498,␉0x24511682, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4650",␉␉␉␉kNull␉␉, 0 },␊ |
299 | ␉{ 0x9498,␉0x24521682, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4650",␉␉␉␉kNull␉␉, 0 },␊ |
300 | ␉{ 0x9498,␉0x24541682, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4650",␉␉␉␉kNull␉␉, 0 },␊ |
301 | ␉{ 0x9498,␉0x29331682, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4670",␉␉␉␉kNull␉␉, 0 },␊ |
302 | ␉{ 0x9498,␉0x29341682, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4670",␉␉␉␉kNull␉␉, 0 },␊ |
303 | ␉␊ |
304 | ␉{ 0x9498,␉0x30501787, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4700",␉␉␉␉kNull␉␉, 0 },␊ |
305 | ␉{ 0x9498,␉0x31001787, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4720",␉␉␉␉kNull␉␉, 0 },␊ |
306 | ␉␊ |
307 | ␉{ 0x94B3,␉0x0D001002, CHIP_FAMILY_RV740,␉␉"ATI Radeon HD 4770",␉␉␉␉kFlicker␉, 0 },␊ |
308 | ␉␊ |
309 | ␉{ 0x94B3,␉0x29001682, CHIP_FAMILY_RV740,␉␉"ATI Radeon HD 4770",␉␉␉␉kFlicker␉, 0 },␊ |
310 | ␉␊ |
311 | ␉{ 0x94B3,␉0x1170174B, CHIP_FAMILY_RV740,␉␉"ATI Radeon HD 4770",␉␉␉␉kFlicker␉, 0 },␊ |
312 | ␉␊ |
313 | ␉{ 0x94C1,␉0x0D021002, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 XT",␉␉␉kNull␉␉, 0 },␊ |
314 | ␉{ 0x94C1,␉0x10021002, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 Pro",␉␉␉kNull␉␉, 0 },␊ |
315 | ␉␊ |
316 | ␉{ 0x94C1,␉0x0D021028, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 XT",␉␉␉kNull␉␉, 0 },␊ |
317 | ␉␊ |
318 | ␉{ 0x94C1,␉0x21741458, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 XT",␉␉␉kNull␉␉, 0 },␊ |
319 | ␉␊ |
320 | ␉{ 0x94C1,␉0x10331462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 XT",␉␉␉kNull␉␉, 0 },␊ |
321 | ␉{ 0x94C1,␉0x10401462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 XT",␉␉␉kNull␉␉, 0 },␊ |
322 | ␉{ 0x94C1,␉0x11101462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 XT",␉␉␉kNull␉␉, 0 },␊ |
323 | ␉␊ |
324 | ␉{ 0x94C3,␉0x03421002, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
325 | ␉␊ |
326 | ␉{ 0x94C3,␉0x30001025, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2350 Series",␉␉␉kNull␉␉, 0 },␊ |
327 | ␉␊ |
328 | ␉{ 0x94C3,␉0x03021028, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
329 | ␉{ 0x94C3,␉0x04021028, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
330 | ␉␊ |
331 | ␉{ 0x94C3,␉0x216A1458, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
332 | ␉{ 0x94C3,␉0x21721458, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
333 | ␉{ 0x94C3,␉0x30001458, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 3410",␉␉␉␉kNull␉␉, 0 },␊ |
334 | ␉␊ |
335 | ␉{ 0x94C3,␉0x10321462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
336 | ␉{ 0x94C3,␉0x10411462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400",␉␉␉␉kNull␉␉, 0 },␊ |
337 | ␉{ 0x94C3,␉0x11041462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400",␉␉␉␉kNull␉␉, 0 },␊ |
338 | ␉{ 0x94C3,␉0x11051462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400",␉␉␉␉kNull␉␉, 0 },␊ |
339 | ␉{ 0x94C3,␉0x30001462, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 3410",␉␉␉␉kNull␉␉, 0 },␊ |
340 | ␉␊ |
341 | ␉{ 0x94C3,␉0x2247148C, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 LE",␉␉␉kNull␉␉, 0 },␊ |
342 | ␉{ 0x94C3,␉0x3000148C, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2350 Series",␉␉␉kNull␉␉, 0 },␊ |
343 | ␉␊ |
344 | ␉{ 0x94C3,␉0x30001642, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 3410",␉␉␉␉kNull␉␉, 0 },␊ |
345 | ␉{ 0x94C3,␉0x37161642, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
346 | ␉␊ |
347 | ␉{ 0x94C3,␉0x3000174B, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2350 Series",␉␉␉kNull␉␉, 0 },␊ |
348 | ␉{ 0x94C3,␉0xE370174B, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
349 | ␉{ 0x94C3,␉0xE400174B, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
350 | ␉␊ |
351 | ␉{ 0x94C3,␉0x203817AF, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400",␉␉␉␉kNull␉␉, 0 },␊ |
352 | ␉␊ |
353 | ␉{ 0x94C3,␉0x22471787, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 LE",␉␉␉kNull␉␉, 0 },␊ |
354 | ␉{ 0x94C3,␉0x30001787, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2350 Series",␉␉␉kNull␉␉, 0 },␊ |
355 | ␉␊ |
356 | ␉{ 0x94C3,␉0x01011A93, CHIP_FAMILY_RV610,␉␉"Qimonda Radeon HD 2400 PRO",␉␉␉kNull␉␉, 0 },␊ |
357 | ␉␊ |
358 | ␉{ 0x9501,␉0x25421002, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3870",␉␉␉␉kNull␉␉, 0 },␊ |
359 | ␉{ 0x9501,␉0x30001002, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3690",␉␉␉␉kNull␉␉, 0 },␊ |
360 | ␉␊ |
361 | ␉{ 0x9501,␉0x3000174B, CHIP_FAMILY_RV670,␉␉"Sapphire Radeon HD 3690",␉␉␉kNull␉␉, 0 },␊ |
362 | ␉{ 0x9501,␉0x4750174B, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4750",␉␉␉␉kNull␉␉, 0 },␊ |
363 | ␉␊ |
364 | ␉{ 0x9501,␉0x30001787, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3690",␉␉␉␉kNull␉␉, 0 },␊ |
365 | ␉␊ |
366 | ␉{ 0x9505,␉0x25421002, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3850",␉␉␉␉kNull␉␉, 0 },␊ |
367 | ␉{ 0x9505,␉0x30001002, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3690",␉␉␉␉kNull␉␉, 0 },␊ |
368 | ␉␊ |
369 | ␉{ 0x9505,␉0x30011043, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4730",␉␉␉␉kNull␉␉, 0 },␊ |
370 | ␉␊ |
371 | ␉{ 0x9505,␉0x3000148C, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3850",␉␉␉␉kNull␉␉, 0 },␊ |
372 | ␉{ 0x9505,␉0x3001148C, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4730",␉␉␉␉kNull␉␉, 0 },␊ |
373 | ␉{ 0x9505,␉0x3002148C, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4730",␉␉␉␉kNull␉␉, 0 },␊ |
374 | ␉{ 0x9505,␉0x3003148C, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4750",␉␉␉␉kNull␉␉, 0 },␊ |
375 | ␉{ 0x9505,␉0x3004148C, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4750",␉␉␉␉kNull␉␉, 0 },␊ |
376 | ␉␊ |
377 | ␉{ 0x9505,␉0x3000174B, CHIP_FAMILY_RV670,␉␉"Sapphire Radeon HD 3690",␉␉␉kNull␉␉, 0 },␊ |
378 | ␉{ 0x9505,␉0x3001174B, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4750",␉␉␉␉kNull␉␉, 0 },␊ |
379 | ␉{ 0x9505,␉0x3010174B, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4750",␉␉␉␉kNull␉␉, 0 },␊ |
380 | ␉{ 0x9505,␉0x4730174B, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4730",␉␉␉␉kNull␉␉, 0 },␊ |
381 | ␉␊ |
382 | ␉{ 0x9505,␉0x30001787, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3690",␉␉␉␉kNull␉␉, 0 },␊ |
383 | ␉{ 0x9505,␉0x301017AF, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 4750",␉␉␉␉kNull␉␉, 0 },␊ |
384 | ␉␊ |
385 | ␉{ 0x9540,␉0x4590174B, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4590",␉␉␉␉kNull␉␉, 0 },␊ |
386 | ␉␊ |
387 | ␉{ 0x9540,␉0x30501787, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4590",␉␉␉␉kNull␉␉, 0 },␊ |
388 | ␊ |
389 | ␉{ 0x954F,␉0x16131462, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4550",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
390 | ␉{ 0x954F,␉0x20081787, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4350",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
391 | ␉{ 0x954F,␉0x29201682, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4550",␉␉␉␉kNull␉␉, 0 },␊ |
392 | ␉{ 0x954F,␉0x29211682, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4550",␉␉␉␉kNull␉␉, 0 },␊ |
393 | ␉{ 0x954F,␉0x30901682, CHIP_FAMILY_RV710,␉␉"XFX Radeon HD 4570",␉␉␉␉kNull␉␉, 0 },␊ |
394 | ␊ |
395 | ␉{ 0x954F,␉0x30501787, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4450",␉␉␉␉kNull␉␉, 0 },␊ |
396 | ␉{ 0x954F,␉0x31001787, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4520",␉␉␉␉kNull␉␉, 0 },␊ |
397 | ␊ |
398 | ␉{ 0x954F,␉0x3000174B, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4520",␉␉␉␉kNull␉␉, 0 },␊ |
399 | ␉{ 0x954F,␉0x4450174B, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4450",␉␉␉␉kNull␉␉, 0 },␊ |
400 | ␉{ 0x954F,␉0x4570174B, CHIP_FAMILY_RV710,␉␉"Sapphire Radeon HD 4570",␉␉␉kNull␉␉, 0 },␊ |
401 | ␉{ 0x954F,␉0xE990174B, CHIP_FAMILY_RV710,␉␉"Sapphire Radeon HD 4350",␉␉␉kNull␉␉, 0 },␊ |
402 | ␊ |
403 | ␉{ 0x954F,␉0x301017AF, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4450",␉␉␉␉kNull␉␉, 0 },␊ |
404 | ␊ |
405 | ␉{ 0x9552,␉0x04341028, CHIP_FAMILY_RV710,␉␉"ATI Mobility Radeon 4330",␉␉␉kShrike␉␉, 0 },␊ |
406 | ␊ |
407 | ␉{ 0x9552,␉0x308B103C, CHIP_FAMILY_RV710,␉␉"ATI Mobility Radeon HD 4300 Series",␉␉kShrike␉␉, 0 },␊ |
408 | ␊ |
409 | ␉{ 0x9552,␉0x3000148C, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4300/4500 Series",␉␉kNull␉␉, 0 },␊ |
410 | ␊ |
411 | ␉{ 0x9552,␉0x3000174B, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4300/4500 Series",␉␉kNull␉␉, 0 },␊ |
412 | ␊ |
413 | ␉{ 0x9552,␉0x30001787, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4300/4500 Series",␉␉kNull␉␉, 0 },␊ |
414 | ␊ |
415 | ␉{ 0x9552,␉0x300017AF, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4300/4500 Series",␉␉kNull␉␉, 0 },␊ |
416 | ␊ |
417 | ␉{ 0x9553,␉0x18751043, CHIP_FAMILY_RV710,␉␉"ATI Mobility Radeon HD 4570",␉␉␉kShrike␉␉, 0 },␊ |
418 | ␉{ 0x9553,␉0x1B321043, CHIP_FAMILY_RV710,␉␉"ATI Mobility Radeon HD 4570",␉␉␉kShrike␉␉, 0 },␊ |
419 | ␊ |
420 | ␉{ 0x9581,␉0x95811002, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 3600 Series",␉␉␉kNull␉␉, 0 },␊ |
421 | ␊ |
422 | ␉{ 0x9581,␉0x3000148C, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 3600 Series",␉␉␉kNull␉␉, 0 },␊ |
423 | ␊ |
424 | ␉{ 0x9583,␉0x3000148C, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 3600 Series",␉␉␉kNull␉␉, 0 },␊ |
425 | ␊ |
426 | ␉{ 0x9588,␉0x01021A93, CHIP_FAMILY_RV630,␉␉"Qimonda Radeon HD 2600 XT",␉␉␉kNull␉␉, 0 },␊ |
427 | ␊ |
428 | ␉{ 0x9589,␉0x30001462, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 3610",␉␉␉␉kNull␉␉, 0 },␊ |
429 | ␊ |
430 | ␉{ 0x9589,␉0x0E41174B, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 3600 Series",␉␉␉kNull␉␉, 0 },␊ |
431 | ␊ |
432 | ␉{ 0x9589,␉0x30001787, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 3600 Series",␉␉␉kNull␉␉, 0 },␊ |
433 | ␊ |
434 | ␉{ 0x9589,␉0x01001A93, CHIP_FAMILY_RV630,␉␉"Qimonda Radeon HD 2600 PRO",␉␉␉kNull␉␉, 0 },␊ |
435 | ␊ |
436 | ␉{ 0x9591,␉0x2303148C, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 3600 Series",␉␉␉kNull␉␉, 0 },␊ |
437 | ␊ |
438 | ␉{ 0x9598,␉0xB3831002, CHIP_FAMILY_RV635,␉␉"ATI All-in-Wonder HD",␉␉␉␉kNull␉␉, 0 },␊ |
439 | ␊ |
440 | ␉{ 0x9598,␉0x30001043, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 3730",␉␉␉␉kNull␉␉, 0 },␊ |
441 | ␉{ 0x9598,␉0x30011043, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4570",␉␉␉␉kNull␉␉, 0 },␊ |
442 | ␊ |
443 | ␉{ 0x9598,␉0x3000148C, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 3730",␉␉␉␉kNull␉␉, 0 },␊ |
444 | ␉{ 0x9598,␉0x3001148C, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4580",␉␉␉␉kNull␉␉, 0 },␊ |
445 | ␉{ 0x9598,␉0x3031148C, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4570",␉␉␉␉kNull␉␉, 0 },␊ |
446 | ␊ |
447 | ␉{ 0x9598,␉0x30001545, CHIP_FAMILY_RV635,␉␉"VisionTek Radeon HD 2600 XT",␉␉␉kNull␉␉, 0 },␊ |
448 | ␉{ 0x9598,␉0x30011545, CHIP_FAMILY_RV635,␉␉"VisionTek Radeon HD 2600 Pro",␉␉␉kNull␉␉, 0 },␊ |
449 | ␊ |
450 | ␉{ 0x9598,␉0x3000174B, CHIP_FAMILY_RV635,␉␉"Sapphire Radeon HD 3730",␉␉␉kNull␉␉, 0 },␊ |
451 | ␉{ 0x9598,␉0x3001174B, CHIP_FAMILY_RV635,␉␉"Sapphire Radeon HD 3750",␉␉␉kNull␉␉, 0 },␊ |
452 | ␉{ 0x9598,␉0x4570174B, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4570",␉␉␉␉kNull␉␉, 0 },␊ |
453 | ␉{ 0x9598,␉0x4580174B, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4580",␉␉␉␉kNull␉␉, 0 },␊ |
454 | ␉{ 0x9598,␉0x4610174B, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4610",␉␉␉␉kNull␉␉, 0 },␊ |
455 | ␊ |
456 | ␉{ 0x9598,␉0x300117AF, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 3750",␉␉␉␉kNull␉␉, 0 },␊ |
457 | ␉{ 0x9598,␉0x301017AF, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4570",␉␉␉␉kNull␉␉, 0 },␊ |
458 | ␉{ 0x9598,␉0x301117AF, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4580",␉␉␉␉kNull␉␉, 0 },␊ |
459 | ␊ |
460 | ␉{ 0x9598,␉0x30501787, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 4610",␉␉␉␉kNull␉␉, 0 },␊ |
461 | ␊ |
462 | ␉{ 0x95C0,␉0x3000148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3550",␉␉␉␉kNull␉␉, 0 },␊ |
463 | ␊ |
464 | ␉{ 0x95C0,␉0xE3901745, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3550",␉␉␉␉kNull␉␉, 0 },␊ |
465 | ␊ |
466 | ␉{ 0x95C0,␉0x3000174B, CHIP_FAMILY_RV620,␉␉"Sapphire Radeon HD 3550",␉␉␉kNull␉␉, 0 },␊ |
467 | ␉{ 0x95C0,␉0x3002174B, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3570",␉␉␉␉kNull␉␉, 0 },␊ |
468 | ␉{ 0x95C0,␉0x3020174B, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
469 | ␊ |
470 | ␉{ 0x95C5,␉0x3000148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3450",␉␉␉␉kNull␉␉, 0 },␊ |
471 | ␉{ 0x95C5,␉0x3001148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3550",␉␉␉␉kNull␉␉, 0 },␊ |
472 | ␉{ 0x95C5,␉0x3002148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4230",␉␉␉␉kNull␉␉, 0 },␊ |
473 | ␉{ 0x95C5,␉0x3003148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
474 | ␉{ 0x95C5,␉0x3032148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
475 | ␉{ 0x95C5,␉0x3033148C, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4230",␉␉␉␉kNull␉␉, 0 },␊ |
476 | ␊ |
477 | ␉{ 0x95C5,␉0x3010174B, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
478 | ␉{ 0x95C5,␉0x4250174B, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
479 | ␊ |
480 | ␉{ 0x95C5,␉0x30501787, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
481 | ␊ |
482 | ␉{ 0x95C5,␉0x301017AF, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 4230",␉␉␉␉kNull␉␉, 0 },␊ |
483 | ␊ |
484 | ␉{ 0x95C5,␉0x01041A93, CHIP_FAMILY_RV620,␉␉"Qimonda Radeon HD 3450",␉␉␉kNull␉␉, 0 },␊ |
485 | ␉{ 0x95C5,␉0x01051A93, CHIP_FAMILY_RV620,␉␉"Qimonda Radeon HD 3450",␉␉␉kNull␉␉, 0 },␊ |
486 | ␊ |
487 | ␉/* Evergreen */␊ |
488 | ␉{ 0x6898,␉0x0B001002, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5870",␉␉␉␉kZonalis␉, 0 },␊ |
489 | ␊ |
490 | ␉{ 0x6898,␉0x032E1043, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5870",␉␉␉␉kUakari␉␉, 0 },␊ |
491 | ␊ |
492 | ␉{ 0x6898,␉0x00D0106B, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5870",␉␉␉␉kLangur␉␉, 0 },␊ |
493 | ␊ |
494 | ␉{ 0x6898,␉0xE140174B, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5870",␉␉␉␉kUakari␉␉, 0 },␊ |
495 | ␊ |
496 | ␉{ 0x6898,␉0x29611682, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5870",␉␉␉␉kUakari␉␉, 0 },␊ |
497 | ␊ |
498 | ␉{ 0x6899,␉0x21E41458, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5850",␉␉␉␉kUakari␉␉, 0 },␊ |
499 | ␊ |
500 | ␉{ 0x6899,␉0xE140174B, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5850",␉␉␉␉kUakari␉␉, 0 },␊ |
501 | ␊ |
502 | ␉{ 0x6899,␉0xE174174B, CHIP_FAMILY_CYPRESS,␉"ATI Sapphire Radeon HD 5850",␉␉␉␉kUakari␉␉, 0 },␊ |
503 | ␊ |
504 | ␉{ 0x6899,␉0x200A1787, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5850",␉␉␉␉kUakari␉␉, 0 },␊ |
505 | ␉{ 0x6899,␉0x22901787, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5850",␉␉␉␉kUakari␉␉, 0 },␊ |
506 | ␊ |
507 | ␉{ 0x689C,␉0x03521043, CHIP_FAMILY_HEMLOCK,␉"ASUS ARES",␉␉␉␉␉kUakari␉␉, 0 },␊ |
508 | ␉{ 0x689C,␉0x039E1043, CHIP_FAMILY_HEMLOCK,␉"ASUS EAH5870 Series",␉␉␉␉kUakari␉␉, 0 },␊ |
509 | ␊ |
510 | ␉{ 0x689C,␉0x30201682, CHIP_FAMILY_HEMLOCK,␉"ATI Radeon HD 5970",␉␉␉␉kUakari␉␉, 0 },␊ |
511 | ␊ |
512 | ␉{ 0x68A0,␉0x043A1028,␉CHIP_FAMILY_BROADWAY,␉"ATI Mobility Radeon HD 5870",␉␉␉kNull␉, 0 }, // ErmaC␊ |
513 | ␊ |
514 | ␉{ 0x68A1,␉0x144D103C,␉CHIP_FAMILY_CYPRESS,␉"ATI Mobility Radeon HD 5850",␉␉␉kNomascus␉, 0 },␊ |
515 | ␉{ 0x68A1,␉0x1522103C, CHIP_FAMILY_CYPRESS,␉"ATI Mobility Radeon HD 5850",␉␉␉kHoolock␉, 0 },␊ |
516 | ␊ |
517 | ␉{ 0x68A8,␉0x050E1025, CHIP_FAMILY_CYPRESS,␉"AMD Radeon HD 6850M",␉␉␉␉kUakari␉␉, 0 },␊ |
518 | ␊ |
519 | ␉{ 0x68BA,␉0x174B1482, CHIP_FAMILY_JUNIPER,␉"ATI Sapphire Radeon HD 6770",␉␉␉kVervet␉␉, 0 }, // ErmaC␊ |
520 | ␊ |
521 | ␉{ 0x68B8,␉0x00CF106B, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kHoolock␉, 0 },␊ |
522 | ␊ |
523 | ␉{ 0x68B8,␉0x21f61458, CHIP_FAMILY_JUNIPER,␉"GigaByte HD5770 R577SL-1GD",␉␉␉kVervet␉␉, 0 }, // ErmaC␊ |
524 | ␊ |
525 | ␉{ 0x68B8,␉0x29901682, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
526 | ␉{ 0x68B8,␉0x29911682, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
527 | ␊ |
528 | ␉{ 0x68B8,␉0x1482174B, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
529 | ␉{ 0x68B8,␉0xE144174B, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kHoolock␉, 0 }, // ErmaC␊ |
530 | ␉{ 0x68B8,␉0xE147174B, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
531 | ␊ |
532 | ␉{ 0x68B8,␉0x21D71458, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
533 | ␊ |
534 | ␉{ 0x68B8,␉0x200A1787, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 }, // ErmaC␊ |
535 | ␉{ 0x68B8,␉0x200B1787, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
536 | ␉{ 0x68B8,␉0x22881787, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5770",␉␉␉␉kVervet␉␉, 0 },␊ |
537 | ␊ |
538 | ␉{ 0x68BE,␉0x22881787, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5750",␉␉␉kVervet␉␉, 0 }, // ErmaC␊ |
539 | ␊ |
540 | ␉{ 0x68BF,␉0x220E1458, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 6750",␉␉␉␉kVervet␉␉, 0 },␊ |
541 | ␊ |
542 | ␉{ 0x68C0,␉0x1594103C, CHIP_FAMILY_REDWOOD,␉"AMD Radeon HD 6570M",␉␉␉␉kNull␉␉, 0 },␊ |
543 | ␊ |
544 | ␉{ 0x68C0,␉0x392717AA, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5730",␉␉␉kNull␉␉, 0 },␊ |
545 | ␊ |
546 | ␉{ 0x68C0,␉0x395217AA, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5730",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
547 | ␊ |
548 | ␉{ 0x68C1,␉0x02051025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
549 | ␉{ 0x68C1,␉0x02961025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
550 | ␉{ 0x68C1,␉0x030A1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
551 | ␉{ 0x68C1,␉0x033D1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
552 | ␉{ 0x68C1,␉0x033E1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
553 | ␉{ 0x68C1,␉0x03471025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
554 | ␉{ 0x68C1,␉0x03561025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
555 | ␉{ 0x68C1,␉0x03581025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
556 | ␉{ 0x68C1,␉0x035A1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
557 | ␉{ 0x68C1,␉0x035C1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
558 | ␉{ 0x68C1,␉0x03641025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
559 | ␉{ 0x68C1,␉0x03791025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
560 | ␉{ 0x68C1,␉0x037E1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
561 | ␉{ 0x68C1,␉0x03821025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5750",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
562 | ␊ |
563 | ␉{ 0x68C1,␉0x033E1025, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5650",␉␉␉kNull␉␉, 0 },␊ |
564 | ␊ |
565 | ␉{ 0x68C1,␉0x9071104D, CHIP_FAMILY_REDWOOD,␉"ATI Mobility Radeon HD 5650",␉␉␉kEulemur␉, 0 },␊ |
566 | ␊ |
567 | ␉{ 0x68C8,␉0x2306103C, CHIP_FAMILY_REDWOOD,␉"ATI FirePro V4800 (FireGL)",␉␉␉kNull␉␉, 0 },␊ |
568 | ␊ |
569 | ␉{ 0x68D8,␉0x03561043, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5670",␉␉␉␉kBaboon␉␉, 0 },␊ |
570 | ␊ |
571 | ␉{ 0x68D8,␉0x21D91458, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5670",␉␉␉␉kBaboon␉␉, 0 },␊ |
572 | ␊ |
573 | ␉{ 0x68D8,␉0x5690174B, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5690",␉␉␉␉kNull␉␉, 0 },␊ |
574 | ␉{ 0x68D8,␉0x5730174B, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5730",␉␉␉␉kNull␉␉, 0 },␊ |
575 | ␉{ 0x68D8,␉0xE151174B, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5670",␉␉␉␉kBaboon␉␉, 0 },␊ |
576 | ␊ |
577 | ␉{ 0x68D8,␉0x30001787, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5730",␉␉␉␉kNull␉␉, 0 },␊ |
578 | ␊ |
579 | ␉{ 0x68D8,␉0x301017AF, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5730",␉␉␉␉kNull␉␉, 0 },␊ |
580 | ␉{ 0x68D8,␉0x301117AF, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5690",␉␉␉␉kNull␉␉, 0 },␊ |
581 | ␊ |
582 | ␉{ 0x68D9,␉0x301017AF, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5630",␉␉␉␉kNull␉␉, 0 },␊ |
583 | ␊ |
584 | ␉{ 0x68DA,␉0x5630174B, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5630",␉␉␉␉kNull␉␉, 0 },␊ |
585 | ␊ |
586 | ␉{ 0x68DA,␉0x30001787, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5630",␉␉␉␉kNull␉␉, 0 },␊ |
587 | ␊ |
588 | ␉{ 0x68DA,␉0x301017AF, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5630",␉␉␉␉kNull␉␉, 0 },␊ |
589 | ␊ |
590 | ␉{ 0x68E0,␉0x04561028, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5470M",␉␉␉␉kEulemur␉, 0 },␊ |
591 | ␊ |
592 | ␉{ 0x68E0,␉0x1433103C, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5470M",␉␉␉␉kEulemur␉, 0 },␊ |
593 | ␊ |
594 | ␉{ 0x68E1,␉0x1426103C, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5430M",␉␉␉␉kEulemur␉, 0 },␊ |
595 | ␊ |
596 | ␉{ 0x68F9,␉0x010E1002, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5450",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
597 | ␊ |
598 | ␉{ 0x68F9,␉0x03741043, CHIP_FAMILY_CEDAR,␉␉"ASUS EAH5450", kNull␉␉, 0 }, // ErmaC␊ |
599 | ␊ |
600 | ␉{ 0x68F9,␉0x5470174B, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5470",␉␉␉␉kNull␉␉, 0 },␊ |
601 | ␉{ 0x68F9,␉0x5490174B, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5490",␉␉␉␉kNull␉␉, 0 },␊ |
602 | ␉{ 0x68F9,␉0x5530174B, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5530",␉␉␉␉kNull␉␉, 0 },␊ |
603 | ␊ |
604 | ␉{ 0x68F9,␉0x20091787, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5450",␉␉␉␉kEulemur␉, 0 },␊ |
605 | ␉{ 0x68F9,␉0x22911787, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5450",␉␉␉␉kEulemur␉, 0 },␊ |
606 | ␉{ 0x68F9,␉0x23401462, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5450",␉␉␉␉kEulemur␉, 0 }, // ErmaC␊ |
607 | ␉{ 0x68F9,␉0x30001787, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5470",␉␉␉␉kNull␉␉, 0 },␊ |
608 | ␉{ 0x68F9,␉0x30011787, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5530",␉␉␉␉kNull␉␉, 0 },␊ |
609 | ␉{ 0x68F9,␉0x30021787, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5490",␉␉␉␉kNull␉␉, 0 },␊ |
610 | ␊ |
611 | ␉{ 0x68F9,␉0x301117AF, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5470",␉␉␉␉kNull␉␉, 0 },␊ |
612 | ␉{ 0x68F9,␉0x301217AF, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5490",␉␉␉␉kNull␉␉, 0 },␊ |
613 | ␉{ 0x68F9,␉0x301317AF, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5470",␉␉␉␉kNull␉␉, 0 },␊ |
614 | ␊ |
615 | ␉{ 0x68F9,␉0xE145174B, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5450",␉␉␉␉kEulemur␉, 0 }, // ErmaC␊ |
616 | ␉{ 0x68F9,␉0xE153174B, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5450",␉␉␉␉kEulemur␉, 0 }, // ErmaC␊ |
617 | ␊ |
618 | ␉/* Northen Islands */␊ |
619 | ␉{ 0x6718,␉0x0B001002, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6970",␉␉␉␉kNull␉␉, 0 },␊ |
620 | ␉{ 0x6718,␉0x67181002, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6970",␉␉␉␉kNull␉␉, 0 },␊ |
621 | ␉{ 0x6718,␉0x31301682, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6970",␉␉␉␉kNull␉␉, 0 },␊ |
622 | ␊ |
623 | ␉{ 0x6719,␉0x0B001002, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6950",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
624 | ␉{ 0x6719,␉0x186B174B, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6950",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
625 | ␉{ 0x6719,␉0x20101787, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6970",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
626 | ␊ |
627 | ␉{ 0x671D,␉0x10020B2A, CHIP_FAMILY_ANTILLES,␉"AMD Radeon HD 6990",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
628 | ␉{ 0x671D,␉0x10021B2A, CHIP_FAMILY_ANTILLES,␉"AMD Radeon HD 6990",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
629 | ␉{ 0x671D,␉0x16823160, CHIP_FAMILY_ANTILLES,␉"AMD Radeon HD 6990",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
630 | ␊ |
631 | ␉{ 0x6720,␉0x04BA1028, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6970m",␉␉␉␉kElodea␉␉, 0 }, // ErmaC␊ |
632 | ␊ |
633 | ␉{ 0x6738,␉0x00D01002, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
634 | ␉{ 0x6738,␉0x174B174B, CHIP_FAMILY_BARTS,␉␉"Sapphire Radeon HD6870",␉␉␉kBulrushes␉, 0 }, // ErmaC␊ |
635 | ␉{ 0x6738,␉0x21FA1002, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
636 | ␉{ 0x6738,␉0x67381002, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
637 | ␊ |
638 | ␉{ 0x6738,␉0x21FA1458, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
639 | ␊ |
640 | ␉{ 0x6738,␉0x31031682, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
641 | ␉{ 0x6738,␉0x31041682, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
642 | ␉{ 0x6738,␉0x31071682, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 }, // ErmaC␊ |
643 | ␉{ 0x6738,␉0x31081682, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 }, // ErmaC ?? kJuncus ??␊ |
644 | ␊ |
645 | ␉{ 0x6738,␉0xE178174B, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
646 | ␊ |
647 | ␉{ 0x6738,␉0x20101787, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
648 | ␉{ 0x6738,␉0x23051787, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870",␉␉␉␉kDuckweed␉, 0 },␊ |
649 | ␊ |
650 | ␉{ 0x6739,␉0x03B41043, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850",␉␉␉␉kDuckweed␉, 0 }, // ErmaC␊ |
651 | ␉{ 0x6739,␉0x21F81458, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850",␉␉␉␉kBulrushes␉, 0 }, // ErmaC␊ |
652 | ␉{ 0x6739,␉0x24411462, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850",␉␉␉␉kDuckweed␉, 0 },␊ |
653 | ␉{ 0x6739,␉0x31101682, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850",␉␉␉␉kDuckweed␉, 0 }, ␊ |
654 | ␉{ 0x6739,␉0x67391002, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850",␉␉␉␉kDuckweed␉, 0 },␊ |
655 | ␉{ 0x6739,␉0xE177174B, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850",␉␉␉␉kDuckweed␉, 0 },␊ |
656 | ␊ |
657 | ␉{ 0x6740,␉0x1D121043, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6730M",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
658 | ␉{ 0x6740,␉0x1657103C, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6770M",␉␉␉␉kNull␉␉, 0 },␊ |
659 | ␉{ 0x6740,␉0x165A103C, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6770M",␉␉␉␉kNull␉␉, 0 },␊ |
660 | ␊ |
661 | ␉{ 0x6741,␉0x050E1025, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6650M",␉␉␉␉kNull␉␉, 0 },␊ |
662 | ␉{ 0x6741,␉0x05131025, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6650M",␉␉␉␉kNull␉␉, 0 },␊ |
663 | ␊ |
664 | ␉{ 0x6741,␉0x1646103C, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6750M",␉␉␉␉kNull␉␉, 0 },␊ |
665 | ␊ |
666 | ␉{ 0x6741,␉0x9080104D, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6630M",␉␉␉␉kNull␉␉, 0 },␊ |
667 | ␊ |
668 | ␉{ 0x6758,␉0x67581002, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670",␉␉␉␉kBulrushes␉, 0 },␊ |
669 | ␊ |
670 | ␉{ 0x6758,␉0x22051458, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670",␉␉␉␉kBulrushes␉, 0 },␊ |
671 | ␊ |
672 | ␉{ 0x6758,␉0xE194174B, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670",␉␉␉␉kBulrushes␉, 0 },␊ |
673 | ␊ |
674 | ␉{ 0x6758,␉0x31811682, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670",␉␉␉␉kBulrushes␉, 0 },␊ |
675 | ␉{ 0x6758,␉0x31831682, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670",␉␉␉␉kBulrushes␉, 0 },␊ |
676 | ␊ |
677 | ␉{ 0x6758,␉0xE1941746, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670",␉␉␉␉kBulrushes␉, 0 },␊ |
678 | ␊ |
679 | ␉{ 0x6759,␉0xE193174B, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6570",␉␉␉␉kNull␉␉, 0 },␊ |
680 | ␊ |
681 | ␉{ 0x6760,␉0x04CC1028, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6490M",␉␉␉␉kNull␉␉, 0 },␊ |
682 | ␊ |
683 | ␉{ 0x6760,␉0x167D103C, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6490M",␉␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
684 | ␊ |
685 | ␉{ 0x6760,␉0x1CB21043, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6470M",␉␉␉␉kNull␉␉, 0 },␊ |
686 | ␊ |
687 | ␉{ 0x6779,␉0x64501092, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6450",␉␉␉␉kBulrushes␉, 0 },␊ |
688 | ␊ |
689 | ␉{ 0x6779,␉0xE164174B, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6450",␉␉␉␉kBulrushes␉, 0 },␉␊ |
690 | ␊ |
691 | ␉/* standard/default models */␊ |
692 | ␉{ 0x9400,␉0x00000000, CHIP_FAMILY_R600,␉␉"ATI Radeon HD 2900 XT",␉␉␉kNull␉␉, 0 },␊ |
693 | ␉{ 0x9405,␉0x00000000, CHIP_FAMILY_R600,␉␉"ATI Radeon HD 2900 GT",␉␉␉kNull␉␉, 0 },␊ |
694 | ␊ |
695 | ␉{ 0x9440,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
696 | ␉{ 0x9441,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4870 X2",␉␉␉kMotmot␉␉, 0 },␊ |
697 | ␉{ 0x9442,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
698 | ␉{ 0x9443,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4850 X2",␉␉␉kMotmot␉␉, 0 },␊ |
699 | ␉{ 0x944C,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
700 | ␉{ 0x944E,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4700 Series",␉␉␉kMotmot␉␉, 0 },␊ |
701 | ␊ |
702 | ␉{ 0x9450,␉0x00000000, CHIP_FAMILY_RV770,␉␉"AMD FireStream 9270",␉␉␉␉kMotmot␉␉, 0 },␊ |
703 | ␉{ 0x9452,␉0x00000000, CHIP_FAMILY_RV770,␉␉"AMD FireStream 9250",␉␉␉␉kMotmot␉␉, 0 },␊ |
704 | ␊ |
705 | ␉{ 0x9460,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
706 | ␉{ 0x9462,␉0x00000000, CHIP_FAMILY_RV770,␉␉"ATI Radeon HD 4800 Series",␉␉␉kMotmot␉␉, 0 },␊ |
707 | ␊ |
708 | ␉{ 0x9490,␉0x00000000, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4600 Series",␉␉␉kFlicker␉, 0 },␊ |
709 | ␉{ 0x9498,␉0x00000000, CHIP_FAMILY_RV730,␉␉"ATI Radeon HD 4600 Series",␉␉␉kFlicker␉, 0 },␊ |
710 | ␊ |
711 | ␉{ 0x94B3,␉0x00000000, CHIP_FAMILY_RV740,␉␉"ATI Radeon HD 4770",␉␉␉␉kFlicker␉, 0 },␊ |
712 | ␉{ 0x94B4,␉0x00000000, CHIP_FAMILY_RV740,␉␉"ATI Radeon HD 4700 Series",␉␉␉kFlicker␉, 0 },␊ |
713 | ␉{ 0x94B5,␉0x00000000, CHIP_FAMILY_RV740,␉␉"ATI Radeon HD 4770",␉␉␉␉kFlicker␉, 0 },␊ |
714 | ␊ |
715 | ␉{ 0x94C1,␉0x00000000, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 Series",␉␉␉kIago␉␉, 0 },␊ |
716 | ␉{ 0x94C3,␉0x00000000, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 Series",␉␉␉kIago␉␉, 0 },␊ |
717 | ␉{ 0x94C7,␉0x00000000, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2350",␉␉␉␉kIago␉␉, 0 },␊ |
718 | ␉{ 0x94CC,␉0x00000000, CHIP_FAMILY_RV610,␉␉"ATI Radeon HD 2400 Series",␉␉␉kIago␉␉, 0 },␊ |
719 | ␊ |
720 | ␉{ 0x9501,␉0x00000000, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3800 Series",␉␉␉kMegalodon␉, 0 },␊ |
721 | ␉{ 0x9505,␉0x00000000, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3800 Series",␉␉␉kMegalodon␉, 0 },␊ |
722 | ␉{ 0x9507,␉0x00000000, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3830",␉␉␉␉kMegalodon␉, 0 },␊ |
723 | ␉{ 0x950F,␉0x00000000, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3870 X2",␉␉␉kMegalodon␉, 0 },␊ |
724 | ␊ |
725 | ␉{ 0x9513,␉0x00000000, CHIP_FAMILY_RV670,␉␉"ATI Radeon HD 3850 X2",␉␉␉kMegalodon␉, 0 },␊ |
726 | ␉{ 0x9519,␉0x00000000, CHIP_FAMILY_RV670,␉␉"AMD FireStream 9170",␉␉␉␉kMegalodon␉, 0 },␊ |
727 | ␊ |
728 | ␉{ 0x9540,␉0x00000000, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4550",␉␉␉␉kNull␉␉, 0 },␊ |
729 | ␉{ 0x954F,␉0x00000000, CHIP_FAMILY_RV710,␉␉"ATI Radeon HD 4300/4500 Series",␉␉kNull␉␉, 0 },␊ |
730 | ␊ |
731 | ␉{ 0x9553,␉0x00000000, CHIP_FAMILY_RV710,␉␉"ATI Mobility Radeon HD 4500/5100 Series",␉kShrike ␉, 0 },␊ |
732 | ␊ |
733 | ␉{ 0x9588,␉0x00000000, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 2600 XT",␉␉␉kLamna␉␉, 0 },␊ |
734 | ␉{ 0x9589,␉0x00000000, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 2600 PRO",␉␉␉kLamna␉␉, 0 },␊ |
735 | ␉{ 0x958A,␉0x00000000, CHIP_FAMILY_RV630,␉␉"ATI Radeon HD 2600 X2 Series",␉␉␉kLamna␉␉, 0 },␊ |
736 | ␊ |
737 | ␉{ 0x9598,␉0x00000000, CHIP_FAMILY_RV635,␉␉"ATI Radeon HD 3600 Series",␉␉␉kMegalodon␉, 0 },␊ |
738 | ␊ |
739 | ␉{ 0x95C0,␉0x00000000, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3400 Series",␉␉␉kIago␉␉, 0 },␊ |
740 | ␉{ 0x95C5,␉0x00000000, CHIP_FAMILY_RV620,␉␉"ATI Radeon HD 3400 Series",␉␉␉kIago␉␉, 0 },␊ |
741 | ␊ |
742 | ␉/* IGP */␊ |
743 | ␉{ 0x9610,␉0x00000000, CHIP_FAMILY_RS780,␉␉"ATI Radeon HD 3200 Graphics",␉␉␉kNull␉␉, 0 },␊ |
744 | ␉{ 0x9611,␉0x00000000, CHIP_FAMILY_RS780,␉␉"ATI Radeon 3100 Graphics",␉␉␉kNull␉␉, 0 },␊ |
745 | ␉{ 0x9614,␉0x00000000, CHIP_FAMILY_RS780,␉␉"ATI Radeon HD 3300 Graphics",␉␉␉kNull␉␉, 0 },␊ |
746 | ␉{ 0x9616,␉0x00000000, CHIP_FAMILY_RS780,␉␉"AMD 760G",␉␉␉␉␉kNull␉␉, 0 },␊ |
747 | ␊ |
748 | ␉{ 0x9710,␉0x00000000, CHIP_FAMILY_RS880,␉␉"ATI Radeon HD 4200",␉␉␉␉kNull␉␉, 0 },␊ |
749 | ␉{ 0x9715,␉0x00000000, CHIP_FAMILY_RS880,␉␉"ATI Radeon HD 4250",␉␉␉␉kNull␉␉, 0 },␊ |
750 | ␉{ 0x9714,␉0x00000000, CHIP_FAMILY_RS880,␉␉"ATI Radeon HD 4290",␉␉␉␉kNull␉␉, 0 },␊ |
751 | ␊ |
752 | ␉/* Evergreen */␊ |
753 | ␉{ 0x688D,␉0x00000000, CHIP_FAMILY_CYPRESS,␉"AMD FireStream 9350",␉␉␉␉kUakari␉␉, 0 },␊ |
754 | ␊ |
755 | ␉{ 0x6898,␉0x00000000, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5800 Series",␉␉␉kUakari␉␉, 0 },␊ |
756 | ␉{ 0x6899,␉0x00000000, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5800 Series",␉␉␉kUakari␉␉, 0 },␊ |
757 | ␉{ 0x689C,␉0x00000000, CHIP_FAMILY_HEMLOCK,␉"ATI Radeon HD 5900 Series",␉␉␉kUakari␉␉, 0 },␊ |
758 | ␉{ 0x689E,␉0x00000000, CHIP_FAMILY_CYPRESS,␉"ATI Radeon HD 5800 Series",␉␉␉kUakari␉␉, 0 },␊ |
759 | ␊ |
760 | ␉{ 0x68A0,␉0x00000000, CHIP_FAMILY_BROADWAY,␉"ATI Mobility Radeon HD 5800 Series",␉kNull␉␉, 0 }, // ErmaC␊ |
761 | ␉{ 0x68A1,␉0x00000000, CHIP_FAMILY_BROADWAY,␉"ATI Mobility Radeon HD 5800 Series",␉kNull␉␉, 0 }, // ErmaC␊ |
762 | ␉{ 0x68B0,␉0x00000000, CHIP_FAMILY_BROADWAY,␉"ATI Mobility Radeon HD 5800 Series",␉kNull␉␉, 0 }, // ErmaC␊ |
763 | ␊ |
764 | ␉{ 0x68B8,␉0x00000000, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5700 Series",␉␉␉kVervet␉␉, 0 },␊ |
765 | ␉{ 0x68B9,␉0x00000000, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5600 Series",␉␉␉kVervet␉␉, 0 },␊ |
766 | ␉{ 0x68BE,␉0x00000000, CHIP_FAMILY_JUNIPER,␉"ATI Radeon HD 5700 Series",␉␉␉kVervet␉␉, 0 },␊ |
767 | ␊ |
768 | ␉{ 0x68D8,␉0x00000000, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5600 Series",␉␉␉kBaboon␉␉, 0 },␊ |
769 | ␉{ 0x68D9,␉0x00000000, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5500 Series",␉␉␉kBaboon␉␉, 0 },␊ |
770 | ␉{ 0x68DA,␉0x00000000, CHIP_FAMILY_REDWOOD,␉"ATI Radeon HD 5500 Series",␉␉␉kBaboon␉␉, 0 },␊ |
771 | ␊ |
772 | ␉{ 0x68F9,␉0x00000000, CHIP_FAMILY_CEDAR,␉␉"ATI Radeon HD 5400 Series",␉␉␉kNull␉␉, 0 },␊ |
773 | ␊ |
774 | ␉/* Northen Islands */␊ |
775 | ␉{ 0x6718,␉0x00000000, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6970 Series",␉␉␉kNull␉␉, 0 },␊ |
776 | ␉{ 0x6719,␉0x00000000, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6950 Series",␉␉␉kNull␉␉, 0 },␊ |
777 | ␊ |
778 | ␉{ 0x671D,␉0x00000000, CHIP_FAMILY_ANTILLES,␉"AMD Radeon HD 6900 Series",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
779 | ␉{ 0x671F,␉0x00000000, CHIP_FAMILY_CAYMAN,␉␉"AMD Radeon HD 6900 Series",␉␉␉kNull␉␉, 0 }, // ErmaC␊ |
780 | ␊ |
781 | ␉{ 0x6720,␉0x00000000, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6900M Series",␉␉␉kNull␉␉, 0 },␊ |
782 | ␊ |
783 | ␉{ 0x6738,␉0x00000000, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6870 Series",␉␉␉kDuckweed␉, 0 },␊ |
784 | ␉{ 0x6739,␉0x00000000, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6850 Series",␉␉␉kDuckweed␉, 0 },␊ |
785 | ␉{ 0x673E,␉0x00000000, CHIP_FAMILY_BARTS,␉␉"AMD Radeon HD 6790 Series",␉␉␉kNull␉␉, 0 },␊ |
786 | ␊ |
787 | ␉{ 0x6740,␉0x00000000, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6700M Series",␉␉␉kNull␉␉, 0 },␊ |
788 | ␉{ 0x6741,␉0x00000000, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6600M/6700M Series",␉␉kNull␉␉, 0 },␊ |
789 | ␊ |
790 | ␉{ 0x6758,␉0x00000000, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6670 Series",␉␉␉kBulrushes␉, 0 },␊ |
791 | ␉{ 0x6759,␉0x00000000, CHIP_FAMILY_TURKS,␉␉"AMD Radeon HD 6500 Series",␉␉␉kNull␉␉, 0 },␊ |
792 | ␊ |
793 | ␉{ 0x6760,␉0x00000000, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6400M Series",␉␉␉kNull␉␉, 0 },␊ |
794 | ␉{ 0x6761,␉0x00000000, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6430M Series",␉␉␉kNull␉␉, 0 },␊ |
795 | ␉␊ |
796 | ␉{ 0x6770,␉0x00000000, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6400 Series",␉␉␉kNull␉␉, 0 },␊ |
797 | ␉{ 0x6779,␉0x00000000, CHIP_FAMILY_CAICOS,␉␉"AMD Radeon HD 6450 Series",␉␉␉kBulrushes␉, 0 },␊ |
798 | ␊ |
799 | ␉/* Southen Islands */␊ |
800 | ␊ |
801 | };␊ |
802 | ␊ |
803 | typedef struct {␊ |
804 | ␉struct DevPropDevice␉*device;␊ |
805 | ␉radeon_card_info_t␉␉*info;␊ |
806 | ␉pci_dt_t␉␉␉␉*pci_dev;␊ |
807 | ␉uint8_t␉␉␉␉␉*fb;␊ |
808 | ␉uint8_t␉␉␉␉␉*mmio;␊ |
809 | ␉uint8_t␉␉␉␉␉*io;␊ |
810 | ␉uint8_t␉␉␉␉␉*rom;␊ |
811 | ␉uint32_t␉␉␉␉rom_size;␊ |
812 | ␉uint32_t␉␉␉␉vram_size;␊ |
813 | ␉const char␉␉␉␉*cfg_name;␊ |
814 | ␉uint8_t␉␉␉␉␉ports;␊ |
815 | ␉uint32_t␉␉␉␉flags;␊ |
816 | ␉bool␉␉␉␉␉posted;␊ |
817 | } card_t;␊ |
818 | card_t *card;␊ |
819 | ␊ |
820 | /* Flags */␊ |
821 | #define MKFLAG(n)␉␉␉(1 << n)␊ |
822 | #define FLAGTRUE␉␉␉MKFLAG(0)␊ |
823 | #define EVERGREEN␉␉␉MKFLAG(1)␊ |
824 | ␊ |
825 | //static uint8_t atN = 0;␊ |
826 | ␊ |
827 | typedef struct {␊ |
828 | ␉type_t␉␉␉␉␉type;␊ |
829 | ␉uint32_t␉␉␉␉size;␊ |
830 | ␉uint8_t␉␉␉␉␉*data;␊ |
831 | } value_t;␊ |
832 | ␊ |
833 | static value_t aty_name;␊ |
834 | static value_t aty_nameparent;␊ |
835 | //static value_t aty_model;␊ |
836 | ␊ |
837 | #define DATVAL(x)␉␉␉{kPtr, sizeof(x), (uint8_t *)x}␊ |
838 | #define STRVAL(x)␉␉␉{kStr, sizeof(x), (uint8_t *)x}␊ |
839 | #define BYTVAL(x)␉␉␉{kCst, 1, (uint8_t *)x}␊ |
840 | #define WRDVAL(x)␉␉␉{kCst, 2, (uint8_t *)x}␊ |
841 | #define DWRVAL(x)␉␉␉{kCst, 4, (uint8_t *)x}␊ |
842 | #define QWRVAL(x)␉␉␉{kCst, 8, (uint8_t *)x}␊ |
843 | #define NULVAL␉␉␉␉{kNul, 0, (uint8_t *)NULL}␊ |
844 | ␊ |
845 | bool get_bootdisplay_val(value_t *val);␊ |
846 | bool get_vrammemory_val(value_t *val);␊ |
847 | bool get_name_val(value_t *val);␊ |
848 | bool get_nameparent_val(value_t *val);␊ |
849 | bool get_model_val(value_t *val);␊ |
850 | bool get_conntype_val(value_t *val);␊ |
851 | bool get_vrammemsize_val(value_t *val);␊ |
852 | bool get_binimage_val(value_t *val);␊ |
853 | bool get_romrevision_val(value_t *val);␊ |
854 | bool get_deviceid_val(value_t *val);␊ |
855 | bool get_mclk_val(value_t *val);␊ |
856 | bool get_sclk_val(value_t *val);␊ |
857 | bool get_refclk_val(value_t *val);␊ |
858 | bool get_platforminfo_val(value_t *val);␊ |
859 | bool get_vramtotalsize_val(value_t *val);␊ |
860 | ␊ |
861 | typedef struct {␊ |
862 | ␉uint32_t␉␉␉␉flags;␊ |
863 | ␉bool␉␉␉␉␉all_ports;␊ |
864 | ␉char␉␉␉␉␉*name;␊ |
865 | ␉bool␉␉␉␉␉(*get_value)(value_t *val);␊ |
866 | ␉value_t␉␉␉␉␉default_val;␊ |
867 | } dev_prop_t;␊ |
868 | ␊ |
869 | dev_prop_t ati_devprop_list[] = {␊ |
870 | ␉{FLAGTRUE,␉false,␉"@0,AAPL,boot-display",␉␉get_bootdisplay_val,␉NULVAL␉␉␉␉␉␉␉},␊ |
871 | //␉{FLAGTRUE,␉false,␉"@0,ATY,EFIDisplay",␉␉NULL,␉␉␉␉␉STRVAL("TMDSA")␉␉␉␉␉},␊ |
872 | ␉␊ |
873 | //␉{FLAGTRUE,␉true,␉"@0,AAPL,vram-memory",␉␉get_vrammemory_val,␉␉NULVAL␉␉␉␉␉␉␉},␊ |
874 | //␉{FLAGTRUE,␉true,␉"@0,compatible",␉␉␉get_name_val,␉␉␉NULVAL␉␉␉␉␉␉␉},␊ |
875 | //␉{FLAGTRUE,␉true,␉"@0,connector-type",␉␉get_conntype_val,␉␉NULVAL␉␉␉␉␉␉␉},␊ |
876 | //␉{FLAGTRUE,␉true,␉"@0,device_type",␉␉␉NULL,␉␉␉␉␉STRVAL("display")␉␉␉␉},␊ |
877 | //␉{FLAGTRUE,␉false,␉"@0,display-connect-flags", NULL,␉␉␉␉␉DWRVAL((uint32_t)0)␉␉␉␉},␊ |
878 | //␉{FLAGTRUE,␉true,␉"@0,display-type",␉␉␉NULL,␉␉␉␉␉STRVAL("NONE")␉␉␉␉␉},␊ |
879 | ␉{FLAGTRUE,␉true,␉"@0,name",␉␉␉␉␉get_name_val,␉␉␉NULVAL␉␉␉␉␉␉␉},␊ |
880 | //␉{FLAGTRUE,␉true,␉"@0,VRAM,memsize",␉␉␉get_vrammemsize_val,␉NULVAL␉␉␉␉␉␉␉},␊ |
881 | ␉␊ |
882 | //␉{FLAGTRUE,␉false,␉"AAPL,aux-power-connected", NULL,␉␉␉␉␉DWRVAL((uint32_t)1)␉␉␉␉},␊ |
883 | //␉{FLAGTRUE,␉false,␉"AAPL,backlight-control",␉NULL,␉␉␉␉␉DWRVAL((uint32_t)0)␉␉␉␉},␊ |
884 | ␉{FLAGTRUE,␉false,␉"ATY,bin_image",␉␉␉get_binimage_val,␉␉NULVAL␉␉␉␉␉␉␉},␊ |
885 | ␉{FLAGTRUE,␉false,␉"ATY,Copyright",␉␉␉NULL,␉STRVAL("Copyright AMD Inc. All Rights Reserved. 2005-2010") },␊ |
886 | ␉{FLAGTRUE,␉false,␉"ATY,Card#",␉␉␉␉get_romrevision_val,␉NULVAL␉␉␉␉␉␉␉},␊ |
887 | ␉{FLAGTRUE,␉false,␉"ATY,VendorID",␉␉␉␉NULL,␉␉␉␉␉WRDVAL((uint16_t)0x1002)␉␉},␊ |
888 | ␉{FLAGTRUE,␉false,␉"ATY,DeviceID",␉␉␉␉get_deviceid_val,␉␉NULVAL␉␉␉␉␉␉␉},␊ |
889 | ␉␊ |
890 | //␉{FLAGTRUE,␉false,␉"ATY,MCLK",␉␉␉␉␉get_mclk_val,␉␉␉NULVAL␉␉␉␉␉␉␉},␊ |
891 | //␉{FLAGTRUE,␉false,␉"ATY,SCLK",␉␉␉␉␉get_sclk_val,␉␉␉NULVAL␉␉␉␉␉␉␉},␊ |
892 | //␉{FLAGTRUE,␉false,␉"ATY,RefCLK",␉␉␉␉get_refclk_val,␉␉␉DWRVAL((uint32_t)0x0a8c)␉␉},␊ |
893 | ␉␊ |
894 | //␉{FLAGTRUE,␉false,␉"ATY,PlatformInfo",␉␉␉get_platforminfo_val,␉NULVAL␉␉␉␉␉␉␉},␊ |
895 | ␉␊ |
896 | ␉{FLAGTRUE,␉false,␉"name",␉␉␉␉␉␉get_nameparent_val,␉␉NULVAL␉␉␉␉␉␉␉},␊ |
897 | ␉{FLAGTRUE,␉false,␉"device_type",␉␉␉␉get_nameparent_val,␉␉NULVAL␉␉␉␉␉␉␉},␊ |
898 | ␉{FLAGTRUE,␉false,␉"model",␉␉␉␉␉get_model_val,␉␉␉STRVAL("ATI Radeon")␉␉␉},␊ |
899 | //␉{FLAGTRUE,␉false,␉"VRAM,totalsize",␉␉␉get_vramtotalsize_val,␉NULVAL␉␉␉␉␉␉␉},␊ |
900 | ␉␊ |
901 | ␉{FLAGTRUE,␉false,␉NULL,␉␉␉␉␉␉NULL,␉␉␉␉␉NULVAL␉␉␉␉␉␉␉}␊ |
902 | };␊ |
903 | ␊ |
904 | bool get_bootdisplay_val(value_t *val)␊ |
905 | {␊ |
906 | ␉static uint32_t v = 0;␊ |
907 | ␉␊ |
908 | ␉if (v)␊ |
909 | ␉␉return false;␊ |
910 | ␉␊ |
911 | ␉if (!card->posted)␊ |
912 | ␉␉return false;␊ |
913 | ␉␊ |
914 | ␉v = 1;␊ |
915 | ␉val->type = kCst;␊ |
916 | ␉val->size = 4;␊ |
917 | ␉val->data = (uint8_t *)&v;␊ |
918 | ␉␊ |
919 | ␉return true;␊ |
920 | }␊ |
921 | ␊ |
922 | bool get_vrammemory_val(value_t *val)␊ |
923 | {␊ |
924 | ␉return false;␊ |
925 | }␊ |
926 | ␊ |
927 | bool get_name_val(value_t *val)␊ |
928 | {␊ |
929 | ␉val->type = aty_name.type;␊ |
930 | ␉val->size = aty_name.size;␊ |
931 | ␉val->data = aty_name.data;␊ |
932 | ␉␊ |
933 | ␉return true;␊ |
934 | }␊ |
935 | ␊ |
936 | bool get_nameparent_val(value_t *val)␊ |
937 | {␊ |
938 | ␉val->type = aty_nameparent.type;␊ |
939 | ␉val->size = aty_nameparent.size;␊ |
940 | ␉val->data = aty_nameparent.data;␊ |
941 | ␉␊ |
942 | ␉return true;␊ |
943 | }␊ |
944 | ␊ |
945 | bool get_model_val(value_t *val)␊ |
946 | {␊ |
947 | ␉if (!card->info->model_name)␊ |
948 | ␉␉return false;␊ |
949 | ␉␊ |
950 | ␉val->type = kStr;␊ |
951 | ␉val->size = strlen(card->info->model_name) + 1;␊ |
952 | ␉val->data = (uint8_t *)card->info->model_name;␊ |
953 | ␉␊ |
954 | ␉return true;␊ |
955 | }␊ |
956 | ␊ |
957 | bool get_conntype_val(value_t *val)␊ |
958 | {␊ |
959 | //Connector types:␊ |
960 | //0x4 : DisplayPort␊ |
961 | //0x400: DL DVI-I␊ |
962 | //0x800: HDMI␊ |
963 | ␊ |
964 | ␉return false;␊ |
965 | }␊ |
966 | ␊ |
967 | bool get_vrammemsize_val(value_t *val)␊ |
968 | {␊ |
969 | ␉static int idx = -1;␊ |
970 | ␉static uint64_t memsize;␊ |
971 | ␉␊ |
972 | ␉idx++;␊ |
973 | ␉memsize = ((uint64_t)card->vram_size << 32);␊ |
974 | ␉if (idx == 0)␊ |
975 | ␉␉memsize = memsize | (uint64_t)card->vram_size;␊ |
976 | ␉␊ |
977 | ␉val->type = kCst;␊ |
978 | ␉val->size = 8;␊ |
979 | ␉val->data = (uint8_t *)&memsize;␊ |
980 | ␉␊ |
981 | ␉return true;␊ |
982 | }␊ |
983 | ␊ |
984 | bool get_binimage_val(value_t *val)␊ |
985 | {␊ |
986 | ␉if (!card->rom)␊ |
987 | ␉␉return false;␊ |
988 | ␉␊ |
989 | ␉val->type = kPtr;␊ |
990 | ␉val->size = card->rom_size;␊ |
991 | ␉val->data = card->rom;␊ |
992 | ␉␊ |
993 | ␉return true;␊ |
994 | }␊ |
995 | ␊ |
996 | bool get_romrevision_val(value_t *val)␊ |
997 | {␊ |
998 | ␉uint8_t *rev;␊ |
999 | ␉if (!card->rom)␊ |
1000 | ␉␉return false;␊ |
1001 | ␉␊ |
1002 | ␉rev = card->rom + *(uint8_t *)(card->rom + OFFSET_TO_GET_ATOMBIOS_STRINGS_START);␊ |
1003 | ␊ |
1004 | ␉val->type = kPtr;␊ |
1005 | ␉val->size = strlen((char *)rev);␊ |
1006 | ␉val->data = malloc(val->size);␊ |
1007 | ␉␊ |
1008 | ␉if (!val->data)␊ |
1009 | ␉␉return false;␊ |
1010 | ␉␊ |
1011 | ␉memcpy(val->data, rev, val->size);␊ |
1012 | ␉␊ |
1013 | ␉return true;␊ |
1014 | }␊ |
1015 | ␊ |
1016 | bool get_deviceid_val(value_t *val)␊ |
1017 | {␊ |
1018 | ␉val->type = kCst;␊ |
1019 | ␉val->size = 2;␊ |
1020 | ␉val->data = (uint8_t *)&card->pci_dev->device_id;␊ |
1021 | ␉␊ |
1022 | ␉return true;␊ |
1023 | }␊ |
1024 | ␊ |
1025 | bool get_mclk_val(value_t *val)␊ |
1026 | {␊ |
1027 | ␉return false;␊ |
1028 | }␊ |
1029 | ␊ |
1030 | bool get_sclk_val(value_t *val)␊ |
1031 | {␊ |
1032 | ␉return false;␊ |
1033 | }␊ |
1034 | ␊ |
1035 | bool get_refclk_val(value_t *val)␊ |
1036 | {␊ |
1037 | ␉return false;␊ |
1038 | }␊ |
1039 | ␊ |
1040 | bool get_platforminfo_val(value_t *val)␊ |
1041 | {␊ |
1042 | ␉val->data = malloc(0x80);␊ |
1043 | ␉if (!val->data)␊ |
1044 | ␉␉return false;␊ |
1045 | ␉␊ |
1046 | ␉bzero(val->data, 0x80);␊ |
1047 | ␉␊ |
1048 | ␉val->type␉␉= kPtr;␊ |
1049 | ␉val->size␉␉= 0x80;␊ |
1050 | ␉val->data[0]␉= 1;␊ |
1051 | ␉␊ |
1052 | ␉return true;␊ |
1053 | }␊ |
1054 | ␊ |
1055 | bool get_vramtotalsize_val(value_t *val)␊ |
1056 | {␊ |
1057 | ␉val->type = kCst;␊ |
1058 | ␉val->size = 4;␊ |
1059 | ␉val->data = (uint8_t *)&card->vram_size;␊ |
1060 | ␉␊ |
1061 | ␉return true;␊ |
1062 | }␊ |
1063 | ␊ |
1064 | void free_val(value_t *val)␊ |
1065 | {␊ |
1066 | ␉if (val->type == kPtr)␊ |
1067 | ␉␉free(val->data);␊ |
1068 | ␉␊ |
1069 | ␉bzero(val, sizeof(value_t));␊ |
1070 | }␊ |
1071 | ␊ |
1072 | void devprop_add_list(dev_prop_t devprop_list[])␊ |
1073 | {␊ |
1074 | ␉value_t *val = malloc(sizeof(value_t));␊ |
1075 | ␉int i, pnum;␊ |
1076 | ␉␊ |
1077 | ␉for (i = 0; devprop_list[i].name != NULL; i++)␊ |
1078 | ␉{␊ |
1079 | ␉␉if ((devprop_list[i].flags == FLAGTRUE) || (devprop_list[i].flags | card->flags))␊ |
1080 | ␉␉{␊ |
1081 | ␉␉␉if (devprop_list[i].get_value && devprop_list[i].get_value(val))␊ |
1082 | ␉␉␉{␊ |
1083 | ␉␉␉␉devprop_add_value(card->device, devprop_list[i].name, val->data, val->size);␊ |
1084 | ␉␉␉␉free_val(val);␊ |
1085 | ␉␉␉␉␊ |
1086 | ␉␉␉␉if (devprop_list[i].all_ports)␊ |
1087 | ␉␉␉␉{␊ |
1088 | ␉␉␉␉␉for (pnum = 1; pnum < card->ports; pnum++)␊ |
1089 | ␉␉␉␉␉{␊ |
1090 | ␉␉␉␉␉␉if (devprop_list[i].get_value(val))␊ |
1091 | ␉␉␉␉␉␉{␊ |
1092 | ␉␉␉␉␉␉␉devprop_list[i].name[1] = 0x30 + pnum; // convert to ascii␊ |
1093 | ␉␉␉␉␉␉␉devprop_add_value(card->device, devprop_list[i].name, val->data, val->size);␊ |
1094 | ␉␉␉␉␉␉␉free_val(val);␊ |
1095 | ␉␉␉␉␉␉}␊ |
1096 | ␉␉␉␉␉}␊ |
1097 | ␉␉␉␉␉devprop_list[i].name[1] = 0x30; // write back our "@0," for a next possible card␊ |
1098 | ␉␉␉␉}␊ |
1099 | ␉␉␉}␊ |
1100 | ␉␉␉else␊ |
1101 | ␉␉␉{␊ |
1102 | ␉␉␉␉if (devprop_list[i].default_val.type != kNul)␊ |
1103 | ␉␉␉␉{␊ |
1104 | ␉␉␉␉␉devprop_add_value(card->device, devprop_list[i].name,␊ |
1105 | ␉␉␉␉␉␉devprop_list[i].default_val.type == kCst ?␊ |
1106 | ␉␉␉␉␉␉(uint8_t *)&(devprop_list[i].default_val.data) : devprop_list[i].default_val.data,␊ |
1107 | ␉␉␉␉␉␉devprop_list[i].default_val.size);␊ |
1108 | ␉␉␉␉}␊ |
1109 | ␉␉␉␉␊ |
1110 | ␉␉␉␉if (devprop_list[i].all_ports)␊ |
1111 | ␉␉␉␉{␊ |
1112 | ␉␉␉␉␉for (pnum = 1; pnum < card->ports; pnum++)␊ |
1113 | ␉␉␉␉␉{␊ |
1114 | ␉␉␉␉␉␉if (devprop_list[i].default_val.type != kNul)␊ |
1115 | ␉␉␉␉␉␉{␊ |
1116 | ␉␉␉␉␉␉␉devprop_list[i].name[1] = 0x30 + pnum; // convert to ascii␊ |
1117 | ␉␉␉␉␉␉␉devprop_add_value(card->device, devprop_list[i].name,␊ |
1118 | ␉␉␉␉␉␉␉␉devprop_list[i].default_val.type == kCst ?␊ |
1119 | ␉␉␉␉␉␉␉␉(uint8_t *)&(devprop_list[i].default_val.data) : devprop_list[i].default_val.data,␊ |
1120 | ␉␉␉␉␉␉␉␉devprop_list[i].default_val.size);␊ |
1121 | ␉␉␉␉␉␉}␊ |
1122 | ␉␉␉␉␉}␊ |
1123 | ␉␉␉␉␉devprop_list[i].name[1] = 0x30; // write back our "@0," for a next possible card␊ |
1124 | ␉␉␉␉}␊ |
1125 | ␉␉␉}␊ |
1126 | ␉␉}␊ |
1127 | ␉}␊ |
1128 | ␊ |
1129 | ␉free(val);␊ |
1130 | }␊ |
1131 | ␊ |
1132 | bool validate_rom(option_rom_header_t *rom_header, pci_dt_t *pci_dev)␊ |
1133 | {␊ |
1134 | ␉option_rom_pci_header_t *rom_pci_header;␊ |
1135 | ␉␊ |
1136 | ␉if (rom_header->signature != 0xaa55)␊ |
1137 | ␉␉return false;␊ |
1138 | ␉␊ |
1139 | ␉rom_pci_header = (option_rom_pci_header_t *)((uint8_t *)rom_header + rom_header->pci_header_offset);␊ |
1140 | ␉␊ |
1141 | ␉if (rom_pci_header->signature != 0x52494350)␊ |
1142 | ␉␉return false;␊ |
1143 | ␉␊ |
1144 | ␉if (rom_pci_header->vendor_id != pci_dev->vendor_id || rom_pci_header->device_id != pci_dev->device_id)␊ |
1145 | ␉␉return false;␊ |
1146 | ␉␊ |
1147 | ␉return true;␊ |
1148 | }␊ |
1149 | ␊ |
1150 | bool load_vbios_file(const char *key, uint16_t vendor_id, uint16_t device_id, uint32_t subsys_id)␊ |
1151 | {␊ |
1152 | ␉int fd;␊ |
1153 | ␉char file_name[24];␊ |
1154 | ␉bool do_load = false;␊ |
1155 | ␉␊ |
1156 | ␉getBoolForKey(key, &do_load, &bootInfo->chameleonConfig);␊ |
1157 | ␉if (!do_load)␊ |
1158 | ␉␉return false;␊ |
1159 | ␉␊ |
1160 | ␉sprintf(file_name, "/Extra/%04x_%04x_%08x.rom", vendor_id, device_id, subsys_id);␊ |
1161 | ␉if ((fd = open_bvdev("bt(0,0)", file_name, 0)) < 0)␊ |
1162 | ␉␉return false;␊ |
1163 | ␉␊ |
1164 | ␉card->rom_size = file_size(fd);␊ |
1165 | ␉card->rom = malloc(card->rom_size);␊ |
1166 | ␉if (!card->rom)␊ |
1167 | ␉␉return false;␊ |
1168 | ␉␊ |
1169 | ␉read(fd, (char *)card->rom, card->rom_size);␊ |
1170 | ␉␊ |
1171 | ␉if (!validate_rom((option_rom_header_t *)card->rom, card->pci_dev))␊ |
1172 | ␉{␊ |
1173 | ␉␉card->rom_size = 0;␊ |
1174 | ␉␉card->rom = 0;␊ |
1175 | ␉␉return false;␊ |
1176 | ␉}␊ |
1177 | ␉␊ |
1178 | ␉card->rom_size = ((option_rom_header_t *)card->rom)->rom_size * 512;␊ |
1179 | ␉␊ |
1180 | ␉close(fd);␊ |
1181 | ␉␊ |
1182 | ␉return true;␊ |
1183 | }␊ |
1184 | ␊ |
1185 | void get_vram_size(void)␊ |
1186 | {␊ |
1187 | ␉chip_family_t chip_family = card->info->chip_family;␊ |
1188 | ␉␊ |
1189 | ␉card->vram_size = 0;␊ |
1190 | ␉␊ |
1191 | ␉if (chip_family >= CHIP_FAMILY_CEDAR)␊ |
1192 | ␉␉// size in MB on evergreen␊ |
1193 | ␉␉// XXX watch for overflow!!!␊ |
1194 | ␉␉card->vram_size = RegRead32(R600_CONFIG_MEMSIZE) * 1024 * 1024;␊ |
1195 | ␉else␊ |
1196 | ␉␉if (chip_family >= CHIP_FAMILY_R600)␊ |
1197 | ␉␉␉card->vram_size = RegRead32(R600_CONFIG_MEMSIZE);␊ |
1198 | }␊ |
1199 | ␊ |
1200 | bool read_vbios(bool from_pci)␊ |
1201 | {␊ |
1202 | ␉option_rom_header_t *rom_addr;␊ |
1203 | ␉␊ |
1204 | ␉if (from_pci)␊ |
1205 | ␉{␊ |
1206 | ␉␉rom_addr = (option_rom_header_t *)(pci_config_read32(card->pci_dev->dev.addr, PCI_ROM_ADDRESS) & ~0x7ff);␊ |
1207 | ␉␉verbose(" @0x%x", rom_addr);␊ |
1208 | ␉}␊ |
1209 | ␉else␊ |
1210 | ␉␉rom_addr = (option_rom_header_t *)0xc0000;␊ |
1211 | ␉␊ |
1212 | ␉if (!validate_rom(rom_addr, card->pci_dev))␊ |
1213 | ␉␉return false;␊ |
1214 | ␉␊ |
1215 | ␉card->rom_size = rom_addr->rom_size * 512;␊ |
1216 | ␉if (!card->rom_size)␊ |
1217 | ␉␉return false;␊ |
1218 | ␉␊ |
1219 | ␉card->rom = malloc(card->rom_size);␊ |
1220 | ␉if (!card->rom)␊ |
1221 | ␉␉return false;␊ |
1222 | ␉␊ |
1223 | ␉memcpy(card->rom, (void *)rom_addr, card->rom_size);␊ |
1224 | ␉␊ |
1225 | ␉return true;␊ |
1226 | }␊ |
1227 | ␊ |
1228 | bool read_disabled_vbios(void)␊ |
1229 | {␊ |
1230 | ␉bool ret = false;␊ |
1231 | ␉chip_family_t chip_family = card->info->chip_family;␊ |
1232 | ␉␊ |
1233 | ␉if (chip_family >= CHIP_FAMILY_RV770)␊ |
1234 | ␉{␊ |
1235 | ␉␉uint32_t viph_control␉␉= RegRead32(RADEON_VIPH_CONTROL);␊ |
1236 | ␉␉uint32_t bus_cntl␉␉␉= RegRead32(RADEON_BUS_CNTL);␊ |
1237 | ␉␉uint32_t d1vga_control␉␉= RegRead32(AVIVO_D1VGA_CONTROL);␊ |
1238 | ␉␉uint32_t d2vga_control␉␉= RegRead32(AVIVO_D2VGA_CONTROL);␊ |
1239 | ␉␉uint32_t vga_render_control = RegRead32(AVIVO_VGA_RENDER_CONTROL);␊ |
1240 | ␉␉uint32_t rom_cntl␉␉␉= RegRead32(R600_ROM_CNTL);␊ |
1241 | ␉␉uint32_t cg_spll_func_cntl␉= 0;␊ |
1242 | ␉␉uint32_t cg_spll_status;␊ |
1243 | ␉␉␊ |
1244 | ␉␉// disable VIP␊ |
1245 | ␉␉RegWrite32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));␊ |
1246 | ␉␉␊ |
1247 | ␉␉// enable the rom␊ |
1248 | ␉␉RegWrite32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM));␊ |
1249 | ␉␉␊ |
1250 | ␉␉// Disable VGA mode␊ |
1251 | ␉␉RegWrite32(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | AVIVO_DVGA_CONTROL_TIMING_SELECT)));␊ |
1252 | ␉␉RegWrite32(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | AVIVO_DVGA_CONTROL_TIMING_SELECT)));␊ |
1253 | ␉␉RegWrite32(AVIVO_VGA_RENDER_CONTROL, (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK));␊ |
1254 | ␉␉␊ |
1255 | ␉␉if (chip_family == CHIP_FAMILY_RV730)␊ |
1256 | ␉␉{␊ |
1257 | ␉␉␉cg_spll_func_cntl = RegRead32(R600_CG_SPLL_FUNC_CNTL);␊ |
1258 | ␉␉␉␊ |
1259 | ␉␉␉// enable bypass mode␊ |
1260 | ␉␉␉RegWrite32(R600_CG_SPLL_FUNC_CNTL, (cg_spll_func_cntl | R600_SPLL_BYPASS_EN));␊ |
1261 | ␉␉␉␊ |
1262 | ␉␉␉// wait for SPLL_CHG_STATUS to change to 1␊ |
1263 | ␉␉␉cg_spll_status = 0;␊ |
1264 | ␉␉␉while (!(cg_spll_status & R600_SPLL_CHG_STATUS))␊ |
1265 | ␉␉␉␉cg_spll_status = RegRead32(R600_CG_SPLL_STATUS);␊ |
1266 | ␉␉␉␊ |
1267 | ␉␉␉RegWrite32(R600_ROM_CNTL, (rom_cntl & ~R600_SCK_OVERWRITE));␊ |
1268 | ␉␉}␊ |
1269 | ␉␉else␊ |
1270 | ␉␉␉RegWrite32(R600_ROM_CNTL, (rom_cntl | R600_SCK_OVERWRITE));␊ |
1271 | ␉␉␊ |
1272 | ␉␉ret = read_vbios(true);␊ |
1273 | ␉␉␊ |
1274 | ␉␉// restore regs␊ |
1275 | ␉␉if (chip_family == CHIP_FAMILY_RV730)␊ |
1276 | ␉␉{␊ |
1277 | ␉␉␉RegWrite32(R600_CG_SPLL_FUNC_CNTL, cg_spll_func_cntl);␊ |
1278 | ␉␉␉␊ |
1279 | ␉␉␉// wait for SPLL_CHG_STATUS to change to 1␊ |
1280 | ␉␉␉cg_spll_status = 0;␊ |
1281 | ␉␉␉while (!(cg_spll_status & R600_SPLL_CHG_STATUS))␊ |
1282 | ␉␉␉cg_spll_status = RegRead32(R600_CG_SPLL_STATUS);␊ |
1283 | ␉␉}␊ |
1284 | ␉␉RegWrite32(RADEON_VIPH_CONTROL, viph_control);␊ |
1285 | ␉␉RegWrite32(RADEON_BUS_CNTL, bus_cntl);␊ |
1286 | ␉␉RegWrite32(AVIVO_D1VGA_CONTROL, d1vga_control);␊ |
1287 | ␉␉RegWrite32(AVIVO_D2VGA_CONTROL, d2vga_control);␊ |
1288 | ␉␉RegWrite32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);␊ |
1289 | ␉␉RegWrite32(R600_ROM_CNTL, rom_cntl);␊ |
1290 | ␉}␊ |
1291 | ␉else␊ |
1292 | ␉␉if (chip_family >= CHIP_FAMILY_R600)␊ |
1293 | ␉␉{␊ |
1294 | ␉␉␉uint32_t viph_control␉␉␉␉= RegRead32(RADEON_VIPH_CONTROL);␊ |
1295 | ␉␉␉uint32_t bus_cntl␉␉␉␉␉= RegRead32(RADEON_BUS_CNTL);␊ |
1296 | ␉␉␉uint32_t d1vga_control␉␉␉␉= RegRead32(AVIVO_D1VGA_CONTROL);␊ |
1297 | ␉␉␉uint32_t d2vga_control␉␉␉␉= RegRead32(AVIVO_D2VGA_CONTROL);␊ |
1298 | ␉␉␉uint32_t vga_render_control␉␉␉= RegRead32(AVIVO_VGA_RENDER_CONTROL);␊ |
1299 | ␉␉␉uint32_t rom_cntl␉␉␉␉␉= RegRead32(R600_ROM_CNTL);␊ |
1300 | ␉␉␉uint32_t general_pwrmgt␉␉␉␉= RegRead32(R600_GENERAL_PWRMGT);␊ |
1301 | ␉␉␉uint32_t low_vid_lower_gpio_cntl␉= RegRead32(R600_LOW_VID_LOWER_GPIO_CNTL);␊ |
1302 | ␉␉␉uint32_t medium_vid_lower_gpio_cntl = RegRead32(R600_MEDIUM_VID_LOWER_GPIO_CNTL);␊ |
1303 | ␉␉␉uint32_t high_vid_lower_gpio_cntl␉= RegRead32(R600_HIGH_VID_LOWER_GPIO_CNTL);␊ |
1304 | ␉␉␉uint32_t ctxsw_vid_lower_gpio_cntl␉= RegRead32(R600_CTXSW_VID_LOWER_GPIO_CNTL);␊ |
1305 | ␉␉␉uint32_t lower_gpio_enable␉␉␉= RegRead32(R600_LOWER_GPIO_ENABLE);␊ |
1306 | ␉␉␉␊ |
1307 | ␉␉␉// disable VIP␊ |
1308 | ␉␉␉RegWrite32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));␊ |
1309 | ␉␉␉␊ |
1310 | ␉␉␉// enable the rom␊ |
1311 | ␉␉␉RegWrite32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM));␊ |
1312 | ␉␉␉␊ |
1313 | ␉␉␉// Disable VGA mode␊ |
1314 | ␉␉␉RegWrite32(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | AVIVO_DVGA_CONTROL_TIMING_SELECT)));␊ |
1315 | ␉␉␉RegWrite32(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | AVIVO_DVGA_CONTROL_TIMING_SELECT)));␊ |
1316 | ␉␉␉RegWrite32(AVIVO_VGA_RENDER_CONTROL, (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK));␊ |
1317 | ␉␉␉RegWrite32(R600_ROM_CNTL, ((rom_cntl & ~R600_SCK_PRESCALE_CRYSTAL_CLK_MASK) | (1 << R600_SCK_PRESCALE_CRYSTAL_CLK_SHIFT) | R600_SCK_OVERWRITE));␊ |
1318 | ␉␉␉RegWrite32(R600_GENERAL_PWRMGT, (general_pwrmgt & ~R600_OPEN_DRAIN_PADS));␊ |
1319 | ␉␉␉RegWrite32(R600_LOW_VID_LOWER_GPIO_CNTL, (low_vid_lower_gpio_cntl & ~0x400));␊ |
1320 | ␉␉␉RegWrite32(R600_MEDIUM_VID_LOWER_GPIO_CNTL, (medium_vid_lower_gpio_cntl & ~0x400));␊ |
1321 | ␉␉␉RegWrite32(R600_HIGH_VID_LOWER_GPIO_CNTL, (high_vid_lower_gpio_cntl & ~0x400));␊ |
1322 | ␉␉␉RegWrite32(R600_CTXSW_VID_LOWER_GPIO_CNTL, (ctxsw_vid_lower_gpio_cntl & ~0x400));␊ |
1323 | ␉␉␉RegWrite32(R600_LOWER_GPIO_ENABLE, (lower_gpio_enable | 0x400));␊ |
1324 | ␉␉␉␊ |
1325 | ␉␉␉ret = read_vbios(true);␊ |
1326 | ␉␉␉␊ |
1327 | ␉␉␉// restore regs␊ |
1328 | ␉␉␉RegWrite32(RADEON_VIPH_CONTROL, viph_control);␊ |
1329 | ␉␉␉RegWrite32(RADEON_BUS_CNTL, bus_cntl);␊ |
1330 | ␉␉␉RegWrite32(AVIVO_D1VGA_CONTROL, d1vga_control);␊ |
1331 | ␉␉␉RegWrite32(AVIVO_D2VGA_CONTROL, d2vga_control);␊ |
1332 | ␉␉␉RegWrite32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);␊ |
1333 | ␉␉␉RegWrite32(R600_ROM_CNTL, rom_cntl);␊ |
1334 | ␉␉␉RegWrite32(R600_GENERAL_PWRMGT, general_pwrmgt);␊ |
1335 | ␉␉␉RegWrite32(R600_LOW_VID_LOWER_GPIO_CNTL, low_vid_lower_gpio_cntl);␊ |
1336 | ␉␉␉RegWrite32(R600_MEDIUM_VID_LOWER_GPIO_CNTL, medium_vid_lower_gpio_cntl);␊ |
1337 | ␉␉␉RegWrite32(R600_HIGH_VID_LOWER_GPIO_CNTL, high_vid_lower_gpio_cntl);␊ |
1338 | ␉␉␉RegWrite32(R600_CTXSW_VID_LOWER_GPIO_CNTL, ctxsw_vid_lower_gpio_cntl);␊ |
1339 | ␉␉␉RegWrite32(R600_LOWER_GPIO_ENABLE, lower_gpio_enable);␊ |
1340 | ␉␉}␊ |
1341 | ␊ |
1342 | ␉return ret;␊ |
1343 | }␊ |
1344 | ␊ |
1345 | bool radeon_card_posted(void)␊ |
1346 | {␊ |
1347 | ␉uint32_t reg;␊ |
1348 | ␉␊ |
1349 | ␉// first check CRTCs␊ |
1350 | ␉reg = RegRead32(RADEON_CRTC_GEN_CNTL) | RegRead32(RADEON_CRTC2_GEN_CNTL);␊ |
1351 | ␉if (reg & RADEON_CRTC_EN)␊ |
1352 | ␉␉return true;␊ |
1353 | ␉␊ |
1354 | ␉// then check MEM_SIZE, in case something turned the crtcs off␊ |
1355 | ␉reg = RegRead32(R600_CONFIG_MEMSIZE);␊ |
1356 | ␉if (reg)␊ |
1357 | ␉␉return true;␊ |
1358 | ␉␊ |
1359 | ␉return false;␊ |
1360 | }␊ |
1361 | ␊ |
1362 | #if 0␊ |
1363 | bool devprop_add_pci_config_space(void)␊ |
1364 | {␊ |
1365 | ␉int offset;␊ |
1366 | ␉␊ |
1367 | ␉uint8_t *config_space = malloc(0x100);␊ |
1368 | ␉if (!config_space)␊ |
1369 | ␉␉return false;␊ |
1370 | ␉␊ |
1371 | ␉for (offset = 0; offset < 0x100; offset += 4)␊ |
1372 | ␉␉config_space[offset / 4] = pci_config_read32(card->pci_dev->dev.addr, offset);␊ |
1373 | ␉␊ |
1374 | ␉devprop_add_value(card->device, "ATY,PCIConfigSpace", config_space, 0x100);␊ |
1375 | ␉free(config_space);␊ |
1376 | ␉␊ |
1377 | ␉return true;␊ |
1378 | }␊ |
1379 | #endif␊ |
1380 | ␊ |
1381 | static bool init_card(pci_dt_t *pci_dev)␊ |
1382 | {␊ |
1383 | ␉bool␉add_vbios = true;␊ |
1384 | ␉char␉name[24];␊ |
1385 | ␉char␉name_parent[24];␊ |
1386 | ␉int␉␉i;␊ |
1387 | ␉int␉␉n_ports = 0;␊ |
1388 | ␉␊ |
1389 | ␉card = malloc(sizeof(card_t));␊ |
1390 | ␉if (!card)␊ |
1391 | ␉␉return false;␊ |
1392 | ␉bzero(card, sizeof(card_t));␊ |
1393 | ␉␊ |
1394 | ␉card->pci_dev = pci_dev;␊ |
1395 | ␉␊ |
1396 | ␉for (i = 0; radeon_cards[i].device_id ; i++)␊ |
1397 | ␉{␊ |
1398 | ␉␉if (radeon_cards[i].device_id == pci_dev->device_id)␊ |
1399 | ␉␉{␊ |
1400 | ␉␉␉card->info = &radeon_cards[i];␊ |
1401 | ␉␉␉if ((radeon_cards[i].subsys_id == 0x00000000) ||␊ |
1402 | ␉␉␉␉(radeon_cards[i].subsys_id == pci_dev->subsys_id.subsys_id))␊ |
1403 | ␉␉␉␉break;␊ |
1404 | ␉␉}␊ |
1405 | ␉}␊ |
1406 | ␉␊ |
1407 | ␉if (!card->info->device_id || !card->info->cfg_name)␊ |
1408 | ␉{␊ |
1409 | ␉␉printf("Unsupported card!\n");␊ |
1410 | ␉␉return false;␊ |
1411 | ␉}␊ |
1412 | ␉␊ |
1413 | ␉card->fb␉␉= (uint8_t *)(pci_config_read32(pci_dev->dev.addr, PCI_BASE_ADDRESS_0) & ~0x0f);␊ |
1414 | ␉card->mmio␉␉= (uint8_t *)(pci_config_read32(pci_dev->dev.addr, PCI_BASE_ADDRESS_2) & ~0x0f);␊ |
1415 | ␉card->io␉␉= (uint8_t *)(pci_config_read32(pci_dev->dev.addr, PCI_BASE_ADDRESS_4) & ~0x03);␊ |
1416 | ␉␊ |
1417 | ␉verbose("Framebuffer @0x%08X MMIO @0x%08X␉I/O Port @0x%08X ROM Addr @0x%08X\n",␊ |
1418 | ␉␉card->fb, card->mmio, card->io, pci_config_read32(pci_dev->dev.addr, PCI_ROM_ADDRESS));␊ |
1419 | ␉␊ |
1420 | ␉card->posted = radeon_card_posted();␊ |
1421 | ␉verbose("ATI card %s, ", card->posted ? "POSTed" : "non-POSTed");␊ |
1422 | ␉␊ |
1423 | ␉get_vram_size();␊ |
1424 | ␉␊ |
1425 | ␉getBoolForKey(kATYbinimage, &add_vbios, &bootInfo->chameleonConfig);␊ |
1426 | ␉␊ |
1427 | ␉if (add_vbios)␊ |
1428 | ␉{␊ |
1429 | ␉␉if (!load_vbios_file(kUseAtiROM, pci_dev->vendor_id, pci_dev->device_id, pci_dev->subsys_id.subsys_id))␊ |
1430 | ␉␉{␊ |
1431 | ␉␉␉verbose("reading VBIOS from %s", card->posted ? "legacy space" : "PCI ROM");␊ |
1432 | ␉␉␉if (card->posted)␊ |
1433 | ␉␉␉␉read_vbios(false);␊ |
1434 | ␉␉␉else␊ |
1435 | ␉␉␉␉read_disabled_vbios();␊ |
1436 | ␉␉␉verbose("\n");␊ |
1437 | ␉␉}␊ |
1438 | ␉}␊ |
1439 | ␉␊ |
1440 | //␉card->ports = 2; // default - Azi: default is card_configs␊ |
1441 | ␉␊ |
1442 | ␉if (card->info->chip_family >= CHIP_FAMILY_CEDAR)␊ |
1443 | ␉{␊ |
1444 | ␉␉card->flags |= EVERGREEN;␊ |
1445 | //␉␉card->ports = 3; //Azi: use the AtiPorts key if needed␊ |
1446 | ␉}␊ |
1447 | ␉␊ |
1448 | //␉atN = 0;␊ |
1449 | ␉␊ |
1450 | ␉// Check AtiConfig key for a framebuffer name,␊ |
1451 | ␉card->cfg_name = getStringForKey(kAtiConfig, &bootInfo->chameleonConfig);␊ |
1452 | ␉// if none,␊ |
1453 | ␉if (!card->cfg_name)␊ |
1454 | ␉{␊ |
1455 | ␉␉// use cfg_name on radeon_cards, to retrive the default name from card_configs,␊ |
1456 | ␉␉card->cfg_name = card_configs[card->info->cfg_name].name;␊ |
1457 | ␉␉// and leave ports alone!␊ |
1458 | //␉␉card->ports = card_configs[card->info->cfg_name].ports;␊ |
1459 | ␉␉␊ |
1460 | ␉␉// which means one of the fb's or kNull␊ |
1461 | ␉␉verbose("Framebuffer set to device's default: %s\n", card->cfg_name);␊ |
1462 | ␉}␊ |
1463 | ␉else␊ |
1464 | ␉{␊ |
1465 | ␉␉// else, use the fb name returned by AtiConfig.␊ |
1466 | ␉␉verbose("(AtiConfig) Framebuffer set to: %s\n", card->cfg_name);␊ |
1467 | ␉}␊ |
1468 | ␉␊ |
1469 | ␉// Check AtiPorts key for nr of ports,␊ |
1470 | ␉card->ports = getIntForKey(kAtiPorts, &n_ports, &bootInfo->chameleonConfig);␊ |
1471 | ␉// if a value bigger than 0 ?? is found, (do we need >= 0 ?? that's null FB on card_configs)␊ |
1472 | ␉if (n_ports > 0)␊ |
1473 | ␉{␊ |
1474 | ␉␉card->ports = n_ports; // use it.␊ |
1475 | ␉␉verbose("(AtiPorts) Nr of ports set to: %d\n", card->ports);␊ |
1476 | }␊ |
1477 | ␉else// if (card->cfg_name > 0) // do we want 0 ports if fb is kNull or mistyped ?␊ |
1478 | ␉{␊ |
1479 | ␉␉// use max_ports value on radeon_cards␊ |
1480 | ␉␉card->ports = card->info->max_ports;␊ |
1481 | ␉␉// if max_ports value is 0␊ |
1482 | ␉␉if (card->ports <= 0)␊ |
1483 | ␉␉{␊ |
1484 | ␉␉␉// match cfg_name with card_configs list and retrive default nr of ports.␊ |
1485 | ␉␉␉for (i = 0; i < kCfgEnd; i++)␊ |
1486 | ␉␉␉{␊ |
1487 | ␉␉␉␉if (strcmp(card->cfg_name, card_configs[i].name) == 0)␊ |
1488 | ␉␉␉␉␉card->ports = card_configs[i].ports; // default␊ |
1489 | ␉␉␉}␊ |
1490 | ␉␉␉verbose("Nr of ports set to framebuffer's default: %d\n", card->ports);␊ |
1491 | ␉␉}␊ |
1492 | ␉␉else␊ |
1493 | ␉␉{␊ |
1494 | ␉␉␉verbose("Nr of ports set to card's ?? max: %d\n", card->ports);␊ |
1495 | ␉␉}␊ |
1496 | ␉}␊ |
1497 | //␉else␊ |
1498 | //␉␉card->ports = 2/1 ?; // set a min if 0 ports ?␊ |
1499 | //␉␉verbose("Nr of ports set to min: %d\n", card->ports);␊ |
1500 | ␉␊ |
1501 | ␉sprintf(name, "ATY,%s", card->cfg_name);␊ |
1502 | ␉aty_name.type = kStr;␊ |
1503 | ␉aty_name.size = strlen(name) + 1;␊ |
1504 | ␉aty_name.data = (uint8_t *)name;␊ |
1505 | ␉␊ |
1506 | ␉sprintf(name_parent, "ATY,%sParent", card->cfg_name);␊ |
1507 | ␉aty_nameparent.type = kStr;␊ |
1508 | ␉aty_nameparent.size = strlen(name_parent) + 1;␊ |
1509 | ␉aty_nameparent.data = (uint8_t *)name_parent;␊ |
1510 | ␉␊ |
1511 | ␉return true;␊ |
1512 | }␊ |
1513 | ␊ |
1514 | bool setup_ati_devprop(pci_dt_t *ati_dev)␊ |
1515 | {␊ |
1516 | ␉char *devicepath;␊ |
1517 | ␉␊ |
1518 | ␉if (!init_card(ati_dev))␊ |
1519 | ␉␉return false;␊ |
1520 | ␉␊ |
1521 | ␉// -------------------------------------------------␊ |
1522 | ␉// Find a better way to do this (in device_inject.c)␊ |
1523 | ␉if (!string)␊ |
1524 | ␉␉string = devprop_create_string();␊ |
1525 | ␉␊ |
1526 | ␉devicepath = get_pci_dev_path(ati_dev);␊ |
1527 | ␉card->device = devprop_add_device(string, devicepath);␊ |
1528 | ␉if (!card->device)␊ |
1529 | ␉␉return false;␊ |
1530 | ␉// -------------------------------------------------␊ |
1531 | ␉␊ |
1532 | #if 0␊ |
1533 | ␉uint64_t fb␉␉= (uint32_t)card->fb;␊ |
1534 | ␉uint64_t mmio␉= (uint32_t)card->mmio;␊ |
1535 | ␉uint64_t io␉␉= (uint32_t)card->io;␊ |
1536 | ␉devprop_add_value(card->device, "ATY,FrameBufferOffset", &fb, 8);␊ |
1537 | ␉devprop_add_value(card->device, "ATY,RegisterSpaceOffset", &mmio, 8);␊ |
1538 | ␉devprop_add_value(card->device, "ATY,IOSpaceOffset", &io, 8);␊ |
1539 | #endif␊ |
1540 | ␉␊ |
1541 | ␉devprop_add_list(ati_devprop_list);␊ |
1542 | ␉␊ |
1543 | ␉// -------------------------------------------------␊ |
1544 | ␉// Find a better way to do this (in device_inject.c)␊ |
1545 | ␉//Azi: XXX tried to fix a malloc error in vain; this is related to XCode 4 compilation!␊ |
1546 | ␉stringdata = malloc(sizeof(uint8_t) * string->length);␊ |
1547 | ␉memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);␊ |
1548 | ␉stringlength = string->length;␊ |
1549 | ␉// -------------------------------------------------␊ |
1550 | ␉␊ |
1551 | ␉verbose("ATI %s %s %dMB (%s) [%04x:%04x] (subsys [%04x:%04x]):: %s\n",␊ |
1552 | ␉␉␉chip_family_name[card->info->chip_family], card->info->model_name,␊ |
1553 | ␉␉␉(uint32_t)(card->vram_size / (1024 * 1024)), card->cfg_name,␊ |
1554 | ␉␉␉ati_dev->vendor_id, ati_dev->device_id,␊ |
1555 | ␉␉␉ati_dev->subsys_id.subsys.vendor_id, ati_dev->subsys_id.subsys.device_id,␊ |
1556 | ␉␉␉devicepath);␊ |
1557 | ␉␊ |
1558 | ␉free(card);␊ |
1559 | ␉␊ |
1560 | ␉return true;␊ |
1561 | }␊ |
1562 | |