All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Roper <matthew.d.roper@intel.com>
To: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Cc: intel-gfx@lists.freedesktop.org, shuang.he@linux.intel.com
Subject: Re: [PATCH 7/8] drm/i915: Make intel_crtc->config a pointer
Date: Mon, 15 Dec 2014 11:30:35 -0800	[thread overview]
Message-ID: <20141215193035.GF31948@intel.com> (raw)
In-Reply-To: <1418301491-23020-8-git-send-email-ander.conselvan.de.oliveira@intel.com>

On Thu, Dec 11, 2014 at 02:38:10PM +0200, Ander Conselvan de Oliveira wrote:
> To match the semantics of drm_crtc->state, which this will eventually
> become.
> 
> @@ struct intel_crtc *crtc; @@
> -&crtc->config
> +crtc->config
> @@ struct intel_crtc *crtc; identifier member; @@
> -crtc->config.member
> +crtc->config->member
> @@ struct drm_crtc *crtc; @@
> -&to_intel_crtc(crtc)->config
> +to_intel_crtc(crtc)->config
> @@ struct drm_crtc *crtc; identifier member; @@
> -to_intel_crtc(crtc)->config.member
> +to_intel_crtc(crtc)->config->member

Just to avoid confusion, you may want to indicate that there are a few
changes beyond the coccinelle spatch listed here (allocation in
intel_crtc_init, assignment with new intel_crtc_set_state, etc.).

Also, I may be missing it happening somewhere else in the large patch,
but do we need an intel_crtc_set_state(intel_crtc, NULL) in
intel_crtc_destroy() to ensure that our final state doesn't leak when we
rmmod?


Matt

