xref: /openbsd-src/sys/dev/pci/drm/i915/display/intel_modeset_setup.c (revision f005ef32267c16bdb134f0e9fa4477dbe07c263a)
11bb76ff1Sjsg // SPDX-License-Identifier: MIT
21bb76ff1Sjsg /*
31bb76ff1Sjsg  * Copyright © 2022 Intel Corporation
41bb76ff1Sjsg  *
51bb76ff1Sjsg  * Read out the current hardware modeset state, and sanitize it to the current
61bb76ff1Sjsg  * state.
71bb76ff1Sjsg  */
81bb76ff1Sjsg 
91bb76ff1Sjsg #include <linux/compiler.h> /* for __must_check */
101bb76ff1Sjsg #include <drm/drm_atomic_uapi.h>
111bb76ff1Sjsg #include <drm/drm_atomic_state_helper.h>
121bb76ff1Sjsg 
131bb76ff1Sjsg #include "i915_drv.h"
14*f005ef32Sjsg #include "i915_reg.h"
15*f005ef32Sjsg #include "i9xx_wm.h"
161bb76ff1Sjsg #include "intel_atomic.h"
171bb76ff1Sjsg #include "intel_bw.h"
181bb76ff1Sjsg #include "intel_color.h"
191bb76ff1Sjsg #include "intel_crtc.h"
201bb76ff1Sjsg #include "intel_crtc_state_dump.h"
211bb76ff1Sjsg #include "intel_ddi.h"
221bb76ff1Sjsg #include "intel_de.h"
231bb76ff1Sjsg #include "intel_display.h"
241bb76ff1Sjsg #include "intel_display_power.h"
251bb76ff1Sjsg #include "intel_display_types.h"
26*f005ef32Sjsg #include "intel_dmc.h"
27*f005ef32Sjsg #include "intel_fifo_underrun.h"
281bb76ff1Sjsg #include "intel_modeset_setup.h"
291bb76ff1Sjsg #include "intel_pch_display.h"
30*f005ef32Sjsg #include "intel_pmdemand.h"
31*f005ef32Sjsg #include "intel_tc.h"
32*f005ef32Sjsg #include "intel_vblank.h"
33*f005ef32Sjsg #include "intel_wm.h"
341bb76ff1Sjsg #include "skl_watermark.h"
351bb76ff1Sjsg 
intel_crtc_disable_noatomic_begin(struct intel_crtc * crtc,struct drm_modeset_acquire_ctx * ctx)36*f005ef32Sjsg static void intel_crtc_disable_noatomic_begin(struct intel_crtc *crtc,
371bb76ff1Sjsg 					      struct drm_modeset_acquire_ctx *ctx)
381bb76ff1Sjsg {
391bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
401bb76ff1Sjsg 	struct intel_crtc_state *crtc_state =
411bb76ff1Sjsg 		to_intel_crtc_state(crtc->base.state);
421bb76ff1Sjsg 	struct intel_plane *plane;
431bb76ff1Sjsg 	struct drm_atomic_state *state;
44*f005ef32Sjsg 	struct intel_crtc *temp_crtc;
451bb76ff1Sjsg 	enum pipe pipe = crtc->pipe;
461bb76ff1Sjsg 
471bb76ff1Sjsg 	if (!crtc_state->hw.active)
481bb76ff1Sjsg 		return;
491bb76ff1Sjsg 
501bb76ff1Sjsg 	for_each_intel_plane_on_crtc(&i915->drm, crtc, plane) {
511bb76ff1Sjsg 		const struct intel_plane_state *plane_state =
521bb76ff1Sjsg 			to_intel_plane_state(plane->base.state);
531bb76ff1Sjsg 
541bb76ff1Sjsg 		if (plane_state->uapi.visible)
551bb76ff1Sjsg 			intel_plane_disable_noatomic(crtc, plane);
561bb76ff1Sjsg 	}
571bb76ff1Sjsg 
581bb76ff1Sjsg 	state = drm_atomic_state_alloc(&i915->drm);
591bb76ff1Sjsg 	if (!state) {
601bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
611bb76ff1Sjsg 			    "failed to disable [CRTC:%d:%s], out of memory",
621bb76ff1Sjsg 			    crtc->base.base.id, crtc->base.name);
631bb76ff1Sjsg 		return;
641bb76ff1Sjsg 	}
651bb76ff1Sjsg 
661bb76ff1Sjsg 	state->acquire_ctx = ctx;
67*f005ef32Sjsg 	to_intel_atomic_state(state)->internal = true;
681bb76ff1Sjsg 
691bb76ff1Sjsg 	/* Everything's already locked, -EDEADLK can't happen. */
70*f005ef32Sjsg 	for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc,
71*f005ef32Sjsg 					 BIT(pipe) |
72*f005ef32Sjsg 					 intel_crtc_bigjoiner_slave_pipes(crtc_state)) {
73*f005ef32Sjsg 		struct intel_crtc_state *temp_crtc_state =
74*f005ef32Sjsg 			intel_atomic_get_crtc_state(state, temp_crtc);
75*f005ef32Sjsg 		int ret;
76*f005ef32Sjsg 
77*f005ef32Sjsg 		ret = drm_atomic_add_affected_connectors(state, &temp_crtc->base);
781bb76ff1Sjsg 
791bb76ff1Sjsg 		drm_WARN_ON(&i915->drm, IS_ERR(temp_crtc_state) || ret);
80*f005ef32Sjsg 	}
811bb76ff1Sjsg 
821bb76ff1Sjsg 	i915->display.funcs.display->crtc_disable(to_intel_atomic_state(state), crtc);
831bb76ff1Sjsg 
841bb76ff1Sjsg 	drm_atomic_state_put(state);
851bb76ff1Sjsg 
861bb76ff1Sjsg 	drm_dbg_kms(&i915->drm,
871bb76ff1Sjsg 		    "[CRTC:%d:%s] hw state adjusted, was enabled, now disabled\n",
881bb76ff1Sjsg 		    crtc->base.base.id, crtc->base.name);
891bb76ff1Sjsg 
901bb76ff1Sjsg 	crtc->active = false;
911bb76ff1Sjsg 	crtc->base.enabled = false;
921bb76ff1Sjsg 
93*f005ef32Sjsg 	if (crtc_state->shared_dpll)
94*f005ef32Sjsg 		intel_unreference_shared_dpll_crtc(crtc,
95*f005ef32Sjsg 						   crtc_state->shared_dpll,
96*f005ef32Sjsg 						   &crtc_state->shared_dpll->state);
97*f005ef32Sjsg }
981bb76ff1Sjsg 
set_encoder_for_connector(struct intel_connector * connector,struct intel_encoder * encoder)99*f005ef32Sjsg static void set_encoder_for_connector(struct intel_connector *connector,
100*f005ef32Sjsg 				      struct intel_encoder *encoder)
101*f005ef32Sjsg {
102*f005ef32Sjsg 	struct drm_connector_state *conn_state = connector->base.state;
103*f005ef32Sjsg 
104*f005ef32Sjsg 	if (conn_state->crtc)
105*f005ef32Sjsg 		drm_connector_put(&connector->base);
106*f005ef32Sjsg 
107*f005ef32Sjsg 	if (encoder) {
108*f005ef32Sjsg 		conn_state->best_encoder = &encoder->base;
109*f005ef32Sjsg 		conn_state->crtc = encoder->base.crtc;
110*f005ef32Sjsg 		drm_connector_get(&connector->base);
111*f005ef32Sjsg 	} else {
112*f005ef32Sjsg 		conn_state->best_encoder = NULL;
113*f005ef32Sjsg 		conn_state->crtc = NULL;
114*f005ef32Sjsg 	}
115*f005ef32Sjsg }
116*f005ef32Sjsg 
reset_encoder_connector_state(struct intel_encoder * encoder)117*f005ef32Sjsg static void reset_encoder_connector_state(struct intel_encoder *encoder)
118*f005ef32Sjsg {
119*f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
120*f005ef32Sjsg 	struct intel_pmdemand_state *pmdemand_state =
121*f005ef32Sjsg 		to_intel_pmdemand_state(i915->display.pmdemand.obj.state);
122*f005ef32Sjsg 	struct intel_connector *connector;
123*f005ef32Sjsg 	struct drm_connector_list_iter conn_iter;
124*f005ef32Sjsg 
125*f005ef32Sjsg 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
126*f005ef32Sjsg 	for_each_intel_connector_iter(connector, &conn_iter) {
127*f005ef32Sjsg 		if (connector->base.encoder != &encoder->base)
128*f005ef32Sjsg 			continue;
129*f005ef32Sjsg 
130*f005ef32Sjsg 		/* Clear the corresponding bit in pmdemand active phys mask */
131*f005ef32Sjsg 		intel_pmdemand_update_phys_mask(i915, encoder,
132*f005ef32Sjsg 						pmdemand_state, false);
133*f005ef32Sjsg 
134*f005ef32Sjsg 		set_encoder_for_connector(connector, NULL);
135*f005ef32Sjsg 
136*f005ef32Sjsg 		connector->base.dpms = DRM_MODE_DPMS_OFF;
137*f005ef32Sjsg 		connector->base.encoder = NULL;
138*f005ef32Sjsg 	}
139*f005ef32Sjsg 	drm_connector_list_iter_end(&conn_iter);
140*f005ef32Sjsg }
141*f005ef32Sjsg 
reset_crtc_encoder_state(struct intel_crtc * crtc)142*f005ef32Sjsg static void reset_crtc_encoder_state(struct intel_crtc *crtc)
143*f005ef32Sjsg {
144*f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
145*f005ef32Sjsg 	struct intel_encoder *encoder;
146*f005ef32Sjsg 
147*f005ef32Sjsg 	for_each_encoder_on_crtc(&i915->drm, &crtc->base, encoder) {
148*f005ef32Sjsg 		reset_encoder_connector_state(encoder);
1491bb76ff1Sjsg 		encoder->base.crtc = NULL;
150*f005ef32Sjsg 	}
151*f005ef32Sjsg }
152*f005ef32Sjsg 
intel_crtc_disable_noatomic_complete(struct intel_crtc * crtc)153*f005ef32Sjsg static void intel_crtc_disable_noatomic_complete(struct intel_crtc *crtc)
154*f005ef32Sjsg {
155*f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
156*f005ef32Sjsg 	struct intel_bw_state *bw_state =
157*f005ef32Sjsg 		to_intel_bw_state(i915->display.bw.obj.state);
158*f005ef32Sjsg 	struct intel_cdclk_state *cdclk_state =
159*f005ef32Sjsg 		to_intel_cdclk_state(i915->display.cdclk.obj.state);
160*f005ef32Sjsg 	struct intel_dbuf_state *dbuf_state =
161*f005ef32Sjsg 		to_intel_dbuf_state(i915->display.dbuf.obj.state);
162*f005ef32Sjsg 	struct intel_pmdemand_state *pmdemand_state =
163*f005ef32Sjsg 		to_intel_pmdemand_state(i915->display.pmdemand.obj.state);
164*f005ef32Sjsg 	struct intel_crtc_state *crtc_state =
165*f005ef32Sjsg 		to_intel_crtc_state(crtc->base.state);
166*f005ef32Sjsg 	enum pipe pipe = crtc->pipe;
167*f005ef32Sjsg 
168*f005ef32Sjsg 	__drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi);
169*f005ef32Sjsg 	intel_crtc_free_hw_state(crtc_state);
170*f005ef32Sjsg 	intel_crtc_state_reset(crtc_state, crtc);
171*f005ef32Sjsg 
172*f005ef32Sjsg 	reset_crtc_encoder_state(crtc);
1731bb76ff1Sjsg 
1741bb76ff1Sjsg 	intel_fbc_disable(crtc);
1751bb76ff1Sjsg 	intel_update_watermarks(i915);
1761bb76ff1Sjsg 
1771bb76ff1Sjsg 	intel_display_power_put_all_in_set(i915, &crtc->enabled_power_domains);
1781bb76ff1Sjsg 
1791bb76ff1Sjsg 	cdclk_state->min_cdclk[pipe] = 0;
1801bb76ff1Sjsg 	cdclk_state->min_voltage_level[pipe] = 0;
1811bb76ff1Sjsg 	cdclk_state->active_pipes &= ~BIT(pipe);
1821bb76ff1Sjsg 
1831bb76ff1Sjsg 	dbuf_state->active_pipes &= ~BIT(pipe);
1841bb76ff1Sjsg 
1851bb76ff1Sjsg 	bw_state->data_rate[pipe] = 0;
1861bb76ff1Sjsg 	bw_state->num_active_planes[pipe] = 0;
187*f005ef32Sjsg 
188*f005ef32Sjsg 	intel_pmdemand_update_port_clock(i915, pmdemand_state, pipe, 0);
189*f005ef32Sjsg }
190*f005ef32Sjsg 
191*f005ef32Sjsg /*
192*f005ef32Sjsg  * Return all the pipes using a transcoder in @transcoder_mask.
193*f005ef32Sjsg  * For bigjoiner configs return only the bigjoiner master.
194*f005ef32Sjsg  */
get_transcoder_pipes(struct drm_i915_private * i915,u8 transcoder_mask)195*f005ef32Sjsg static u8 get_transcoder_pipes(struct drm_i915_private *i915,
196*f005ef32Sjsg 			       u8 transcoder_mask)
197*f005ef32Sjsg {
198*f005ef32Sjsg 	struct intel_crtc *temp_crtc;
199*f005ef32Sjsg 	u8 pipes = 0;
200*f005ef32Sjsg 
201*f005ef32Sjsg 	for_each_intel_crtc(&i915->drm, temp_crtc) {
202*f005ef32Sjsg 		struct intel_crtc_state *temp_crtc_state =
203*f005ef32Sjsg 			to_intel_crtc_state(temp_crtc->base.state);
204*f005ef32Sjsg 
205*f005ef32Sjsg 		if (temp_crtc_state->cpu_transcoder == INVALID_TRANSCODER)
206*f005ef32Sjsg 			continue;
207*f005ef32Sjsg 
208*f005ef32Sjsg 		if (intel_crtc_is_bigjoiner_slave(temp_crtc_state))
209*f005ef32Sjsg 			continue;
210*f005ef32Sjsg 
211*f005ef32Sjsg 		if (transcoder_mask & BIT(temp_crtc_state->cpu_transcoder))
212*f005ef32Sjsg 			pipes |= BIT(temp_crtc->pipe);
213*f005ef32Sjsg 	}
214*f005ef32Sjsg 
215*f005ef32Sjsg 	return pipes;
216*f005ef32Sjsg }
217*f005ef32Sjsg 
218*f005ef32Sjsg /*
219*f005ef32Sjsg  * Return the port sync master and slave pipes linked to @crtc.
220*f005ef32Sjsg  * For bigjoiner configs return only the bigjoiner master pipes.
221*f005ef32Sjsg  */
get_portsync_pipes(struct intel_crtc * crtc,u8 * master_pipe_mask,u8 * slave_pipes_mask)222*f005ef32Sjsg static void get_portsync_pipes(struct intel_crtc *crtc,
223*f005ef32Sjsg 			       u8 *master_pipe_mask, u8 *slave_pipes_mask)
224*f005ef32Sjsg {
225*f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
226*f005ef32Sjsg 	struct intel_crtc_state *crtc_state =
227*f005ef32Sjsg 		to_intel_crtc_state(crtc->base.state);
228*f005ef32Sjsg 	struct intel_crtc *master_crtc;
229*f005ef32Sjsg 	struct intel_crtc_state *master_crtc_state;
230*f005ef32Sjsg 	enum transcoder master_transcoder;
231*f005ef32Sjsg 
232*f005ef32Sjsg 	if (!is_trans_port_sync_mode(crtc_state)) {
233*f005ef32Sjsg 		*master_pipe_mask = BIT(crtc->pipe);
234*f005ef32Sjsg 		*slave_pipes_mask = 0;
235*f005ef32Sjsg 
236*f005ef32Sjsg 		return;
237*f005ef32Sjsg 	}
238*f005ef32Sjsg 
239*f005ef32Sjsg 	if (is_trans_port_sync_master(crtc_state))
240*f005ef32Sjsg 		master_transcoder = crtc_state->cpu_transcoder;
241*f005ef32Sjsg 	else
242*f005ef32Sjsg 		master_transcoder = crtc_state->master_transcoder;
243*f005ef32Sjsg 
244*f005ef32Sjsg 	*master_pipe_mask = get_transcoder_pipes(i915, BIT(master_transcoder));
245*f005ef32Sjsg 	drm_WARN_ON(&i915->drm, !is_power_of_2(*master_pipe_mask));
246*f005ef32Sjsg 
247*f005ef32Sjsg 	master_crtc = intel_crtc_for_pipe(i915, ffs(*master_pipe_mask) - 1);
248*f005ef32Sjsg 	master_crtc_state = to_intel_crtc_state(master_crtc->base.state);
249*f005ef32Sjsg 	*slave_pipes_mask = get_transcoder_pipes(i915, master_crtc_state->sync_mode_slaves_mask);
250*f005ef32Sjsg }
251*f005ef32Sjsg 
get_bigjoiner_slave_pipes(struct drm_i915_private * i915,u8 master_pipes_mask)252*f005ef32Sjsg static u8 get_bigjoiner_slave_pipes(struct drm_i915_private *i915, u8 master_pipes_mask)
253*f005ef32Sjsg {
254*f005ef32Sjsg 	struct intel_crtc *master_crtc;
255*f005ef32Sjsg 	u8 pipes = 0;
256*f005ef32Sjsg 
257*f005ef32Sjsg 	for_each_intel_crtc_in_pipe_mask(&i915->drm, master_crtc, master_pipes_mask) {
258*f005ef32Sjsg 		struct intel_crtc_state *master_crtc_state =
259*f005ef32Sjsg 			to_intel_crtc_state(master_crtc->base.state);
260*f005ef32Sjsg 
261*f005ef32Sjsg 		pipes |= intel_crtc_bigjoiner_slave_pipes(master_crtc_state);
262*f005ef32Sjsg 	}
263*f005ef32Sjsg 
264*f005ef32Sjsg 	return pipes;
265*f005ef32Sjsg }
266*f005ef32Sjsg 
intel_crtc_disable_noatomic(struct intel_crtc * crtc,struct drm_modeset_acquire_ctx * ctx)267*f005ef32Sjsg static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
268*f005ef32Sjsg 					struct drm_modeset_acquire_ctx *ctx)
269*f005ef32Sjsg {
270*f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
271*f005ef32Sjsg 	u8 portsync_master_mask;
272*f005ef32Sjsg 	u8 portsync_slaves_mask;
273*f005ef32Sjsg 	u8 bigjoiner_slaves_mask;
274*f005ef32Sjsg 	struct intel_crtc *temp_crtc;
275*f005ef32Sjsg 
276*f005ef32Sjsg 	/* TODO: Add support for MST */
277*f005ef32Sjsg 	get_portsync_pipes(crtc, &portsync_master_mask, &portsync_slaves_mask);
278*f005ef32Sjsg 	bigjoiner_slaves_mask = get_bigjoiner_slave_pipes(i915,
279*f005ef32Sjsg 							  portsync_master_mask |
280*f005ef32Sjsg 							  portsync_slaves_mask);
281*f005ef32Sjsg 
282*f005ef32Sjsg 	drm_WARN_ON(&i915->drm,
283*f005ef32Sjsg 		    portsync_master_mask & portsync_slaves_mask ||
284*f005ef32Sjsg 		    portsync_master_mask & bigjoiner_slaves_mask ||
285*f005ef32Sjsg 		    portsync_slaves_mask & bigjoiner_slaves_mask);
286*f005ef32Sjsg 
287*f005ef32Sjsg 	for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, bigjoiner_slaves_mask)
288*f005ef32Sjsg 		intel_crtc_disable_noatomic_begin(temp_crtc, ctx);
289*f005ef32Sjsg 
290*f005ef32Sjsg 	for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, portsync_slaves_mask)
291*f005ef32Sjsg 		intel_crtc_disable_noatomic_begin(temp_crtc, ctx);
292*f005ef32Sjsg 
293*f005ef32Sjsg 	for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc, portsync_master_mask)
294*f005ef32Sjsg 		intel_crtc_disable_noatomic_begin(temp_crtc, ctx);
295*f005ef32Sjsg 
296*f005ef32Sjsg 	for_each_intel_crtc_in_pipe_mask(&i915->drm, temp_crtc,
297*f005ef32Sjsg 					 bigjoiner_slaves_mask |
298*f005ef32Sjsg 					 portsync_slaves_mask |
299*f005ef32Sjsg 					 portsync_master_mask)
300*f005ef32Sjsg 		intel_crtc_disable_noatomic_complete(temp_crtc);
3011bb76ff1Sjsg }
3021bb76ff1Sjsg 
intel_modeset_update_connector_atomic_state(struct drm_i915_private * i915)3031bb76ff1Sjsg static void intel_modeset_update_connector_atomic_state(struct drm_i915_private *i915)
3041bb76ff1Sjsg {
3051bb76ff1Sjsg 	struct intel_connector *connector;
3061bb76ff1Sjsg 	struct drm_connector_list_iter conn_iter;
3071bb76ff1Sjsg 
3081bb76ff1Sjsg 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
3091bb76ff1Sjsg 	for_each_intel_connector_iter(connector, &conn_iter) {
3101bb76ff1Sjsg 		struct drm_connector_state *conn_state = connector->base.state;
3111bb76ff1Sjsg 		struct intel_encoder *encoder =
3121bb76ff1Sjsg 			to_intel_encoder(connector->base.encoder);
3131bb76ff1Sjsg 
314*f005ef32Sjsg 		set_encoder_for_connector(connector, encoder);
3151bb76ff1Sjsg 
3161bb76ff1Sjsg 		if (encoder) {
3171bb76ff1Sjsg 			struct intel_crtc *crtc =
3181bb76ff1Sjsg 				to_intel_crtc(encoder->base.crtc);
3191bb76ff1Sjsg 			const struct intel_crtc_state *crtc_state =
3201bb76ff1Sjsg 				to_intel_crtc_state(crtc->base.state);
3211bb76ff1Sjsg 
3221bb76ff1Sjsg 			conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3;
3231bb76ff1Sjsg 		}
3241bb76ff1Sjsg 	}
3251bb76ff1Sjsg 	drm_connector_list_iter_end(&conn_iter);
3261bb76ff1Sjsg }
3271bb76ff1Sjsg 
intel_crtc_copy_hw_to_uapi_state(struct intel_crtc_state * crtc_state)3281bb76ff1Sjsg static void intel_crtc_copy_hw_to_uapi_state(struct intel_crtc_state *crtc_state)
3291bb76ff1Sjsg {
3301bb76ff1Sjsg 	if (intel_crtc_is_bigjoiner_slave(crtc_state))
3311bb76ff1Sjsg 		return;
3321bb76ff1Sjsg 
3331bb76ff1Sjsg 	crtc_state->uapi.enable = crtc_state->hw.enable;
3341bb76ff1Sjsg 	crtc_state->uapi.active = crtc_state->hw.active;
3351bb76ff1Sjsg 	drm_WARN_ON(crtc_state->uapi.crtc->dev,
3361bb76ff1Sjsg 		    drm_atomic_set_mode_for_crtc(&crtc_state->uapi, &crtc_state->hw.mode) < 0);
3371bb76ff1Sjsg 
3381bb76ff1Sjsg 	crtc_state->uapi.adjusted_mode = crtc_state->hw.adjusted_mode;
3391bb76ff1Sjsg 	crtc_state->uapi.scaling_filter = crtc_state->hw.scaling_filter;
3401bb76ff1Sjsg 
341*f005ef32Sjsg 	/* assume 1:1 mapping */
342*f005ef32Sjsg 	drm_property_replace_blob(&crtc_state->hw.degamma_lut,
343*f005ef32Sjsg 				  crtc_state->pre_csc_lut);
344*f005ef32Sjsg 	drm_property_replace_blob(&crtc_state->hw.gamma_lut,
345*f005ef32Sjsg 				  crtc_state->post_csc_lut);
346*f005ef32Sjsg 
3471bb76ff1Sjsg 	drm_property_replace_blob(&crtc_state->uapi.degamma_lut,
3481bb76ff1Sjsg 				  crtc_state->hw.degamma_lut);
3491bb76ff1Sjsg 	drm_property_replace_blob(&crtc_state->uapi.gamma_lut,
3501bb76ff1Sjsg 				  crtc_state->hw.gamma_lut);
3511bb76ff1Sjsg 	drm_property_replace_blob(&crtc_state->uapi.ctm,
3521bb76ff1Sjsg 				  crtc_state->hw.ctm);
3531bb76ff1Sjsg }
3541bb76ff1Sjsg 
3551bb76ff1Sjsg static void
intel_sanitize_plane_mapping(struct drm_i915_private * i915)3561bb76ff1Sjsg intel_sanitize_plane_mapping(struct drm_i915_private *i915)
3571bb76ff1Sjsg {
3581bb76ff1Sjsg 	struct intel_crtc *crtc;
3591bb76ff1Sjsg 
3601bb76ff1Sjsg 	if (DISPLAY_VER(i915) >= 4)
3611bb76ff1Sjsg 		return;
3621bb76ff1Sjsg 
3631bb76ff1Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
3641bb76ff1Sjsg 		struct intel_plane *plane =
3651bb76ff1Sjsg 			to_intel_plane(crtc->base.primary);
3661bb76ff1Sjsg 		struct intel_crtc *plane_crtc;
3671bb76ff1Sjsg 		enum pipe pipe;
3681bb76ff1Sjsg 
3691bb76ff1Sjsg 		if (!plane->get_hw_state(plane, &pipe))
3701bb76ff1Sjsg 			continue;
3711bb76ff1Sjsg 
3721bb76ff1Sjsg 		if (pipe == crtc->pipe)
3731bb76ff1Sjsg 			continue;
3741bb76ff1Sjsg 
3751bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
3761bb76ff1Sjsg 			    "[PLANE:%d:%s] attached to the wrong pipe, disabling plane\n",
3771bb76ff1Sjsg 			    plane->base.base.id, plane->base.name);
3781bb76ff1Sjsg 
3791bb76ff1Sjsg 		plane_crtc = intel_crtc_for_pipe(i915, pipe);
3801bb76ff1Sjsg 		intel_plane_disable_noatomic(plane_crtc, plane);
3811bb76ff1Sjsg 	}
3821bb76ff1Sjsg }
3831bb76ff1Sjsg 
intel_crtc_has_encoders(struct intel_crtc * crtc)3841bb76ff1Sjsg static bool intel_crtc_has_encoders(struct intel_crtc *crtc)
3851bb76ff1Sjsg {
3861bb76ff1Sjsg 	struct drm_device *dev = crtc->base.dev;
3871bb76ff1Sjsg 	struct intel_encoder *encoder;
3881bb76ff1Sjsg 
3891bb76ff1Sjsg 	for_each_encoder_on_crtc(dev, &crtc->base, encoder)
3901bb76ff1Sjsg 		return true;
3911bb76ff1Sjsg 
3921bb76ff1Sjsg 	return false;
3931bb76ff1Sjsg }
3941bb76ff1Sjsg 
intel_crtc_needs_link_reset(struct intel_crtc * crtc)395*f005ef32Sjsg static bool intel_crtc_needs_link_reset(struct intel_crtc *crtc)
396*f005ef32Sjsg {
397*f005ef32Sjsg 	struct drm_device *dev = crtc->base.dev;
398*f005ef32Sjsg 	struct intel_encoder *encoder;
399*f005ef32Sjsg 
400*f005ef32Sjsg 	for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
401*f005ef32Sjsg 		struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
402*f005ef32Sjsg 
403*f005ef32Sjsg 		if (dig_port && intel_tc_port_link_needs_reset(dig_port))
404*f005ef32Sjsg 			return true;
405*f005ef32Sjsg 	}
406*f005ef32Sjsg 
407*f005ef32Sjsg 	return false;
408*f005ef32Sjsg }
409*f005ef32Sjsg 
intel_encoder_find_connector(struct intel_encoder * encoder)4101bb76ff1Sjsg static struct intel_connector *intel_encoder_find_connector(struct intel_encoder *encoder)
4111bb76ff1Sjsg {
412*f005ef32Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
413*f005ef32Sjsg 	struct drm_connector_list_iter conn_iter;
4141bb76ff1Sjsg 	struct intel_connector *connector;
415*f005ef32Sjsg 	struct intel_connector *found_connector = NULL;
4161bb76ff1Sjsg 
417*f005ef32Sjsg 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
418*f005ef32Sjsg 	for_each_intel_connector_iter(connector, &conn_iter) {
419*f005ef32Sjsg 		if (&encoder->base == connector->base.encoder) {
420*f005ef32Sjsg 			found_connector = connector;
421*f005ef32Sjsg 			break;
422*f005ef32Sjsg 		}
423*f005ef32Sjsg 	}
424*f005ef32Sjsg 	drm_connector_list_iter_end(&conn_iter);
4251bb76ff1Sjsg 
426*f005ef32Sjsg 	return found_connector;
4271bb76ff1Sjsg }
4281bb76ff1Sjsg 
intel_sanitize_fifo_underrun_reporting(const struct intel_crtc_state * crtc_state)4291bb76ff1Sjsg static void intel_sanitize_fifo_underrun_reporting(const struct intel_crtc_state *crtc_state)
4301bb76ff1Sjsg {
4311bb76ff1Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
4321bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
4331bb76ff1Sjsg 
4341bb76ff1Sjsg 	/*
435*f005ef32Sjsg 	 * We start out with underrun reporting disabled on active
436*f005ef32Sjsg 	 * pipes to avoid races.
4371bb76ff1Sjsg 	 *
4381bb76ff1Sjsg 	 * Also on gmch platforms we dont have any hardware bits to
4391bb76ff1Sjsg 	 * disable the underrun reporting. Which means we need to start
4401bb76ff1Sjsg 	 * out with underrun reporting disabled also on inactive pipes,
4411bb76ff1Sjsg 	 * since otherwise we'll complain about the garbage we read when
4421bb76ff1Sjsg 	 * e.g. coming up after runtime pm.
4431bb76ff1Sjsg 	 *
4441bb76ff1Sjsg 	 * No protection against concurrent access is required - at
4451bb76ff1Sjsg 	 * worst a fifo underrun happens which also sets this to false.
4461bb76ff1Sjsg 	 */
447*f005ef32Sjsg 	intel_init_fifo_underrun_reporting(i915, crtc,
448*f005ef32Sjsg 					   !crtc_state->hw.active &&
449*f005ef32Sjsg 					   !HAS_GMCH(i915));
4501bb76ff1Sjsg }
4511bb76ff1Sjsg 
intel_sanitize_crtc(struct intel_crtc * crtc,struct drm_modeset_acquire_ctx * ctx)452*f005ef32Sjsg static bool intel_sanitize_crtc(struct intel_crtc *crtc,
4531bb76ff1Sjsg 				struct drm_modeset_acquire_ctx *ctx)
4541bb76ff1Sjsg {
4551bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
4561bb76ff1Sjsg 	struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state);
457*f005ef32Sjsg 	bool needs_link_reset;
4581bb76ff1Sjsg 
4591bb76ff1Sjsg 	if (crtc_state->hw.active) {
4601bb76ff1Sjsg 		struct intel_plane *plane;
4611bb76ff1Sjsg 
4621bb76ff1Sjsg 		/* Disable everything but the primary plane */
4631bb76ff1Sjsg 		for_each_intel_plane_on_crtc(&i915->drm, crtc, plane) {
4641bb76ff1Sjsg 			const struct intel_plane_state *plane_state =
4651bb76ff1Sjsg 				to_intel_plane_state(plane->base.state);
4661bb76ff1Sjsg 
4671bb76ff1Sjsg 			if (plane_state->uapi.visible &&
4681bb76ff1Sjsg 			    plane->base.type != DRM_PLANE_TYPE_PRIMARY)
4691bb76ff1Sjsg 				intel_plane_disable_noatomic(crtc, plane);
4701bb76ff1Sjsg 		}
4711bb76ff1Sjsg 
4721bb76ff1Sjsg 		/* Disable any background color/etc. set by the BIOS */
4731bb76ff1Sjsg 		intel_color_commit_noarm(crtc_state);
4741bb76ff1Sjsg 		intel_color_commit_arm(crtc_state);
4751bb76ff1Sjsg 	}
4761bb76ff1Sjsg 
477*f005ef32Sjsg 	if (!crtc_state->hw.active ||
478*f005ef32Sjsg 	    intel_crtc_is_bigjoiner_slave(crtc_state))
479*f005ef32Sjsg 		return false;
480*f005ef32Sjsg 
481*f005ef32Sjsg 	needs_link_reset = intel_crtc_needs_link_reset(crtc);
482*f005ef32Sjsg 
4831bb76ff1Sjsg 	/*
4841bb76ff1Sjsg 	 * Adjust the state of the output pipe according to whether we have
4851bb76ff1Sjsg 	 * active connectors/encoders.
4861bb76ff1Sjsg 	 */
487*f005ef32Sjsg 	if (!needs_link_reset && intel_crtc_has_encoders(crtc))
488*f005ef32Sjsg 		return false;
489*f005ef32Sjsg 
4901bb76ff1Sjsg 	intel_crtc_disable_noatomic(crtc, ctx);
491*f005ef32Sjsg 
492*f005ef32Sjsg 	/*
493*f005ef32Sjsg 	 * The HPD state on other active/disconnected TC ports may be stuck in
494*f005ef32Sjsg 	 * the connected state until this port is disabled and a ~10ms delay has
495*f005ef32Sjsg 	 * passed, wait here for that so that sanitizing other CRTCs will see the
496*f005ef32Sjsg 	 * up-to-date HPD state.
497*f005ef32Sjsg 	 */
498*f005ef32Sjsg 	if (needs_link_reset)
499*f005ef32Sjsg 		drm_msleep(20);
500*f005ef32Sjsg 
501*f005ef32Sjsg 	return true;
502*f005ef32Sjsg }
503*f005ef32Sjsg 
intel_sanitize_all_crtcs(struct drm_i915_private * i915,struct drm_modeset_acquire_ctx * ctx)504*f005ef32Sjsg static void intel_sanitize_all_crtcs(struct drm_i915_private *i915,
505*f005ef32Sjsg 				     struct drm_modeset_acquire_ctx *ctx)
506*f005ef32Sjsg {
507*f005ef32Sjsg 	struct intel_crtc *crtc;
508*f005ef32Sjsg 	u32 crtcs_forced_off = 0;
509*f005ef32Sjsg 
510*f005ef32Sjsg 	/*
511*f005ef32Sjsg 	 * An active and disconnected TypeC port prevents the HPD live state
512*f005ef32Sjsg 	 * to get updated on other active/disconnected TypeC ports, so after
513*f005ef32Sjsg 	 * a port gets disabled the CRTCs using other TypeC ports must be
514*f005ef32Sjsg 	 * rechecked wrt. their link status.
515*f005ef32Sjsg 	 */
516*f005ef32Sjsg 	for (;;) {
517*f005ef32Sjsg 		u32 old_mask = crtcs_forced_off;
518*f005ef32Sjsg 
519*f005ef32Sjsg 		for_each_intel_crtc(&i915->drm, crtc) {
520*f005ef32Sjsg 			u32 crtc_mask = drm_crtc_mask(&crtc->base);
521*f005ef32Sjsg 
522*f005ef32Sjsg 			if (crtcs_forced_off & crtc_mask)
523*f005ef32Sjsg 				continue;
524*f005ef32Sjsg 
525*f005ef32Sjsg 			if (intel_sanitize_crtc(crtc, ctx))
526*f005ef32Sjsg 				crtcs_forced_off |= crtc_mask;
527*f005ef32Sjsg 		}
528*f005ef32Sjsg 		if (crtcs_forced_off == old_mask)
529*f005ef32Sjsg 			break;
530*f005ef32Sjsg 	}
531*f005ef32Sjsg 
532*f005ef32Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
533*f005ef32Sjsg 		struct intel_crtc_state *crtc_state =
534*f005ef32Sjsg 			to_intel_crtc_state(crtc->base.state);
535*f005ef32Sjsg 
536*f005ef32Sjsg 		intel_crtc_state_dump(crtc_state, NULL, "setup_hw_state");
537*f005ef32Sjsg 	}
5381bb76ff1Sjsg }
5391bb76ff1Sjsg 
has_bogus_dpll_config(const struct intel_crtc_state * crtc_state)5401bb76ff1Sjsg static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state)
5411bb76ff1Sjsg {
5421bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
5431bb76ff1Sjsg 
5441bb76ff1Sjsg 	/*
5451bb76ff1Sjsg 	 * Some SNB BIOSen (eg. ASUS K53SV) are known to misprogram
5461bb76ff1Sjsg 	 * the hardware when a high res displays plugged in. DPLL P
5471bb76ff1Sjsg 	 * divider is zero, and the pipe timings are bonkers. We'll
5481bb76ff1Sjsg 	 * try to disable everything in that case.
5491bb76ff1Sjsg 	 *
5501bb76ff1Sjsg 	 * FIXME would be nice to be able to sanitize this state
5511bb76ff1Sjsg 	 * without several WARNs, but for now let's take the easy
5521bb76ff1Sjsg 	 * road.
5531bb76ff1Sjsg 	 */
5541bb76ff1Sjsg 	return IS_SANDYBRIDGE(i915) &&
5551bb76ff1Sjsg 		crtc_state->hw.active &&
5561bb76ff1Sjsg 		crtc_state->shared_dpll &&
5571bb76ff1Sjsg 		crtc_state->port_clock == 0;
5581bb76ff1Sjsg }
5591bb76ff1Sjsg 
intel_sanitize_encoder(struct intel_encoder * encoder)5601bb76ff1Sjsg static void intel_sanitize_encoder(struct intel_encoder *encoder)
5611bb76ff1Sjsg {
5621bb76ff1Sjsg 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
5631bb76ff1Sjsg 	struct intel_connector *connector;
5641bb76ff1Sjsg 	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
5651bb76ff1Sjsg 	struct intel_crtc_state *crtc_state = crtc ?
5661bb76ff1Sjsg 		to_intel_crtc_state(crtc->base.state) : NULL;
567*f005ef32Sjsg 	struct intel_pmdemand_state *pmdemand_state =
568*f005ef32Sjsg 		to_intel_pmdemand_state(i915->display.pmdemand.obj.state);
5691bb76ff1Sjsg 
5701bb76ff1Sjsg 	/*
5711bb76ff1Sjsg 	 * We need to check both for a crtc link (meaning that the encoder is
5721bb76ff1Sjsg 	 * active and trying to read from a pipe) and the pipe itself being
5731bb76ff1Sjsg 	 * active.
5741bb76ff1Sjsg 	 */
5751bb76ff1Sjsg 	bool has_active_crtc = crtc_state &&
5761bb76ff1Sjsg 		crtc_state->hw.active;
5771bb76ff1Sjsg 
5781bb76ff1Sjsg 	if (crtc_state && has_bogus_dpll_config(crtc_state)) {
5791bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
5801bb76ff1Sjsg 			    "BIOS has misprogrammed the hardware. Disabling pipe %c\n",
5811bb76ff1Sjsg 			    pipe_name(crtc->pipe));
5821bb76ff1Sjsg 		has_active_crtc = false;
5831bb76ff1Sjsg 	}
5841bb76ff1Sjsg 
5851bb76ff1Sjsg 	connector = intel_encoder_find_connector(encoder);
5861bb76ff1Sjsg 	if (connector && !has_active_crtc) {
5871bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
5881bb76ff1Sjsg 			    "[ENCODER:%d:%s] has active connectors but no active pipe!\n",
5891bb76ff1Sjsg 			    encoder->base.base.id,
5901bb76ff1Sjsg 			    encoder->base.name);
5911bb76ff1Sjsg 
592*f005ef32Sjsg 		/* Clear the corresponding bit in pmdemand active phys mask */
593*f005ef32Sjsg 		intel_pmdemand_update_phys_mask(i915, encoder,
594*f005ef32Sjsg 						pmdemand_state, false);
595*f005ef32Sjsg 
5961bb76ff1Sjsg 		/*
5971bb76ff1Sjsg 		 * Connector is active, but has no active pipe. This is fallout
5981bb76ff1Sjsg 		 * from our resume register restoring. Disable the encoder
5991bb76ff1Sjsg 		 * manually again.
6001bb76ff1Sjsg 		 */
6011bb76ff1Sjsg 		if (crtc_state) {
6021bb76ff1Sjsg 			struct drm_encoder *best_encoder;
6031bb76ff1Sjsg 
6041bb76ff1Sjsg 			drm_dbg_kms(&i915->drm,
6051bb76ff1Sjsg 				    "[ENCODER:%d:%s] manually disabled\n",
6061bb76ff1Sjsg 				    encoder->base.base.id,
6071bb76ff1Sjsg 				    encoder->base.name);
6081bb76ff1Sjsg 
6091bb76ff1Sjsg 			/* avoid oopsing in case the hooks consult best_encoder */
6101bb76ff1Sjsg 			best_encoder = connector->base.state->best_encoder;
6111bb76ff1Sjsg 			connector->base.state->best_encoder = &encoder->base;
6121bb76ff1Sjsg 
6131bb76ff1Sjsg 			/* FIXME NULL atomic state passed! */
6141bb76ff1Sjsg 			if (encoder->disable)
6151bb76ff1Sjsg 				encoder->disable(NULL, encoder, crtc_state,
6161bb76ff1Sjsg 						 connector->base.state);
6171bb76ff1Sjsg 			if (encoder->post_disable)
6181bb76ff1Sjsg 				encoder->post_disable(NULL, encoder, crtc_state,
6191bb76ff1Sjsg 						      connector->base.state);
6201bb76ff1Sjsg 
6211bb76ff1Sjsg 			connector->base.state->best_encoder = best_encoder;
6221bb76ff1Sjsg 		}
6231bb76ff1Sjsg 		encoder->base.crtc = NULL;
6241bb76ff1Sjsg 
6251bb76ff1Sjsg 		/*
6261bb76ff1Sjsg 		 * Inconsistent output/port/pipe state happens presumably due to
6271bb76ff1Sjsg 		 * a bug in one of the get_hw_state functions. Or someplace else
6281bb76ff1Sjsg 		 * in our code, like the register restore mess on resume. Clamp
6291bb76ff1Sjsg 		 * things to off as a safer default.
6301bb76ff1Sjsg 		 */
6311bb76ff1Sjsg 		connector->base.dpms = DRM_MODE_DPMS_OFF;
6321bb76ff1Sjsg 		connector->base.encoder = NULL;
6331bb76ff1Sjsg 	}
6341bb76ff1Sjsg 
6351bb76ff1Sjsg 	/* notify opregion of the sanitized encoder state */
6361bb76ff1Sjsg 	intel_opregion_notify_encoder(encoder, connector && has_active_crtc);
6371bb76ff1Sjsg 
6381bb76ff1Sjsg 	if (HAS_DDI(i915))
6391bb76ff1Sjsg 		intel_ddi_sanitize_encoder_pll_mapping(encoder);
6401bb76ff1Sjsg }
6411bb76ff1Sjsg 
6421bb76ff1Sjsg /* FIXME read out full plane state for all planes */
readout_plane_state(struct drm_i915_private * i915)6431bb76ff1Sjsg static void readout_plane_state(struct drm_i915_private *i915)
6441bb76ff1Sjsg {
6451bb76ff1Sjsg 	struct intel_plane *plane;
6461bb76ff1Sjsg 	struct intel_crtc *crtc;
6471bb76ff1Sjsg 
6481bb76ff1Sjsg 	for_each_intel_plane(&i915->drm, plane) {
6491bb76ff1Sjsg 		struct intel_plane_state *plane_state =
6501bb76ff1Sjsg 			to_intel_plane_state(plane->base.state);
6511bb76ff1Sjsg 		struct intel_crtc_state *crtc_state;
6521bb76ff1Sjsg 		enum pipe pipe = PIPE_A;
6531bb76ff1Sjsg 		bool visible;
6541bb76ff1Sjsg 
6551bb76ff1Sjsg 		visible = plane->get_hw_state(plane, &pipe);
6561bb76ff1Sjsg 
6571bb76ff1Sjsg 		crtc = intel_crtc_for_pipe(i915, pipe);
6581bb76ff1Sjsg 		crtc_state = to_intel_crtc_state(crtc->base.state);
6591bb76ff1Sjsg 
6601bb76ff1Sjsg 		intel_set_plane_visible(crtc_state, plane_state, visible);
6611bb76ff1Sjsg 
6621bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
6631bb76ff1Sjsg 			    "[PLANE:%d:%s] hw state readout: %s, pipe %c\n",
6641bb76ff1Sjsg 			    plane->base.base.id, plane->base.name,
6651bb76ff1Sjsg 			    str_enabled_disabled(visible), pipe_name(pipe));
6661bb76ff1Sjsg 	}
6671bb76ff1Sjsg 
6681bb76ff1Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
6691bb76ff1Sjsg 		struct intel_crtc_state *crtc_state =
6701bb76ff1Sjsg 			to_intel_crtc_state(crtc->base.state);
6711bb76ff1Sjsg 
6721bb76ff1Sjsg 		intel_plane_fixup_bitmasks(crtc_state);
6731bb76ff1Sjsg 	}
6741bb76ff1Sjsg }
6751bb76ff1Sjsg 
intel_modeset_readout_hw_state(struct drm_i915_private * i915)6761bb76ff1Sjsg static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
6771bb76ff1Sjsg {
6781bb76ff1Sjsg 	struct intel_cdclk_state *cdclk_state =
6791bb76ff1Sjsg 		to_intel_cdclk_state(i915->display.cdclk.obj.state);
6801bb76ff1Sjsg 	struct intel_dbuf_state *dbuf_state =
6811bb76ff1Sjsg 		to_intel_dbuf_state(i915->display.dbuf.obj.state);
682*f005ef32Sjsg 	struct intel_pmdemand_state *pmdemand_state =
683*f005ef32Sjsg 		to_intel_pmdemand_state(i915->display.pmdemand.obj.state);
6841bb76ff1Sjsg 	enum pipe pipe;
6851bb76ff1Sjsg 	struct intel_crtc *crtc;
6861bb76ff1Sjsg 	struct intel_encoder *encoder;
6871bb76ff1Sjsg 	struct intel_connector *connector;
6881bb76ff1Sjsg 	struct drm_connector_list_iter conn_iter;
6891bb76ff1Sjsg 	u8 active_pipes = 0;
6901bb76ff1Sjsg 
6911bb76ff1Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
6921bb76ff1Sjsg 		struct intel_crtc_state *crtc_state =
6931bb76ff1Sjsg 			to_intel_crtc_state(crtc->base.state);
6941bb76ff1Sjsg 
6951bb76ff1Sjsg 		__drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi);
6961bb76ff1Sjsg 		intel_crtc_free_hw_state(crtc_state);
6971bb76ff1Sjsg 		intel_crtc_state_reset(crtc_state, crtc);
6981bb76ff1Sjsg 
6991bb76ff1Sjsg 		intel_crtc_get_pipe_config(crtc_state);
7001bb76ff1Sjsg 
7011bb76ff1Sjsg 		crtc_state->hw.enable = crtc_state->hw.active;
7021bb76ff1Sjsg 
7031bb76ff1Sjsg 		crtc->base.enabled = crtc_state->hw.enable;
7041bb76ff1Sjsg 		crtc->active = crtc_state->hw.active;
7051bb76ff1Sjsg 
7061bb76ff1Sjsg 		if (crtc_state->hw.active)
7071bb76ff1Sjsg 			active_pipes |= BIT(crtc->pipe);
7081bb76ff1Sjsg 
7091bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
7101bb76ff1Sjsg 			    "[CRTC:%d:%s] hw state readout: %s\n",
7111bb76ff1Sjsg 			    crtc->base.base.id, crtc->base.name,
7121bb76ff1Sjsg 			    str_enabled_disabled(crtc_state->hw.active));
7131bb76ff1Sjsg 	}
7141bb76ff1Sjsg 
7151bb76ff1Sjsg 	cdclk_state->active_pipes = active_pipes;
7161bb76ff1Sjsg 	dbuf_state->active_pipes = active_pipes;
7171bb76ff1Sjsg 
7181bb76ff1Sjsg 	readout_plane_state(i915);
7191bb76ff1Sjsg 
7201bb76ff1Sjsg 	for_each_intel_encoder(&i915->drm, encoder) {
7211bb76ff1Sjsg 		struct intel_crtc_state *crtc_state = NULL;
7221bb76ff1Sjsg 
7231bb76ff1Sjsg 		pipe = 0;
7241bb76ff1Sjsg 
7251bb76ff1Sjsg 		if (encoder->get_hw_state(encoder, &pipe)) {
7261bb76ff1Sjsg 			crtc = intel_crtc_for_pipe(i915, pipe);
7271bb76ff1Sjsg 			crtc_state = to_intel_crtc_state(crtc->base.state);
7281bb76ff1Sjsg 
7291bb76ff1Sjsg 			encoder->base.crtc = &crtc->base;
7301bb76ff1Sjsg 			intel_encoder_get_config(encoder, crtc_state);
7311bb76ff1Sjsg 
7321bb76ff1Sjsg 			/* read out to slave crtc as well for bigjoiner */
7331bb76ff1Sjsg 			if (crtc_state->bigjoiner_pipes) {
7341bb76ff1Sjsg 				struct intel_crtc *slave_crtc;
7351bb76ff1Sjsg 
7361bb76ff1Sjsg 				/* encoder should read be linked to bigjoiner master */
7371bb76ff1Sjsg 				WARN_ON(intel_crtc_is_bigjoiner_slave(crtc_state));
7381bb76ff1Sjsg 
7391bb76ff1Sjsg 				for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
7401bb76ff1Sjsg 								 intel_crtc_bigjoiner_slave_pipes(crtc_state)) {
7411bb76ff1Sjsg 					struct intel_crtc_state *slave_crtc_state;
7421bb76ff1Sjsg 
7431bb76ff1Sjsg 					slave_crtc_state = to_intel_crtc_state(slave_crtc->base.state);
7441bb76ff1Sjsg 					intel_encoder_get_config(encoder, slave_crtc_state);
7451bb76ff1Sjsg 				}
7461bb76ff1Sjsg 			}
747*f005ef32Sjsg 
748*f005ef32Sjsg 			intel_pmdemand_update_phys_mask(i915, encoder,
749*f005ef32Sjsg 							pmdemand_state,
750*f005ef32Sjsg 							true);
7511bb76ff1Sjsg 		} else {
752*f005ef32Sjsg 			intel_pmdemand_update_phys_mask(i915, encoder,
753*f005ef32Sjsg 							pmdemand_state,
754*f005ef32Sjsg 							false);
755*f005ef32Sjsg 
7561bb76ff1Sjsg 			encoder->base.crtc = NULL;
7571bb76ff1Sjsg 		}
7581bb76ff1Sjsg 
7591bb76ff1Sjsg 		if (encoder->sync_state)
7601bb76ff1Sjsg 			encoder->sync_state(encoder, crtc_state);
7611bb76ff1Sjsg 
7621bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
7631bb76ff1Sjsg 			    "[ENCODER:%d:%s] hw state readout: %s, pipe %c\n",
7641bb76ff1Sjsg 			    encoder->base.base.id, encoder->base.name,
7651bb76ff1Sjsg 			    str_enabled_disabled(encoder->base.crtc),
7661bb76ff1Sjsg 			    pipe_name(pipe));
7671bb76ff1Sjsg 	}
7681bb76ff1Sjsg 
7691bb76ff1Sjsg 	intel_dpll_readout_hw_state(i915);
7701bb76ff1Sjsg 
7711bb76ff1Sjsg 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
7721bb76ff1Sjsg 	for_each_intel_connector_iter(connector, &conn_iter) {
7731bb76ff1Sjsg 		if (connector->get_hw_state(connector)) {
7741bb76ff1Sjsg 			struct intel_crtc_state *crtc_state;
7751bb76ff1Sjsg 			struct intel_crtc *crtc;
7761bb76ff1Sjsg 
7771bb76ff1Sjsg 			connector->base.dpms = DRM_MODE_DPMS_ON;
7781bb76ff1Sjsg 
7791bb76ff1Sjsg 			encoder = intel_attached_encoder(connector);
7801bb76ff1Sjsg 			connector->base.encoder = &encoder->base;
7811bb76ff1Sjsg 
7821bb76ff1Sjsg 			crtc = to_intel_crtc(encoder->base.crtc);
7831bb76ff1Sjsg 			crtc_state = crtc ? to_intel_crtc_state(crtc->base.state) : NULL;
7841bb76ff1Sjsg 
7851bb76ff1Sjsg 			if (crtc_state && crtc_state->hw.active) {
7861bb76ff1Sjsg 				/*
7871bb76ff1Sjsg 				 * This has to be done during hardware readout
7881bb76ff1Sjsg 				 * because anything calling .crtc_disable may
7891bb76ff1Sjsg 				 * rely on the connector_mask being accurate.
7901bb76ff1Sjsg 				 */
7911bb76ff1Sjsg 				crtc_state->uapi.connector_mask |=
7921bb76ff1Sjsg 					drm_connector_mask(&connector->base);
7931bb76ff1Sjsg 				crtc_state->uapi.encoder_mask |=
7941bb76ff1Sjsg 					drm_encoder_mask(&encoder->base);
7951bb76ff1Sjsg 			}
7961bb76ff1Sjsg 		} else {
7971bb76ff1Sjsg 			connector->base.dpms = DRM_MODE_DPMS_OFF;
7981bb76ff1Sjsg 			connector->base.encoder = NULL;
7991bb76ff1Sjsg 		}
8001bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
8011bb76ff1Sjsg 			    "[CONNECTOR:%d:%s] hw state readout: %s\n",
8021bb76ff1Sjsg 			    connector->base.base.id, connector->base.name,
8031bb76ff1Sjsg 			    str_enabled_disabled(connector->base.encoder));
8041bb76ff1Sjsg 	}
8051bb76ff1Sjsg 	drm_connector_list_iter_end(&conn_iter);
8061bb76ff1Sjsg 
8071bb76ff1Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
8081bb76ff1Sjsg 		struct intel_bw_state *bw_state =
8091bb76ff1Sjsg 			to_intel_bw_state(i915->display.bw.obj.state);
8101bb76ff1Sjsg 		struct intel_crtc_state *crtc_state =
8111bb76ff1Sjsg 			to_intel_crtc_state(crtc->base.state);
8121bb76ff1Sjsg 		struct intel_plane *plane;
8131bb76ff1Sjsg 		int min_cdclk = 0;
8141bb76ff1Sjsg 
8151bb76ff1Sjsg 		if (crtc_state->hw.active) {
8161bb76ff1Sjsg 			/*
8171bb76ff1Sjsg 			 * The initial mode needs to be set in order to keep
8181bb76ff1Sjsg 			 * the atomic core happy. It wants a valid mode if the
8191bb76ff1Sjsg 			 * crtc's enabled, so we do the above call.
8201bb76ff1Sjsg 			 *
8211bb76ff1Sjsg 			 * But we don't set all the derived state fully, hence
8221bb76ff1Sjsg 			 * set a flag to indicate that a full recalculation is
8231bb76ff1Sjsg 			 * needed on the next commit.
8241bb76ff1Sjsg 			 */
8251bb76ff1Sjsg 			crtc_state->inherited = true;
8261bb76ff1Sjsg 
827*f005ef32Sjsg 			intel_crtc_update_active_timings(crtc_state,
828*f005ef32Sjsg 							 crtc_state->vrr.enable);
8291bb76ff1Sjsg 
8301bb76ff1Sjsg 			intel_crtc_copy_hw_to_uapi_state(crtc_state);
8311bb76ff1Sjsg 		}
8321bb76ff1Sjsg 
8331bb76ff1Sjsg 		for_each_intel_plane_on_crtc(&i915->drm, crtc, plane) {
8341bb76ff1Sjsg 			const struct intel_plane_state *plane_state =
8351bb76ff1Sjsg 				to_intel_plane_state(plane->base.state);
8361bb76ff1Sjsg 
8371bb76ff1Sjsg 			/*
8381bb76ff1Sjsg 			 * FIXME don't have the fb yet, so can't
8391bb76ff1Sjsg 			 * use intel_plane_data_rate() :(
8401bb76ff1Sjsg 			 */
8411bb76ff1Sjsg 			if (plane_state->uapi.visible)
8421bb76ff1Sjsg 				crtc_state->data_rate[plane->id] =
8431bb76ff1Sjsg 					4 * crtc_state->pixel_rate;
8441bb76ff1Sjsg 			/*
8451bb76ff1Sjsg 			 * FIXME don't have the fb yet, so can't
8461bb76ff1Sjsg 			 * use plane->min_cdclk() :(
8471bb76ff1Sjsg 			 */
8481bb76ff1Sjsg 			if (plane_state->uapi.visible && plane->min_cdclk) {
8491bb76ff1Sjsg 				if (crtc_state->double_wide || DISPLAY_VER(i915) >= 10)
8501bb76ff1Sjsg 					crtc_state->min_cdclk[plane->id] =
8511bb76ff1Sjsg 						DIV_ROUND_UP(crtc_state->pixel_rate, 2);
8521bb76ff1Sjsg 				else
8531bb76ff1Sjsg 					crtc_state->min_cdclk[plane->id] =
8541bb76ff1Sjsg 						crtc_state->pixel_rate;
8551bb76ff1Sjsg 			}
8561bb76ff1Sjsg 			drm_dbg_kms(&i915->drm,
8571bb76ff1Sjsg 				    "[PLANE:%d:%s] min_cdclk %d kHz\n",
8581bb76ff1Sjsg 				    plane->base.base.id, plane->base.name,
8591bb76ff1Sjsg 				    crtc_state->min_cdclk[plane->id]);
8601bb76ff1Sjsg 		}
8611bb76ff1Sjsg 
8621bb76ff1Sjsg 		if (crtc_state->hw.active) {
8631bb76ff1Sjsg 			min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
8641bb76ff1Sjsg 			if (drm_WARN_ON(&i915->drm, min_cdclk < 0))
8651bb76ff1Sjsg 				min_cdclk = 0;
8661bb76ff1Sjsg 		}
8671bb76ff1Sjsg 
8681bb76ff1Sjsg 		cdclk_state->min_cdclk[crtc->pipe] = min_cdclk;
8691bb76ff1Sjsg 		cdclk_state->min_voltage_level[crtc->pipe] =
8701bb76ff1Sjsg 			crtc_state->min_voltage_level;
8711bb76ff1Sjsg 
872*f005ef32Sjsg 		intel_pmdemand_update_port_clock(i915, pmdemand_state, pipe,
873*f005ef32Sjsg 						 crtc_state->port_clock);
874*f005ef32Sjsg 
8751bb76ff1Sjsg 		intel_bw_crtc_update(bw_state, crtc_state);
8761bb76ff1Sjsg 	}
877*f005ef32Sjsg 
878*f005ef32Sjsg 	intel_pmdemand_init_pmdemand_params(i915, pmdemand_state);
8791bb76ff1Sjsg }
8801bb76ff1Sjsg 
8811bb76ff1Sjsg static void
get_encoder_power_domains(struct drm_i915_private * i915)8821bb76ff1Sjsg get_encoder_power_domains(struct drm_i915_private *i915)
8831bb76ff1Sjsg {
8841bb76ff1Sjsg 	struct intel_encoder *encoder;
8851bb76ff1Sjsg 
8861bb76ff1Sjsg 	for_each_intel_encoder(&i915->drm, encoder) {
8871bb76ff1Sjsg 		struct intel_crtc_state *crtc_state;
8881bb76ff1Sjsg 
8891bb76ff1Sjsg 		if (!encoder->get_power_domains)
8901bb76ff1Sjsg 			continue;
8911bb76ff1Sjsg 
8921bb76ff1Sjsg 		/*
8931bb76ff1Sjsg 		 * MST-primary and inactive encoders don't have a crtc state
8941bb76ff1Sjsg 		 * and neither of these require any power domain references.
8951bb76ff1Sjsg 		 */
8961bb76ff1Sjsg 		if (!encoder->base.crtc)
8971bb76ff1Sjsg 			continue;
8981bb76ff1Sjsg 
8991bb76ff1Sjsg 		crtc_state = to_intel_crtc_state(encoder->base.crtc->state);
9001bb76ff1Sjsg 		encoder->get_power_domains(encoder, crtc_state);
9011bb76ff1Sjsg 	}
9021bb76ff1Sjsg }
9031bb76ff1Sjsg 
intel_early_display_was(struct drm_i915_private * i915)9041bb76ff1Sjsg static void intel_early_display_was(struct drm_i915_private *i915)
9051bb76ff1Sjsg {
9061bb76ff1Sjsg 	/*
9071bb76ff1Sjsg 	 * Display WA #1185 WaDisableDARBFClkGating:glk,icl,ehl,tgl
9081bb76ff1Sjsg 	 * Also known as Wa_14010480278.
9091bb76ff1Sjsg 	 */
9101bb76ff1Sjsg 	if (IS_DISPLAY_VER(i915, 10, 12))
911*f005ef32Sjsg 		intel_de_rmw(i915, GEN9_CLKGATE_DIS_0, 0, DARBF_GATING_DIS);
9121bb76ff1Sjsg 
9131bb76ff1Sjsg 	/*
9141bb76ff1Sjsg 	 * WaRsPkgCStateDisplayPMReq:hsw
9151bb76ff1Sjsg 	 * System hang if this isn't done before disabling all planes!
9161bb76ff1Sjsg 	 */
917*f005ef32Sjsg 	if (IS_HASWELL(i915))
918*f005ef32Sjsg 		intel_de_rmw(i915, CHICKEN_PAR1_1, 0, FORCE_ARB_IDLE_PLANES);
9191bb76ff1Sjsg 
9201bb76ff1Sjsg 	if (IS_KABYLAKE(i915) || IS_COFFEELAKE(i915) || IS_COMETLAKE(i915)) {
9211bb76ff1Sjsg 		/* Display WA #1142:kbl,cfl,cml */
9221bb76ff1Sjsg 		intel_de_rmw(i915, CHICKEN_PAR1_1,
9231bb76ff1Sjsg 			     KBL_ARB_FILL_SPARE_22, KBL_ARB_FILL_SPARE_22);
9241bb76ff1Sjsg 		intel_de_rmw(i915, CHICKEN_MISC_2,
9251bb76ff1Sjsg 			     KBL_ARB_FILL_SPARE_13 | KBL_ARB_FILL_SPARE_14,
9261bb76ff1Sjsg 			     KBL_ARB_FILL_SPARE_14);
9271bb76ff1Sjsg 	}
9281bb76ff1Sjsg }
9291bb76ff1Sjsg 
intel_modeset_setup_hw_state(struct drm_i915_private * i915,struct drm_modeset_acquire_ctx * ctx)9301bb76ff1Sjsg void intel_modeset_setup_hw_state(struct drm_i915_private *i915,
9311bb76ff1Sjsg 				  struct drm_modeset_acquire_ctx *ctx)
9321bb76ff1Sjsg {
9331bb76ff1Sjsg 	struct intel_encoder *encoder;
9341bb76ff1Sjsg 	struct intel_crtc *crtc;
9351bb76ff1Sjsg 	intel_wakeref_t wakeref;
9361bb76ff1Sjsg 
9371bb76ff1Sjsg 	wakeref = intel_display_power_get(i915, POWER_DOMAIN_INIT);
9381bb76ff1Sjsg 
9391bb76ff1Sjsg 	intel_early_display_was(i915);
9401bb76ff1Sjsg 	intel_modeset_readout_hw_state(i915);
9411bb76ff1Sjsg 
9421bb76ff1Sjsg 	/* HW state is read out, now we need to sanitize this mess. */
9431bb76ff1Sjsg 	get_encoder_power_domains(i915);
9441bb76ff1Sjsg 
9451bb76ff1Sjsg 	intel_pch_sanitize(i915);
9461bb76ff1Sjsg 
9471bb76ff1Sjsg 	/*
9481bb76ff1Sjsg 	 * intel_sanitize_plane_mapping() may need to do vblank
9491bb76ff1Sjsg 	 * waits, so we need vblank interrupts restored beforehand.
9501bb76ff1Sjsg 	 */
9511bb76ff1Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
9521bb76ff1Sjsg 		struct intel_crtc_state *crtc_state =
9531bb76ff1Sjsg 			to_intel_crtc_state(crtc->base.state);
9541bb76ff1Sjsg 
9551bb76ff1Sjsg 		intel_sanitize_fifo_underrun_reporting(crtc_state);
9561bb76ff1Sjsg 
9571bb76ff1Sjsg 		drm_crtc_vblank_reset(&crtc->base);
9581bb76ff1Sjsg 
959*f005ef32Sjsg 		if (crtc_state->hw.active) {
960*f005ef32Sjsg 			intel_dmc_enable_pipe(i915, crtc->pipe);
9611bb76ff1Sjsg 			intel_crtc_vblank_on(crtc_state);
9621bb76ff1Sjsg 		}
963*f005ef32Sjsg 	}
9641bb76ff1Sjsg 
9651bb76ff1Sjsg 	intel_fbc_sanitize(i915);
9661bb76ff1Sjsg 
9671bb76ff1Sjsg 	intel_sanitize_plane_mapping(i915);
9681bb76ff1Sjsg 
9691bb76ff1Sjsg 	for_each_intel_encoder(&i915->drm, encoder)
9701bb76ff1Sjsg 		intel_sanitize_encoder(encoder);
9711bb76ff1Sjsg 
972*f005ef32Sjsg 	/*
973*f005ef32Sjsg 	 * Sanitizing CRTCs needs their connector atomic state to be
974*f005ef32Sjsg 	 * up-to-date, so ensure that already here.
975*f005ef32Sjsg 	 */
9761bb76ff1Sjsg 	intel_modeset_update_connector_atomic_state(i915);
9771bb76ff1Sjsg 
978*f005ef32Sjsg 	intel_sanitize_all_crtcs(i915, ctx);
979*f005ef32Sjsg 
9801bb76ff1Sjsg 	intel_dpll_sanitize_state(i915);
9811bb76ff1Sjsg 
982*f005ef32Sjsg 	intel_wm_get_hw_state(i915);
9831bb76ff1Sjsg 
9841bb76ff1Sjsg 	for_each_intel_crtc(&i915->drm, crtc) {
9851bb76ff1Sjsg 		struct intel_crtc_state *crtc_state =
9861bb76ff1Sjsg 			to_intel_crtc_state(crtc->base.state);
9871bb76ff1Sjsg 		struct intel_power_domain_mask put_domains;
9881bb76ff1Sjsg 
9891bb76ff1Sjsg 		intel_modeset_get_crtc_power_domains(crtc_state, &put_domains);
9901bb76ff1Sjsg 		if (drm_WARN_ON(&i915->drm, !bitmap_empty(put_domains.bits, POWER_DOMAIN_NUM)))
9911bb76ff1Sjsg 			intel_modeset_put_crtc_power_domains(crtc, &put_domains);
9921bb76ff1Sjsg 	}
9931bb76ff1Sjsg 
9941bb76ff1Sjsg 	intel_display_power_put(i915, POWER_DOMAIN_INIT, wakeref);
9951bb76ff1Sjsg 
9961bb76ff1Sjsg 	intel_power_domains_sanitize_state(i915);
9971bb76ff1Sjsg }
998