diff options
author | Dave Airlie <airlied@redhat.com> | 2016-11-09 17:37:01 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-11-09 17:37:01 -0500 |
commit | cf532232c32ae9be2bf2c299f50e61d67700229f (patch) | |
tree | 962c877e7594dcbbbe2870d7a71969f0cbdcd2ec | |
parent | 020a0bbc0d89c15693e69ed2063584ef7ec2d811 (diff) | |
parent | 54905ab5fe7aa453610e31cec640e528aaedb2e2 (diff) |
Merge tag 'drm-intel-fixes-2016-11-09' of git://anongit.freedesktop.org/drm-intel into drm-fixes
i915 fixes, include Sandybridge rendering regression fix.
* tag 'drm-intel-fixes-2016-11-09' of git://anongit.freedesktop.org/drm-intel:
drm/i915: Limit Valleyview and earlier to only using mappable scanout
drm/i915: Round tile chunks up for constructing partial VMAs
drm/i915/dp: Extend BDW DP audio workaround to GEN9 platforms
drm/i915/dp: BDW cdclk fix for DP audio
drm/i915/vlv: Prevent enabling hpd polling in late suspend
drm/i915: Respect alternate_ddc_pin for all DDI ports
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 84 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 4 |
4 files changed, 94 insertions, 43 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 23960de81b57..91ab7e9d6d2e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -1806,7 +1806,7 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf) | |||
1806 | /* Use a partial view if it is bigger than available space */ | 1806 | /* Use a partial view if it is bigger than available space */ |
1807 | chunk_size = MIN_CHUNK_PAGES; | 1807 | chunk_size = MIN_CHUNK_PAGES; |
1808 | if (i915_gem_object_is_tiled(obj)) | 1808 | if (i915_gem_object_is_tiled(obj)) |
1809 | chunk_size = max(chunk_size, tile_row_pages(obj)); | 1809 | chunk_size = roundup(chunk_size, tile_row_pages(obj)); |
1810 | 1810 | ||
1811 | memset(&view, 0, sizeof(view)); | 1811 | memset(&view, 0, sizeof(view)); |
1812 | view.type = I915_GGTT_VIEW_PARTIAL; | 1812 | view.type = I915_GGTT_VIEW_PARTIAL; |
@@ -3543,8 +3543,22 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, | |||
3543 | if (view->type == I915_GGTT_VIEW_NORMAL) | 3543 | if (view->type == I915_GGTT_VIEW_NORMAL) |
3544 | vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, | 3544 | vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, |
3545 | PIN_MAPPABLE | PIN_NONBLOCK); | 3545 | PIN_MAPPABLE | PIN_NONBLOCK); |
3546 | if (IS_ERR(vma)) | 3546 | if (IS_ERR(vma)) { |
3547 | vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, 0); | 3547 | struct drm_i915_private *i915 = to_i915(obj->base.dev); |
3548 | unsigned int flags; | ||
3549 | |||
3550 | /* Valleyview is definitely limited to scanning out the first | ||
3551 | * 512MiB. Lets presume this behaviour was inherited from the | ||
3552 | * g4x display engine and that all earlier gen are similarly | ||
3553 | * limited. Testing suggests that it is a little more | ||
3554 | * complicated than this. For example, Cherryview appears quite | ||
3555 | * happy to scanout from anywhere within its global aperture. | ||
3556 | */ | ||
3557 | flags = 0; | ||
3558 | if (HAS_GMCH_DISPLAY(i915)) | ||
3559 | flags = PIN_MAPPABLE; | ||
3560 | vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, flags); | ||
3561 | } | ||
3548 | if (IS_ERR(vma)) | 3562 | if (IS_ERR(vma)) |
3549 | goto err_unpin_display; | 3563 | goto err_unpin_display; |
3550 | 3564 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 0ad1879bfd9d..81c11499bcf0 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -10243,6 +10243,29 @@ static void bxt_modeset_commit_cdclk(struct drm_atomic_state *old_state) | |||
10243 | bxt_set_cdclk(to_i915(dev), req_cdclk); | 10243 | bxt_set_cdclk(to_i915(dev), req_cdclk); |
10244 | } | 10244 | } |
10245 | 10245 | ||
10246 | static int bdw_adjust_min_pipe_pixel_rate(struct intel_crtc_state *crtc_state, | ||
10247 | int pixel_rate) | ||
10248 | { | ||
10249 | struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev); | ||
10250 | |||
10251 | /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ | ||
10252 | if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled) | ||
10253 | pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95); | ||
10254 | |||
10255 | /* BSpec says "Do not use DisplayPort with CDCLK less than | ||
10256 | * 432 MHz, audio enabled, port width x4, and link rate | ||
10257 | * HBR2 (5.4 GHz), or else there may be audio corruption or | ||
10258 | * screen corruption." | ||
10259 | */ | ||
10260 | if (intel_crtc_has_dp_encoder(crtc_state) && | ||
10261 | crtc_state->has_audio && | ||
10262 | crtc_state->port_clock >= 540000 && | ||
10263 | crtc_state->lane_count == 4) | ||
10264 | pixel_rate = max(432000, pixel_rate); | ||
10265 | |||
10266 | return pixel_rate; | ||
10267 | } | ||
10268 | |||
10246 | /* compute the max rate for new configuration */ | 10269 | /* compute the max rate for new configuration */ |
10247 | static int ilk_max_pixel_rate(struct drm_atomic_state *state) | 10270 | static int ilk_max_pixel_rate(struct drm_atomic_state *state) |
10248 | { | 10271 | { |
@@ -10268,9 +10291,9 @@ static int ilk_max_pixel_rate(struct drm_atomic_state *state) | |||
10268 | 10291 | ||
10269 | pixel_rate = ilk_pipe_pixel_rate(crtc_state); | 10292 | pixel_rate = ilk_pipe_pixel_rate(crtc_state); |
10270 | 10293 | ||
10271 | /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ | 10294 | if (IS_BROADWELL(dev_priv) || IS_GEN9(dev_priv)) |
10272 | if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled) | 10295 | pixel_rate = bdw_adjust_min_pipe_pixel_rate(crtc_state, |
10273 | pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95); | 10296 | pixel_rate); |
10274 | 10297 | ||
10275 | intel_state->min_pixclk[i] = pixel_rate; | 10298 | intel_state->min_pixclk[i] = pixel_rate; |
10276 | } | 10299 | } |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index f40a35f2913a..13c306173f27 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -1799,6 +1799,50 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c | |||
1799 | intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE; | 1799 | intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE; |
1800 | } | 1800 | } |
1801 | 1801 | ||
1802 | static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv, | ||
1803 | enum port port) | ||
1804 | { | ||
1805 | const struct ddi_vbt_port_info *info = | ||
1806 | &dev_priv->vbt.ddi_port_info[port]; | ||
1807 | u8 ddc_pin; | ||
1808 | |||
1809 | if (info->alternate_ddc_pin) { | ||
1810 | DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (VBT)\n", | ||
1811 | info->alternate_ddc_pin, port_name(port)); | ||
1812 | return info->alternate_ddc_pin; | ||
1813 | } | ||
1814 | |||
1815 | switch (port) { | ||
1816 | case PORT_B: | ||
1817 | if (IS_BROXTON(dev_priv)) | ||
1818 | ddc_pin = GMBUS_PIN_1_BXT; | ||
1819 | else | ||
1820 | ddc_pin = GMBUS_PIN_DPB; | ||
1821 | break; | ||
1822 | case PORT_C: | ||
1823 | if (IS_BROXTON(dev_priv)) | ||
1824 | ddc_pin = GMBUS_PIN_2_BXT; | ||
1825 | else | ||
1826 | ddc_pin = GMBUS_PIN_DPC; | ||
1827 | break; | ||
1828 | case PORT_D: | ||
1829 | if (IS_CHERRYVIEW(dev_priv)) | ||
1830 | ddc_pin = GMBUS_PIN_DPD_CHV; | ||
1831 | else | ||
1832 | ddc_pin = GMBUS_PIN_DPD; | ||
1833 | break; | ||
1834 | default: | ||
1835 | MISSING_CASE(port); | ||
1836 | ddc_pin = GMBUS_PIN_DPB; | ||
1837 | break; | ||
1838 | } | ||
1839 | |||
1840 | DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (platform default)\n", | ||
1841 | ddc_pin, port_name(port)); | ||
1842 | |||
1843 | return ddc_pin; | ||
1844 | } | ||
1845 | |||
1802 | void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | 1846 | void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, |
1803 | struct intel_connector *intel_connector) | 1847 | struct intel_connector *intel_connector) |
1804 | { | 1848 | { |
@@ -1808,7 +1852,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | |||
1808 | struct drm_device *dev = intel_encoder->base.dev; | 1852 | struct drm_device *dev = intel_encoder->base.dev; |
1809 | struct drm_i915_private *dev_priv = to_i915(dev); | 1853 | struct drm_i915_private *dev_priv = to_i915(dev); |
1810 | enum port port = intel_dig_port->port; | 1854 | enum port port = intel_dig_port->port; |
1811 | uint8_t alternate_ddc_pin; | ||
1812 | 1855 | ||
1813 | DRM_DEBUG_KMS("Adding HDMI connector on port %c\n", | 1856 | DRM_DEBUG_KMS("Adding HDMI connector on port %c\n", |
1814 | port_name(port)); | 1857 | port_name(port)); |
@@ -1826,12 +1869,10 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | |||
1826 | connector->doublescan_allowed = 0; | 1869 | connector->doublescan_allowed = 0; |
1827 | connector->stereo_allowed = 1; | 1870 | connector->stereo_allowed = 1; |
1828 | 1871 | ||
1872 | intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port); | ||
1873 | |||
1829 | switch (port) { | 1874 | switch (port) { |
1830 | case PORT_B: | 1875 | case PORT_B: |
1831 | if (IS_BROXTON(dev_priv)) | ||
1832 | intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT; | ||
1833 | else | ||
1834 | intel_hdmi->ddc_bus = GMBUS_PIN_DPB; | ||
1835 | /* | 1876 | /* |
1836 | * On BXT A0/A1, sw needs to activate DDIA HPD logic and | 1877 | * On BXT A0/A1, sw needs to activate DDIA HPD logic and |
1837 | * interrupts to check the external panel connection. | 1878 | * interrupts to check the external panel connection. |
@@ -1842,46 +1883,17 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, | |||
1842 | intel_encoder->hpd_pin = HPD_PORT_B; | 1883 | intel_encoder->hpd_pin = HPD_PORT_B; |
1843 | break; | 1884 | break; |
1844 | case PORT_C: | 1885 | case PORT_C: |
1845 | if (IS_BROXTON(dev_priv)) | ||
1846 | intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT; | ||
1847 | else | ||
1848 | intel_hdmi->ddc_bus = GMBUS_PIN_DPC; | ||
1849 | intel_encoder->hpd_pin = HPD_PORT_C; | 1886 | intel_encoder->hpd_pin = HPD_PORT_C; |
1850 | break; | 1887 | break; |
1851 | case PORT_D: | 1888 | case PORT_D: |
1852 | if (WARN_ON(IS_BROXTON(dev_priv))) | ||
1853 | intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED; | ||
1854 | else if (IS_CHERRYVIEW(dev_priv)) | ||
1855 | intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV; | ||
1856 | else | ||
1857 | intel_hdmi->ddc_bus = GMBUS_PIN_DPD; | ||
1858 | intel_encoder->hpd_pin = HPD_PORT_D; | 1889 | intel_encoder->hpd_pin = HPD_PORT_D; |
1859 | break; | 1890 | break; |
1860 | case PORT_E: | 1891 | case PORT_E: |
1861 | /* On SKL PORT E doesn't have seperate GMBUS pin | ||
1862 | * We rely on VBT to set a proper alternate GMBUS pin. */ | ||
1863 | alternate_ddc_pin = | ||
1864 | dev_priv->vbt.ddi_port_info[PORT_E].alternate_ddc_pin; | ||
1865 | switch (alternate_ddc_pin) { | ||
1866 | case DDC_PIN_B: | ||
1867 | intel_hdmi->ddc_bus = GMBUS_PIN_DPB; | ||
1868 | break; | ||
1869 | case DDC_PIN_C: | ||
1870 | intel_hdmi->ddc_bus = GMBUS_PIN_DPC; | ||
1871 | break; | ||
1872 | case DDC_PIN_D: | ||
1873 | intel_hdmi->ddc_bus = GMBUS_PIN_DPD; | ||
1874 | break; | ||
1875 | default: | ||
1876 | MISSING_CASE(alternate_ddc_pin); | ||
1877 | } | ||
1878 | intel_encoder->hpd_pin = HPD_PORT_E; | 1892 | intel_encoder->hpd_pin = HPD_PORT_E; |
1879 | break; | 1893 | break; |
1880 | case PORT_A: | ||
1881 | intel_encoder->hpd_pin = HPD_PORT_A; | ||
1882 | /* Internal port only for eDP. */ | ||
1883 | default: | 1894 | default: |
1884 | BUG(); | 1895 | MISSING_CASE(port); |
1896 | return; | ||
1885 | } | 1897 | } |
1886 | 1898 | ||
1887 | if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { | 1899 | if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { |
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 6c11168facd6..a38c2fefe85a 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -1139,7 +1139,9 @@ static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv) | |||
1139 | 1139 | ||
1140 | intel_power_sequencer_reset(dev_priv); | 1140 | intel_power_sequencer_reset(dev_priv); |
1141 | 1141 | ||
1142 | intel_hpd_poll_init(dev_priv); | 1142 | /* Prevent us from re-enabling polling on accident in late suspend */ |
1143 | if (!dev_priv->drm.dev->power.is_suspended) | ||
1144 | intel_hpd_poll_init(dev_priv); | ||
1143 | } | 1145 | } |
1144 | 1146 | ||
1145 | static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, | 1147 | static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, |