> 
> Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_debugfs.c  |  12 +-
>  drivers/gpu/drm/i915/i915_irq.c      |   8 +-
>  drivers/gpu/drm/i915/intel_audio.c   |   2 +-
>  drivers/gpu/drm/i915/intel_crt.c     |   2 +-
>  drivers/gpu/drm/i915/intel_ddi.c     |  52 +++----
>  drivers/gpu/drm/i915/intel_display.c | 275 ++++++++++++++++++-----------------
>  drivers/gpu/drm/i915/intel_dp.c      |  16 +-
>  drivers/gpu/drm/i915/intel_dp_mst.c  |   7 +-
>  drivers/gpu/drm/i915/intel_drv.h     |   2 +-
>  drivers/gpu/drm/i915/intel_dsi.c     |   8 +-
>  drivers/gpu/drm/i915/intel_dvo.c     |   8 +-
>  drivers/gpu/drm/i915/intel_fbdev.c   |  10 +-
>  drivers/gpu/drm/i915/intel_hdmi.c    |  36 ++---
>  drivers/gpu/drm/i915/intel_lvds.c    |   6 +-
>  drivers/gpu/drm/i915/intel_overlay.c |   2 +-
>  drivers/gpu/drm/i915/intel_pm.c      |  56 +++----
>  drivers/gpu/drm/i915/intel_psr.c     |   8 +-
>  drivers/gpu/drm/i915/intel_sdvo.c    |  14 +-
>  drivers/gpu/drm/i915/intel_sprite.c  |   2 +-
>  19 files changed, 270 insertions(+), 256 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index d0e445e..a724e8c 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -2572,7 +2572,7 @@ static int i915_display_info(struct seq_file *m, void *unused)
>  
>  		seq_printf(m, "CRTC %d: pipe: %c, active=%s (size=%dx%d)\n",
>  			   crtc->base.base.id, pipe_name(crtc->pipe),
> -			   yesno(crtc->active), crtc->config.pipe_src_w, crtc->config.pipe_src_h);
> +			   yesno(crtc->active), crtc->config->pipe_src_w, crtc->config->pipe_src_h);
>  		if (crtc->active) {
>  			intel_crtc_info(m, crtc);
>  
> @@ -3280,9 +3280,9 @@ static void hsw_trans_edp_pipe_A_crc_wa(struct drm_device *dev)
>  	 * relevant on hsw with pipe A when using the always-on power well
>  	 * routing.
>  	 */
> -	if (crtc->config.cpu_transcoder == TRANSCODER_EDP &&
> -	    !crtc->config.pch_pfit.enabled) {
> -		crtc->config.pch_pfit.force_thru = true;
> +	if (crtc->config->cpu_transcoder == TRANSCODER_EDP &&
> +	    !crtc->config->pch_pfit.enabled) {
> +		crtc->config->pch_pfit.force_thru = true;
>  
>  		intel_display_power_get(dev_priv,
>  					POWER_DOMAIN_PIPE_PANEL_FITTER(PIPE_A));
> @@ -3306,8 +3306,8 @@ static void hsw_undo_trans_edp_pipe_A_crc_wa(struct drm_device *dev)
>  	 * relevant on hsw with pipe A when using the always-on power well
>  	 * routing.
>  	 */
> -	if (crtc->config.pch_pfit.force_thru) {
> -		crtc->config.pch_pfit.force_thru = false;
> +	if (crtc->config->pch_pfit.force_thru) {
> +		crtc->config->pch_pfit.force_thru = false;
>  
>  		dev_priv->display.crtc_disable(&crtc->base);
>  		dev_priv->display.crtc_enable(&crtc->base);
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 11e209e..e55b275 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -567,7 +567,7 @@ static u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
>  		struct intel_crtc *intel_crtc =
>  			to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
>  		const struct drm_display_mode *mode =
> -			&intel_crtc->config.base.adjusted_mode;
> +			&intel_crtc->config->base.adjusted_mode;
>  
>  		htotal = mode->crtc_htotal;
>  		hsync_start = mode->crtc_hsync_start;
> @@ -638,7 +638,7 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
>  {
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	const struct drm_display_mode *mode = &crtc->config.base.adjusted_mode;
> +	const struct drm_display_mode *mode = &crtc->config->base.adjusted_mode;
>  	enum pipe pipe = crtc->pipe;
>  	int position, vtotal;
>  
> @@ -665,7 +665,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> -	const struct drm_display_mode *mode = &intel_crtc->config.base.adjusted_mode;
> +	const struct drm_display_mode *mode = &intel_crtc->config->base.adjusted_mode;
>  	int position;
>  	int vbl_start, vbl_end, hsync_start, htotal, vtotal;
>  	bool in_vbl = true;
> @@ -823,7 +823,7 @@ static int i915_get_vblank_timestamp(struct drm_device *dev, int pipe,
>  	return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
>  						     vblank_time, flags,
>  						     crtc,
> -						     &to_intel_crtc(crtc)->config.base.adjusted_mode);
> +						     &to_intel_crtc(crtc)->config->base.adjusted_mode);
>  }
>  
>  static bool intel_hpd_irq_event(struct drm_device *dev,
> diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
> index fe8c496..e84a798 100644
> --- a/drivers/gpu/drm/i915/intel_audio.c
> +++ b/drivers/gpu/drm/i915/intel_audio.c
> @@ -397,7 +397,7 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
>  {
>  	struct drm_encoder *encoder = &intel_encoder->base;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
> -	struct drm_display_mode *mode = &crtc->config.base.adjusted_mode;
> +	struct drm_display_mode *mode = &crtc->config->base.adjusted_mode;
>  	struct drm_connector *connector;
>  	struct drm_device *dev = encoder->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
> index e4f6d49..bb55368 100644
> --- a/drivers/gpu/drm/i915/intel_crt.c
> +++ b/drivers/gpu/drm/i915/intel_crt.c
> @@ -157,7 +157,7 @@ static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crt *crt = intel_encoder_to_crt(encoder);
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
> -	struct drm_display_mode *adjusted_mode = &crtc->config.base.adjusted_mode;
> +	struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
>  	u32 adpa;
>  
>  	if (INTEL_INFO(dev)->gen >= 5)
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index 970ca30..c409ccc 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -328,7 +328,7 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
>  	/* Enable the PCH Receiver FDI PLL */
>  	rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
>  		     FDI_RX_PLL_ENABLE |
> -		     FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
> +		     FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
>  	I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
>  	POSTING_READ(_FDI_RXA_CTL);
>  	udelay(220);
> @@ -338,8 +338,8 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
>  	I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
>  
>  	/* Configure Port Clock Select */
> -	I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config.ddi_pll_sel);
> -	WARN_ON(intel_crtc->config.ddi_pll_sel != PORT_CLK_SEL_SPLL);
> +	I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config->ddi_pll_sel);
> +	WARN_ON(intel_crtc->config->ddi_pll_sel != PORT_CLK_SEL_SPLL);
>  
>  	/* Start the training iterating through available voltages and emphasis,
>  	 * testing each value twice. */
> @@ -357,7 +357,7 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
>  		 * port reversal bit */
>  		I915_WRITE(DDI_BUF_CTL(PORT_E),
>  			   DDI_BUF_CTL_ENABLE |
> -			   ((intel_crtc->config.fdi_lanes - 1) << 1) |
> +			   ((intel_crtc->config->fdi_lanes - 1) << 1) |
>  			   DDI_BUF_TRANS_SELECT(i / 2));
>  		POSTING_READ(DDI_BUF_CTL(PORT_E));
>  
> @@ -1186,13 +1186,13 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
>  	struct drm_i915_private *dev_priv = crtc->dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	int type = intel_encoder->type;
>  	uint32_t temp;
>  
>  	if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
>  		temp = TRANS_MSA_SYNC_CLK;
> -		switch (intel_crtc->config.pipe_bpp) {
> +		switch (intel_crtc->config->pipe_bpp) {
>  		case 18:
>  			temp |= TRANS_MSA_6_BPC;
>  			break;
> @@ -1217,7 +1217,7 @@ void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	struct drm_device *dev = crtc->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	uint32_t temp;
>  	temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
>  	if (state == true)
> @@ -1235,7 +1235,7 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
>  	struct drm_device *dev = crtc->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	enum pipe pipe = intel_crtc->pipe;
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	enum port port = intel_ddi_get_encoder_port(intel_encoder);
>  	int type = intel_encoder->type;
>  	uint32_t temp;
> @@ -1244,7 +1244,7 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
>  	temp = TRANS_DDI_FUNC_ENABLE;
>  	temp |= TRANS_DDI_SELECT_PORT(port);
>  
> -	switch (intel_crtc->config.pipe_bpp) {
> +	switch (intel_crtc->config->pipe_bpp) {
>  	case 18:
>  		temp |= TRANS_DDI_BPC_6;
>  		break;
> @@ -1261,9 +1261,9 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
>  		BUG();
>  	}
>  
> -	if (intel_crtc->config.base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
> +	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
>  		temp |= TRANS_DDI_PVSYNC;
> -	if (intel_crtc->config.base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
> +	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
>  		temp |= TRANS_DDI_PHSYNC;
>  
>  	if (cpu_transcoder == TRANSCODER_EDP) {
> @@ -1274,8 +1274,8 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
>  			 * using motion blur mitigation (which we don't
>  			 * support). */
>  			if (IS_HASWELL(dev) &&
> -			    (intel_crtc->config.pch_pfit.enabled ||
> -			     intel_crtc->config.pch_pfit.force_thru))
> +			    (intel_crtc->config->pch_pfit.enabled ||
> +			     intel_crtc->config->pch_pfit.force_thru))
>  				temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
>  			else
>  				temp |= TRANS_DDI_EDP_INPUT_A_ON;
> @@ -1293,14 +1293,14 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
>  	}
>  
>  	if (type == INTEL_OUTPUT_HDMI) {
> -		if (intel_crtc->config.has_hdmi_sink)
> +		if (intel_crtc->config->has_hdmi_sink)
>  			temp |= TRANS_DDI_MODE_SELECT_HDMI;
>  		else
>  			temp |= TRANS_DDI_MODE_SELECT_DVI;
>  
>  	} else if (type == INTEL_OUTPUT_ANALOG) {
>  		temp |= TRANS_DDI_MODE_SELECT_FDI;
> -		temp |= (intel_crtc->config.fdi_lanes - 1) << 1;
> +		temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
>  
>  	} else if (type == INTEL_OUTPUT_DISPLAYPORT ||
>  		   type == INTEL_OUTPUT_EDP) {
> @@ -1450,7 +1450,7 @@ void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
>  	struct drm_i915_private *dev_priv = crtc->dev->dev_private;
>  	struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
>  	enum port port = intel_ddi_get_encoder_port(intel_encoder);
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  
>  	if (cpu_transcoder != TRANSCODER_EDP)
>  		I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
> @@ -1460,7 +1460,7 @@ void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
>  void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
>  {
>  	struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  
>  	if (cpu_transcoder != TRANSCODER_EDP)
>  		I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
> @@ -1482,7 +1482,7 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
>  	}
>  
>  	if (IS_SKYLAKE(dev)) {
> -		uint32_t dpll = crtc->config.ddi_pll_sel;
> +		uint32_t dpll = crtc->config->ddi_pll_sel;
>  		uint32_t val;
>  
>  		/*
> @@ -1497,7 +1497,7 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
>  			val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
>  				 DPLL_CTRL1_SSC(dpll) |
>  				 DPLL_CRTL1_LINK_RATE_MASK(dpll));
> -			val |= crtc->config.dpll_hw_state.ctrl1 << (dpll * 6);
> +			val |= crtc->config->dpll_hw_state.ctrl1 << (dpll * 6);
>  
>  			I915_WRITE(DPLL_CTRL1, val);
>  			POSTING_READ(DPLL_CTRL1);
> @@ -1514,8 +1514,8 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
>  		I915_WRITE(DPLL_CTRL2, val);
>  
>  	} else {
> -		WARN_ON(crtc->config.ddi_pll_sel == PORT_CLK_SEL_NONE);
> -		I915_WRITE(PORT_CLK_SEL(port), crtc->config.ddi_pll_sel);
> +		WARN_ON(crtc->config->ddi_pll_sel == PORT_CLK_SEL_NONE);
> +		I915_WRITE(PORT_CLK_SEL(port), crtc->config->ddi_pll_sel);
>  	}
>  
>  	if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
> @@ -1532,8 +1532,8 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
>  		struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
>  
>  		intel_hdmi->set_infoframes(encoder,
> -					   crtc->config.has_hdmi_sink,
> -					   &crtc->config.base.adjusted_mode);
> +					   crtc->config->has_hdmi_sink,
> +					   &crtc->config->base.adjusted_mode);
>  	}
>  }
>  
> @@ -1607,7 +1607,7 @@ static void intel_enable_ddi(struct intel_encoder *intel_encoder)
>  		intel_psr_enable(intel_dp);
>  	}
>  
> -	if (intel_crtc->config.has_audio) {
> +	if (intel_crtc->config->has_audio) {
>  		intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
>  		intel_audio_codec_enable(intel_encoder);
>  	}
> @@ -1622,7 +1622,7 @@ static void intel_disable_ddi(struct intel_encoder *intel_encoder)
>  	struct drm_device *dev = encoder->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	if (intel_crtc->config.has_audio) {
> +	if (intel_crtc->config->has_audio) {
>  		intel_audio_codec_disable(intel_encoder);
>  		intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
>  	}
> @@ -2031,7 +2031,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
>  {
>  	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	struct intel_hdmi *intel_hdmi;
>  	u32 temp, flags = 0;
>  	struct drm_device *dev = dev_priv->dev;
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index a032a1d..462f22a 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -895,7 +895,7 @@ bool intel_crtc_active(struct drm_crtc *crtc)
>  	 * properly reconstruct framebuffers.
>  	 */
>  	return intel_crtc->active && crtc->primary->fb &&
> -		intel_crtc->config.base.adjusted_mode.crtc_clock;
> +		intel_crtc->config->base.adjusted_mode.crtc_clock;
>  }
>  
>  enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv,
> @@ -904,7 +904,7 @@ enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv,
>  	struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  
> -	return intel_crtc->config.cpu_transcoder;
> +	return intel_crtc->config->cpu_transcoder;
>  }
>  
>  static bool pipe_dsl_stopped(struct drm_device *dev, enum pipe pipe)
> @@ -946,7 +946,7 @@ static void intel_wait_for_pipe_off(struct intel_crtc *crtc)
>  {
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	enum transcoder cpu_transcoder = crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
>  	enum pipe pipe = crtc->pipe;
>  
>  	if (INTEL_INFO(dev)->gen >= 4) {
> @@ -1052,10 +1052,10 @@ intel_crtc_to_shared_dpll(struct intel_crtc *crtc)
>  {
>  	struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
>  
> -	if (crtc->config.shared_dpll < 0)
> +	if (crtc->config->shared_dpll < 0)
>  		return NULL;
>  
> -	return &dev_priv->shared_dplls[crtc->config.shared_dpll];
> +	return &dev_priv->shared_dplls[crtc->config->shared_dpll];
>  }
>  
>  /* For ILK+ */
> @@ -1599,7 +1599,7 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	int reg = DPLL(crtc->pipe);
> -	u32 dpll = crtc->config.dpll_hw_state.dpll;
> +	u32 dpll = crtc->config->dpll_hw_state.dpll;
>  
>  	assert_pipe_disabled(dev_priv, crtc->pipe);
>  
> @@ -1629,7 +1629,7 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
>  
>  	if (INTEL_INFO(dev)->gen >= 4) {
>  		I915_WRITE(DPLL_MD(crtc->pipe),
> -			   crtc->config.dpll_hw_state.dpll_md);
> +			   crtc->config->dpll_hw_state.dpll_md);
>  	} else {
>  		/* The pixel multiplier can only be updated once the
>  		 * DPLL is enabled and the clocks are stable.
> @@ -2034,7 +2034,7 @@ static void intel_enable_pipe(struct intel_crtc *crtc)
>  		else
>  			assert_pll_enabled(dev_priv, pipe);
>  	else {
> -		if (crtc->config.has_pch_encoder) {
> +		if (crtc->config->has_pch_encoder) {
>  			/* if driving the PCH, we need FDI enabled */
>  			assert_fdi_rx_pll_enabled(dev_priv, pch_transcoder);
>  			assert_fdi_tx_pll_enabled(dev_priv,
> @@ -2068,7 +2068,7 @@ static void intel_enable_pipe(struct intel_crtc *crtc)
>  static void intel_disable_pipe(struct intel_crtc *crtc)
>  {
>  	struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
> -	enum transcoder cpu_transcoder = crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
>  	enum pipe pipe = crtc->pipe;
>  	int reg;
>  	u32 val;
> @@ -2090,7 +2090,7 @@ static void intel_disable_pipe(struct intel_crtc *crtc)
>  	 * Double wide has implications for planes
>  	 * so best keep it disabled when not needed.
>  	 */
> -	if (crtc->config.double_wide)
> +	if (crtc->config->double_wide)
>  		val &= ~PIPECONF_DOUBLE_WIDE;
>  
>  	/* Don't disable pipe or pipe PLLs if needed */
> @@ -2468,13 +2468,13 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
>  		 * which should always be the user's requested size.
>  		 */
>  		I915_WRITE(DSPSIZE(plane),
> -			   ((intel_crtc->config.pipe_src_h - 1) << 16) |
> -			   (intel_crtc->config.pipe_src_w - 1));
> +			   ((intel_crtc->config->pipe_src_h - 1) << 16) |
> +			   (intel_crtc->config->pipe_src_w - 1));
>  		I915_WRITE(DSPPOS(plane), 0);
>  	} else if (IS_CHERRYVIEW(dev) && plane == PLANE_B) {
>  		I915_WRITE(PRIMSIZE(plane),
> -			   ((intel_crtc->config.pipe_src_h - 1) << 16) |
> -			   (intel_crtc->config.pipe_src_w - 1));
> +			   ((intel_crtc->config->pipe_src_h - 1) << 16) |
> +			   (intel_crtc->config->pipe_src_w - 1));
>  		I915_WRITE(PRIMPOS(plane), 0);
>  		I915_WRITE(PRIMCNSTALPHA(plane), 0);
>  	}
> @@ -2532,14 +2532,14 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
>  	if (to_intel_plane(crtc->primary)->rotation == BIT(DRM_ROTATE_180)) {
>  		dspcntr |= DISPPLANE_ROTATE_180;
>  
> -		x += (intel_crtc->config.pipe_src_w - 1);
> -		y += (intel_crtc->config.pipe_src_h - 1);
> +		x += (intel_crtc->config->pipe_src_w - 1);
> +		y += (intel_crtc->config->pipe_src_h - 1);
>  
>  		/* Finding the last pixel of the last line of the display
>  		data and adding to linear_offset*/
>  		linear_offset +=
> -			(intel_crtc->config.pipe_src_h - 1) * fb->pitches[0] +
> -			(intel_crtc->config.pipe_src_w - 1) * pixel_size;
> +			(intel_crtc->config->pipe_src_h - 1) * fb->pitches[0] +
> +			(intel_crtc->config->pipe_src_w - 1) * pixel_size;
>  	}
>  
>  	I915_WRITE(reg, dspcntr);
> @@ -2635,14 +2635,14 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
>  		dspcntr |= DISPPLANE_ROTATE_180;
>  
>  		if (!IS_HASWELL(dev) && !IS_BROADWELL(dev)) {
> -			x += (intel_crtc->config.pipe_src_w - 1);
> -			y += (intel_crtc->config.pipe_src_h - 1);
> +			x += (intel_crtc->config->pipe_src_w - 1);
> +			y += (intel_crtc->config->pipe_src_h - 1);
>  
>  			/* Finding the last pixel of the last line of the display
>  			data and adding to linear_offset*/
>  			linear_offset +=
> -				(intel_crtc->config.pipe_src_h - 1) * fb->pitches[0] +
> -				(intel_crtc->config.pipe_src_w - 1) * pixel_size;
> +				(intel_crtc->config->pipe_src_h - 1) * fb->pitches[0] +
> +				(intel_crtc->config->pipe_src_w - 1) * pixel_size;
>  		}
>  	}
>  
> @@ -2741,8 +2741,8 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
>  	I915_WRITE(PLANE_POS(pipe, 0), 0);
>  	I915_WRITE(PLANE_OFFSET(pipe, 0), (y << 16) | x);
>  	I915_WRITE(PLANE_SIZE(pipe, 0),
> -		   (intel_crtc->config.pipe_src_h - 1) << 16 |
> -		   (intel_crtc->config.pipe_src_w - 1));
> +		   (intel_crtc->config->pipe_src_h - 1) << 16 |
> +		   (intel_crtc->config->pipe_src_w - 1));
>  	I915_WRITE(PLANE_STRIDE(pipe, 0), stride);
>  	I915_WRITE(PLANE_SURF(pipe, 0), i915_gem_obj_ggtt_offset(obj));
>  
> @@ -2938,20 +2938,20 @@ static void intel_update_pipe_size(struct intel_crtc *crtc)
>  	 * then update the pipesrc and pfit state, even on the flip path.
>  	 */
>  
> -	adjusted_mode = &crtc->config.base.adjusted_mode;
> +	adjusted_mode = &crtc->config->base.adjusted_mode;
>  
>  	I915_WRITE(PIPESRC(crtc->pipe),
>  		   ((adjusted_mode->crtc_hdisplay - 1) << 16) |
>  		   (adjusted_mode->crtc_vdisplay - 1));
> -	if (!crtc->config.pch_pfit.enabled &&
> +	if (!crtc->config->pch_pfit.enabled &&
>  	    (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) ||
>  	     intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))) {
>  		I915_WRITE(PF_CTL(crtc->pipe), 0);
>  		I915_WRITE(PF_WIN_POS(crtc->pipe), 0);
>  		I915_WRITE(PF_WIN_SZ(crtc->pipe), 0);
>  	}
> -	crtc->config.pipe_src_w = adjusted_mode->crtc_hdisplay;
> -	crtc->config.pipe_src_h = adjusted_mode->crtc_vdisplay;
> +	crtc->config->pipe_src_w = adjusted_mode->crtc_hdisplay;
> +	crtc->config->pipe_src_h = adjusted_mode->crtc_vdisplay;
>  }
>  
>  static void intel_fdi_normal_train(struct drm_crtc *crtc)
> @@ -2998,7 +2998,7 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
>  static bool pipe_has_enabled_pch(struct intel_crtc *crtc)
>  {
>  	return crtc->base.enabled && crtc->active &&
> -		crtc->config.has_pch_encoder;
> +		crtc->config->has_pch_encoder;
>  }
>  
>  static void ivb_modeset_global_resources(struct drm_device *dev)
> @@ -3053,7 +3053,7 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc)
>  	reg = FDI_TX_CTL(pipe);
>  	temp = I915_READ(reg);
>  	temp &= ~FDI_DP_PORT_WIDTH_MASK;
> -	temp |= FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
> +	temp |= FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
>  	temp &= ~FDI_LINK_TRAIN_NONE;
>  	temp |= FDI_LINK_TRAIN_PATTERN_1;
>  	I915_WRITE(reg, temp | FDI_TX_ENABLE);
> @@ -3151,7 +3151,7 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
>  	reg = FDI_TX_CTL(pipe);
>  	temp = I915_READ(reg);
>  	temp &= ~FDI_DP_PORT_WIDTH_MASK;
> -	temp |= FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
> +	temp |= FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
>  	temp &= ~FDI_LINK_TRAIN_NONE;
>  	temp |= FDI_LINK_TRAIN_PATTERN_1;
>  	temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
> @@ -3302,7 +3302,7 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
>  		reg = FDI_TX_CTL(pipe);
>  		temp = I915_READ(reg);
>  		temp &= ~FDI_DP_PORT_WIDTH_MASK;
> -		temp |= FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
> +		temp |= FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
>  		temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
>  		temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
>  		temp |= snb_b_fdi_train_param[j/2];
> @@ -3390,7 +3390,7 @@ static void ironlake_fdi_pll_enable(struct intel_crtc *intel_crtc)
>  	reg = FDI_RX_CTL(pipe);
>  	temp = I915_READ(reg);
>  	temp &= ~(FDI_DP_PORT_WIDTH_MASK | (0x7 << 16));
> -	temp |= FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
> +	temp |= FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
>  	temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
>  	I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
>  
> @@ -3574,7 +3574,7 @@ static void lpt_program_iclkip(struct drm_crtc *crtc)
>  {
>  	struct drm_device *dev = crtc->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	int clock = to_intel_crtc(crtc)->config.base.adjusted_mode.crtc_clock;
> +	int clock = to_intel_crtc(crtc)->config->base.adjusted_mode.crtc_clock;
>  	u32 divsel, phaseinc, auxdiv, phasedir = 0;
>  	u32 temp;
>  
> @@ -3663,7 +3663,7 @@ static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc,
>  {
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	enum transcoder cpu_transcoder = crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
>  
>  	I915_WRITE(PCH_TRANS_HTOTAL(pch_transcoder),
>  		   I915_READ(HTOTAL(cpu_transcoder)));
> @@ -3709,7 +3709,7 @@ static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc)
>  	case PIPE_A:
>  		break;
>  	case PIPE_B:
> -		if (intel_crtc->config.fdi_lanes > 2)
> +		if (intel_crtc->config->fdi_lanes > 2)
>  			WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT);
>  		else
>  			cpt_enable_fdi_bc_bifurcation(dev);
> @@ -3761,7 +3761,7 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
>  		temp = I915_READ(PCH_DPLL_SEL);
>  		temp |= TRANS_DPLL_ENABLE(pipe);
>  		sel = TRANS_DPLLB_SEL(pipe);
> -		if (intel_crtc->config.shared_dpll == DPLL_ID_PCH_PLL_B)
> +		if (intel_crtc->config->shared_dpll == DPLL_ID_PCH_PLL_B)
>  			temp |= sel;
>  		else
>  			temp &= ~sel;
> @@ -3784,7 +3784,7 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
>  	intel_fdi_normal_train(crtc);
>  
>  	/* For PCH DP, enable TRANS_DP_CTL */
> -	if (HAS_PCH_CPT(dev) && intel_crtc->config.has_dp_encoder) {
> +	if (HAS_PCH_CPT(dev) && intel_crtc->config->has_dp_encoder) {
>  		u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5;
>  		reg = TRANS_DP_CTL(pipe);
>  		temp = I915_READ(reg);
> @@ -3825,7 +3825,7 @@ static void lpt_pch_enable(struct drm_crtc *crtc)
>  	struct drm_device *dev = crtc->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  
>  	assert_pch_transcoder_disabled(dev_priv, TRANSCODER_A);
>  
> @@ -3855,7 +3855,7 @@ void intel_put_shared_dpll(struct intel_crtc *crtc)
>  		WARN_ON(pll->active);
>  	}
>  
> -	crtc->config.shared_dpll = DPLL_ID_PRIVATE;
> +	crtc->config->shared_dpll = DPLL_ID_PRIVATE;
>  }
>  
>  struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
> @@ -4009,10 +4009,10 @@ static void skylake_pfit_enable(struct intel_crtc *crtc)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	int pipe = crtc->pipe;
>  
> -	if (crtc->config.pch_pfit.enabled) {
> +	if (crtc->config->pch_pfit.enabled) {
>  		I915_WRITE(PS_CTL(pipe), PS_ENABLE);
> -		I915_WRITE(PS_WIN_POS(pipe), crtc->config.pch_pfit.pos);
> -		I915_WRITE(PS_WIN_SZ(pipe), crtc->config.pch_pfit.size);
> +		I915_WRITE(PS_WIN_POS(pipe), crtc->config->pch_pfit.pos);
> +		I915_WRITE(PS_WIN_SZ(pipe), crtc->config->pch_pfit.size);
>  	}
>  }
>  
> @@ -4022,7 +4022,7 @@ static void ironlake_pfit_enable(struct intel_crtc *crtc)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	int pipe = crtc->pipe;
>  
> -	if (crtc->config.pch_pfit.enabled) {
> +	if (crtc->config->pch_pfit.enabled) {
>  		/* Force use of hard-coded filter coefficients
>  		 * as some pre-programmed values are broken,
>  		 * e.g. x201.
> @@ -4032,8 +4032,8 @@ static void ironlake_pfit_enable(struct intel_crtc *crtc)
>  						 PF_PIPE_SEL_IVB(pipe));
>  		else
>  			I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
> -		I915_WRITE(PF_WIN_POS(pipe), crtc->config.pch_pfit.pos);
> -		I915_WRITE(PF_WIN_SZ(pipe), crtc->config.pch_pfit.size);
> +		I915_WRITE(PF_WIN_POS(pipe), crtc->config->pch_pfit.pos);
> +		I915_WRITE(PF_WIN_SZ(pipe), crtc->config->pch_pfit.size);
>  	}
>  }
>  
> @@ -4070,7 +4070,7 @@ void hsw_enable_ips(struct intel_crtc *crtc)
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	if (!crtc->config.ips_enabled)
> +	if (!crtc->config->ips_enabled)
>  		return;
>  
>  	/* We can only enable IPS after we enable a plane and wait for a vblank */
> @@ -4103,7 +4103,7 @@ void hsw_disable_ips(struct intel_crtc *crtc)
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	if (!crtc->config.ips_enabled)
> +	if (!crtc->config->ips_enabled)
>  		return;
>  
>  	assert_plane_enabled(dev_priv, crtc->plane);
> @@ -4152,7 +4152,7 @@ static void intel_crtc_load_lut(struct drm_crtc *crtc)
>  	/* Workaround : Do not read or write the pipe palette/gamma data while
>  	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
>  	 */
> -	if (IS_HASWELL(dev) && intel_crtc->config.ips_enabled &&
> +	if (IS_HASWELL(dev) && intel_crtc->config->ips_enabled &&
>  	    ((I915_READ(GAMMA_MODE(pipe)) & GAMMA_MODE_MODE_MASK) ==
>  	     GAMMA_MODE_MODE_SPLIT)) {
>  		hsw_disable_ips(intel_crtc);
> @@ -4254,17 +4254,17 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
>  	if (intel_crtc->active)
>  		return;
>  
> -	if (intel_crtc->config.has_pch_encoder)
> +	if (intel_crtc->config->has_pch_encoder)
>  		intel_prepare_shared_dpll(intel_crtc);
>  
> -	if (intel_crtc->config.has_dp_encoder)
> +	if (intel_crtc->config->has_dp_encoder)
>  		intel_dp_set_m_n(intel_crtc);
>  
>  	intel_set_pipe_timings(intel_crtc);
>  
> -	if (intel_crtc->config.has_pch_encoder) {
> +	if (intel_crtc->config->has_pch_encoder) {
>  		intel_cpu_transcoder_set_m_n(intel_crtc,
> -				     &intel_crtc->config.fdi_m_n, NULL);
> +				     &intel_crtc->config->fdi_m_n, NULL);
>  	}
>  
>  	ironlake_set_pipeconf(crtc);
> @@ -4278,7 +4278,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
>  		if (encoder->pre_enable)
>  			encoder->pre_enable(encoder);
>  
> -	if (intel_crtc->config.has_pch_encoder) {
> +	if (intel_crtc->config->has_pch_encoder) {
>  		/* Note: FDI PLL enabling _must_ be done before we enable the
>  		 * cpu pipes, hence this is separate from all the other fdi/pch
>  		 * enabling. */
> @@ -4299,7 +4299,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
>  	intel_update_watermarks(crtc);
>  	intel_enable_pipe(intel_crtc);
>  
> -	if (intel_crtc->config.has_pch_encoder)
> +	if (intel_crtc->config->has_pch_encoder)
>  		ironlake_pch_enable(crtc);
>  
>  	for_each_encoder_on_crtc(dev, crtc, encoder)
> @@ -4365,19 +4365,19 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
>  	if (intel_crtc_to_shared_dpll(intel_crtc))
>  		intel_enable_shared_dpll(intel_crtc);
>  
> -	if (intel_crtc->config.has_dp_encoder)
> +	if (intel_crtc->config->has_dp_encoder)
>  		intel_dp_set_m_n(intel_crtc);
>  
>  	intel_set_pipe_timings(intel_crtc);
>  
> -	if (intel_crtc->config.cpu_transcoder != TRANSCODER_EDP) {
> -		I915_WRITE(PIPE_MULT(intel_crtc->config.cpu_transcoder),
> -			   intel_crtc->config.pixel_multiplier - 1);
> +	if (intel_crtc->config->cpu_transcoder != TRANSCODER_EDP) {
> +		I915_WRITE(PIPE_MULT(intel_crtc->config->cpu_transcoder),
> +			   intel_crtc->config->pixel_multiplier - 1);
>  	}
>  
> -	if (intel_crtc->config.has_pch_encoder) {
> +	if (intel_crtc->config->has_pch_encoder) {
>  		intel_cpu_transcoder_set_m_n(intel_crtc,
> -				     &intel_crtc->config.fdi_m_n, NULL);
> +				     &intel_crtc->config->fdi_m_n, NULL);
>  	}
>  
>  	haswell_set_pipeconf(crtc);
> @@ -4391,7 +4391,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
>  		if (encoder->pre_enable)
>  			encoder->pre_enable(encoder);
>  
> -	if (intel_crtc->config.has_pch_encoder) {
> +	if (intel_crtc->config->has_pch_encoder) {
>  		intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
>  						      true);
>  		dev_priv->display.fdi_link_train(crtc);
> @@ -4416,10 +4416,10 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
>  	intel_update_watermarks(crtc);
>  	intel_enable_pipe(intel_crtc);
>  
> -	if (intel_crtc->config.has_pch_encoder)
> +	if (intel_crtc->config->has_pch_encoder)
>  		lpt_pch_enable(crtc);
>  
> -	if (intel_crtc->config.dp_encoder_is_mst)
> +	if (intel_crtc->config->dp_encoder_is_mst)
>  		intel_ddi_set_vc_payload_alloc(crtc, true);
>  
>  	for_each_encoder_on_crtc(dev, crtc, encoder) {
> @@ -4444,7 +4444,7 @@ static void skylake_pfit_disable(struct intel_crtc *crtc)
>  
>  	/* To avoid upsetting the power well on haswell only disable the pfit if
>  	 * it's in use. The hw state code will make sure we get this right. */
> -	if (crtc->config.pch_pfit.enabled) {
> +	if (crtc->config->pch_pfit.enabled) {
>  		I915_WRITE(PS_CTL(pipe), 0);
>  		I915_WRITE(PS_WIN_POS(pipe), 0);
>  		I915_WRITE(PS_WIN_SZ(pipe), 0);
> @@ -4459,7 +4459,7 @@ static void ironlake_pfit_disable(struct intel_crtc *crtc)
>  
>  	/* To avoid upsetting the power well on haswell only disable the pfit if
>  	 * it's in use. The hw state code will make sure we get this right. */
> -	if (crtc->config.pch_pfit.enabled) {
> +	if (crtc->config->pch_pfit.enabled) {
>  		I915_WRITE(PF_CTL(pipe), 0);
>  		I915_WRITE(PF_WIN_POS(pipe), 0);
>  		I915_WRITE(PF_WIN_SZ(pipe), 0);
> @@ -4486,7 +4486,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
>  	for_each_encoder_on_crtc(dev, crtc, encoder)
>  		encoder->disable(encoder);
>  
> -	if (intel_crtc->config.has_pch_encoder)
> +	if (intel_crtc->config->has_pch_encoder)
>  		intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
>  
>  	intel_disable_pipe(intel_crtc);
> @@ -4497,7 +4497,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
>  		if (encoder->post_disable)
>  			encoder->post_disable(encoder);
>  
> -	if (intel_crtc->config.has_pch_encoder) {
> +	if (intel_crtc->config->has_pch_encoder) {
>  		ironlake_fdi_disable(crtc);
>  
>  		ironlake_disable_pch_transcoder(dev_priv, pipe);
> @@ -4537,7 +4537,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	struct intel_encoder *encoder;
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  
>  	if (!intel_crtc->active)
>  		return;
> @@ -4552,12 +4552,12 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
>  		encoder->disable(encoder);
>  	}
>  
> -	if (intel_crtc->config.has_pch_encoder)
> +	if (intel_crtc->config->has_pch_encoder)
>  		intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
>  						      false);
>  	intel_disable_pipe(intel_crtc);
>  
> -	if (intel_crtc->config.dp_encoder_is_mst)
> +	if (intel_crtc->config->dp_encoder_is_mst)
>  		intel_ddi_set_vc_payload_alloc(crtc, false);
>  
>  	intel_ddi_disable_transcoder_func(dev_priv, cpu_transcoder);
> @@ -4569,7 +4569,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
>  
>  	intel_ddi_disable_pipe_clock(intel_crtc);
>  
> -	if (intel_crtc->config.has_pch_encoder) {
> +	if (intel_crtc->config->has_pch_encoder) {
>  		lpt_disable_pch_transcoder(dev_priv);
>  		intel_ddi_fdi_disable(crtc);
>  	}
> @@ -4600,7 +4600,7 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc)
>  {
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	struct intel_crtc_state *pipe_config = &crtc->config;
> +	struct intel_crtc_state *pipe_config = crtc->config;
>  
>  	if (!pipe_config->gmch_pfit.control)
>  		return;
> @@ -4681,8 +4681,8 @@ static unsigned long get_crtc_power_domains(struct drm_crtc *crtc)
>  
>  	mask = BIT(POWER_DOMAIN_PIPE(pipe));
>  	mask |= BIT(POWER_DOMAIN_TRANSCODER(transcoder));
> -	if (intel_crtc->config.pch_pfit.enabled ||
> -	    intel_crtc->config.pch_pfit.force_thru)
> +	if (intel_crtc->config->pch_pfit.enabled ||
> +	    intel_crtc->config->pch_pfit.force_thru)
>  		mask |= BIT(POWER_DOMAIN_PIPE_PANEL_FITTER(pipe));
>  
>  	for_each_encoder_on_crtc(dev, crtc, intel_encoder)
> @@ -4986,12 +4986,12 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
>  
>  	if (!is_dsi) {
>  		if (IS_CHERRYVIEW(dev))
> -			chv_prepare_pll(intel_crtc, &intel_crtc->config);
> +			chv_prepare_pll(intel_crtc, intel_crtc->config);
>  		else
> -			vlv_prepare_pll(intel_crtc, &intel_crtc->config);
> +			vlv_prepare_pll(intel_crtc, intel_crtc->config);
>  	}
>  
> -	if (intel_crtc->config.has_dp_encoder)
> +	if (intel_crtc->config->has_dp_encoder)
>  		intel_dp_set_m_n(intel_crtc);
>  
>  	intel_set_pipe_timings(intel_crtc);
> @@ -5015,9 +5015,9 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
>  
>  	if (!is_dsi) {
>  		if (IS_CHERRYVIEW(dev))
> -			chv_enable_pll(intel_crtc, &intel_crtc->config);
> +			chv_enable_pll(intel_crtc, intel_crtc->config);
>  		else
> -			vlv_enable_pll(intel_crtc, &intel_crtc->config);
> +			vlv_enable_pll(intel_crtc, intel_crtc->config);
>  	}
>  
>  	for_each_encoder_on_crtc(dev, crtc, encoder)
> @@ -5048,8 +5048,8 @@ static void i9xx_set_pll_dividers(struct intel_crtc *crtc)
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	I915_WRITE(FP0(crtc->pipe), crtc->config.dpll_hw_state.fp0);
> -	I915_WRITE(FP1(crtc->pipe), crtc->config.dpll_hw_state.fp1);
> +	I915_WRITE(FP0(crtc->pipe), crtc->config->dpll_hw_state.fp0);
> +	I915_WRITE(FP1(crtc->pipe), crtc->config->dpll_hw_state.fp1);
>  }
>  
>  static void i9xx_crtc_enable(struct drm_crtc *crtc)
> @@ -5067,7 +5067,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
>  
>  	i9xx_set_pll_dividers(intel_crtc);
>  
> -	if (intel_crtc->config.has_dp_encoder)
> +	if (intel_crtc->config->has_dp_encoder)
>  		intel_dp_set_m_n(intel_crtc);
>  
>  	intel_set_pipe_timings(intel_crtc);
> @@ -5119,7 +5119,7 @@ static void i9xx_pfit_disable(struct intel_crtc *crtc)
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	if (!crtc->config.gmch_pfit.control)
> +	if (!crtc->config->gmch_pfit.control)
>  		return;
>  
>  	assert_pipe_disabled(dev_priv, crtc->pipe);
> @@ -5418,7 +5418,7 @@ static bool ironlake_check_fdi_lanes(struct drm_device *dev, enum pipe pipe,
>  		return true;
>  	case PIPE_C:
>  		if (!pipe_has_enabled_pch(pipe_B_crtc) ||
> -		    pipe_B_crtc->config.fdi_lanes <= 2) {
> +		    pipe_B_crtc->config->fdi_lanes <= 2) {
>  			if (pipe_config->fdi_lanes > 2) {
>  				DRM_DEBUG_KMS("invalid shared fdi lane config on pipe %c: %i lanes\n",
>  					      pipe_name(pipe), pipe_config->fdi_lanes);
> @@ -5816,7 +5816,7 @@ static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
>  	struct drm_device *dev = crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	int pipe = crtc->pipe;
> -	enum transcoder transcoder = crtc->config.cpu_transcoder;
> +	enum transcoder transcoder = crtc->config->cpu_transcoder;
>  
>  	if (INTEL_INFO(dev)->gen >= 5) {
>  		I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m);
> @@ -5828,7 +5828,7 @@ static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
>  		 * registers are not unnecessarily accessed).
>  		 */
>  		if (m2_n2 && INTEL_INFO(dev)->gen < 8 &&
> -			crtc->config.has_drrs) {
> +			crtc->config->has_drrs) {
>  			I915_WRITE(PIPE_DATA_M2(transcoder),
>  					TU_SIZE(m2_n2->tu) | m2_n2->gmch_m);
>  			I915_WRITE(PIPE_DATA_N2(transcoder), m2_n2->gmch_n);
> @@ -5845,11 +5845,11 @@ static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
>  
>  void intel_dp_set_m_n(struct intel_crtc *crtc)
>  {
> -	if (crtc->config.has_pch_encoder)
> -		intel_pch_transcoder_set_m_n(crtc, &crtc->config.dp_m_n);
> +	if (crtc->config->has_pch_encoder)
> +		intel_pch_transcoder_set_m_n(crtc, &crtc->config->dp_m_n);
>  	else
> -		intel_cpu_transcoder_set_m_n(crtc, &crtc->config.dp_m_n,
> -						   &crtc->config.dp_m2_n2);
> +		intel_cpu_transcoder_set_m_n(crtc, &crtc->config->dp_m_n,
> +						   &crtc->config->dp_m2_n2);
>  }
>  
>  static void vlv_update_pll(struct intel_crtc *crtc,
> @@ -6217,9 +6217,9 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc)
>  	struct drm_device *dev = intel_crtc->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	enum pipe pipe = intel_crtc->pipe;
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	struct drm_display_mode *adjusted_mode =
> -		&intel_crtc->config.base.adjusted_mode;
> +		&intel_crtc->config->base.adjusted_mode;
>  	uint32_t crtc_vtotal, crtc_vblank_end;
>  	int vsyncshift = 0;
>  
> @@ -6277,8 +6277,8 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc)
>  	 * always be the user's requested size.
>  	 */
>  	I915_WRITE(PIPESRC(pipe),
> -		   ((intel_crtc->config.pipe_src_w - 1) << 16) |
> -		   (intel_crtc->config.pipe_src_h - 1));
> +		   ((intel_crtc->config->pipe_src_w - 1) << 16) |
> +		   (intel_crtc->config->pipe_src_h - 1));
>  }
>  
>  static void intel_get_pipe_timings(struct intel_crtc *crtc,
> @@ -6354,17 +6354,17 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
>  	    (intel_crtc->pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE))
>  		pipeconf |= I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE;
>  
> -	if (intel_crtc->config.double_wide)
> +	if (intel_crtc->config->double_wide)
>  		pipeconf |= PIPECONF_DOUBLE_WIDE;
>  
>  	/* only g4x and later have fancy bpc/dither controls */
>  	if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {
>  		/* Bspec claims that we can't use dithering for 30bpp pipes. */
> -		if (intel_crtc->config.dither && intel_crtc->config.pipe_bpp != 30)
> +		if (intel_crtc->config->dither && intel_crtc->config->pipe_bpp != 30)
>  			pipeconf |= PIPECONF_DITHER_EN |
>  				    PIPECONF_DITHER_TYPE_SP;
>  
> -		switch (intel_crtc->config.pipe_bpp) {
> +		switch (intel_crtc->config->pipe_bpp) {
>  		case 18:
>  			pipeconf |= PIPECONF_6BPC;
>  			break;
> @@ -6389,7 +6389,7 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
>  		}
>  	}
>  
> -	if (intel_crtc->config.base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
> +	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
>  		if (INTEL_INFO(dev)->gen < 4 ||
>  		    intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_SDVO))
>  			pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
> @@ -6398,7 +6398,7 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
>  	} else
>  		pipeconf |= PIPECONF_PROGRESSIVE;
>  
> -	if (IS_VALLEYVIEW(dev) && intel_crtc->config.limited_color_range)
> +	if (IS_VALLEYVIEW(dev) && intel_crtc->config->limited_color_range)
>  		pipeconf |= PIPECONF_COLOR_RANGE_SELECT;
>  
>  	I915_WRITE(PIPECONF(intel_crtc->pipe), pipeconf);
> @@ -7126,7 +7126,7 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc)
>  
>  	val = 0;
>  
> -	switch (intel_crtc->config.pipe_bpp) {
> +	switch (intel_crtc->config->pipe_bpp) {
>  	case 18:
>  		val |= PIPECONF_6BPC;
>  		break;
> @@ -7144,15 +7144,15 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc)
>  		BUG();
>  	}
>  
> -	if (intel_crtc->config.dither)
> +	if (intel_crtc->config->dither)
>  		val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
>  
> -	if (intel_crtc->config.base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
> +	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
>  		val |= PIPECONF_INTERLACED_ILK;
>  	else
>  		val |= PIPECONF_PROGRESSIVE;
>  
> -	if (intel_crtc->config.limited_color_range)
> +	if (intel_crtc->config->limited_color_range)
>  		val |= PIPECONF_COLOR_RANGE_SELECT;
>  
>  	I915_WRITE(PIPECONF(pipe), val);
> @@ -7181,7 +7181,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc)
>  	 * consideration.
>  	 */
>  
> -	if (intel_crtc->config.limited_color_range)
> +	if (intel_crtc->config->limited_color_range)
>  		coeff = ((235 - 16) * (1 << 12) / 255) & 0xff8; /* 0.xxx... */
>  
>  	/*
> @@ -7205,7 +7205,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc)
>  	if (INTEL_INFO(dev)->gen > 6) {
>  		uint16_t postoff = 0;
>  
> -		if (intel_crtc->config.limited_color_range)
> +		if (intel_crtc->config->limited_color_range)
>  			postoff = (16 * (1 << 12) / 255) & 0x1fff;
>  
>  		I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff);
> @@ -7216,7 +7216,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc)
>  	} else {
>  		uint32_t mode = CSC_MODE_YUV_TO_RGB;
>  
> -		if (intel_crtc->config.limited_color_range)
> +		if (intel_crtc->config->limited_color_range)
>  			mode |= CSC_BLACK_SCREEN_OFFSET;
>  
>  		I915_WRITE(PIPE_CSC_MODE(pipe), mode);
> @@ -7229,15 +7229,15 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	enum pipe pipe = intel_crtc->pipe;
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	uint32_t val;
>  
>  	val = 0;
>  
> -	if (IS_HASWELL(dev) && intel_crtc->config.dither)
> +	if (IS_HASWELL(dev) && intel_crtc->config->dither)
>  		val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
>  
> -	if (intel_crtc->config.base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
> +	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
>  		val |= PIPECONF_INTERLACED_ILK;
>  	else
>  		val |= PIPECONF_PROGRESSIVE;
> @@ -7251,7 +7251,7 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
>  	if (IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) {
>  		val = 0;
>  
> -		switch (intel_crtc->config.pipe_bpp) {
> +		switch (intel_crtc->config->pipe_bpp) {
>  		case 18:
>  			val |= PIPEMISC_DITHER_6_BPC;
>  			break;
> @@ -7269,7 +7269,7 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
>  			BUG();
>  		}
>  
> -		if (intel_crtc->config.dither)
> +		if (intel_crtc->config->dither)
>  			val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
>  
>  		I915_WRITE(PIPEMISC(pipe), val);
> @@ -7530,7 +7530,7 @@ static void intel_cpu_transcoder_get_m_n(struct intel_crtc *crtc,
>  		 * registers are not unnecessarily read).
>  		 */
>  		if (m2_n2 && INTEL_INFO(dev)->gen < 8 &&
> -			crtc->config.has_drrs) {
> +			crtc->config->has_drrs) {
>  			m2_n2->link_m = I915_READ(PIPE_LINK_M2(transcoder));
>  			m2_n2->link_n =	I915_READ(PIPE_LINK_N2(transcoder));
>  			m2_n2->gmch_m =	I915_READ(PIPE_DATA_M2(transcoder))
> @@ -8282,10 +8282,10 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
>  	if (on)
>  		base = intel_crtc->cursor_addr;
>  
> -	if (x >= intel_crtc->config.pipe_src_w)
> +	if (x >= intel_crtc->config->pipe_src_w)
>  		base = 0;
>  
> -	if (y >= intel_crtc->config.pipe_src_h)
> +	if (y >= intel_crtc->config->pipe_src_h)
>  		base = 0;
>  
>  	if (x < 0) {
> @@ -8812,7 +8812,7 @@ struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> -	enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
>  	struct drm_display_mode *mode;
>  	struct intel_crtc_state pipe_config;
>  	int htot = I915_READ(HTOTAL(cpu_transcoder));
> @@ -10769,11 +10769,11 @@ check_crtc_state(struct drm_device *dev)
>  		     "(expected %i, found %i)\n", crtc->active, active);
>  
>  		if (active &&
> -		    !intel_pipe_config_compare(dev, &crtc->config, &pipe_config)) {
> +		    !intel_pipe_config_compare(dev, crtc->config, &pipe_config)) {
>  			WARN(1, "pipe state doesn't match!\n");
>  			intel_dump_pipe_config(crtc, &pipe_config,
>  					       "[hw state]");
> -			intel_dump_pipe_config(crtc, &crtc->config,
> +			intel_dump_pipe_config(crtc, crtc->config,
>  					       "[sw state]");
>  		}
>  	}
> @@ -10873,7 +10873,7 @@ static void update_scanline_offset(struct intel_crtc *crtc)
>  	 * one to the value.
>  	 */
>  	if (IS_GEN2(dev)) {
> -		const struct drm_display_mode *mode = &crtc->config.base.adjusted_mode;
> +		const struct drm_display_mode *mode = &crtc->config->base.adjusted_mode;
>  		int vtotal;
>  
>  		vtotal = mode->crtc_vtotal;
> @@ -10921,6 +10921,13 @@ out:
>  	return pipe_config;
>  }
>  
> +static void intel_crtc_set_state(struct intel_crtc *crtc,
> +				 struct intel_crtc_state *crtc_state)
> +{
> +	kfree(crtc->config);
> +	crtc->config = crtc_state;
> +}
> +
>  static int __intel_set_mode(struct drm_crtc *crtc,
>  			    struct drm_display_mode *mode,
>  			    int x, int y, struct drm_framebuffer *fb,
> @@ -11000,7 +11007,7 @@ static int __intel_set_mode(struct drm_crtc *crtc,
>  		crtc->mode = *mode;
>  		/* mode_set/enable/disable functions rely on a correct pipe
>  		 * config. */
> -		to_intel_crtc(crtc)->config = *pipe_config;
> +		intel_crtc_set_state(to_intel_crtc(crtc), pipe_config);
>  
>  		/*
>  		 * Calculate and store various constants which
> @@ -11044,7 +11051,6 @@ done:
>  	if (ret && crtc->enabled)
>  		crtc->mode = *saved_mode;
>  
> -	kfree(pipe_config);
>  	kfree(saved_mode);
>  	return ret;
>  }
> @@ -11461,7 +11467,7 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
>  		goto fail;
>  	} else if (pipe_config) {
>  		if (pipe_config->has_audio !=
> -		    to_intel_crtc(set->crtc)->config.has_audio)
> +		    to_intel_crtc(set->crtc)->config->has_audio)
>  			config->mode_changed = true;
>  
>  		/*
> @@ -11886,8 +11892,8 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
>  
>  	state.clip.x1 = 0;
>  	state.clip.y1 = 0;
> -	state.clip.x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0;
> -	state.clip.y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0;
> +	state.clip.x2 = intel_crtc->active ? intel_crtc->config->pipe_src_w : 0;
> +	state.clip.y2 = intel_crtc->active ? intel_crtc->config->pipe_src_h : 0;
>  
>  	state.orig_src = state.src;
>  	state.orig_dst = state.dst;
> @@ -12169,6 +12175,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc;
> +	struct intel_crtc_state *crtc_state = NULL;
>  	struct drm_plane *primary = NULL;
>  	struct drm_plane *cursor = NULL;
>  	int i, ret;
> @@ -12177,6 +12184,11 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  	if (intel_crtc == NULL)
>  		return;
>  
> +	crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
> +	if (!crtc_state)
> +		goto fail;
> +	intel_crtc_set_state(intel_crtc, crtc_state);
> +
>  	primary = intel_primary_plane_create(dev, pipe);
>  	if (!primary)
>  		goto fail;
> @@ -12229,6 +12241,7 @@ fail:
>  		drm_plane_cleanup(primary);
>  	if (cursor)
>  		drm_plane_cleanup(cursor);
> +	kfree(crtc_state);
>  	kfree(intel_crtc);
>  }
>  
> @@ -13131,7 +13144,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
>  	u32 reg;
>  
>  	/* Clear any frame start delays used for debugging left by the BIOS */
> -	reg = PIPECONF(crtc->config.cpu_transcoder);
> +	reg = PIPECONF(crtc->config->cpu_transcoder);
>  	I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
>  
>  	/* restore vblank interrupts to correct state */
> @@ -13335,12 +13348,12 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
>  	int i;
>  
>  	for_each_intel_crtc(dev, crtc) {
> -		memset(&crtc->config, 0, sizeof(crtc->config));
> +		memset(crtc->config, 0, sizeof(*crtc->config));
>  
> -		crtc->config.quirks |= PIPE_CONFIG_QUIRK_INHERITED_MODE;
> +		crtc->config->quirks |= PIPE_CONFIG_QUIRK_INHERITED_MODE;
>  
>  		crtc->active = dev_priv->display.get_pipe_config(crtc,
> -								 &crtc->config);
> +								 crtc->config);
>  
>  		crtc->base.enabled = crtc->active;
>  		crtc->primary_enabled = primary_get_hw_state(crtc);
> @@ -13377,7 +13390,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
>  		if (encoder->get_hw_state(encoder, &pipe)) {
>  			crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
>  			encoder->base.crtc = &crtc->base;
> -			encoder->get_config(encoder, &crtc->config);
> +			encoder->get_config(encoder, crtc->config);
>  		} else {
>  			encoder->base.crtc = NULL;
>  		}
> @@ -13427,7 +13440,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
>  	 */
>  	for_each_intel_crtc(dev, crtc) {
>  		if (crtc->active && i915.fastboot) {
> -			intel_mode_from_pipe_config(&crtc->base.mode, &crtc->config);
> +			intel_mode_from_pipe_config(&crtc->base.mode, crtc->config);
>  			DRM_DEBUG_KMS("[CRTC:%d] found active mode: ",
>  				      crtc->base.base.id);
>  			drm_mode_debug_printmodeline(&crtc->base.mode);
> @@ -13442,7 +13455,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
>  	for_each_pipe(dev_priv, pipe) {
>  		crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
>  		intel_sanitize_crtc(crtc);
> -		intel_dump_pipe_config(crtc, &crtc->config, "[setup_hw_state]");
> +		intel_dump_pipe_config(crtc, crtc->config, "[setup_hw_state]");
>  	}
>  
>  	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 67cdbe8..d6f0d90 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -1295,11 +1295,11 @@ static void ironlake_set_pll_cpu_edp(struct intel_dp *intel_dp)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	u32 dpa_ctl;
>  
> -	DRM_DEBUG_KMS("eDP PLL enable for clock %d\n", crtc->config.port_clock);
> +	DRM_DEBUG_KMS("eDP PLL enable for clock %d\n", crtc->config->port_clock);
>  	dpa_ctl = I915_READ(DP_A);
>  	dpa_ctl &= ~DP_PLL_FREQ_MASK;
>  
> -	if (crtc->config.port_clock == 162000) {
> +	if (crtc->config->port_clock == 162000) {
>  		/* For a long time we've carried around a ILK-DevA w/a for the
>  		 * 160MHz clock. If we're really unlucky, it's still required.
>  		 */
> @@ -1324,7 +1324,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder)
>  	struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
>  	enum port port = dp_to_dig_port(intel_dp)->port;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
> -	struct drm_display_mode *adjusted_mode = &crtc->config.base.adjusted_mode;
> +	struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
>  
>  	/*
>  	 * There are four kinds of DP registers:
> @@ -1352,7 +1352,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder)
>  	intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
>  	intel_dp->DP |= DP_PORT_WIDTH(intel_dp->lane_count);
>  
> -	if (crtc->config.has_audio)
> +	if (crtc->config->has_audio)
>  		intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
>  
>  	/* Split out the IBX/CPU vs CPT settings */
> @@ -2102,7 +2102,7 @@ static void intel_disable_dp(struct intel_encoder *encoder)
>  	struct drm_device *dev = encoder->base.dev;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
>  
> -	if (crtc->config.has_audio)
> +	if (crtc->config->has_audio)
>  		intel_audio_codec_disable(encoder);
>  
>  	if (HAS_PSR(dev) && !HAS_DDI(dev))
> @@ -2312,7 +2312,7 @@ static void intel_enable_dp(struct intel_encoder *encoder)
>  	intel_dp_complete_link_train(intel_dp);
>  	intel_dp_stop_link_train(intel_dp);
>  
> -	if (crtc->config.has_audio) {
> +	if (crtc->config->has_audio) {
>  		DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n",
>  				 pipe_name(crtc->pipe));
>  		intel_audio_codec_enable(encoder);
> @@ -4780,7 +4780,7 @@ void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
>  		return;
>  	}
>  
> -	config = &intel_crtc->config;
> +	config = intel_crtc->config;
>  
>  	if (intel_dp->drrs_state.type < SEAMLESS_DRRS_SUPPORT) {
>  		DRM_DEBUG_KMS("Only Seamless DRRS supported.\n");
> @@ -4802,7 +4802,7 @@ void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
>  	}
>  
>  	if (INTEL_INFO(dev)->gen > 6 && INTEL_INFO(dev)->gen < 8) {
> -		reg = PIPECONF(intel_crtc->config.cpu_transcoder);
> +		reg = PIPECONF(intel_crtc->config->cpu_transcoder);
>  		val = I915_READ(reg);
>  		if (index > DRRS_HIGH_RR) {
>  			val |= PIPECONF_EDP_RR_MODE_SWITCH;
> diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
> index 257aca1..28b6ee4 100644
> --- a/drivers/gpu/drm/i915/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/intel_dp_mst.c
> @@ -157,7 +157,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
>  	if (intel_dp->active_mst_links == 0) {
>  		enum port port = intel_ddi_get_encoder_port(encoder);
>  
> -		I915_WRITE(PORT_CLK_SEL(port), intel_crtc->config.ddi_pll_sel);
> +		I915_WRITE(PORT_CLK_SEL(port), intel_crtc->config->ddi_pll_sel);
>  
>  		intel_ddi_init_dp_buf_reg(&intel_dig_port->base);
>  
> @@ -170,7 +170,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
>  	}
>  
>  	ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr,
> -				       intel_mst->port, intel_crtc->config.pbn, &slots);
> +				       intel_mst->port, intel_crtc->config->pbn,
> +							      &slots);
>  	if (ret == false) {
>  		DRM_ERROR("failed to allocate vcpi\n");
>  		return;
> @@ -223,7 +224,7 @@ static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
>  	struct drm_device *dev = encoder->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> -	enum transcoder cpu_transcoder = crtc->config.cpu_transcoder;
> +	enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
>  	u32 temp, flags = 0;
>  
>  	pipe_config->has_dp_encoder = true;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 175b853..01d6fa1 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -439,7 +439,7 @@ struct intel_crtc {
>  	uint32_t cursor_base;
>  
>  	struct intel_plane_config plane_config;
> -	struct intel_crtc_state config;
> +	struct intel_crtc_state *config;
>  	bool new_enabled;
>  
>  	/* reset counter value when the last flip was submitted */
> diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
> index 25291e9..5d9ec7b 100644
> --- a/drivers/gpu/drm/i915/intel_dsi.c
> +++ b/drivers/gpu/drm/i915/intel_dsi.c
> @@ -232,7 +232,7 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
>  	I915_WRITE(DPLL(pipe), tmp);
>  
>  	/* update the hw state for DPLL */
> -	intel_crtc->config.dpll_hw_state.dpll = DPLL_INTEGRATED_CLOCK_VLV |
> +	intel_crtc->config->dpll_hw_state.dpll = DPLL_INTEGRATED_CLOCK_VLV |
>  		DPLL_REFA_CLK_ENABLE_VLV;
>  
>  	tmp = I915_READ(DSPCLK_GATE_D);
> @@ -494,7 +494,7 @@ static void set_dsi_timings(struct drm_encoder *encoder,
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
>  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
>  	enum port port;
> -	unsigned int bpp = intel_crtc->config.pipe_bpp;
> +	unsigned int bpp = intel_crtc->config->pipe_bpp;
>  	unsigned int lane_count = intel_dsi->lane_count;
>  
>  	u16 hactive, hfp, hsync, hbp, vfp, vsync, vbp;
> @@ -549,9 +549,9 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
>  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
>  	struct drm_display_mode *adjusted_mode =
> -		&intel_crtc->config.base.adjusted_mode;
> +		&intel_crtc->config->base.adjusted_mode;
>  	enum port port;
> -	unsigned int bpp = intel_crtc->config.pipe_bpp;
> +	unsigned int bpp = intel_crtc->config->pipe_bpp;
>  	u32 val, tmp;
>  	u16 mode_hdisplay;
>  
> diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
> index 108f058..706ab99 100644
> --- a/drivers/gpu/drm/i915/intel_dvo.c
> +++ b/drivers/gpu/drm/i915/intel_dvo.c
> @@ -186,8 +186,8 @@ static void intel_enable_dvo(struct intel_encoder *encoder)
>  	u32 temp = I915_READ(dvo_reg);
>  
>  	intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev,
> -					 &crtc->config.base.mode,
> -					 &crtc->config.base.adjusted_mode);
> +					 &crtc->config->base.mode,
> +					 &crtc->config->base.adjusted_mode);
>  
>  	I915_WRITE(dvo_reg, temp | DVO_ENABLE);
>  	I915_READ(dvo_reg);
> @@ -221,7 +221,7 @@ static void intel_dvo_dpms(struct drm_connector *connector, int mode)
>  	/* We call connector dpms manually below in case pipe dpms doesn't
>  	 * change due to cloning. */
>  	if (mode == DRM_MODE_DPMS_ON) {
> -		config = &to_intel_crtc(crtc)->config;
> +		config = to_intel_crtc(crtc)->config;
>  
>  		intel_dvo->base.connectors_active = true;
>  
> @@ -295,7 +295,7 @@ static void intel_dvo_pre_enable(struct intel_encoder *encoder)
>  	struct drm_device *dev = encoder->base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
> -	struct drm_display_mode *adjusted_mode = &crtc->config.base.adjusted_mode;
> +	struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
>  	struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
>  	int pipe = crtc->pipe;
>  	u32 dvo_val;
> diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> index 1a9a727..f426e7c 100644
> --- a/drivers/gpu/drm/i915/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/intel_fbdev.c
> @@ -431,7 +431,7 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
>  			DRM_DEBUG_KMS("looking for current mode on connector %s\n",
>  				      connector->name);
>  			intel_mode_from_pipe_config(&encoder->crtc->hwmode,
> -						    &to_intel_crtc(encoder->crtc)->config);
> +						    to_intel_crtc(encoder->crtc)->config);
>  			modes[i] = &encoder->crtc->hwmode;
>  		}
>  		crtcs[i] = new_crtc;
> @@ -563,7 +563,7 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
>  		 * pipe.  Note we need to use the selected fb's pitch and bpp
>  		 * rather than the current pipe's, since they differ.
>  		 */
> -		cur_size = intel_crtc->config.base.adjusted_mode.crtc_hdisplay;
> +		cur_size = intel_crtc->config->base.adjusted_mode.crtc_hdisplay;
>  		cur_size = cur_size * fb->base.bits_per_pixel / 8;
>  		if (fb->base.pitches[0] < cur_size) {
>  			DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
> @@ -574,13 +574,13 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
>  			break;
>  		}
>  
> -		cur_size = intel_crtc->config.base.adjusted_mode.crtc_vdisplay;
> +		cur_size = intel_crtc->config->base.adjusted_mode.crtc_vdisplay;
>  		cur_size = ALIGN(cur_size, plane_config->tiled ? (IS_GEN2(dev) ? 16 : 8) : 1);
>  		cur_size *= fb->base.pitches[0];
>  		DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
>  			      pipe_name(intel_crtc->pipe),
> -			      intel_crtc->config.base.adjusted_mode.crtc_hdisplay,
> -			      intel_crtc->config.base.adjusted_mode.crtc_vdisplay,
> +			      intel_crtc->config->base.adjusted_mode.crtc_hdisplay,
> +			      intel_crtc->config->base.adjusted_mode.crtc_vdisplay,
>  			      fb->base.bits_per_pixel,
>  			      cur_size);
>  
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index 02ff3e2..200a0e7 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -337,13 +337,13 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
>  	struct drm_device *dev = encoder->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
> -	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
> +	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
>  	u32 data_reg;
>  	int i;
>  	u32 val = I915_READ(ctl_reg);
>  
>  	data_reg = hsw_infoframe_data_reg(type,
> -					  intel_crtc->config.cpu_transcoder,
> +					  intel_crtc->config->cpu_transcoder,
>  					  dev_priv);
>  	if (data_reg == 0)
>  		return;
> @@ -371,7 +371,7 @@ static bool hsw_infoframe_enabled(struct drm_encoder *encoder)
>  	struct drm_device *dev = encoder->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
> -	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
> +	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
>  	u32 val = I915_READ(ctl_reg);
>  
>  	return val & (VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
> @@ -436,7 +436,7 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
>  	}
>  
>  	if (intel_hdmi->rgb_quant_range_selectable) {
> -		if (intel_crtc->config.limited_color_range)
> +		if (intel_crtc->config->limited_color_range)
>  			frame.avi.quantization_range =
>  				HDMI_QUANTIZATION_RANGE_LIMITED;
>  		else
> @@ -672,7 +672,7 @@ static void hsw_set_infoframes(struct drm_encoder *encoder,
>  	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
>  	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
> -	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
> +	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
>  	u32 val = I915_READ(reg);
>  
>  	assert_hdmi_port_disabled(intel_hdmi);
> @@ -700,7 +700,7 @@ static void intel_hdmi_prepare(struct intel_encoder *encoder)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
>  	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
> -	struct drm_display_mode *adjusted_mode = &crtc->config.base.adjusted_mode;
> +	struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
>  	u32 hdmi_val;
>  
>  	hdmi_val = SDVO_ENCODING_HDMI;
> @@ -711,12 +711,12 @@ static void intel_hdmi_prepare(struct intel_encoder *encoder)
>  	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
>  		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
>  
> -	if (crtc->config.pipe_bpp > 24)
> +	if (crtc->config->pipe_bpp > 24)
>  		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
>  	else
>  		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
>  
> -	if (crtc->config.has_hdmi_sink)
> +	if (crtc->config->has_hdmi_sink)
>  		hdmi_val |= HDMI_MODE_SELECT_HDMI;
>  
>  	if (HAS_PCH_CPT(dev))
> @@ -814,7 +814,7 @@ static void intel_enable_hdmi(struct intel_encoder *encoder)
>  	u32 temp;
>  	u32 enable_bits = SDVO_ENABLE;
>  
> -	if (intel_crtc->config.has_audio)
> +	if (intel_crtc->config->has_audio)
>  		enable_bits |= SDVO_AUDIO_ENABLE;
>  
>  	temp = I915_READ(intel_hdmi->hdmi_reg);
> @@ -845,8 +845,8 @@ static void intel_enable_hdmi(struct intel_encoder *encoder)
>  		POSTING_READ(intel_hdmi->hdmi_reg);
>  	}
>  
> -	if (intel_crtc->config.has_audio) {
> -		WARN_ON(!intel_crtc->config.has_hdmi_sink);
> +	if (intel_crtc->config->has_audio) {
> +		WARN_ON(!intel_crtc->config->has_hdmi_sink);
>  		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
>  				 pipe_name(intel_crtc->pipe));
>  		intel_audio_codec_enable(encoder);
> @@ -866,7 +866,7 @@ static void intel_disable_hdmi(struct intel_encoder *encoder)
>  	u32 temp;
>  	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
>  
> -	if (crtc->config.has_audio)
> +	if (crtc->config->has_audio)
>  		intel_audio_codec_disable(encoder);
>  
>  	temp = I915_READ(intel_hdmi->hdmi_reg);
> @@ -1252,12 +1252,12 @@ static void intel_hdmi_pre_enable(struct intel_encoder *encoder)
>  	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
>  	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
>  	struct drm_display_mode *adjusted_mode =
> -		&intel_crtc->config.base.adjusted_mode;
> +		&intel_crtc->config->base.adjusted_mode;
>  
>  	intel_hdmi_prepare(encoder);
>  
>  	intel_hdmi->set_infoframes(&encoder->base,
> -				   intel_crtc->config.has_hdmi_sink,
> +				   intel_crtc->config->has_hdmi_sink,
>  				   adjusted_mode);
>  }
>  
> @@ -1270,7 +1270,7 @@ static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
>  	struct intel_crtc *intel_crtc =
>  		to_intel_crtc(encoder->base.crtc);
>  	struct drm_display_mode *adjusted_mode =
> -		&intel_crtc->config.base.adjusted_mode;
> +		&intel_crtc->config->base.adjusted_mode;
>  	enum dpio_channel port = vlv_dport_to_channel(dport);
>  	int pipe = intel_crtc->pipe;
>  	u32 val;
> @@ -1302,7 +1302,7 @@ static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
>  	mutex_unlock(&dev_priv->dpio_lock);
>  
>  	intel_hdmi->set_infoframes(&encoder->base,
> -				   intel_crtc->config.has_hdmi_sink,
> +				   intel_crtc->config->has_hdmi_sink,
>  				   adjusted_mode);
>  
>  	intel_enable_hdmi(encoder);
> @@ -1467,7 +1467,7 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
>  	struct intel_crtc *intel_crtc =
>  		to_intel_crtc(encoder->base.crtc);
>  	struct drm_display_mode *adjusted_mode =
> -		&intel_crtc->config.base.adjusted_mode;
> +		&intel_crtc->config->base.adjusted_mode;
>  	enum dpio_channel ch = vlv_dport_to_channel(dport);
>  	int pipe = intel_crtc->pipe;
>  	int data, i;
> @@ -1593,7 +1593,7 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
>  	mutex_unlock(&dev_priv->dpio_lock);
>  
>  	intel_hdmi->set_infoframes(&encoder->base,
> -				   intel_crtc->config.has_hdmi_sink,
> +				   intel_crtc->config->has_hdmi_sink,
>  				   adjusted_mode);
>  
>  	intel_enable_hdmi(encoder);
> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
> index 9d174cf..c7c6414 100644
> --- a/drivers/gpu/drm/i915/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/intel_lvds.c
> @@ -139,7 +139,7 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
>  	const struct drm_display_mode *adjusted_mode =
> -		&crtc->config.base.adjusted_mode;
> +		&crtc->config->base.adjusted_mode;
>  	int pipe = crtc->pipe;
>  	u32 temp;
>  
> @@ -167,7 +167,7 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
>  
>  	/* set the corresponsding LVDS_BORDER bit */
>  	temp &= ~LVDS_BORDER_ENABLE;
> -	temp |= crtc->config.gmch_pfit.lvds_border_bits;
> +	temp |= crtc->config->gmch_pfit.lvds_border_bits;
>  	/* Set the B0-B3 data pairs corresponding to whether we're going to
>  	 * set the DPLLs for dual-channel mode or not.
>  	 */
> @@ -190,7 +190,7 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
>  	if (INTEL_INFO(dev)->gen == 4) {
>  		/* Bspec wording suggests that LVDS port dithering only exists
>  		 * for 18bpp panels. */
> -		if (crtc->config.dither && crtc->config.pipe_bpp == 18)
> +		if (crtc->config->dither && crtc->config->pipe_bpp == 18)
>  			temp |= LVDS_ENABLE_DITHER;
>  		else
>  			temp &= ~LVDS_ENABLE_DITHER;
> diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
> index 973c9de..f93dfc1 100644
> --- a/drivers/gpu/drm/i915/intel_overlay.c
> +++ b/drivers/gpu/drm/i915/intel_overlay.c
> @@ -856,7 +856,7 @@ static int check_overlay_possible_on_crtc(struct intel_overlay *overlay,
>  		return -EINVAL;
>  
>  	/* can't use the overlay with double wide pipe */
> -	if (crtc->config.double_wide)
> +	if (crtc->config->double_wide)
>  		return -EINVAL;
>  
>  	return 0;
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 47b23b7..22e49f4 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -574,7 +574,7 @@ void intel_update_fbc(struct drm_device *dev)
>  	intel_crtc = to_intel_crtc(crtc);
>  	fb = crtc->primary->fb;
>  	obj = intel_fb_obj(fb);
> -	adjusted_mode = &intel_crtc->config.base.adjusted_mode;
> +	adjusted_mode = &intel_crtc->config->base.adjusted_mode;
>  
>  	if (i915.enable_fbc < 0) {
>  		if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT))
> @@ -604,8 +604,8 @@ void intel_update_fbc(struct drm_device *dev)
>  		max_width = 2048;
>  		max_height = 1536;
>  	}
> -	if (intel_crtc->config.pipe_src_w > max_width ||
> -	    intel_crtc->config.pipe_src_h > max_height) {
> +	if (intel_crtc->config->pipe_src_w > max_width ||
> +	    intel_crtc->config->pipe_src_h > max_height) {
>  		if (set_no_fbc_reason(dev_priv, FBC_MODE_TOO_LARGE))
>  			DRM_DEBUG_KMS("mode too large for compression, disabling\n");
>  		goto out_disable;
> @@ -1157,7 +1157,7 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc)
>  		int pixel_size = crtc->primary->fb->bits_per_pixel / 8;
>  		int clock;
>  
> -		adjusted_mode = &to_intel_crtc(crtc)->config.base.adjusted_mode;
> +		adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
>  		clock = adjusted_mode->crtc_clock;
>  
>  		/* Display SR */
> @@ -1226,10 +1226,10 @@ static bool g4x_compute_wm0(struct drm_device *dev,
>  		return false;
>  	}
>  
> -	adjusted_mode = &to_intel_crtc(crtc)->config.base.adjusted_mode;
> +	adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
>  	clock = adjusted_mode->crtc_clock;
>  	htotal = adjusted_mode->crtc_htotal;
> -	hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
> +	hdisplay = to_intel_crtc(crtc)->config->pipe_src_w;
>  	pixel_size = crtc->primary->fb->bits_per_pixel / 8;
>  
>  	/* Use the small buffer method to calculate plane watermark */
> @@ -1313,10 +1313,10 @@ static bool g4x_compute_srwm(struct drm_device *dev,
>  	}
>  
>  	crtc = intel_get_crtc_for_plane(dev, plane);
> -	adjusted_mode = &to_intel_crtc(crtc)->config.base.adjusted_mode;
> +	adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
>  	clock = adjusted_mode->crtc_clock;
>  	htotal = adjusted_mode->crtc_htotal;
> -	hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
> +	hdisplay = to_intel_crtc(crtc)->config->pipe_src_w;
>  	pixel_size = crtc->primary->fb->bits_per_pixel / 8;
>  
>  	line_time_us = max(htotal * 1000 / clock, 1);
> @@ -1347,7 +1347,7 @@ static bool vlv_compute_drain_latency(struct drm_crtc *crtc,
>  {
>  	struct drm_device *dev = crtc->dev;
>  	int entries;
> -	int clock = to_intel_crtc(crtc)->config.base.adjusted_mode.crtc_clock;
> +	int clock = to_intel_crtc(crtc)->config->base.adjusted_mode.crtc_clock;
>  
>  	if (WARN(clock == 0, "Pixel clock is zero!\n"))
>  		return false;
> @@ -1677,10 +1677,10 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
>  		/* self-refresh has much higher latency */
>  		static const int sr_latency_ns = 12000;
>  		const struct drm_display_mode *adjusted_mode =
> -			&to_intel_crtc(crtc)->config.base.adjusted_mode;
> +			&to_intel_crtc(crtc)->config->base.adjusted_mode;
>  		int clock = adjusted_mode->crtc_clock;
>  		int htotal = adjusted_mode->crtc_htotal;
> -		int hdisplay = to_intel_crtc(crtc)->config.pipe_src_w;
> +		int hdisplay = to_intel_crtc(crtc)->config->pipe_src_w;
>  		int pixel_size = crtc->primary->fb->bits_per_pixel / 8;
>  		unsigned long line_time_us;
>  		int entries;
> @@ -1762,7 +1762,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
>  		if (IS_GEN2(dev))
>  			cpp = 4;
>  
> -		adjusted_mode = &to_intel_crtc(crtc)->config.base.adjusted_mode;
> +		adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
>  		planea_wm = intel_calculate_wm(adjusted_mode->crtc_clock,
>  					       wm_info, fifo_size, cpp,
>  					       pessimal_latency_ns);
> @@ -1784,7 +1784,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
>  		if (IS_GEN2(dev))
>  			cpp = 4;
>  
> -		adjusted_mode = &to_intel_crtc(crtc)->config.base.adjusted_mode;
> +		adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
>  		planeb_wm = intel_calculate_wm(adjusted_mode->crtc_clock,
>  					       wm_info, fifo_size, cpp,
>  					       pessimal_latency_ns);
> @@ -1823,10 +1823,10 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
>  		/* self-refresh has much higher latency */
>  		static const int sr_latency_ns = 6000;
>  		const struct drm_display_mode *adjusted_mode =
> -			&to_intel_crtc(enabled)->config.base.adjusted_mode;
> +			&to_intel_crtc(enabled)->config->base.adjusted_mode;
>  		int clock = adjusted_mode->crtc_clock;
>  		int htotal = adjusted_mode->crtc_htotal;
> -		int hdisplay = to_intel_crtc(enabled)->config.pipe_src_w;
> +		int hdisplay = to_intel_crtc(enabled)->config->pipe_src_w;
>  		int pixel_size = enabled->primary->fb->bits_per_pixel / 8;
>  		unsigned long line_time_us;
>  		int entries;
> @@ -1879,7 +1879,7 @@ static void i845_update_wm(struct drm_crtc *unused_crtc)
>  	if (crtc == NULL)
>  		return;
>  
> -	adjusted_mode = &to_intel_crtc(crtc)->config.base.adjusted_mode;
> +	adjusted_mode = &to_intel_crtc(crtc)->config->base.adjusted_mode;
>  	planea_wm = intel_calculate_wm(adjusted_mode->crtc_clock,
>  				       &i845_wm_info,
>  				       dev_priv->display.get_fifo_size(dev, 0),
> @@ -1898,17 +1898,17 @@ static uint32_t ilk_pipe_pixel_rate(struct drm_device *dev,
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	uint32_t pixel_rate;
>  
> -	pixel_rate = intel_crtc->config.base.adjusted_mode.crtc_clock;
> +	pixel_rate = intel_crtc->config->base.adjusted_mode.crtc_clock;
>  
>  	/* We only use IF-ID interlacing. If we ever use PF-ID we'll need to
>  	 * adjust the pixel_rate here. */
>  
> -	if (intel_crtc->config.pch_pfit.enabled) {
> +	if (intel_crtc->config->pch_pfit.enabled) {
>  		uint64_t pipe_w, pipe_h, pfit_w, pfit_h;
> -		uint32_t pfit_size = intel_crtc->config.pch_pfit.size;
> +		uint32_t pfit_size = intel_crtc->config->pch_pfit.size;
>  
> -		pipe_w = intel_crtc->config.pipe_src_w;
> -		pipe_h = intel_crtc->config.pipe_src_h;
> +		pipe_w = intel_crtc->config->pipe_src_w;
> +		pipe_h = intel_crtc->config->pipe_src_h;
>  		pfit_w = (pfit_size >> 16) & 0xFFFF;
>  		pfit_h = pfit_size & 0xFFFF;
>  		if (pipe_w < pfit_w)
> @@ -2261,7 +2261,7 @@ hsw_compute_linetime_wm(struct drm_device *dev, struct drm_crtc *crtc)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> -	struct drm_display_mode *mode = &intel_crtc->config.base.adjusted_mode;
> +	struct drm_display_mode *mode = &intel_crtc->config->base.adjusted_mode;
>  	u32 linetime, ips_linetime;
>  
>  	if (!intel_crtc_active(crtc))
> @@ -2521,11 +2521,11 @@ static void ilk_compute_wm_parameters(struct drm_crtc *crtc,
>  		return;
>  
>  	p->active = true;
> -	p->pipe_htotal = intel_crtc->config.base.adjusted_mode.crtc_htotal;
> +	p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal;
>  	p->pixel_rate = ilk_pipe_pixel_rate(dev, crtc);
>  	p->pri.bytes_per_pixel = crtc->primary->fb->bits_per_pixel / 8;
>  	p->cur.bytes_per_pixel = 4;
> -	p->pri.horiz_pixels = intel_crtc->config.pipe_src_w;
> +	p->pri.horiz_pixels = intel_crtc->config->pipe_src_w;
>  	p->cur.horiz_pixels = intel_crtc->cursor_width;
>  	/* TODO: for now, assume primary and cursor planes are always enabled. */
>  	p->pri.enabled = true;
> @@ -3265,8 +3265,8 @@ static void skl_compute_wm_pipe_parameters(struct drm_crtc *crtc,
>  
>  	p->active = intel_crtc_active(crtc);
>  	if (p->active) {
> -		p->pipe_htotal = intel_crtc->config.base.adjusted_mode.crtc_htotal;
> -		p->pixel_rate = skl_pipe_pixel_rate(&intel_crtc->config);
> +		p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal;
> +		p->pixel_rate = skl_pipe_pixel_rate(intel_crtc->config);
>  
>  		/*
>  		 * For now, assume primary and cursor planes are always enabled.
> @@ -3274,8 +3274,8 @@ static void skl_compute_wm_pipe_parameters(struct drm_crtc *crtc,
>  		p->plane[0].enabled = true;
>  		p->plane[0].bytes_per_pixel =
>  			crtc->primary->fb->bits_per_pixel / 8;
> -		p->plane[0].horiz_pixels = intel_crtc->config.pipe_src_w;
> -		p->plane[0].vert_pixels = intel_crtc->config.pipe_src_h;
> +		p->plane[0].horiz_pixels = intel_crtc->config->pipe_src_w;
> +		p->plane[0].vert_pixels = intel_crtc->config->pipe_src_h;
>  
>  		p->cursor.enabled = true;
>  		p->cursor.bytes_per_pixel = 4;
> diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
> index b8713e4..494b132 100644
> --- a/drivers/gpu/drm/i915/intel_psr.c
> +++ b/drivers/gpu/drm/i915/intel_psr.c
> @@ -79,8 +79,8 @@ static void intel_psr_write_vsc(struct intel_dp *intel_dp,
>  	struct drm_device *dev = dig_port->base.base.dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc);
> -	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(crtc->config.cpu_transcoder);
> -	u32 data_reg = HSW_TVIDEO_DIP_VSC_DATA(crtc->config.cpu_transcoder);
> +	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(crtc->config->cpu_transcoder);
> +	u32 data_reg = HSW_TVIDEO_DIP_VSC_DATA(crtc->config->cpu_transcoder);
>  	uint32_t *data = (uint32_t *) vsc_psr;
>  	unsigned int i;
>  
> @@ -274,13 +274,13 @@ static bool intel_psr_match_conditions(struct intel_dp *intel_dp)
>  	if (IS_BROADWELL(dev))
>  		goto out;
>  
> -	if (I915_READ(HSW_STEREO_3D_CTL(intel_crtc->config.cpu_transcoder)) &
> +	if (I915_READ(HSW_STEREO_3D_CTL(intel_crtc->config->cpu_transcoder)) &
>  	    S3D_ENABLE) {
>  		DRM_DEBUG_KMS("PSR condition failed: Stereo 3D is Enabled\n");
>  		return false;
>  	}
>  
> -	if (intel_crtc->config.base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
> +	if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
>  		DRM_DEBUG_KMS("PSR condition failed: Interlaced is Enabled\n");
>  		return false;
>  	}
> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
> index e4d5da5..8c8d807 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
> @@ -1007,7 +1007,7 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
>  	}
>  
>  	if (intel_sdvo->rgb_quant_range_selectable) {
> -		if (intel_crtc->config.limited_color_range)
> +		if (intel_crtc->config->limited_color_range)
>  			frame.avi.quantization_range =
>  				HDMI_QUANTIZATION_RANGE_LIMITED;
>  		else
> @@ -1181,8 +1181,8 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *crtc = to_intel_crtc(intel_encoder->base.crtc);
>  	struct drm_display_mode *adjusted_mode =
> -		&crtc->config.base.adjusted_mode;
> -	struct drm_display_mode *mode = &crtc->config.base.mode;
> +		&crtc->config->base.adjusted_mode;
> +	struct drm_display_mode *mode = &crtc->config->base.mode;
>  	struct intel_sdvo *intel_sdvo = to_sdvo(intel_encoder);
>  	u32 sdvox;
>  	struct intel_sdvo_in_out_map in_out;
> @@ -1224,7 +1224,7 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
>  	if (!intel_sdvo_set_target_input(intel_sdvo))
>  		return;
>  
> -	if (crtc->config.has_hdmi_sink) {
> +	if (crtc->config->has_hdmi_sink) {
>  		intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI);
>  		intel_sdvo_set_colorimetry(intel_sdvo,
>  					   SDVO_COLORIMETRY_RGB256);
> @@ -1244,7 +1244,7 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
>  		DRM_INFO("Setting input timings on %s failed\n",
>  			 SDVO_NAME(intel_sdvo));
>  
> -	switch (crtc->config.pixel_multiplier) {
> +	switch (crtc->config->pixel_multiplier) {
>  	default:
>  		WARN(1, "unknown pixel mutlipler specified\n");
>  	case 1: rate = SDVO_CLOCK_RATE_MULT_1X; break;
> @@ -1259,7 +1259,7 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
>  		/* The real mode polarity is set by the SDVO commands, using
>  		 * struct intel_sdvo_dtd. */
>  		sdvox = SDVO_VSYNC_ACTIVE_HIGH | SDVO_HSYNC_ACTIVE_HIGH;
> -		if (!HAS_PCH_SPLIT(dev) && crtc->config.limited_color_range)
> +		if (!HAS_PCH_SPLIT(dev) && crtc->config->limited_color_range)
>  			sdvox |= HDMI_COLOR_RANGE_16_235;
>  		if (INTEL_INFO(dev)->gen < 5)
>  			sdvox |= SDVO_BORDER_ENABLE;
> @@ -1289,7 +1289,7 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
>  	} else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) {
>  		/* done in crtc_mode_set as it lives inside the dpll register */
>  	} else {
> -		sdvox |= (crtc->config.pixel_multiplier - 1)
> +		sdvox |= (crtc->config->pixel_multiplier - 1)
>  			<< SDVO_PORT_MULTIPLY_SHIFT;
>  	}
>  
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index 454b25d..937bd72 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -79,7 +79,7 @@ static int usecs_to_scanlines(const struct drm_display_mode *mode, int usecs)
>  bool intel_pipe_update_start(struct intel_crtc *crtc, uint32_t *start_vbl_count)
>  {
>  	struct drm_device *dev = crtc->base.dev;
> -	const struct drm_display_mode *mode = &crtc->config.base.adjusted_mode;
> +	const struct drm_display_mode *mode = &crtc->config->base.adjusted_mode;
>  	enum pipe pipe = crtc->pipe;
>  	long timeout = msecs_to_jiffies_timeout(1);
>  	int scanline, min, max, vblank_start;
> -- 
> 1.9.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Matt Roper
Graphics Software Engineer
IoTG Platform Enabling & Development
Intel Corporation
(916) 356-2795
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2014-12-15 19:30 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-11 12:38 [PATCH 0/8] Resend of drm/i915: Keep drm_crtc->state in sync Ander Conselvan de Oliveira
2014-12-11 12:38 ` [PATCH 1/8] drm/i915: Rename struct intel_crtc_config to intel_crtc_state Ander Conselvan de Oliveira
2014-12-11 12:38 ` [PATCH 2/8] drm/i915: Embedded struct drm_crtc_state in intel_crtc_state Ander Conselvan de Oliveira
2014-12-11 12:38 ` [PATCH 3/8] drm/i915: Pass new_config down do crtc_compute_clock Ander Conselvan de Oliveira
2014-12-11 12:38 ` [PATCH 4/8] drm/i915: Use local pipe_config varariable when available Ander Conselvan de Oliveira
2014-12-15 18:37   ` Matt Roper
2014-12-15 19:21     ` Ville Syrjälä
2014-12-16  9:25       ` Daniel Vetter
2014-12-11 12:38 ` [PATCH 5/8] drm/i915: Don't access to crtc->new_config from intel_mode_max_pixclk() Ander Conselvan de Oliveira
2014-12-15 19:17   ` Matt Roper
2014-12-15 19:30     ` Ville Syrjälä
2014-12-16  9:29       ` Daniel Vetter
2014-12-15 19:24   ` Ville Syrjälä
2014-12-16  9:34     ` Daniel Vetter
2014-12-18 15:06       ` Ander Conselvan de Oliveira
2014-12-11 12:38 ` [PATCH 6/8] drm/i915: Remove intel_crtc->new_config pointer Ander Conselvan de Oliveira
2014-12-11 12:38 ` [PATCH 7/8] drm/i915: Make intel_crtc->config a pointer Ander Conselvan de Oliveira
2014-12-15 19:30   ` Matt Roper [this message]
2014-12-11 12:38 ` [PATCH 8/8] drm/i915: Keep drm_crtc->state in sync with intel_crtc->config Ander Conselvan de Oliveira
2014-12-11 12:49   ` shuang.he

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141215193035.GF31948@intel.com \
    --to=matthew.d.roper@intel.com \
    --cc=ander.conselvan.de.oliveira@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=shuang.he@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.