diff options
| author | Dave Airlie <airlied@redhat.com> | 2015-06-11 20:11:14 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2015-06-11 20:11:14 -0400 |
| commit | 950c37073aae9c2edbd0ba742fd668b4a355eea3 (patch) | |
| tree | 37d846270eaa4efd1624b6066d38c43217f6c677 /drivers/gpu | |
| parent | cff100f5d746465ca40e61cf296321ecf07d3f1c (diff) | |
| parent | ee18e599251ed06bf0c8ade7c434a0de311342ca (diff) | |
Merge branch 'drm-fixes-4.1' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
Two regression reverts, and two fixes, one for a dpm boot freeze.
* 'drm-fixes-4.1' of git://people.freedesktop.org/~agd5f/linux:
drm/radeon: Make sure radeon_vm_bo_set_addr always unreserves the BO
Revert "drm/radeon: adjust pll when audio is not enabled"
Revert "drm/radeon: don't share plls if monitors differ in audio support"
drm/radeon: fix freeze for laptop with Turks/Thames GPU.
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_vm.c | 17 |
3 files changed, 28 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index e597ffc26563..dac78ad24b31 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -580,9 +580,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 580 | else | 580 | else |
| 581 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; | 581 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; |
| 582 | 582 | ||
| 583 | /* if there is no audio, set MINM_OVER_MAXP */ | ||
| 584 | if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) | ||
| 585 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; | ||
| 586 | if (rdev->family < CHIP_RV770) | 583 | if (rdev->family < CHIP_RV770) |
| 587 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; | 584 | radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; |
| 588 | /* use frac fb div on APUs */ | 585 | /* use frac fb div on APUs */ |
| @@ -1798,9 +1795,7 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc) | |||
| 1798 | if ((crtc->mode.clock == test_crtc->mode.clock) && | 1795 | if ((crtc->mode.clock == test_crtc->mode.clock) && |
| 1799 | (adjusted_clock == test_adjusted_clock) && | 1796 | (adjusted_clock == test_adjusted_clock) && |
| 1800 | (radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) && | 1797 | (radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) && |
| 1801 | (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID) && | 1798 | (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID)) |
| 1802 | (drm_detect_monitor_audio(radeon_connector_edid(test_radeon_crtc->connector)) == | ||
| 1803 | drm_detect_monitor_audio(radeon_connector_edid(radeon_crtc->connector)))) | ||
| 1804 | return test_radeon_crtc->pll_id; | 1799 | return test_radeon_crtc->pll_id; |
| 1805 | } | 1800 | } |
| 1806 | } | 1801 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index b7ca4c514621..a7fdfa4f0857 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -1463,6 +1463,21 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 1463 | if (r) | 1463 | if (r) |
| 1464 | DRM_ERROR("ib ring test failed (%d).\n", r); | 1464 | DRM_ERROR("ib ring test failed (%d).\n", r); |
| 1465 | 1465 | ||
| 1466 | /* | ||
| 1467 | * Turks/Thames GPU will freeze whole laptop if DPM is not restarted | ||
| 1468 | * after the CP ring have chew one packet at least. Hence here we stop | ||
| 1469 | * and restart DPM after the radeon_ib_ring_tests(). | ||
| 1470 | */ | ||
| 1471 | if (rdev->pm.dpm_enabled && | ||
| 1472 | (rdev->pm.pm_method == PM_METHOD_DPM) && | ||
| 1473 | (rdev->family == CHIP_TURKS) && | ||
| 1474 | (rdev->flags & RADEON_IS_MOBILITY)) { | ||
| 1475 | mutex_lock(&rdev->pm.mutex); | ||
| 1476 | radeon_dpm_disable(rdev); | ||
| 1477 | radeon_dpm_enable(rdev); | ||
| 1478 | mutex_unlock(&rdev->pm.mutex); | ||
| 1479 | } | ||
| 1480 | |||
| 1466 | if ((radeon_testing & 1)) { | 1481 | if ((radeon_testing & 1)) { |
| 1467 | if (rdev->accel_working) | 1482 | if (rdev->accel_working) |
| 1468 | radeon_test_moves(rdev); | 1483 | radeon_test_moves(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index de42fc4a22b8..9c3377ca17b7 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
| @@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
| 458 | /* make sure object fit at this offset */ | 458 | /* make sure object fit at this offset */ |
| 459 | eoffset = soffset + size; | 459 | eoffset = soffset + size; |
| 460 | if (soffset >= eoffset) { | 460 | if (soffset >= eoffset) { |
| 461 | return -EINVAL; | 461 | r = -EINVAL; |
| 462 | goto error_unreserve; | ||
| 462 | } | 463 | } |
| 463 | 464 | ||
| 464 | last_pfn = eoffset / RADEON_GPU_PAGE_SIZE; | 465 | last_pfn = eoffset / RADEON_GPU_PAGE_SIZE; |
| 465 | if (last_pfn > rdev->vm_manager.max_pfn) { | 466 | if (last_pfn > rdev->vm_manager.max_pfn) { |
| 466 | dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n", | 467 | dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n", |
| 467 | last_pfn, rdev->vm_manager.max_pfn); | 468 | last_pfn, rdev->vm_manager.max_pfn); |
| 468 | return -EINVAL; | 469 | r = -EINVAL; |
| 470 | goto error_unreserve; | ||
| 469 | } | 471 | } |
| 470 | 472 | ||
| 471 | } else { | 473 | } else { |
| @@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
| 486 | "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, | 488 | "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, |
| 487 | soffset, tmp->bo, tmp->it.start, tmp->it.last); | 489 | soffset, tmp->bo, tmp->it.start, tmp->it.last); |
| 488 | mutex_unlock(&vm->mutex); | 490 | mutex_unlock(&vm->mutex); |
| 489 | return -EINVAL; | 491 | r = -EINVAL; |
| 492 | goto error_unreserve; | ||
| 490 | } | 493 | } |
| 491 | } | 494 | } |
| 492 | 495 | ||
| @@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
| 497 | tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); | 500 | tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); |
| 498 | if (!tmp) { | 501 | if (!tmp) { |
| 499 | mutex_unlock(&vm->mutex); | 502 | mutex_unlock(&vm->mutex); |
| 500 | return -ENOMEM; | 503 | r = -ENOMEM; |
| 504 | goto error_unreserve; | ||
| 501 | } | 505 | } |
| 502 | tmp->it.start = bo_va->it.start; | 506 | tmp->it.start = bo_va->it.start; |
| 503 | tmp->it.last = bo_va->it.last; | 507 | tmp->it.last = bo_va->it.last; |
| @@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
| 555 | r = radeon_vm_clear_bo(rdev, pt); | 559 | r = radeon_vm_clear_bo(rdev, pt); |
| 556 | if (r) { | 560 | if (r) { |
| 557 | radeon_bo_unref(&pt); | 561 | radeon_bo_unref(&pt); |
| 558 | radeon_bo_reserve(bo_va->bo, false); | ||
| 559 | return r; | 562 | return r; |
| 560 | } | 563 | } |
| 561 | 564 | ||
| @@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
| 575 | 578 | ||
| 576 | mutex_unlock(&vm->mutex); | 579 | mutex_unlock(&vm->mutex); |
| 577 | return 0; | 580 | return 0; |
| 581 | |||
| 582 | error_unreserve: | ||
| 583 | radeon_bo_unreserve(bo_va->bo); | ||
| 584 | return r; | ||
| 578 | } | 585 | } |
| 579 | 586 | ||
| 580 | /** | 587 | /** |
