Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull drm fixes from Dave Airlie:
"i915 and radeon fixes:

i915:
fix for connector oops regression
DDC probing fix

radeon:
two radeon reverts, along with a freeze workaround and a fix"

* 'drm-fixes' of git://people.freedesktop.org/~airlied/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.
drm/i915: Fix DDC probe for passive adapters
drm/i915: Properly initialize SDVO analog connectors

+46 -15
+17 -3
drivers/gpu/drm/i915/intel_i2c.c
··· 435 435 struct intel_gmbus, 436 436 adapter); 437 437 struct drm_i915_private *dev_priv = bus->dev_priv; 438 - int i, reg_offset; 438 + int i = 0, inc, try = 0, reg_offset; 439 439 int ret = 0; 440 440 441 441 intel_aux_display_runtime_get(dev_priv); ··· 448 448 449 449 reg_offset = dev_priv->gpio_mmio_base; 450 450 451 + retry: 451 452 I915_WRITE(GMBUS0 + reg_offset, bus->reg0); 452 453 453 - for (i = 0; i < num; i++) { 454 + for (; i < num; i += inc) { 455 + inc = 1; 454 456 if (gmbus_is_index_read(msgs, i, num)) { 455 457 ret = gmbus_xfer_index_read(dev_priv, &msgs[i]); 456 - i += 1; /* set i to the index of the read xfer */ 458 + inc = 2; /* an index read is two msgs */ 457 459 } else if (msgs[i].flags & I2C_M_RD) { 458 460 ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); 459 461 } else { ··· 526 524 DRM_DEBUG_KMS("GMBUS [%s] NAK for addr: %04x %c(%d)\n", 527 525 adapter->name, msgs[i].addr, 528 526 (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len); 527 + 528 + /* 529 + * Passive adapters sometimes NAK the first probe. Retry the first 530 + * message once on -ENXIO for GMBUS transfers; the bit banging algorithm 531 + * has retries internally. See also the retry loop in 532 + * drm_do_probe_ddc_edid, which bails out on the first -ENXIO. 533 + */ 534 + if (ret == -ENXIO && i == 0 && try++ == 0) { 535 + DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n", 536 + adapter->name); 537 + goto retry; 538 + } 529 539 530 540 goto out; 531 541
+1 -1
drivers/gpu/drm/i915/intel_sdvo.c
··· 2550 2550 2551 2551 DRM_DEBUG_KMS("initialising analog device %d\n", device); 2552 2552 2553 - intel_sdvo_connector = kzalloc(sizeof(*intel_sdvo_connector), GFP_KERNEL); 2553 + intel_sdvo_connector = intel_sdvo_connector_alloc(); 2554 2554 if (!intel_sdvo_connector) 2555 2555 return false; 2556 2556
+1 -6
drivers/gpu/drm/radeon/atombios_crtc.c
··· 580 580 else 581 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 583 if (rdev->family < CHIP_RV770) 587 584 radeon_crtc->pll_flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; 588 585 /* use frac fb div on APUs */ ··· 1795 1798 if ((crtc->mode.clock == test_crtc->mode.clock) && 1796 1799 (adjusted_clock == test_adjusted_clock) && 1797 1800 (radeon_crtc->ss_enabled == test_radeon_crtc->ss_enabled) && 1798 - (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID) && 1799 - (drm_detect_monitor_audio(radeon_connector_edid(test_radeon_crtc->connector)) == 1800 - drm_detect_monitor_audio(radeon_connector_edid(radeon_crtc->connector)))) 1801 + (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID)) 1801 1802 return test_radeon_crtc->pll_id; 1802 1803 } 1803 1804 }
+15
drivers/gpu/drm/radeon/radeon_device.c
··· 1463 1463 if (r) 1464 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 1481 if ((radeon_testing & 1)) { 1467 1482 if (rdev->accel_working) 1468 1483 radeon_test_moves(rdev);
+12 -5
drivers/gpu/drm/radeon/radeon_vm.c
··· 458 458 /* make sure object fit at this offset */ 459 459 eoffset = soffset + size; 460 460 if (soffset >= eoffset) { 461 - return -EINVAL; 461 + r = -EINVAL; 462 + goto error_unreserve; 462 463 } 463 464 464 465 last_pfn = eoffset / RADEON_GPU_PAGE_SIZE; 465 466 if (last_pfn > rdev->vm_manager.max_pfn) { 466 467 dev_err(rdev->dev, "va above limit (0x%08X > 0x%08X)\n", 467 468 last_pfn, rdev->vm_manager.max_pfn); 468 - return -EINVAL; 469 + r = -EINVAL; 470 + goto error_unreserve; 469 471 } 470 472 471 473 } else { ··· 488 486 "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo, 489 487 soffset, tmp->bo, tmp->it.start, tmp->it.last); 490 488 mutex_unlock(&vm->mutex); 491 - return -EINVAL; 489 + r = -EINVAL; 490 + goto error_unreserve; 492 491 } 493 492 } 494 493 ··· 500 497 tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL); 501 498 if (!tmp) { 502 499 mutex_unlock(&vm->mutex); 503 - return -ENOMEM; 500 + r = -ENOMEM; 501 + goto error_unreserve; 504 502 } 505 503 tmp->it.start = bo_va->it.start; 506 504 tmp->it.last = bo_va->it.last; ··· 559 555 r = radeon_vm_clear_bo(rdev, pt); 560 556 if (r) { 561 557 radeon_bo_unref(&pt); 562 - radeon_bo_reserve(bo_va->bo, false); 563 558 return r; 564 559 } 565 560 ··· 578 575 579 576 mutex_unlock(&vm->mutex); 580 577 return 0; 578 + 579 + error_unreserve: 580 + radeon_bo_unreserve(bo_va->bo); 581 + return r; 581 582 } 582 583 583 584 /**