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