1df0566a6SJani Nikula /*
2df0566a6SJani Nikula * Copyright © 2015 Intel Corporation
3df0566a6SJani Nikula *
4df0566a6SJani Nikula * Permission is hereby granted, free of charge, to any person obtaining a
5df0566a6SJani Nikula * copy of this software and associated documentation files (the "Software"),
6df0566a6SJani Nikula * to deal in the Software without restriction, including without limitation
7df0566a6SJani Nikula * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8df0566a6SJani Nikula * and/or sell copies of the Software, and to permit persons to whom the
9df0566a6SJani Nikula * Software is furnished to do so, subject to the following conditions:
10df0566a6SJani Nikula *
11df0566a6SJani Nikula * The above copyright notice and this permission notice (including the next
12df0566a6SJani Nikula * paragraph) shall be included in all copies or substantial portions of the
13df0566a6SJani Nikula * Software.
14df0566a6SJani Nikula *
15df0566a6SJani Nikula * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16df0566a6SJani Nikula * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17df0566a6SJani Nikula * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18df0566a6SJani Nikula * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19df0566a6SJani Nikula * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20df0566a6SJani Nikula * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21df0566a6SJani Nikula * DEALINGS IN THE SOFTWARE.
22df0566a6SJani Nikula */
23df0566a6SJani Nikula
24df0566a6SJani Nikula /**
25df0566a6SJani Nikula * DOC: atomic modeset support
26df0566a6SJani Nikula *
27df0566a6SJani Nikula * The functions here implement the state management and hardware programming
28df0566a6SJani Nikula * dispatch required by the atomic modeset infrastructure.
29df0566a6SJani Nikula * See intel_atomic_plane.c for the plane-specific atomic functionality.
30df0566a6SJani Nikula */
31df0566a6SJani Nikula
32df0566a6SJani Nikula #include <drm/drm_atomic.h>
33df0566a6SJani Nikula #include <drm/drm_atomic_helper.h>
34df0566a6SJani Nikula #include <drm/drm_fourcc.h>
35df0566a6SJani Nikula
36cce936f4SJani Nikula #include "i915_drv.h"
37ce2fce25SMatt Roper #include "i915_reg.h"
38df0566a6SJani Nikula #include "intel_atomic.h"
39b4db3a8cSVille Syrjälä #include "intel_cdclk.h"
401d455f8dSJani Nikula #include "intel_display_types.h"
410ef1905eSVille Syrjälä #include "intel_global_state.h"
42df0566a6SJani Nikula #include "intel_hdcp.h"
4360c6a14bSJosé Roberto de Souza #include "intel_psr.h"
448d4312e2SLuca Coelho #include "intel_fb.h"
45714b1cdbSDave Airlie #include "skl_universal_plane.h"
46df0566a6SJani Nikula
47df0566a6SJani Nikula /**
48df0566a6SJani Nikula * intel_digital_connector_atomic_get_property - hook for connector->atomic_get_property.
49df0566a6SJani Nikula * @connector: Connector to get the property for.
50df0566a6SJani Nikula * @state: Connector state to retrieve the property from.
51df0566a6SJani Nikula * @property: Property to retrieve.
52df0566a6SJani Nikula * @val: Return value for the property.
53df0566a6SJani Nikula *
54df0566a6SJani Nikula * Returns the atomic property value for a digital connector.
55df0566a6SJani Nikula */
intel_digital_connector_atomic_get_property(struct drm_connector * connector,const struct drm_connector_state * state,struct drm_property * property,u64 * val)56df0566a6SJani Nikula int intel_digital_connector_atomic_get_property(struct drm_connector *connector,
57df0566a6SJani Nikula const struct drm_connector_state *state,
58df0566a6SJani Nikula struct drm_property *property,
59df0566a6SJani Nikula u64 *val)
60df0566a6SJani Nikula {
61df0566a6SJani Nikula struct drm_device *dev = connector->dev;
62df0566a6SJani Nikula struct drm_i915_private *dev_priv = to_i915(dev);
63df0566a6SJani Nikula struct intel_digital_connector_state *intel_conn_state =
64df0566a6SJani Nikula to_intel_digital_connector_state(state);
65df0566a6SJani Nikula
66fe28c7c1SJani Nikula if (property == dev_priv->display.properties.force_audio)
67df0566a6SJani Nikula *val = intel_conn_state->force_audio;
68fe28c7c1SJani Nikula else if (property == dev_priv->display.properties.broadcast_rgb)
69df0566a6SJani Nikula *val = intel_conn_state->broadcast_rgb;
70df0566a6SJani Nikula else {
71f07fba2fSWambui Karuga drm_dbg_atomic(&dev_priv->drm,
72f07fba2fSWambui Karuga "Unknown property [PROP:%d:%s]\n",
73df0566a6SJani Nikula property->base.id, property->name);
74df0566a6SJani Nikula return -EINVAL;
75df0566a6SJani Nikula }
76df0566a6SJani Nikula
77df0566a6SJani Nikula return 0;
78df0566a6SJani Nikula }
79df0566a6SJani Nikula
80df0566a6SJani Nikula /**
81df0566a6SJani Nikula * intel_digital_connector_atomic_set_property - hook for connector->atomic_set_property.
82df0566a6SJani Nikula * @connector: Connector to set the property for.
83df0566a6SJani Nikula * @state: Connector state to set the property on.
84df0566a6SJani Nikula * @property: Property to set.
85df0566a6SJani Nikula * @val: New value for the property.
86df0566a6SJani Nikula *
87df0566a6SJani Nikula * Sets the atomic property value for a digital connector.
88df0566a6SJani Nikula */
intel_digital_connector_atomic_set_property(struct drm_connector * connector,struct drm_connector_state * state,struct drm_property * property,u64 val)89df0566a6SJani Nikula int intel_digital_connector_atomic_set_property(struct drm_connector *connector,
90df0566a6SJani Nikula struct drm_connector_state *state,
91df0566a6SJani Nikula struct drm_property *property,
92df0566a6SJani Nikula u64 val)
93df0566a6SJani Nikula {
94df0566a6SJani Nikula struct drm_device *dev = connector->dev;
95df0566a6SJani Nikula struct drm_i915_private *dev_priv = to_i915(dev);
96df0566a6SJani Nikula struct intel_digital_connector_state *intel_conn_state =
97df0566a6SJani Nikula to_intel_digital_connector_state(state);
98df0566a6SJani Nikula
99fe28c7c1SJani Nikula if (property == dev_priv->display.properties.force_audio) {
100df0566a6SJani Nikula intel_conn_state->force_audio = val;
101df0566a6SJani Nikula return 0;
102df0566a6SJani Nikula }
103df0566a6SJani Nikula
104fe28c7c1SJani Nikula if (property == dev_priv->display.properties.broadcast_rgb) {
105df0566a6SJani Nikula intel_conn_state->broadcast_rgb = val;
106df0566a6SJani Nikula return 0;
107df0566a6SJani Nikula }
108df0566a6SJani Nikula
109f07fba2fSWambui Karuga drm_dbg_atomic(&dev_priv->drm, "Unknown property [PROP:%d:%s]\n",
110df0566a6SJani Nikula property->base.id, property->name);
111df0566a6SJani Nikula return -EINVAL;
112df0566a6SJani Nikula }
113df0566a6SJani Nikula
intel_digital_connector_atomic_check(struct drm_connector * conn,struct drm_atomic_state * state)114df0566a6SJani Nikula int intel_digital_connector_atomic_check(struct drm_connector *conn,
115417f2544SDave Airlie struct drm_atomic_state *state)
116df0566a6SJani Nikula {
117417f2544SDave Airlie struct drm_connector_state *new_state =
118417f2544SDave Airlie drm_atomic_get_new_connector_state(state, conn);
119df0566a6SJani Nikula struct intel_digital_connector_state *new_conn_state =
120df0566a6SJani Nikula to_intel_digital_connector_state(new_state);
121df0566a6SJani Nikula struct drm_connector_state *old_state =
122417f2544SDave Airlie drm_atomic_get_old_connector_state(state, conn);
123df0566a6SJani Nikula struct intel_digital_connector_state *old_conn_state =
124df0566a6SJani Nikula to_intel_digital_connector_state(old_state);
125df0566a6SJani Nikula struct drm_crtc_state *crtc_state;
126df0566a6SJani Nikula
127df0566a6SJani Nikula intel_hdcp_atomic_check(conn, old_state, new_state);
128df0566a6SJani Nikula
129df0566a6SJani Nikula if (!new_state->crtc)
130df0566a6SJani Nikula return 0;
131df0566a6SJani Nikula
132417f2544SDave Airlie crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc);
133df0566a6SJani Nikula
134df0566a6SJani Nikula /*
135df0566a6SJani Nikula * These properties are handled by fastset, and might not end
136df0566a6SJani Nikula * up in a modeset.
137df0566a6SJani Nikula */
138df0566a6SJani Nikula if (new_conn_state->force_audio != old_conn_state->force_audio ||
139df0566a6SJani Nikula new_conn_state->broadcast_rgb != old_conn_state->broadcast_rgb ||
140df0566a6SJani Nikula new_conn_state->base.colorspace != old_conn_state->base.colorspace ||
141df0566a6SJani Nikula new_conn_state->base.picture_aspect_ratio != old_conn_state->base.picture_aspect_ratio ||
142df0566a6SJani Nikula new_conn_state->base.content_type != old_conn_state->base.content_type ||
143df0566a6SJani Nikula new_conn_state->base.scaling_mode != old_conn_state->base.scaling_mode ||
1446306d8dbSHans de Goede new_conn_state->base.privacy_screen_sw_state != old_conn_state->base.privacy_screen_sw_state ||
14572921cdfSMaxime Ripard !drm_connector_atomic_hdr_metadata_equal(old_state, new_state))
146df0566a6SJani Nikula crtc_state->mode_changed = true;
147df0566a6SJani Nikula
148df0566a6SJani Nikula return 0;
149df0566a6SJani Nikula }
150df0566a6SJani Nikula
151df0566a6SJani Nikula /**
152df0566a6SJani Nikula * intel_digital_connector_duplicate_state - duplicate connector state
153df0566a6SJani Nikula * @connector: digital connector
154df0566a6SJani Nikula *
155df0566a6SJani Nikula * Allocates and returns a copy of the connector state (both common and
156df0566a6SJani Nikula * digital connector specific) for the specified connector.
157df0566a6SJani Nikula *
158df0566a6SJani Nikula * Returns: The newly allocated connector state, or NULL on failure.
159df0566a6SJani Nikula */
160df0566a6SJani Nikula struct drm_connector_state *
intel_digital_connector_duplicate_state(struct drm_connector * connector)161df0566a6SJani Nikula intel_digital_connector_duplicate_state(struct drm_connector *connector)
162df0566a6SJani Nikula {
163df0566a6SJani Nikula struct intel_digital_connector_state *state;
164df0566a6SJani Nikula
165df0566a6SJani Nikula state = kmemdup(connector->state, sizeof(*state), GFP_KERNEL);
166df0566a6SJani Nikula if (!state)
167df0566a6SJani Nikula return NULL;
168df0566a6SJani Nikula
169df0566a6SJani Nikula __drm_atomic_helper_connector_duplicate_state(connector, &state->base);
170df0566a6SJani Nikula return &state->base;
171df0566a6SJani Nikula }
172df0566a6SJani Nikula
173df0566a6SJani Nikula /**
174ee36c7c0SJosé Roberto de Souza * intel_connector_needs_modeset - check if connector needs a modeset
175723196f4SChris Wilson * @state: the atomic state corresponding to this modeset
176723196f4SChris Wilson * @connector: the connector
177ee36c7c0SJosé Roberto de Souza */
178ee36c7c0SJosé Roberto de Souza bool
intel_connector_needs_modeset(struct intel_atomic_state * state,struct drm_connector * connector)179ee36c7c0SJosé Roberto de Souza intel_connector_needs_modeset(struct intel_atomic_state *state,
180ee36c7c0SJosé Roberto de Souza struct drm_connector *connector)
181ee36c7c0SJosé Roberto de Souza {
182ee36c7c0SJosé Roberto de Souza const struct drm_connector_state *old_conn_state, *new_conn_state;
183ee36c7c0SJosé Roberto de Souza
184ee36c7c0SJosé Roberto de Souza old_conn_state = drm_atomic_get_old_connector_state(&state->base, connector);
185ee36c7c0SJosé Roberto de Souza new_conn_state = drm_atomic_get_new_connector_state(&state->base, connector);
186ee36c7c0SJosé Roberto de Souza
187ee36c7c0SJosé Roberto de Souza return old_conn_state->crtc != new_conn_state->crtc ||
188ee36c7c0SJosé Roberto de Souza (new_conn_state->crtc &&
189ee36c7c0SJosé Roberto de Souza drm_atomic_crtc_needs_modeset(drm_atomic_get_new_crtc_state(&state->base,
190ee36c7c0SJosé Roberto de Souza new_conn_state->crtc)));
191ee36c7c0SJosé Roberto de Souza }
192ee36c7c0SJosé Roberto de Souza
193f4dc0086SVandita Kulkarni /**
194f4dc0086SVandita Kulkarni * intel_any_crtc_needs_modeset - check if any CRTC needs a modeset
195f4dc0086SVandita Kulkarni * @state: the atomic state corresponding to this modeset
196f4dc0086SVandita Kulkarni *
197f4dc0086SVandita Kulkarni * Returns true if any CRTC in @state needs a modeset.
198f4dc0086SVandita Kulkarni */
intel_any_crtc_needs_modeset(struct intel_atomic_state * state)199f4dc0086SVandita Kulkarni bool intel_any_crtc_needs_modeset(struct intel_atomic_state *state)
200f4dc0086SVandita Kulkarni {
201f4dc0086SVandita Kulkarni struct intel_crtc *crtc;
202f4dc0086SVandita Kulkarni struct intel_crtc_state *crtc_state;
203f4dc0086SVandita Kulkarni int i;
204f4dc0086SVandita Kulkarni
205f4dc0086SVandita Kulkarni for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
206f4dc0086SVandita Kulkarni if (intel_crtc_needs_modeset(crtc_state))
207f4dc0086SVandita Kulkarni return true;
208f4dc0086SVandita Kulkarni }
209f4dc0086SVandita Kulkarni
210f4dc0086SVandita Kulkarni return false;
211f4dc0086SVandita Kulkarni }
212f4dc0086SVandita Kulkarni
2136671c367SJosé Roberto de Souza struct intel_digital_connector_state *
intel_atomic_get_digital_connector_state(struct intel_atomic_state * state,struct intel_connector * connector)2146671c367SJosé Roberto de Souza intel_atomic_get_digital_connector_state(struct intel_atomic_state *state,
2156671c367SJosé Roberto de Souza struct intel_connector *connector)
2166671c367SJosé Roberto de Souza {
2176671c367SJosé Roberto de Souza struct drm_connector_state *conn_state;
2186671c367SJosé Roberto de Souza
2196671c367SJosé Roberto de Souza conn_state = drm_atomic_get_connector_state(&state->base,
2206671c367SJosé Roberto de Souza &connector->base);
2216671c367SJosé Roberto de Souza if (IS_ERR(conn_state))
2226671c367SJosé Roberto de Souza return ERR_CAST(conn_state);
2236671c367SJosé Roberto de Souza
2246671c367SJosé Roberto de Souza return to_intel_digital_connector_state(conn_state);
2256671c367SJosé Roberto de Souza }
2266671c367SJosé Roberto de Souza
227ee36c7c0SJosé Roberto de Souza /**
228df0566a6SJani Nikula * intel_crtc_duplicate_state - duplicate crtc state
229df0566a6SJani Nikula * @crtc: drm crtc
230df0566a6SJani Nikula *
231df0566a6SJani Nikula * Allocates and returns a copy of the crtc state (both common and
232df0566a6SJani Nikula * Intel-specific) for the specified crtc.
233df0566a6SJani Nikula *
234df0566a6SJani Nikula * Returns: The newly allocated crtc state, or NULL on failure.
235df0566a6SJani Nikula */
236df0566a6SJani Nikula struct drm_crtc_state *
intel_crtc_duplicate_state(struct drm_crtc * crtc)237df0566a6SJani Nikula intel_crtc_duplicate_state(struct drm_crtc *crtc)
238df0566a6SJani Nikula {
2392b808b3aSMaarten Lankhorst const struct intel_crtc_state *old_crtc_state = to_intel_crtc_state(crtc->state);
240df0566a6SJani Nikula struct intel_crtc_state *crtc_state;
241df0566a6SJani Nikula
2422b808b3aSMaarten Lankhorst crtc_state = kmemdup(old_crtc_state, sizeof(*crtc_state), GFP_KERNEL);
243df0566a6SJani Nikula if (!crtc_state)
244df0566a6SJani Nikula return NULL;
245df0566a6SJani Nikula
2462225f3c6SMaarten Lankhorst __drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->uapi);
247df0566a6SJani Nikula
24858d124eaSMaarten Lankhorst /* copy color blobs */
24958d124eaSMaarten Lankhorst if (crtc_state->hw.degamma_lut)
25058d124eaSMaarten Lankhorst drm_property_blob_get(crtc_state->hw.degamma_lut);
25158d124eaSMaarten Lankhorst if (crtc_state->hw.ctm)
25258d124eaSMaarten Lankhorst drm_property_blob_get(crtc_state->hw.ctm);
25358d124eaSMaarten Lankhorst if (crtc_state->hw.gamma_lut)
25458d124eaSMaarten Lankhorst drm_property_blob_get(crtc_state->hw.gamma_lut);
25558d124eaSMaarten Lankhorst
25618f1b5aeSVille Syrjälä if (crtc_state->pre_csc_lut)
25718f1b5aeSVille Syrjälä drm_property_blob_get(crtc_state->pre_csc_lut);
25818f1b5aeSVille Syrjälä if (crtc_state->post_csc_lut)
25918f1b5aeSVille Syrjälä drm_property_blob_get(crtc_state->post_csc_lut);
26018f1b5aeSVille Syrjälä
261df0566a6SJani Nikula crtc_state->update_pipe = false;
262*ccb0934aSVille Syrjälä crtc_state->update_m_n = false;
263df0566a6SJani Nikula crtc_state->disable_lp_wm = false;
264df0566a6SJani Nikula crtc_state->disable_cxsr = false;
265df0566a6SJani Nikula crtc_state->update_wm_pre = false;
266df0566a6SJani Nikula crtc_state->update_wm_post = false;
267df0566a6SJani Nikula crtc_state->fifo_changed = false;
2680ccc42a2SVille Syrjälä crtc_state->preload_luts = false;
269df0566a6SJani Nikula crtc_state->wm.need_postvbl_update = false;
2702e084371SVille Syrjälä crtc_state->do_async_flip = false;
271df0566a6SJani Nikula crtc_state->fb_bits = 0;
272df0566a6SJani Nikula crtc_state->update_planes = 0;
273afeda4f3SAnimesh Manna crtc_state->dsb = NULL;
274df0566a6SJani Nikula
2752225f3c6SMaarten Lankhorst return &crtc_state->uapi;
276df0566a6SJani Nikula }
277df0566a6SJani Nikula
intel_crtc_put_color_blobs(struct intel_crtc_state * crtc_state)27858d124eaSMaarten Lankhorst static void intel_crtc_put_color_blobs(struct intel_crtc_state *crtc_state)
27958d124eaSMaarten Lankhorst {
28058d124eaSMaarten Lankhorst drm_property_blob_put(crtc_state->hw.degamma_lut);
28158d124eaSMaarten Lankhorst drm_property_blob_put(crtc_state->hw.gamma_lut);
28258d124eaSMaarten Lankhorst drm_property_blob_put(crtc_state->hw.ctm);
28318f1b5aeSVille Syrjälä
28418f1b5aeSVille Syrjälä drm_property_blob_put(crtc_state->pre_csc_lut);
28518f1b5aeSVille Syrjälä drm_property_blob_put(crtc_state->post_csc_lut);
28658d124eaSMaarten Lankhorst }
28758d124eaSMaarten Lankhorst
intel_crtc_free_hw_state(struct intel_crtc_state * crtc_state)28858d124eaSMaarten Lankhorst void intel_crtc_free_hw_state(struct intel_crtc_state *crtc_state)
28958d124eaSMaarten Lankhorst {
29058d124eaSMaarten Lankhorst intel_crtc_put_color_blobs(crtc_state);
29158d124eaSMaarten Lankhorst }
29258d124eaSMaarten Lankhorst
293df0566a6SJani Nikula /**
294df0566a6SJani Nikula * intel_crtc_destroy_state - destroy crtc state
295df0566a6SJani Nikula * @crtc: drm crtc
296df0566a6SJani Nikula * @state: the state to destroy
297df0566a6SJani Nikula *
298df0566a6SJani Nikula * Destroys the crtc state (both common and Intel-specific) for the
299df0566a6SJani Nikula * specified crtc.
300df0566a6SJani Nikula */
301df0566a6SJani Nikula void
intel_crtc_destroy_state(struct drm_crtc * crtc,struct drm_crtc_state * state)302df0566a6SJani Nikula intel_crtc_destroy_state(struct drm_crtc *crtc,
303df0566a6SJani Nikula struct drm_crtc_state *state)
304df0566a6SJani Nikula {
3052b808b3aSMaarten Lankhorst struct intel_crtc_state *crtc_state = to_intel_crtc_state(state);
3062b808b3aSMaarten Lankhorst
307afeda4f3SAnimesh Manna drm_WARN_ON(crtc->dev, crtc_state->dsb);
308afeda4f3SAnimesh Manna
3092225f3c6SMaarten Lankhorst __drm_atomic_helper_crtc_destroy_state(&crtc_state->uapi);
31058d124eaSMaarten Lankhorst intel_crtc_free_hw_state(crtc_state);
3112b808b3aSMaarten Lankhorst kfree(crtc_state);
312df0566a6SJani Nikula }
313df0566a6SJani Nikula
314df0566a6SJani Nikula struct drm_atomic_state *
intel_atomic_state_alloc(struct drm_device * dev)315df0566a6SJani Nikula intel_atomic_state_alloc(struct drm_device *dev)
316df0566a6SJani Nikula {
317df0566a6SJani Nikula struct intel_atomic_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
318df0566a6SJani Nikula
319df0566a6SJani Nikula if (!state || drm_atomic_state_init(dev, &state->base) < 0) {
320df0566a6SJani Nikula kfree(state);
321df0566a6SJani Nikula return NULL;
322df0566a6SJani Nikula }
323df0566a6SJani Nikula
324df0566a6SJani Nikula return &state->base;
325df0566a6SJani Nikula }
326df0566a6SJani Nikula
intel_atomic_state_free(struct drm_atomic_state * _state)3275f342993SVille Syrjälä void intel_atomic_state_free(struct drm_atomic_state *_state)
3285f342993SVille Syrjälä {
3295f342993SVille Syrjälä struct intel_atomic_state *state = to_intel_atomic_state(_state);
3305f342993SVille Syrjälä
3315f342993SVille Syrjälä drm_atomic_state_default_release(&state->base);
3320ef1905eSVille Syrjälä kfree(state->global_objs);
3335f342993SVille Syrjälä
3345f342993SVille Syrjälä i915_sw_fence_fini(&state->commit_ready);
3355f342993SVille Syrjälä
3365f342993SVille Syrjälä kfree(state);
3375f342993SVille Syrjälä }
3385f342993SVille Syrjälä
intel_atomic_state_clear(struct drm_atomic_state * s)339df0566a6SJani Nikula void intel_atomic_state_clear(struct drm_atomic_state *s)
340df0566a6SJani Nikula {
341df0566a6SJani Nikula struct intel_atomic_state *state = to_intel_atomic_state(s);
342b4db3a8cSVille Syrjälä
343df0566a6SJani Nikula drm_atomic_state_default_clear(&state->base);
3440ef1905eSVille Syrjälä intel_atomic_clear_global_state(state);
345b4db3a8cSVille Syrjälä
34676ec6927SVille Syrjälä /* state->internal not reset on purpose */
34776ec6927SVille Syrjälä
348df0566a6SJani Nikula state->dpll_set = state->modeset = false;
349df0566a6SJani Nikula }
350df0566a6SJani Nikula
351df0566a6SJani Nikula struct intel_crtc_state *
intel_atomic_get_crtc_state(struct drm_atomic_state * state,struct intel_crtc * crtc)352df0566a6SJani Nikula intel_atomic_get_crtc_state(struct drm_atomic_state *state,
353df0566a6SJani Nikula struct intel_crtc *crtc)
354df0566a6SJani Nikula {
355df0566a6SJani Nikula struct drm_crtc_state *crtc_state;
356df0566a6SJani Nikula crtc_state = drm_atomic_get_crtc_state(state, &crtc->base);
357df0566a6SJani Nikula if (IS_ERR(crtc_state))
358df0566a6SJani Nikula return ERR_CAST(crtc_state);
359df0566a6SJani Nikula
360df0566a6SJani Nikula return to_intel_crtc_state(crtc_state);
361df0566a6SJani Nikula }
362