drm/i915: Add state readout and checking for has_dp_encoder and dp_m_n
Add functions to read out the CPU and PCH transcoder M/N values, and use them to fill out the pipe config dp_m_n information. And while at it populate has_dp_encoder too. Also refactor ironlake_get_fdi_m_n_config() to simply call the new intel_cpu_transcoder_get_m_n() function. v2: Remember the DDI Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
42571aefaf
commit
eb14cb747b
4 changed files with 86 additions and 10 deletions
|
@ -1285,6 +1285,20 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
|
||||||
|
case TRANS_DDI_MODE_SELECT_HDMI:
|
||||||
|
case TRANS_DDI_MODE_SELECT_DVI:
|
||||||
|
case TRANS_DDI_MODE_SELECT_FDI:
|
||||||
|
break;
|
||||||
|
case TRANS_DDI_MODE_SELECT_DP_SST:
|
||||||
|
case TRANS_DDI_MODE_SELECT_DP_MST:
|
||||||
|
pipe_config->has_dp_encoder = true;
|
||||||
|
intel_dp_get_m_n(intel_crtc, pipe_config);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_ddi_destroy(struct drm_encoder *encoder)
|
static void intel_ddi_destroy(struct drm_encoder *encoder)
|
||||||
|
|
|
@ -5858,22 +5858,66 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ironlake_get_fdi_m_n_config(struct intel_crtc *crtc,
|
static void intel_pch_transcoder_get_m_n(struct intel_crtc *crtc,
|
||||||
struct intel_crtc_config *pipe_config)
|
struct intel_link_m_n *m_n)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = crtc->base.dev;
|
struct drm_device *dev = crtc->base.dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
enum transcoder transcoder = pipe_config->cpu_transcoder;
|
enum pipe pipe = crtc->pipe;
|
||||||
|
|
||||||
pipe_config->fdi_m_n.link_m = I915_READ(PIPE_LINK_M1(transcoder));
|
m_n->link_m = I915_READ(PCH_TRANS_LINK_M1(pipe));
|
||||||
pipe_config->fdi_m_n.link_n = I915_READ(PIPE_LINK_N1(transcoder));
|
m_n->link_n = I915_READ(PCH_TRANS_LINK_N1(pipe));
|
||||||
pipe_config->fdi_m_n.gmch_m = I915_READ(PIPE_DATA_M1(transcoder))
|
m_n->gmch_m = I915_READ(PCH_TRANS_DATA_M1(pipe))
|
||||||
& ~TU_SIZE_MASK;
|
& ~TU_SIZE_MASK;
|
||||||
pipe_config->fdi_m_n.gmch_n = I915_READ(PIPE_DATA_N1(transcoder));
|
m_n->gmch_n = I915_READ(PCH_TRANS_DATA_N1(pipe));
|
||||||
pipe_config->fdi_m_n.tu = ((I915_READ(PIPE_DATA_M1(transcoder))
|
m_n->tu = ((I915_READ(PCH_TRANS_DATA_M1(pipe))
|
||||||
& TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
|
& TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void intel_cpu_transcoder_get_m_n(struct intel_crtc *crtc,
|
||||||
|
enum transcoder transcoder,
|
||||||
|
struct intel_link_m_n *m_n)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = crtc->base.dev;
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
enum pipe pipe = crtc->pipe;
|
||||||
|
|
||||||
|
if (INTEL_INFO(dev)->gen >= 5) {
|
||||||
|
m_n->link_m = I915_READ(PIPE_LINK_M1(transcoder));
|
||||||
|
m_n->link_n = I915_READ(PIPE_LINK_N1(transcoder));
|
||||||
|
m_n->gmch_m = I915_READ(PIPE_DATA_M1(transcoder))
|
||||||
|
& ~TU_SIZE_MASK;
|
||||||
|
m_n->gmch_n = I915_READ(PIPE_DATA_N1(transcoder));
|
||||||
|
m_n->tu = ((I915_READ(PIPE_DATA_M1(transcoder))
|
||||||
|
& TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
|
||||||
|
} else {
|
||||||
|
m_n->link_m = I915_READ(PIPE_LINK_M_G4X(pipe));
|
||||||
|
m_n->link_n = I915_READ(PIPE_LINK_N_G4X(pipe));
|
||||||
|
m_n->gmch_m = I915_READ(PIPE_DATA_M_G4X(pipe))
|
||||||
|
& ~TU_SIZE_MASK;
|
||||||
|
m_n->gmch_n = I915_READ(PIPE_DATA_N_G4X(pipe));
|
||||||
|
m_n->tu = ((I915_READ(PIPE_DATA_M_G4X(pipe))
|
||||||
|
& TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void intel_dp_get_m_n(struct intel_crtc *crtc,
|
||||||
|
struct intel_crtc_config *pipe_config)
|
||||||
|
{
|
||||||
|
if (crtc->config.has_pch_encoder)
|
||||||
|
intel_pch_transcoder_get_m_n(crtc, &pipe_config->dp_m_n);
|
||||||
|
else
|
||||||
|
intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder,
|
||||||
|
&pipe_config->dp_m_n);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ironlake_get_fdi_m_n_config(struct intel_crtc *crtc,
|
||||||
|
struct intel_crtc_config *pipe_config)
|
||||||
|
{
|
||||||
|
intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder,
|
||||||
|
&pipe_config->fdi_m_n);
|
||||||
|
}
|
||||||
|
|
||||||
static void ironlake_get_pfit_config(struct intel_crtc *crtc,
|
static void ironlake_get_pfit_config(struct intel_crtc *crtc,
|
||||||
struct intel_crtc_config *pipe_config)
|
struct intel_crtc_config *pipe_config)
|
||||||
{
|
{
|
||||||
|
@ -8239,6 +8283,11 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
|
||||||
pipe_config->fdi_m_n.gmch_m, pipe_config->fdi_m_n.gmch_n,
|
pipe_config->fdi_m_n.gmch_m, pipe_config->fdi_m_n.gmch_n,
|
||||||
pipe_config->fdi_m_n.link_m, pipe_config->fdi_m_n.link_n,
|
pipe_config->fdi_m_n.link_m, pipe_config->fdi_m_n.link_n,
|
||||||
pipe_config->fdi_m_n.tu);
|
pipe_config->fdi_m_n.tu);
|
||||||
|
DRM_DEBUG_KMS("dp: %i, gmch_m: %u, gmch_n: %u, link_m: %u, link_n: %u, tu: %u\n",
|
||||||
|
pipe_config->has_dp_encoder,
|
||||||
|
pipe_config->dp_m_n.gmch_m, pipe_config->dp_m_n.gmch_n,
|
||||||
|
pipe_config->dp_m_n.link_m, pipe_config->dp_m_n.link_n,
|
||||||
|
pipe_config->dp_m_n.tu);
|
||||||
DRM_DEBUG_KMS("requested mode:\n");
|
DRM_DEBUG_KMS("requested mode:\n");
|
||||||
drm_mode_debug_printmodeline(&pipe_config->requested_mode);
|
drm_mode_debug_printmodeline(&pipe_config->requested_mode);
|
||||||
DRM_DEBUG_KMS("adjusted mode:\n");
|
DRM_DEBUG_KMS("adjusted mode:\n");
|
||||||
|
@ -8608,6 +8657,13 @@ intel_pipe_config_compare(struct drm_device *dev,
|
||||||
PIPE_CONF_CHECK_I(fdi_m_n.link_n);
|
PIPE_CONF_CHECK_I(fdi_m_n.link_n);
|
||||||
PIPE_CONF_CHECK_I(fdi_m_n.tu);
|
PIPE_CONF_CHECK_I(fdi_m_n.tu);
|
||||||
|
|
||||||
|
PIPE_CONF_CHECK_I(has_dp_encoder);
|
||||||
|
PIPE_CONF_CHECK_I(dp_m_n.gmch_m);
|
||||||
|
PIPE_CONF_CHECK_I(dp_m_n.gmch_n);
|
||||||
|
PIPE_CONF_CHECK_I(dp_m_n.link_m);
|
||||||
|
PIPE_CONF_CHECK_I(dp_m_n.link_n);
|
||||||
|
PIPE_CONF_CHECK_I(dp_m_n.tu);
|
||||||
|
|
||||||
PIPE_CONF_CHECK_I(adjusted_mode.crtc_hdisplay);
|
PIPE_CONF_CHECK_I(adjusted_mode.crtc_hdisplay);
|
||||||
PIPE_CONF_CHECK_I(adjusted_mode.crtc_htotal);
|
PIPE_CONF_CHECK_I(adjusted_mode.crtc_htotal);
|
||||||
PIPE_CONF_CHECK_I(adjusted_mode.crtc_hblank_start);
|
PIPE_CONF_CHECK_I(adjusted_mode.crtc_hblank_start);
|
||||||
|
|
|
@ -1444,6 +1444,10 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||||
|
|
||||||
pipe_config->adjusted_mode.flags |= flags;
|
pipe_config->adjusted_mode.flags |= flags;
|
||||||
|
|
||||||
|
pipe_config->has_dp_encoder = true;
|
||||||
|
|
||||||
|
intel_dp_get_m_n(crtc, pipe_config);
|
||||||
|
|
||||||
if (dp_to_dig_port(intel_dp)->port == PORT_A) {
|
if (dp_to_dig_port(intel_dp)->port == PORT_A) {
|
||||||
if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ)
|
if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ)
|
||||||
pipe_config->port_clock = 162000;
|
pipe_config->port_clock = 162000;
|
||||||
|
|
|
@ -801,5 +801,7 @@ extern void hsw_pc8_disable_interrupts(struct drm_device *dev);
|
||||||
extern void hsw_pc8_restore_interrupts(struct drm_device *dev);
|
extern void hsw_pc8_restore_interrupts(struct drm_device *dev);
|
||||||
extern void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv);
|
extern void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv);
|
||||||
extern void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv);
|
extern void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv);
|
||||||
|
extern void intel_dp_get_m_n(struct intel_crtc *crtc,
|
||||||
|
struct intel_crtc_config *pipe_config);
|
||||||
|
|
||||||
#endif /* __INTEL_DRV_H__ */
|
#endif /* __INTEL_DRV_H__ */
|
||||||
|
|
Loading…
Reference in a new issue