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