diff options
| author | Dave Airlie <airlied@redhat.com> | 2018-10-19 00:28:10 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2018-10-19 00:28:11 -0400 |
| commit | f2bfc71aee75feff33ca659322b72ffeed5a243d (patch) | |
| tree | d0a2685e9f70d09a67795070a7dbb5fbeaa0f9fd /drivers/gpu/drm | |
| parent | c13bbf4a78aafed144de0250a3c71265672c9bda (diff) | |
| parent | 835fe6d75d14c1513910ed7f5665127fee12acc8 (diff) | |
Merge tag 'drm-intel-next-fixes-2018-10-18' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
- Fix GPU hang on MacBook2,1 when booting in EFI mode (Bugzilla #105637)
- Fix garbled console on Y tiled BIOS framebuffer configs (Bugzilla #108264)
- Fix black screen on certain eDP panels eg. Dell XPS 9350 (Bugzilla #107489 and #105338)
- MST fixes that Rodrigo dropped from drm-intel-fixes and bunch of Icelake fixes
- Then assorted proactive code fixes caught by CI or developers
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181018165725.GA2281@jlahtine-desk.ger.corp.intel.com
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_csr.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 36 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 151 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp_link_training.c | 26 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 41 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sprite.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/selftests/i915_gem_object.c | 3 |
12 files changed, 227 insertions, 104 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index b4744a68cd88..4f3ac0a12889 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -4189,7 +4189,7 @@ i915_drop_caches_set(void *data, u64 val) | |||
| 4189 | I915_WAIT_LOCKED, | 4189 | I915_WAIT_LOCKED, |
| 4190 | MAX_SCHEDULE_TIMEOUT); | 4190 | MAX_SCHEDULE_TIMEOUT); |
| 4191 | 4191 | ||
| 4192 | if (val & DROP_RESET_SEQNO) { | 4192 | if (ret == 0 && val & DROP_RESET_SEQNO) { |
| 4193 | intel_runtime_pm_get(i915); | 4193 | intel_runtime_pm_get(i915); |
| 4194 | ret = i915_gem_set_global_seqno(&i915->drm, 1); | 4194 | ret = i915_gem_set_global_seqno(&i915->drm, 1); |
| 4195 | intel_runtime_pm_put(i915); | 4195 | intel_runtime_pm_put(i915); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index db9688d14912..aa3969d52773 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1127,11 +1127,7 @@ i915_gem_shmem_pread(struct drm_i915_gem_object *obj, | |||
| 1127 | offset = offset_in_page(args->offset); | 1127 | offset = offset_in_page(args->offset); |
| 1128 | for (idx = args->offset >> PAGE_SHIFT; remain; idx++) { | 1128 | for (idx = args->offset >> PAGE_SHIFT; remain; idx++) { |
| 1129 | struct page *page = i915_gem_object_get_page(obj, idx); | 1129 | struct page *page = i915_gem_object_get_page(obj, idx); |
| 1130 | int length; | 1130 | unsigned int length = min_t(u64, remain, PAGE_SIZE - offset); |
| 1131 | |||
| 1132 | length = remain; | ||
| 1133 | if (offset + length > PAGE_SIZE) | ||
| 1134 | length = PAGE_SIZE - offset; | ||
| 1135 | 1131 | ||
| 1136 | ret = shmem_pread(page, offset, length, user_data, | 1132 | ret = shmem_pread(page, offset, length, user_data, |
| 1137 | page_to_phys(page) & obj_do_bit17_swizzling, | 1133 | page_to_phys(page) & obj_do_bit17_swizzling, |
| @@ -1575,11 +1571,7 @@ i915_gem_shmem_pwrite(struct drm_i915_gem_object *obj, | |||
| 1575 | offset = offset_in_page(args->offset); | 1571 | offset = offset_in_page(args->offset); |
| 1576 | for (idx = args->offset >> PAGE_SHIFT; remain; idx++) { | 1572 | for (idx = args->offset >> PAGE_SHIFT; remain; idx++) { |
| 1577 | struct page *page = i915_gem_object_get_page(obj, idx); | 1573 | struct page *page = i915_gem_object_get_page(obj, idx); |
| 1578 | int length; | 1574 | unsigned int length = min_t(u64, remain, PAGE_SIZE - offset); |
| 1579 | |||
| 1580 | length = remain; | ||
| 1581 | if (offset + length > PAGE_SIZE) | ||
| 1582 | length = PAGE_SIZE - offset; | ||
| 1583 | 1575 | ||
| 1584 | ret = shmem_pwrite(page, offset, length, user_data, | 1576 | ret = shmem_pwrite(page, offset, length, user_data, |
| 1585 | page_to_phys(page) & obj_do_bit17_swizzling, | 1577 | page_to_phys(page) & obj_do_bit17_swizzling, |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 4948b352bf4c..7c491ea3d052 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -9339,6 +9339,9 @@ enum skl_power_gate { | |||
| 9339 | #define DPCLKA_CFGCR0_ICL _MMIO(0x164280) | 9339 | #define DPCLKA_CFGCR0_ICL _MMIO(0x164280) |
| 9340 | #define DPCLKA_CFGCR0_DDI_CLK_OFF(port) (1 << ((port) == PORT_F ? 23 : \ | 9340 | #define DPCLKA_CFGCR0_DDI_CLK_OFF(port) (1 << ((port) == PORT_F ? 23 : \ |
| 9341 | (port) + 10)) | 9341 | (port) + 10)) |
| 9342 | #define ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(port) (1 << ((port) + 10)) | ||
| 9343 | #define ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port) (1 << ((tc_port) == PORT_TC4 ? \ | ||
| 9344 | 21 : (tc_port) + 12)) | ||
| 9342 | #define DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port) ((port) == PORT_F ? 21 : \ | 9345 | #define DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port) ((port) == PORT_F ? 21 : \ |
| 9343 | (port) * 2) | 9346 | (port) * 2) |
| 9344 | #define DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port) (3 << DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port)) | 9347 | #define DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port) (3 << DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port)) |
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c index 4aa8f3d6b64c..d48186e9ddad 100644 --- a/drivers/gpu/drm/i915/intel_csr.c +++ b/drivers/gpu/drm/i915/intel_csr.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | */ | 35 | */ |
| 36 | 36 | ||
| 37 | #define I915_CSR_ICL "i915/icl_dmc_ver1_07.bin" | 37 | #define I915_CSR_ICL "i915/icl_dmc_ver1_07.bin" |
| 38 | MODULE_FIRMWARE(I915_CSR_ICL); | ||
| 38 | #define ICL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7) | 39 | #define ICL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7) |
| 39 | 40 | ||
| 40 | #define I915_CSR_GLK "i915/glk_dmc_ver1_04.bin" | 41 | #define I915_CSR_GLK "i915/glk_dmc_ver1_04.bin" |
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index b6910c8b4e08..5186cd7075f9 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
| @@ -916,7 +916,7 @@ static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port por | |||
| 916 | level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; | 916 | level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift; |
| 917 | 917 | ||
| 918 | if (IS_ICELAKE(dev_priv)) { | 918 | if (IS_ICELAKE(dev_priv)) { |
| 919 | if (port == PORT_A || port == PORT_B) | 919 | if (intel_port_is_combophy(dev_priv, port)) |
| 920 | icl_get_combo_buf_trans(dev_priv, port, | 920 | icl_get_combo_buf_trans(dev_priv, port, |
| 921 | INTEL_OUTPUT_HDMI, &n_entries); | 921 | INTEL_OUTPUT_HDMI, &n_entries); |
| 922 | else | 922 | else |
| @@ -1535,7 +1535,7 @@ static void icl_ddi_clock_get(struct intel_encoder *encoder, | |||
| 1535 | uint32_t pll_id; | 1535 | uint32_t pll_id; |
| 1536 | 1536 | ||
| 1537 | pll_id = intel_get_shared_dpll_id(dev_priv, pipe_config->shared_dpll); | 1537 | pll_id = intel_get_shared_dpll_id(dev_priv, pipe_config->shared_dpll); |
| 1538 | if (port == PORT_A || port == PORT_B) { | 1538 | if (intel_port_is_combophy(dev_priv, port)) { |
| 1539 | if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI)) | 1539 | if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI)) |
| 1540 | link_clock = cnl_calc_wrpll_link(dev_priv, pll_id); | 1540 | link_clock = cnl_calc_wrpll_link(dev_priv, pll_id); |
| 1541 | else | 1541 | else |
| @@ -2235,7 +2235,7 @@ u8 intel_ddi_dp_voltage_max(struct intel_encoder *encoder) | |||
| 2235 | int n_entries; | 2235 | int n_entries; |
| 2236 | 2236 | ||
| 2237 | if (IS_ICELAKE(dev_priv)) { | 2237 | if (IS_ICELAKE(dev_priv)) { |
| 2238 | if (port == PORT_A || port == PORT_B) | 2238 | if (intel_port_is_combophy(dev_priv, port)) |
| 2239 | icl_get_combo_buf_trans(dev_priv, port, encoder->type, | 2239 | icl_get_combo_buf_trans(dev_priv, port, encoder->type, |
| 2240 | &n_entries); | 2240 | &n_entries); |
| 2241 | else | 2241 | else |
| @@ -2669,9 +2669,10 @@ static void icl_ddi_vswing_sequence(struct intel_encoder *encoder, | |||
| 2669 | u32 level, | 2669 | u32 level, |
| 2670 | enum intel_output_type type) | 2670 | enum intel_output_type type) |
| 2671 | { | 2671 | { |
| 2672 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | ||
| 2672 | enum port port = encoder->port; | 2673 | enum port port = encoder->port; |
| 2673 | 2674 | ||
| 2674 | if (port == PORT_A || port == PORT_B) | 2675 | if (intel_port_is_combophy(dev_priv, port)) |
| 2675 | icl_combo_phy_ddi_vswing_sequence(encoder, level, type); | 2676 | icl_combo_phy_ddi_vswing_sequence(encoder, level, type); |
| 2676 | else | 2677 | else |
| 2677 | icl_mg_phy_ddi_vswing_sequence(encoder, link_clock, level); | 2678 | icl_mg_phy_ddi_vswing_sequence(encoder, link_clock, level); |
| @@ -2732,6 +2733,21 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp) | |||
| 2732 | return DDI_BUF_TRANS_SELECT(level); | 2733 | return DDI_BUF_TRANS_SELECT(level); |
| 2733 | } | 2734 | } |
| 2734 | 2735 | ||
| 2736 | static inline | ||
| 2737 | uint32_t icl_dpclka_cfgcr0_clk_off(struct drm_i915_private *dev_priv, | ||
| 2738 | enum port port) | ||
| 2739 | { | ||
| 2740 | if (intel_port_is_combophy(dev_priv, port)) { | ||
| 2741 | return ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(port); | ||
| 2742 | } else if (intel_port_is_tc(dev_priv, port)) { | ||
| 2743 | enum tc_port tc_port = intel_port_to_tc(dev_priv, port); | ||
| 2744 | |||
| 2745 | return ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port); | ||
| 2746 | } | ||
| 2747 | |||
| 2748 | return 0; | ||
| 2749 | } | ||
| 2750 | |||
| 2735 | void icl_map_plls_to_ports(struct drm_crtc *crtc, | 2751 | void icl_map_plls_to_ports(struct drm_crtc *crtc, |
| 2736 | struct intel_crtc_state *crtc_state, | 2752 | struct intel_crtc_state *crtc_state, |
| 2737 | struct drm_atomic_state *old_state) | 2753 | struct drm_atomic_state *old_state) |
| @@ -2755,16 +2771,16 @@ void icl_map_plls_to_ports(struct drm_crtc *crtc, | |||
| 2755 | mutex_lock(&dev_priv->dpll_lock); | 2771 | mutex_lock(&dev_priv->dpll_lock); |
| 2756 | 2772 | ||
| 2757 | val = I915_READ(DPCLKA_CFGCR0_ICL); | 2773 | val = I915_READ(DPCLKA_CFGCR0_ICL); |
| 2758 | WARN_ON((val & DPCLKA_CFGCR0_DDI_CLK_OFF(port)) == 0); | 2774 | WARN_ON((val & icl_dpclka_cfgcr0_clk_off(dev_priv, port)) == 0); |
| 2759 | 2775 | ||
| 2760 | if (port == PORT_A || port == PORT_B) { | 2776 | if (intel_port_is_combophy(dev_priv, port)) { |
| 2761 | val &= ~DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port); | 2777 | val &= ~DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port); |
| 2762 | val |= DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, port); | 2778 | val |= DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, port); |
| 2763 | I915_WRITE(DPCLKA_CFGCR0_ICL, val); | 2779 | I915_WRITE(DPCLKA_CFGCR0_ICL, val); |
| 2764 | POSTING_READ(DPCLKA_CFGCR0_ICL); | 2780 | POSTING_READ(DPCLKA_CFGCR0_I |
