History

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.

Dave Airlie committed 11 years ago

Commit 950c3702 parents cff100f ee18e593 files · +28 −11Browse files

Unified · Split

3 files
  1. drivers/gpu/drm/radeon/atombios_crtc.c +1 −6
  2. drivers/gpu/drm/radeon/radeon_device.c +15 −0
  3. drivers/gpu/drm/radeon/radeon_vm.c +12 −5
drivers/gpu/drm/radeon/atombios_crtc.c+1−6
@@ -580,9 +580,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, · 579 unmodified lines
580580 else
581581 radeon_crtc->pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
582582
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;
586583 if (rdev->family < CHIP_RV770)
587584 radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
588585 /* use frac fb div on APUs */
@@ -1798,9 +1795,7 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc) · 1209 unmodified lines
17981795 if ((crtc->mode.clock == test_crtc->mode.clock) &&
17991796 (adjusted_clock == test_adjusted_clock) &&
18001797 (radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) &&
1801− (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))))
1798+ (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID))
18041799 return test_radeon_crtc->pll_id;
18051800 }
18061801 }
drivers/gpu/drm/radeon/radeon_device.c+15−0
@@ -1463,6 +1463,21 @@ int radeon_device_init(struct radeon_device *rdev, · 1462 unmodified lines
14631463 if (r)
14641464 DRM_ERROR("ib ring test failed (%d).\n", r);
14651465
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+
14661481 if ((radeon_testing & 1)) {
14671482 if (rdev->accel_working)
14681483 radeon_test_moves(rdev);
drivers/gpu/drm/radeon/radeon_vm.c+12−5
@@ -458,14 +458,16 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 457 unmodified lines
458458 /* make sure object fit at this offset */
459459 eoffset = soffset + size;
460460 if (soffset >= eoffset) {
461− return -EINVAL;
461+ r = -EINVAL;
462+ goto error_unreserve;
462463 }
463464
464465 last_pfn = eoffset / RADEON_GPU_PAGE_SIZE;
465466 if (last_pfn > rdev->vm_manager.max_pfn) {
466467 dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n",
467468 last_pfn, rdev->vm_manager.max_pfn);
468− return -EINVAL;
469+ r = -EINVAL;
470+ goto error_unreserve;
469471 }
470472
471473 } else {
@@ -486,7 +488,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 14 unmodified lines
486488 "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
487489 soffset, tmp->bo, tmp->it.start, tmp->it.last);
488490 mutex_unlock(&vm->mutex);
489− return -EINVAL;
491+ r = -EINVAL;
492+ goto error_unreserve;
490493 }
491494 }
492495
@@ -497,7 +500,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 4 unmodified lines
497500 tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
498501 if (!tmp) {
499502 mutex_unlock(&vm->mutex);
500− return -ENOMEM;
503+ r = -ENOMEM;
504+ goto error_unreserve;
501505 }
502506 tmp->it.start = bo_va->it.start;
503507 tmp->it.last = bo_va->it.last;
@@ -555,7 +559,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 51 unmodified lines
555559 r = radeon_vm_clear_bo(rdev, pt);
556560 if (r) {
557561 radeon_bo_unref(&pt);
558− radeon_bo_reserve(bo_va->bo, false);
559562 return r;
560563 }
561564
@@ -575,6 +578,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, · 13 unmodified lines
575578
576579 mutex_unlock(&vm->mutex);
577580 return 0;
581+
582+error_unreserve:
583+ radeon_bo_unreserve(bo_va->bo);
584+ return r;
578585 }
579586
580587 /**

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t