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

Configure Feed

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

Merge tag 'drm-intel-next-fixes-2021-07-07' of git://anongit.freedesktop.org/drm/drm-intel into drm-next

One fix targeting stable for display DP VSC, plus DG1 display fix and
a bug fix of IRQs usages and cleanup references to the DRM IRQ midlayer.

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/YOXDp/+CFDgJ2/7f@intel.com

+29 -16
+16 -3
drivers/gpu/drm/i915/display/intel_ddi.c
··· 1791 1791 { 1792 1792 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1793 1793 enum phy phy = intel_port_to_phy(i915, encoder->port); 1794 + enum intel_dpll_id id; 1795 + u32 val; 1794 1796 1795 - return _cnl_ddi_get_pll(i915, DG1_DPCLKA_CFGCR0(phy), 1796 - DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), 1797 - DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)); 1797 + val = intel_de_read(i915, DG1_DPCLKA_CFGCR0(phy)); 1798 + val &= DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy); 1799 + val >>= DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy); 1800 + id = val; 1801 + 1802 + /* 1803 + * _DG1_DPCLKA0_CFGCR0 maps between DPLL 0 and 1 with one bit for phy A 1804 + * and B while _DG1_DPCLKA1_CFGCR0 maps between DPLL 2 and 3 with one 1805 + * bit for phy C and D. 1806 + */ 1807 + if (phy >= PHY_C) 1808 + id += DPLL_ID_DG1_DPLL2; 1809 + 1810 + return intel_get_shared_dpll_by_id(i915, id); 1798 1811 } 1799 1812 1800 1813 static void icl_ddi_combo_enable_clock(struct intel_encoder *encoder,
+1 -1
drivers/gpu/drm/i915/display/intel_dp.c
··· 2868 2868 if (size < sizeof(struct dp_sdp)) 2869 2869 return -EINVAL; 2870 2870 2871 - memset(vsc, 0, size); 2871 + memset(vsc, 0, sizeof(*vsc)); 2872 2872 2873 2873 if (sdp->sdp_header.HB0 != 0) 2874 2874 return -EINVAL;
+1 -1
drivers/gpu/drm/i915/gt/intel_engine_cs.c
··· 1279 1279 return true; 1280 1280 1281 1281 /* Waiting to drain ELSP? */ 1282 - synchronize_hardirq(to_pci_dev(engine->i915->drm.dev)->irq); 1282 + intel_synchronize_hardirq(engine->i915); 1283 1283 intel_engine_flush_submission(engine); 1284 1284 1285 1285 /* ELSP is empty, but there are ready requests? E.g. after reset */
+5 -2
drivers/gpu/drm/i915/gt/intel_ring_submission.c
··· 184 184 ENGINE_TRACE(engine, "ring:{HEAD:%04x, TAIL:%04x}\n", 185 185 ring->head, ring->tail); 186 186 187 - /* Double check the ring is empty & disabled before we resume */ 188 - synchronize_hardirq(engine->i915->drm.irq); 187 + /* 188 + * Double check the ring is empty & disabled before we resume. Called 189 + * from atomic context during PCI probe, so _hardirq(). 190 + */ 191 + intel_synchronize_hardirq(engine->i915); 189 192 if (!stop_ring(engine)) 190 193 goto err; 191 194
-1
drivers/gpu/drm/i915/i915_drv.c
··· 42 42 #include <drm/drm_aperture.h> 43 43 #include <drm/drm_atomic_helper.h> 44 44 #include <drm/drm_ioctl.h> 45 - #include <drm/drm_irq.h> 46 45 #include <drm/drm_managed.h> 47 46 #include <drm/drm_probe_helper.h> 48 47
+5 -5
drivers/gpu/drm/i915/i915_irq.c
··· 33 33 #include <linux/sysrq.h> 34 34 35 35 #include <drm/drm_drv.h> 36 - #include <drm/drm_irq.h> 37 36 38 37 #include "display/intel_de.h" 39 38 #include "display/intel_display_types.h" ··· 4563 4564 4564 4565 bool intel_irqs_enabled(struct drm_i915_private *dev_priv) 4565 4566 { 4566 - /* 4567 - * We only use drm_irq_uninstall() at unload and VT switch, so 4568 - * this is the only thing we need to check. 4569 - */ 4570 4567 return dev_priv->runtime_pm.irqs_enabled; 4571 4568 } 4572 4569 4573 4570 void intel_synchronize_irq(struct drm_i915_private *i915) 4574 4571 { 4575 4572 synchronize_irq(to_pci_dev(i915->drm.dev)->irq); 4573 + } 4574 + 4575 + void intel_synchronize_hardirq(struct drm_i915_private *i915) 4576 + { 4577 + synchronize_hardirq(to_pci_dev(i915->drm.dev)->irq); 4576 4578 }
+1
drivers/gpu/drm/i915/i915_irq.h
··· 94 94 void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); 95 95 bool intel_irqs_enabled(struct drm_i915_private *dev_priv); 96 96 void intel_synchronize_irq(struct drm_i915_private *i915); 97 + void intel_synchronize_hardirq(struct drm_i915_private *i915); 97 98 98 99 int intel_get_crtc_scanline(struct intel_crtc *crtc); 99 100 void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
-3
drivers/gpu/drm/i915/i915_reg.h
··· 10513 10513 #define _DG1_DPCLKA1_CFGCR0 0x16C280 10514 10514 #define _DG1_DPCLKA_PHY_IDX(phy) ((phy) % 2) 10515 10515 #define _DG1_DPCLKA_PLL_IDX(pll) ((pll) % 2) 10516 - #define _DG1_PHY_DPLL_MAP(phy) ((phy) >= PHY_C ? DPLL_ID_DG1_DPLL2 : DPLL_ID_DG1_DPLL0) 10517 10516 #define DG1_DPCLKA_CFGCR0(phy) _MMIO_PHY((phy) / 2, \ 10518 10517 _DG1_DPCLKA_CFGCR0, \ 10519 10518 _DG1_DPCLKA1_CFGCR0) ··· 10520 10521 #define DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy) (_DG1_DPCLKA_PHY_IDX(phy) * 2) 10521 10522 #define DG1_DPCLKA_CFGCR0_DDI_CLK_SEL(pll, phy) (_DG1_DPCLKA_PLL_IDX(pll) << DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)) 10522 10523 #define DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy) (0x3 << DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)) 10523 - #define DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_DPLL_MAP(clk_sel, phy) \ 10524 - (((clk_sel) >> DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)) + _DG1_PHY_DPLL_MAP(phy)) 10525 10524 10526 10525 /* ADLS Clocks */ 10527 10526 #define _ADLS_DPCLKA_CFGCR0 0x164280