diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_combios.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 159 |
1 files changed, 51 insertions, 108 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 78edadc9e86b..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) |
@@ -965,16 +902,22 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | |||
965 | dac = RBIOS8(dac_info + 0x3) & 0xf; | 902 | dac = RBIOS8(dac_info + 0x3) & 0xf; |
966 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); | 903 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); |
967 | } | 904 | } |
968 | /* if the values are all zeros, use the table */ | 905 | /* if the values are zeros, use the table */ |
969 | if (p_dac->ps2_pdac_adj) | 906 | if ((dac == 0) || (bg == 0)) |
907 | found = 0; | ||
908 | else | ||
970 | found = 1; | 909 | found = 1; |
971 | } | 910 | } |
972 | 911 | ||
973 | /* quirks */ | 912 | /* quirks */ |
913 | /* Radeon 7000 (RV100) */ | ||
914 | if (((dev->pdev->device == 0x5159) && | ||
915 | (dev->pdev->subsystem_vendor == 0x174B) && | ||
916 | (dev->pdev->subsystem_device == 0x7c28)) || | ||
974 | /* Radeon 9100 (R200) */ | 917 | /* Radeon 9100 (R200) */ |
975 | if ((dev->pdev->device == 0x514D) && | 918 | ((dev->pdev->device == 0x514D) && |
976 | (dev->pdev->subsystem_vendor == 0x174B) && | 919 | (dev->pdev->subsystem_vendor == 0x174B) && |
977 | (dev->pdev->subsystem_device == 0x7149)) { | 920 | (dev->pdev->subsystem_device == 0x7149))) { |
978 | /* vbios value is bad, use the default */ | 921 | /* vbios value is bad, use the default */ |
979 | found = 0; | 922 | found = 0; |
980 | } | 923 | } |