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

drm/i915/rkl: Don't try to access transcoder D

There are a couple places in our driver that loop over transcoders A..D
for gen11+; since RKL only has three pipes/transcoders, this can lead to
unclaimed register reads/writes. We should add checks for transcoder
existence where appropriate.

v2: Move one transcoder check that wound up in the wrong function after
conflict resolution. It belongs in bdw_get_trans_port_sync_config
rather than bxt_get_dsi_transcoder_state.

v3: Switch loops to use for_each_cpu_transcoder_masked() since this
iterator already checks the platform's transcoder mask for us.
(Ville)

Cc: Aditya Swarup <aditya.swarup@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200603211529.3005059-10-matthew.d.roper@intel.com
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

+6 -2
+6 -2
drivers/gpu/drm/i915/i915_irq.c
··· 2872 2872 { 2873 2873 struct intel_uncore *uncore = &dev_priv->uncore; 2874 2874 enum pipe pipe; 2875 + u32 trans_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | 2876 + BIT(TRANSCODER_C) | BIT(TRANSCODER_D); 2875 2877 2876 2878 intel_uncore_write(uncore, GEN11_DISPLAY_INT_CTL, 0); 2877 2879 2878 2880 if (INTEL_GEN(dev_priv) >= 12) { 2879 2881 enum transcoder trans; 2880 2882 2881 - for (trans = TRANSCODER_A; trans <= TRANSCODER_D; trans++) { 2883 + for_each_cpu_transcoder_masked(dev_priv, trans, trans_mask) { 2882 2884 enum intel_display_power_domain domain; 2883 2885 2884 2886 domain = POWER_DOMAIN_TRANSCODER(trans); ··· 3402 3400 u32 de_port_masked = gen8_de_port_aux_mask(dev_priv); 3403 3401 u32 de_port_enables; 3404 3402 u32 de_misc_masked = GEN8_DE_EDP_PSR; 3403 + u32 trans_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | 3404 + BIT(TRANSCODER_C) | BIT(TRANSCODER_D); 3405 3405 enum pipe pipe; 3406 3406 3407 3407 if (INTEL_GEN(dev_priv) <= 10) ··· 3424 3420 if (INTEL_GEN(dev_priv) >= 12) { 3425 3421 enum transcoder trans; 3426 3422 3427 - for (trans = TRANSCODER_A; trans <= TRANSCODER_D; trans++) { 3423 + for_each_cpu_transcoder_masked(dev_priv, trans, trans_mask) { 3428 3424 enum intel_display_power_domain domain; 3429 3425 3430 3426 domain = POWER_DOMAIN_TRANSCODER(trans);