diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 145 |
1 files changed, 41 insertions, 104 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 485f82c9929d..68ce36056019 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -147,7 +147,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | |||
| 147 | enum radeon_combios_table_offset table) | 147 | enum radeon_combios_table_offset table) |
| 148 | { | 148 | { |
| 149 | struct radeon_device *rdev = dev->dev_private; | 149 | struct radeon_device *rdev = dev->dev_private; |
| 150 | int rev; | 150 | int rev, size; |
| 151 | uint16_t offset = 0, check_offset; | 151 | uint16_t offset = 0, check_offset; |
| 152 | 152 | ||
| 153 | if (!rdev->bios) | 153 | if (!rdev->bios) |
| @@ -156,174 +156,106 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | |||
| 156 | switch (table) { | 156 | switch (table) { |
| 157 | /* absolute offset tables */ | 157 | /* absolute offset tables */ |
| 158 | case COMBIOS_ASIC_INIT_1_TABLE: | 158 | case COMBIOS_ASIC_INIT_1_TABLE: |
| 159 | check_offset = RBIOS16(rdev->bios_header_start + 0xc); | 159 | check_offset = 0xc; |
| 160 | if (check_offset) | ||
| 161 | offset = check_offset; | ||
| 162 | break; | 160 | break; |
| 163 | case COMBIOS_BIOS_SUPPORT_TABLE: | 161 | case COMBIOS_BIOS_SUPPORT_TABLE: |
| 164 | check_offset = RBIOS16(rdev->bios_header_start + 0x14); | 162 | check_offset = 0x14; |
| 165 | if (check_offset) | ||
| 166 | offset = check_offset; | ||
| 167 | break; | 163 | break; |
| 168 | case COMBIOS_DAC_PROGRAMMING_TABLE: | 164 | case COMBIOS_DAC_PROGRAMMING_TABLE: |
| 169 | check_offset = RBIOS16(rdev->bios_header_start + 0x2a); | 165 | check_offset = 0x2a; |
| 170 | if (check_offset) | ||
| 171 | offset = check_offset; | ||
| 172 | break; | 166 | break; |
| 173 | case COMBIOS_MAX_COLOR_DEPTH_TABLE: | 167 | case COMBIOS_MAX_COLOR_DEPTH_TABLE: |
| 174 | check_offset = RBIOS16(rdev->bios_header_start + 0x2c); | 168 | check_offset = 0x2c; |
| 175 | if (check_offset) | ||
| 176 | offset = check_offset; | ||
| 177 | break; | 169 | break; |
| 178 | case COMBIOS_CRTC_INFO_TABLE: | 170 | case COMBIOS_CRTC_INFO_TABLE: |
| 179 | check_offset = RBIOS16(rdev->bios_header_start + 0x2e); | 171 | check_offset = 0x2e; |
| 180 | if (check_offset) | ||
| 181 | offset = check_offset; | ||
| 182 | break; | 172 | break; |
| 183 | case COMBIOS_PLL_INFO_TABLE: | 173 | case COMBIOS_PLL_INFO_TABLE: |
| 184 | check_offset = RBIOS16(rdev->bios_header_start + 0x30); | 174 | check_offset = 0x30; |
| 185 | if (check_offset) | ||
| 186 | offset = check_offset; | ||
| 187 | break; | 175 | break; |
| 188 | case COMBIOS_TV_INFO_TABLE: | 176 | case COMBIOS_TV_INFO_TABLE: |
| 189 | check_offset = RBIOS16(rdev->bios_header_start + 0x32); | 177 | check_offset = 0x32; |
| 190 | if (check_offset) | ||
| 191 | offset = check_offset; | ||
| 192 | break; | 178 | break; |
| 193 | case COMBIOS_DFP_INFO_TABLE: | 179 | case COMBIOS_DFP_INFO_TABLE: |
| 194 | check_offset = RBIOS16(rdev->bios_header_start + 0x34); | 180 | check_offset = 0x34; |
| 195 | if (check_offset) | ||
| 196 | offset = check_offset; | ||
| 197 | break; | 181 | break; |
| 198 | case COMBIOS_HW_CONFIG_INFO_TABLE: | 182 | case COMBIOS_HW_CONFIG_INFO_TABLE: |
| 199 | check_offset = RBIOS16(rdev->bios_header_start + 0x36); | 183 | check_offset = 0x36; |
| 200 | if (check_offset) | ||
| 201 | offset = check_offset; | ||
| 202 | break; | 184 | break; |
| 203 | case COMBIOS_MULTIMEDIA_INFO_TABLE: | 185 | case COMBIOS_MULTIMEDIA_INFO_TABLE: |
| 204 | check_offset = RBIOS16(rdev->bios_header_start + 0x38); | 186 | check_offset = 0x38; |
| 205 | if (check_offset) | ||
| 206 | offset = check_offset; | ||
| 207 | break; | 187 | break; |
| 208 | case COMBIOS_TV_STD_PATCH_TABLE: | 188 | case COMBIOS_TV_STD_PATCH_TABLE: |
| 209 | check_offset = RBIOS16(rdev->bios_header_start + 0x3e); | 189 | check_offset = 0x3e; |
| 210 | if (check_offset) | ||
| 211 | offset = check_offset; | ||
| 212 | break; | 190 | break; |
| 213 | case COMBIOS_LCD_INFO_TABLE: | 191 | case COMBIOS_LCD_INFO_TABLE: |
| 214 | check_offset = RBIOS16(rdev->bios_header_start + 0x40); | 192 | check_offset = 0x40; |
| 215 | if (check_offset) | ||
| 216 | offset = check_offset; | ||
| 217 | break; | 193 | break; |
| 218 | case COMBIOS_MOBILE_INFO_TABLE: | 194 | case COMBIOS_MOBILE_INFO_TABLE: |
| 219 | check_offset = RBIOS16(rdev->bios_header_start + 0x42); | 195 | check_offset = 0x42; |
| 220 | if (check_offset) | ||
| 221 | offset = check_offset; | ||
| 222 | break; | 196 | break; |
| 223 | case COMBIOS_PLL_INIT_TABLE: | 197 | case COMBIOS_PLL_INIT_TABLE: |
| 224 | check_offset = RBIOS16(rdev->bios_header_start + 0x46); | 198 | check_offset = 0x46; |
| 225 | if (check_offset) | ||
| 226 | offset = check_offset; | ||
| 227 | break; | 199 | break; |
| 228 | case COMBIOS_MEM_CONFIG_TABLE: | 200 | case COMBIOS_MEM_CONFIG_TABLE: |
| 229 | check_offset = RBIOS16(rdev->bios_header_start + 0x48); | 201 | check_offset = 0x48; |
| 230 | if (check_offset) | ||
| 231 | offset = check_offset; | ||
| 232 | break; | 202 | break; |
| 233 | case COMBIOS_SAVE_MASK_TABLE: | 203 | case COMBIOS_SAVE_MASK_TABLE: |
| 234 | check_offset = RBIOS16(rdev->bios_header_start + 0x4a); | 204 | check_offset = 0x4a; |
| 235 | if (check_offset) | ||
| 236 | offset = check_offset; | ||
| 237 | break; | 205 | break; |
| 238 | case COMBIOS_HARDCODED_EDID_TABLE: | 206 | case COMBIOS_HARDCODED_EDID_TABLE: |
| 239 | check_offset = RBIOS16(rdev->bios_header_start + 0x4c); | 207 | check_offset = 0x4c; |
| 240 | if (check_offset) | ||
| 241 | offset = check_offset; | ||
| 242 | break; | 208 | break; |
| 243 | case COMBIOS_ASIC_INIT_2_TABLE: | 209 | case COMBIOS_ASIC_INIT_2_TABLE: |
| 244 | check_offset = RBIOS16(rdev->bios_header_start + 0x4e); | 210 | check_offset = 0x4e; |
| 245 | if (check_offset) | ||
| 246 | offset = check_offset; | ||
| 247 | break; | 211 | break; |
| 248 | case COMBIOS_CONNECTOR_INFO_TABLE: | 212 | case COMBIOS_CONNECTOR_INFO_TABLE: |
| 249 | check_offset = RBIOS16(rdev->bios_header_start + 0x50); | 213 | check_offset = 0x50; |
| 250 | if (check_offset) | ||
| 251 | offset = check_offset; | ||
| 252 | break; | 214 | break; |
| 253 | case COMBIOS_DYN_CLK_1_TABLE: | 215 | case COMBIOS_DYN_CLK_1_TABLE: |
| 254 | check_offset = RBIOS16(rdev->bios_header_start + 0x52); | 216 | check_offset = 0x52; |
| 255 | if (check_offset) | ||
| 256 | offset = check_offset; | ||
| 257 | break; | 217 | break; |
| 258 | case COMBIOS_RESERVED_MEM_TABLE: | 218 | case COMBIOS_RESERVED_MEM_TABLE: |
| 259 | check_offset = RBIOS16(rdev->bios_header_start + 0x54); | 219 | check_offset = 0x54; |
| 260 | if (check_offset) | ||
| 261 | offset = check_offset; | ||
| 262 | break; | 220 | break; |
| 263 | case COMBIOS_EXT_TMDS_INFO_TABLE: | 221 | case COMBIOS_EXT_TMDS_INFO_TABLE: |
| 264 | check_offset = RBIOS16(rdev->bios_header_start + 0x58); | 222 | check_offset = 0x58; |
| 265 | if (check_offset) | ||
| 266 | offset = check_offset; | ||
| 267 | break; | 223 | break; |
| 268 | case COMBIOS_MEM_CLK_INFO_TABLE: | 224 | case COMBIOS_MEM_CLK_INFO_TABLE: |
| 269 | check_offset = RBIOS16(rdev->bios_header_start + 0x5a); | 225 | check_offset = 0x5a; |
| 270 | if (check_offset) | ||
| 271 | offset = check_offset; | ||
| 272 | break; | 226 | break; |
| 273 | case COMBIOS_EXT_DAC_INFO_TABLE: | 227 | case COMBIOS_EXT_DAC_INFO_TABLE: |
| 274 | check_offset = RBIOS16(rdev->bios_header_start + 0x5c); | 228 | check_offset = 0x5c; |
| 275 | if (check_offset) | ||
| 276 | offset = check_offset; | ||
| 277 | break; | 229 | break; |
| 278 | case COMBIOS_MISC_INFO_TABLE: | 230 | case COMBIOS_MISC_INFO_TABLE: |
| 279 | check_offset = RBIOS16(rdev->bios_header_start + 0x5e); | 231 | check_offset = 0x5e; |
| 280 | if (check_offset) | ||
| 281 | offset = check_offset; | ||
| 282 | break; | 232 | break; |
| 283 | case COMBIOS_CRT_INFO_TABLE: | 233 | case COMBIOS_CRT_INFO_TABLE: |
| 284 | check_offset = RBIOS16(rdev->bios_header_start + 0x60); | 234 | check_offset = 0x60; |
| 285 | if (check_offset) | ||
| 286 | offset = check_offset; | ||
| 287 | break; | 235 | break; |
| 288 | case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE: | 236 | case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE: |
| 289 | check_offset = RBIOS16(rdev->bios_header_start + 0x62); | 237 | check_offset = 0x62; |
| 290 | if (check_offset) | ||
| 291 | offset = check_offset; | ||
| 292 | break; | 238 | break; |
| 293 | case COMBIOS_COMPONENT_VIDEO_INFO_TABLE: | 239 | case COMBIOS_COMPONENT_VIDEO_INFO_TABLE: |
| 294 | check_offset = RBIOS16(rdev->bios_header_start + 0x64); | 240 | check_offset = 0x64; |
| 295 | if (check_offset) | ||
| 296 | offset = check_offset; | ||
| 297 | break; | 241 | break; |
| 298 | case COMBIOS_FAN_SPEED_INFO_TABLE: | 242 | case COMBIOS_FAN_SPEED_INFO_TABLE: |
| 299 | check_offset = RBIOS16(rdev->bios_header_start + 0x66); | 243 | check_offset = 0x66; |
| 300 | if (check_offset) | ||
| 301 | offset = check_offset; | ||
| 302 | break; | 244 | break; |
| 303 | case COMBIOS_OVERDRIVE_INFO_TABLE: | 245 | case COMBIOS_OVERDRIVE_INFO_TABLE: |
| 304 | check_offset = RBIOS16(rdev->bios_header_start + 0x68); | 246 | check_offset = 0x68; |
| 305 | if (check_offset) | ||
| 306 | offset = check_offset; | ||
| 307 | break; | 247 | break; |
| 308 | case COMBIOS_OEM_INFO_TABLE: | 248 | case COMBIOS_OEM_INFO_TABLE: |
| 309 | check_offset = RBIOS16(rdev->bios_header_start + 0x6a); | 249 | check_offset = 0x6a; |
| 310 | if (check_offset) | ||
| 311 | offset = check_offset; | ||
| 312 | break; | 250 | break; |
| 313 | case COMBIOS_DYN_CLK_2_TABLE: | 251 | case COMBIOS_DYN_CLK_2_TABLE: |
| 314 | check_offset = RBIOS16(rdev->bios_header_start + 0x6c); | 252 | check_offset = 0x6c; |
| 315 | if (check_offset) | ||
| 316 | offset = check_offset; | ||
| 317 | break; | 253 | break; |
| 318 | case COMBIOS_POWER_CONNECTOR_INFO_TABLE: | 254 | case COMBIOS_POWER_CONNECTOR_INFO_TABLE: |
| 319 | check_offset = RBIOS16(rdev->bios_header_start + 0x6e); | 255 | check_offset = 0x6e; |
| 320 | if (check_offset) | ||
| 321 | offset = check_offset; | ||
| 322 | break; | 256 | break; |
| 323 | case COMBIOS_I2C_INFO_TABLE: | 257 | case COMBIOS_I2C_INFO_TABLE: |
| 324 | check_offset = RBIOS16(rdev->bios_header_start + 0x70); | 258 | check_offset = 0x70; |
| 325 | if (check_offset) | ||
| 326 | offset = check_offset; | ||
| 327 | break; | 259 | break; |
| 328 | /* relative offset tables */ | 260 | /* relative offset tables */ |
| 329 | case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */ | 261 | case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */ |
| @@ -439,11 +371,16 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | |||
| 439 | } | 371 | } |
| 440 | break; | 372 | break; |
| 441 | default: | 373 | default: |
| 374 | check_offset = 0; | ||
| 442 | break; | 375 | break; |
| 443 | } | 376 | } |
| 444 | 377 | ||
| 445 | return offset; | 378 | size = RBIOS8(rdev->bios_header_start + 0x6); |
| 379 | /* check absolute offset tables */ | ||
| 380 | if (table < COMBIOS_ASIC_INIT_3_TABLE && check_offset && check_offset < size) | ||
| 381 | offset = RBIOS16(rdev->bios_header_start + check_offset); | ||
| 446 | 382 | ||
| 383 | return offset; | ||
| 447 | } | 384 | } |
| 448 | 385 | ||
| 449 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) | 386 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) |
