Commit a7b0806392b527e8a616e7ea6f17aafe33949a9f
Exists in
ti-lsk-linux-4.1.y
and in
12 other branches
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm/intel fixes from Dave Airlie: "Just some intel fixes. I have some radeon ones but I need to get some patches dropped from the pull req" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/i915: Increase WM memory latency values on SNB drm/i915: restore backlight precision when converting from ACPI drm/i915: Use the first mode if there is no preferred mode in the EDID drm/i915/dp: force eDP lane count to max available lanes on BDW drm/i915/vlv: reset VLV media force wake request register drm/i915/SDVO: For sysfs link put directory and target in correct order drm/i915: use lane count and link rate from VBT as minimums for eDP drm/i915: clean up VBT eDP link param decoding drm/i915: consider the source max DP lane count too
Showing 7 changed files Side-by-side Diff
drivers/gpu/drm/i915/intel_bios.c
... | ... | @@ -560,46 +560,70 @@ |
560 | 560 | |
561 | 561 | dev_priv->vbt.edp_pps = *edp_pps; |
562 | 562 | |
563 | - dev_priv->vbt.edp_rate = edp_link_params->rate ? DP_LINK_BW_2_7 : | |
564 | - DP_LINK_BW_1_62; | |
563 | + switch (edp_link_params->rate) { | |
564 | + case EDP_RATE_1_62: | |
565 | + dev_priv->vbt.edp_rate = DP_LINK_BW_1_62; | |
566 | + break; | |
567 | + case EDP_RATE_2_7: | |
568 | + dev_priv->vbt.edp_rate = DP_LINK_BW_2_7; | |
569 | + break; | |
570 | + default: | |
571 | + DRM_DEBUG_KMS("VBT has unknown eDP link rate value %u\n", | |
572 | + edp_link_params->rate); | |
573 | + break; | |
574 | + } | |
575 | + | |
565 | 576 | switch (edp_link_params->lanes) { |
566 | - case 0: | |
577 | + case EDP_LANE_1: | |
567 | 578 | dev_priv->vbt.edp_lanes = 1; |
568 | 579 | break; |
569 | - case 1: | |
580 | + case EDP_LANE_2: | |
570 | 581 | dev_priv->vbt.edp_lanes = 2; |
571 | 582 | break; |
572 | - case 3: | |
573 | - default: | |
583 | + case EDP_LANE_4: | |
574 | 584 | dev_priv->vbt.edp_lanes = 4; |
575 | 585 | break; |
586 | + default: | |
587 | + DRM_DEBUG_KMS("VBT has unknown eDP lane count value %u\n", | |
588 | + edp_link_params->lanes); | |
589 | + break; | |
576 | 590 | } |
591 | + | |
577 | 592 | switch (edp_link_params->preemphasis) { |
578 | - case 0: | |
593 | + case EDP_PREEMPHASIS_NONE: | |
579 | 594 | dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_0; |
580 | 595 | break; |
581 | - case 1: | |
596 | + case EDP_PREEMPHASIS_3_5dB: | |
582 | 597 | dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5; |
583 | 598 | break; |
584 | - case 2: | |
599 | + case EDP_PREEMPHASIS_6dB: | |
585 | 600 | dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_6; |
586 | 601 | break; |
587 | - case 3: | |
602 | + case EDP_PREEMPHASIS_9_5dB: | |
588 | 603 | dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5; |
589 | 604 | break; |
605 | + default: | |
606 | + DRM_DEBUG_KMS("VBT has unknown eDP pre-emphasis value %u\n", | |
607 | + edp_link_params->preemphasis); | |
608 | + break; | |
590 | 609 | } |
610 | + | |
591 | 611 | switch (edp_link_params->vswing) { |
592 | - case 0: | |
612 | + case EDP_VSWING_0_4V: | |
593 | 613 | dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_400; |
594 | 614 | break; |
595 | - case 1: | |
615 | + case EDP_VSWING_0_6V: | |
596 | 616 | dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_600; |
597 | 617 | break; |
598 | - case 2: | |
618 | + case EDP_VSWING_0_8V: | |
599 | 619 | dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_800; |
600 | 620 | break; |
601 | - case 3: | |
621 | + case EDP_VSWING_1_2V: | |
602 | 622 | dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_1200; |
623 | + break; | |
624 | + default: | |
625 | + DRM_DEBUG_KMS("VBT has unknown eDP voltage swing value %u\n", | |
626 | + edp_link_params->vswing); | |
603 | 627 | break; |
604 | 628 | } |
605 | 629 | } |
drivers/gpu/drm/i915/intel_dp.c
... | ... | @@ -121,6 +121,22 @@ |
121 | 121 | return max_link_bw; |
122 | 122 | } |
123 | 123 | |
124 | +static u8 intel_dp_max_lane_count(struct intel_dp *intel_dp) | |
125 | +{ | |
126 | + struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | |
127 | + struct drm_device *dev = intel_dig_port->base.base.dev; | |
128 | + u8 source_max, sink_max; | |
129 | + | |
130 | + source_max = 4; | |
131 | + if (HAS_DDI(dev) && intel_dig_port->port == PORT_A && | |
132 | + (intel_dig_port->saved_port_bits & DDI_A_4_LANES) == 0) | |
133 | + source_max = 2; | |
134 | + | |
135 | + sink_max = drm_dp_max_lane_count(intel_dp->dpcd); | |
136 | + | |
137 | + return min(source_max, sink_max); | |
138 | +} | |
139 | + | |
124 | 140 | /* |
125 | 141 | * The units on the numbers in the next two are... bizarre. Examples will |
126 | 142 | * make it clearer; this one parallels an example in the eDP spec. |
... | ... | @@ -171,7 +187,7 @@ |
171 | 187 | } |
172 | 188 | |
173 | 189 | max_link_clock = drm_dp_bw_code_to_link_rate(intel_dp_max_link_bw(intel_dp)); |
174 | - max_lanes = drm_dp_max_lane_count(intel_dp->dpcd); | |
190 | + max_lanes = intel_dp_max_lane_count(intel_dp); | |
175 | 191 | |
176 | 192 | max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); |
177 | 193 | mode_rate = intel_dp_link_required(target_clock, 18); |
178 | 194 | |
... | ... | @@ -751,8 +767,10 @@ |
751 | 767 | struct intel_crtc *intel_crtc = encoder->new_crtc; |
752 | 768 | struct intel_connector *intel_connector = intel_dp->attached_connector; |
753 | 769 | int lane_count, clock; |
754 | - int max_lane_count = drm_dp_max_lane_count(intel_dp->dpcd); | |
770 | + int min_lane_count = 1; | |
771 | + int max_lane_count = intel_dp_max_lane_count(intel_dp); | |
755 | 772 | /* Conveniently, the link BW constants become indices with a shift...*/ |
773 | + int min_clock = 0; | |
756 | 774 | int max_clock = intel_dp_max_link_bw(intel_dp) >> 3; |
757 | 775 | int bpp, mode_rate; |
758 | 776 | static int bws[] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7, DP_LINK_BW_5_4 }; |
759 | 777 | |
... | ... | @@ -785,19 +803,38 @@ |
785 | 803 | /* Walk through all bpp values. Luckily they're all nicely spaced with 2 |
786 | 804 | * bpc in between. */ |
787 | 805 | bpp = pipe_config->pipe_bpp; |
788 | - if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp && | |
789 | - dev_priv->vbt.edp_bpp < bpp) { | |
790 | - DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n", | |
791 | - dev_priv->vbt.edp_bpp); | |
792 | - bpp = dev_priv->vbt.edp_bpp; | |
806 | + if (is_edp(intel_dp)) { | |
807 | + if (dev_priv->vbt.edp_bpp && dev_priv->vbt.edp_bpp < bpp) { | |
808 | + DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n", | |
809 | + dev_priv->vbt.edp_bpp); | |
810 | + bpp = dev_priv->vbt.edp_bpp; | |
811 | + } | |
812 | + | |
813 | + if (IS_BROADWELL(dev)) { | |
814 | + /* Yes, it's an ugly hack. */ | |
815 | + min_lane_count = max_lane_count; | |
816 | + DRM_DEBUG_KMS("forcing lane count to max (%u) on BDW\n", | |
817 | + min_lane_count); | |
818 | + } else if (dev_priv->vbt.edp_lanes) { | |
819 | + min_lane_count = min(dev_priv->vbt.edp_lanes, | |
820 | + max_lane_count); | |
821 | + DRM_DEBUG_KMS("using min %u lanes per VBT\n", | |
822 | + min_lane_count); | |
823 | + } | |
824 | + | |
825 | + if (dev_priv->vbt.edp_rate) { | |
826 | + min_clock = min(dev_priv->vbt.edp_rate >> 3, max_clock); | |
827 | + DRM_DEBUG_KMS("using min %02x link bw per VBT\n", | |
828 | + bws[min_clock]); | |
829 | + } | |
793 | 830 | } |
794 | 831 | |
795 | 832 | for (; bpp >= 6*3; bpp -= 2*3) { |
796 | 833 | mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock, |
797 | 834 | bpp); |
798 | 835 | |
799 | - for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { | |
800 | - for (clock = 0; clock <= max_clock; clock++) { | |
836 | + for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) { | |
837 | + for (clock = min_clock; clock <= max_clock; clock++) { | |
801 | 838 | link_clock = drm_dp_bw_code_to_link_rate(bws[clock]); |
802 | 839 | link_avail = intel_dp_max_data_rate(link_clock, |
803 | 840 | lane_count); |
drivers/gpu/drm/i915/intel_fbdev.c
... | ... | @@ -387,6 +387,15 @@ |
387 | 387 | height); |
388 | 388 | } |
389 | 389 | |
390 | + /* No preferred mode marked by the EDID? Are there any modes? */ | |
391 | + if (!modes[i] && !list_empty(&connector->modes)) { | |
392 | + DRM_DEBUG_KMS("using first mode listed on connector %s\n", | |
393 | + drm_get_connector_name(connector)); | |
394 | + modes[i] = list_first_entry(&connector->modes, | |
395 | + struct drm_display_mode, | |
396 | + head); | |
397 | + } | |
398 | + | |
390 | 399 | /* last resort: use current mode */ |
391 | 400 | if (!modes[i]) { |
392 | 401 | /* |
drivers/gpu/drm/i915/intel_panel.c
... | ... | @@ -492,6 +492,7 @@ |
492 | 492 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
493 | 493 | u32 freq; |
494 | 494 | unsigned long flags; |
495 | + u64 n; | |
495 | 496 | |
496 | 497 | if (!panel->backlight.present || pipe == INVALID_PIPE) |
497 | 498 | return; |
... | ... | @@ -502,10 +503,9 @@ |
502 | 503 | |
503 | 504 | /* scale to hardware max, but be careful to not overflow */ |
504 | 505 | freq = panel->backlight.max; |
505 | - if (freq < max) | |
506 | - level = level * freq / max; | |
507 | - else | |
508 | - level = freq / max * level; | |
506 | + n = (u64)level * freq; | |
507 | + do_div(n, max); | |
508 | + level = n; | |
509 | 509 | |
510 | 510 | panel->backlight.level = level; |
511 | 511 | if (panel->backlight.device) |
drivers/gpu/drm/i915/intel_pm.c
... | ... | @@ -2095,6 +2095,43 @@ |
2095 | 2095 | } |
2096 | 2096 | } |
2097 | 2097 | |
2098 | +static bool ilk_increase_wm_latency(struct drm_i915_private *dev_priv, | |
2099 | + uint16_t wm[5], uint16_t min) | |
2100 | +{ | |
2101 | + int level, max_level = ilk_wm_max_level(dev_priv->dev); | |
2102 | + | |
2103 | + if (wm[0] >= min) | |
2104 | + return false; | |
2105 | + | |
2106 | + wm[0] = max(wm[0], min); | |
2107 | + for (level = 1; level <= max_level; level++) | |
2108 | + wm[level] = max_t(uint16_t, wm[level], DIV_ROUND_UP(min, 5)); | |
2109 | + | |
2110 | + return true; | |
2111 | +} | |
2112 | + | |
2113 | +static void snb_wm_latency_quirk(struct drm_device *dev) | |
2114 | +{ | |
2115 | + struct drm_i915_private *dev_priv = dev->dev_private; | |
2116 | + bool changed; | |
2117 | + | |
2118 | + /* | |
2119 | + * The BIOS provided WM memory latency values are often | |
2120 | + * inadequate for high resolution displays. Adjust them. | |
2121 | + */ | |
2122 | + changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) | | |
2123 | + ilk_increase_wm_latency(dev_priv, dev_priv->wm.spr_latency, 12) | | |
2124 | + ilk_increase_wm_latency(dev_priv, dev_priv->wm.cur_latency, 12); | |
2125 | + | |
2126 | + if (!changed) | |
2127 | + return; | |
2128 | + | |
2129 | + DRM_DEBUG_KMS("WM latency values increased to avoid potential underruns\n"); | |
2130 | + intel_print_wm_latency(dev, "Primary", dev_priv->wm.pri_latency); | |
2131 | + intel_print_wm_latency(dev, "Sprite", dev_priv->wm.spr_latency); | |
2132 | + intel_print_wm_latency(dev, "Cursor", dev_priv->wm.cur_latency); | |
2133 | +} | |
2134 | + | |
2098 | 2135 | static void ilk_setup_wm_latency(struct drm_device *dev) |
2099 | 2136 | { |
2100 | 2137 | struct drm_i915_private *dev_priv = dev->dev_private; |
... | ... | @@ -2112,6 +2149,9 @@ |
2112 | 2149 | intel_print_wm_latency(dev, "Primary", dev_priv->wm.pri_latency); |
2113 | 2150 | intel_print_wm_latency(dev, "Sprite", dev_priv->wm.spr_latency); |
2114 | 2151 | intel_print_wm_latency(dev, "Cursor", dev_priv->wm.cur_latency); |
2152 | + | |
2153 | + if (IS_GEN6(dev)) | |
2154 | + snb_wm_latency_quirk(dev); | |
2115 | 2155 | } |
2116 | 2156 | |
2117 | 2157 | static void ilk_compute_wm_parameters(struct drm_crtc *crtc, |
drivers/gpu/drm/i915/intel_sdvo.c
... | ... | @@ -2424,8 +2424,8 @@ |
2424 | 2424 | if (ret < 0) |
2425 | 2425 | goto err1; |
2426 | 2426 | |
2427 | - ret = sysfs_create_link(&encoder->ddc.dev.kobj, | |
2428 | - &drm_connector->kdev->kobj, | |
2427 | + ret = sysfs_create_link(&drm_connector->kdev->kobj, | |
2428 | + &encoder->ddc.dev.kobj, | |
2429 | 2429 | encoder->ddc.dev.kobj.name); |
2430 | 2430 | if (ret < 0) |
2431 | 2431 | goto err2; |
drivers/gpu/drm/i915/intel_uncore.c
... | ... | @@ -185,6 +185,8 @@ |
185 | 185 | { |
186 | 186 | __raw_i915_write32(dev_priv, FORCEWAKE_VLV, |
187 | 187 | _MASKED_BIT_DISABLE(0xffff)); |
188 | + __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, | |
189 | + _MASKED_BIT_DISABLE(0xffff)); | |
188 | 190 | /* something from same cacheline, but !FORCEWAKE_VLV */ |
189 | 191 | __raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV); |
190 | 192 | } |