blob: 07b432f43b98002fab481d55178138a02dbea4dd [file] [log] [blame]
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001/*
2 * Copyright (C) 2014 Red Hat
3 * Copyright (C) 2014 Intel Corp.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors:
24 * Rob Clark <robdclark@gmail.com>
25 * Daniel Vetter <daniel.vetter@ffwll.ch>
26 */
27
28#include <drm/drmP.h>
29#include <drm/drm_atomic.h>
30#include <drm/drm_plane_helper.h>
31#include <drm/drm_crtc_helper.h>
Daniel Vetter623369e2014-09-16 17:50:47 +020032#include <drm/drm_atomic_helper.h>
Daniel Vettere2330f02014-10-29 11:34:56 +010033#include <linux/fence.h>
Daniel Vetterc2fcd272014-11-05 00:14:14 +010034
Marek Szyprowski44d1240d2016-06-13 11:11:26 +020035#include "drm_crtc_internal.h"
36
Daniel Vetter3150c7d2014-11-06 20:53:29 +010037/**
38 * DOC: overview
39 *
40 * This helper library provides implementations of check and commit functions on
41 * top of the CRTC modeset helper callbacks and the plane helper callbacks. It
42 * also provides convenience implementations for the atomic state handling
43 * callbacks for drivers which don't need to subclass the drm core structures to
44 * add their own additional internal state.
45 *
46 * This library also provides default implementations for the check callback in
Daniel Vetter26196f72015-08-25 16:26:03 +020047 * drm_atomic_helper_check() and for the commit callback with
48 * drm_atomic_helper_commit(). But the individual stages and callbacks are
49 * exposed to allow drivers to mix and match and e.g. use the plane helpers only
Daniel Vetter3150c7d2014-11-06 20:53:29 +010050 * together with a driver private modeset implementation.
51 *
52 * This library also provides implementations for all the legacy driver
Daniel Vetter26196f72015-08-25 16:26:03 +020053 * interfaces on top of the atomic interface. See drm_atomic_helper_set_config(),
54 * drm_atomic_helper_disable_plane(), drm_atomic_helper_disable_plane() and the
Daniel Vetter3150c7d2014-11-06 20:53:29 +010055 * various functions to implement set_property callbacks. New drivers must not
56 * implement these functions themselves but must use the provided helpers.
Daniel Vetter092d01d2015-12-04 09:45:44 +010057 *
58 * The atomic helper uses the same function table structures as all other
59 * modesetting helpers. See the documentation for struct &drm_crtc_helper_funcs,
60 * struct &drm_encoder_helper_funcs and struct &drm_connector_helper_funcs. It
61 * also shares the struct &drm_plane_helper_funcs function table with the plane
62 * helpers.
Daniel Vetter3150c7d2014-11-06 20:53:29 +010063 */
Daniel Vetterc2fcd272014-11-05 00:14:14 +010064static void
65drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
66 struct drm_plane_state *plane_state,
67 struct drm_plane *plane)
68{
69 struct drm_crtc_state *crtc_state;
70
71 if (plane->state->crtc) {
Andrzej Hajda2943ef32016-03-15 13:46:00 +010072 crtc_state = drm_atomic_get_existing_crtc_state(state,
73 plane->state->crtc);
Daniel Vetterc2fcd272014-11-05 00:14:14 +010074
75 if (WARN_ON(!crtc_state))
76 return;
77
78 crtc_state->planes_changed = true;
79 }
80
81 if (plane_state->crtc) {
Andrzej Hajda2943ef32016-03-15 13:46:00 +010082 crtc_state = drm_atomic_get_existing_crtc_state(state,
83 plane_state->crtc);
Daniel Vetterc2fcd272014-11-05 00:14:14 +010084
85 if (WARN_ON(!crtc_state))
86 return;
87
88 crtc_state->planes_changed = true;
89 }
90}
91
Maarten Lankhorst8248b652016-03-03 10:17:40 +010092static int handle_conflicting_encoders(struct drm_atomic_state *state,
93 bool disable_conflicting_encoders)
Daniel Vetter97ac3202015-12-03 10:49:14 +010094{
Daniel Vetter97ac3202015-12-03 10:49:14 +010095 struct drm_connector_state *conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +020096 struct drm_connector *connector;
Maarten Lankhorst40616a22016-03-03 10:17:39 +010097 struct drm_encoder *encoder;
98 unsigned encoder_mask = 0;
99 int i, ret;
Daniel Vetter623369e2014-09-16 17:50:47 +0200100
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100101 /*
102 * First loop, find all newly assigned encoders from the connectors
103 * part of the state. If the same encoder is assigned to multiple
104 * connectors bail out.
105 */
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100106 for_each_connector_in_state(state, connector, conn_state, i) {
107 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
108 struct drm_encoder *new_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200109
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100110 if (!conn_state->crtc)
Daniel Vetter623369e2014-09-16 17:50:47 +0200111 continue;
112
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100113 if (funcs->atomic_best_encoder)
114 new_encoder = funcs->atomic_best_encoder(connector, conn_state);
Boris Brezillona0909cc2016-06-01 18:03:37 +0200115 else if (funcs->best_encoder)
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100116 new_encoder = funcs->best_encoder(connector);
Boris Brezillona0909cc2016-06-01 18:03:37 +0200117 else
118 new_encoder = drm_atomic_helper_best_encoder(connector);
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100119
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100120 if (new_encoder) {
121 if (encoder_mask & (1 << drm_encoder_index(new_encoder))) {
122 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
123 new_encoder->base.id, new_encoder->name,
124 connector->base.id, connector->name);
125
126 return -EINVAL;
127 }
128
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100129 encoder_mask |= 1 << drm_encoder_index(new_encoder);
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100130 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200131 }
132
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100133 if (!encoder_mask)
134 return 0;
135
136 /*
137 * Second loop, iterate over all connectors not part of the state.
138 *
139 * If a conflicting encoder is found and disable_conflicting_encoders
140 * is not set, an error is returned. Userspace can provide a solution
141 * through the atomic ioctl.
142 *
143 * If the flag is set conflicting connectors are removed from the crtc
144 * and the crtc is disabled if no encoder is left. This preserves
145 * compatibility with the legacy set_config behavior.
146 */
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100147 drm_for_each_connector(connector, state->dev) {
148 struct drm_crtc_state *crtc_state;
149
150 if (drm_atomic_get_existing_connector_state(state, connector))
151 continue;
152
153 encoder = connector->state->best_encoder;
154 if (!encoder || !(encoder_mask & (1 << drm_encoder_index(encoder))))
155 continue;
156
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100157 if (!disable_conflicting_encoders) {
158 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
159 encoder->base.id, encoder->name,
160 connector->state->crtc->base.id,
161 connector->state->crtc->name,
162 connector->base.id, connector->name);
163 return -EINVAL;
164 }
165
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100166 conn_state = drm_atomic_get_connector_state(state, connector);
167 if (IS_ERR(conn_state))
168 return PTR_ERR(conn_state);
169
170 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
171 encoder->base.id, encoder->name,
172 conn_state->crtc->base.id, conn_state->crtc->name,
173 connector->base.id, connector->name);
174
175 crtc_state = drm_atomic_get_existing_crtc_state(state, conn_state->crtc);
176
177 ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
178 if (ret)
179 return ret;
180
181 if (!crtc_state->connector_mask) {
182 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
183 NULL);
184 if (ret < 0)
185 return ret;
186
187 crtc_state->active = false;
188 }
189 }
190
191 return 0;
Daniel Vetter623369e2014-09-16 17:50:47 +0200192}
193
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100194static void
195set_best_encoder(struct drm_atomic_state *state,
196 struct drm_connector_state *conn_state,
197 struct drm_encoder *encoder)
198{
199 struct drm_crtc_state *crtc_state;
200 struct drm_crtc *crtc;
201
202 if (conn_state->best_encoder) {
203 /* Unset the encoder_mask in the old crtc state. */
204 crtc = conn_state->connector->state->crtc;
205
206 /* A NULL crtc is an error here because we should have
207 * duplicated a NULL best_encoder when crtc was NULL.
208 * As an exception restoring duplicated atomic state
209 * during resume is allowed, so don't warn when
210 * best_encoder is equal to encoder we intend to set.
211 */
212 WARN_ON(!crtc && encoder != conn_state->best_encoder);
213 if (crtc) {
214 crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
215
216 crtc_state->encoder_mask &=
217 ~(1 << drm_encoder_index(conn_state->best_encoder));
218 }
219 }
220
221 if (encoder) {
222 crtc = conn_state->crtc;
223 WARN_ON(!crtc);
224 if (crtc) {
225 crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
226
227 crtc_state->encoder_mask |=
228 1 << drm_encoder_index(encoder);
229 }
230 }
231
232 conn_state->best_encoder = encoder;
233}
234
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100235static void
Daniel Vetter623369e2014-09-16 17:50:47 +0200236steal_encoder(struct drm_atomic_state *state,
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100237 struct drm_encoder *encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +0200238{
Daniel Vetter623369e2014-09-16 17:50:47 +0200239 struct drm_crtc_state *crtc_state;
240 struct drm_connector *connector;
241 struct drm_connector_state *connector_state;
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100242 int i;
Daniel Vetter623369e2014-09-16 17:50:47 +0200243
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100244 for_each_connector_in_state(state, connector, connector_state, i) {
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100245 struct drm_crtc *encoder_crtc;
Daniel Vetter623369e2014-09-16 17:50:47 +0200246
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100247 if (connector_state->best_encoder != encoder)
248 continue;
249
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100250 encoder_crtc = connector->state->crtc;
Daniel Vetter623369e2014-09-16 17:50:47 +0200251
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100252 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
253 encoder->base.id, encoder->name,
254 encoder_crtc->base.id, encoder_crtc->name);
255
Daniel Vetter623369e2014-09-16 17:50:47 +0200256 set_best_encoder(state, connector_state, NULL);
Maarten Lankhorstff19b782016-03-03 10:17:38 +0100257
258 crtc_state = drm_atomic_get_existing_crtc_state(state, encoder_crtc);
259 crtc_state->connectors_changed = true;
260
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100261 return;
Daniel Vetter623369e2014-09-16 17:50:47 +0200262 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200263}
264
265static int
Maarten Lankhorst94595452016-02-24 09:37:29 +0100266update_connector_routing(struct drm_atomic_state *state,
267 struct drm_connector *connector,
268 struct drm_connector_state *connector_state)
Daniel Vetter623369e2014-09-16 17:50:47 +0200269{
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200270 const struct drm_connector_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200271 struct drm_encoder *new_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200272 struct drm_crtc_state *crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200273
Daniel Vetter17a38d92015-02-22 12:24:16 +0100274 DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
275 connector->base.id,
276 connector->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200277
278 if (connector->state->crtc != connector_state->crtc) {
279 if (connector->state->crtc) {
Maarten Lankhorst9b8d1e52016-03-03 10:17:42 +0100280 crtc_state = drm_atomic_get_existing_crtc_state(state, connector->state->crtc);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200281 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200282 }
283
284 if (connector_state->crtc) {
Maarten Lankhorst9b8d1e52016-03-03 10:17:42 +0100285 crtc_state = drm_atomic_get_existing_crtc_state(state, connector_state->crtc);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200286 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200287 }
288 }
289
290 if (!connector_state->crtc) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100291 DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
Daniel Vetter623369e2014-09-16 17:50:47 +0200292 connector->base.id,
293 connector->name);
294
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100295 set_best_encoder(state, connector_state, NULL);
Daniel Vetter623369e2014-09-16 17:50:47 +0200296
297 return 0;
298 }
299
300 funcs = connector->helper_private;
Daniel Vetter3b8a6842015-08-03 17:24:08 +0200301
302 if (funcs->atomic_best_encoder)
303 new_encoder = funcs->atomic_best_encoder(connector,
304 connector_state);
Boris Brezillonc61b93fe2016-06-07 13:47:56 +0200305 else if (funcs->best_encoder)
Daniel Vetter3b8a6842015-08-03 17:24:08 +0200306 new_encoder = funcs->best_encoder(connector);
Boris Brezillonc61b93fe2016-06-07 13:47:56 +0200307 else
308 new_encoder = drm_atomic_helper_best_encoder(connector);
Daniel Vetter623369e2014-09-16 17:50:47 +0200309
310 if (!new_encoder) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100311 DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
312 connector->base.id,
313 connector->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200314 return -EINVAL;
315 }
316
Daniel Vetter5481c8f2015-11-18 18:46:48 +0100317 if (!drm_encoder_crtc_ok(new_encoder, connector_state->crtc)) {
318 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d]\n",
319 new_encoder->base.id,
320 new_encoder->name,
321 connector_state->crtc->base.id);
322 return -EINVAL;
323 }
324
Daniel Vetter623369e2014-09-16 17:50:47 +0200325 if (new_encoder == connector_state->best_encoder) {
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100326 set_best_encoder(state, connector_state, new_encoder);
327
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200328 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
Daniel Vetter17a38d92015-02-22 12:24:16 +0100329 connector->base.id,
330 connector->name,
331 new_encoder->base.id,
332 new_encoder->name,
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200333 connector_state->crtc->base.id,
334 connector_state->crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200335
336 return 0;
337 }
338
Maarten Lankhorstec5aaa52016-03-03 10:17:41 +0100339 steal_encoder(state, new_encoder);
Daniel Vetter623369e2014-09-16 17:50:47 +0200340
Maarten Lankhorste87a52b2016-01-28 15:04:58 +0100341 set_best_encoder(state, connector_state, new_encoder);
342
Maarten Lankhorst9b8d1e52016-03-03 10:17:42 +0100343 crtc_state = drm_atomic_get_existing_crtc_state(state, connector_state->crtc);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200344 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200345
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200346 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
Daniel Vetter17a38d92015-02-22 12:24:16 +0100347 connector->base.id,
348 connector->name,
349 new_encoder->base.id,
350 new_encoder->name,
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200351 connector_state->crtc->base.id,
352 connector_state->crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200353
354 return 0;
355}
356
357static int
358mode_fixup(struct drm_atomic_state *state)
359{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300360 struct drm_crtc *crtc;
Daniel Vetter623369e2014-09-16 17:50:47 +0200361 struct drm_crtc_state *crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300362 struct drm_connector *connector;
Daniel Vetter623369e2014-09-16 17:50:47 +0200363 struct drm_connector_state *conn_state;
364 int i;
365 bool ret;
366
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300367 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200368 if (!crtc_state->mode_changed &&
369 !crtc_state->connectors_changed)
Daniel Vetter623369e2014-09-16 17:50:47 +0200370 continue;
371
372 drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
373 }
374
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300375 for_each_connector_in_state(state, connector, conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200376 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200377 struct drm_encoder *encoder;
378
Daniel Vetter623369e2014-09-16 17:50:47 +0200379 WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
380
381 if (!conn_state->crtc || !conn_state->best_encoder)
382 continue;
383
Andrzej Hajda2943ef32016-03-15 13:46:00 +0100384 crtc_state = drm_atomic_get_existing_crtc_state(state,
385 conn_state->crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +0200386
387 /*
388 * Each encoder has at most one connector (since we always steal
389 * it away), so we won't call ->mode_fixup twice.
390 */
391 encoder = conn_state->best_encoder;
392 funcs = encoder->helper_private;
393
Archit Taneja862e6862015-05-21 11:03:16 +0530394 ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode,
395 &crtc_state->adjusted_mode);
396 if (!ret) {
397 DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
398 return -EINVAL;
Daniel Vetter623369e2014-09-16 17:50:47 +0200399 }
400
Noralf Trønnes28276352016-05-11 18:09:20 +0200401 if (funcs && funcs->atomic_check) {
Thierry Reding4cd4df82014-12-03 16:44:34 +0100402 ret = funcs->atomic_check(encoder, crtc_state,
403 conn_state);
404 if (ret) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100405 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
406 encoder->base.id, encoder->name);
Thierry Reding4cd4df82014-12-03 16:44:34 +0100407 return ret;
408 }
Noralf Trønnes28276352016-05-11 18:09:20 +0200409 } else if (funcs && funcs->mode_fixup) {
Thierry Reding4cd4df82014-12-03 16:44:34 +0100410 ret = funcs->mode_fixup(encoder, &crtc_state->mode,
411 &crtc_state->adjusted_mode);
412 if (!ret) {
Daniel Vetter17a38d92015-02-22 12:24:16 +0100413 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
414 encoder->base.id, encoder->name);
Thierry Reding4cd4df82014-12-03 16:44:34 +0100415 return -EINVAL;
416 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200417 }
418 }
419
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300420 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200421 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200422
Liu Yingf55f1702016-05-27 17:35:54 +0800423 if (!crtc_state->enable)
424 continue;
425
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200426 if (!crtc_state->mode_changed &&
427 !crtc_state->connectors_changed)
Daniel Vetter623369e2014-09-16 17:50:47 +0200428 continue;
429
430 funcs = crtc->helper_private;
Ander Conselvan de Oliveira840bfe92015-04-21 17:13:18 +0300431 if (!funcs->mode_fixup)
432 continue;
433
Daniel Vetter623369e2014-09-16 17:50:47 +0200434 ret = funcs->mode_fixup(crtc, &crtc_state->mode,
435 &crtc_state->adjusted_mode);
436 if (!ret) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200437 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] fixup failed\n",
438 crtc->base.id, crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200439 return -EINVAL;
440 }
441 }
442
443 return 0;
444}
445
Daniel Vetterd9b13622014-11-26 16:57:41 +0100446/**
John Hunterf98bd3e2015-03-17 15:30:26 +0800447 * drm_atomic_helper_check_modeset - validate state object for modeset changes
Daniel Vetterd9b13622014-11-26 16:57:41 +0100448 * @dev: DRM device
449 * @state: the driver state object
450 *
451 * Check the state object to see if the requested state is physically possible.
452 * This does all the crtc and connector related computations for an atomic
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200453 * update and adds any additional connectors needed for full modesets and calls
454 * down into ->mode_fixup functions of the driver backend.
455 *
456 * crtc_state->mode_changed is set when the input mode is changed.
457 * crtc_state->connectors_changed is set when a connector is added or
458 * removed from the crtc.
459 * crtc_state->active_changed is set when crtc_state->active changes,
460 * which is used for dpms.
Brian Starkeyd807ed12016-10-13 10:47:08 +0100461 * See also: drm_atomic_crtc_needs_modeset()
Daniel Vetterd9b13622014-11-26 16:57:41 +0100462 *
463 * IMPORTANT:
464 *
Brian Starkeyd807ed12016-10-13 10:47:08 +0100465 * Drivers which set ->mode_changed (e.g. in their ->atomic_check hooks if a
Daniel Vetterd9b13622014-11-26 16:57:41 +0100466 * plane update can't be done without a full modeset) _must_ call this function
467 * afterwards after that change. It is permitted to call this function multiple
468 * times for the same update, e.g. when the ->atomic_check functions depend upon
469 * the adjusted dotclock for fifo space allocation and watermark computation.
470 *
Daniel Vetterc39032a2016-06-08 14:19:19 +0200471 * RETURNS:
Daniel Vetterd9b13622014-11-26 16:57:41 +0100472 * Zero for success or -errno
473 */
474int
Rob Clark934ce1c2014-11-19 16:41:33 -0500475drm_atomic_helper_check_modeset(struct drm_device *dev,
Daniel Vetter623369e2014-09-16 17:50:47 +0200476 struct drm_atomic_state *state)
477{
Daniel Vetter623369e2014-09-16 17:50:47 +0200478 struct drm_crtc *crtc;
479 struct drm_crtc_state *crtc_state;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300480 struct drm_connector *connector;
481 struct drm_connector_state *connector_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200482 int i, ret;
483
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300484 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Daniel Vetter623369e2014-09-16 17:50:47 +0200485 if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200486 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
487 crtc->base.id, crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200488 crtc_state->mode_changed = true;
489 }
490
491 if (crtc->state->enable != crtc_state->enable) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200492 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enable changed\n",
493 crtc->base.id, crtc->name);
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200494
495 /*
496 * For clarity this assignment is done here, but
497 * enable == 0 is only true when there are no
498 * connectors and a NULL mode.
499 *
500 * The other way around is true as well. enable != 0
501 * iff connectors are attached and a mode is set.
502 */
Daniel Vetter623369e2014-09-16 17:50:47 +0200503 crtc_state->mode_changed = true;
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200504 crtc_state->connectors_changed = true;
Daniel Vetter623369e2014-09-16 17:50:47 +0200505 }
506 }
507
Maarten Lankhorst8248b652016-03-03 10:17:40 +0100508 ret = handle_conflicting_encoders(state, state->legacy_set_config);
509 if (ret)
510 return ret;
Maarten Lankhorst40616a22016-03-03 10:17:39 +0100511
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300512 for_each_connector_in_state(state, connector, connector_state, i) {
Daniel Vetter623369e2014-09-16 17:50:47 +0200513 /*
Brian Starkeyd807ed12016-10-13 10:47:08 +0100514 * This only sets crtc->connectors_changed for routing changes,
515 * drivers must set crtc->connectors_changed themselves when
516 * connector properties need to be updated.
Daniel Vetter623369e2014-09-16 17:50:47 +0200517 */
Maarten Lankhorst94595452016-02-24 09:37:29 +0100518 ret = update_connector_routing(state, connector,
519 connector_state);
Daniel Vetter623369e2014-09-16 17:50:47 +0200520 if (ret)
521 return ret;
522 }
523
524 /*
525 * After all the routing has been prepared we need to add in any
526 * connector which is itself unchanged, but who's crtc changes it's
527 * configuration. This must be done before calling mode_fixup in case a
528 * crtc only changed its mode but has the same set of connectors.
529 */
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300530 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Maarten Lankhorst14de6c42016-01-04 12:53:20 +0100531 bool has_connectors =
532 !!crtc_state->connector_mask;
Daniel Vetter623369e2014-09-16 17:50:47 +0200533
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100534 /*
535 * We must set ->active_changed after walking connectors for
536 * otherwise an update that only changes active would result in
537 * a full modeset because update_connector_routing force that.
538 */
539 if (crtc->state->active != crtc_state->active) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200540 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active changed\n",
541 crtc->base.id, crtc->name);
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100542 crtc_state->active_changed = true;
543 }
544
Daniel Vetter2465ff62015-06-18 09:58:55 +0200545 if (!drm_atomic_crtc_needs_modeset(crtc_state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100546 continue;
547
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200548 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
549 crtc->base.id, crtc->name,
Daniel Vetter17a38d92015-02-22 12:24:16 +0100550 crtc_state->enable ? 'y' : 'n',
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200551 crtc_state->active ? 'y' : 'n');
Daniel Vetter623369e2014-09-16 17:50:47 +0200552
553 ret = drm_atomic_add_affected_connectors(state, crtc);
554 if (ret != 0)
555 return ret;
556
Maarten Lankhorst57744aa2015-05-19 16:41:03 +0200557 ret = drm_atomic_add_affected_planes(state, crtc);
558 if (ret != 0)
559 return ret;
560
Maarten Lankhorst14de6c42016-01-04 12:53:20 +0100561 if (crtc_state->enable != has_connectors) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200562 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled/connectors mismatch\n",
563 crtc->base.id, crtc->name);
Daniel Vetter623369e2014-09-16 17:50:47 +0200564
565 return -EINVAL;
566 }
567 }
568
569 return mode_fixup(state);
570}
Daniel Vetterd9b13622014-11-26 16:57:41 +0100571EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
Daniel Vetter623369e2014-09-16 17:50:47 +0200572
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100573/**
John Hunterf98bd3e2015-03-17 15:30:26 +0800574 * drm_atomic_helper_check_planes - validate state object for planes changes
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100575 * @dev: DRM device
576 * @state: the driver state object
577 *
578 * Check the state object to see if the requested state is physically possible.
Daniel Vetterd9b13622014-11-26 16:57:41 +0100579 * This does all the plane update related checks using by calling into the
580 * ->atomic_check hooks provided by the driver.
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100581 *
Maarten Lankhorstfc596662015-07-21 13:28:57 +0200582 * It also sets crtc_state->planes_changed to indicate that a crtc has
583 * updated planes.
584 *
Daniel Vetterc39032a2016-06-08 14:19:19 +0200585 * RETURNS:
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100586 * Zero for success or -errno
587 */
Daniel Vetterd9b13622014-11-26 16:57:41 +0100588int
589drm_atomic_helper_check_planes(struct drm_device *dev,
590 struct drm_atomic_state *state)
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100591{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300592 struct drm_crtc *crtc;
593 struct drm_crtc_state *crtc_state;
594 struct drm_plane *plane;
595 struct drm_plane_state *plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100596 int i, ret = 0;
597
Daniel Vetter52a9fcd2016-08-12 22:48:51 +0200598 ret = drm_atomic_normalize_zpos(dev, state);
Marek Szyprowski44d1240d2016-06-13 11:11:26 +0200599 if (ret)
600 return ret;
601
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300602 for_each_plane_in_state(state, plane, plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200603 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100604
605 funcs = plane->helper_private;
606
607 drm_atomic_helper_plane_changed(state, plane_state, plane);
608
609 if (!funcs || !funcs->atomic_check)
610 continue;
611
612 ret = funcs->atomic_check(plane, plane_state);
613 if (ret) {
Ville Syrjälä9f4c97a2015-12-08 18:41:54 +0200614 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
615 plane->base.id, plane->name);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100616 return ret;
617 }
618 }
619
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300620 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200621 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100622
623 funcs = crtc->helper_private;
624
625 if (!funcs || !funcs->atomic_check)
626 continue;
627
Daniel Vetterbe9174a2016-06-02 00:06:24 +0200628 ret = funcs->atomic_check(crtc, crtc_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100629 if (ret) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200630 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
631 crtc->base.id, crtc->name);
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100632 return ret;
633 }
634 }
635
Daniel Vetterd9b13622014-11-26 16:57:41 +0100636 return ret;
637}
638EXPORT_SYMBOL(drm_atomic_helper_check_planes);
639
640/**
641 * drm_atomic_helper_check - validate state object
642 * @dev: DRM device
643 * @state: the driver state object
644 *
645 * Check the state object to see if the requested state is physically possible.
646 * Only crtcs and planes have check callbacks, so for any additional (global)
647 * checking that a driver needs it can simply wrap that around this function.
648 * Drivers without such needs can directly use this as their ->atomic_check()
649 * callback.
650 *
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100651 * This just wraps the two parts of the state checking for planes and modeset
652 * state in the default order: First it calls drm_atomic_helper_check_modeset()
653 * and then drm_atomic_helper_check_planes(). The assumption is that the
654 * ->atomic_check functions depend upon an updated adjusted_mode.clock to
655 * e.g. properly compute watermarks.
656 *
Daniel Vetterc39032a2016-06-08 14:19:19 +0200657 * RETURNS:
Daniel Vetterd9b13622014-11-26 16:57:41 +0100658 * Zero for success or -errno
659 */
660int drm_atomic_helper_check(struct drm_device *dev,
661 struct drm_atomic_state *state)
662{
663 int ret;
664
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100665 ret = drm_atomic_helper_check_modeset(dev, state);
Daniel Vetterd9b13622014-11-26 16:57:41 +0100666 if (ret)
667 return ret;
668
Daniel Vetterb4274fb2014-11-26 17:02:18 +0100669 ret = drm_atomic_helper_check_planes(dev, state);
Rob Clark934ce1c2014-11-19 16:41:33 -0500670 if (ret)
671 return ret;
672
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100673 return ret;
674}
675EXPORT_SYMBOL(drm_atomic_helper_check);
676
Daniel Vetter623369e2014-09-16 17:50:47 +0200677static void
678disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
679{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300680 struct drm_connector *connector;
681 struct drm_connector_state *old_conn_state;
682 struct drm_crtc *crtc;
683 struct drm_crtc_state *old_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200684 int i;
685
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300686 for_each_connector_in_state(old_state, connector, old_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200687 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200688 struct drm_encoder *encoder;
689
Daniel Vetter623369e2014-09-16 17:50:47 +0200690 /* Shut down everything that's in the changeset and currently
691 * still on. So need to check the old, saved state. */
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300692 if (!old_conn_state->crtc)
Daniel Vetter623369e2014-09-16 17:50:47 +0200693 continue;
694
Andrzej Hajda2943ef32016-03-15 13:46:00 +0100695 old_crtc_state = drm_atomic_get_existing_crtc_state(old_state,
696 old_conn_state->crtc);
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100697
Daniel Vetter4218a322015-03-26 22:18:40 +0100698 if (!old_crtc_state->active ||
Daniel Vetter2465ff62015-06-18 09:58:55 +0200699 !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100700 continue;
701
Rob Clark46df9ad2014-11-20 15:40:36 -0500702 encoder = old_conn_state->best_encoder;
Daniel Vetter623369e2014-09-16 17:50:47 +0200703
Rob Clark46df9ad2014-11-20 15:40:36 -0500704 /* We shouldn't get this far if we didn't previously have
705 * an encoder.. but WARN_ON() rather than explode.
706 */
707 if (WARN_ON(!encoder))
Daniel Vetter623369e2014-09-16 17:50:47 +0200708 continue;
709
710 funcs = encoder->helper_private;
711
Daniel Vetter17a38d92015-02-22 12:24:16 +0100712 DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
713 encoder->base.id, encoder->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100714
Daniel Vetter623369e2014-09-16 17:50:47 +0200715 /*
716 * Each encoder has at most one connector (since we always steal
John Hunterf98bd3e2015-03-17 15:30:26 +0800717 * it away), so we won't call disable hooks twice.
Daniel Vetter623369e2014-09-16 17:50:47 +0200718 */
Archit Taneja862e6862015-05-21 11:03:16 +0530719 drm_bridge_disable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +0200720
721 /* Right function depends upon target state. */
Noralf Trønnes28276352016-05-11 18:09:20 +0200722 if (funcs) {
723 if (connector->state->crtc && funcs->prepare)
724 funcs->prepare(encoder);
725 else if (funcs->disable)
726 funcs->disable(encoder);
727 else if (funcs->dpms)
728 funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
729 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200730
Archit Taneja862e6862015-05-21 11:03:16 +0530731 drm_bridge_post_disable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +0200732 }
733
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300734 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200735 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200736
737 /* Shut down everything that needs a full modeset. */
Daniel Vetter2465ff62015-06-18 09:58:55 +0200738 if (!drm_atomic_crtc_needs_modeset(crtc->state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100739 continue;
740
741 if (!old_crtc_state->active)
Daniel Vetter623369e2014-09-16 17:50:47 +0200742 continue;
743
744 funcs = crtc->helper_private;
745
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200746 DRM_DEBUG_ATOMIC("disabling [CRTC:%d:%s]\n",
747 crtc->base.id, crtc->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100748
749
Daniel Vetter623369e2014-09-16 17:50:47 +0200750 /* Right function depends upon target state. */
Daniel Vetteree0a89c2015-01-22 16:36:24 +0100751 if (crtc->state->enable && funcs->prepare)
Daniel Vetter623369e2014-09-16 17:50:47 +0200752 funcs->prepare(crtc);
Liu Yingc9ac8b42016-08-26 15:30:38 +0800753 else if (funcs->atomic_disable)
754 funcs->atomic_disable(crtc, old_crtc_state);
Daniel Vetter623369e2014-09-16 17:50:47 +0200755 else if (funcs->disable)
756 funcs->disable(crtc);
757 else
758 funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
759 }
760}
761
Daniel Vetter4c18d302015-05-12 15:27:37 +0200762/**
763 * drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state
764 * @dev: DRM device
765 * @old_state: atomic state object with old state structures
766 *
767 * This function updates all the various legacy modeset state pointers in
768 * connectors, encoders and crtcs. It also updates the timestamping constants
769 * used for precise vblank timestamps by calling
770 * drm_calc_timestamping_constants().
771 *
772 * Drivers can use this for building their own atomic commit if they don't have
773 * a pure helper-based modeset implementation.
774 */
775void
776drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
777 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +0200778{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300779 struct drm_connector *connector;
780 struct drm_connector_state *old_conn_state;
781 struct drm_crtc *crtc;
782 struct drm_crtc_state *old_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200783 int i;
784
Maarten Lankhorst8c103422015-07-27 13:24:29 +0200785 /* clear out existing links and update dpms */
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300786 for_each_connector_in_state(old_state, connector, old_conn_state, i) {
Maarten Lankhorst8c103422015-07-27 13:24:29 +0200787 if (connector->encoder) {
788 WARN_ON(!connector->encoder->crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +0200789
Maarten Lankhorst8c103422015-07-27 13:24:29 +0200790 connector->encoder->crtc = NULL;
791 connector->encoder = NULL;
792 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200793
Maarten Lankhorst8c103422015-07-27 13:24:29 +0200794 crtc = connector->state->crtc;
795 if ((!crtc && old_conn_state->crtc) ||
796 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
797 struct drm_property *dpms_prop =
798 dev->mode_config.dpms_property;
799 int mode = DRM_MODE_DPMS_OFF;
800
801 if (crtc && crtc->state->active)
802 mode = DRM_MODE_DPMS_ON;
803
804 connector->dpms = mode;
805 drm_object_property_set_value(&connector->base,
806 dpms_prop, mode);
807 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200808 }
809
810 /* set new links */
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300811 for_each_connector_in_state(old_state, connector, old_conn_state, i) {
812 if (!connector->state->crtc)
Daniel Vetter623369e2014-09-16 17:50:47 +0200813 continue;
814
815 if (WARN_ON(!connector->state->best_encoder))
816 continue;
817
818 connector->encoder = connector->state->best_encoder;
819 connector->encoder->crtc = connector->state->crtc;
820 }
821
822 /* set legacy state in the crtc structure */
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300823 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Maarten Lankhorst26608012015-07-16 15:51:01 +0200824 struct drm_plane *primary = crtc->primary;
825
Daniel Vetter623369e2014-09-16 17:50:47 +0200826 crtc->mode = crtc->state->mode;
827 crtc->enabled = crtc->state->enable;
Maarten Lankhorst26608012015-07-16 15:51:01 +0200828
829 if (drm_atomic_get_existing_plane_state(old_state, primary) &&
830 primary->state->crtc == crtc) {
831 crtc->x = primary->state->src_x >> 16;
832 crtc->y = primary->state->src_y >> 16;
833 }
Daniel Vetter3d51d2d2015-05-12 15:21:06 +0200834
835 if (crtc->state->enable)
836 drm_calc_timestamping_constants(crtc,
837 &crtc->state->adjusted_mode);
Daniel Vetter623369e2014-09-16 17:50:47 +0200838 }
839}
Daniel Vetter4c18d302015-05-12 15:27:37 +0200840EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
Daniel Vetter623369e2014-09-16 17:50:47 +0200841
842static void
843crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
844{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300845 struct drm_crtc *crtc;
846 struct drm_crtc_state *old_crtc_state;
847 struct drm_connector *connector;
848 struct drm_connector_state *old_conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200849 int i;
850
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300851 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200852 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200853
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300854 if (!crtc->state->mode_changed)
Daniel Vetter623369e2014-09-16 17:50:47 +0200855 continue;
856
857 funcs = crtc->helper_private;
858
Daniel Vetterc982bd92015-02-22 12:24:20 +0100859 if (crtc->state->enable && funcs->mode_set_nofb) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200860 DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
861 crtc->base.id, crtc->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100862
Daniel Vetter623369e2014-09-16 17:50:47 +0200863 funcs->mode_set_nofb(crtc);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100864 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200865 }
866
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300867 for_each_connector_in_state(old_state, connector, old_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200868 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200869 struct drm_crtc_state *new_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200870 struct drm_encoder *encoder;
871 struct drm_display_mode *mode, *adjusted_mode;
872
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300873 if (!connector->state->best_encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +0200874 continue;
875
876 encoder = connector->state->best_encoder;
877 funcs = encoder->helper_private;
878 new_crtc_state = connector->state->crtc->state;
879 mode = &new_crtc_state->mode;
880 adjusted_mode = &new_crtc_state->adjusted_mode;
881
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100882 if (!new_crtc_state->mode_changed)
883 continue;
884
Daniel Vetter17a38d92015-02-22 12:24:16 +0100885 DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
886 encoder->base.id, encoder->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100887
Daniel Vetter623369e2014-09-16 17:50:47 +0200888 /*
889 * Each encoder has at most one connector (since we always steal
John Hunterf98bd3e2015-03-17 15:30:26 +0800890 * it away), so we won't call mode_set hooks twice.
Daniel Vetter623369e2014-09-16 17:50:47 +0200891 */
Philipp Zabelfe4a11c2016-07-22 12:20:47 +0200892 if (funcs && funcs->atomic_mode_set) {
893 funcs->atomic_mode_set(encoder, new_crtc_state,
894 connector->state);
895 } else if (funcs && funcs->mode_set) {
Daniel Vetterc982bd92015-02-22 12:24:20 +0100896 funcs->mode_set(encoder, mode, adjusted_mode);
Philipp Zabelfe4a11c2016-07-22 12:20:47 +0200897 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200898
Archit Taneja862e6862015-05-21 11:03:16 +0530899 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
Daniel Vetter623369e2014-09-16 17:50:47 +0200900 }
901}
902
903/**
Daniel Vetter1af434a2015-02-22 12:24:19 +0100904 * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
Daniel Vetter623369e2014-09-16 17:50:47 +0200905 * @dev: DRM device
Laurent Pincharta072f802015-02-22 12:24:18 +0100906 * @old_state: atomic state object with old state structures
Daniel Vetter623369e2014-09-16 17:50:47 +0200907 *
Daniel Vetter1af434a2015-02-22 12:24:19 +0100908 * This function shuts down all the outputs that need to be shut down and
Daniel Vetter623369e2014-09-16 17:50:47 +0200909 * prepares them (if required) with the new mode.
Daniel Vetter1af434a2015-02-22 12:24:19 +0100910 *
Laurent Pinchart60acc4e2015-05-27 15:05:42 +0300911 * For compatibility with legacy crtc helpers this should be called before
Daniel Vetter1af434a2015-02-22 12:24:19 +0100912 * drm_atomic_helper_commit_planes(), which is what the default commit function
913 * does. But drivers with different needs can group the modeset commits together
914 * and do the plane commits at the end. This is useful for drivers doing runtime
915 * PM since planes updates then only happen when the CRTC is actually enabled.
Daniel Vetter623369e2014-09-16 17:50:47 +0200916 */
Daniel Vetter1af434a2015-02-22 12:24:19 +0100917void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
918 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +0200919{
Laurent Pincharta072f802015-02-22 12:24:18 +0100920 disable_outputs(dev, old_state);
Daniel Vetter4c18d302015-05-12 15:27:37 +0200921
922 drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
923
Laurent Pincharta072f802015-02-22 12:24:18 +0100924 crtc_set_mode(dev, old_state);
Daniel Vetter623369e2014-09-16 17:50:47 +0200925}
Daniel Vetter1af434a2015-02-22 12:24:19 +0100926EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
Daniel Vetter623369e2014-09-16 17:50:47 +0200927
928/**
Daniel Vetter1af434a2015-02-22 12:24:19 +0100929 * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
Daniel Vetter623369e2014-09-16 17:50:47 +0200930 * @dev: DRM device
931 * @old_state: atomic state object with old state structures
932 *
Daniel Vetter1af434a2015-02-22 12:24:19 +0100933 * This function enables all the outputs with the new configuration which had to
934 * be turned off for the update.
935 *
Laurent Pinchart60acc4e2015-05-27 15:05:42 +0300936 * For compatibility with legacy crtc helpers this should be called after
Daniel Vetter1af434a2015-02-22 12:24:19 +0100937 * drm_atomic_helper_commit_planes(), which is what the default commit function
938 * does. But drivers with different needs can group the modeset commits together
939 * and do the plane commits at the end. This is useful for drivers doing runtime
940 * PM since planes updates then only happen when the CRTC is actually enabled.
Daniel Vetter623369e2014-09-16 17:50:47 +0200941 */
Daniel Vetter1af434a2015-02-22 12:24:19 +0100942void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
943 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +0200944{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300945 struct drm_crtc *crtc;
946 struct drm_crtc_state *old_crtc_state;
947 struct drm_connector *connector;
948 struct drm_connector_state *old_conn_state;
Daniel Vetter623369e2014-09-16 17:50:47 +0200949 int i;
950
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300951 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200952 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200953
954 /* Need to filter out CRTCs where only planes change. */
Daniel Vetter2465ff62015-06-18 09:58:55 +0200955 if (!drm_atomic_crtc_needs_modeset(crtc->state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100956 continue;
957
958 if (!crtc->state->active)
Daniel Vetter623369e2014-09-16 17:50:47 +0200959 continue;
960
961 funcs = crtc->helper_private;
962
Daniel Vetteree0a89c2015-01-22 16:36:24 +0100963 if (crtc->state->enable) {
Ville Syrjäläfa3ab4c2015-12-08 18:41:53 +0200964 DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
965 crtc->base.id, crtc->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100966
Daniel Vetteree0a89c2015-01-22 16:36:24 +0100967 if (funcs->enable)
968 funcs->enable(crtc);
969 else
970 funcs->commit(crtc);
971 }
Daniel Vetter623369e2014-09-16 17:50:47 +0200972 }
973
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300974 for_each_connector_in_state(old_state, connector, old_conn_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +0200975 const struct drm_encoder_helper_funcs *funcs;
Daniel Vetter623369e2014-09-16 17:50:47 +0200976 struct drm_encoder *encoder;
977
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +0300978 if (!connector->state->best_encoder)
Daniel Vetter623369e2014-09-16 17:50:47 +0200979 continue;
980
Daniel Vetter4218a322015-03-26 22:18:40 +0100981 if (!connector->state->crtc->state->active ||
Daniel Vetter2465ff62015-06-18 09:58:55 +0200982 !drm_atomic_crtc_needs_modeset(connector->state->crtc->state))
Daniel Vettereab3bbe2015-01-22 16:36:21 +0100983 continue;
984
Daniel Vetter623369e2014-09-16 17:50:47 +0200985 encoder = connector->state->best_encoder;
986 funcs = encoder->helper_private;
987
Daniel Vetter17a38d92015-02-22 12:24:16 +0100988 DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
989 encoder->base.id, encoder->name);
Daniel Vetter95d6eb32015-01-22 16:36:25 +0100990
Daniel Vetter623369e2014-09-16 17:50:47 +0200991 /*
992 * Each encoder has at most one connector (since we always steal
John Hunterf98bd3e2015-03-17 15:30:26 +0800993 * it away), so we won't call enable hooks twice.
Daniel Vetter623369e2014-09-16 17:50:47 +0200994 */
Archit Taneja862e6862015-05-21 11:03:16 +0530995 drm_bridge_pre_enable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +0200996
Noralf Trønnes28276352016-05-11 18:09:20 +0200997 if (funcs) {
998 if (funcs->enable)
999 funcs->enable(encoder);
1000 else if (funcs->commit)
1001 funcs->commit(encoder);
1002 }
Daniel Vetter623369e2014-09-16 17:50:47 +02001003
Archit Taneja862e6862015-05-21 11:03:16 +05301004 drm_bridge_enable(encoder->bridge);
Daniel Vetter623369e2014-09-16 17:50:47 +02001005 }
1006}
Daniel Vetter1af434a2015-02-22 12:24:19 +01001007EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
Daniel Vetter623369e2014-09-16 17:50:47 +02001008
Rob Clark4c5b7f32016-03-18 19:14:55 -04001009/**
1010 * drm_atomic_helper_wait_for_fences - wait for fences stashed in plane state
1011 * @dev: DRM device
1012 * @state: atomic state object with old state structures
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001013 * @pre_swap: if true, do an interruptible wait
Rob Clark4c5b7f32016-03-18 19:14:55 -04001014 *
1015 * For implicit sync, driver should fish the exclusive fence out from the
1016 * incoming fb's and stash it in the drm_plane_state. This is called after
1017 * drm_atomic_helper_swap_state() so it uses the current plane state (and
1018 * just uses the atomic state to find the changed planes)
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001019 *
1020 * Returns zero if success or < 0 if fence_wait() fails.
Rob Clark4c5b7f32016-03-18 19:14:55 -04001021 */
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001022int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
1023 struct drm_atomic_state *state,
1024 bool pre_swap)
Daniel Vettere2330f02014-10-29 11:34:56 +01001025{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001026 struct drm_plane *plane;
1027 struct drm_plane_state *plane_state;
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001028 int i, ret;
Daniel Vettere2330f02014-10-29 11:34:56 +01001029
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001030 for_each_plane_in_state(state, plane, plane_state, i) {
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001031 if (!pre_swap)
1032 plane_state = plane->state;
1033
1034 if (!plane_state->fence)
Daniel Vettere2330f02014-10-29 11:34:56 +01001035 continue;
1036
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001037 WARN_ON(!plane_state->fb);
Daniel Vettere2330f02014-10-29 11:34:56 +01001038
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001039 /*
1040 * If waiting for fences pre-swap (ie: nonblock), userspace can
1041 * still interrupt the operation. Instead of blocking until the
1042 * timer expires, make the wait interruptible.
1043 */
1044 ret = fence_wait(plane_state->fence, pre_swap);
1045 if (ret)
1046 return ret;
1047
1048 fence_put(plane_state->fence);
1049 plane_state->fence = NULL;
Daniel Vettere2330f02014-10-29 11:34:56 +01001050 }
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001051
1052 return 0;
Daniel Vettere2330f02014-10-29 11:34:56 +01001053}
Rob Clark4c5b7f32016-03-18 19:14:55 -04001054EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
Daniel Vettere2330f02014-10-29 11:34:56 +01001055
John Keepingc2409062016-01-19 10:46:58 +00001056/**
1057 * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
1058 * @dev: DRM device
1059 * @old_state: atomic state object with old state structures
1060 * @crtc: DRM crtc
1061 *
1062 * Checks whether the framebuffer used for this CRTC changes as a result of
1063 * the atomic update. This is useful for drivers which cannot use
1064 * drm_atomic_helper_wait_for_vblanks() and need to reimplement its
1065 * functionality.
1066 *
1067 * Returns:
1068 * true if the framebuffer changed.
1069 */
1070bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
1071 struct drm_atomic_state *old_state,
1072 struct drm_crtc *crtc)
Daniel Vetterab58e332014-11-24 20:42:42 +01001073{
1074 struct drm_plane *plane;
1075 struct drm_plane_state *old_plane_state;
Daniel Vetterab58e332014-11-24 20:42:42 +01001076 int i;
1077
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001078 for_each_plane_in_state(old_state, plane, old_plane_state, i) {
Daniel Vetterab58e332014-11-24 20:42:42 +01001079 if (plane->state->crtc != crtc &&
1080 old_plane_state->crtc != crtc)
1081 continue;
1082
1083 if (plane->state->fb != old_plane_state->fb)
1084 return true;
1085 }
1086
1087 return false;
1088}
John Keepingc2409062016-01-19 10:46:58 +00001089EXPORT_SYMBOL(drm_atomic_helper_framebuffer_changed);
Daniel Vetterab58e332014-11-24 20:42:42 +01001090
Rob Clark5ee32292014-11-11 19:38:59 -05001091/**
1092 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
1093 * @dev: DRM device
1094 * @old_state: atomic state object with old state structures
1095 *
1096 * Helper to, after atomic commit, wait for vblanks on all effected
1097 * crtcs (ie. before cleaning up old framebuffers using
Daniel Vetterab58e332014-11-24 20:42:42 +01001098 * drm_atomic_helper_cleanup_planes()). It will only wait on crtcs where the
1099 * framebuffers have actually changed to optimize for the legacy cursor and
1100 * plane update use-case.
Rob Clark5ee32292014-11-11 19:38:59 -05001101 */
1102void
1103drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
1104 struct drm_atomic_state *old_state)
Daniel Vetter623369e2014-09-16 17:50:47 +02001105{
1106 struct drm_crtc *crtc;
1107 struct drm_crtc_state *old_crtc_state;
Daniel Vetter623369e2014-09-16 17:50:47 +02001108 int i, ret;
1109
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001110 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Daniel Vetter623369e2014-09-16 17:50:47 +02001111 /* No one cares about the old state, so abuse it for tracking
1112 * and store whether we hold a vblank reference (and should do a
1113 * vblank wait) in the ->enable boolean. */
1114 old_crtc_state->enable = false;
1115
1116 if (!crtc->state->enable)
1117 continue;
1118
Daniel Vetterf02ad902015-01-22 16:36:23 +01001119 /* Legacy cursor ioctls are completely unsynced, and userspace
1120 * relies on that (by doing tons of cursor updates). */
1121 if (old_state->legacy_cursor_update)
1122 continue;
1123
John Keepingc2409062016-01-19 10:46:58 +00001124 if (!drm_atomic_helper_framebuffer_changed(dev,
1125 old_state, crtc))
Daniel Vetterab58e332014-11-24 20:42:42 +01001126 continue;
1127
Daniel Vetter623369e2014-09-16 17:50:47 +02001128 ret = drm_crtc_vblank_get(crtc);
1129 if (ret != 0)
1130 continue;
1131
1132 old_crtc_state->enable = true;
Thierry Redingd4853632015-08-12 17:00:35 +02001133 old_crtc_state->last_vblank_count = drm_crtc_vblank_count(crtc);
Daniel Vetter623369e2014-09-16 17:50:47 +02001134 }
1135
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001136 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1137 if (!old_crtc_state->enable)
Daniel Vetter623369e2014-09-16 17:50:47 +02001138 continue;
1139
1140 ret = wait_event_timeout(dev->vblank[i].queue,
1141 old_crtc_state->last_vblank_count !=
Thierry Redingd4853632015-08-12 17:00:35 +02001142 drm_crtc_vblank_count(crtc),
Daniel Vetter623369e2014-09-16 17:50:47 +02001143 msecs_to_jiffies(50));
1144
Ville Syrjälä8d4d0d72016-04-18 14:29:33 +03001145 WARN(!ret, "[CRTC:%d] vblank wait timed out\n", crtc->base.id);
1146
Daniel Vetter623369e2014-09-16 17:50:47 +02001147 drm_crtc_vblank_put(crtc);
1148 }
1149}
Rob Clark5ee32292014-11-11 19:38:59 -05001150EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
Daniel Vetter623369e2014-09-16 17:50:47 +02001151
1152/**
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001153 * drm_atomic_helper_commit_tail - commit atomic update to hardware
1154 * @state: new modeset state to be committed
Daniel Vetter623369e2014-09-16 17:50:47 +02001155 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001156 * This is the default implemenation for the ->atomic_commit_tail() hook of the
1157 * &drm_mode_config_helper_funcs vtable.
Daniel Vetter623369e2014-09-16 17:50:47 +02001158 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001159 * Note that the default ordering of how the various stages are called is to
1160 * match the legacy modeset helper library closest. One peculiarity of that is
1161 * that it doesn't mesh well with runtime PM at all.
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001162 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001163 * For drivers supporting runtime PM the recommended sequence is instead ::
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001164 *
1165 * drm_atomic_helper_commit_modeset_disables(dev, state);
1166 *
1167 * drm_atomic_helper_commit_modeset_enables(dev, state);
1168 *
Liu Ying2b58e982016-08-29 17:12:03 +08001169 * drm_atomic_helper_commit_planes(dev, state,
1170 * DRM_PLANE_COMMIT_ACTIVE_ONLY);
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001171 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001172 * for committing the atomic update to hardware. See the kerneldoc entries for
1173 * these three functions for more details.
1174 */
1175void drm_atomic_helper_commit_tail(struct drm_atomic_state *state)
1176{
1177 struct drm_device *dev = state->dev;
1178
1179 drm_atomic_helper_commit_modeset_disables(dev, state);
1180
Liu Ying2b58e982016-08-29 17:12:03 +08001181 drm_atomic_helper_commit_planes(dev, state, 0);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001182
1183 drm_atomic_helper_commit_modeset_enables(dev, state);
1184
1185 drm_atomic_helper_commit_hw_done(state);
1186
1187 drm_atomic_helper_wait_for_vblanks(dev, state);
1188
1189 drm_atomic_helper_cleanup_planes(dev, state);
1190}
1191EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
1192
1193static void commit_tail(struct drm_atomic_state *state)
1194{
1195 struct drm_device *dev = state->dev;
1196 struct drm_mode_config_helper_funcs *funcs;
1197
1198 funcs = dev->mode_config.helper_private;
1199
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001200 drm_atomic_helper_wait_for_fences(dev, state, false);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001201
1202 drm_atomic_helper_wait_for_dependencies(state);
1203
1204 if (funcs && funcs->atomic_commit_tail)
1205 funcs->atomic_commit_tail(state);
1206 else
1207 drm_atomic_helper_commit_tail(state);
1208
1209 drm_atomic_helper_commit_cleanup_done(state);
1210
Chris Wilson08536952016-10-14 13:18:18 +01001211 drm_atomic_state_put(state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001212}
1213
1214static void commit_work(struct work_struct *work)
1215{
1216 struct drm_atomic_state *state = container_of(work,
1217 struct drm_atomic_state,
1218 commit_work);
1219 commit_tail(state);
1220}
1221
1222/**
1223 * drm_atomic_helper_commit - commit validated state object
1224 * @dev: DRM device
1225 * @state: the driver state object
1226 * @nonblock: whether nonblocking behavior is requested.
1227 *
1228 * This function commits a with drm_atomic_helper_check() pre-validated state
1229 * object. This can still fail when e.g. the framebuffer reservation fails. This
1230 * function implements nonblocking commits, using
1231 * drm_atomic_helper_setup_commit() and related functions.
1232 *
1233 * Note that right now this function does not support nonblocking commits, hence
1234 * driver writers must implement their own version for now.
1235 *
1236 * Committing the actual hardware state is done through the
1237 * ->atomic_commit_tail() callback of the &drm_mode_config_helper_funcs vtable,
1238 * or it's default implementation drm_atomic_helper_commit_tail().
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001239 *
Daniel Vetterc39032a2016-06-08 14:19:19 +02001240 * RETURNS:
Daniel Vetter623369e2014-09-16 17:50:47 +02001241 * Zero for success or -errno.
1242 */
1243int drm_atomic_helper_commit(struct drm_device *dev,
1244 struct drm_atomic_state *state,
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001245 bool nonblock)
Daniel Vetter623369e2014-09-16 17:50:47 +02001246{
1247 int ret;
1248
Daniel Vettera095caa2016-06-08 17:15:36 +02001249 ret = drm_atomic_helper_setup_commit(state, nonblock);
1250 if (ret)
1251 return ret;
1252
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001253 INIT_WORK(&state->commit_work, commit_work);
1254
Daniel Vetter623369e2014-09-16 17:50:47 +02001255 ret = drm_atomic_helper_prepare_planes(dev, state);
1256 if (ret)
1257 return ret;
1258
Gustavo Padovanf6ce4102016-09-12 16:08:11 -03001259 if (!nonblock) {
1260 ret = drm_atomic_helper_wait_for_fences(dev, state, true);
1261 if (ret)
1262 return ret;
1263 }
1264
Daniel Vetter623369e2014-09-16 17:50:47 +02001265 /*
1266 * This is the point of no return - everything below never fails except
1267 * when the hw goes bonghits. Which means we can commit the new state on
1268 * the software side now.
1269 */
1270
Daniel Vetter5e84c262016-06-10 00:06:32 +02001271 drm_atomic_helper_swap_state(state, true);
Daniel Vetter623369e2014-09-16 17:50:47 +02001272
1273 /*
1274 * Everything below can be run asynchronously without the need to grab
John Hunterf98bd3e2015-03-17 15:30:26 +08001275 * any modeset locks at all under one condition: It must be guaranteed
Daniel Vetter623369e2014-09-16 17:50:47 +02001276 * that the asynchronous work has either been cancelled (if the driver
1277 * supports it, which at least requires that the framebuffers get
1278 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
1279 * before the new state gets committed on the software side with
1280 * drm_atomic_helper_swap_state().
1281 *
1282 * This scheme allows new atomic state updates to be prepared and
1283 * checked in parallel to the asynchronous completion of the previous
1284 * update. Which is important since compositors need to figure out the
1285 * composition of the next frame right after having submitted the
1286 * current layout.
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001287 *
1288 * NOTE: Commit work has multiple phases, first hardware commit, then
1289 * cleanup. We want them to overlap, hence need system_unbound_wq to
1290 * make sure work items don't artifically stall on each another.
Daniel Vetter623369e2014-09-16 17:50:47 +02001291 */
1292
Chris Wilson08536952016-10-14 13:18:18 +01001293 drm_atomic_state_get(state);
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001294 if (nonblock)
1295 queue_work(system_unbound_wq, &state->commit_work);
1296 else
1297 commit_tail(state);
Daniel Vetter623369e2014-09-16 17:50:47 +02001298
1299 return 0;
1300}
1301EXPORT_SYMBOL(drm_atomic_helper_commit);
1302
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001303/**
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001304 * DOC: implementing nonblocking commit
Daniel Vettere8c833a2014-07-27 18:30:19 +02001305 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001306 * Nonblocking atomic commits have to be implemented in the following sequence:
Daniel Vettere8c833a2014-07-27 18:30:19 +02001307 *
1308 * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
1309 * which commit needs to call which can fail, so we want to run it first and
1310 * synchronously.
1311 *
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001312 * 2. Synchronize with any outstanding nonblocking commit worker threads which
Daniel Vettere8c833a2014-07-27 18:30:19 +02001313 * might be affected the new state update. This can be done by either cancelling
1314 * or flushing the work items, depending upon whether the driver can deal with
1315 * cancelled updates. Note that it is important to ensure that the framebuffer
1316 * cleanup is still done when cancelling.
1317 *
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001318 * Asynchronous workers need to have sufficient parallelism to be able to run
1319 * different atomic commits on different CRTCs in parallel. The simplest way to
1320 * achive this is by running them on the &system_unbound_wq work queue. Note
1321 * that drivers are not required to split up atomic commits and run an
1322 * individual commit in parallel - userspace is supposed to do that if it cares.
1323 * But it might be beneficial to do that for modesets, since those necessarily
1324 * must be done as one global operation, and enabling or disabling a CRTC can
1325 * take a long time. But even that is not required.
Daniel Vettere8c833a2014-07-27 18:30:19 +02001326 *
1327 * 3. The software state is updated synchronously with
Daniel Vetter26196f72015-08-25 16:26:03 +02001328 * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset
Daniel Vettere8c833a2014-07-27 18:30:19 +02001329 * locks means concurrent callers never see inconsistent state. And doing this
Maarten Lankhorst286dbb82016-04-26 16:11:34 +02001330 * while it's guaranteed that no relevant nonblocking worker runs means that
1331 * nonblocking workers do not need grab any locks. Actually they must not grab
1332 * locks, for otherwise the work flushing will deadlock.
Daniel Vettere8c833a2014-07-27 18:30:19 +02001333 *
1334 * 4. Schedule a work item to do all subsequent steps, using the split-out
1335 * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
1336 * then cleaning up the framebuffers after the old framebuffer is no longer
1337 * being displayed.
Daniel Vetter9f2a7952016-06-08 14:19:02 +02001338 *
1339 * The above scheme is implemented in the atomic helper libraries in
1340 * drm_atomic_helper_commit() using a bunch of helper functions. See
1341 * drm_atomic_helper_setup_commit() for a starting point.
Daniel Vettere8c833a2014-07-27 18:30:19 +02001342 */
1343
Daniel Vettera095caa2016-06-08 17:15:36 +02001344static int stall_checks(struct drm_crtc *crtc, bool nonblock)
1345{
1346 struct drm_crtc_commit *commit, *stall_commit = NULL;
1347 bool completed = true;
1348 int i;
1349 long ret = 0;
1350
1351 spin_lock(&crtc->commit_lock);
1352 i = 0;
1353 list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1354 if (i == 0) {
1355 completed = try_wait_for_completion(&commit->flip_done);
1356 /* Userspace is not allowed to get ahead of the previous
1357 * commit with nonblocking ones. */
1358 if (!completed && nonblock) {
1359 spin_unlock(&crtc->commit_lock);
1360 return -EBUSY;
1361 }
1362 } else if (i == 1) {
1363 stall_commit = commit;
1364 drm_crtc_commit_get(stall_commit);
Daniel Vettera095caa2016-06-08 17:15:36 +02001365 break;
Daniel Vetter723c3e52016-06-14 19:50:58 +02001366 }
Daniel Vettera095caa2016-06-08 17:15:36 +02001367
1368 i++;
1369 }
1370 spin_unlock(&crtc->commit_lock);
1371
1372 if (!stall_commit)
1373 return 0;
1374
1375 /* We don't want to let commits get ahead of cleanup work too much,
1376 * stalling on 2nd previous commit means triple-buffer won't ever stall.
1377 */
Daniel Vetter723c3e52016-06-14 19:50:58 +02001378 ret = wait_for_completion_interruptible_timeout(&stall_commit->cleanup_done,
Daniel Vettera095caa2016-06-08 17:15:36 +02001379 10*HZ);
1380 if (ret == 0)
1381 DRM_ERROR("[CRTC:%d:%s] cleanup_done timed out\n",
1382 crtc->base.id, crtc->name);
1383
1384 drm_crtc_commit_put(stall_commit);
1385
1386 return ret < 0 ? ret : 0;
1387}
1388
1389/**
1390 * drm_atomic_helper_setup_commit - setup possibly nonblocking commit
1391 * @state: new modeset state to be committed
1392 * @nonblock: whether nonblocking behavior is requested.
1393 *
1394 * This function prepares @state to be used by the atomic helper's support for
1395 * nonblocking commits. Drivers using the nonblocking commit infrastructure
1396 * should always call this function from their ->atomic_commit hook.
1397 *
1398 * To be able to use this support drivers need to use a few more helper
1399 * functions. drm_atomic_helper_wait_for_dependencies() must be called before
1400 * actually committing the hardware state, and for nonblocking commits this call
1401 * must be placed in the async worker. See also drm_atomic_helper_swap_state()
1402 * and it's stall parameter, for when a driver's commit hooks look at the
1403 * ->state pointers of struct &drm_crtc, &drm_plane or &drm_connector directly.
1404 *
1405 * Completion of the hardware commit step must be signalled using
1406 * drm_atomic_helper_commit_hw_done(). After this step the driver is not allowed
1407 * to read or change any permanent software or hardware modeset state. The only
1408 * exception is state protected by other means than &drm_modeset_lock locks.
1409 * Only the free standing @state with pointers to the old state structures can
1410 * be inspected, e.g. to clean up old buffers using
1411 * drm_atomic_helper_cleanup_planes().
1412 *
1413 * At the very end, before cleaning up @state drivers must call
1414 * drm_atomic_helper_commit_cleanup_done().
1415 *
1416 * This is all implemented by in drm_atomic_helper_commit(), giving drivers a
1417 * complete and esay-to-use default implementation of the atomic_commit() hook.
1418 *
1419 * The tracking of asynchronously executed and still pending commits is done
1420 * using the core structure &drm_crtc_commit.
1421 *
1422 * By default there's no need to clean up resources allocated by this function
1423 * explicitly: drm_atomic_state_default_clear() will take care of that
1424 * automatically.
1425 *
1426 * Returns:
1427 *
1428 * 0 on success. -EBUSY when userspace schedules nonblocking commits too fast,
1429 * -ENOMEM on allocation failures and -EINTR when a signal is pending.
1430 */
1431int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
1432 bool nonblock)
1433{
1434 struct drm_crtc *crtc;
1435 struct drm_crtc_state *crtc_state;
1436 struct drm_crtc_commit *commit;
1437 int i, ret;
1438
1439 for_each_crtc_in_state(state, crtc, crtc_state, i) {
1440 commit = kzalloc(sizeof(*commit), GFP_KERNEL);
1441 if (!commit)
1442 return -ENOMEM;
1443
1444 init_completion(&commit->flip_done);
1445 init_completion(&commit->hw_done);
1446 init_completion(&commit->cleanup_done);
1447 INIT_LIST_HEAD(&commit->commit_entry);
1448 kref_init(&commit->ref);
1449 commit->crtc = crtc;
1450
1451 state->crtcs[i].commit = commit;
1452
1453 ret = stall_checks(crtc, nonblock);
1454 if (ret)
1455 return ret;
1456
1457 /* Drivers only send out events when at least either current or
1458 * new CRTC state is active. Complete right away if everything
1459 * stays off. */
1460 if (!crtc->state->active && !crtc_state->active) {
1461 complete_all(&commit->flip_done);
1462 continue;
1463 }
1464
1465 /* Legacy cursor updates are fully unsynced. */
1466 if (state->legacy_cursor_update) {
1467 complete_all(&commit->flip_done);
1468 continue;
1469 }
1470
1471 if (!crtc_state->event) {
1472 commit->event = kzalloc(sizeof(*commit->event),
1473 GFP_KERNEL);
1474 if (!commit->event)
1475 return -ENOMEM;
1476
1477 crtc_state->event = commit->event;
1478 }
1479
1480 crtc_state->event->base.completion = &commit->flip_done;
1481 }
1482
1483 return 0;
1484}
1485EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
1486
1487
1488static struct drm_crtc_commit *preceeding_commit(struct drm_crtc *crtc)
1489{
1490 struct drm_crtc_commit *commit;
1491 int i = 0;
1492
1493 list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1494 /* skip the first entry, that's the current commit */
1495 if (i == 1)
1496 return commit;
1497 i++;
1498 }
1499
1500 return NULL;
1501}
1502
1503/**
1504 * drm_atomic_helper_wait_for_dependencies - wait for required preceeding commits
1505 * @state: new modeset state to be committed
1506 *
1507 * This function waits for all preceeding commits that touch the same CRTC as
1508 * @state to both be committed to the hardware (as signalled by
1509 * drm_atomic_helper_commit_hw_done) and executed by the hardware (as signalled
1510 * by calling drm_crtc_vblank_send_event on the event member of
1511 * &drm_crtc_state).
1512 *
1513 * This is part of the atomic helper support for nonblocking commits, see
1514 * drm_atomic_helper_setup_commit() for an overview.
1515 */
1516void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *state)
1517{
1518 struct drm_crtc *crtc;
1519 struct drm_crtc_state *crtc_state;
1520 struct drm_crtc_commit *commit;
1521 int i;
1522 long ret;
1523
1524 for_each_crtc_in_state(state, crtc, crtc_state, i) {
1525 spin_lock(&crtc->commit_lock);
1526 commit = preceeding_commit(crtc);
1527 if (commit)
1528 drm_crtc_commit_get(commit);
1529 spin_unlock(&crtc->commit_lock);
1530
1531 if (!commit)
1532 continue;
1533
1534 ret = wait_for_completion_timeout(&commit->hw_done,
1535 10*HZ);
1536 if (ret == 0)
1537 DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
1538 crtc->base.id, crtc->name);
1539
1540 /* Currently no support for overwriting flips, hence
1541 * stall for previous one to execute completely. */
1542 ret = wait_for_completion_timeout(&commit->flip_done,
1543 10*HZ);
1544 if (ret == 0)
1545 DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1546 crtc->base.id, crtc->name);
1547
1548 drm_crtc_commit_put(commit);
1549 }
1550}
1551EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
1552
1553/**
1554 * drm_atomic_helper_commit_hw_done - setup possible nonblocking commit
1555 * @state: new modeset state to be committed
1556 *
1557 * This function is used to signal completion of the hardware commit step. After
1558 * this step the driver is not allowed to read or change any permanent software
1559 * or hardware modeset state. The only exception is state protected by other
1560 * means than &drm_modeset_lock locks.
1561 *
1562 * Drivers should try to postpone any expensive or delayed cleanup work after
1563 * this function is called.
1564 *
1565 * This is part of the atomic helper support for nonblocking commits, see
1566 * drm_atomic_helper_setup_commit() for an overview.
1567 */
1568void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *state)
1569{
1570 struct drm_crtc *crtc;
1571 struct drm_crtc_state *crtc_state;
1572 struct drm_crtc_commit *commit;
1573 int i;
1574
1575 for_each_crtc_in_state(state, crtc, crtc_state, i) {
1576 commit = state->crtcs[i].commit;
1577 if (!commit)
1578 continue;
1579
1580 /* backend must have consumed any event by now */
1581 WARN_ON(crtc->state->event);
1582 spin_lock(&crtc->commit_lock);
1583 complete_all(&commit->hw_done);
1584 spin_unlock(&crtc->commit_lock);
1585 }
1586}
1587EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
1588
1589/**
1590 * drm_atomic_helper_commit_cleanup_done - signal completion of commit
1591 * @state: new modeset state to be committed
1592 *
1593 * This signals completion of the atomic update @state, including any cleanup
1594 * work. If used, it must be called right before calling
Chris Wilson08536952016-10-14 13:18:18 +01001595 * drm_atomic_state_put().
Daniel Vettera095caa2016-06-08 17:15:36 +02001596 *
1597 * This is part of the atomic helper support for nonblocking commits, see
1598 * drm_atomic_helper_setup_commit() for an overview.
1599 */
1600void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *state)
1601{
1602 struct drm_crtc *crtc;
1603 struct drm_crtc_state *crtc_state;
1604 struct drm_crtc_commit *commit;
1605 int i;
1606 long ret;
1607
1608 for_each_crtc_in_state(state, crtc, crtc_state, i) {
1609 commit = state->crtcs[i].commit;
1610 if (WARN_ON(!commit))
1611 continue;
1612
1613 spin_lock(&crtc->commit_lock);
1614 complete_all(&commit->cleanup_done);
1615 WARN_ON(!try_wait_for_completion(&commit->hw_done));
1616
1617 /* commit_list borrows our reference, need to remove before we
1618 * clean up our drm_atomic_state. But only after it actually
1619 * completed, otherwise subsequent commits won't stall properly. */
Daniel Vetter7deef7f12016-06-15 12:24:26 +02001620 if (try_wait_for_completion(&commit->flip_done))
1621 goto del_commit;
Daniel Vettera095caa2016-06-08 17:15:36 +02001622
1623 spin_unlock(&crtc->commit_lock);
1624
1625 /* We must wait for the vblank event to signal our completion
1626 * before releasing our reference, since the vblank work does
1627 * not hold a reference of its own. */
1628 ret = wait_for_completion_timeout(&commit->flip_done,
1629 10*HZ);
1630 if (ret == 0)
1631 DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1632 crtc->base.id, crtc->name);
1633
1634 spin_lock(&crtc->commit_lock);
Daniel Vetter7deef7f12016-06-15 12:24:26 +02001635del_commit:
Daniel Vettera095caa2016-06-08 17:15:36 +02001636 list_del(&commit->commit_entry);
1637 spin_unlock(&crtc->commit_lock);
1638 }
1639}
1640EXPORT_SYMBOL(drm_atomic_helper_commit_cleanup_done);
1641
Daniel Vettere8c833a2014-07-27 18:30:19 +02001642/**
Daniel Vetter2e3afd42015-02-26 14:17:38 +01001643 * drm_atomic_helper_prepare_planes - prepare plane resources before commit
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001644 * @dev: DRM device
Daniel Vetter2e3afd42015-02-26 14:17:38 +01001645 * @state: atomic state object with new state structures
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001646 *
1647 * This function prepares plane state, specifically framebuffers, for the new
1648 * configuration. If any failure is encountered this function will call
1649 * ->cleanup_fb on any already successfully prepared framebuffer.
1650 *
1651 * Returns:
1652 * 0 on success, negative error code on failure.
1653 */
1654int drm_atomic_helper_prepare_planes(struct drm_device *dev,
1655 struct drm_atomic_state *state)
1656{
Daniel Vetterbe9174a2016-06-02 00:06:24 +02001657 struct drm_plane *plane;
1658 struct drm_plane_state *plane_state;
1659 int ret, i, j;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001660
Daniel Vetterbe9174a2016-06-02 00:06:24 +02001661 for_each_plane_in_state(state, plane, plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001662 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001663
1664 funcs = plane->helper_private;
1665
Keith Packardfcc60b42016-06-04 01:16:22 -07001666 if (!drm_atomic_helper_framebuffer_changed(dev, state, plane_state->crtc))
1667 continue;
1668
Maarten Lankhorst844f9112015-09-02 10:42:40 +02001669 if (funcs->prepare_fb) {
1670 ret = funcs->prepare_fb(plane, plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001671 if (ret)
1672 goto fail;
1673 }
1674 }
1675
1676 return 0;
1677
1678fail:
Daniel Vetterbe9174a2016-06-02 00:06:24 +02001679 for_each_plane_in_state(state, plane, plane_state, j) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001680 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001681
Daniel Vetterbe9174a2016-06-02 00:06:24 +02001682 if (j >= i)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001683 continue;
1684
Keith Packardfcc60b42016-06-04 01:16:22 -07001685 if (!drm_atomic_helper_framebuffer_changed(dev, state, plane_state->crtc))
1686 continue;
1687
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001688 funcs = plane->helper_private;
1689
Maarten Lankhorst844f9112015-09-02 10:42:40 +02001690 if (funcs->cleanup_fb)
1691 funcs->cleanup_fb(plane, plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001692 }
1693
1694 return ret;
1695}
1696EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
1697
Ville Syrjälä7135ac52016-09-19 16:33:42 +03001698static bool plane_crtc_active(const struct drm_plane_state *state)
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02001699{
1700 return state->crtc && state->crtc->state->active;
1701}
1702
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001703/**
1704 * drm_atomic_helper_commit_planes - commit plane state
1705 * @dev: DRM device
Daniel Vetterb0fcfc82014-11-19 18:38:11 +01001706 * @old_state: atomic state object with old state structures
Liu Ying2b58e982016-08-29 17:12:03 +08001707 * @flags: flags for committing plane state
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001708 *
1709 * This function commits the new plane state using the plane and atomic helper
1710 * functions for planes and crtcs. It assumes that the atomic state has already
1711 * been pushed into the relevant object state pointers, since this step can no
1712 * longer fail.
1713 *
Daniel Vetterb0fcfc82014-11-19 18:38:11 +01001714 * It still requires the global state object @old_state to know which planes and
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001715 * crtcs need to be updated though.
Maarten Lankhorstde28d022015-05-19 16:41:01 +02001716 *
1717 * Note that this function does all plane updates across all CRTCs in one step.
1718 * If the hardware can't support this approach look at
1719 * drm_atomic_helper_commit_planes_on_crtc() instead.
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001720 *
1721 * Plane parameters can be updated by applications while the associated CRTC is
1722 * disabled. The DRM/KMS core will store the parameters in the plane state,
1723 * which will be available to the driver when the CRTC is turned on. As a result
1724 * most drivers don't need to be immediately notified of plane updates for a
1725 * disabled CRTC.
1726 *
Liu Ying2b58e982016-08-29 17:12:03 +08001727 * Unless otherwise needed, drivers are advised to set the ACTIVE_ONLY flag in
1728 * @flags in order not to receive plane update notifications related to a
1729 * disabled CRTC. This avoids the need to manually ignore plane updates in
Daniel Vetter6e48ae32015-09-08 13:52:45 +02001730 * driver code when the driver and/or hardware can't or just don't need to deal
1731 * with updates on disabled CRTCs, for example when supporting runtime PM.
1732 *
Liu Ying2b58e982016-08-29 17:12:03 +08001733 * Drivers may set the NO_DISABLE_AFTER_MODESET flag in @flags if the relevant
1734 * display controllers require to disable a CRTC's planes when the CRTC is
1735 * disabled. This function would skip the ->atomic_disable call for a plane if
1736 * the CRTC of the old plane state needs a modesetting operation. Of course,
1737 * the drivers need to disable the planes in their CRTC disable callbacks
1738 * since no one else would do that.
1739 *
1740 * The drm_atomic_helper_commit() default implementation doesn't set the
1741 * ACTIVE_ONLY flag to most closely match the behaviour of the legacy helpers.
1742 * This should not be copied blindly by drivers.
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001743 */
1744void drm_atomic_helper_commit_planes(struct drm_device *dev,
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02001745 struct drm_atomic_state *old_state,
Liu Ying2b58e982016-08-29 17:12:03 +08001746 uint32_t flags)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001747{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001748 struct drm_crtc *crtc;
1749 struct drm_crtc_state *old_crtc_state;
1750 struct drm_plane *plane;
1751 struct drm_plane_state *old_plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001752 int i;
Liu Ying2b58e982016-08-29 17:12:03 +08001753 bool active_only = flags & DRM_PLANE_COMMIT_ACTIVE_ONLY;
1754 bool no_disable = flags & DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001755
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001756 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001757 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001758
1759 funcs = crtc->helper_private;
1760
1761 if (!funcs || !funcs->atomic_begin)
1762 continue;
1763
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02001764 if (active_only && !crtc->state->active)
1765 continue;
1766
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02001767 funcs->atomic_begin(crtc, old_crtc_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001768 }
1769
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001770 for_each_plane_in_state(old_state, plane, old_plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001771 const struct drm_plane_helper_funcs *funcs;
Laurent Pinchart216c59d2015-09-11 00:07:19 +03001772 bool disabling;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001773
1774 funcs = plane->helper_private;
1775
Thierry Reding3cad4b62014-11-25 13:05:12 +01001776 if (!funcs)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001777 continue;
1778
Laurent Pinchart216c59d2015-09-11 00:07:19 +03001779 disabling = drm_atomic_plane_disabling(plane, old_plane_state);
1780
1781 if (active_only) {
1782 /*
1783 * Skip planes related to inactive CRTCs. If the plane
1784 * is enabled use the state of the current CRTC. If the
1785 * plane is being disabled use the state of the old
1786 * CRTC to avoid skipping planes being disabled on an
1787 * active CRTC.
1788 */
1789 if (!disabling && !plane_crtc_active(plane->state))
1790 continue;
1791 if (disabling && !plane_crtc_active(old_plane_state))
1792 continue;
1793 }
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02001794
Thierry Reding407b8bd2014-11-20 12:05:50 +01001795 /*
1796 * Special-case disabling the plane if drivers support it.
1797 */
Liu Ying2b58e982016-08-29 17:12:03 +08001798 if (disabling && funcs->atomic_disable) {
1799 struct drm_crtc_state *crtc_state;
1800
1801 crtc_state = old_plane_state->crtc->state;
1802
1803 if (drm_atomic_crtc_needs_modeset(crtc_state) &&
1804 no_disable)
1805 continue;
1806
Thierry Reding407b8bd2014-11-20 12:05:50 +01001807 funcs->atomic_disable(plane, old_plane_state);
Liu Ying2b58e982016-08-29 17:12:03 +08001808 } else if (plane->state->crtc || disabling) {
Thierry Reding407b8bd2014-11-20 12:05:50 +01001809 funcs->atomic_update(plane, old_plane_state);
Liu Ying2b58e982016-08-29 17:12:03 +08001810 }
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001811 }
1812
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001813 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001814 const struct drm_crtc_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001815
1816 funcs = crtc->helper_private;
1817
1818 if (!funcs || !funcs->atomic_flush)
1819 continue;
1820
Daniel Vetteraef9dbb2015-09-08 12:02:07 +02001821 if (active_only && !crtc->state->active)
1822 continue;
1823
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02001824 funcs->atomic_flush(crtc, old_crtc_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001825 }
1826}
1827EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
1828
1829/**
Maarten Lankhorstde28d022015-05-19 16:41:01 +02001830 * drm_atomic_helper_commit_planes_on_crtc - commit plane state for a crtc
1831 * @old_crtc_state: atomic state object with the old crtc state
1832 *
1833 * This function commits the new plane state using the plane and atomic helper
1834 * functions for planes on the specific crtc. It assumes that the atomic state
1835 * has already been pushed into the relevant object state pointers, since this
1836 * step can no longer fail.
1837 *
1838 * This function is useful when plane updates should be done crtc-by-crtc
1839 * instead of one global step like drm_atomic_helper_commit_planes() does.
1840 *
1841 * This function can only be savely used when planes are not allowed to move
1842 * between different CRTCs because this function doesn't handle inter-CRTC
1843 * depencies. Callers need to ensure that either no such depencies exist,
1844 * resolve them through ordering of commit calls or through some other means.
1845 */
1846void
1847drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
1848{
1849 const struct drm_crtc_helper_funcs *crtc_funcs;
1850 struct drm_crtc *crtc = old_crtc_state->crtc;
1851 struct drm_atomic_state *old_state = old_crtc_state->state;
1852 struct drm_plane *plane;
1853 unsigned plane_mask;
1854
1855 plane_mask = old_crtc_state->plane_mask;
1856 plane_mask |= crtc->state->plane_mask;
1857
1858 crtc_funcs = crtc->helper_private;
1859 if (crtc_funcs && crtc_funcs->atomic_begin)
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02001860 crtc_funcs->atomic_begin(crtc, old_crtc_state);
Maarten Lankhorstde28d022015-05-19 16:41:01 +02001861
1862 drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
1863 struct drm_plane_state *old_plane_state =
1864 drm_atomic_get_existing_plane_state(old_state, plane);
1865 const struct drm_plane_helper_funcs *plane_funcs;
1866
1867 plane_funcs = plane->helper_private;
1868
1869 if (!old_plane_state || !plane_funcs)
1870 continue;
1871
1872 WARN_ON(plane->state->crtc && plane->state->crtc != crtc);
1873
1874 if (drm_atomic_plane_disabling(plane, old_plane_state) &&
1875 plane_funcs->atomic_disable)
1876 plane_funcs->atomic_disable(plane, old_plane_state);
1877 else if (plane->state->crtc ||
1878 drm_atomic_plane_disabling(plane, old_plane_state))
1879 plane_funcs->atomic_update(plane, old_plane_state);
1880 }
1881
1882 if (crtc_funcs && crtc_funcs->atomic_flush)
Maarten Lankhorst613d2b22015-07-21 13:28:58 +02001883 crtc_funcs->atomic_flush(crtc, old_crtc_state);
Maarten Lankhorstde28d022015-05-19 16:41:01 +02001884}
1885EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
1886
1887/**
Jyri Sarha6753ba92015-11-27 16:14:01 +02001888 * drm_atomic_helper_disable_planes_on_crtc - helper to disable CRTC's planes
Liu Ying28500292016-08-26 15:30:39 +08001889 * @old_crtc_state: atomic state object with the old CRTC state
Jyri Sarha6753ba92015-11-27 16:14:01 +02001890 * @atomic: if set, synchronize with CRTC's atomic_begin/flush hooks
1891 *
1892 * Disables all planes associated with the given CRTC. This can be
Liu Ying28500292016-08-26 15:30:39 +08001893 * used for instance in the CRTC helper atomic_disable callback to disable
1894 * all planes.
Jyri Sarha6753ba92015-11-27 16:14:01 +02001895 *
1896 * If the atomic-parameter is set the function calls the CRTC's
1897 * atomic_begin hook before and atomic_flush hook after disabling the
1898 * planes.
1899 *
1900 * It is a bug to call this function without having implemented the
1901 * ->atomic_disable() plane hook.
1902 */
Liu Ying28500292016-08-26 15:30:39 +08001903void
1904drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc_state *old_crtc_state,
1905 bool atomic)
Jyri Sarha6753ba92015-11-27 16:14:01 +02001906{
Liu Ying28500292016-08-26 15:30:39 +08001907 struct drm_crtc *crtc = old_crtc_state->crtc;
Jyri Sarha6753ba92015-11-27 16:14:01 +02001908 const struct drm_crtc_helper_funcs *crtc_funcs =
1909 crtc->helper_private;
1910 struct drm_plane *plane;
1911
1912 if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
1913 crtc_funcs->atomic_begin(crtc, NULL);
1914
Liu Ying28500292016-08-26 15:30:39 +08001915 drm_atomic_crtc_state_for_each_plane(plane, old_crtc_state) {
Jyri Sarha6753ba92015-11-27 16:14:01 +02001916 const struct drm_plane_helper_funcs *plane_funcs =
1917 plane->helper_private;
1918
Liu Ying28500292016-08-26 15:30:39 +08001919 if (!plane_funcs)
Jyri Sarha6753ba92015-11-27 16:14:01 +02001920 continue;
1921
1922 WARN_ON(!plane_funcs->atomic_disable);
1923 if (plane_funcs->atomic_disable)
1924 plane_funcs->atomic_disable(plane, NULL);
1925 }
1926
1927 if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
1928 crtc_funcs->atomic_flush(crtc, NULL);
1929}
1930EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
1931
1932/**
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001933 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
1934 * @dev: DRM device
1935 * @old_state: atomic state object with old state structures
1936 *
1937 * This function cleans up plane state, specifically framebuffers, from the old
1938 * configuration. Hence the old configuration must be perserved in @old_state to
1939 * be able to call this function.
1940 *
1941 * This function must also be called on the new state when the atomic update
1942 * fails at any point after calling drm_atomic_helper_prepare_planes().
1943 */
1944void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
1945 struct drm_atomic_state *old_state)
1946{
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001947 struct drm_plane *plane;
1948 struct drm_plane_state *plane_state;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001949 int i;
1950
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03001951 for_each_plane_in_state(old_state, plane, plane_state, i) {
Ville Syrjäläb5ceff202015-03-10 14:35:20 +02001952 const struct drm_plane_helper_funcs *funcs;
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001953
Keith Packardfcc60b42016-06-04 01:16:22 -07001954 if (!drm_atomic_helper_framebuffer_changed(dev, old_state, plane_state->crtc))
1955 continue;
1956
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001957 funcs = plane->helper_private;
1958
Maarten Lankhorst844f9112015-09-02 10:42:40 +02001959 if (funcs->cleanup_fb)
1960 funcs->cleanup_fb(plane, plane_state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001961 }
1962}
1963EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
1964
1965/**
1966 * drm_atomic_helper_swap_state - store atomic state into current sw state
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001967 * @state: atomic state
Daniel Vetter5e84c262016-06-10 00:06:32 +02001968 * @stall: stall for proceeding commits
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001969 *
1970 * This function stores the atomic state into the current state pointers in all
1971 * driver objects. It should be called after all failing steps have been done
1972 * and succeeded, but before the actual hardware state is committed.
1973 *
1974 * For cleanup and error recovery the current state for all changed objects will
1975 * be swaped into @state.
1976 *
1977 * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
1978 *
1979 * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
1980 *
1981 * 2. Do any other steps that might fail.
1982 *
1983 * 3. Put the staged state into the current state pointers with this function.
1984 *
1985 * 4. Actually commit the hardware state.
1986 *
Daniel Vetter26196f72015-08-25 16:26:03 +02001987 * 5. Call drm_atomic_helper_cleanup_planes() with @state, which since step 3
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001988 * contains the old state. Also do any other cleanup required with that state.
Daniel Vettera095caa2016-06-08 17:15:36 +02001989 *
1990 * @stall must be set when nonblocking commits for this driver directly access
1991 * the ->state pointer of &drm_plane, &drm_crtc or &drm_connector. With the
1992 * current atomic helpers this is almost always the case, since the helpers
1993 * don't pass the right state structures to the callbacks.
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001994 */
Daniel Vetter5e84c262016-06-10 00:06:32 +02001995void drm_atomic_helper_swap_state(struct drm_atomic_state *state,
1996 bool stall)
Daniel Vetterc2fcd272014-11-05 00:14:14 +01001997{
1998 int i;
Daniel Vettera095caa2016-06-08 17:15:36 +02001999 long ret;
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002000 struct drm_connector *connector;
2001 struct drm_connector_state *conn_state;
2002 struct drm_crtc *crtc;
2003 struct drm_crtc_state *crtc_state;
2004 struct drm_plane *plane;
2005 struct drm_plane_state *plane_state;
Daniel Vettera095caa2016-06-08 17:15:36 +02002006 struct drm_crtc_commit *commit;
2007
2008 if (stall) {
2009 for_each_crtc_in_state(state, crtc, crtc_state, i) {
2010 spin_lock(&crtc->commit_lock);
2011 commit = list_first_entry_or_null(&crtc->commit_list,
2012 struct drm_crtc_commit, commit_entry);
2013 if (commit)
2014 drm_crtc_commit_get(commit);
2015 spin_unlock(&crtc->commit_lock);
2016
2017 if (!commit)
2018 continue;
2019
2020 ret = wait_for_completion_timeout(&commit->hw_done,
2021 10*HZ);
2022 if (ret == 0)
2023 DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
2024 crtc->base.id, crtc->name);
2025 drm_crtc_commit_put(commit);
2026 }
2027 }
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002028
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002029 for_each_connector_in_state(state, connector, conn_state, i) {
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002030 connector->state->state = state;
Daniel Vetter63e83c12016-06-02 00:06:32 +02002031 swap(state->connectors[i].state, connector->state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002032 connector->state->state = NULL;
2033 }
2034
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002035 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002036 crtc->state->state = state;
Daniel Vetter5d943aa62016-06-02 00:06:34 +02002037 swap(state->crtcs[i].state, crtc->state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002038 crtc->state->state = NULL;
Daniel Vettera095caa2016-06-08 17:15:36 +02002039
2040 if (state->crtcs[i].commit) {
2041 spin_lock(&crtc->commit_lock);
2042 list_add(&state->crtcs[i].commit->commit_entry,
2043 &crtc->commit_list);
2044 spin_unlock(&crtc->commit_lock);
2045
2046 state->crtcs[i].commit->event = NULL;
2047 }
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002048 }
2049
Daniel Vetterbe9174a2016-06-02 00:06:24 +02002050 for_each_plane_in_state(state, plane, plane_state, i) {
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002051 plane->state->state = state;
Daniel Vetterb8b53422016-06-02 00:06:33 +02002052 swap(state->planes[i].state, plane->state);
Daniel Vetterc2fcd272014-11-05 00:14:14 +01002053 plane->state->state = NULL;
2054 }
2055}
2056EXPORT_SYMBOL(drm_atomic_helper_swap_state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002057
2058/**
2059 * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
2060 * @plane: plane object to update
2061 * @crtc: owning CRTC of owning plane
2062 * @fb: framebuffer to flip onto plane
2063 * @crtc_x: x offset of primary plane on crtc
2064 * @crtc_y: y offset of primary plane on crtc
2065 * @crtc_w: width of primary plane rectangle on crtc
2066 * @crtc_h: height of primary plane rectangle on crtc
2067 * @src_x: x offset of @fb for panning
2068 * @src_y: y offset of @fb for panning
2069 * @src_w: width of source rectangle in @fb
2070 * @src_h: height of source rectangle in @fb
2071 *
2072 * Provides a default plane update handler using the atomic driver interface.
2073 *
2074 * RETURNS:
2075 * Zero on success, error code on failure
2076 */
2077int drm_atomic_helper_update_plane(struct drm_plane *plane,
2078 struct drm_crtc *crtc,
2079 struct drm_framebuffer *fb,
2080 int crtc_x, int crtc_y,
2081 unsigned int crtc_w, unsigned int crtc_h,
2082 uint32_t src_x, uint32_t src_y,
2083 uint32_t src_w, uint32_t src_h)
2084{
2085 struct drm_atomic_state *state;
2086 struct drm_plane_state *plane_state;
2087 int ret = 0;
2088
2089 state = drm_atomic_state_alloc(plane->dev);
2090 if (!state)
2091 return -ENOMEM;
2092
2093 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2094retry:
2095 plane_state = drm_atomic_get_plane_state(state, plane);
2096 if (IS_ERR(plane_state)) {
2097 ret = PTR_ERR(plane_state);
2098 goto fail;
2099 }
2100
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01002101 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
Daniel Vetter042652e2014-07-27 13:46:52 +02002102 if (ret != 0)
2103 goto fail;
Daniel Vetter321ebf02014-11-04 22:57:27 +01002104 drm_atomic_set_fb_for_plane(plane_state, fb);
Daniel Vetter042652e2014-07-27 13:46:52 +02002105 plane_state->crtc_x = crtc_x;
2106 plane_state->crtc_y = crtc_y;
Daniel Vetter042652e2014-07-27 13:46:52 +02002107 plane_state->crtc_w = crtc_w;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002108 plane_state->crtc_h = crtc_h;
Daniel Vetter042652e2014-07-27 13:46:52 +02002109 plane_state->src_x = src_x;
2110 plane_state->src_y = src_y;
Daniel Vetter042652e2014-07-27 13:46:52 +02002111 plane_state->src_w = src_w;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002112 plane_state->src_h = src_h;
Daniel Vetter042652e2014-07-27 13:46:52 +02002113
Daniel Vetter3671c582015-05-04 15:40:52 +02002114 if (plane == crtc->cursor)
2115 state->legacy_cursor_update = true;
2116
Daniel Vetter042652e2014-07-27 13:46:52 +02002117 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002118fail:
2119 if (ret == -EDEADLK)
2120 goto backoff;
2121
Chris Wilson08536952016-10-14 13:18:18 +01002122 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002123 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002124
Daniel Vetter042652e2014-07-27 13:46:52 +02002125backoff:
Daniel Vetter042652e2014-07-27 13:46:52 +02002126 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002127 drm_atomic_legacy_backoff(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002128
2129 /*
2130 * Someone might have exchanged the framebuffer while we dropped locks
2131 * in the backoff code. We need to fix up the fb refcount tracking the
2132 * core does for us.
2133 */
2134 plane->old_fb = plane->fb;
2135
2136 goto retry;
2137}
2138EXPORT_SYMBOL(drm_atomic_helper_update_plane);
2139
2140/**
2141 * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
2142 * @plane: plane to disable
2143 *
2144 * Provides a default plane disable handler using the atomic driver interface.
2145 *
2146 * RETURNS:
2147 * Zero on success, error code on failure
2148 */
2149int drm_atomic_helper_disable_plane(struct drm_plane *plane)
2150{
2151 struct drm_atomic_state *state;
2152 struct drm_plane_state *plane_state;
2153 int ret = 0;
2154
Jasper St. Pierreaa54e2e2014-11-20 19:59:15 -08002155 /*
2156 * FIXME: Without plane->crtc set we can't get at the implicit legacy
2157 * acquire context. The real fix will be to wire the acquire ctx through
2158 * everywhere we need it, but meanwhile prevent chaos by just skipping
2159 * this noop. The critical case is the cursor ioctls which a) only grab
2160 * crtc/cursor-plane locks (so we need the crtc to get at the right
2161 * acquire context) and b) can try to disable the plane multiple times.
2162 */
2163 if (!plane->crtc)
2164 return 0;
2165
Daniel Vetter042652e2014-07-27 13:46:52 +02002166 state = drm_atomic_state_alloc(plane->dev);
2167 if (!state)
2168 return -ENOMEM;
2169
2170 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(plane->crtc);
2171retry:
2172 plane_state = drm_atomic_get_plane_state(state, plane);
2173 if (IS_ERR(plane_state)) {
2174 ret = PTR_ERR(plane_state);
2175 goto fail;
2176 }
2177
Maarten Lankhorst24e79d02015-11-11 11:29:07 +01002178 if (plane_state->crtc && (plane == plane->crtc->cursor))
2179 plane_state->state->legacy_cursor_update = true;
2180
Rob Clarkbbb1e522015-08-25 15:35:58 -04002181 ret = __drm_atomic_helper_disable_plane(plane, plane_state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002182 if (ret != 0)
2183 goto fail;
Daniel Vetterf02ad902015-01-22 16:36:23 +01002184
Daniel Vetter042652e2014-07-27 13:46:52 +02002185 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002186fail:
2187 if (ret == -EDEADLK)
2188 goto backoff;
2189
Chris Wilson08536952016-10-14 13:18:18 +01002190 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002191 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002192
Daniel Vetter042652e2014-07-27 13:46:52 +02002193backoff:
Daniel Vetter042652e2014-07-27 13:46:52 +02002194 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002195 drm_atomic_legacy_backoff(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002196
2197 /*
2198 * Someone might have exchanged the framebuffer while we dropped locks
2199 * in the backoff code. We need to fix up the fb refcount tracking the
2200 * core does for us.
2201 */
2202 plane->old_fb = plane->fb;
2203
2204 goto retry;
2205}
2206EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
2207
Rob Clarkbbb1e522015-08-25 15:35:58 -04002208/* just used from fb-helper and atomic-helper: */
2209int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
2210 struct drm_plane_state *plane_state)
2211{
2212 int ret;
2213
2214 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
2215 if (ret != 0)
2216 return ret;
2217
2218 drm_atomic_set_fb_for_plane(plane_state, NULL);
2219 plane_state->crtc_x = 0;
2220 plane_state->crtc_y = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002221 plane_state->crtc_w = 0;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002222 plane_state->crtc_h = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002223 plane_state->src_x = 0;
2224 plane_state->src_y = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002225 plane_state->src_w = 0;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002226 plane_state->src_h = 0;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002227
Rob Clarkbbb1e522015-08-25 15:35:58 -04002228 return 0;
2229}
2230
Daniel Vetter042652e2014-07-27 13:46:52 +02002231static int update_output_state(struct drm_atomic_state *state,
2232 struct drm_mode_set *set)
2233{
2234 struct drm_device *dev = set->crtc->dev;
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002235 struct drm_crtc *crtc;
2236 struct drm_crtc_state *crtc_state;
2237 struct drm_connector *connector;
Daniel Vetter042652e2014-07-27 13:46:52 +02002238 struct drm_connector_state *conn_state;
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002239 int ret, i;
Daniel Vetter042652e2014-07-27 13:46:52 +02002240
2241 ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
2242 state->acquire_ctx);
2243 if (ret)
2244 return ret;
2245
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002246 /* First disable all connectors on the target crtc. */
2247 ret = drm_atomic_add_affected_connectors(state, set->crtc);
2248 if (ret)
2249 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002250
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002251 for_each_connector_in_state(state, connector, conn_state, i) {
Daniel Vetter042652e2014-07-27 13:46:52 +02002252 if (conn_state->crtc == set->crtc) {
2253 ret = drm_atomic_set_crtc_for_connector(conn_state,
2254 NULL);
2255 if (ret)
2256 return ret;
2257 }
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002258 }
Daniel Vetter042652e2014-07-27 13:46:52 +02002259
Maarten Lankhorst6ab520a2016-02-24 09:37:28 +01002260 /* Then set all connectors from set->connectors on the target crtc */
2261 for (i = 0; i < set->num_connectors; i++) {
2262 conn_state = drm_atomic_get_connector_state(state,
2263 set->connectors[i]);
2264 if (IS_ERR(conn_state))
2265 return PTR_ERR(conn_state);
2266
2267 ret = drm_atomic_set_crtc_for_connector(conn_state,
2268 set->crtc);
2269 if (ret)
2270 return ret;
Daniel Vetter042652e2014-07-27 13:46:52 +02002271 }
2272
Ander Conselvan de Oliveiradf63b992015-04-10 14:58:39 +03002273 for_each_crtc_in_state(state, crtc, crtc_state, i) {
Daniel Vetter042652e2014-07-27 13:46:52 +02002274 /* Don't update ->enable for the CRTC in the set_config request,
2275 * since a mismatch would indicate a bug in the upper layers.
2276 * The actual modeset code later on will catch any
2277 * inconsistencies here. */
2278 if (crtc == set->crtc)
2279 continue;
2280
Maarten Lankhorst14de6c42016-01-04 12:53:20 +01002281 if (!crtc_state->connector_mask) {
Laurent Pinchartc30f55a2015-06-22 13:37:46 +03002282 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
2283 NULL);
2284 if (ret < 0)
2285 return ret;
2286
Maarten Lankhorst9b5edbf2015-06-01 08:59:53 +02002287 crtc_state->active = false;
Laurent Pinchartc30f55a2015-06-22 13:37:46 +03002288 }
Daniel Vetter042652e2014-07-27 13:46:52 +02002289 }
2290
2291 return 0;
2292}
2293
2294/**
2295 * drm_atomic_helper_set_config - set a new config from userspace
2296 * @set: mode set configuration
2297 *
2298 * Provides a default crtc set_config handler using the atomic driver interface.
2299 *
2300 * Returns:
2301 * Returns 0 on success, negative errno numbers on failure.
2302 */
2303int drm_atomic_helper_set_config(struct drm_mode_set *set)
2304{
2305 struct drm_atomic_state *state;
2306 struct drm_crtc *crtc = set->crtc;
Daniel Vetter042652e2014-07-27 13:46:52 +02002307 int ret = 0;
2308
2309 state = drm_atomic_state_alloc(crtc->dev);
2310 if (!state)
2311 return -ENOMEM;
2312
Maarten Lankhorst40616a22016-03-03 10:17:39 +01002313 state->legacy_set_config = true;
Daniel Vetter042652e2014-07-27 13:46:52 +02002314 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2315retry:
Rob Clarkbbb1e522015-08-25 15:35:58 -04002316 ret = __drm_atomic_helper_set_config(set, state);
Daniel Stone819364d2015-05-26 14:36:48 +01002317 if (ret != 0)
2318 goto fail;
2319
Daniel Vetter042652e2014-07-27 13:46:52 +02002320 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002321fail:
2322 if (ret == -EDEADLK)
2323 goto backoff;
2324
Chris Wilson08536952016-10-14 13:18:18 +01002325 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002326 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002327
Daniel Vetter042652e2014-07-27 13:46:52 +02002328backoff:
Daniel Vetter042652e2014-07-27 13:46:52 +02002329 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002330 drm_atomic_legacy_backoff(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002331
2332 /*
2333 * Someone might have exchanged the framebuffer while we dropped locks
2334 * in the backoff code. We need to fix up the fb refcount tracking the
2335 * core does for us.
2336 */
2337 crtc->primary->old_fb = crtc->primary->fb;
2338
2339 goto retry;
2340}
2341EXPORT_SYMBOL(drm_atomic_helper_set_config);
2342
Rob Clarkbbb1e522015-08-25 15:35:58 -04002343/* just used from fb-helper and atomic-helper: */
2344int __drm_atomic_helper_set_config(struct drm_mode_set *set,
2345 struct drm_atomic_state *state)
2346{
2347 struct drm_crtc_state *crtc_state;
2348 struct drm_plane_state *primary_state;
2349 struct drm_crtc *crtc = set->crtc;
Ville Syrjälä83926112015-11-16 17:02:34 +02002350 int hdisplay, vdisplay;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002351 int ret;
2352
2353 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2354 if (IS_ERR(crtc_state))
2355 return PTR_ERR(crtc_state);
2356
2357 primary_state = drm_atomic_get_plane_state(state, crtc->primary);
2358 if (IS_ERR(primary_state))
2359 return PTR_ERR(primary_state);
2360
2361 if (!set->mode) {
2362 WARN_ON(set->fb);
2363 WARN_ON(set->num_connectors);
2364
2365 ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
2366 if (ret != 0)
2367 return ret;
2368
2369 crtc_state->active = false;
2370
2371 ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
2372 if (ret != 0)
2373 return ret;
2374
2375 drm_atomic_set_fb_for_plane(primary_state, NULL);
2376
2377 goto commit;
2378 }
2379
2380 WARN_ON(!set->fb);
2381 WARN_ON(!set->num_connectors);
2382
2383 ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
2384 if (ret != 0)
2385 return ret;
2386
2387 crtc_state->active = true;
2388
2389 ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
2390 if (ret != 0)
2391 return ret;
2392
Ville Syrjälä83926112015-11-16 17:02:34 +02002393 drm_crtc_get_hv_timing(set->mode, &hdisplay, &vdisplay);
2394
Rob Clarkbbb1e522015-08-25 15:35:58 -04002395 drm_atomic_set_fb_for_plane(primary_state, set->fb);
2396 primary_state->crtc_x = 0;
2397 primary_state->crtc_y = 0;
Ville Syrjälä83926112015-11-16 17:02:34 +02002398 primary_state->crtc_w = hdisplay;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002399 primary_state->crtc_h = vdisplay;
Rob Clarkbbb1e522015-08-25 15:35:58 -04002400 primary_state->src_x = set->x << 16;
2401 primary_state->src_y = set->y << 16;
Joonas Lahtinen31ad61e2016-07-29 08:50:05 +03002402 if (primary_state->rotation & (DRM_ROTATE_90 | DRM_ROTATE_270)) {
Ville Syrjälä83926112015-11-16 17:02:34 +02002403 primary_state->src_w = vdisplay << 16;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002404 primary_state->src_h = hdisplay << 16;
Ville Syrjälä41121242015-10-15 20:39:59 +03002405 } else {
Ville Syrjälä83926112015-11-16 17:02:34 +02002406 primary_state->src_w = hdisplay << 16;
Ville Syrjälä02e6f372015-11-16 17:02:35 +02002407 primary_state->src_h = vdisplay << 16;
Ville Syrjälä41121242015-10-15 20:39:59 +03002408 }
Rob Clarkbbb1e522015-08-25 15:35:58 -04002409
2410commit:
2411 ret = update_output_state(state, set);
2412 if (ret)
2413 return ret;
2414
2415 return 0;
2416}
2417
Daniel Vetter042652e2014-07-27 13:46:52 +02002418/**
Thierry Reding14942762015-12-02 17:50:04 +01002419 * drm_atomic_helper_disable_all - disable all currently active outputs
2420 * @dev: DRM device
2421 * @ctx: lock acquisition context
2422 *
2423 * Loops through all connectors, finding those that aren't turned off and then
2424 * turns them off by setting their DPMS mode to OFF and deactivating the CRTC
2425 * that they are connected to.
2426 *
2427 * This is used for example in suspend/resume to disable all currently active
2428 * functions when suspending.
2429 *
2430 * Note that if callers haven't already acquired all modeset locks this might
2431 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
2432 *
2433 * Returns:
2434 * 0 on success or a negative error code on failure.
2435 *
2436 * See also:
2437 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
2438 */
2439int drm_atomic_helper_disable_all(struct drm_device *dev,
2440 struct drm_modeset_acquire_ctx *ctx)
2441{
2442 struct drm_atomic_state *state;
2443 struct drm_connector *conn;
2444 int err;
2445
2446 state = drm_atomic_state_alloc(dev);
2447 if (!state)
2448 return -ENOMEM;
2449
2450 state->acquire_ctx = ctx;
2451
2452 drm_for_each_connector(conn, dev) {
2453 struct drm_crtc *crtc = conn->state->crtc;
2454 struct drm_crtc_state *crtc_state;
2455
2456 if (!crtc || conn->dpms != DRM_MODE_DPMS_ON)
2457 continue;
2458
2459 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2460 if (IS_ERR(crtc_state)) {
2461 err = PTR_ERR(crtc_state);
2462 goto free;
2463 }
2464
2465 crtc_state->active = false;
2466 }
2467
2468 err = drm_atomic_commit(state);
Thierry Reding14942762015-12-02 17:50:04 +01002469free:
Chris Wilson08536952016-10-14 13:18:18 +01002470 drm_atomic_state_put(state);
Thierry Reding14942762015-12-02 17:50:04 +01002471 return err;
2472}
2473EXPORT_SYMBOL(drm_atomic_helper_disable_all);
2474
2475/**
2476 * drm_atomic_helper_suspend - subsystem-level suspend helper
2477 * @dev: DRM device
2478 *
2479 * Duplicates the current atomic state, disables all active outputs and then
2480 * returns a pointer to the original atomic state to the caller. Drivers can
2481 * pass this pointer to the drm_atomic_helper_resume() helper upon resume to
2482 * restore the output configuration that was active at the time the system
2483 * entered suspend.
2484 *
2485 * Note that it is potentially unsafe to use this. The atomic state object
2486 * returned by this function is assumed to be persistent. Drivers must ensure
2487 * that this holds true. Before calling this function, drivers must make sure
2488 * to suspend fbdev emulation so that nothing can be using the device.
2489 *
2490 * Returns:
2491 * A pointer to a copy of the state before suspend on success or an ERR_PTR()-
2492 * encoded error code on failure. Drivers should store the returned atomic
2493 * state object and pass it to the drm_atomic_helper_resume() helper upon
2494 * resume.
2495 *
2496 * See also:
2497 * drm_atomic_helper_duplicate_state(), drm_atomic_helper_disable_all(),
2498 * drm_atomic_helper_resume()
2499 */
2500struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
2501{
2502 struct drm_modeset_acquire_ctx ctx;
2503 struct drm_atomic_state *state;
2504 int err;
2505
2506 drm_modeset_acquire_init(&ctx, 0);
2507
2508retry:
2509 err = drm_modeset_lock_all_ctx(dev, &ctx);
2510 if (err < 0) {
2511 state = ERR_PTR(err);
2512 goto unlock;
2513 }
2514
2515 state = drm_atomic_helper_duplicate_state(dev, &ctx);
2516 if (IS_ERR(state))
2517 goto unlock;
2518
2519 err = drm_atomic_helper_disable_all(dev, &ctx);
2520 if (err < 0) {
Chris Wilson08536952016-10-14 13:18:18 +01002521 drm_atomic_state_put(state);
Thierry Reding14942762015-12-02 17:50:04 +01002522 state = ERR_PTR(err);
2523 goto unlock;
2524 }
2525
2526unlock:
2527 if (PTR_ERR(state) == -EDEADLK) {
2528 drm_modeset_backoff(&ctx);
2529 goto retry;
2530 }
2531
2532 drm_modeset_drop_locks(&ctx);
2533 drm_modeset_acquire_fini(&ctx);
2534 return state;
2535}
2536EXPORT_SYMBOL(drm_atomic_helper_suspend);
2537
2538/**
2539 * drm_atomic_helper_resume - subsystem-level resume helper
2540 * @dev: DRM device
2541 * @state: atomic state to resume to
2542 *
2543 * Calls drm_mode_config_reset() to synchronize hardware and software states,
2544 * grabs all modeset locks and commits the atomic state object. This can be
2545 * used in conjunction with the drm_atomic_helper_suspend() helper to
2546 * implement suspend/resume for drivers that support atomic mode-setting.
2547 *
2548 * Returns:
2549 * 0 on success or a negative error code on failure.
2550 *
2551 * See also:
2552 * drm_atomic_helper_suspend()
2553 */
2554int drm_atomic_helper_resume(struct drm_device *dev,
2555 struct drm_atomic_state *state)
2556{
2557 struct drm_mode_config *config = &dev->mode_config;
2558 int err;
2559
2560 drm_mode_config_reset(dev);
2561 drm_modeset_lock_all(dev);
2562 state->acquire_ctx = config->acquire_ctx;
2563 err = drm_atomic_commit(state);
2564 drm_modeset_unlock_all(dev);
2565
2566 return err;
2567}
2568EXPORT_SYMBOL(drm_atomic_helper_resume);
2569
2570/**
Laurent Pinchart7f500022015-02-23 02:50:23 +02002571 * drm_atomic_helper_crtc_set_property - helper for crtc properties
Daniel Vetter042652e2014-07-27 13:46:52 +02002572 * @crtc: DRM crtc
2573 * @property: DRM property
2574 * @val: value of property
2575 *
Laurent Pinchart7f500022015-02-23 02:50:23 +02002576 * Provides a default crtc set_property handler using the atomic driver
2577 * interface.
Daniel Vetter042652e2014-07-27 13:46:52 +02002578 *
2579 * RETURNS:
2580 * Zero on success, error code on failure
2581 */
2582int
2583drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc,
2584 struct drm_property *property,
2585 uint64_t val)
2586{
2587 struct drm_atomic_state *state;
2588 struct drm_crtc_state *crtc_state;
2589 int ret = 0;
2590
2591 state = drm_atomic_state_alloc(crtc->dev);
2592 if (!state)
2593 return -ENOMEM;
2594
2595 /* ->set_property is always called with all locks held. */
2596 state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
2597retry:
2598 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2599 if (IS_ERR(crtc_state)) {
2600 ret = PTR_ERR(crtc_state);
2601 goto fail;
2602 }
2603
Rob Clark40ecc692014-12-18 16:01:46 -05002604 ret = drm_atomic_crtc_set_property(crtc, crtc_state,
2605 property, val);
Daniel Vetter042652e2014-07-27 13:46:52 +02002606 if (ret)
2607 goto fail;
2608
2609 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002610fail:
2611 if (ret == -EDEADLK)
2612 goto backoff;
2613
Chris Wilson08536952016-10-14 13:18:18 +01002614 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002615 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002616
Daniel Vetter042652e2014-07-27 13:46:52 +02002617backoff:
Daniel Vetter042652e2014-07-27 13:46:52 +02002618 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002619 drm_atomic_legacy_backoff(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002620
2621 goto retry;
2622}
2623EXPORT_SYMBOL(drm_atomic_helper_crtc_set_property);
2624
2625/**
Laurent Pinchart7f500022015-02-23 02:50:23 +02002626 * drm_atomic_helper_plane_set_property - helper for plane properties
Daniel Vetter042652e2014-07-27 13:46:52 +02002627 * @plane: DRM plane
2628 * @property: DRM property
2629 * @val: value of property
2630 *
Laurent Pinchart7f500022015-02-23 02:50:23 +02002631 * Provides a default plane set_property handler using the atomic driver
2632 * interface.
Daniel Vetter042652e2014-07-27 13:46:52 +02002633 *
2634 * RETURNS:
2635 * Zero on success, error code on failure
2636 */
2637int
2638drm_atomic_helper_plane_set_property(struct drm_plane *plane,
2639 struct drm_property *property,
2640 uint64_t val)
2641{
2642 struct drm_atomic_state *state;
2643 struct drm_plane_state *plane_state;
2644 int ret = 0;
2645
2646 state = drm_atomic_state_alloc(plane->dev);
2647 if (!state)
2648 return -ENOMEM;
2649
2650 /* ->set_property is always called with all locks held. */
2651 state->acquire_ctx = plane->dev->mode_config.acquire_ctx;
2652retry:
2653 plane_state = drm_atomic_get_plane_state(state, plane);
2654 if (IS_ERR(plane_state)) {
2655 ret = PTR_ERR(plane_state);
2656 goto fail;
2657 }
2658
Rob Clark40ecc692014-12-18 16:01:46 -05002659 ret = drm_atomic_plane_set_property(plane, plane_state,
2660 property, val);
Daniel Vetter042652e2014-07-27 13:46:52 +02002661 if (ret)
2662 goto fail;
2663
2664 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002665fail:
2666 if (ret == -EDEADLK)
2667 goto backoff;
2668
Chris Wilson08536952016-10-14 13:18:18 +01002669 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002670 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002671
Daniel Vetter042652e2014-07-27 13:46:52 +02002672backoff:
Daniel Vetter042652e2014-07-27 13:46:52 +02002673 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002674 drm_atomic_legacy_backoff(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002675
2676 goto retry;
2677}
2678EXPORT_SYMBOL(drm_atomic_helper_plane_set_property);
2679
2680/**
Laurent Pinchart7f500022015-02-23 02:50:23 +02002681 * drm_atomic_helper_connector_set_property - helper for connector properties
Daniel Vetter042652e2014-07-27 13:46:52 +02002682 * @connector: DRM connector
2683 * @property: DRM property
2684 * @val: value of property
2685 *
Laurent Pinchart7f500022015-02-23 02:50:23 +02002686 * Provides a default connector set_property handler using the atomic driver
2687 * interface.
Daniel Vetter042652e2014-07-27 13:46:52 +02002688 *
2689 * RETURNS:
2690 * Zero on success, error code on failure
2691 */
2692int
2693drm_atomic_helper_connector_set_property(struct drm_connector *connector,
2694 struct drm_property *property,
2695 uint64_t val)
2696{
2697 struct drm_atomic_state *state;
2698 struct drm_connector_state *connector_state;
2699 int ret = 0;
2700
2701 state = drm_atomic_state_alloc(connector->dev);
2702 if (!state)
2703 return -ENOMEM;
2704
2705 /* ->set_property is always called with all locks held. */
2706 state->acquire_ctx = connector->dev->mode_config.acquire_ctx;
2707retry:
2708 connector_state = drm_atomic_get_connector_state(state, connector);
2709 if (IS_ERR(connector_state)) {
2710 ret = PTR_ERR(connector_state);
2711 goto fail;
2712 }
2713
Rob Clark40ecc692014-12-18 16:01:46 -05002714 ret = drm_atomic_connector_set_property(connector, connector_state,
2715 property, val);
Daniel Vetter042652e2014-07-27 13:46:52 +02002716 if (ret)
2717 goto fail;
2718
2719 ret = drm_atomic_commit(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002720fail:
2721 if (ret == -EDEADLK)
2722 goto backoff;
2723
Chris Wilson08536952016-10-14 13:18:18 +01002724 drm_atomic_state_put(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002725 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002726
Daniel Vetter042652e2014-07-27 13:46:52 +02002727backoff:
Daniel Vetter042652e2014-07-27 13:46:52 +02002728 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002729 drm_atomic_legacy_backoff(state);
Daniel Vetter042652e2014-07-27 13:46:52 +02002730
2731 goto retry;
2732}
2733EXPORT_SYMBOL(drm_atomic_helper_connector_set_property);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002734
2735/**
2736 * drm_atomic_helper_page_flip - execute a legacy page flip
2737 * @crtc: DRM crtc
2738 * @fb: DRM framebuffer
2739 * @event: optional DRM event to signal upon completion
2740 * @flags: flip flags for non-vblank sync'ed updates
2741 *
2742 * Provides a default page flip implementation using the atomic driver interface.
2743 *
2744 * Note that for now so called async page flips (i.e. updates which are not
2745 * synchronized to vblank) are not supported, since the atomic interfaces have
2746 * no provisions for this yet.
2747 *
2748 * Returns:
2749 * Returns 0 on success, negative errno numbers on failure.
2750 */
2751int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
2752 struct drm_framebuffer *fb,
2753 struct drm_pending_vblank_event *event,
2754 uint32_t flags)
2755{
2756 struct drm_plane *plane = crtc->primary;
2757 struct drm_atomic_state *state;
2758 struct drm_plane_state *plane_state;
2759 struct drm_crtc_state *crtc_state;
2760 int ret = 0;
2761
2762 if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
2763 return -EINVAL;
2764
2765 state = drm_atomic_state_alloc(plane->dev);
2766 if (!state)
2767 return -ENOMEM;
2768
2769 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2770retry:
2771 crtc_state = drm_atomic_get_crtc_state(state, crtc);
2772 if (IS_ERR(crtc_state)) {
2773 ret = PTR_ERR(crtc_state);
2774 goto fail;
2775 }
2776 crtc_state->event = event;
2777
2778 plane_state = drm_atomic_get_plane_state(state, plane);
2779 if (IS_ERR(plane_state)) {
2780 ret = PTR_ERR(plane_state);
2781 goto fail;
2782 }
2783
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01002784 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002785 if (ret != 0)
2786 goto fail;
Daniel Vetter321ebf02014-11-04 22:57:27 +01002787 drm_atomic_set_fb_for_plane(plane_state, fb);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002788
Daniel Vetter4cba6852015-12-08 09:49:20 +01002789 /* Make sure we don't accidentally do a full modeset. */
2790 state->allow_modeset = false;
2791 if (!crtc_state->active) {
2792 DRM_DEBUG_ATOMIC("[CRTC:%d] disabled, rejecting legacy flip\n",
2793 crtc->base.id);
2794 ret = -EINVAL;
2795 goto fail;
2796 }
2797
Maarten Lankhorstb837ba02016-04-26 16:11:35 +02002798 ret = drm_atomic_nonblocking_commit(state);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002799fail:
2800 if (ret == -EDEADLK)
2801 goto backoff;
2802
Chris Wilson08536952016-10-14 13:18:18 +01002803 drm_atomic_state_put(state);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002804 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002805
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002806backoff:
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002807 drm_atomic_state_clear(state);
Daniel Vetter6f75cea2014-11-19 18:38:07 +01002808 drm_atomic_legacy_backoff(state);
Daniel Vetter8bc0f312014-07-27 18:42:37 +02002809
2810 /*
2811 * Someone might have exchanged the framebuffer while we dropped locks
2812 * in the backoff code. We need to fix up the fb refcount tracking the
2813 * core does for us.
2814 */
2815 plane->old_fb = plane->fb;
2816
2817 goto retry;
2818}
2819EXPORT_SYMBOL(drm_atomic_helper_page_flip);
Daniel Vetterd4617012014-11-03 15:56:43 +01002820
2821/**
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002822 * drm_atomic_helper_connector_dpms() - connector dpms helper implementation
2823 * @connector: affected connector
2824 * @mode: DPMS mode
2825 *
2826 * This is the main helper function provided by the atomic helper framework for
2827 * implementing the legacy DPMS connector interface. It computes the new desired
2828 * ->active state for the corresponding CRTC (if the connector is enabled) and
Daniel Vetter2e7a5702016-06-01 23:40:36 +02002829 * updates it.
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002830 *
2831 * Returns:
2832 * Returns 0 on success, negative errno numbers on failure.
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002833 */
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002834int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
2835 int mode)
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002836{
2837 struct drm_mode_config *config = &connector->dev->mode_config;
2838 struct drm_atomic_state *state;
2839 struct drm_crtc_state *crtc_state;
2840 struct drm_crtc *crtc;
2841 struct drm_connector *tmp_connector;
2842 int ret;
2843 bool active = false;
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002844 int old_mode = connector->dpms;
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002845
2846 if (mode != DRM_MODE_DPMS_ON)
2847 mode = DRM_MODE_DPMS_OFF;
2848
2849 connector->dpms = mode;
2850 crtc = connector->state->crtc;
2851
2852 if (!crtc)
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002853 return 0;
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002854
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002855 state = drm_atomic_state_alloc(connector->dev);
2856 if (!state)
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002857 return -ENOMEM;
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002858
2859 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
2860retry:
2861 crtc_state = drm_atomic_get_crtc_state(state, crtc);
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002862 if (IS_ERR(crtc_state)) {
2863 ret = PTR_ERR(crtc_state);
2864 goto fail;
2865 }
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002866
2867 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
2868
Daniel Vetter9a9f5ce2015-07-09 23:44:34 +02002869 drm_for_each_connector(tmp_connector, connector->dev) {
John Hunter0388df02015-03-17 15:30:28 +08002870 if (tmp_connector->state->crtc != crtc)
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002871 continue;
2872
John Hunter0388df02015-03-17 15:30:28 +08002873 if (tmp_connector->dpms == DRM_MODE_DPMS_ON) {
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002874 active = true;
2875 break;
2876 }
2877 }
2878 crtc_state->active = active;
2879
2880 ret = drm_atomic_commit(state);
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002881fail:
2882 if (ret == -EDEADLK)
2883 goto backoff;
2884
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002885 connector->dpms = old_mode;
Chris Wilson08536952016-10-14 13:18:18 +01002886 drm_atomic_state_put(state);
Maarten Lankhorst9a69a9a2015-07-21 11:34:55 +02002887 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01002888
Daniel Vetterb486e0e2015-01-22 18:53:05 +01002889backoff:
2890 drm_atomic_state_clear(state);
2891 drm_atomic_legacy_backoff(state);
2892
2893 goto retry;
2894}
2895EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
2896
2897/**
Noralf Trønnes9ecb5492016-05-11 18:09:21 +02002898 * drm_atomic_helper_best_encoder - Helper for &drm_connector_helper_funcs
2899 * ->best_encoder callback
2900 * @connector: Connector control structure
2901 *
2902 * This is a &drm_connector_helper_funcs ->best_encoder callback helper for
2903 * connectors that support exactly 1 encoder, statically determined at driver
2904 * init time.
2905 */
2906struct drm_encoder *
2907drm_atomic_helper_best_encoder(struct drm_connector *connector)
2908{
2909 WARN_ON(connector->encoder_ids[1]);
2910 return drm_encoder_find(connector->dev, connector->encoder_ids[0]);
2911}
2912EXPORT_SYMBOL(drm_atomic_helper_best_encoder);
2913
2914/**
Daniel Vetter3150c7d2014-11-06 20:53:29 +01002915 * DOC: atomic state reset and initialization
2916 *
2917 * Both the drm core and the atomic helpers assume that there is always the full
2918 * and correct atomic software state for all connectors, CRTCs and planes
2919 * available. Which is a bit a problem on driver load and also after system
2920 * suspend. One way to solve this is to have a hardware state read-out
2921 * infrastructure which reconstructs the full software state (e.g. the i915
2922 * driver).
2923 *
2924 * The simpler solution is to just reset the software state to everything off,
2925 * which is easiest to do by calling drm_mode_config_reset(). To facilitate this
2926 * the atomic helpers provide default reset implementations for all hooks.
Daniel Vetter7f8ee3e2015-12-04 09:46:06 +01002927 *
2928 * On the upside the precise state tracking of atomic simplifies system suspend
2929 * and resume a lot. For drivers using drm_mode_config_reset() a complete recipe
2930 * is implemented in drm_atomic_helper_suspend() and drm_atomic_helper_resume().
2931 * For other drivers the building blocks are split out, see the documentation
2932 * for these functions.
Daniel Vetter3150c7d2014-11-06 20:53:29 +01002933 */
2934
2935/**
Daniel Vetterd4617012014-11-03 15:56:43 +01002936 * drm_atomic_helper_crtc_reset - default ->reset hook for CRTCs
2937 * @crtc: drm CRTC
2938 *
2939 * Resets the atomic state for @crtc by freeing the state pointer (which might
2940 * be NULL, e.g. at driver load time) and allocating a new empty state object.
2941 */
2942void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
2943{
Daniel Vetterb0b55112016-04-22 22:10:29 +02002944 if (crtc->state)
Daniel Vetterec2dc6a2016-05-09 16:34:09 +02002945 __drm_atomic_helper_crtc_destroy_state(crtc->state);
Daniel Vetterb0b55112016-04-22 22:10:29 +02002946
Daniel Vetterd4617012014-11-03 15:56:43 +01002947 kfree(crtc->state);
2948 crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01002949
2950 if (crtc->state)
2951 crtc->state->crtc = crtc;
Daniel Vetterd4617012014-11-03 15:56:43 +01002952}
2953EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);
2954
2955/**
Thierry Redingf5e78402015-01-28 14:54:32 +01002956 * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state
2957 * @crtc: CRTC object
2958 * @state: atomic CRTC state
2959 *
2960 * Copies atomic state from a CRTC's current state and resets inferred values.
2961 * This is useful for drivers that subclass the CRTC state.
2962 */
2963void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
2964 struct drm_crtc_state *state)
2965{
2966 memcpy(state, crtc->state, sizeof(*state));
2967
Daniel Stone99cf4a22015-05-25 19:11:51 +01002968 if (state->mode_blob)
2969 drm_property_reference_blob(state->mode_blob);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00002970 if (state->degamma_lut)
2971 drm_property_reference_blob(state->degamma_lut);
2972 if (state->ctm)
2973 drm_property_reference_blob(state->ctm);
2974 if (state->gamma_lut)
2975 drm_property_reference_blob(state->gamma_lut);
Thierry Redingf5e78402015-01-28 14:54:32 +01002976 state->mode_changed = false;
2977 state->active_changed = false;
2978 state->planes_changed = false;
Maarten Lankhorstfc596662015-07-21 13:28:57 +02002979 state->connectors_changed = false;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00002980 state->color_mgmt_changed = false;
Marek Szyprowski44d1240d2016-06-13 11:11:26 +02002981 state->zpos_changed = false;
Thierry Redingf5e78402015-01-28 14:54:32 +01002982 state->event = NULL;
2983}
2984EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
2985
2986/**
Daniel Vetterd4617012014-11-03 15:56:43 +01002987 * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook
2988 * @crtc: drm CRTC
2989 *
2990 * Default CRTC state duplicate hook for drivers which don't have their own
2991 * subclassed CRTC state structure.
2992 */
2993struct drm_crtc_state *
2994drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc)
2995{
2996 struct drm_crtc_state *state;
2997
2998 if (WARN_ON(!crtc->state))
2999 return NULL;
3000
Thierry Redingf5e78402015-01-28 14:54:32 +01003001 state = kmalloc(sizeof(*state), GFP_KERNEL);
3002 if (state)
3003 __drm_atomic_helper_crtc_duplicate_state(crtc, state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003004
3005 return state;
3006}
3007EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
3008
3009/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003010 * __drm_atomic_helper_crtc_destroy_state - release CRTC state
Thierry Redingf5e78402015-01-28 14:54:32 +01003011 * @state: CRTC state object to release
3012 *
3013 * Releases all resources stored in the CRTC state without actually freeing
3014 * the memory of the CRTC state. This is useful for drivers that subclass the
3015 * CRTC state.
3016 */
Daniel Vetterec2dc6a2016-05-09 16:34:09 +02003017void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state)
Thierry Redingf5e78402015-01-28 14:54:32 +01003018{
Markus Elfring5f911902015-11-06 12:03:46 +01003019 drm_property_unreference_blob(state->mode_blob);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003020 drm_property_unreference_blob(state->degamma_lut);
3021 drm_property_unreference_blob(state->ctm);
3022 drm_property_unreference_blob(state->gamma_lut);
Thierry Redingf5e78402015-01-28 14:54:32 +01003023}
3024EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
3025
3026/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003027 * drm_atomic_helper_crtc_destroy_state - default state destroy hook
3028 * @crtc: drm CRTC
3029 * @state: CRTC state object to release
3030 *
3031 * Default CRTC state destroy hook for drivers which don't have their own
3032 * subclassed CRTC state structure.
3033 */
3034void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
3035 struct drm_crtc_state *state)
3036{
Daniel Vetterec2dc6a2016-05-09 16:34:09 +02003037 __drm_atomic_helper_crtc_destroy_state(state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003038 kfree(state);
3039}
3040EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
3041
3042/**
3043 * drm_atomic_helper_plane_reset - default ->reset hook for planes
3044 * @plane: drm plane
3045 *
3046 * Resets the atomic state for @plane by freeing the state pointer (which might
3047 * be NULL, e.g. at driver load time) and allocating a new empty state object.
3048 */
3049void drm_atomic_helper_plane_reset(struct drm_plane *plane)
3050{
Daniel Vetterb0b55112016-04-22 22:10:29 +02003051 if (plane->state)
Daniel Vetter2f701692016-05-09 16:34:10 +02003052 __drm_atomic_helper_plane_destroy_state(plane->state);
Daniel Vetter321ebf02014-11-04 22:57:27 +01003053
Daniel Vetterd4617012014-11-03 15:56:43 +01003054 kfree(plane->state);
3055 plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003056
Marek Szyprowski25aaa3a2016-01-19 09:26:48 +01003057 if (plane->state) {
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003058 plane->state->plane = plane;
Joonas Lahtinen31ad61e2016-07-29 08:50:05 +03003059 plane->state->rotation = DRM_ROTATE_0;
Marek Szyprowski25aaa3a2016-01-19 09:26:48 +01003060 }
Daniel Vetterd4617012014-11-03 15:56:43 +01003061}
3062EXPORT_SYMBOL(drm_atomic_helper_plane_reset);
3063
3064/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003065 * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state
3066 * @plane: plane object
3067 * @state: atomic plane state
3068 *
3069 * Copies atomic state from a plane's current state. This is useful for
3070 * drivers that subclass the plane state.
3071 */
3072void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
3073 struct drm_plane_state *state)
3074{
3075 memcpy(state, plane->state, sizeof(*state));
3076
3077 if (state->fb)
3078 drm_framebuffer_reference(state->fb);
3079}
3080EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
3081
3082/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003083 * drm_atomic_helper_plane_duplicate_state - default state duplicate hook
3084 * @plane: drm plane
3085 *
3086 * Default plane state duplicate hook for drivers which don't have their own
3087 * subclassed plane state structure.
3088 */
3089struct drm_plane_state *
3090drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane)
3091{
Daniel Vetter321ebf02014-11-04 22:57:27 +01003092 struct drm_plane_state *state;
3093
Daniel Vetterd4617012014-11-03 15:56:43 +01003094 if (WARN_ON(!plane->state))
3095 return NULL;
3096
Thierry Redingf5e78402015-01-28 14:54:32 +01003097 state = kmalloc(sizeof(*state), GFP_KERNEL);
3098 if (state)
3099 __drm_atomic_helper_plane_duplicate_state(plane, state);
Daniel Vetter321ebf02014-11-04 22:57:27 +01003100
3101 return state;
Daniel Vetterd4617012014-11-03 15:56:43 +01003102}
3103EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
3104
3105/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003106 * __drm_atomic_helper_plane_destroy_state - release plane state
Thierry Redingf5e78402015-01-28 14:54:32 +01003107 * @state: plane state object to release
3108 *
3109 * Releases all resources stored in the plane state without actually freeing
3110 * the memory of the plane state. This is useful for drivers that subclass the
3111 * plane state.
3112 */
Daniel Vetter2f701692016-05-09 16:34:10 +02003113void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
Thierry Redingf5e78402015-01-28 14:54:32 +01003114{
3115 if (state->fb)
3116 drm_framebuffer_unreference(state->fb);
3117}
3118EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
3119
3120/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003121 * drm_atomic_helper_plane_destroy_state - default state destroy hook
3122 * @plane: drm plane
3123 * @state: plane state object to release
3124 *
3125 * Default plane state destroy hook for drivers which don't have their own
3126 * subclassed plane state structure.
3127 */
3128void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
Daniel Vetter321ebf02014-11-04 22:57:27 +01003129 struct drm_plane_state *state)
Daniel Vetterd4617012014-11-03 15:56:43 +01003130{
Daniel Vetter2f701692016-05-09 16:34:10 +02003131 __drm_atomic_helper_plane_destroy_state(state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003132 kfree(state);
3133}
3134EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
3135
3136/**
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003137 * __drm_atomic_helper_connector_reset - reset state on connector
3138 * @connector: drm connector
3139 * @conn_state: connector state to assign
3140 *
3141 * Initializes the newly allocated @conn_state and assigns it to
3142 * #connector ->state, usually required when initializing the drivers
3143 * or when called from the ->reset hook.
3144 *
3145 * This is useful for drivers that subclass the connector state.
3146 */
3147void
3148__drm_atomic_helper_connector_reset(struct drm_connector *connector,
3149 struct drm_connector_state *conn_state)
3150{
3151 if (conn_state)
3152 conn_state->connector = connector;
3153
3154 connector->state = conn_state;
3155}
3156EXPORT_SYMBOL(__drm_atomic_helper_connector_reset);
3157
3158/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003159 * drm_atomic_helper_connector_reset - default ->reset hook for connectors
3160 * @connector: drm connector
3161 *
3162 * Resets the atomic state for @connector by freeing the state pointer (which
3163 * might be NULL, e.g. at driver load time) and allocating a new empty state
3164 * object.
3165 */
3166void drm_atomic_helper_connector_reset(struct drm_connector *connector)
3167{
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003168 struct drm_connector_state *conn_state =
3169 kzalloc(sizeof(*conn_state), GFP_KERNEL);
Daniel Vetter07cc0ef2014-11-27 15:49:39 +01003170
Daniel Vetterb0b55112016-04-22 22:10:29 +02003171 if (connector->state)
Daniel Vetterfabd9102016-05-09 16:34:11 +02003172 __drm_atomic_helper_connector_destroy_state(connector->state);
Daniel Vetterb0b55112016-04-22 22:10:29 +02003173
Maarten Lankhorst4cd39912016-01-04 12:53:16 +01003174 kfree(connector->state);
3175 __drm_atomic_helper_connector_reset(connector, conn_state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003176}
3177EXPORT_SYMBOL(drm_atomic_helper_connector_reset);
3178
3179/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003180 * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
3181 * @connector: connector object
3182 * @state: atomic connector state
3183 *
3184 * Copies atomic state from a connector's current state. This is useful for
3185 * drivers that subclass the connector state.
3186 */
3187void
3188__drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
3189 struct drm_connector_state *state)
3190{
3191 memcpy(state, connector->state, sizeof(*state));
Dave Airlied2307de2016-04-27 11:27:39 +10003192 if (state->crtc)
3193 drm_connector_reference(connector);
Thierry Redingf5e78402015-01-28 14:54:32 +01003194}
3195EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
3196
3197/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003198 * drm_atomic_helper_connector_duplicate_state - default state duplicate hook
3199 * @connector: drm connector
3200 *
3201 * Default connector state duplicate hook for drivers which don't have their own
3202 * subclassed connector state structure.
3203 */
3204struct drm_connector_state *
3205drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
3206{
Thierry Redingf5e78402015-01-28 14:54:32 +01003207 struct drm_connector_state *state;
3208
Daniel Vetterd4617012014-11-03 15:56:43 +01003209 if (WARN_ON(!connector->state))
3210 return NULL;
3211
Thierry Redingf5e78402015-01-28 14:54:32 +01003212 state = kmalloc(sizeof(*state), GFP_KERNEL);
3213 if (state)
3214 __drm_atomic_helper_connector_duplicate_state(connector, state);
3215
3216 return state;
Daniel Vetterd4617012014-11-03 15:56:43 +01003217}
3218EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
3219
3220/**
Thierry Reding397fd772015-09-08 15:00:45 +02003221 * drm_atomic_helper_duplicate_state - duplicate an atomic state object
3222 * @dev: DRM device
3223 * @ctx: lock acquisition context
3224 *
3225 * Makes a copy of the current atomic state by looping over all objects and
Thierry Reding14942762015-12-02 17:50:04 +01003226 * duplicating their respective states. This is used for example by suspend/
3227 * resume support code to save the state prior to suspend such that it can
3228 * be restored upon resume.
Thierry Reding397fd772015-09-08 15:00:45 +02003229 *
3230 * Note that this treats atomic state as persistent between save and restore.
3231 * Drivers must make sure that this is possible and won't result in confusion
3232 * or erroneous behaviour.
3233 *
3234 * Note that if callers haven't already acquired all modeset locks this might
3235 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
3236 *
3237 * Returns:
3238 * A pointer to the copy of the atomic state object on success or an
3239 * ERR_PTR()-encoded error code on failure.
Thierry Reding14942762015-12-02 17:50:04 +01003240 *
3241 * See also:
3242 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
Thierry Reding397fd772015-09-08 15:00:45 +02003243 */
3244struct drm_atomic_state *
3245drm_atomic_helper_duplicate_state(struct drm_device *dev,
3246 struct drm_modeset_acquire_ctx *ctx)
3247{
3248 struct drm_atomic_state *state;
3249 struct drm_connector *conn;
3250 struct drm_plane *plane;
3251 struct drm_crtc *crtc;
3252 int err = 0;
3253
3254 state = drm_atomic_state_alloc(dev);
3255 if (!state)
3256 return ERR_PTR(-ENOMEM);
3257
3258 state->acquire_ctx = ctx;
3259
3260 drm_for_each_crtc(crtc, dev) {
3261 struct drm_crtc_state *crtc_state;
3262
3263 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3264 if (IS_ERR(crtc_state)) {
3265 err = PTR_ERR(crtc_state);
3266 goto free;
3267 }
3268 }
3269
3270 drm_for_each_plane(plane, dev) {
3271 struct drm_plane_state *plane_state;
3272
3273 plane_state = drm_atomic_get_plane_state(state, plane);
3274 if (IS_ERR(plane_state)) {
3275 err = PTR_ERR(plane_state);
3276 goto free;
3277 }
3278 }
3279
3280 drm_for_each_connector(conn, dev) {
3281 struct drm_connector_state *conn_state;
3282
3283 conn_state = drm_atomic_get_connector_state(state, conn);
3284 if (IS_ERR(conn_state)) {
3285 err = PTR_ERR(conn_state);
3286 goto free;
3287 }
3288 }
3289
3290 /* clear the acquire context so that it isn't accidentally reused */
3291 state->acquire_ctx = NULL;
3292
3293free:
3294 if (err < 0) {
Chris Wilson08536952016-10-14 13:18:18 +01003295 drm_atomic_state_put(state);
Thierry Reding397fd772015-09-08 15:00:45 +02003296 state = ERR_PTR(err);
3297 }
3298
3299 return state;
3300}
3301EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
3302
3303/**
Thierry Redingf5e78402015-01-28 14:54:32 +01003304 * __drm_atomic_helper_connector_destroy_state - release connector state
Thierry Redingf5e78402015-01-28 14:54:32 +01003305 * @state: connector state object to release
3306 *
3307 * Releases all resources stored in the connector state without actually
3308 * freeing the memory of the connector state. This is useful for drivers that
3309 * subclass the connector state.
3310 */
3311void
Daniel Vetterfabd9102016-05-09 16:34:11 +02003312__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
Thierry Redingf5e78402015-01-28 14:54:32 +01003313{
3314 /*
3315 * This is currently a placeholder so that drivers that subclass the
3316 * state will automatically do the right thing if code is ever added
3317 * to this function.
3318 */
Dave Airlied2307de2016-04-27 11:27:39 +10003319 if (state->crtc)
3320 drm_connector_unreference(state->connector);
Thierry Redingf5e78402015-01-28 14:54:32 +01003321}
3322EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
3323
3324/**
Daniel Vetterd4617012014-11-03 15:56:43 +01003325 * drm_atomic_helper_connector_destroy_state - default state destroy hook
3326 * @connector: drm connector
3327 * @state: connector state object to release
3328 *
3329 * Default connector state destroy hook for drivers which don't have their own
3330 * subclassed connector state structure.
3331 */
3332void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
3333 struct drm_connector_state *state)
3334{
Daniel Vetterfabd9102016-05-09 16:34:11 +02003335 __drm_atomic_helper_connector_destroy_state(state);
Daniel Vetterd4617012014-11-03 15:56:43 +01003336 kfree(state);
3337}
3338EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003339
3340/**
3341 * drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
3342 * @crtc: CRTC object
3343 * @red: red correction table
3344 * @green: green correction table
3345 * @blue: green correction table
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003346 * @size: size of the tables
3347 *
3348 * Implements support for legacy gamma correction table for drivers
3349 * that support color management through the DEGAMMA_LUT/GAMMA_LUT
3350 * properties.
3351 */
Maarten Lankhorst7ea77282016-06-07 12:49:30 +02003352int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
3353 u16 *red, u16 *green, u16 *blue,
3354 uint32_t size)
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003355{
3356 struct drm_device *dev = crtc->dev;
3357 struct drm_mode_config *config = &dev->mode_config;
3358 struct drm_atomic_state *state;
3359 struct drm_crtc_state *crtc_state;
3360 struct drm_property_blob *blob = NULL;
3361 struct drm_color_lut *blob_data;
3362 int i, ret = 0;
3363
3364 state = drm_atomic_state_alloc(crtc->dev);
3365 if (!state)
Maarten Lankhorst7ea77282016-06-07 12:49:30 +02003366 return -ENOMEM;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003367
3368 blob = drm_property_create_blob(dev,
3369 sizeof(struct drm_color_lut) * size,
3370 NULL);
Lionel Landwerlin562c5b42016-03-10 12:04:21 +00003371 if (IS_ERR(blob)) {
3372 ret = PTR_ERR(blob);
Lionel Landwerlinc1f415c2016-03-11 12:17:26 +00003373 blob = NULL;
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003374 goto fail;
3375 }
3376
3377 /* Prepare GAMMA_LUT with the legacy values. */
3378 blob_data = (struct drm_color_lut *) blob->data;
3379 for (i = 0; i < size; i++) {
3380 blob_data[i].red = red[i];
3381 blob_data[i].green = green[i];
3382 blob_data[i].blue = blue[i];
3383 }
3384
3385 state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
3386retry:
3387 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3388 if (IS_ERR(crtc_state)) {
3389 ret = PTR_ERR(crtc_state);
3390 goto fail;
3391 }
3392
3393 /* Reset DEGAMMA_LUT and CTM properties. */
3394 ret = drm_atomic_crtc_set_property(crtc, crtc_state,
3395 config->degamma_lut_property, 0);
3396 if (ret)
3397 goto fail;
3398
3399 ret = drm_atomic_crtc_set_property(crtc, crtc_state,
3400 config->ctm_property, 0);
3401 if (ret)
3402 goto fail;
3403
3404 ret = drm_atomic_crtc_set_property(crtc, crtc_state,
3405 config->gamma_lut_property, blob->base.id);
3406 if (ret)
3407 goto fail;
3408
3409 ret = drm_atomic_commit(state);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003410fail:
3411 if (ret == -EDEADLK)
3412 goto backoff;
3413
Chris Wilson08536952016-10-14 13:18:18 +01003414 drm_atomic_state_put(state);
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003415 drm_property_unreference_blob(blob);
Maarten Lankhorst7ea77282016-06-07 12:49:30 +02003416 return ret;
Chris Wilson08536952016-10-14 13:18:18 +01003417
Lionel Landwerlin5488dc12016-02-26 17:05:00 +00003418backoff:
3419 drm_atomic_state_clear(state);
3420 drm_atomic_legacy_backoff(state);
3421
3422 goto retry;
3423}
3424EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);