Chameleon

Chameleon Commit Details

Date:2014-06-26 01:16:02 (5 years 21 days ago)
Author:ErmaC
Commit:2385
Parents: 2384
Message:Sync with trunk.
Changes:
D/branches/ErmaC/Enoch/artwork/themes/legacy
D/branches/ErmaC/Enoch/package/Resources.old
D/branches/ErmaC/Enoch/artwork/themes/embed
D/branches/ErmaC/Enoch/artwork/themes/bullet
M/branches/ErmaC/Enoch/package/po/ar.po
M/branches/ErmaC/Enoch/package/po/en.po
M/branches/ErmaC/Enoch/i386/util/bdmesg.c
M/branches/ErmaC/Enoch/i386/libsaio/cpu.h
M/branches/ErmaC/Enoch/i386/modules/Resolution/edid.c
M/branches/ErmaC/Enoch/package/po/fr.po
M/branches/ErmaC/Enoch/i386/boot2/graphics.c
M/branches/ErmaC/Enoch/package/po/hr.po
M/branches/ErmaC/Enoch/i386/boot0/boot0.s
M/branches/ErmaC/Enoch/i386/util/machOconv.c
M/branches/ErmaC/Enoch/package/po/ca.po
M/branches/ErmaC/Enoch/package/po/sr.po
M/branches/ErmaC/Enoch/i386/libsaio/stringTable.c
M/branches/ErmaC/Enoch/package/po/fa.po
M/branches/ErmaC/Enoch/i386/libsaio/pci.h
M/branches/ErmaC/Enoch/package/po/de.po
M/branches/ErmaC/Enoch/package/po/ja.po
M/branches/ErmaC/Enoch/package/po/zh_TW.po
M/branches/ErmaC/Enoch/package/po/he.po
M/branches/ErmaC/Enoch/package/po/zh_CN.po
M/branches/ErmaC/Enoch/i386/libsaio/saio_internal.h
M/branches/ErmaC/Enoch/i386/boot2/options.c
M/branches/ErmaC/Enoch/i386/libsaio/xml.c
M/branches/ErmaC/Enoch/i386/libsaio/console.c
M/branches/ErmaC/Enoch/i386/libsaio/xml.h
M/branches/ErmaC/Enoch/package/po/hu.po
M/branches/ErmaC/Enoch/i386/boot2/boot.c
M/branches/ErmaC/Enoch/package/po/chameleon.pot
M/branches/ErmaC/Enoch/i386/modules/KernelPatcher/Makefile
M/branches/ErmaC/Enoch/i386/libsaio/nvidia.c
M/branches/ErmaC/Enoch/i386/boot2/boot.h
M/branches/ErmaC/Enoch/i386/libsaio/device_tree.c
M/branches/ErmaC/Enoch/i386/libsaio/load.c
M/branches/ErmaC/Enoch/package/po/ru.po
M/branches/ErmaC/Enoch/package/OptionalSettings/KernelFlags.txt
M/branches/ErmaC/Enoch/i386/libsaio/hfs.c
M/branches/ErmaC/Enoch/i386/boot2/drivers.c
M/branches/ErmaC/Enoch/i386/libsaio/device_tree.h
M/branches/ErmaC/Enoch/i386/libsaio/platform.c
M/branches/ErmaC/Enoch/package/po/id.po
M/branches/ErmaC/Enoch/i386/libsaio/spd.c
M/branches/ErmaC/Enoch/i386/libsaio/platform.h
M/branches/ErmaC/Enoch/i386/libsaio/disk.c
M/branches/ErmaC/Enoch/package/po/el.po
M/branches/ErmaC/Enoch/i386/libsaio/spd.h
M/branches/ErmaC/Enoch/i386/libsaio/smbios.c
M/branches/ErmaC/Enoch/i386/libsaio/hpet.c
M/branches/ErmaC/Enoch/package/po/nl.po
M/branches/ErmaC/Enoch/i386/libsaio/gma.c
M/branches/ErmaC/Enoch/package/po/pl.po
M/branches/ErmaC/Enoch/package/po/it.po
M/branches/ErmaC/Enoch/package/po/pt.po
M/branches/ErmaC/Enoch/i386/boot1/boot1h.s
M/branches/ErmaC/Enoch/i386/libsaio/aml_generator.c
M/branches/ErmaC/Enoch/package/po/bg.po
M/branches/ErmaC/Enoch/i386/libsaio/saio_types.h
M/branches/ErmaC/Enoch/i386/boot2/gui.c
M/branches/ErmaC/Enoch/i386/libsaio/smbios_getters.c
M/branches/ErmaC/Enoch/i386/libsaio/fake_efi.c
M/branches/ErmaC/Enoch/i386/libsaio/device_inject.c
M/branches/ErmaC/Enoch/i386/modules/Resolution/915resolution.c
M/branches/ErmaC/Enoch/i386/libsaio/hda.c
M/branches/ErmaC/Enoch/package/po/bs.po
M/branches/ErmaC/Enoch/package/po/cs.po
M/branches/ErmaC/Enoch/i386/util/openUp.c
M/branches/ErmaC/Enoch/package/po/mk.po
M/branches/ErmaC/Enoch/package/po/es.po
M/branches/ErmaC/Enoch/i386/boot2/picopng.c
M/branches/ErmaC/Enoch/package/po/ko.po
M/branches/ErmaC/Enoch/i386/modules/KernelPatcher/Cconfig
M/branches/ErmaC/Enoch/i386/modules/FileNVRAM/Makefile
M/branches/ErmaC/Enoch/i386/libsaio/bootstruct.c
M/branches/ErmaC/Enoch/i386/modules/AcpiCodec/acpi_codec.c
M/branches/ErmaC/Enoch/package/po/ro.po
M/branches/ErmaC/Enoch/i386/libsaio/ati.c
M/branches/ErmaC/Enoch/i386/modules/Cconfig
M/branches/ErmaC/Enoch/i386/libsaio/sys.c
M/branches/ErmaC/Enoch/i386/libsa/string.c
M/branches/ErmaC/Enoch/package/po/pt-BR.po
M/branches/ErmaC/Enoch/package/Resources/templates/Localizable.strings
M/branches/ErmaC/Enoch/i386/libsaio/ati.h
M/branches/ErmaC/Enoch/i386/libsaio/acpi_patcher.c
M/branches/ErmaC/Enoch/i386/libsaio/networking.c
M/branches/ErmaC/Enoch/i386/libsaio/cpu.c
M/branches/ErmaC/Enoch/i386/libsaio/pci_setup.c

File differences

