aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2018-11-19 13:00:21 -0500
committerImre Deak <imre.deak@intel.com>2018-11-21 06:45:33 -0500
commit8f19b401a6fc6d1262c5bfbfc18146c5e8ecb491 (patch)
treea0c463a7017d2b9bf9d6cbfe557d58b867ac3d28 /drivers/gpu
parent8f78df90d84acd7a0b22c2b44a258421063a972f (diff)
drm/i915: Make CHICKEN_TRANS reg not depend on enum value
Depending on the transcoder enum values to translate from transcoder to the corresponding CHICKEN_TRANS register can easily break if we add a new transcoder. Add an explicit mapping instead, by using helpers to look up the register instance either by transcoder or port (since unconveniently the registers have both port and transcoder specific bits). While at it also check for the correctness of GEN, port, transcoder. I wasn't sure if psr2_enabled can only be set for GEN9+, but that seems to be the case indeed (see setting of sink_psr2_support in intel_psr_init_dpcd()). v2 (Ville): - Make gen9_chicken_trans_reg() internal to intel_psr.c. - s/trans/cpu_transcoder/ Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Lucas De Marchi <lucas.demarchi@intel.com> Cc: Mika Kahola <mika.kahola@intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181119180021.370-1-imre.deak@intel.com
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h7
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c37
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c25
3 files changed, 52 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index e6b371e986ee..47baf2fe8f71 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -7399,9 +7399,10 @@ enum {
7399#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0) 7399#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0)
7400#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) 7400#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B)
7401 7401
7402#define CHICKEN_TRANS_A 0x420c0 7402#define CHICKEN_TRANS_A _MMIO(0x420c0)
7403#define CHICKEN_TRANS_B 0x420c4 7403#define CHICKEN_TRANS_B _MMIO(0x420c4)
7404#define CHICKEN_TRANS(trans) _MMIO_TRANS(trans, CHICKEN_TRANS_A, CHICKEN_TRANS_B) 7404#define CHICKEN_TRANS_C _MMIO(0x420c8)
7405#define CHICKEN_TRANS_EDP _MMIO(0x420cc)
7405#define VSC_DATA_SEL_SOFTWARE_CONTROL (1 << 25) /* GLK and CNL+ */ 7406#define VSC_DATA_SEL_SOFTWARE_CONTROL (1 << 25) /* GLK and CNL+ */
7406#define DDI_TRAINING_OVERRIDE_ENABLE (1 << 19) 7407#define DDI_TRAINING_OVERRIDE_ENABLE (1 << 19)
7407#define DDI_TRAINING_OVERRIDE_VALUE (1 << 18) 7408#define DDI_TRAINING_OVERRIDE_VALUE (1 << 18)
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 040483c96029..ad11540ac436 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -3380,6 +3380,26 @@ static void intel_enable_ddi_dp(struct intel_encoder *encoder,
3380 intel_audio_codec_enable(encoder, crtc_state, conn_state); 3380 intel_audio_codec_enable(encoder, crtc_state, conn_state);
3381} 3381}
3382 3382
3383static i915_reg_t
3384gen9_chicken_trans_reg_by_port(struct drm_i915_private *dev_priv,
3385 enum port port)
3386{
3387 static const i915_reg_t regs[] = {
3388 [PORT_A] = CHICKEN_TRANS_EDP,
3389 [PORT_B] = CHICKEN_TRANS_A,
3390 [PORT_C] = CHICKEN_TRANS_B,
3391 [PORT_D] = CHICKEN_TRANS_C,
3392 [PORT_E] = CHICKEN_TRANS_A,
3393 };
3394
3395 WARN_ON(INTEL_GEN(dev_priv) < 9);
3396
3397 if (WARN_ON(port < PORT_A || port > PORT_E))
3398 port = PORT_A;
3399
3400 return regs[port];
3401}
3402
3383static void intel_enable_ddi_hdmi(struct intel_encoder *encoder, 3403static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3384 const struct intel_crtc_state *crtc_state, 3404 const struct intel_crtc_state *crtc_state,
3385 const struct drm_connector_state *conn_state) 3405 const struct drm_connector_state *conn_state)
@@ -3403,17 +3423,10 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3403 * the bits affect a specific DDI port rather than 3423 * the bits affect a specific DDI port rather than
3404 * a specific transcoder. 3424 * a specific transcoder.
3405 */ 3425 */
3406 static const enum transcoder port_to_transcoder[] = { 3426 i915_reg_t reg = gen9_chicken_trans_reg_by_port(dev_priv, port);
3407 [PORT_A] = TRANSCODER_EDP,
3408 [PORT_B] = TRANSCODER_A,
3409 [PORT_C] = TRANSCODER_B,
3410 [PORT_D] = TRANSCODER_C,
3411 [PORT_E] = TRANSCODER_A,
3412 };
3413 enum transcoder transcoder = port_to_transcoder[port];
3414 u32 val; 3427 u32 val;
3415 3428
3416 val = I915_READ(CHICKEN_TRANS(transcoder)); 3429 val = I915_READ(reg);
3417 3430
3418 if (port == PORT_E) 3431 if (port == PORT_E)
3419 val |= DDIE_TRAINING_OVERRIDE_ENABLE | 3432 val |= DDIE_TRAINING_OVERRIDE_ENABLE |
@@ -3422,8 +3435,8 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3422 val |= DDI_TRAINING_OVERRIDE_ENABLE | 3435 val |= DDI_TRAINING_OVERRIDE_ENABLE |
3423 DDI_TRAINING_OVERRIDE_VALUE; 3436 DDI_TRAINING_OVERRIDE_VALUE;
3424 3437
3425 I915_WRITE(CHICKEN_TRANS(transcoder), val); 3438 I915_WRITE(reg, val);
3426 POSTING_READ(CHICKEN_TRANS(transcoder)); 3439 POSTING_READ(reg);
3427 3440
3428 udelay(1); 3441 udelay(1);
3429 3442
@@ -3434,7 +3447,7 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3434 val &= ~(DDI_TRAINING_OVERRIDE_ENABLE | 3447 val &= ~(DDI_TRAINING_OVERRIDE_ENABLE |
3435 DDI_TRAINING_OVERRIDE_VALUE); 3448 DDI_TRAINING_OVERRIDE_VALUE);
3436 3449
3437 I915_WRITE(CHICKEN_TRANS(transcoder), val); 3450 I915_WRITE(reg, val);
3438 } 3451 }
3439 3452
3440 /* In HDMI/DVI mode, the port width, and swing/emphasis values 3453 /* In HDMI/DVI mode, the port width, and swing/emphasis values
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index 26292961d693..54fa17a5596a 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -577,6 +577,25 @@ static void intel_psr_activate(struct intel_dp *intel_dp)
577 dev_priv->psr.active = true; 577 dev_priv->psr.active = true;
578} 578}
579 579
580static i915_reg_t gen9_chicken_trans_reg(struct drm_i915_private *dev_priv,
581 enum transcoder cpu_transcoder)
582{
583 static const i915_reg_t regs[] = {
584 [TRANSCODER_A] = CHICKEN_TRANS_A,
585 [TRANSCODER_B] = CHICKEN_TRANS_B,
586 [TRANSCODER_C] = CHICKEN_TRANS_C,
587 [TRANSCODER_EDP] = CHICKEN_TRANS_EDP,
588 };
589
590 WARN_ON(INTEL_GEN(dev_priv) < 9);
591
592 if (WARN_ON(cpu_transcoder >= ARRAY_SIZE(regs) ||
593 !regs[cpu_transcoder].reg))
594 cpu_transcoder = TRANSCODER_A;
595
596 return regs[cpu_transcoder];
597}
598
580static void intel_psr_enable_source(struct intel_dp *intel_dp, 599static void intel_psr_enable_source(struct intel_dp *intel_dp,
581 const struct intel_crtc_state *crtc_state) 600 const struct intel_crtc_state *crtc_state)
582{ 601{
@@ -591,7 +610,9 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
591 hsw_psr_setup_aux(intel_dp); 610 hsw_psr_setup_aux(intel_dp);
592 611
593 if (dev_priv->psr.psr2_enabled) { 612 if (dev_priv->psr.psr2_enabled) {
594 u32 chicken = I915_READ(CHICKEN_TRANS(cpu_transcoder)); 613 i915_reg_t reg = gen9_chicken_trans_reg(dev_priv,
614 cpu_transcoder);
615 u32 chicken = I915_READ(reg);
595 616
596 if (IS_GEN9(dev_priv) && !IS_GEMINILAKE(dev_priv)) 617 if (IS_GEN9(dev_priv) && !IS_GEMINILAKE(dev_priv))
597 chicken |= (PSR2_VSC_ENABLE_PROG_HEADER 618 chicken |= (PSR2_VSC_ENABLE_PROG_HEADER
@@ -599,7 +620,7 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
599 620
600 else 621 else
601 chicken &= ~VSC_DATA_SEL_SOFTWARE_CONTROL; 622 chicken &= ~VSC_DATA_SEL_SOFTWARE_CONTROL;
602 I915_WRITE(CHICKEN_TRANS(cpu_transcoder), chicken); 623 I915_WRITE(reg, chicken);
603 } 624 }
604 625
605 /* 626 /*