diff options
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rs400.c | 2 |
7 files changed, 57 insertions, 24 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 9c924614c418..dc8e374a0b55 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -707,7 +707,7 @@ int drm_fb_helper_set_par(struct fb_info *info) | |||
707 | 707 | ||
708 | if (crtc->fb == fb_helper->crtc_info[i].mode_set.fb) { | 708 | if (crtc->fb == fb_helper->crtc_info[i].mode_set.fb) { |
709 | mutex_lock(&dev->mode_config.mutex); | 709 | mutex_lock(&dev->mode_config.mutex); |
710 | ret = crtc->funcs->set_config(&fb_helper->crtc_info->mode_set); | 710 | ret = crtc->funcs->set_config(&fb_helper->crtc_info[i].mode_set); |
711 | mutex_unlock(&dev->mode_config.mutex); | 711 | mutex_unlock(&dev->mode_config.mutex); |
712 | if (ret) | 712 | if (ret) |
713 | return ret; | 713 | return ret; |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index e5a3c301b7a9..c15287a590ff 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -368,14 +368,17 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable) | |||
368 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | 368 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
369 | if (encoder->crtc == crtc) { | 369 | if (encoder->crtc == crtc) { |
370 | radeon_encoder = to_radeon_encoder(encoder); | 370 | radeon_encoder = to_radeon_encoder(encoder); |
371 | dig = radeon_encoder->enc_priv; | ||
372 | /* only enable spread spectrum on LVDS */ | 371 | /* only enable spread spectrum on LVDS */ |
373 | if (dig && dig->ss) { | 372 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
374 | percentage = dig->ss->percentage; | 373 | dig = radeon_encoder->enc_priv; |
375 | type = dig->ss->type; | 374 | if (dig && dig->ss) { |
376 | step = dig->ss->step; | 375 | percentage = dig->ss->percentage; |
377 | delay = dig->ss->delay; | 376 | type = dig->ss->type; |
378 | range = dig->ss->range; | 377 | step = dig->ss->step; |
378 | delay = dig->ss->delay; | ||
379 | range = dig->ss->range; | ||
380 | } else if (enable) | ||
381 | return; | ||
379 | } else if (enable) | 382 | } else if (enable) |
380 | return; | 383 | return; |
381 | break; | 384 | break; |
@@ -387,7 +390,7 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable) | |||
387 | 390 | ||
388 | if (ASIC_IS_AVIVO(rdev)) { | 391 | if (ASIC_IS_AVIVO(rdev)) { |
389 | memset(&args, 0, sizeof(args)); | 392 | memset(&args, 0, sizeof(args)); |
390 | args.usSpreadSpectrumPercentage = percentage; | 393 | args.usSpreadSpectrumPercentage = cpu_to_le16(percentage); |
391 | args.ucSpreadSpectrumType = type; | 394 | args.ucSpreadSpectrumType = type; |
392 | args.ucSpreadSpectrumStep = step; | 395 | args.ucSpreadSpectrumStep = step; |
393 | args.ucSpreadSpectrumDelay = delay; | 396 | args.ucSpreadSpectrumDelay = delay; |
@@ -397,7 +400,7 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable) | |||
397 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 400 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
398 | } else { | 401 | } else { |
399 | memset(&legacy_args, 0, sizeof(legacy_args)); | 402 | memset(&legacy_args, 0, sizeof(legacy_args)); |
400 | legacy_args.usSpreadSpectrumPercentage = percentage; | 403 | legacy_args.usSpreadSpectrumPercentage = cpu_to_le16(percentage); |
401 | legacy_args.ucSpreadSpectrumType = type; | 404 | legacy_args.ucSpreadSpectrumType = type; |
402 | legacy_args.ucSpreadSpectrumStepSize_Delay = (step & 3) << 2; | 405 | legacy_args.ucSpreadSpectrumStepSize_Delay = (step & 3) << 2; |
403 | legacy_args.ucSpreadSpectrumStepSize_Delay |= (delay & 7) << 4; | 406 | legacy_args.ucSpreadSpectrumStepSize_Delay |= (delay & 7) << 4; |
@@ -483,8 +486,14 @@ void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) | |||
483 | atom_execute_table(rdev->mode_info.atom_context, | 486 | atom_execute_table(rdev->mode_info.atom_context, |
484 | index, (uint32_t *)&adjust_pll_args); | 487 | index, (uint32_t *)&adjust_pll_args); |
485 | adjusted_clock = le16_to_cpu(adjust_pll_args.usPixelClock) * 10; | 488 | adjusted_clock = le16_to_cpu(adjust_pll_args.usPixelClock) * 10; |
486 | } else | 489 | } else { |
487 | adjusted_clock = mode->clock; | 490 | /* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */ |
491 | if (ASIC_IS_AVIVO(rdev) && | ||
492 | (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1)) | ||
493 | adjusted_clock = mode->clock * 2; | ||
494 | else | ||
495 | adjusted_clock = mode->clock; | ||
496 | } | ||
488 | 497 | ||
489 | if (radeon_crtc->crtc_id == 0) | 498 | if (radeon_crtc->crtc_id == 0) |
490 | pll = &rdev->clock.p1pll; | 499 | pll = &rdev->clock.p1pll; |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 18729259c2fc..1c9a9c461762 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -655,6 +655,16 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) | |||
655 | p1pll->pll_out_min = 64800; | 655 | p1pll->pll_out_min = 64800; |
656 | else | 656 | else |
657 | p1pll->pll_out_min = 20000; | 657 | p1pll->pll_out_min = 20000; |
658 | } else if (p1pll->pll_out_min > 64800) { | ||
659 | /* Limiting the pll output range is a good thing generally as | ||
660 | * it limits the number of possible pll combinations for a given | ||
661 | * frequency presumably to the ones that work best on each card. | ||
662 | * However, certain duallink DVI monitors seem to like | ||
663 | * pll combinations that would be limited by this at least on | ||
664 | * pre-DCE 3.0 r6xx hardware. This might need to be adjusted per | ||
665 | * family. | ||
666 | */ | ||
667 | p1pll->pll_out_min = 64800; | ||
658 | } | 668 | } |
659 | 669 | ||
660 | p1pll->pll_in_min = | 670 | p1pll->pll_in_min = |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index fcb9371bf057..a36ede002ee4 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -1587,6 +1587,12 @@ static bool radeon_apply_legacy_tv_quirks(struct drm_device *dev) | |||
1587 | dev->pdev->subsystem_device == 0x009f) | 1587 | dev->pdev->subsystem_device == 0x009f) |
1588 | return false; | 1588 | return false; |
1589 | 1589 | ||
1590 | /* HP dc5750 has non-existent TV port */ | ||
1591 | if (dev->pdev->device == 0x5974 && | ||
1592 | dev->pdev->subsystem_vendor == 0x103c && | ||
1593 | dev->pdev->subsystem_device == 0x280a) | ||
1594 | return false; | ||
1595 | |||
1590 | return true; | 1596 | return true; |
1591 | } | 1597 | } |
1592 | 1598 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index d1cdda9b5586..88c19070247f 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -443,20 +443,24 @@ static uint32_t cail_reg_read(struct card_info *info, uint32_t reg) | |||
443 | return r; | 443 | return r; |
444 | } | 444 | } |
445 | 445 | ||
446 | static struct card_info atom_card_info = { | ||
447 | .dev = NULL, | ||
448 | .reg_read = cail_reg_read, | ||
449 | .reg_write = cail_reg_write, | ||
450 | .mc_read = cail_mc_read, | ||
451 | .mc_write = cail_mc_write, | ||
452 | .pll_read = cail_pll_read, | ||
453 | .pll_write = cail_pll_write, | ||
454 | }; | ||
455 | |||
456 | int radeon_atombios_init(struct radeon_device *rdev) | 446 | int radeon_atombios_init(struct radeon_device *rdev) |
457 | { | 447 | { |
458 | atom_card_info.dev = rdev->ddev; | 448 | struct card_info *atom_card_info = |
459 | rdev->mode_info.atom_context = atom_parse(&atom_card_info, rdev->bios); | 449 | kzalloc(sizeof(struct card_info), GFP_KERNEL); |
450 | |||
451 | if (!atom_card_info) | ||
452 | return -ENOMEM; | ||
453 | |||
454 | rdev->mode_info.atom_card_info = atom_card_info; | ||
455 | atom_card_info->dev = rdev->ddev; | ||
456 | atom_card_info->reg_read = cail_reg_read; | ||
457 | atom_card_info->reg_write = cail_reg_write; | ||
458 | atom_card_info->mc_read = cail_mc_read; | ||
459 | atom_card_info->mc_write = cail_mc_write; | ||
460 | atom_card_info->pll_read = cail_pll_read; | ||
461 | atom_card_info->pll_write = cail_pll_write; | ||
462 | |||
463 | rdev->mode_info.atom_context = atom_parse(atom_card_info, rdev->bios); | ||
460 | radeon_atom_initialize_bios_scratch_regs(rdev->ddev); | 464 | radeon_atom_initialize_bios_scratch_regs(rdev->ddev); |
461 | return 0; | 465 | return 0; |
462 | } | 466 | } |
@@ -464,6 +468,7 @@ int radeon_atombios_init(struct radeon_device *rdev) | |||
464 | void radeon_atombios_fini(struct radeon_device *rdev) | 468 | void radeon_atombios_fini(struct radeon_device *rdev) |
465 | { | 469 | { |
466 | kfree(rdev->mode_info.atom_context); | 470 | kfree(rdev->mode_info.atom_context); |
471 | kfree(rdev->mode_info.atom_card_info); | ||
467 | } | 472 | } |
468 | 473 | ||
469 | int radeon_combios_init(struct radeon_device *rdev) | 474 | int radeon_combios_init(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 2ea5707c018c..ccb783868ad6 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -172,6 +172,7 @@ enum radeon_connector_table { | |||
172 | 172 | ||
173 | struct radeon_mode_info { | 173 | struct radeon_mode_info { |
174 | struct atom_context *atom_context; | 174 | struct atom_context *atom_context; |
175 | struct card_info *atom_card_info; | ||
175 | enum radeon_connector_table connector_table; | 176 | enum radeon_connector_table connector_table; |
176 | bool mode_config_initialized; | 177 | bool mode_config_initialized; |
177 | struct radeon_crtc *crtcs[2]; | 178 | struct radeon_crtc *crtcs[2]; |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index a769c296f6a6..ca037160a582 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -418,6 +418,8 @@ int rs400_resume(struct radeon_device *rdev) | |||
418 | rs400_gart_disable(rdev); | 418 | rs400_gart_disable(rdev); |
419 | /* Resume clock before doing reset */ | 419 | /* Resume clock before doing reset */ |
420 | r300_clock_startup(rdev); | 420 | r300_clock_startup(rdev); |
421 | /* setup MC before calling post tables */ | ||
422 | rs400_mc_program(rdev); | ||
421 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 423 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ |
422 | if (radeon_gpu_reset(rdev)) { | 424 | if (radeon_gpu_reset(rdev)) { |
423 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | 425 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", |