diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_fence.c | 36 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 3 |
3 files changed, 29 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_fence.c b/drivers/gpu/drm/i915/i915_gem_fence.c index 40a10b25956c..f010391b87f5 100644 --- a/drivers/gpu/drm/i915/i915_gem_fence.c +++ b/drivers/gpu/drm/i915/i915_gem_fence.c | |||
| @@ -642,11 +642,10 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
| 642 | } | 642 | } |
| 643 | 643 | ||
| 644 | /* check for L-shaped memory aka modified enhanced addressing */ | 644 | /* check for L-shaped memory aka modified enhanced addressing */ |
| 645 | if (IS_GEN4(dev)) { | 645 | if (IS_GEN4(dev) && |
| 646 | uint32_t ddc2 = I915_READ(DCC2); | 646 | !(I915_READ(DCC2) & DCC2_MODIFIED_ENHANCED_DISABLE)) { |
| 647 | 647 | swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; | |
| 648 | if (!(ddc2 & DCC2_MODIFIED_ENHANCED_DISABLE)) | 648 | swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; |
| 649 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; | ||
| 650 | } | 649 | } |
| 651 | 650 | ||
| 652 | if (dcc == 0xffffffff) { | 651 | if (dcc == 0xffffffff) { |
| @@ -675,16 +674,35 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev) | |||
| 675 | * matching, which was the case for the swizzling required in | 674 | * matching, which was the case for the swizzling required in |
| 676 | * the table above, or from the 1-ch value being less than | 675 | * the table above, or from the 1-ch value being less than |
| 677 | * the minimum size of a rank. | 676 | * the minimum size of a rank. |
| 677 | * | ||
| 678 | * Reports indicate that the swizzling actually | ||
| 679 | * varies depending upon page placement inside the | ||
| 680 | * channels, i.e. we see swizzled pages where the | ||
| 681 | * banks of memory are paired and unswizzled on the | ||
| 682 | * uneven portion, so leave that as unknown. | ||
| 678 | */ | 683 | */ |
| 679 | if (I915_READ16(C0DRB3) != I915_READ16(C1DRB3)) { | 684 | if (I915_READ16(C0DRB3) == I915_READ16(C1DRB3)) { |
| 680 | swizzle_x = I915_BIT_6_SWIZZLE_NONE; | ||
| 681 | swizzle_y = I915_BIT_6_SWIZZLE_NONE; | ||
| 682 | } else { | ||
| 683 | swizzle_x = I915_BIT_6_SWIZZLE_9_10; | 685 | swizzle_x = I915_BIT_6_SWIZZLE_9_10; |
| 684 | swizzle_y = I915_BIT_6_SWIZZLE_9; | 686 | swizzle_y = I915_BIT_6_SWIZZLE_9; |
| 685 | } | 687 | } |
| 686 | } | 688 | } |
| 687 | 689 | ||
| 690 | if (swizzle_x == I915_BIT_6_SWIZZLE_UNKNOWN || | ||
| 691 | swizzle_y == I915_BIT_6_SWIZZLE_UNKNOWN) { | ||
| 692 | /* Userspace likes to explode if it sees unknown swizzling, | ||
| 693 | * so lie. We will finish the lie when reporting through | ||
| 694 | * the get-tiling-ioctl by reporting the physical swizzle | ||
| 695 | * mode as unknown instead. | ||
| 696 | * | ||
| 697 | * As we don't strictly know what the swizzling is, it may be | ||
| 698 | * bit17 dependent, and so we need to also prevent the pages | ||
| 699 | * from being moved. | ||
| 700 | */ | ||
| 701 | dev_priv->quirks |= QUIRK_PIN_SWIZZLED_PAGES; | ||
| 702 | swizzle_x = I915_BIT_6_SWIZZLE_NONE; | ||
| 703 | swizzle_y = I915_BIT_6_SWIZZLE_NONE; | ||
| 704 | } | ||
| 705 | |||
| 688 | dev_priv->mm.bit_6_swizzle_x = swizzle_x; | 706 | dev_priv->mm.bit_6_swizzle_x = swizzle_x; |
| 689 | dev_priv->mm.bit_6_swizzle_y = swizzle_y; | 707 | dev_priv->mm.bit_6_swizzle_y = swizzle_y; |
| 690 | } | 708 | } |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 71860f8680f9..12a2e9d1f633 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -12460,7 +12460,6 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
| 12460 | if (INTEL_INFO(dev)->gen < 8) { | 12460 | if (INTEL_INFO(dev)->gen < 8) { |
| 12461 | PIPE_CONF_CHECK_M_N(dp_m_n); | 12461 | PIPE_CONF_CHECK_M_N(dp_m_n); |
| 12462 | 12462 | ||
| 12463 | PIPE_CONF_CHECK_I(has_drrs); | ||
| 12464 | if (current_config->has_drrs) | 12463 | if (current_config->has_drrs) |
| 12465 | PIPE_CONF_CHECK_M_N(dp_m2_n2); | 12464 | PIPE_CONF_CHECK_M_N(dp_m2_n2); |
| 12466 | } else | 12465 | } else |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 09bdd94ca3ba..d34e64300d66 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -5153,7 +5153,8 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd) | |||
| 5153 | enum intel_display_power_domain power_domain; | 5153 | enum intel_display_power_domain power_domain; |
| 5154 | enum irqreturn ret = IRQ_NONE; | 5154 | enum irqreturn ret = IRQ_NONE; |
| 5155 | 5155 | ||
| 5156 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP) | 5156 | if (intel_dig_port->base.type != INTEL_OUTPUT_EDP && |
| 5157 | intel_dig_port->base.type != INTEL_OUTPUT_HDMI) | ||
| 5157 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; | 5158 | intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT; |
| 5158 | 5159 | ||
| 5159 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { | 5160 | if (long_hpd && intel_dig_port->base.type == INTEL_OUTPUT_EDP) { |