branches/ErmaC/Enoch/i386/libsaio/xml.c
2727
2828
2929
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
5830
5931
6032
......
390362
391363
392364
393
394
395
365
366
367
368
369
370
371
372
373
374
375
376
377
378
396379
397
380
398381
399382
400383
401384
402
403
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
404405
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
423422
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455423
456
457
424
425
426
427
428
429
430
431
432
433
458434
435
459436
460437
461438
462439
463
464
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
465459
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
482476
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517477
518
519
478
479
480
481
482
483
484
485
486
487
488
520489
490
491
492
521493
522494
523495
......
533505
534506
535507
536
537
538
539508
509
540510
541
542
543
544
545
546
547
548
549
550
551511
512
552513
553
554
555
514
556515
516
517
518
519
557520
558521
559522
560
561
562
523
563524
525
526
527
564528
565
566
567
568
569
570
571
572
573
574
575
576
577
529
530
531
532
578533
534
579535
580536
537
581538
582539
583540
......
901858
902859
903860
904
905
906
861
907862
908
863
909864
910865
911866
912
913
914
915
916
917
918
919
867
868
869
870
920871
921872
922
923
924
925
926
927
928
929
930
931
932
873
874
875
876
933877
934878
935879
936
937
938
939
940
941
880
881
882
942883
943
884
944885
945886
946
947
887
948888
949889
950890
#include "sl.h"
#include "xml.h"
#define kXMLTagPList "plist "
#define kXMLTagPListLen (sizeof(kXMLTagPList) - 1)
#define kXMLTagDict "dict"
#define kXMLTagDictLen (sizeof(kXMLTagDict) - 1)
#define kXMLTagKey "key"
#define kXMLTagKeyLen (sizeof(kXMLTagKey) - 1)
#define kXMLTagString "string"
#define kXMLTagStringLen (sizeof(kXMLTagString) - 1)
#define kXMLTagInteger "integer"
#define kXMLTagIntegerLen (sizeof(kXMLTagInteger) - 1)
#define kXMLTagData "data"
#define kXMLTagDataLen (sizeof(kXMLTagData) - 1)
#define kXMLTagDate "date"
#define kXMLTagDateLen (sizeof(kXMLTagDate) - 1)
#define kXMLTagFalse "false/"
#define kXMLTagFalseLen (sizeof(kXMLTagFalse) - 1)
#define kXMLTagTrue "true/"
#define kXMLTagTrueLen (sizeof(kXMLTagTrue) - 1)
#define kXMLTagArray "array"
#define kXMLTagArrayLen (sizeof(kXMLTagArray) - 1)
// for back-references used by libkern serializer
#define kXMLTagReference "reference"
#define kXMLTagReferenceLen (sizeof(kXMLTagReference) - 1)
#define kXMLStringID "ID="
#define kXMLStringIDLen (sizeof(kXMLStringID) - 1)
#define kXMLStringIDRef "IDREF="
#define kXMLStringIDRefLen (sizeof(kXMLStringIDRef) - 1)
string_ref *ref_strings = NULL;
/// TODO: remove below
}
pos = length;
/* Check most common cases first, make them fast */
if (!strncmp(tagName, kXMLTagPList, 6)) {
length = 0;
// just a header; nothing to parse
// return-via-reference tag should be left alone
}
/***** dict ****/
else if (!strcmp(tagName, kXMLTagDict))
{
length = ParseTagList(buffer + pos, tag, kTagTypeDict, 0);
} else if (!strncmp(tagName, kXMLTagDict, strlen(kXMLTagDict)) && tagName[strlen(tagName)-1] == '/') {
length = ParseTagList(buffer + pos, tag, kTagTypeDict, 1);
} else if (!strncmp(tagName, kXMLTagDict " ", strlen(kXMLTagDict " "))) {
length = ParseTagList(buffer + pos, tag, kTagTypeDict, 0);
}
/***** key ****/
if (!strcmp(tagName, kXMLTagKey)) {
else if (!strcmp(tagName, kXMLTagKey)) {
length = ParseTagKey(buffer + pos, tag);
}
/***** string ****/
else if (!strncmp(tagName, kXMLTagString, kXMLTagStringLen)) {
if (!tagName[kXMLTagStringLen]) { /* <string> */
else if (!strcmp(tagName, kXMLTagString)) {
length = ParseTagString(buffer + pos, tag);
} else if (!strncmp(tagName, kXMLTagString " ", strlen(kXMLTagString " "))) {
// TODO: save tag if if found
if(!strncmp(tagName + strlen(kXMLTagString " "), kXMLStringID, strlen(kXMLStringID))) {
// ID=
int id = 0;
int cnt = strlen(kXMLTagString " " kXMLStringID "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagString " " kXMLStringID "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseStringID error (0x%x)\n", *val);
getchar();
return -1;
}
}
length = ParseTagString(buffer + pos, tag);
} else if (' ' == tagName[kXMLTagStringLen]) { /* <string ...> */
// TODO: save tag if if found
if(!strncmp(tagName + kXMLTagStringLen + 1, (kXMLStringID "\""), kXMLStringIDLen + 1)) { /* <string ID="...> */
// ID=
int id = 0;
/* find end of ID string */
int cnt = kXMLTagStringLen + 1 + kXMLStringIDLen + 2;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + kXMLTagStringLen + 1 + kXMLStringIDLen + 1;
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseStringID error (0x%x)\n", *val);
getchar();
return -1;
}
SaveRefString(buffer + pos, id);
} else if(!strncmp(tagName + strlen(kXMLTagString " "), kXMLStringIDRef, strlen(kXMLStringIDRef))) {
// IDREF=
int id = 0;
int cnt = strlen(kXMLTagString " " kXMLStringIDRef "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagString " " kXMLStringIDRef "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseStringIDREF error (0x%x)\n", *val);
getchar();
return -1;
}
length = ParseTagString(buffer + pos, tag);
SaveRefString(buffer + pos, id);
} else if(!strncmp(tagName + kXMLTagStringLen + 1, kXMLStringIDRef, kXMLStringIDRefLen)) { /* <string IDREF= ...> */
// IDREF=
int id = 0;
int cnt = strlen(kXMLTagString " " kXMLStringIDRef "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagString " " kXMLStringIDRef "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseStringIDREF error (0x%x)\n", *val);
getchar();
return -1;
}
}
char* str = GetRefString(id);
TagPtr tmpTag = NewTag();
tmpTag->type = kTagTypeString;
tmpTag->string = str;
tmpTag->tag = 0;
tmpTag->tagNext = 0;
tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0;
*tag = tmpTag;
length = 0;
//printf("Located IDREF, id = %d, string = %s\n", id, str);
}
} else { /* unrecognized <string...> */
*tag = 0;
char* str = GetRefString(id);
TagPtr tmpTag = NewTag();
tmpTag->type = kTagTypeString;
tmpTag->string = str;
tmpTag->tag = 0;
tmpTag->tagNext = 0;
tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0;
*tag = tmpTag;
length = 0;
//printf("Located IDREF, id = %d, string = %s\n", id, str);
}
}
/***** integer ****/
else if (!strncmp(tagName, kXMLTagInteger, kXMLTagIntegerLen)) {
if (!tagName[kXMLTagIntegerLen]) { /* <integer> */
else if (!strcmp(tagName, kXMLTagInteger)) {
length = ParseTagInteger(buffer + pos, tag);
} else if (!strncmp(tagName, kXMLTagInteger " ", strlen(kXMLTagInteger " "))) {
if(!strncmp(tagName + strlen(kXMLTagInteger " "), kXMLStringID, strlen(kXMLStringID))) {
// ID=
int id = 0;
int cnt = strlen(kXMLTagInteger " " kXMLStringID "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagInteger " " kXMLStringID "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseIntegerID error (0x%x)\n", *val);
getchar();
return -1;
}
}
length = ParseTagInteger(buffer + pos, tag);
} else if (' ' == tagName[kXMLTagIntegerLen]) { /* <integer ...> */
if(!strncmp(tagName + kXMLTagIntegerLen + 1, kXMLStringID, kXMLStringIDLen)) { /* <integer ID=...> */
// ID=
int id = 0;
int cnt = strlen(kXMLTagInteger " " kXMLStringID "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagInteger " " kXMLStringID "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseIntegerID error (0x%x)\n", *val);
getchar();
return -1;
}
SaveRefString((*tag)->string, id);
} else if(!strncmp(tagName + strlen(kXMLTagInteger " "), kXMLStringIDRef, strlen(kXMLStringIDRef))) {
// IDREF=
int id = 0;
int cnt = strlen(kXMLTagInteger " " kXMLStringIDRef "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagInteger " " kXMLStringIDRef "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseStringIDREF error (0x%x)\n", *val);
getchar();
return -1;
}
length = ParseTagInteger(buffer + pos, tag);
SaveRefString((*tag)->string, id);
} else if(!strncmp(tagName + kXMLTagIntegerLen + 1, kXMLStringIDRef, kXMLStringIDRefLen)) { /* <integer IDREF=...> */
// IDREF=
int id = 0;
int cnt = strlen(kXMLTagInteger " " kXMLStringIDRef "\"") + 1;
while ((tagName[cnt] != '\0') && (tagName[cnt] != '"')) cnt++;
tagName[cnt] = 0;
char* val = tagName + strlen(kXMLTagInteger " " kXMLStringIDRef "\"");
while(*val) {
if ((*val >= '0' && *val <= '9')) { // 0 - 9
id = (id * 10) + (*val++ - '0');
} else {
printf("ParseStringIDREF error (0x%x)\n", *val);
getchar();
return -1;
}
}
int integer = (int)GetRefString(id);
TagPtr tmpTag = NewTag();
tmpTag->type = kTagTypeInteger;
tmpTag->string = (char*) integer;
tmpTag->tag = 0;
tmpTag->tagNext = 0;
tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0;
*tag = tmpTag;
length = 0;
//printf("Located IDREF, id = %d, string = %s\n", id, str);
} else {
length = ParseTagInteger(buffer + pos, tag);
}
} else { /* unrecognized <integer...> */
*tag = 0;
int integer = (int)GetRefString(id);
TagPtr tmpTag = NewTag();
tmpTag->type = kTagTypeInteger;
tmpTag->string = (char*) integer;
tmpTag->tag = 0;
tmpTag->tagNext = 0;
tmpTag->offset = buffer_start ? buffer - buffer_start + pos : 0;
*tag = tmpTag;
length = 0;
//printf("Located IDREF, id = %d, string = %s\n", id, str);
} else {
length = ParseTagInteger(buffer + pos, tag);
}
}
}
/***** plist ****/
else if (!strncmp(tagName, kXMLTagPList, kXMLTagPListLen)) {
length = 0;
}
/***** dict ****/
else if (!strncmp(tagName, kXMLTagDict, kXMLTagDictLen)) {
if (!strncmp(tagName, kXMLTagDict, kXMLTagDictLen) && tagName[strlen(tagName)-1] == '/') { /* <dict.../> */
length = ParseTagList(buffer + pos, tag, kTagTypeDict, 1);
} else if (!tagName[kXMLTagDictLen] || ' ' == tagName[kXMLTagDictLen]) { /* <dict> or<dict ...> */
length = ParseTagList(buffer + pos, tag, kTagTypeDict, 0);
} else { /* unrecognized <dict...> */
*tag = 0;
length = 0;
}
}
/***** data ****/
else if ((!strncmp(tagName, kXMLTagData, kXMLTagDataLen))
&& (!tagName[kXMLTagDataLen] /* <data> */
|| ' ' == tagName[kXMLTagDataLen])) { /* <data ...> */
else if (!strcmp(tagName, kXMLTagData)) {
length = ParseTagData(buffer + pos, tag);
} else if (!strncmp(tagName, kXMLTagData " ", strlen(kXMLTagData " "))) {
length = ParseTagData(buffer + pos, tag);
} else if (!strcmp(tagName, kXMLTagDate)) {
length = ParseTagDate(buffer + pos, tag);
}
/***** date ****/
else if ((!strncmp(tagName, kXMLTagDate, kXMLTagDateLen))
&& (!tagName[kXMLTagDateLen] /* <date> */
|| ' ' == tagName[kXMLTagDateLen])) { /* <date ...> */
else if (!strncmp(tagName, kXMLTagDate " ", strlen(kXMLTagDate " "))) {
length = ParseTagDate(buffer + pos, tag);
}/***** array ****/
else if (!strcmp(tagName, kXMLTagArray)) {
length = ParseTagList(buffer + pos, tag, kTagTypeArray, 0);
}
/***** array ****/
else if (!strncmp(tagName, kXMLTagArray, kXMLTagArrayLen)) { /* <array...> */
char c = tagName[kXMLTagArrayLen];
if ('/' == c) { /* <array/> */
length = ParseTagList(buffer + pos, tag, kTagTypeArray, 1);
}
else if ('\0' == c || ' ' == c) { /* <array> or <array ...> */
length = ParseTagList(buffer + pos, tag, kTagTypeArray, 0);
} else { /* unrecognized <array...> */
*tag = 0;
length = 0;
}
else if (!strncmp(tagName, kXMLTagArray " ", strlen(kXMLTagArray " "))) {
length = ParseTagList(buffer + pos, tag, kTagTypeArray, 0);
} else if (!strcmp(tagName, kXMLTagArray "/")) {
length = ParseTagList(buffer + pos, tag, kTagTypeArray, 1);
}
/***** unknown ****/
else {
// it wasn't parsed so we consumed no additional characters
*tag = 0;
length = 0;
}
static long
GetNextTag( char * buffer, char ** tag, long * start )
{
char* tagStart = buffer;
char* tagEnd;
char c;
long cnt, cnt2;
if (!tag) {
if (tag == 0) {
return -1;
}
/* Find the start of the tag. */
do {
c = *tagStart++;
if (c == '<') {
break;
}
} while (c);
if (!c) {
// Find the start of the tag.
cnt = 0;
while ((buffer[cnt] != '\0') && (buffer[cnt] != '<')) cnt++;
if (buffer[cnt] == '\0') {
return -1;
}
/* tagStart points just past the '<' */
/* Find the end of the tag. */
tagEnd = tagStart;
do {
c = *tagEnd++;
if (c == '>') {
break;
}
} while (c);
if (!c) {
// Find the end of the tag.
cnt2 = cnt + 1;
while ((buffer[cnt2] != '\0') && (buffer[cnt2] != '>')) cnt2++;
if (buffer[cnt2] == '\0') {
return -1;
}
/* tagEnd points just past the '>' */
/* Fix up tag data by nulling out the '>' */
--tagEnd;
*tagEnd = '\0';
*tag = tagStart; /* first char after initial '<' */
// Fix the tag data.
*tag = buffer + cnt + 1;
buffer[cnt2] = '\0';
if (start) {
*start = (long) (tagStart - buffer) - 1; /* offset of the initial '<' itself */
*start = cnt;
}
/* Return offset to the char after '>' */
return (long) (tagEnd - buffer) + 1;
return cnt2 + 1;
}
//==========================================================================
branches/ErmaC/Enoch/i386/libsaio/console.c
182182
183183
184184
185
185
186186
187187
188188
......
216216
217217
218218
219
219
220220
221221
222222
......
246246
247247
248248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
249267
250268
251269
}
{
/* Kabyl: BooterLog */
// Kabyl: BooterLog
struct putc_info pi;
if (!msgbuf) {
}
{
/* Kabyl: BooterLog */
// Kabyl: BooterLog
struct putc_info pi;
if (!msgbuf) {
} else {
vprf(fmt, ap);
}
{
// Kabyl: BooterLog
struct putc_info pi;
if (!msgbuf) {
return 0;
}
if (((cursor - msgbuf) > (BOOTER_LOG_SIZE - SAFE_LOG_SIZE))) {
return 0;
}
pi.str = cursor;
pi.last_str = 0;
prf(fmt, ap, sputc, &pi);
cursor += strlen((char *)cursor);
}
va_end(ap);
return(0);
}
branches/ErmaC/Enoch/i386/libsaio/xml.h
4848
4949
5050
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
5166
5267
5368
extern string_ref* ref_strings;
#define kXMLTagPList "plist "
#define kXMLTagDict "dict"
#define kXMLTagKey "key"
#define kXMLTagString "string"
#define kXMLTagInteger "integer"
#define kXMLTagData "data"
#define kXMLTagDate "date"
#define kXMLTagFalse "false/"
#define kXMLTagTrue "true/"
#define kXMLTagArray "array"
// for back-references used by libkern serializer
#define kXMLTagReference "reference"
#define kXMLStringID "ID="
#define kXMLStringIDRef "IDREF="
#define kPropCFBundleIdentifier ("CFBundleIdentifier")
#define kPropCFBundleExecutable ("CFBundleExecutable")
#define kPropOSBundleRequired ("OSBundleRequired")
branches/ErmaC/Enoch/i386/libsaio/bootstruct.c
2929
3030
3131
32
33
34
35
36
37
38
39
40
41
3242
3343
3444
......
5262
5363
5464
55
65
5666
5767
5868
......
110120
111121
112122
113
123
114124
115125
116126
#include "libsaio.h"
#include "bootstruct.h"
#ifndef DEBUG_BOOTSTRUCT
#define DEBUG_BOOTSTRUCT 0
#endif
#if DEBUG_BOOTSTRUCT
#define DBG(x...)printf(x)
#else
#define DBG(x...)msglog(x)
#endif
/*==========================================================================
* Initialize the structure of parameters passed to
* the kernel by the booter.
bootArgs = (boot_args *)malloc(sizeof(boot_args));
bootArgsPreLion = (boot_args_pre_lion *)malloc(sizeof(boot_args_pre_lion));
bootInfo = (PrivateBootInfo_t *)malloc(sizeof(PrivateBootInfo_t));
if (bootArgs == 0 || bootInfo == 0)
if (bootArgs == 0 || bootArgsPreLion == 0 || bootInfo == 0)
stop("Couldn't allocate boot info\n");
bzero(bootArgs, sizeof(boot_args));
reserveKernBootStruct(void)
{
if ((gMacOSVersion[0] == '1') && (gMacOSVersion[1] == '0')
&& (gMacOSVersion[2] == '.') && ((gMacOSVersion[3] == '7') || (gMacOSVersion[3] == '8') || (gMacOSVersion[3] == '9')))
&& (gMacOSVersion[2] == '.') && (gMacOSVersion[3] == '7' || gMacOSVersion[3] == '8' || gMacOSVersion[3] == '9'))
{
void *oldAddr = bootArgs;
bootArgs = (boot_args *)AllocateKernelMemory(sizeof(boot_args));
branches/ErmaC/Enoch/i386/libsaio/device_tree.c
398398
399399
400400
401
402
403
404
405
401406
407
408
409
410
411
412
413
414
415
416
417
418
419
402420
403421
404422
}
//==============================================================================
// Bungo
Property *
DT__GetProperty(Node *node, const char *name)
{
Property *prop;
for (prop = node->properties; prop; prop = prop->next)
{
if (strcmp(prop->name, name) == 0)
{
return prop;
}
}
return NULL;
}
//==============================================================================
Node *
DT__FindNode(const char *path, bool createIfMissing)
{
branches/ErmaC/Enoch/i386/libsaio/hfs.c
296296
297297
298298
299
299
300300
301301
302302
{
char entry[512];
char devStr[12];
long dirID, result, flags =0;
long dirID, result, flags = 0;
if (HFSInitPartition(ih) == -1)
{
branches/ErmaC/Enoch/i386/libsaio/acpi_patcher.c
2323
2424
2525
26
26
2727
2828
2929
......
112112
113113
114114
115
115
116116
117117
118118
......
136136
137137
138138
139
139
140140
141141
142142
......
147147
148148
149149
150
150
151151
152152
153153
......
161161
162162
163163
164
164
165165
166166
167167
168168
169169
170
170
171171
172172
173173
......
182182
183183
184184
185
185
186186
187187
188188
......
196196
197197
198198
199
199
200200
201201
202202
......
205205
206206
207207
208
208
209209
210210
211211
......
234234
235235
236236
237
237
238238
239239
240240
241241
242
242
243243
244244
245245
246246
247247
248248
249
249
250250
251251
252252
......
401401
402402
403403
404
404
405405
406406
407407
408
408
409409
410410
411411
......
423423
424424
425425
426
426
427427
428428
429429
430430
431
431
432432
433433
434434
......
591591
592592
593593
594
594
595595
596596
597597
......
612612
613613
614614
615
615
616616
617617
618618
......
662662
663663
664664
665
665
666666
667667
668668
669669
670
670
671671
672672
673673
......
693693
694694
695695
696
696
697697
698698
699699
......
751751
752752
753753
754
754
755755
756756
757757
......
760760
761761
762762
763
763
764764
765765
766766
......
776776
777777
778778
779
779
780780
781781
782782
......
798798
799799
800800
801
801
802802
803803
804804
......
933933
934934
935935
936
936
937937
938938
939939
......
950950
951951
952952
953
953
954954
955955
956956
......
960960
961961
962962
963
963
964964
965965
966966
......
11081108
11091109
11101110
1111
11121111
11131112
11141113
......
11191118
11201119
11211120
1122
1121
11231122
11241123
11251124
......
11391138
11401139
11411140
1142
11431141
11441142
11451143
......
11751173
11761174
11771175
1178
1176
11791177
11801178
11811179
......
13511349
13521350
13531351
1354
1352
13551353
13561354
13571355
13581356
13591357
13601358
1361
1359
13621360
13631361
13641362
1363
13651364
13661365
13671366
13681367
13691368
13701369
1370
13711371
13721372
13731373
......
14101410
14111411
14121412
1413
14141413
1415
14161414
14171415
14181416
1419
14201417
14211418
14221419
14231420
1421
14241422
1425
1426
1423
14271424
1428
14291425
14301426
1431
14321427
14331428
14341429
1435
1436
1430
14371431
14381432
1439
14401433
14411434
14421435
1443
14441436
14451437
14461438
......
14501442
14511443
14521444
1445
14531446
14541447
14551448
#elif DEBUG_ACPI==1
#define DBG(x...) printf(x)
#else
#define DBG(x...)
#define DBG(x...) msglog(x)
#endif
// Slice: New signature compare function
fd = open(dirSpec, 0);
if (fd < 0) {
// NOT FOUND:
verbose("ACPI Table not found: %s\n", filename);
DBG("ACPI Table not found: %s\n", filename);
*dirSpec = '\0';
}
}
{
if (read (fd, tableAddr, file_size (fd))!=file_size (fd))
{
printf("Couldn't read table %s\n",dirspec);
DBG("Couldn't read table %s\n",dirspec);
free (tableAddr);
close (fd);
return NULL;
return tableAddr;
}
close (fd);
printf("Couldn't allocate memory for table \n", dirspec);
DBG("Couldn't allocate memory for table \n", dirspec);
}
//printf("Couldn't find table %s\n", filename);
return NULL;
{
uint32_t i;
DBG("start finding cpu names. length %d\n", length);
DBG("Start finding cpu names. length %d\n", length);
for (i=0; i<length-7; i++)
{
if (dsdt[i] == 0x5B && dsdt[i+1] == 0x83) // ProcessorOP
{
DBG("dsdt: %x%x\n", dsdt[i], dsdt[i+1]);
DBG("DSDT: %x%x\n", dsdt[i], dsdt[i+1]);
uint32_t offset = i + 3 + (dsdt[i+2] >> 6);
if (!aml_isvalidchar(c))
{
add_name = false;
verbose("Invalid character found in ProcessorOP 0x%x!\n", c);
DBG("Invalid character found in ProcessorOP 0x%x!\n", c);
break;
}
}
if (acpi_cpu_count == 0)
acpi_cpu_p_blk = dsdt[i] | (dsdt[i+1] << 8);
verbose("Found ACPI CPU: %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count][0], acpi_cpu_name[acpi_cpu_count][1], acpi_cpu_name[acpi_cpu_count][2], acpi_cpu_name[acpi_cpu_count][3]);
DBG("Found ACPI CPU: %c%c%c%c\n", acpi_cpu_name[acpi_cpu_count][0], acpi_cpu_name[acpi_cpu_count][1], acpi_cpu_name[acpi_cpu_count][2], acpi_cpu_name[acpi_cpu_count][3]);
if (++acpi_cpu_count == 32) {
return;
}
}
DBG("end finding cpu names: cpu names found: %d\n", acpi_cpu_count);
DBG("End finding cpu names: cpu names found: %d\n", acpi_cpu_count);
}
struct acpi_2_ssdt *generate_cst_ssdt(struct acpi_2_fadt* fadt)
};
if (Platform.CPU.Vendor != 0x756E6547) {
verbose ("Not an Intel platform: C-States will not be generated !!!\n");
DBG("Not an Intel platform: C-States will not be generated !!!\n");
return NULL;
}
if (fadt == NULL) {
verbose ("FACP not exists: C-States will not be generated !!!\n");
DBG("FACP not exists: C-States will not be generated !!!\n");
return NULL;
}
struct acpi_2_dsdt* dsdt = (void*)fadt->DSDT;
if (dsdt == NULL) {
verbose ("DSDT not found: C-States will not be generated !!!\n");
DBG("DSDT not found: C-States will not be generated !!!\n");
return NULL;
}
// dumpPhysAddr("C-States SSDT content: ", ssdt, ssdt->Length);
verbose ("SSDT with CPU C-States generated successfully\n");
DBG("SSDT with CPU C-States generated successfully\n");
return ssdt;
} else {
verbose ("ACPI CPUs not found: C-States not generated !!!\n");
DBG("ACPI CPUs not found: C-States not generated !!!\n");
}
return NULL;
};
if (Platform.CPU.Vendor != 0x756E6547) {
verbose ("Not an Intel platform: P-States will not be generated !!!\n");
DBG("Not an Intel platform: P-States will not be generated !!!\n");
return NULL;
}
if (!(Platform.CPU.Features & CPU_FEATURE_MSR)) {
verbose ("Unsupported CPU: P-States will not be generated !!! No MSR support\n");
DBG("Unsupported CPU: P-States will not be generated !!! No MSR support\n");
return NULL;
}
minimum.Control = (rdmsr64(MSR_PLATFORM_INFO) >> 40) & 0xff;
verbose("P-States: min 0x%x, max 0x%x\n", minimum.Control, maximum.Control);
DBG("P-States: min 0x%x, max 0x%x\n", minimum.Control, maximum.Control);
// Sanity check
if (maximum.Control < minimum.Control) {
break;
}
default:
verbose ("Unsupported CPU (0x%X): P-States not generated !!!\n", Platform.CPU.Family);
DBG("Unsupported CPU (0x%X): P-States not generated !!!\n", Platform.CPU.Family);
break;
}
}
//dumpPhysAddr("P-States SSDT content: ", ssdt, ssdt->Length);
verbose ("SSDT with CPU P-States generated successfully\n");
DBG("SSDT with CPU P-States generated successfully\n");
return ssdt;
}
} else {
verbose ("ACPI CPUs not found: P-States not generated !!!\n");
DBG("ACPI CPUs not found: P-States not generated !!!\n");
}
return NULL;
getBoolForKey(kRestartFix, &fix_restart, &bootInfo->chameleonConfig);
}
} else {
verbose ("Not an Intel platform: Restart Fix not applied !!!\n");
DBG("Not an Intel platform: Restart Fix not applied !!!\n");
fix_restart = false;
}
fadt_mod->Reset_AccessWidth= 0x01; // Byte access
fadt_mod->Reset_Address= 0x64; // Address of the register
fadt_mod->Reset_Value= 0xfe; // Value to write to reset the system
msglog("FADT: PS2 Restart Fix applied!\n");
DBG("FADT: PS2 Restart Fix applied!\n");
} else {
fadt_mod->Flags|= 0x400;
fadt_mod->Reset_SpaceID= 0x01; // System I/O
fadt_mod->Reset_AccessWidth= 0x01; // Byte access
fadt_mod->Reset_Address= 0x0cf9; // Address of the register
fadt_mod->Reset_Value= 0x06; // Value to write to reset the system
verbose("FADT: ACPI Restart Fix applied!\n");
DBG("FADT: ACPI Restart Fix applied!\n");
}
}
DBG("New @%x,%x\n",fadt_mod->DSDT,fadt_mod->X_DSDT);
verbose("FADT: Using custom DSDT!\n");
DBG("FADT: Using custom DSDT!\n");
}
// Correct the checksum
if(acpi20_p) {
addConfigurationTable(&gEfiAcpi20TableGuid, &acpi20_p, "ACPI_20");
} else {
verbose("No ACPI 2.\n");
DBG("No ACPI 2.\n");
}
return 1;
}
for (i = 0; i < 30; i++) {
char filename[512];
sprintf(filename, i > 0?"SSDT-%d.aml":"SSDT.aml", i);
sprintf(filename, i > 0 ? "SSDT-%d.aml" : "SSDT.aml", i);
if ( (new_ssdt[ssdt_count] = loadACPITable(filename)) ) {
ssdt_count++;
int rsdplength;
// Find original rsdp
rsdp=(struct acpi_2_rsdp *)(version?getAddressOfAcpi20Table():getAddressOfAcpiTable());
rsdp=(struct acpi_2_rsdp *)(version ? getAddressOfAcpi20Table() : getAddressOfAcpiTable());
if (!rsdp) {
DBG("No ACPI version %d found. Ignoring\n", version+1);
if (version) {
}
continue;
}
rsdplength=version?rsdp->Length:20;
rsdplength=version ? rsdp->Length : 20;
DBG("RSDP version %d found @%x. Length=%d\n",version+1,rsdp,rsdplength);
if(new_dsdt) {
rsdt_entries[i-dropoffset]=(uint32_t)new_dsdt;
}
continue;
}
DBG("FADT found @%x, Length %d\n",fadt, fadt->Length);
if (!fadt || (uint32_t)fadt == 0xffffffff || fadt->Length>0x10000) {
printf("FADT incorrect. Not modified\n");
DBG("FADT incorrect. Not modified\n");
continue;
}
generate_pstates = false; // Generate SSDT only once!
ssdt_count++;
}
continue;
}
}
DBG("New checksum %d at %x\n", rsdt_mod->Checksum,rsdt_mod);
} else {
rsdp_mod->RsdtAddress=0;
printf("RSDT not found or RSDT incorrect\n");
DBG("RSDT not found or RSDT incorrect\n");
}
if (version) {
fadt->Length);
if (!fadt || (uint64_t)xsdt_entries[i] >= 0xffffffff || fadt->Length>0x10000) {
verbose("FADT incorrect or after 4GB. Dropping XSDT\n");
DBG("FADT incorrect or after 4GB. Dropping XSDT\n");
goto drop_xsdt;
}
fadt_mod = patch_fadt(fadt, new_dsdt);
xsdt_entries[i-dropoffset]=(uint32_t)fadt_mod;
DBG("TABLE %c%c%c%c@%x \n", table[0],table[1],table[2],table[3],xsdt_entries[i]);
// DBG("TABLE %c%c%c%c@%x \n", table[0],table[1],table[2],table[3],xsdt_entries[i]);
// Generate _CST SSDT
if (generate_cstates && (new_ssdt[ssdt_count] = generate_cst_ssdt(fadt_mod))) {
DBG("C-States generated\n");
generate_cstates = false; // Generate SSDT only once!
ssdt_count++;
}
// Generating _PSS SSDT
if (generate_pstates && (new_ssdt[ssdt_count] = generate_pss_ssdt((void*)fadt_mod->DSDT))) {
DBG("P-States generated\n");
generate_pstates = false; // Generate SSDT only once!
ssdt_count++;
}
xsdt_mod->Checksum=256-checksum8(xsdt_mod,xsdt_mod->Length);
} else {
drop_xsdt:
DBG("About to drop XSDT\n");
/*FIXME: Now we just hope that if MacOS doesn't find XSDT it reverts to RSDT.
* A Better strategy would be to generate
*/
rsdp_mod->XsdtAddress=0xffffffffffffffffLL;
verbose("XSDT not found or XSDT incorrect\n");
}
}
DBG("\n");
// Correct the checksum of RSDP
// Correct the checksum of RSDP
DBG("RSDP: Original checksum %d, ", rsdp_mod->Checksum);
rsdp_mod->Checksum=0;
rsdp_mod->Checksum=256-checksum8(rsdp_mod,20);
DBG("New checksum %d\n", rsdp_mod->Checksum);
if (version) {
DBG("RSDP: Original extended checksum %d", rsdp_mod->ExtendedChecksum);
DBG("RSDP: Original extended checksum %d, ", rsdp_mod->ExtendedChecksum);
rsdp_mod->ExtendedChecksum=0;
rsdp_mod->ExtendedChecksum=256-checksum8(rsdp_mod,rsdp_mod->Length);
DBG("New extended checksum %d\n", rsdp_mod->ExtendedChecksum);
}
//verbose("Patched ACPI version %d DSDT\n", version+1);
if (version) {
/* XXX aserebln why uint32 cast if pointer is uint64 ? */
acpi20_p = (uint64_t)(uint32_t)rsdp_mod;
acpi10_p = (uint64_t)(uint32_t)rsdp_mod;
addConfigurationTable(&gEfiAcpiTableGuid, &acpi10_p, "ACPI");
}
DBG("ACPI version %d patching finished\n\n", version+1);
}
#if DEBUG_ACPI
printf("Press a key to continue... (DEBUG_ACPI)\n");
branches/ErmaC/Enoch/i386/libsaio/device_tree.h
6767
6868
6969
70
71
72
7073
7174
7275
extern char *
DT__GetName(Node *node);
extern Property *
DT__GetProperty(Node *node, const char *name);
void
DT__Initialize(void);
branches/ErmaC/Enoch/i386/libsaio/spd.c
381381
382382
383383
384
385384
386385
387386
}
static struct smbus_controllers_t smbus_controllers[] = {
// Info from here: http://cateee.net/lkddb/web-lkddb/I2C_I801.html
{0x8086, 0x1C22, "6 Series", read_smb_intel },
{0x8086, 0x1D22, "C600/X79 Series", read_smb_intel },
branches/ErmaC/Enoch/i386/libsaio/networking.c
162162
163163
164164
165
165
166166
167167
168
169
168
169
170170
171171
172172
if(device)
{
verbose("Setting up lan keys\n");
name_model = get_ethernet_model(eth_dev->vendor_id, eth_dev->device_id);
name_model = get_ethernet_model(eth_dev->vendor_id, eth_dev->device_id);
devprop_add_network_template(device, eth_dev->vendor_id);
devprop_add_value(device, "model", (uint8_t*)name_model, (strlen(name_model) + 1));
devprop_add_value(device, "model", (uint8_t*)name_model, (strlen(name_model) + 1));
devprop_add_value(device, "device_type", (uint8_t*)"ethernet", 9);
stringdata = (uint8_t*)malloc(sizeof(uint8_t) * string->length);
if(stringdata)
{
branches/ErmaC/Enoch/i386/libsaio/spd.h
111111
112112
113113
114
115
114
115
116116
117
117
118118
119119
120120
121
122
121123
122124
123125
/* SPD_MEMORY_TYPE values. */
#define SPD_MEMORY_TYPE_FPM_DRAM1
#define SPD_MEMORY_TYPE_EDO2
#define SPD_MEMORY_TYPE_PIPELINED_NIBBLE3
#define SPD_MEMORY_TYPE_EDO2
#define SPD_MEMORY_TYPE_PIPELINED_NIBBLE3
#define SPD_MEMORY_TYPE_SDRAM4
#define SPD_MEMORY_TYPE_MULTIPLEXED_ROM5
#define SPD_MEMORY_TYPE_MULTIPLEXED_ROM5
#define SPD_MEMORY_TYPE_SGRAM_DDR6
#define SPD_MEMORY_TYPE_SDRAM_DDR7
#define SPD_MEMORY_TYPE_SDRAM_DDR28
#define SPD_MEMORY_TYPE_SDRAM_FB_DDR29
#define SPD_MEMORY_TYPE_SDRAM_FBP_DDR20xa
#define SPD_MEMORY_TYPE_SDRAM_DDR30xb
/* SPD_MODULE_VOLTAGE values. */
branches/ErmaC/Enoch/i386/libsaio/gma.c
512512
513513
514514
515
516
515
516
517
518
517519
518520
519521
......
522524
523525
524526
525
526
527
527
528
529
530
528531
529532
530533
......
534537
535538
536539
537
538
539
540
540
541
542
543
544
541545
542
543
544
545
546
546
547
548
549
550
547551
548552
549553
......
605609
606610
607611
608
612
613
609614
610615
611616
devprop_add_value(device, "AAPL,snb-platform-id",HD3000_vals[16], 4);// previusly commented
break;
/* 0102 */
case GMA_SANDYBRIDGE_GT1: // HD Graphics 2000
/* 0102 */
/* HD Graphics 2000 */
case GMA_SANDYBRIDGE_GT1: // 0102
device_id = 0x00000102;// Inject a valid mobile GPU device id instead of patching kexts
devprop_add_value(device, "built-in",&BuiltIn, 1);
devprop_add_value(device, "class-code",ClassFix, 4);
devprop_add_value(device, "device-id",(uint8_t*)&device_id, sizeof(device_id));
devprop_add_value(device, "AAPL,os-info",HD2000_os_info, 20);
break;
/* Sandy Bridge */ /* 0112, 0122 */
case GMA_SANDYBRIDGE_GT2: // HD Graphics 3000
case GMA_SANDYBRIDGE_GT2_PLUS:
/* Sandy Bridge */
/* HD Graphics 3000 */
case GMA_SANDYBRIDGE_GT2: // 0112
case GMA_SANDYBRIDGE_GT2_PLUS: // 0122
devprop_add_value(device, "built-in",&BuiltIn, 1);
devprop_add_value(device, "class-code",ClassFix, 4);
device_id = 0x00000126;// Inject a valid mobile GPU device id instead of patching kexts
devprop_add_value(device, "AAPL,os-info",HD3000_os_info, 20);
break;
/* Ivy Bridge */ /* 0152, 0156, 015a, 015e, 0162, 0166, 016a, 0172, 0176 */
case GMA_IVYBRIDGE_D_GT1: // HD Graphics 4000, HD Graphics 4000 Mobile, HD Graphics P4000, HD Graphics 2500 HD, Graphics 2500 Mobile
case GMA_IVYBRIDGE_M_GT1:
case GMA_IVYBRIDGE_S_GT1:
/* Ivy Bridge */
/* HD Graphics 4000, HD Graphics 4000 Mobile, HD Graphics P4000, HD Graphics 2500 HD, Graphics 2500 Mobile */
case GMA_IVYBRIDGE_D_GT1: // 0152
case GMA_IVYBRIDGE_M_GT1: // 0156
case GMA_IVYBRIDGE_S_GT1: // 015A
case GMA_IVYBRIDGE_S_GT3: // 015e
case GMA_IVYBRIDGE_D_GT2:
case GMA_IVYBRIDGE_M_GT2:
case GMA_IVYBRIDGE_S_GT2:
case GMA_IVYBRIDGE_S_GT4: // 0172:
case GMA_IVYBRIDGE_S_GT5: // 0176:
case GMA_IVYBRIDGE_D_GT2: // 0162
case GMA_IVYBRIDGE_M_GT2: // 0166
case GMA_IVYBRIDGE_S_GT2: // 016A
case GMA_IVYBRIDGE_S_GT4: // 0172
case GMA_IVYBRIDGE_S_GT5: // 0176
if (getValueForKey(kAAPLCustomIG, &value, &len, &bootInfo->chameleonConfig) && len == AAPL_LEN_IVY * 2)
{
devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
break;
/* Haswell */ // HD Graphics 5000, HD Graphics 5000 Mobile, HD Graphics P5000, HD Graphics 4600, HD Graphics 4600 Mobile
/* Haswell */
/* HD Graphics 5000, HD Graphics 5000 Mobile, HD Graphics P5000, HD Graphics 4600, HD Graphics 4600 Mobile */
//case 0x80860090:
//case 0x80860091:
//case 0x80860092:
branches/ErmaC/Enoch/i386/libsaio/aml_generator.c
6767
6868
6969
70
70
71
7172
7273
7374
......
7677
7778
7879
79
80
81
8082
8183
8284
......
8789
8890
8991
90
92
93
9194
9295
9396
......
101104
102105
103106
104
107
108
105109
106110
107111
......
114118
115119
116120
117
121
122
118123
119124
120125
......
128133
129134
130135
131
136
137
132138
133139
134140
......
144150
145151
146152
147
153
154
148155
149156
150157
......
162169
163170
164171
165
172
173
166174
167175
168176
......
175183
176184
177185
178
186
187
179188
180189
181190
......
183192
184193
185194
186
195
196
187197
188198
189199
190200
191
201
202
192203
193204
194205
195
206
207
196208
197209
198210
......
200212
201213
202214
203
215
216
204217
205218
206219
......
224237
225238
226239
227
240
241
228242
229243
230244
......
236250
237251
238252
239
253
254
240255
241256
242257
......
248263
249264
250265
251
266
267
252268
253269
254270
......
263279
264280
265281
266
282
283
267284
268285
269286
......
276293
277294
278295
279
296
297
280298
281299
282300
......
292310
293311
294312
295
313
314
296315
297316
298317
......
304323
305324
306325
307
326
327
308328
309329
310330
......
316336
317337
318338
319
339
340
320341
321342
322343
......
328349
329350
330351
331
352
353
332354
333355
334356
......
340362
341363
342364
343
365
366
344367
345368
346369
......
352375
353376
354377
355
378
379
356380
357381
358382
......
369393
370394
371395
372
396
397
373398
374399
375400
376401
377402
378403
379
404
380405
381
406
382407
383408
384409
......
388413
389414
390415
391
416
417
392418
393419
394420
395
421
396422
397
423
398424
399425
400426
......
404430
405431
406432
407
433
434
408435
409436
410437
......
426453
427454
428455
429
456
457
430458
431459
432460
433461
434462
435
463
464
436465
437466
438467
......
440469
441470
442471
443
472
473
444474
445475
446476
......
466496
467497
468498
469
499
500
470501
471502
472503
......
529560
530561
531562
532
563
564
533565
534566
535567
......
538570
539571
540572
541
573
574
542575
543576
544577
......
559592
560593
561594
562
595
596
563597
564598
565599
566
600
601
567602
568603
569604
{
AML_CHUNK* next = child->Next;
if (child->Buffer) {
if (child->Buffer)
{
free(child->Buffer);
}
free(child);
}
// Free node
if (node->Buffer) {
if (node->Buffer)
{
free(node->Buffer);
}
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_ONES_OP;
node->Length = (uint16_t)size;
node->Buffer = malloc(node->Length);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_BYTE_PREFIX;
node->Length = 1;
node->Buffer = malloc(node->Length);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_WORD_PREFIX;
node->Length = 2;
node->Buffer = malloc(node->Length);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_DWORD_PREFIX;
node->Length = 4;
node->Buffer = malloc(node->Length);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_QWORD_PREFIX;
node->Length = 8;
node->Buffer = malloc(node->Length);
uint32_t aml_fill_simple_name(char* buffer, char* name)
{
if (strlen(name) < 4) {
if (strlen(name) < 4)
{
verbose("aml_fill_simple_name: simple name %s has incorrect lengh! Must be 4.\n", name);
return 0;
}
int len, offset, count;
uint32_t root = 0;
if (!node) {
if (!node)
{
return 0;
}
offset = 0;
count = len >> 2;
if ((len % 4) > 1 || count == 0) {
if ((len % 4) > 1 || count == 0)
{
verbose("aml_fill_name: pathname %s has incorrect length! Must be 4, 8, 12, 16, etc...\n", name);
return 0;
}
if (((len % 4) == 1) && (name[0] == '\\')) {
if (((len % 4) == 1) && (name[0] == '\\'))
{
root++;
}
if (count == 1) {
if (count == 1)
{
node->Length = (uint16_t)(4 + root);
node->Buffer = malloc(node->Length+4);
memcpy(node->Buffer, name, 4 + root);
return (uint32_t)offset;
}
if (count == 2) {
if (count == 2)
{
node->Length = 2 + 8;
node->Buffer = malloc(node->Length+4);
node->Buffer[offset++] = 0x5c; // Root Char
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_SCOPE_OP;
aml_fill_name(node, name);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_NAME_OP;
aml_fill_name(node, name);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
unsigned int offset = aml_fill_name(node, name);
node->Type = AML_METHOD_OP;
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_PACKAGE_OP;
node->Length = 1;
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_ALIAS_OP;
node->Length = 8;
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_RETURN_OP;
aml_fill_name(node, name);
}
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_RETURN_OP;
aml_add_byte(node, value);
}
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_EXT_DEVICE_OP;
aml_fill_name(node, name);
}
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_LOCAL0;
node->Length = 1;
}
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_STORE_OP;
node->Length = 1;
}
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
int offset = 0;
node->Type = AML_BUFFER_OP;
node->Length = (uint8_t)(size + 2);
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
unsigned int offset = 0;
unsigned int len = strlen(StringBuf);
node->Type = AML_BUFFER_OP;
node->Length = (uint8_t)(len + 3);
node->Buffer = malloc (node->Length);
node->Buffer[offset++] = AML_BYTE_PREFIX;
node->Buffer[offset++] = (char)len;
node->Buffer[offset++] = (char)(len +1);
memcpy(node->Buffer+offset, StringBuf, len);
node->Buffer[offset+len] = '\0';
//node->Buffer[offset+len] = '\0';
}
return node;
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
int len = strlen(StringBuf);
node->Type = AML_STRING_PREFIX;
node->Length = (uint8_t)(len + 1);
node->Buffer = malloc (len);
node->Buffer = malloc (len + 1);
memcpy(node->Buffer, StringBuf, len);
node->Buffer[len] = '\0';
//node->Buffer[len] = '\0';
}
return node;
{
AML_CHUNK* node = aml_create_node(parent);
if (node) {
if (node)
{
node->Type = AML_RETURN_OP;
//aml_add_byte(node, value);
}
uint32_t aml_calculate_size(AML_CHUNK* node)
{
if (node) {
if (node)
{
// Calculate child nodes size
AML_CHUNK* child = node->First;
uint8_t child_count = 0;
node->Size = 0;
while (child) {
while (child)
{
child_count++;
node->Size += (uint16_t)aml_calculate_size(child);
child = child->Next;
}
switch (node->Type) {
switch (node->Type)
{
case AML_ONES_OP:
case AML_STORE_OP:
case AML_LOCAL0:
break;
case AML_BYTE_PREFIX:
if (node->Buffer[0] == 0x0 || node->Buffer[0] == 0x1) {
if (node->Buffer[0] == 0x0 || node->Buffer[0] == 0x1)
{
node->Size += node->Length;
} else {
node->Size += 1 + node->Length;
uint32_t aml_write_buffer(const char* value, uint32_t size, char* buffer, uint32_t offset)
{
if (size > 0) {
if (size > 0)
{
memcpy(buffer + offset, value, size);
}
uint32_t aml_write_size(uint32_t size, char* buffer, uint32_t offset)
{
if (size <= 0x3f) { /* simple 1 byte length in 6 bits */
if (size <= 0x3f) /* simple 1 byte length in 6 bits */
{
buffer[offset++] = (char)size;
} else if (size <= 0xfff) {
buffer[offset++] = 0x40 | (size & 0xf); /* 0x40 is type, 0x0X is first nibble of length */
uint32_t aml_write_node(AML_CHUNK* node, char* buffer, uint32_t offset)
{
if (node && buffer) {
if (node && buffer)
{
uint32_t old = offset;
AML_CHUNK* child = node->First;
switch (node->Type) {
switch (node->Type)
{
case AML_ONES_OP:
offset = aml_write_buffer(node->Buffer, node->Length, buffer, offset);
break;
branches/ErmaC/Enoch/i386/libsaio/device_inject.c
2020
2121
2222
23
23
2424
2525
2626
......
252252
253253
254254
255
255
256
256257
257258
258259
......
260261
261262
262263
263
264
264265
265266
267
266268
267269
268270
269271
270
272
273
274
275
276
277
278
279
280
271281
272282
273283
274
284
285
275286
276287
277288
278289
279290
280291
292
281293
282294
283
295
296
297
298
284299
285300
286301
287302
288303
304
289305
290
291
306
307
308
309
310
311
292312
293313
294314
295315
316
296317
297318
298319
299
320
321
322
323
300324
325
301326
302327
303328
#if DEBUG_INJECT
#define DBG(x...)printf(x)
#else
#define DBG(x...)
#define DBG(x...)msglog(x)
#endif
uint32_t devices_number= 1;
char *devprop_generate_string(DevPropString *string)
{
char *buffer = (char*)malloc(string->length * 2);
int len = string->length * 2;
char *buffer = (char*)malloc(len);
char *ptr = buffer;
if(!buffer)
return NULL;
}
sprintf(buffer, "%08x%08x%04x%04x", dp_swap32(string->length), string->WHAT2,
snprintf(buffer, len, "%08x%08x%04x%04x", dp_swap32(string->length), string->WHAT2,
dp_swap16(string->numentries), string->WHAT3);
buffer += 24;
len -= 24;
int i = 0, x = 0;
while(i < string->numentries)
{
sprintf(buffer, "%08x%04x%04x", dp_swap32(string->entries[i]->length),
if (!(i < DEV_PROP_DEVICE_MAX_ENTRIES)) {
break;
}
if(!len) {
break;
}
snprintf(buffer, len, "%08x%04x%04x", dp_swap32(string->entries[i]->length),
dp_swap16(string->entries[i]->numentries), string->entries[i]->WHAT2);
buffer += 16;
sprintf(buffer, "%02x%02x%04x%08x%08x", string->entries[i]->acpi_dev_path.type,
len -= 16;
snprintf(buffer, len, "%02x%02x%04x%08x%08x", string->entries[i]->acpi_dev_path.type,
string->entries[i]->acpi_dev_path.subtype,
dp_swap16(string->entries[i]->acpi_dev_path.length),
string->entries[i]->acpi_dev_path._HID,
dp_swap32(string->entries[i]->acpi_dev_path._UID));
buffer += 24;
len -= 24;
for(x = 0;x < string->entries[i]->num_pci_devpaths; x++)
{
sprintf(buffer, "%02x%02x%04x%02x%02x", string->entries[i]->pci_dev_path[x].type,
if(!len) {
break;
}
snprintf(buffer, len, "%02x%02x%04x%02x%02x", string->entries[i]->pci_dev_path[x].type,
string->entries[i]->pci_dev_path[x].subtype,
dp_swap16(string->entries[i]->pci_dev_path[x].length),
string->entries[i]->pci_dev_path[x].function,
string->entries[i]->pci_dev_path[x].device);
buffer += 12;
len -= 12;
}
sprintf(buffer, "%02x%02x%04x", string->entries[i]->path_end.type,
if(!len) {
break;
}
snprintf(buffer, len, "%02x%02x%04x", string->entries[i]->path_end.type,
string->entries[i]->path_end.subtype,
dp_swap16(string->entries[i]->path_end.length));
buffer += 8;
len -= 8;
uint8_t *dataptr = string->entries[i]->data;
for(x = 0; (uint32_t)x < (string->entries[i]->length) - (24 + (6 * string->entries[i]->num_pci_devpaths)) ; x++)
{
sprintf(buffer, "%02x", *dataptr++);
if(!len) {
break;
}
snprintf(buffer, len, "%02x", *dataptr++);
buffer += 2;
len -= 2;
}
i++;
}
branches/ErmaC/Enoch/i386/libsaio/hda.c
615615
616616
617617
618
619
620
618621
619
622
620623
621624
622625
default_HDEF_layout_id[0], default_HDEF_layout_id[1], default_HDEF_layout_id[2], default_HDEF_layout_id[3]);
}
devprop_add_value(device, "layout-id", default_HDEF_layout_id, HDEF_LEN);
devprop_add_value(device, "AAPL,slot-name", (uint8_t *)"Built-in", 9); // 0x09
devprop_add_value(device, "name", (uint8_t *)"audio", 6); // 0x06
devprop_add_value(device, "device_type", (uint8_t *)"High Definition Audio", 22); // 0x16
devprop_add_value(device, "built-in", &BuiltIn, 1);
devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10);
devprop_add_value(device, "hda-gfx", (uint8_t *)"onboard-1", 10); // 0x0a
break;
/****************************************************************************************************************
branches/ErmaC/Enoch/i386/libsaio/nvidia.c
12201220
12211221
12221222
1223
12231224
12241225
12251226
......
12441245
12451246
12461247
1248
12471249
12481250
12491251
{ 0x10DE1281,"GeForce GT 710" },
{ 0x10DE1282,"GeForce GT 640" },
{ 0x10DE1284,"GeForce GT 630" },
{ 0x10DE1286,"GeForce GT 720" },
// 1290 - 129F
{ 0x10DE1290,"GeForce GT 730M" },
{ 0x10DE1291,"GeForce GT 735M" },
{ 0x10DE1341,"GeForce 840M" },
{ 0x10DE1380,"GeForce GTX 750 Ti" },
{ 0x10DE1381,"GeForce GTX 750" },
{ 0x10DE1382,"GeForce GTX 745" },
{ 0x10DE1390,"GeForce 845M" },
{ 0x10DE1391,"GeForce GTX 850M" },
{ 0x10DE1392,"GeForce GTX 860M" },
branches/ErmaC/Enoch/i386/libsaio/ati.c
77
88
99
10
11
12
1013
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
14
6015
6116
6217
......
8944
9045
9146
92
47
9348
9449
9550
9651
9752
9853
99
54
10055
10156
10257
......
11368
11469
11570
116
71
11772
11873
11974
120
121
122
123
124
125
126
127
75
76
77
78
79
80
81
82
12883
12984
13085
13186
13287
133
88
13489
13590
13691
......
13893
13994
14095
141
142
143
144
145
96
14697
147
148
149
150
151
152
153
98
99
100
101
102
103
104
105
106
107
108
154109
155
156
157
158
110
111
112
113
114
115
116
159117
160
161
162
163
164
165
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
166133
167
168
169
170
171
172
173
174
175
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
176170
177
178
179
180
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
181188
182
183
184
185
186
189
190
191
192
187193
188
189
190
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
191209
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
210
211
213212
214
215
216
217
218
213
214
215
219216
220
221
222
223
224
225
226
227
228
229
217
218
230219
231
232
233
220
221
234222
235
236
237
238
239
240
241
223
224
225
226
227
242228
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
229
230
231
232
233
268234
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214235
1215236
1216
237
1217238
1218239
240
241
242
1219243
1220
244
245
1221246
1222247
1223248
......
1235260
1236261
1237262
1238
263
264
265
266
267
268
269
270
271
272
273
1239274
1240275
1241276
......
1243278
1244279
1245280
1246
1247
281
282
1248283
1249284
1250285
......
1253288
1254289
1255290
291
292
293
294
1256295
1257
296
1258297
1259298
1260299
......
1269308
1270309
1271310
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
311
1283312
1284313
1285314
......
1291320
1292321
1293322
1294
323
1295324
1296
325
1297326
1298327
1299328
......
1304333
1305334
1306335
1307
336
1308337
1309338
1310339
1311340
1312
341
1313342
1314343
1315344
1316345
1317346
1318
1319
1320
347
348
349
1321350
1322351
1323352
1324
353
1325354
1326
1327
355
356
1328357
1329358
1330
1331
1332
1333
1334
1335
1336
359
360
361
362
363
364
365
1337366
1338367
1339
1340
1341
368
369
370
371
372
373
374
375
376
377
1342378
1343
1344
1345
1346
1347
379
380
381
382
383
384
385
386
387
388
389
390
1348391
1349392
1350393
1351
1352
1353
1354
1355
394
395
396
397
398
399
400
401
1356402
1357
403
1358404
1359
1360
1361
1362
1363
1364
1365
1366
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
1367421
422
423
424
425
1368426
1369
1370
1371
1372
1373
1374
427
428
429
430
431
432
433
434
1375435
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
436
437
438
439
440
441
442
443
444
445
1386446
1387
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
1388464
1389
1390
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
1391485
1392
486
1393487
488
1394489
1395
1396
1397
1398
1399
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
1400505
1401
1402
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
1403521
1404522
1405523
1406
1407
1408
1409
1410
524
525
526
527
528
529
530
531
532
533
1411534
1412
1413
1414
535
536
537
1415538
1416
1417
539
540
1418541
1419
1420
1421
1422
542
543
544
545
1423546
1424
1425
1426
1427
1428
1429
1430
1431
1432
547
548
549
550
551
552
553
554
555
1433556
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
557
558
559
560
561
562
563
564
565
566
1444567
1445
568
1446569
1447
1448
1449
570
571
572
1450573
1451574
1452
1453
575
576
1454577
1455
1456
578
579
1457580
1458581
1459
1460582
1461583
1462
584
1463585
1464586
1465587
......
1475597
1476598
1477599
1478
600
1479601
1480602
1481603
1482604
1483
1484
1485
1486
605
606
607
608
1487609
1488
1489
1490
1491
1492
1493
610
611
612
613
614
615
1494616
1495
1496
1497
1498
1499
1500
1501
1502
1503
617
618
619
620
621
622
623
624
625
1504626
1505
1506
1507
1508
1509
627
628
629
630
631
1510632
1511633
1512634
1513
1514
1515
1516
1517
1518
1519
1520
1521
635
636
637
638
639
640
641
642
643
644
645
1522646
1523
1524
1525
1526
647
648
649
650
1527651
1528
1529
1530
1531
1532
1533
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
1534672
1535
1536
673
674
675
676
677
1537678
1538679
1539
1540
1541
1542
1543
1544
1545
1546
680
681
682
683
684
685
686
687
688
1547689
1548690
1549
1550
1551
1552
1553
691
692
693
694
695
696
697
1554698
1555699
1556
1557
1558
1559
700
701
702
703
1560704
1561
1562
1563
1564
1565
1566
705
706
707
708
709
710
1567711
1568
1569
712
713
1570714
1571
715
1572716
1573717
1574718
1575719
1576
720
1577721
1578722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
1579779
1580
1581
1582
780
781
782
1583783
1584
1585
1586
1587
1588
1589
1590
1591
784
785
786
787
788
1592789
1593
1594
1595
1596
1597
1598
1599
790
791
792
793
1600794
1601
1602
1603
1604
1605
795
796
1606797
1607
1608
1609
1610
1611
798
1612799
1613
1614
800
801
802
803
804
805
806
1615807
1616
1617
1618
1619
1620
1621
1622
808
809
810
811
812
1623813
1624
1625
1626
1627
814
815
816
817
818
1628819
820
821
822
1629823
1630824
1631825
1632826
1633
1634
827
1635828
1636829
1637
1638
830
1639831
1640832
1641833
......
1646838
1647839
1648840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
1649867
1650868
1651869
1652870
1653871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
1654889
1655890
1656891
......
1675910
1676911
1677912
1678
913
1679914
1680915
1681916
1682917
1683918
919
920
921
1684922
1685923
1686924
......
1702940
1703941
1704942
1705
1706
943
1707944
1708945
1709946
......
1715952
1716953
1717954
1718
1719
955
1720956
1721957
1722958
1723959
1724960
1725
961
1726962
1727963
1728964
965
1729966
1730967
968
1731969
1732
1733
1734
970
971
972
973
974
975
976
977
978
979
1735980
1736981
1737982
1738983
1739984
1740
985
986
987
988
989
1741990
1742
1743
1744
991
992
1745993
1746994
1747995
......
17771025
17781026
17791027
1780
1781
1028
17821029
17831030
17841031
......
18021049
18031050
18041051
1805
1806
1052
18071053
18081054
18091055
18101056
18111057
18121058
1813
1059
18141060
18151061
18161062
18171063
18181064
18191065
1820
1066
18211067
18221068
18231069
......
18741120
18751121
18761122
1877
1878
1123
1124
18791125
18801126
18811127
18821128
18831129
1884
1885
1130
1131
18861132
18871133
18881134
1889
1890
1135
1136
18911137
18921138
18931139
......
19231169
19241170
19251171
1172
19261173
19271174
19281175
......
19461193
19471194
19481195
1949
1950
1951
1196
19521197
19531198
19541199
......
19641209
19651210
19661211
1967
1968
1969
1212
19701213
19711214
19721215
19731216
19741217
1218
19751219
19761220
19771221
......
20331277
20341278
20351279
2036
2037
2038
1280
20391281
20401282
20411283
......
20571299
20581300
20591301
2060
2061
1302
20621303
20631304
20641305
......
21911432
21921433
21931434
1435
1436
21941437
21951438
21961439
......
22011444
22021445
22031446
2204
1447
22051448
22061449
22071450
......
22141457
22151458
22161459
2217
2218
2219
1460
22201461
22211462
2222
1463
22231464
22241465
22251466
22261467
22271468
22281469
1470
22291471
22301472
22311473
......
22411483
22421484
22431485
2244
2245
2246
1486
22471487
22481488
22491489
......
22531493
22541494
22551495
2256
1496
22571497
2258
2259
2260
1498
22611499
22621500
22631501
......
22731511
22741512
22751513
2276
1514
22771515
22781516
22791517
22801518
2281
1519
22821520
22831521
22841522
......
23061544
23071545
23081546
2309
1547
23101548
23111549
23121550
......
23151553
23161554
23171555
2318
1556
23191557
23201558
23211559
......
23251563
23261564
23271565
2328
1566
23291567
23301568
23311569
......
23331571
23341572
23351573
1574
1575
23361576
23371577
23381578
#include "ati.h"
static value_t aty_name;
static value_t aty_nameparent;
card_t *card;
static const char *chip_family_name[] = {
"UNKNOW",
"R420",
"RV410",
"RV515",
"R520",
"RV530",
"RV560",
"RV570",
"R580",
/* IGP */
"RS600",
"RS690",
"RS740",
"RS780",
"RS880",
/* R600 */
"R600",
"RV610",
"RV620",
"RV630",
"RV635",
"RV670",
/* R700 */
"RV710",
"RV730",
"RV740",
"RV772",
"RV770",
"RV790",
/* Evergreen */
"Cedar",
"Cypress",
"Hemlock",
"Juniper",
"Redwood",
"Broadway",
/* Northern Islands */
"Barts",
"Caicos",
"Cayman",
"Turks",
/* Southern Islands */
"Tahiti",
"Pitcairn",
""
};
static card_config_t card_configs[] = {
card_config_t card_configs[] = {
{NULL,0},
/* OLDController */
{"Wormy",2},
{"Uakari",4},
{"Zonalis",6},
{"Alouatta",4},
{"Hoolock",3},
{"Hoolock",1},
{"Vervet",4},
{"Baboon",3},
{"Eulemur",3},
{"Galago",2},
{"Colobus",2},
{"Mangabey",2},
{"Nomascus",4},
{"Nomascus",5},
{"Orangutan",2},
/* AMD6000Controller */
{"Pithecia",3},
{"Muskgrass",4},
{"Juncus",4},
{"Osmunda", 4},
{"Pondweed", 3},
{"Pondweed",3},
{"Spikerush", 4},
{"Typha", 5},
/* AMD7000Controller */
{"Aji", 4},
{"Buri", 4},
{"Chutoro", 5},
{"Dashimaki", 4},
{"Ebi", 5},
{"Gari", 5},
{"Futomaki", 4},
{"Hamachi", 4},
{"Aji",4},
{"Buri",4},
{"Chutoro",5},
{"Dashimaki",4},
{"Ebi",5},
{"Gari",5},
{"Futomaki",5},
{"Hamachi",4},
{"OPM", 6},
{"Ikura", 6},
{"IkuraS", 1}
};
static radeon_card_info_t radeon_cards[] = {
radeon_card_info_t radeon_cards[] = {
// Earlier cards are not supported
//
// Cards are grouped by device id and vendor id then sorted by subsystem id to make it easier to add new cards
//
{ 0x9400,0x01611043, CHIP_FAMILY_R600,"ATI Radeon HD 2900 XT", kNull},
{ 0x9400,0x021E1043, CHIP_FAMILY_R600,"ATI Radeon HD 2900 XT", kNull},
{ 0x9400,0x25521002, CHIP_FAMILY_R600,"ATI Radeon HD 2900 XT", kNull},
{ 0x9400,0x30001002, CHIP_FAMILY_R600,"ATI Radeon HD 2900 PRO", kNull},
{ 0x9400,0x31421002, CHIP_FAMILY_R600,"ATI Radeon HD 2900 XT", kNull},
/* Old series */
{ 0x9440,0x05021002, CHIP_FAMILY_RV770,"ATI Radeon HD 4870", kMotmot},
{ 0x9440,0x0851174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4870", kMotmot},
{ 0x9440,0x114A174B, CHIP_FAMILY_RV770,"Sapphire Radeon HD4870 Vapor-X", kCardinal},
{ 0x9440,0x24401682, CHIP_FAMILY_RV770,"ATI Radeon HD 4870", kMotmot},
{ 0x9440,0x24411682, CHIP_FAMILY_RV770,"ATI Radeon HD 4870", kMotmot},
{ 0x9440,0x24441682, CHIP_FAMILY_RV770,"ATI Radeon HD 4870", kMotmot},
{ 0x9440,0x24451682, CHIP_FAMILY_RV770,"ATI Radeon HD 4870", kMotmot},
// R423
{ 0x5D48, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Mobile ",kNull},
{ 0x5D49, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Mobile ",kNull},
{ 0x5D4A, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Mobile ",kNull},
{ 0x5D4C, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x5D4D, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x5D4E, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x5D4F, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x5D50, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x5D52, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x5D57, 0x00000000, CHIP_FAMILY_R423, "ATI Radeon HD Desktop ",kNull},
{ 0x9441,0x02601043, CHIP_FAMILY_RV770,"ASUS EAH4870x2", kMotmot},
{ 0x9441,0x02841043, CHIP_FAMILY_RV770,"ASUS EAH4870x2", kMotmot},
{ 0x9441,0x24401682, CHIP_FAMILY_RV770,"ATI Radeon HD 4870 X2", kMotmot},
{ 0x9441,0x25421002, CHIP_FAMILY_RV770,"PowerColor HD 4870 X2", kMotmot},
// RV410
{ 0x5E48, 0x00000000, CHIP_FAMILY_RV410, "ATI Radeon HD Desktop ",kNull},
{ 0x5E4A, 0x00000000, CHIP_FAMILY_RV410, "ATI Radeon HD Desktop ",kNull},
{ 0x5E4B, 0x00000000, CHIP_FAMILY_RV410, "ATI Radeon HD Desktop ",kNull},
{ 0x5E4C, 0x00000000, CHIP_FAMILY_RV410, "ATI Radeon HD Desktop ",kNull},
{ 0x5E4D, 0x00000000, CHIP_FAMILY_RV410, "ATI Radeon HD Desktop ",kNull},
{ 0x5E4F, 0x00000000, CHIP_FAMILY_RV410, "ATI Radeon HD Desktop ",kNull},
{ 0x9442,0x05021002, CHIP_FAMILY_RV770,"MSI R4850-T2D512", kMotmot},
{ 0x9442,0x080110B0, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x9442,0x24701682, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x9442,0x24711682, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x9442,0xE104174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x9442,0xE810174B, CHIP_FAMILY_RV770,"Sapphire HD 4850", kMotmot},
// R520
{ 0x7100, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x7101, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Mobile ",kNull},
{ 0x7102, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Mobile ",kNull},
{ 0x7103, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Mobile ",kNull},
{ 0x7104, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x7105, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x7106, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Mobile ",kNull},
{ 0x7108, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x7109, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x710A, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x710B, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x710C, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x710E, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x710F, 0x00000000, CHIP_FAMILY_R520, "ATI Radeon HD Desktop ",kNull},
{ 0x944A,0x02A21028, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x30001043, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x30001458, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x30001462, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x30001545, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x30001682, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x3000174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x30001787, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
{ 0x944A,0x300017AF, CHIP_FAMILY_RV770,"ATI Radeon HD 4850", kMotmot},
// RV515
{ 0x7140, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7141, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7142, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7143, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7144, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x7145, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x7146, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7147, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7149, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x714A, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x714B, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x714C, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x714D, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x714E, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x714F, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7151, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7152, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7153, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x715E, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x715F, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7180, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7181, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7183, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7186, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x7187, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7188, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD2300 Mobile ",kCaretta},
{ 0x718A, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x718B, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x718C, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x718D, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x718F, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7193, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x7196, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kCaretta},
{ 0x719B, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x719F, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kCaretta},
{ 0x944C,0x05021002, CHIP_FAMILY_RV770,"ATI Radeon HD 4830", kMotmot},
{ 0x944C,0x20031787, CHIP_FAMILY_RV770,"ATI Radeon HD 4830", kMotmot},
{ 0x944C,0x24801682, CHIP_FAMILY_RV770,"ATI Radeon HD 4830", kMotmot},
{ 0x944C,0x24811682, CHIP_FAMILY_RV770,"ATI Radeon HD 4830", kMotmot},
// RV530
{ 0x71C0, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71C1, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71C2, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71C3, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71C4, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Mobile ",kWormy},
{ 0x71C5, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD1600 Mobile ",kWormy},
{ 0x71C6, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71C7, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71CD, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71CE, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71D2, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71D4, 0x00000000, CHIP_FAMILY_RV530, "ATI Mobility FireGL V5250",kWormy},
{ 0x71D5, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Mobile ",kWormy},
{ 0x71D6, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Mobile ",kWormy},
{ 0x71DA, 0x00000000, CHIP_FAMILY_RV530, "ATI Radeon HD Desktop ",kWormy},
{ 0x71DE, 0x00000000, CHIP_FAMILY_RV530, "ASUS M66 ATI Radeon Mobile ",kWormy},
{ 0x944E,0x30001787, CHIP_FAMILY_RV770,"ATI Radeon HD 4730", kMotmot},
{ 0x944E,0x30101787, CHIP_FAMILY_RV770,"ATI Radeon HD 4810", kMotmot},
{ 0x944E,0x31001787, CHIP_FAMILY_RV770,"ATI Radeon HD 4820", kMotmot},
{ 0x944E,0x3260174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4810", kMotmot},
{ 0x944E,0x3261174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4810", kMotmot},
// RV515
{ 0x7200, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Desktop ",kWormy},
{ 0x7210, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kWormy},
{ 0x7211, 0x00000000, CHIP_FAMILY_RV515, "ATI Radeon HD Mobile ",kWormy},
{ 0x9460,0x27021682, CHIP_FAMILY_RV770,"ATI Radeon HD 4890", kMotmot},
{ 0x9460,0xE115174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4890", kMotmot},
{ 0x9460,0xE118174B, CHIP_FAMILY_RV770,"ATI Radeon HD 4890", kMotmot},
// R580
{ 0x7240, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7243, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7244, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7245, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7246, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7247, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7248, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7249, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x724A, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x724B, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x724C, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x724D, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x724E, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x724F, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Desktop ",kAlopias},
{ 0x9480,0x01211025, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kGliff},
{ 0x9480,0x03111025, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0x03121025, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0x031C1025, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0x031D1025, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0x036C1025, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0x036D1025, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0x3628103C, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kGliff},
{ 0x9480,0x9035104D, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kGliff},
{ 0x9480,0xFD001179, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kPeregrine},
{ 0x9480,0xFDD01179, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kPeregrine},
{ 0x9480,0xFD121179, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kPeregrine},
{ 0x9480,0xFD501179, CHIP_FAMILY_RV730,"ATI Radeon HD 4650M", kPeregrine},
{ 0x9480,0xFF001179, CHIP_FAMILY_RV730,"ATI Radeon HD 4600M", kPeregrine},
{ 0x9480,0xFF151179, CHIP_FAMILY_RV730,"ATI Radeon HD 4600M", kPeregrine},
{ 0x9480,0xFF221179, CHIP_FAMILY_RV730,"ATI Radeon HD 4600M", kPeregrine},
{ 0x9480,0xFF501179, CHIP_FAMILY_RV730,"ATI Radeon HD 4600M", kPeregrine},
{ 0x9480,0xFF801179, CHIP_FAMILY_RV730,"ATI Radeon HD 4600M", kPeregrine},
{ 0x9480,0xFF821179, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
{ 0x9480,0xFFA01179, CHIP_FAMILY_RV730,"ATI Radeon HD 4600M", kPeregrine},
{ 0x9480,0xFFA21179, CHIP_FAMILY_RV730,"ATI Radeon HD 5165M", kPeregrine},
// RV570
{ 0x7280, 0x00000000, CHIP_FAMILY_RV570, "ATI Radeon X1950 Pro ",kAlopias},
{ 0x9490,0x20031787, CHIP_FAMILY_RV730,"ATI Radeon HD 4670", kFlicker},
{ 0x9490,0x25421028, CHIP_FAMILY_RV730,"ATI Radeon HD 4670", kFlicker},
{ 0x9490,0x30501787, CHIP_FAMILY_RV730,"ATI Radeon HD 4710", kPeregrine},
{ 0x9490,0x300017AF, CHIP_FAMILY_RV730,"ATI Radeon HD 4710", kPeregrine},
{ 0x9490,0x4710174B, CHIP_FAMILY_RV730,"ATI Radeon HD 4710", kPeregrine},
// RV560
{ 0x7281, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7283, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x9498,0x10001043, CHIP_FAMILY_RV730,"ASUS EAHG4670", kPeregrine},
{ 0x9498,0x20091787, CHIP_FAMILY_RV730,"ATI Radeon HD 4650", kPeregrine},
{ 0x9498,0x21CF1458, CHIP_FAMILY_RV730,"ATI Radeon HD 4600", kPeregrine},
{ 0x9498,0x24511682, CHIP_FAMILY_RV730,"ATI Radeon HD 4650", kPeregrine},
{ 0x9498,0x24521682, CHIP_FAMILY_RV730,"ATI Radeon HD 4650", kPeregrine},
{ 0x9498,0x24541682, CHIP_FAMILY_RV730,"ATI Radeon HD 4650", kPeregrine},
{ 0x9498,0x29331682, CHIP_FAMILY_RV730,"ATI Radeon HD 4670", kPeregrine},
{ 0x9498,0x29341682, CHIP_FAMILY_RV730,"ATI Radeon HD 4670", kPeregrine},
{ 0x9498,0x30501787, CHIP_FAMILY_RV730,"ATI Radeon HD 4700", kPeregrine},
{ 0x9498,0x31001787, CHIP_FAMILY_RV730,"ATI Radeon HD 4720", kPeregrine},
// R580
{ 0x7284, 0x00000000, CHIP_FAMILY_R580, "ATI Radeon HD Mobile ",kAlopias},
{ 0x94B3,0x0D001002, CHIP_FAMILY_RV740,"ATI Radeon HD 4770", kFlicker},
{ 0x94B3,0x1170174B, CHIP_FAMILY_RV740,"ATI Radeon HD 4770", kFlicker},
{ 0x94B3,0x29001682, CHIP_FAMILY_RV740,"ATI Radeon HD 4770", kFlicker},
// RV560
{ 0x7287, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x94C1,0x0D021002, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 XT", kNull},
{ 0x94C1,0x10021002, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 Pro", kNull},
{ 0x94C1,0x0D021028, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 XT", kNull},
{ 0x94C1,0x21741458, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 XT", kNull},
{ 0x94C1,0x10331462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 XT", kNull},
{ 0x94C1,0x10401462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 XT", kNull},
{ 0x94C1,0x11101462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 XT", kNull},
// RV570
{ 0x7288, 0x00000000, CHIP_FAMILY_RV570, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7289, 0x00000000, CHIP_FAMILY_RV570, "ATI Radeon HD Desktop ",kAlopias},
{ 0x728B, 0x00000000, CHIP_FAMILY_RV570, "ATI Radeon HD Desktop ",kAlopias},
{ 0x728C, 0x00000000, CHIP_FAMILY_RV570, "ATI Radeon HD Desktop ",kAlopias},
{ 0x94C3,0x03421002, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x01011A93, CHIP_FAMILY_RV610,"Qimonda Radeon HD 2400 PRO",kNull},
{ 0x94C3,0x03021028, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x03421002, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x04021028, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x10321462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x10411462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400", kNull},
{ 0x94C3,0x11041462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400", kNull},
{ 0x94C3,0x11051462, CHIP_FAMILY_RV610,"ATI Radeon HD 2400", kNull},
{ 0x94C3,0x203817AF, CHIP_FAMILY_RV610,"ATI Radeon HD 2400", kNull},
{ 0x94C3,0x216A1458, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x21721458, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x2247148C, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 LE", kNull},
{ 0x94C3,0x22471787, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 LE", kNull},
{ 0x94C3,0x30001025, CHIP_FAMILY_RV610,"ATI Radeon HD 2350", kNull},
{ 0x94C3,0x30001458, CHIP_FAMILY_RV610,"ATI Radeon HD 3410", kNull},
{ 0x94C3,0x30001462, CHIP_FAMILY_RV610,"ATI Radeon HD 3410", kNull},
{ 0x94C3,0x3000148C, CHIP_FAMILY_RV610,"ATI Radeon HD 2350", kNull},
{ 0x94C3,0x30001642, CHIP_FAMILY_RV610,"ATI Radeon HD 3410", kNull},
{ 0x94C3,0x3000174B, CHIP_FAMILY_RV610,"ATI Radeon HD 2350", kNull},
{ 0x94C3,0x30001787, CHIP_FAMILY_RV610,"ATI Radeon HD 2350", kNull},
{ 0x94C3,0x37161642, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0x94C31002, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0xE370174B, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
{ 0x94C3,0xE400174B, CHIP_FAMILY_RV610,"ATI Radeon HD 2400 PRO", kNull},
// RV560
{ 0x7290, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7291, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7293, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x7297, 0x00000000, CHIP_FAMILY_RV560, "ATI Radeon HD Desktop ",kAlopias},
{ 0x9501,0x25421002, CHIP_FAMILY_RV670,"ATI Radeon HD 3870", kNull},
{ 0x9501,0x30001002, CHIP_FAMILY_RV670,"ATI Radeon HD 3690", kNull},
{ 0x9501,0x3000174B, CHIP_FAMILY_RV670,"Sapphire Radeon HD 3690", kNull},
{ 0x9501,0x30001787, CHIP_FAMILY_RV670,"ATI Radeon HD 3690", kNull},
{ 0x9501,0x4750174B, CHIP_FAMILY_RV670,"ATI Radeon HD 4750", kNull},
{ 0x9505,0x024A1043, CHIP_FAMILY_RV670,"ASUS MA 3850", kNull},
{ 0x9505,0x25421002, CHIP_FAMILY_RV670,"ATI Radeon HD 3850", kNull},
{ 0x9505,0x30001002, CHIP_FAMILY_RV630,"ATI Radeon HD 3690", kNull},
{ 0x9505,0x3000148C, CHIP_FAMILY_RV670,"ATI Radeon HD 3850", kNull},
{ 0x9505,0x3000174B, CHIP_FAMILY_RV670,"Sapphire Radeon HD 3690", kNull},
{ 0x9505,0x30001787, CHIP_FAMILY_RV630,"ATI Radeon HD 3690", kNull},
{ 0x9505,0x30011043, CHIP_FAMILY_RV670,"ATI Radeon HD 4730", kNull},
{ 0x9505,0x3001148C, CHIP_FAMILY_RV670,"ATI Radeon HD 4730", kNull},
{ 0x9505,0x3001174B, CHIP_FAMILY_RV670,"ATI Radeon HD 4750", kNull},
{ 0x9505,0x3002148C, CHIP_FAMILY_RV670,"ATI Radeon HD 4730", kNull},
{ 0x9505,0x3003148C, CHIP_FAMILY_RV670,"ATI Radeon HD 4750", kNull},
{ 0x9505,0x3004148C, CHIP_FAMILY_RV670,"ATI Radeon HD 4750", kNull},
{ 0x9505,0x3010174B, CHIP_FAMILY_RV670,"ATI Radeon HD 4750", kNull},
{ 0x9505,0x301017AF, CHIP_FAMILY_RV670,"ATI Radeon HD 4750", kNull},
{ 0x9505,0x4730174B, CHIP_FAMILY_RV670,"ATI Radeon HD 4730", kNull},
{ 0x9505,0xE630174B, CHIP_FAMILY_RV670,"ATI Radeon HD 3800 Series", kNull},
{ 0x9540,0x30501787, CHIP_FAMILY_RV710,"ATI Radeon HD 4590", kPeregrine},
{ 0x9540,0x4590174B, CHIP_FAMILY_RV710,"ATI Radeon HD 4590", kPeregrine},
{ 0x954F,0x16131462, CHIP_FAMILY_RV710,"ATI Radeon HD 4550", kPeregrine},
{ 0x954F,0x20081787, CHIP_FAMILY_RV710,"ATI Radeon HD 4350", kPeregrine},
{ 0x954F,0x29201682, CHIP_FAMILY_RV710,"ATI Radeon HD 4550", kPeregrine},
{ 0x954F,0x29211682, CHIP_FAMILY_RV710,"ATI Radeon HD 4550", kPeregrine},
{ 0x954F,0x3000174B, CHIP_FAMILY_RV710,"ATI Radeon HD 4520", kPeregrine},
{ 0x954F,0x301017AF, CHIP_FAMILY_RV710,"ATI Radeon HD 4450", kPeregrine},
{ 0x954F,0x30501787, CHIP_FAMILY_RV710,"ATI Radeon HD 4450", kPeregrine},
{ 0x954F,0x30901682, CHIP_FAMILY_RV710,"XFX Radeon HD 4570", kPeregrine},
{ 0x954F,0x31001787, CHIP_FAMILY_RV710,"ATI Radeon HD 4520", kPeregrine},
{ 0x954F,0x4450174B, CHIP_FAMILY_RV710,"ATI Radeon HD 4450", kPeregrine},
{ 0x954F,0x4570174B, CHIP_FAMILY_RV710,"Sapphire Radeon HD 4570", kPeregrine},
{ 0x954F,0x66661043, CHIP_FAMILY_RV710,"ASUS EAH4550", kPeregrine},
{ 0x954F,0xE990174B, CHIP_FAMILY_RV710,"Sapphire Radeon HD 4350", kPeregrine},
{ 0x9552,0x04341028, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4330", kShrike},
{ 0x9552,0x21AC1458, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500", kPeregrine},
{ 0x9552,0x21ED1458, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500", kPeregrine},
{ 0x9552,0x308B103C, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4330", kShrike},
{ 0x9552,0x3000148C, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500", kPeregrine},
{ 0x9552,0x3000174B, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500", kPeregrine},
{ 0x9552,0x30001787, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500", kPeregrine},
{ 0x9552,0x300017AF, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500", kPeregrine},
{ 0x9552,0x44721545, CHIP_FAMILY_RV710,"VisionTek Radeon 4350", kPeregrine},
{ 0x9553,0x18751043, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4570",kShrike},
{ 0x9553,0x1B321043, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4570",kShrike},
{ 0x9553,0x215B17AA, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4530/4570",kShrike},
{ 0x9553,0x3092174B, CHIP_FAMILY_RV710,"ATI Radeon HD 4300/4500 Series",kPeregrine},
{ 0x9553,0x39291642, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4570",kPeregrine},
{ 0x9553,0xFD001179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFD121179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFD501179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFD921179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFDD01179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFF001179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFF151179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFF161179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFF221179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFF401179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFF501179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFF801179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFF821179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFFA01179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 5145",kPeregrine},
{ 0x9553,0xFFA21179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9553,0xFFC01179, CHIP_FAMILY_RV710,"ATI Mobility Radeon HD 4500",kPeregrine},
{ 0x9555,0x29241682, CHIP_FAMILY_RV710,"ATI Radeon HD 4550", kNull},
{ 0x9555,0x24651682, CHIP_FAMILY_RV710,"ATI Radeon HD4300/HD4500", kNull},
{ 0x9555,0x3711174B, CHIP_FAMILY_RV710,"ATI Radeon HD4300/HD4500", kNull},
{ 0x9581,0x011F1025, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0x0562107B, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0x15621043, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0x3000148C, CHIP_FAMILY_RV630,"ATI Radeon HD 3600", kNull},
{ 0x9581,0x30C5103C, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0x3C2D17AA, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0x63F61462, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0x95811002, CHIP_FAMILY_RV630,"ATI Radeon HD 3600", kNull},
{ 0x9581,0xFF001179, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9581,0xFF011179, CHIP_FAMILY_RV630,"ATI Radeon HD 2600", kNull},
{ 0x9583,0x0083106B, CHIP_FAMILY_RV630,"ATI Mobility Radeon HD 2600 XT",kNull},
{ 0x9583,0x11071734, CHIP_FAMILY_RV630,"ATI Mobility Radeon HD 2600 XT",kNull},
{ 0x9583,0x3000148C, CHIP_FAMILY_RV630,"ATI Radeon HD 3600", kNull},
{ 0x9583,0x30D4103C, CHIP_FAMILY_RV630,"ATI Mobility Radeon HD 2600 XT",kNull},
{ 0x9588,0x01021A93, CHIP_FAMILY_RV630,"Qimonda Radeon HD 2600 XT",kNull},
{ 0x9589,0x01001A93, CHIP_FAMILY_RV630,"Qimonda Radeon HD 2600 PRO",kNull},
{ 0x9589,0x0E41174B, CHIP_FAMILY_RV630,"ATI Radeon HD 3600", kNull},
{ 0x9589,0x30001462, CHIP_FAMILY_RV630,"ATI Radeon HD 3610", kNull},
{ 0x9589,0x30001642, CHIP_FAMILY_RV630,"ATI Radeon HD 3610", kNull},
{ 0x9589,0x30001787, CHIP_FAMILY_RV630,"ATI Radeon HD 3600", kNull},
{ 0x9591,0x15453992, CHIP_FAMILY_RV635,"ATI Radeon HD 3600", kNull},
{ 0x9591,0x2303148C, CHIP_FAMILY_RV635,"VisionTek Radeon HD 2600/3600 Series", kNull},
{ 0x9598,0xB3831002, CHIP_FAMILY_RV635,"ATI All-in-Wonder HD", kNull},
{ 0x9598,0x30001043, CHIP_FAMILY_RV635,"ATI Radeon HD 3730", kNull},
{ 0x9598,0x3000148C, CHIP_FAMILY_RV635,"ATI Radeon HD 3730", kNull},
{ 0x9598,0x30001545, CHIP_FAMILY_RV635,"VisionTek Radeon HD 2600 XT",kNull},
{ 0x9598,0x3000174B, CHIP_FAMILY_RV635,"Sapphire Radeon HD 3730", kNull},
{ 0x9598,0x30011043, CHIP_FAMILY_RV635,"ATI Radeon HD 4570", kNull},
{ 0x9598,0x3001148C, CHIP_FAMILY_RV635,"ATI Radeon HD 4580", kNull},
{ 0x9598,0x3031148C, CHIP_FAMILY_RV635,"ATI Radeon HD 4570", kNull},
{ 0x9598,0x30011545, CHIP_FAMILY_RV635,"VisionTek Radeon HD 2600 Pro",kNull},
{ 0x9598,0x3001174B, CHIP_FAMILY_RV635,"Sapphire Radeon HD 3750", kNull},
{ 0x9598,0x300117AF, CHIP_FAMILY_RV635,"ATI Radeon HD 3750", kNull},
{ 0x9598,0x301017AF, CHIP_FAMILY_RV635,"ATI Radeon HD 4570", kNull},
{ 0x9598,0x301117AF, CHIP_FAMILY_RV635,"ATI Radeon HD 4580", kNull},
{ 0x9598,0x30501787, CHIP_FAMILY_RV635,"ATI Radeon HD 4610", kNull},
{ 0x9598,0x4570174B, CHIP_FAMILY_RV635,"ATI Radeon HD 4570", kNull},
{ 0x9598,0x4580174B, CHIP_FAMILY_RV635,"ATI Radeon HD 4580", kNull},
{ 0x9598,0x4610174B, CHIP_FAMILY_RV635,"ATI Radeon HD 4610", kNull},
{ 0x95C0,0x3000148C, CHIP_FAMILY_RV620,"ATI Radeon HD 3550", kNull},
{ 0x95C0,0x3000174B, CHIP_FAMILY_RV620,"Sapphire Radeon HD 3550", kNull},
{ 0x95C0,0x3002174B, CHIP_FAMILY_RV620,"ATI Radeon HD 3570", kNull},
{ 0x95C0,0x3020174B, CHIP_FAMILY_RV620,"ATI Radeon HD 4250", kNull},
{ 0x95C0,0xE3901745, CHIP_FAMILY_RV620,"ATI Radeon HD 3550", kNull},
{ 0x95C5,0x01041A93, CHIP_FAMILY_RV620,"Qimonda Radeon HD 3450", kNull},
{ 0x95C5,0x01051A93, CHIP_FAMILY_RV620,"Qimonda Radeon HD 3450", kNull},
{ 0x95C5,0x3000148C, CHIP_FAMILY_RV620,"ATI Radeon HD 3450", kNull},
{ 0x95C5,0x3001148C, CHIP_FAMILY_RV620,"ATI Radeon HD 3550", kNull},
{ 0x95C5,0x3002148C, CHIP_FAMILY_RV620,"ATI Radeon HD 4230", kNull},
{ 0x95C5,0x3003148C, CHIP_FAMILY_RV620,"ATI Radeon HD 4250", kNull},
{ 0x95C5,0x3010174B, CHIP_FAMILY_RV620,"ATI Radeon HD 4250", kNull},
{ 0x95C5,0x301017AF, CHIP_FAMILY_RV620,"ATI Radeon HD 4230", kNull},
{ 0x95C5,0x3032148C, CHIP_FAMILY_RV620,"ATI Radeon HD 4250", kNull},
{ 0x95C5,0x3033148C, CHIP_FAMILY_RV620,"ATI Radeon HD 4230", kNull},
{ 0x95C5,0x30501787, CHIP_FAMILY_RV620,"ATI Radeon HD 4250", kNull},
{ 0x95C5,0x4250174B, CHIP_FAMILY_RV620,"ATI Radeon HD 4250", kNull},
/* Evergreen */
{ 0x6898,0x00D0106B, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5870", kLangur},
{ 0x6898,0x032E1043, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5870", kUakari},
{ 0x6898,0x038C1043, CHIP_FAMILY_CYPRESS,"ASUS 5870 Eyefinity 6", kNull},
{ 0x6898,0x0B001002, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5870", kZonalis},
{ 0x6898,0x21E51458, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5870", kUakari},
{ 0x6898,0x29611682, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5870", kUakari},
{ 0x6898,0xE140174B, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5870", kUakari},
{ 0x6899,0x200A1787, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5850", kUakari},
{ 0x6899,0x21E41458, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5850", kUakari},
{ 0x6899,0x22901787, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5850", kUakari},
{ 0x6899,0xE140174B, CHIP_FAMILY_CYPRESS,"ATI Radeon HD 5850", kUakari},
{ 0x6899,0xE174174B, CHIP_FAMILY_CYPRESS,"ATI Sapphire Radeon HD 5850", kUakari},
{ 0x689C,0x034A1043, CHIP_FAMILY_HEMLOCK,"ATI Radeon HD 5970", kUakari},
{ 0x689C,0x03521043, CHIP_FAMILY_HEMLOCK,"ASUS ARES", kUakari},
{ 0x689C,0x039E1043, CHIP_FAMILY_HEMLOCK,"ASUS EAH5870", kUakari},
{ 0x689C,0x25421002, CHIP_FAMILY_HEMLOCK,"ATI Radeon HD 5970", kUakari},
{ 0x689C,0x30201682, CHIP_FAMILY_HEMLOCK,"ATI Radeon HD 5970", kUakari},
{ 0x68A0,0x03081025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5830",kNomascus},
{ 0x68A0,0x030A1025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5830",kNomascus},
{ 0x68A0,0x043A1028, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5870",kNomascus},
{ 0x68A1,0x03081025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x030A1025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x03671025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x03681025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x038B1025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x038C1025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x042E1025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x042F1025, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x144D103C, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kNomascus},
{ 0x68A1,0x1522103C, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x22411462, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A1,0x39961462, CHIP_FAMILY_JUNIPER,"ATI Mobility Radeon HD 5850",kHoolock},
{ 0x68A8,0x04421025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x04511025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x048F1028, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6870M", kHoolock},
{ 0x68A8,0x04901028, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6870M", kHoolock},
{ 0x68A8,0x04B91028, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6870M", kHoolock},
{ 0x68A8,0x04BA1028, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6870M", kHoolock},
{ 0x68A8,0x050A1025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x050B1025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x050C1025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x050E1025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x050F1025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x05131025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x05141025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x05151025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x05161025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x05251025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x05261025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x056D1025, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0x159B103C, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68A8,0xC0AD144D, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6850M", kUakari},
{ 0x68B8,0x00CF106B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kHoolock},
{ 0x68B8,0x0044144D, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6770", kVervet},
{ 0x68B8,0x1482174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x200A1787, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x200B1787, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x21D71458, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x21F61458, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x22881787, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x25431002, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x25431458, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x29901682, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x29911682, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x30001002, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6700", kVervet},
{ 0x68B8,0x6880103C, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0x6881103C, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6770", kVervet},
{ 0x68B8,0xE144174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kHoolock},
{ 0x68B8,0xE147174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0xE160174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5770", kVervet},
{ 0x68B8,0xEA60174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6770", kVervet},
{ 0x68BA,0x03FE1043, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x1482174B, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x174B1482, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x200A1787, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x21421462, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x25431458, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x31501682, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x31521682, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0x31531682, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BA,0xE144174B, CHIP_FAMILY_JUNIPER,"AMD Radeon HD 6770", kVervet},
{ 0x68BE,0x200A1787, CHIP_FAMILY_JUNIPER,"HIS ATI 5750", kVervet},
{ 0x68BE,0x22881787, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 5750", kVervet},
{ 0x68BE,0x3000148C, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kNull},
{ 0x68BE,0x3000174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kNull},
{ 0x68BE,0x300017AF, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kNull},
{ 0x68BE,0x39821642, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kNull},
{ 0x68BF,0x220E1458, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kVervet},
{ 0x68BF,0x3000148C, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kVervet},
{ 0x68BF,0x31401682, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kVervet},
{ 0x68BF,0x6750174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kVervet},
{ 0x68BF,0xE144174B, CHIP_FAMILY_JUNIPER,"ATI Radeon HD 6750", kHoolock},
{ 0x68C0,0x1594103C, CHIP_FAMILY_REDWOOD,"AMD Radeon HD 6570M", kNull},
{ 0x68C0,0x392717AA, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5730",kNull},
{ 0x68C0,0x395217AA, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5730",kNull},
{ 0x68C0,0x84721043, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5000",kNull},
{ 0x68C1,0x02051025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x02961025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x030A1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x033D1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x033E1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kNull},
{ 0x68C1,0x03471025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x03561025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x03581025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x035A1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x035C1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x03641025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x036D1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kNull},
{ 0x68C1,0x03791025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x037E1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x03821025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5750",kNull},
{ 0x68C1,0x04121025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kNull},
{ 0x68C1,0x042E1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kNull},
{ 0x68C1,0x042F1025, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kNull},
{ 0x68C1,0x9071104D, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kEulemur},
{ 0x68C1,0x1449103C, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kEulemur},
{ 0x68C1,0xFD001179, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kEulemur},
{ 0x68C1,0xFD121179, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kEulemur},
{ 0x68C1,0xFD501179, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kEulemur},
{ 0x68C1,0xFDD01179, CHIP_FAMILY_REDWOOD,"ATI Mobility Radeon HD 5650",kEulemur},
{ 0x68C8,0x2306103C, CHIP_FAMILY_REDWOOD,"ATI FirePro V4800 (FireGL)",kNull},
{ 0x68C8,0x240A1002, CHIP_FAMILY_REDWOOD,"ATI FirePro V4800 (FireGL)",kNull},
{ 0x68C8,0x240A1028, CHIP_FAMILY_REDWOOD,"ATI FirePro V4800 (FireGL)",kNull},
{ 0x68D8,0x03561043, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kBaboon},
{ 0x68D8,0x03C01043, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kNull},
{ 0x68D8,0x20091787, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kNull},
{ 0x68D8,0x200B1787, CHIP_FAMILY_REDWOOD,"HIS ATI HD5670 XT Redwood ICEQ", kBaboon}, // catalinz
{ 0x68D8,0x21D91458, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kBaboon},
{ 0x68D8,0x21F41458, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kNull},
{ 0x68D8,0x22051462, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x22941787, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x30001787, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5730", kNull},
{ 0x68D8,0x301017AF, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5730", kNull},
{ 0x68D8,0x301117AF, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x30601682, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x30651682, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x56701545, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x5690174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5690", kNull},
{ 0x68D8,0x5730174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5730", kNull},
{ 0x68D8,0x68E01028, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kBaboon},
{ 0x68D8,0xE151174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kEulemur},
{ 0x68D8,0xE155174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kNull},
{ 0x68D8,0xE166174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5670", kUakari},
{ 0x68D9,0x03CE1043, CHIP_FAMILY_REDWOOD,"ASUS EAH5550 series", kNull},
{ 0x68D9,0x22401462, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5570", kNull},
{ 0x68D9,0x3000148C, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 6510", kNull},
{ 0x68D9,0x3000174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 6510", kNull},
{ 0x68D9,0x301017AF, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5630", kNull},
{ 0x68D9,0x39691642, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5570", kNull},
{ 0x68DA,0x3000148C, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 6390", kNull},
{ 0x68DA,0x3000174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 6390", kNull},
{ 0x68DA,0x30001787, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5630", kNull},
{ 0x68DA,0x300017AF, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 6390", kNull},
{ 0x68DA,0x301017AF, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5630", kNull},
{ 0x68DA,0x5630174B, CHIP_FAMILY_REDWOOD,"ATI Radeon HD 5630", kNull},
{ 0x68E0,0x02931025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x03581025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x03591025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x035C1025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x035D1025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x036D1025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kLangur },
{ 0x68E0,0x04471028, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x04561028, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x04831025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x1433103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x1441103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x144A103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0x1BF21043, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kNull },
{ 0x68E0,0x848F1043, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kNull },
{ 0x68E0,0xFD001179, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0xFD121179, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0xFD501179, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0xFD921179, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E0,0xFDD01179, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E1,0x04661028, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x10021B61, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450M", kEulemur},
{ 0x68E1,0x10501462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x1426103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x142A103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 545vM", kEulemur},
{ 0x68E1,0x14E110CF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5400M", kEulemur},
{ 0x68E1,0x21D81458, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x21E21458, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x21F11458, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x22021458, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x23421462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x23431462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x25481458, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5400M Series", kEulemur},
{ 0x68E1,0x254A1458, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5000M Series", kEulemur},
{ 0x68E1,0x30001043, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x3000148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x30001682, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x3000174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68E1,0x30001787, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur}, // 5430M ???
{ 0x68E1,0x300017AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x3001148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x301417AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kEulemur},
{ 0x68E1,0x3002148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x3003148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450M", kEulemur},
{ 0x68E1,0x54501545, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x5470174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470M", kEulemur},
{ 0x68E1,0x60001092, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x60001682, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x6000174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E1,0x6230174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kEulemur},
{ 0x68E1,0x6350174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kEulemur},
{ 0x68E1,0xFDD01179, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5430M", kEulemur},
{ 0x68E4,0x04821025, CHIP_FAMILY_CEDAR,"AMD Radeon HD 6370M", kNull},
{ 0x68E4,0x1426103C, CHIP_FAMILY_CEDAR,"AMD Radeon HD 6370M", kNull},
{ 0x68E4,0x1C921043, CHIP_FAMILY_CEDAR,"AMD Radeon HD 6370M", kNull},
{ 0x68E4,0x397917AA, CHIP_FAMILY_CEDAR,"AMD Radeon HD 6370M", kNull},
{ 0x68E4,0x397F17AA, CHIP_FAMILY_CEDAR,"AMD Radeon HD 7370M", kNull},
{ 0x68E4,0x84A01043, CHIP_FAMILY_CEDAR,"AMD Radeon HD 6370M", kNull},
{ 0x68F9,0x00011019, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x00021019, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x00191019, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x010E1002, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x010E1028, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x03741043, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x03CA1043, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x05181025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x05191025, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x174B3000, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6230", kNull},
{ 0x68F9,0x174B6250, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6250", kNull},
{ 0x68F9,0x174B6290, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6290", kNull},
{ 0x68F9,0x174BE164, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x20091787, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x21261028, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x2126103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x21301462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x21311462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x21331462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kEulemur},
{ 0x68F9,0x21801462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x21811462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x21821462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x21831462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x22911787, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x22301462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x22311462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x23401462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x24951462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x2AAC103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x2AEC103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x30001787, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470", kNull},
{ 0x68F9,0x300017AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6250", kNull},
{ 0x68F9,0x3001148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6250", kNull},
{ 0x68F9,0x30011787, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5530", kNull},
{ 0x68F9,0x3002148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6290", kNull},
{ 0x68F9,0x30021787, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5490", kNull},
{ 0x68F9,0x300217AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6290", kNull},
{ 0x68F9,0x3003148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6230", kNull},
{ 0x68F9,0x301117AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470", kNull},
{ 0x68F9,0x301217AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5490", kNull},
{ 0x68F9,0x301317AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470", kNull},
{ 0x68F9,0x301417AF, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x30321682, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450",kEulemur},
{ 0x68F9,0x303A1682, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450",kEulemur},
{ 0x68F9,0x3580103C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x360217AA, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x360317AA, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x360F17AA, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x361917AA, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x39831642, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x39841642, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x39871642, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x3987174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x39971462, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0x3A051642, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kNull},
{ 0x68F9,0x3B311642, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350A", kNull},
{ 0x68F9,0x5470174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5470", kNull},
{ 0x68F9,0x5490174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5490", kNull},
{ 0x68F9,0x5530174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5530", kNull},
{ 0x68F9,0x6230174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6230", kNull},
{ 0x68F9,0x6350174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 6350", kNull},
{ 0x68F9,0x7350148C, CHIP_FAMILY_CEDAR,"ATI Radeon HD 7350", kNull},
{ 0x68F9,0xE127174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0xE145174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0xE153174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
{ 0x68F9,0xE164174B, CHIP_FAMILY_CEDAR,"ATI Radeon HD 5450", kEulemur},
/* Northen Islands */
{ 0x6718,0x03B81043, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x03BC1043, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x0B001002, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x20101458, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x20101787, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x22001458, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x22011458, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x23061787, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba}, // HIS
{ 0x6718,0x23701462, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba}, // MSI
{ 0x6718,0x24701462, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba}, // MSI
{ 0x6718,0x31301682, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0x67181002, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0xE182174B, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6718,0xE203174B, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6970", kGibba},
{ 0x6719,0x03BE1043, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x03D41043, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x0B001002, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x186B174B, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x20101787, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x21FD1458, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x23071787, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x24611462, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x31211682, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0x31221682, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
{ 0x6719,0xE189174B, CHIP_FAMILY_CAYMAN,"AMD Radeon HD 6950", kGibba},
//{ 0x671D,0x0B2A1002, CHIP_FAMILY_ANTILLES,"AMD Radeon HD 6990", kNull},
//{ 0x671D,0x1B2A1002, CHIP_FAMILY_ANTILLES,"AMD Radeon HD 6990", kNull},
//{ 0x671D,0x31601682, CHIP_FAMILY_ANTILLES,"AMD Radeon HD 6990", kNull},
{ 0x6720,0x048F1028, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x04901028, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x04A41028, CHIP_FAMILY_BARTS,"AMD FirePro M8900M", kElodea},
{ 0x6720,0x04B91028, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x04BA1028, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x51021558, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x51041558, CHIP_FAMILY_BARTS,"AMD Radeon HD 6990M", kElodea},
{ 0x6720,0x71001558, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x72001558, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6720,0x72011558, CHIP_FAMILY_BARTS,"AMD Radeon HD 6990M", kElodea},
{ 0x6720,0xC0AD144D, CHIP_FAMILY_BARTS,"AMD Radeon HD 6970M", kElodea},
{ 0x6738,0x00D01002, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x03AE1043, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x03C61043, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x174B174B, CHIP_FAMILY_BARTS,"Sapphire Radeon HD6870", kBulrushes}, // ?? kDuckweed ??
{ 0x6738,0x20101787, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x21FA1002, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x21FA1458, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x23051787, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x25101462, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x31031682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x31041682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x31071682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0x31081682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed}, // ?? kJuncus ??
{ 0x6738,0x67381002, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6738,0xE178174B, CHIP_FAMILY_BARTS,"AMD Radeon HD 6870", kDuckweed},
{ 0x6739,0x03B41043, CHIP_FAMILY_BARTS,"ASUS EAH6850 DirectCU", kDuckweed},
{ 0x6739,0x174B174B, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x200F1787, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x21F81458, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kBulrushes},
{ 0x6739,0x23041787, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x24001462, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x24411462, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x25201462, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x30001787, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x31101682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x31131682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x31141682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x31161682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x31171682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0x67391002, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0xAA881002, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0xE174174B, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0xE177174B, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x6739,0xE183174B, CHIP_FAMILY_BARTS,"AMD Radeon HD 6850", kDuckweed},
{ 0x673E,0x174B174B, CHIP_FAMILY_BARTS,"AMD Radeon HD 6790", kNull},
{ 0x673E,0x23101787, CHIP_FAMILY_BARTS,"AMD Radeon HD 6790", kNull},
{ 0x673E,0x31701682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6790", kNull},
{ 0x673E,0x31721682, CHIP_FAMILY_BARTS,"AMD Radeon HD 6790", kNull},
{ 0x6740,0x04A31028, CHIP_FAMILY_TURKS,"Dell HD 6770M", kNull}, // ??
{ 0x6740,0x1D121043, CHIP_FAMILY_TURKS,"AMD Radeon HD 6730M", kNull},
{ 0x6740,0x1631103C, CHIP_FAMILY_TURKS,"AMD FirePro M5950", kNull},
{ 0x6740,0x1657103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6770M", kNull},
{ 0x6740,0x165A103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6770M", kNull},
{ 0x6740,0x3388103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6770M", kNull},
{ 0x6740,0x3389103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6770M", kNull}, // ?? kHydrilla ??
{ 0x6740,0x6740106B, CHIP_FAMILY_TURKS,"Apple HD 6770M", kNull}, // ??
{ 0x6741,0x050E1025, CHIP_FAMILY_TURKS,"AMD Radeon HD 6650M", kNull},
{ 0x6741,0x050F1025, CHIP_FAMILY_TURKS,"AMD Radeon HD 6650M", kNull},
{ 0x6741,0x05131025, CHIP_FAMILY_TURKS,"AMD Radeon HD 6650M", kNull},
{ 0x6741,0x1646103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6750M", kNull},
{ 0x6741,0x1688103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 7690M", kNull},
{ 0x6741,0x358D103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6630M/6650M/6750M", kNull},
{ 0x6741,0x9080104D, CHIP_FAMILY_TURKS,"AMD Radeon HD 6630M", kNull},
{ 0x6758,0x00121028, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x0B0E1002, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kPithecia},
{ 0x6758,0x0B0E1028, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x20121787, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kPithecia},
{ 0x6758,0x20141787, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x22051458, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x31811682, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x31831682, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x67581002, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0x6882103C, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0xE181174B, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0xE1941746, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kBulrushes},
{ 0x6758,0xE194174B, CHIP_FAMILY_TURKS,"AMD Radeon HD 6670", kMangabey},
{ 0x6759,0x20121787, CHIP_FAMILY_TURKS,"AMD Radeon HD 6570", kPithecia},
{ 0x6759,0x31951682, CHIP_FAMILY_TURKS,"AMD Radeon HD 6570", kGibba},
{ 0x6759,0x32801682, CHIP_FAMILY_TURKS,"AMD Radeon HD 7570", kPithecia},
{ 0x6759,0xE193174B, CHIP_FAMILY_TURKS,"AMD Radeon HD 6570", kPithecia},
{ 0x675F,0x23141787, CHIP_FAMILY_TURKS,"AMD Radeon HD 5570", kNull},
{ 0x675F,0x254B1458, CHIP_FAMILY_TURKS,"AMD Radeon HD 5570", kNull},
{ 0x675F,0x6510148C, CHIP_FAMILY_TURKS,"AMD Radeon HD 5570", kNull},
{ 0x675F,0x6510174B, CHIP_FAMILY_TURKS,"AMD Radeon HD 5570", kNull},
{ 0x6760,0x00031179, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450M", kIpomoea},
{ 0x6760,0x04C11028, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450M", kIpomoea},
{ 0x6760,0x04CA1028, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450M", kIpomoea},
{ 0x6760,0x04CC1028, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450M", kIpomoea},
{ 0x6760,0x101C1043, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450M", kIpomoea},
{ 0x6760,0x165A103C, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6470M", kIpomoea},
{ 0x6760,0x167D103C, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6470M", kIpomoea},
{ 0x6760,0x1CB21043, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6470M", kIpomoea},
{ 0x6760,0x20011043, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6470M", kIpomoea},
{ 0x6760,0x85171043, CHIP_FAMILY_CAICOS,"AMD Radeon HD 7470M", kNull},
{ 0x6778,0x00241019, CHIP_FAMILY_CAICOS,"AMD Radeon HD 7470", kBulrushes}, // Elitegroup
{ 0x6778,0x00271019, CHIP_FAMILY_CAICOS,"AMD Radeon HD 8470", kBulrushes}, // Elitegroup
{ 0x6778,0x21201028, CHIP_FAMILY_CAICOS,"AMD Radeon HD 7470", kBulrushes}, // Dell
{ 0x6778,0xB4911462, CHIP_FAMILY_CAICOS,"AMD Radeon HD 8470", kBulrushes}, // MSi
{ 0x6778,0xB4921462, CHIP_FAMILY_CAICOS,"AMD Radeon HD 8470", kBulrushes}, // MSi
{ 0x6778,0xB4931462, CHIP_FAMILY_CAICOS,"AMD Radeon HD 8470", kBulrushes}, // MSi
{ 0x6779,0x00001002, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x03DA1043, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x03DC1043, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x20121787, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x21201028, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x21251462, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x22031458, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x22041458, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x23111787, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x32001682, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x64501092, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0x909D1B0A, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0xE164174B, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kIpomoea},
{ 0x6779,0xE180174B, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kPithecia},
{ 0x6779,0xE190174B, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
{ 0x6779,0xE199174B, CHIP_FAMILY_CAICOS,"AMD Radeon HD 6450", kBulrushes},
/* Southen Islands */
{ 0x6798,0x04181043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji },
{ 0x6798,0x041C1043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji },
{ 0x6798,0x04201043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x04421043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x04441043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x04461043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x04481043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x044A1043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x044C1043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x044E1043, CHIP_FAMILY_TAHITI,"Asus HD7970 7970", kAji},
{ 0x6798,0x0B001002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x201C1787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji}, // 7990 ???
{ 0x6798,0x23171787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x254D1458, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x27701462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x30001002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x30001787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x32101682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x32111682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x32121682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji },
{ 0x6798,0x32131682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x6798,0x99991043, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7990", kAji}, // Asus
{ 0x6798,0xE208174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970", kAji},
{ 0x679A,0x04241043, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x04261043, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x0B001002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x0B011002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 8900", kAji},
{ 0x679A,0x201C1787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x23161787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x254C1458, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x27601462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x27711462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x30001002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x30001462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 8950", kAji},
{ 0x679A,0x3000174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x30001787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x32121682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x32201682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x32211682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x32221682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x6616103C, CHIP_FAMILY_TAHITI,"HP Radeon HD 7950", kAji},
{ 0x679A,0x30001002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0x7950174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0xE207174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x679A,0xE208174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7950", kAji},
{ 0x6800,0x03711558, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x05501028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x05511028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x05544028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x057B1028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x05861028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x05871028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6800,0x05881028, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7970M", kDashimaki},
{ 0x6818,0x042F1043, CHIP_FAMILY_TAHITI,"Asus HD 7870", kAji},
{ 0x6818,0x04311043, CHIP_FAMILY_TAHITI,"Asus HD 7870", kAji},
{ 0x6818,0x0B041002, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6818,0x0B051002, CHIP_FAMILY_TAHITI,"ATI Radeon HD 8800", kAji},
{ 0x6818,0x201C1787, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6818,0x23211787, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6818,0x25541458, CHIP_FAMILY_TAHITI,"Gigabyte HD 7870", kAji},
{ 0x6818,0x27401462, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6818,0x32501682, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kChutoro},
{ 0x6818,0x32511682, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6818,0x7870174B, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6818,0x8B04174B, CHIP_FAMILY_TAHITI,"ATI Radeon HD 8860", kAji},
{ 0x6818,0xE217174B, CHIP_FAMILY_TAHITI,"ATI Radeon HD 7870", kAji},
{ 0x6819,0x042C1043, CHIP_FAMILY_TAHITI,"Asus HD 7850", kAji}, // Asus
{ 0x6819,0x04311043, CHIP_FAMILY_TAHITI,"Asus HD 7850", kAji}, // Asus
{ 0x6819,0x04331043, CHIP_FAMILY_TAHITI,"Asus HD 7850", kAji}, // Asus
{ 0x6819,0x043A1043, CHIP_FAMILY_TAHITI,"Asus HD 7850", kAji}, // Asus
{ 0x6819,0x045B1043, CHIP_FAMILY_TAHITI,"Asus HD 7850", kAji}, // Asus
{ 0x6819,0x0B041002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // ATI
{ 0x6819,0x201C1787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // HIS
{ 0x6819,0x23201787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // HIS
{ 0x6819,0x25531458, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // Gigabyte
{ 0x6819,0x27301462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // MSI
{ 0x6819,0x27311462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // MSI
{ 0x6819,0x27321462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // MSI
{ 0x6819,0x32601682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // XFX
{ 0x6819,0x32621682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // XFX
{ 0x6819,0x32641682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // XFX
{ 0x6819,0xE218174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // Sapphire
{ 0x6819,0xE221174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7850", kAji}, // Sapphire
{ 0x682F,0x15271043, CHIP_FAMILY_TAHITI,"Asus Radeon HD 7700M", kAji},
{ 0x682F,0x1831103C, CHIP_FAMILY_TAHITI,"HP Radeon HD 7730M", kAji},
{ 0x682F,0x1832103C, CHIP_FAMILY_TAHITI,"HP Radeon HD 7730M", kAji},
{ 0x682F,0x1834103C, CHIP_FAMILY_TAHITI,"HP Radeon HD 7730M", kAji},
{ 0x682F,0x18A7103C, CHIP_FAMILY_TAHITI,"HP Radeon HD 7730M", kAji},
{ 0x682F,0xC0DA144D, CHIP_FAMILY_TAHITI,"Samsung Radeon HD 7730M", kAji},
{ 0x683D,0x00301002, CHIP_FAMILY_TAHITI,"Radeon HD 8760 OEM", kAji}, // VERDE?
{ 0x683D,0x00301019, CHIP_FAMILY_TAHITI,"Radeon HD 8760 OEM", kAji}, // VERDE?
{ 0x683D,0x04211043, CHIP_FAMILY_TAHITI,"Asus Radeon HD 7770", kAji},
{ 0x683D,0x23041002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7700", kAji},
{ 0x683D,0x25561458, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7770", kAji},
{ 0x683D,0x27101462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7770", kAji},
{ 0x683D,0x2B301002, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7770", kAji},
{ 0x683D,0x32331682, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7770", kAji},
{ 0x683D,0x6886103C, CHIP_FAMILY_TAHITI,"HP Radeon HD 7700", kAji},
{ 0x683D,0x6890103C, CHIP_FAMILY_TAHITI,"Radeon HD 8760 OEM", kAji}, // VERDE?
{ 0x683D,0xE214174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7770", kAji},
{ 0x683F,0x04231043, CHIP_FAMILY_TAHITI,"Asus HD 7750", kChutoro},
{ 0x683F,0x04271043, CHIP_FAMILY_TAHITI,"Asus HD 7750", kChutoro},
{ 0x683F,0x04591043, CHIP_FAMILY_TAHITI,"Asus HD 7750", kChutoro},
{ 0x683F,0x200B1787, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7750", kChutoro},
{ 0x683F,0x23181787, CHIP_FAMILY_TAHITI,"Vertex3D HD 7750", kChutoro},
{ 0x683F,0x25511458, CHIP_FAMILY_TAHITI,"Gigabyte HD 7750", kChutoro},
{ 0x683F,0x27921462, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7750", kChutoro},
{ 0x683F,0x2B301002, CHIP_FAMILY_TAHITI,"Ati HD 7750", kChutoro},
{ 0x683F,0x32411682, CHIP_FAMILY_TAHITI,"XFX HD 7750", kChutoro},
{ 0x683F,0x32421682, CHIP_FAMILY_TAHITI,"XFX HD 7750", kChutoro},
{ 0x683F,0x32451682, CHIP_FAMILY_TAHITI,"XFX HD 7750", kChutoro},
{ 0x683F,0xE2131019, CHIP_FAMILY_TAHITI,"Diamond HD 7750", kChutoro},
{ 0x683F,0xE213174B, CHIP_FAMILY_TAHITI,"AMD Radeon HD 7750", kChutoro},
{ 0x683F,0xE215174B, CHIP_FAMILY_TAHITI,"Sapphire HD 7750", kChutoro},
{ 0x6840,0x01241002, CHIP_FAMILY_LOMBOK,"AMD Radeon HD 7600M Series", kPondweed },
{ 0x6840,0x01341002, CHIP_FAMILY_LOMBOK,"AMD Radeon HD 7600M Series", kPondweed },
{ 0x6840,0x050E1025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x050F1025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x05131025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x05141025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x056D1025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x059A1025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x059B1025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x059E1025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x06001025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x06061025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x06961025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x06971025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x06981025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x06991025, CHIP_FAMILY_LOMBOK,"Acer HD 7670M", kPondweed },
{ 0x6840,0x100A1043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x104B1043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x10DC1043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x1813103C, CHIP_FAMILY_LOMBOK,"HP HD 7590M", kPondweed },
{ 0x6840,0x182F103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1830103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1835103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x183A103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x183C103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x183E103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1840103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1842103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1844103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1848103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x184A103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x184C103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1895103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x1897103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x18A5103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x18A7103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x18F4103C, CHIP_FAMILY_LOMBOK,"HP HD 7670M", kPondweed },
{ 0x6840,0x21211043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x21221043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x21231043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x21251043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x21271043, CHIP_FAMILY_LOMBOK,"Asus HD 7670M", kPondweed },
{ 0x6840,0x397017AA, CHIP_FAMILY_LOMBOK,"Lenovo HD 7670M", kPondweed },
{ 0x6840,0x397B17AA, CHIP_FAMILY_LOMBOK,"Lenovo HD 7670M", kPondweed },
{ 0x6840,0xC0C5144D, CHIP_FAMILY_LOMBOK,"Samsung HD 6000M series", kPondweed },
{ 0x6840,0xC0CE144D, CHIP_FAMILY_LOMBOK,"Samsung HD 7670M", kPondweed },
{ 0x6840,0xC0DA144D, CHIP_FAMILY_LOMBOK,"Samsung HD 7670M", kPondweed },
{ 0x6840,0xFB111179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB221179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB231179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB2C1179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB311179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB321179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB381179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB391179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB3A1179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB401179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB411179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB471179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB481179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB511179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB521179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB531179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB811179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB821179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFB831179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFC561179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFCD41179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
{ 0x6840,0xFCEE1179, CHIP_FAMILY_LOMBOK,"Toshiba HD 7670M", kPondweed },
/*old series*/
{ 0x5D48,0x00000000, CHIP_FAMILY_R420,"ATI Radeon HD Mobile ", kNull },
{ 0x5D49,0x00000000, CHIP_FAMILY_R420,"ATI Radeon HD Mobile ", kNull },
{ 0x5D4A,0x00000000, CHIP_FAMILY_R420,"ATI Radeon HD Mobile ", kNull },
{ 0x5D4C,0x00000000, CHIP_FAMILY_R420,"ATI Radeon HD Desktop ", kNull },
{ 0x5D4D,0x00000000, CHIP_FAMILY_R420,"ATI Radeon HD Desktop ", kNull },
{ 0x5D4E,0x00000000, CHIP_FAMILY_R420,"ATI Radeon HD Desktop ", kNull },
{ 0x5D4F,0x00000000, CHIP_FAMILY_R420,"ATI Rade