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

drm/i915/icl: Fix DDI/TC port clk_off bits

DDI/TC clock-off bits are not equally distanced. TC1-3 bits are
from offset 12 & TC4 is at offset 21.
Create a function to choose correct clk-off bit.

v2: Add fixes tag (Lucas)

Fixes: c27e917e2bda ("drm/i915/icl: add basic support for the ICL clocks")
Signed-off-by: Mahesh Kumar <mahesh1.kumar@intel.com>
Signed-off-by: Vandita Kulkarni <vandita.kulkarni@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181016023752.9285-1-lucas.demarchi@intel.com

authored by

Mahesh Kumar and committed by
Rodrigo Vivi
bb1c7edc 4e53840f

+21 -3
+3
drivers/gpu/drm/i915/i915_reg.h
··· 9319 9319 #define DPCLKA_CFGCR0_ICL _MMIO(0x164280) 9320 9320 #define DPCLKA_CFGCR0_DDI_CLK_OFF(port) (1 << ((port) == PORT_F ? 23 : \ 9321 9321 (port) + 10)) 9322 + #define ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(port) (1 << ((port) + 10)) 9323 + #define ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port) (1 << ((tc_port) == PORT_TC4 ? \ 9324 + 21 : (tc_port) + 12)) 9322 9325 #define DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port) ((port) == PORT_F ? 21 : \ 9323 9326 (port) * 2) 9324 9327 #define DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port) (3 << DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port))
+18 -3
drivers/gpu/drm/i915/intel_ddi.c
··· 2740 2740 return DDI_BUF_TRANS_SELECT(level); 2741 2741 } 2742 2742 2743 + static inline 2744 + uint32_t icl_dpclka_cfgcr0_clk_off(struct drm_i915_private *dev_priv, 2745 + enum port port) 2746 + { 2747 + if (intel_port_is_combophy(dev_priv, port)) { 2748 + return ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(port); 2749 + } else if (intel_port_is_tc(dev_priv, port)) { 2750 + enum tc_port tc_port = intel_port_to_tc(dev_priv, port); 2751 + 2752 + return ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port); 2753 + } 2754 + 2755 + return 0; 2756 + } 2757 + 2743 2758 void icl_map_plls_to_ports(struct drm_crtc *crtc, 2744 2759 struct intel_crtc_state *crtc_state, 2745 2760 struct drm_atomic_state *old_state) ··· 2778 2763 mutex_lock(&dev_priv->dpll_lock); 2779 2764 2780 2765 val = I915_READ(DPCLKA_CFGCR0_ICL); 2781 - WARN_ON((val & DPCLKA_CFGCR0_DDI_CLK_OFF(port)) == 0); 2766 + WARN_ON((val & icl_dpclka_cfgcr0_clk_off(dev_priv, port)) == 0); 2782 2767 2783 2768 if (intel_port_is_combophy(dev_priv, port)) { 2784 2769 val &= ~DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port); ··· 2787 2772 POSTING_READ(DPCLKA_CFGCR0_ICL); 2788 2773 } 2789 2774 2790 - val &= ~DPCLKA_CFGCR0_DDI_CLK_OFF(port); 2775 + val &= ~icl_dpclka_cfgcr0_clk_off(dev_priv, port); 2791 2776 I915_WRITE(DPCLKA_CFGCR0_ICL, val); 2792 2777 2793 2778 mutex_unlock(&dev_priv->dpll_lock); ··· 2815 2800 mutex_lock(&dev_priv->dpll_lock); 2816 2801 I915_WRITE(DPCLKA_CFGCR0_ICL, 2817 2802 I915_READ(DPCLKA_CFGCR0_ICL) | 2818 - DPCLKA_CFGCR0_DDI_CLK_OFF(port)); 2803 + icl_dpclka_cfgcr0_clk_off(dev_priv, port)); 2819 2804 mutex_unlock(&dev_priv->dpll_lock); 2820 2805 } 2821 2806 }