0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include <linux/dma-fence.h>
0029 #include <linux/ktime.h>
0030
0031 #include <drm/drm_atomic.h>
0032 #include <drm/drm_atomic_helper.h>
0033 #include <drm/drm_atomic_uapi.h>
0034 #include <drm/drm_blend.h>
0035 #include <drm/drm_bridge.h>
0036 #include <drm/drm_damage_helper.h>
0037 #include <drm/drm_device.h>
0038 #include <drm/drm_drv.h>
0039 #include <drm/drm_framebuffer.h>
0040 #include <drm/drm_gem_atomic_helper.h>
0041 #include <drm/drm_plane_helper.h>
0042 #include <drm/drm_print.h>
0043 #include <drm/drm_self_refresh_helper.h>
0044 #include <drm/drm_vblank.h>
0045 #include <drm/drm_writeback.h>
0046
0047 #include "drm_crtc_helper_internal.h"
0048 #include "drm_crtc_internal.h"
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 static void
0078 drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
0079 struct drm_plane_state *old_plane_state,
0080 struct drm_plane_state *plane_state,
0081 struct drm_plane *plane)
0082 {
0083 struct drm_crtc_state *crtc_state;
0084
0085 if (old_plane_state->crtc) {
0086 crtc_state = drm_atomic_get_new_crtc_state(state,
0087 old_plane_state->crtc);
0088
0089 if (WARN_ON(!crtc_state))
0090 return;
0091
0092 crtc_state->planes_changed = true;
0093 }
0094
0095 if (plane_state->crtc) {
0096 crtc_state = drm_atomic_get_new_crtc_state(state, plane_state->crtc);
0097
0098 if (WARN_ON(!crtc_state))
0099 return;
0100
0101 crtc_state->planes_changed = true;
0102 }
0103 }
0104
0105 static int handle_conflicting_encoders(struct drm_atomic_state *state,
0106 bool disable_conflicting_encoders)
0107 {
0108 struct drm_connector_state *new_conn_state;
0109 struct drm_connector *connector;
0110 struct drm_connector_list_iter conn_iter;
0111 struct drm_encoder *encoder;
0112 unsigned int encoder_mask = 0;
0113 int i, ret = 0;
0114
0115
0116
0117
0118
0119
0120 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
0121 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
0122 struct drm_encoder *new_encoder;
0123
0124 if (!new_conn_state->crtc)
0125 continue;
0126
0127 if (funcs->atomic_best_encoder)
0128 new_encoder = funcs->atomic_best_encoder(connector,
0129 state);
0130 else if (funcs->best_encoder)
0131 new_encoder = funcs->best_encoder(connector);
0132 else
0133 new_encoder = drm_connector_get_single_encoder(connector);
0134
0135 if (new_encoder) {
0136 if (encoder_mask & drm_encoder_mask(new_encoder)) {
0137 drm_dbg_atomic(connector->dev,
0138 "[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
0139 new_encoder->base.id, new_encoder->name,
0140 connector->base.id, connector->name);
0141
0142 return -EINVAL;
0143 }
0144
0145 encoder_mask |= drm_encoder_mask(new_encoder);
0146 }
0147 }
0148
0149 if (!encoder_mask)
0150 return 0;
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 drm_connector_list_iter_begin(state->dev, &conn_iter);
0164 drm_for_each_connector_iter(connector, &conn_iter) {
0165 struct drm_crtc_state *crtc_state;
0166
0167 if (drm_atomic_get_new_connector_state(state, connector))
0168 continue;
0169
0170 encoder = connector->state->best_encoder;
0171 if (!encoder || !(encoder_mask & drm_encoder_mask(encoder)))
0172 continue;
0173
0174 if (!disable_conflicting_encoders) {
0175 drm_dbg_atomic(connector->dev,
0176 "[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
0177 encoder->base.id, encoder->name,
0178 connector->state->crtc->base.id,
0179 connector->state->crtc->name,
0180 connector->base.id, connector->name);
0181 ret = -EINVAL;
0182 goto out;
0183 }
0184
0185 new_conn_state = drm_atomic_get_connector_state(state, connector);
0186 if (IS_ERR(new_conn_state)) {
0187 ret = PTR_ERR(new_conn_state);
0188 goto out;
0189 }
0190
0191 drm_dbg_atomic(connector->dev,
0192 "[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
0193 encoder->base.id, encoder->name,
0194 new_conn_state->crtc->base.id, new_conn_state->crtc->name,
0195 connector->base.id, connector->name);
0196
0197 crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
0198
0199 ret = drm_atomic_set_crtc_for_connector(new_conn_state, NULL);
0200 if (ret)
0201 goto out;
0202
0203 if (!crtc_state->connector_mask) {
0204 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
0205 NULL);
0206 if (ret < 0)
0207 goto out;
0208
0209 crtc_state->active = false;
0210 }
0211 }
0212 out:
0213 drm_connector_list_iter_end(&conn_iter);
0214
0215 return ret;
0216 }
0217
0218 static void
0219 set_best_encoder(struct drm_atomic_state *state,
0220 struct drm_connector_state *conn_state,
0221 struct drm_encoder *encoder)
0222 {
0223 struct drm_crtc_state *crtc_state;
0224 struct drm_crtc *crtc;
0225
0226 if (conn_state->best_encoder) {
0227
0228 crtc = conn_state->connector->state->crtc;
0229
0230
0231
0232
0233
0234
0235
0236 WARN_ON(!crtc && encoder != conn_state->best_encoder);
0237 if (crtc) {
0238 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
0239
0240 crtc_state->encoder_mask &=
0241 ~drm_encoder_mask(conn_state->best_encoder);
0242 }
0243 }
0244
0245 if (encoder) {
0246 crtc = conn_state->crtc;
0247 WARN_ON(!crtc);
0248 if (crtc) {
0249 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
0250
0251 crtc_state->encoder_mask |=
0252 drm_encoder_mask(encoder);
0253 }
0254 }
0255
0256 conn_state->best_encoder = encoder;
0257 }
0258
0259 static void
0260 steal_encoder(struct drm_atomic_state *state,
0261 struct drm_encoder *encoder)
0262 {
0263 struct drm_crtc_state *crtc_state;
0264 struct drm_connector *connector;
0265 struct drm_connector_state *old_connector_state, *new_connector_state;
0266 int i;
0267
0268 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
0269 struct drm_crtc *encoder_crtc;
0270
0271 if (new_connector_state->best_encoder != encoder)
0272 continue;
0273
0274 encoder_crtc = old_connector_state->crtc;
0275
0276 drm_dbg_atomic(encoder->dev,
0277 "[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
0278 encoder->base.id, encoder->name,
0279 encoder_crtc->base.id, encoder_crtc->name);
0280
0281 set_best_encoder(state, new_connector_state, NULL);
0282
0283 crtc_state = drm_atomic_get_new_crtc_state(state, encoder_crtc);
0284 crtc_state->connectors_changed = true;
0285
0286 return;
0287 }
0288 }
0289
0290 static int
0291 update_connector_routing(struct drm_atomic_state *state,
0292 struct drm_connector *connector,
0293 struct drm_connector_state *old_connector_state,
0294 struct drm_connector_state *new_connector_state)
0295 {
0296 const struct drm_connector_helper_funcs *funcs;
0297 struct drm_encoder *new_encoder;
0298 struct drm_crtc_state *crtc_state;
0299
0300 drm_dbg_atomic(connector->dev, "Updating routing for [CONNECTOR:%d:%s]\n",
0301 connector->base.id, connector->name);
0302
0303 if (old_connector_state->crtc != new_connector_state->crtc) {
0304 if (old_connector_state->crtc) {
0305 crtc_state = drm_atomic_get_new_crtc_state(state, old_connector_state->crtc);
0306 crtc_state->connectors_changed = true;
0307 }
0308
0309 if (new_connector_state->crtc) {
0310 crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
0311 crtc_state->connectors_changed = true;
0312 }
0313 }
0314
0315 if (!new_connector_state->crtc) {
0316 drm_dbg_atomic(connector->dev, "Disabling [CONNECTOR:%d:%s]\n",
0317 connector->base.id, connector->name);
0318
0319 set_best_encoder(state, new_connector_state, NULL);
0320
0321 return 0;
0322 }
0323
0324 crtc_state = drm_atomic_get_new_crtc_state(state,
0325 new_connector_state->crtc);
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344 if (!state->duplicated && drm_connector_is_unregistered(connector) &&
0345 crtc_state->active) {
0346 drm_dbg_atomic(connector->dev,
0347 "[CONNECTOR:%d:%s] is not registered\n",
0348 connector->base.id, connector->name);
0349 return -EINVAL;
0350 }
0351
0352 funcs = connector->helper_private;
0353
0354 if (funcs->atomic_best_encoder)
0355 new_encoder = funcs->atomic_best_encoder(connector, state);
0356 else if (funcs->best_encoder)
0357 new_encoder = funcs->best_encoder(connector);
0358 else
0359 new_encoder = drm_connector_get_single_encoder(connector);
0360
0361 if (!new_encoder) {
0362 drm_dbg_atomic(connector->dev,
0363 "No suitable encoder found for [CONNECTOR:%d:%s]\n",
0364 connector->base.id, connector->name);
0365 return -EINVAL;
0366 }
0367
0368 if (!drm_encoder_crtc_ok(new_encoder, new_connector_state->crtc)) {
0369 drm_dbg_atomic(connector->dev,
0370 "[ENCODER:%d:%s] incompatible with [CRTC:%d:%s]\n",
0371 new_encoder->base.id,
0372 new_encoder->name,
0373 new_connector_state->crtc->base.id,
0374 new_connector_state->crtc->name);
0375 return -EINVAL;
0376 }
0377
0378 if (new_encoder == new_connector_state->best_encoder) {
0379 set_best_encoder(state, new_connector_state, new_encoder);
0380
0381 drm_dbg_atomic(connector->dev,
0382 "[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
0383 connector->base.id,
0384 connector->name,
0385 new_encoder->base.id,
0386 new_encoder->name,
0387 new_connector_state->crtc->base.id,
0388 new_connector_state->crtc->name);
0389
0390 return 0;
0391 }
0392
0393 steal_encoder(state, new_encoder);
0394
0395 set_best_encoder(state, new_connector_state, new_encoder);
0396
0397 crtc_state->connectors_changed = true;
0398
0399 drm_dbg_atomic(connector->dev,
0400 "[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
0401 connector->base.id,
0402 connector->name,
0403 new_encoder->base.id,
0404 new_encoder->name,
0405 new_connector_state->crtc->base.id,
0406 new_connector_state->crtc->name);
0407
0408 return 0;
0409 }
0410
0411 static int
0412 mode_fixup(struct drm_atomic_state *state)
0413 {
0414 struct drm_crtc *crtc;
0415 struct drm_crtc_state *new_crtc_state;
0416 struct drm_connector *connector;
0417 struct drm_connector_state *new_conn_state;
0418 int i;
0419 int ret;
0420
0421 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
0422 if (!new_crtc_state->mode_changed &&
0423 !new_crtc_state->connectors_changed)
0424 continue;
0425
0426 drm_mode_copy(&new_crtc_state->adjusted_mode, &new_crtc_state->mode);
0427 }
0428
0429 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
0430 const struct drm_encoder_helper_funcs *funcs;
0431 struct drm_encoder *encoder;
0432 struct drm_bridge *bridge;
0433
0434 WARN_ON(!!new_conn_state->best_encoder != !!new_conn_state->crtc);
0435
0436 if (!new_conn_state->crtc || !new_conn_state->best_encoder)
0437 continue;
0438
0439 new_crtc_state =
0440 drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
0441
0442
0443
0444
0445
0446 encoder = new_conn_state->best_encoder;
0447 funcs = encoder->helper_private;
0448
0449 bridge = drm_bridge_chain_get_first_bridge(encoder);
0450 ret = drm_atomic_bridge_chain_check(bridge,
0451 new_crtc_state,
0452 new_conn_state);
0453 if (ret) {
0454 drm_dbg_atomic(encoder->dev, "Bridge atomic check failed\n");
0455 return ret;
0456 }
0457
0458 if (funcs && funcs->atomic_check) {
0459 ret = funcs->atomic_check(encoder, new_crtc_state,
0460 new_conn_state);
0461 if (ret) {
0462 drm_dbg_atomic(encoder->dev,
0463 "[ENCODER:%d:%s] check failed\n",
0464 encoder->base.id, encoder->name);
0465 return ret;
0466 }
0467 } else if (funcs && funcs->mode_fixup) {
0468 ret = funcs->mode_fixup(encoder, &new_crtc_state->mode,
0469 &new_crtc_state->adjusted_mode);
0470 if (!ret) {
0471 drm_dbg_atomic(encoder->dev,
0472 "[ENCODER:%d:%s] fixup failed\n",
0473 encoder->base.id, encoder->name);
0474 return -EINVAL;
0475 }
0476 }
0477 }
0478
0479 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
0480 const struct drm_crtc_helper_funcs *funcs;
0481
0482 if (!new_crtc_state->enable)
0483 continue;
0484
0485 if (!new_crtc_state->mode_changed &&
0486 !new_crtc_state->connectors_changed)
0487 continue;
0488
0489 funcs = crtc->helper_private;
0490 if (!funcs || !funcs->mode_fixup)
0491 continue;
0492
0493 ret = funcs->mode_fixup(crtc, &new_crtc_state->mode,
0494 &new_crtc_state->adjusted_mode);
0495 if (!ret) {
0496 drm_dbg_atomic(crtc->dev, "[CRTC:%d:%s] fixup failed\n",
0497 crtc->base.id, crtc->name);
0498 return -EINVAL;
0499 }
0500 }
0501
0502 return 0;
0503 }
0504
0505 static enum drm_mode_status mode_valid_path(struct drm_connector *connector,
0506 struct drm_encoder *encoder,
0507 struct drm_crtc *crtc,
0508 const struct drm_display_mode *mode)
0509 {
0510 struct drm_bridge *bridge;
0511 enum drm_mode_status ret;
0512
0513 ret = drm_encoder_mode_valid(encoder, mode);
0514 if (ret != MODE_OK) {
0515 drm_dbg_atomic(encoder->dev,
0516 "[ENCODER:%d:%s] mode_valid() failed\n",
0517 encoder->base.id, encoder->name);
0518 return ret;
0519 }
0520
0521 bridge = drm_bridge_chain_get_first_bridge(encoder);
0522 ret = drm_bridge_chain_mode_valid(bridge, &connector->display_info,
0523 mode);
0524 if (ret != MODE_OK) {
0525 drm_dbg_atomic(encoder->dev, "[BRIDGE] mode_valid() failed\n");
0526 return ret;
0527 }
0528
0529 ret = drm_crtc_mode_valid(crtc, mode);
0530 if (ret != MODE_OK) {
0531 drm_dbg_atomic(encoder->dev, "[CRTC:%d:%s] mode_valid() failed\n",
0532 crtc->base.id, crtc->name);
0533 return ret;
0534 }
0535
0536 return ret;
0537 }
0538
0539 static int
0540 mode_valid(struct drm_atomic_state *state)
0541 {
0542 struct drm_connector_state *conn_state;
0543 struct drm_connector *connector;
0544 int i;
0545
0546 for_each_new_connector_in_state(state, connector, conn_state, i) {
0547 struct drm_encoder *encoder = conn_state->best_encoder;
0548 struct drm_crtc *crtc = conn_state->crtc;
0549 struct drm_crtc_state *crtc_state;
0550 enum drm_mode_status mode_status;
0551 const struct drm_display_mode *mode;
0552
0553 if (!crtc || !encoder)
0554 continue;
0555
0556 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
0557 if (!crtc_state)
0558 continue;
0559 if (!crtc_state->mode_changed && !crtc_state->connectors_changed)
0560 continue;
0561
0562 mode = &crtc_state->mode;
0563
0564 mode_status = mode_valid_path(connector, encoder, crtc, mode);
0565 if (mode_status != MODE_OK)
0566 return -EINVAL;
0567 }
0568
0569 return 0;
0570 }
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615 int
0616 drm_atomic_helper_check_modeset(struct drm_device *dev,
0617 struct drm_atomic_state *state)
0618 {
0619 struct drm_crtc *crtc;
0620 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
0621 struct drm_connector *connector;
0622 struct drm_connector_state *old_connector_state, *new_connector_state;
0623 int i, ret;
0624 unsigned int connectors_mask = 0;
0625
0626 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
0627 bool has_connectors =
0628 !!new_crtc_state->connector_mask;
0629
0630 WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
0631
0632 if (!drm_mode_equal(&old_crtc_state->mode, &new_crtc_state->mode)) {
0633 drm_dbg_atomic(dev, "[CRTC:%d:%s] mode changed\n",
0634 crtc->base.id, crtc->name);
0635 new_crtc_state->mode_changed = true;
0636 }
0637
0638 if (old_crtc_state->enable != new_crtc_state->enable) {
0639 drm_dbg_atomic(dev, "[CRTC:%d:%s] enable changed\n",
0640 crtc->base.id, crtc->name);
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650 new_crtc_state->mode_changed = true;
0651 new_crtc_state->connectors_changed = true;
0652 }
0653
0654 if (old_crtc_state->active != new_crtc_state->active) {
0655 drm_dbg_atomic(dev, "[CRTC:%d:%s] active changed\n",
0656 crtc->base.id, crtc->name);
0657 new_crtc_state->active_changed = true;
0658 }
0659
0660 if (new_crtc_state->enable != has_connectors) {
0661 drm_dbg_atomic(dev, "[CRTC:%d:%s] enabled/connectors mismatch\n",
0662 crtc->base.id, crtc->name);
0663
0664 return -EINVAL;
0665 }
0666
0667 if (drm_dev_has_vblank(dev))
0668 new_crtc_state->no_vblank = false;
0669 else
0670 new_crtc_state->no_vblank = true;
0671 }
0672
0673 ret = handle_conflicting_encoders(state, false);
0674 if (ret)
0675 return ret;
0676
0677 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
0678 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
0679
0680 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
0681
0682
0683
0684
0685
0686
0687 ret = update_connector_routing(state, connector,
0688 old_connector_state,
0689 new_connector_state);
0690 if (ret)
0691 return ret;
0692 if (old_connector_state->crtc) {
0693 new_crtc_state = drm_atomic_get_new_crtc_state(state,
0694 old_connector_state->crtc);
0695 if (old_connector_state->link_status !=
0696 new_connector_state->link_status)
0697 new_crtc_state->connectors_changed = true;
0698
0699 if (old_connector_state->max_requested_bpc !=
0700 new_connector_state->max_requested_bpc)
0701 new_crtc_state->connectors_changed = true;
0702 }
0703
0704 if (funcs->atomic_check)
0705 ret = funcs->atomic_check(connector, state);
0706 if (ret)
0707 return ret;
0708
0709 connectors_mask |= BIT(i);
0710 }
0711
0712
0713
0714
0715
0716
0717
0718 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
0719 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
0720 continue;
0721
0722 drm_dbg_atomic(dev,
0723 "[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
0724 crtc->base.id, crtc->name,
0725 new_crtc_state->enable ? 'y' : 'n',
0726 new_crtc_state->active ? 'y' : 'n');
0727
0728 ret = drm_atomic_add_affected_connectors(state, crtc);
0729 if (ret != 0)
0730 return ret;
0731
0732 ret = drm_atomic_add_affected_planes(state, crtc);
0733 if (ret != 0)
0734 return ret;
0735 }
0736
0737
0738
0739
0740
0741 for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
0742 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
0743
0744 if (connectors_mask & BIT(i))
0745 continue;
0746
0747 if (funcs->atomic_check)
0748 ret = funcs->atomic_check(connector, state);
0749 if (ret)
0750 return ret;
0751 }
0752
0753
0754
0755
0756
0757 for_each_oldnew_connector_in_state(state, connector,
0758 old_connector_state,
0759 new_connector_state, i) {
0760 struct drm_encoder *encoder;
0761
0762 encoder = old_connector_state->best_encoder;
0763 ret = drm_atomic_add_encoder_bridges(state, encoder);
0764 if (ret)
0765 return ret;
0766
0767 encoder = new_connector_state->best_encoder;
0768 ret = drm_atomic_add_encoder_bridges(state, encoder);
0769 if (ret)
0770 return ret;
0771 }
0772
0773 ret = mode_valid(state);
0774 if (ret)
0775 return ret;
0776
0777 return mode_fixup(state);
0778 }
0779 EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802 int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
0803 const struct drm_crtc_state *crtc_state,
0804 int min_scale,
0805 int max_scale,
0806 bool can_position,
0807 bool can_update_disabled)
0808 {
0809 struct drm_framebuffer *fb = plane_state->fb;
0810 struct drm_rect *src = &plane_state->src;
0811 struct drm_rect *dst = &plane_state->dst;
0812 unsigned int rotation = plane_state->rotation;
0813 struct drm_rect clip = {};
0814 int hscale, vscale;
0815
0816 WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
0817
0818 *src = drm_plane_state_src(plane_state);
0819 *dst = drm_plane_state_dest(plane_state);
0820
0821 if (!fb) {
0822 plane_state->visible = false;
0823 return 0;
0824 }
0825
0826
0827 if (WARN_ON(!plane_state->crtc)) {
0828 plane_state->visible = false;
0829 return 0;
0830 }
0831
0832 if (!crtc_state->enable && !can_update_disabled) {
0833 drm_dbg_kms(plane_state->plane->dev,
0834 "Cannot update plane of a disabled CRTC.\n");
0835 return -EINVAL;
0836 }
0837
0838 drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
0839
0840
0841 hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
0842 vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
0843 if (hscale < 0 || vscale < 0) {
0844 drm_dbg_kms(plane_state->plane->dev,
0845 "Invalid scaling of plane\n");
0846 drm_rect_debug_print("src: ", &plane_state->src, true);
0847 drm_rect_debug_print("dst: ", &plane_state->dst, false);
0848 return -ERANGE;
0849 }
0850
0851 if (crtc_state->enable)
0852 drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
0853
0854 plane_state->visible = drm_rect_clip_scaled(src, dst, &clip);
0855
0856 drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
0857
0858 if (!plane_state->visible)
0859
0860
0861
0862
0863
0864
0865
0866 return 0;
0867
0868 if (!can_position && !drm_rect_equals(dst, &clip)) {
0869 drm_dbg_kms(plane_state->plane->dev,
0870 "Plane must cover entire CRTC\n");
0871 drm_rect_debug_print("dst: ", dst, false);
0872 drm_rect_debug_print("clip: ", &clip, false);
0873 return -EINVAL;
0874 }
0875
0876 return 0;
0877 }
0878 EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898 int drm_atomic_helper_check_crtc_state(struct drm_crtc_state *crtc_state,
0899 bool can_disable_primary_planes)
0900 {
0901 struct drm_device *dev = crtc_state->crtc->dev;
0902 struct drm_atomic_state *state = crtc_state->state;
0903
0904 if (!crtc_state->enable)
0905 return 0;
0906
0907
0908 if (!can_disable_primary_planes) {
0909 bool has_primary_plane = false;
0910 struct drm_plane *plane;
0911
0912 drm_for_each_plane_mask(plane, dev, crtc_state->plane_mask) {
0913 struct drm_plane_state *plane_state;
0914
0915 if (plane->type != DRM_PLANE_TYPE_PRIMARY)
0916 continue;
0917 plane_state = drm_atomic_get_plane_state(state, plane);
0918 if (IS_ERR(plane_state))
0919 return PTR_ERR(plane_state);
0920 if (plane_state->fb && plane_state->crtc) {
0921 has_primary_plane = true;
0922 break;
0923 }
0924 }
0925 if (!has_primary_plane) {
0926 drm_dbg_kms(dev, "Cannot enable CRTC without a primary plane.\n");
0927 return -EINVAL;
0928 }
0929 }
0930
0931 return 0;
0932 }
0933 EXPORT_SYMBOL(drm_atomic_helper_check_crtc_state);
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951 int
0952 drm_atomic_helper_check_planes(struct drm_device *dev,
0953 struct drm_atomic_state *state)
0954 {
0955 struct drm_crtc *crtc;
0956 struct drm_crtc_state *new_crtc_state;
0957 struct drm_plane *plane;
0958 struct drm_plane_state *new_plane_state, *old_plane_state;
0959 int i, ret = 0;
0960
0961 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
0962 const struct drm_plane_helper_funcs *funcs;
0963
0964 WARN_ON(!drm_modeset_is_locked(&plane->mutex));
0965
0966 funcs = plane->helper_private;
0967
0968 drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
0969
0970 drm_atomic_helper_check_plane_damage(state, new_plane_state);
0971
0972 if (!funcs || !funcs->atomic_check)
0973 continue;
0974
0975 ret = funcs->atomic_check(plane, state);
0976 if (ret) {
0977 drm_dbg_atomic(plane->dev,
0978 "[PLANE:%d:%s] atomic driver check failed\n",
0979 plane->base.id, plane->name);
0980 return ret;
0981 }
0982 }
0983
0984 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
0985 const struct drm_crtc_helper_funcs *funcs;
0986
0987 funcs = crtc->helper_private;
0988
0989 if (!funcs || !funcs->atomic_check)
0990 continue;
0991
0992 ret = funcs->atomic_check(crtc, state);
0993 if (ret) {
0994 drm_dbg_atomic(crtc->dev,
0995 "[CRTC:%d:%s] atomic driver check failed\n",
0996 crtc->base.id, crtc->name);
0997 return ret;
0998 }
0999 }
1000
1001 return ret;
1002 }
1003 EXPORT_SYMBOL(drm_atomic_helper_check_planes);
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031 int drm_atomic_helper_check(struct drm_device *dev,
1032 struct drm_atomic_state *state)
1033 {
1034 int ret;
1035
1036 ret = drm_atomic_helper_check_modeset(dev, state);
1037 if (ret)
1038 return ret;
1039
1040 if (dev->mode_config.normalize_zpos) {
1041 ret = drm_atomic_normalize_zpos(dev, state);
1042 if (ret)
1043 return ret;
1044 }
1045
1046 ret = drm_atomic_helper_check_planes(dev, state);
1047 if (ret)
1048 return ret;
1049
1050 if (state->legacy_cursor_update)
1051 state->async_update = !drm_atomic_helper_async_check(dev, state);
1052
1053 drm_self_refresh_helper_alter_state(state);
1054
1055 return ret;
1056 }
1057 EXPORT_SYMBOL(drm_atomic_helper_check);
1058
1059 static bool
1060 crtc_needs_disable(struct drm_crtc_state *old_state,
1061 struct drm_crtc_state *new_state)
1062 {
1063
1064
1065
1066
1067 if (!new_state)
1068 return drm_atomic_crtc_effectively_active(old_state);
1069
1070
1071
1072
1073
1074
1075 if (old_state->self_refresh_active &&
1076 old_state->crtc != new_state->crtc)
1077 return true;
1078
1079
1080
1081
1082
1083
1084
1085 return old_state->active ||
1086 (old_state->self_refresh_active && !new_state->active) ||
1087 new_state->self_refresh_active;
1088 }
1089
1090 static void
1091 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
1092 {
1093 struct drm_connector *connector;
1094 struct drm_connector_state *old_conn_state, *new_conn_state;
1095 struct drm_crtc *crtc;
1096 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
1097 int i;
1098
1099 for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
1100 const struct drm_encoder_helper_funcs *funcs;
1101 struct drm_encoder *encoder;
1102 struct drm_bridge *bridge;
1103
1104
1105
1106
1107
1108 if (!old_conn_state->crtc)
1109 continue;
1110
1111 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, old_conn_state->crtc);
1112
1113 if (new_conn_state->crtc)
1114 new_crtc_state = drm_atomic_get_new_crtc_state(
1115 old_state,
1116 new_conn_state->crtc);
1117 else
1118 new_crtc_state = NULL;
1119
1120 if (!crtc_needs_disable(old_crtc_state, new_crtc_state) ||
1121 !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
1122 continue;
1123
1124 encoder = old_conn_state->best_encoder;
1125
1126
1127
1128
1129 if (WARN_ON(!encoder))
1130 continue;
1131
1132 funcs = encoder->helper_private;
1133
1134 drm_dbg_atomic(dev, "disabling [ENCODER:%d:%s]\n",
1135 encoder->base.id, encoder->name);
1136
1137
1138
1139
1140
1141 bridge = drm_bridge_chain_get_first_bridge(encoder);
1142 drm_atomic_bridge_chain_disable(bridge, old_state);
1143
1144
1145 if (funcs) {
1146 if (funcs->atomic_disable)
1147 funcs->atomic_disable(encoder, old_state);
1148 else if (new_conn_state->crtc && funcs->prepare)
1149 funcs->prepare(encoder);
1150 else if (funcs->disable)
1151 funcs->disable(encoder);
1152 else if (funcs->dpms)
1153 funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
1154 }
1155
1156 drm_atomic_bridge_chain_post_disable(bridge, old_state);
1157 }
1158
1159 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
1160 const struct drm_crtc_helper_funcs *funcs;
1161 int ret;
1162
1163
1164 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
1165 continue;
1166
1167 if (!crtc_needs_disable(old_crtc_state, new_crtc_state))
1168 continue;
1169
1170 funcs = crtc->helper_private;
1171
1172 drm_dbg_atomic(dev, "disabling [CRTC:%d:%s]\n",
1173 crtc->base.id, crtc->name);
1174
1175
1176
1177 if (new_crtc_state->enable && funcs->prepare)
1178 funcs->prepare(crtc);
1179 else if (funcs->atomic_disable)
1180 funcs->atomic_disable(crtc, old_state);
1181 else if (funcs->disable)
1182 funcs->disable(crtc);
1183 else if (funcs->dpms)
1184 funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
1185
1186 if (!drm_dev_has_vblank(dev))
1187 continue;
1188
1189 ret = drm_crtc_vblank_get(crtc);
1190 WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n");
1191 if (ret == 0)
1192 drm_crtc_vblank_put(crtc);
1193 }
1194 }
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213 void
1214 drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
1215 struct drm_atomic_state *old_state)
1216 {
1217 struct drm_connector *connector;
1218 struct drm_connector_state *old_conn_state, *new_conn_state;
1219 struct drm_crtc *crtc;
1220 struct drm_crtc_state *new_crtc_state;
1221 int i;
1222
1223
1224 for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
1225 if (connector->encoder) {
1226 WARN_ON(!connector->encoder->crtc);
1227
1228 connector->encoder->crtc = NULL;
1229 connector->encoder = NULL;
1230 }
1231
1232 crtc = new_conn_state->crtc;
1233 if ((!crtc && old_conn_state->crtc) ||
1234 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
1235 int mode = DRM_MODE_DPMS_OFF;
1236
1237 if (crtc && crtc->state->active)
1238 mode = DRM_MODE_DPMS_ON;
1239
1240 connector->dpms = mode;
1241 }
1242 }
1243
1244
1245 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1246 if (!new_conn_state->crtc)
1247 continue;
1248
1249 if (WARN_ON(!new_conn_state->best_encoder))
1250 continue;
1251
1252 connector->encoder = new_conn_state->best_encoder;
1253 connector->encoder->crtc = new_conn_state->crtc;
1254 }
1255
1256
1257 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
1258 struct drm_plane *primary = crtc->primary;
1259 struct drm_plane_state *new_plane_state;
1260
1261 crtc->mode = new_crtc_state->mode;
1262 crtc->enabled = new_crtc_state->enable;
1263
1264 new_plane_state =
1265 drm_atomic_get_new_plane_state(old_state, primary);
1266
1267 if (new_plane_state && new_plane_state->crtc == crtc) {
1268 crtc->x = new_plane_state->src_x >> 16;
1269 crtc->y = new_plane_state->src_y >> 16;
1270 }
1271 }
1272 }
1273 EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
1274
1275
1276
1277
1278
1279
1280
1281
1282 void drm_atomic_helper_calc_timestamping_constants(struct drm_atomic_state *state)
1283 {
1284 struct drm_crtc_state *new_crtc_state;
1285 struct drm_crtc *crtc;
1286 int i;
1287
1288 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1289 if (new_crtc_state->enable)
1290 drm_calc_timestamping_constants(crtc,
1291 &new_crtc_state->adjusted_mode);
1292 }
1293 }
1294 EXPORT_SYMBOL(drm_atomic_helper_calc_timestamping_constants);
1295
1296 static void
1297 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
1298 {
1299 struct drm_crtc *crtc;
1300 struct drm_crtc_state *new_crtc_state;
1301 struct drm_connector *connector;
1302 struct drm_connector_state *new_conn_state;
1303 int i;
1304
1305 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
1306 const struct drm_crtc_helper_funcs *funcs;
1307
1308 if (!new_crtc_state->mode_changed)
1309 continue;
1310
1311 funcs = crtc->helper_private;
1312
1313 if (new_crtc_state->enable && funcs->mode_set_nofb) {
1314 drm_dbg_atomic(dev, "modeset on [CRTC:%d:%s]\n",
1315 crtc->base.id, crtc->name);
1316
1317 funcs->mode_set_nofb(crtc);
1318 }
1319 }
1320
1321 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1322 const struct drm_encoder_helper_funcs *funcs;
1323 struct drm_encoder *encoder;
1324 struct drm_display_mode *mode, *adjusted_mode;
1325 struct drm_bridge *bridge;
1326
1327 if (!new_conn_state->best_encoder)
1328 continue;
1329
1330 encoder = new_conn_state->best_encoder;
1331 funcs = encoder->helper_private;
1332 new_crtc_state = new_conn_state->crtc->state;
1333 mode = &new_crtc_state->mode;
1334 adjusted_mode = &new_crtc_state->adjusted_mode;
1335
1336 if (!new_crtc_state->mode_changed)
1337 continue;
1338
1339 drm_dbg_atomic(dev, "modeset on [ENCODER:%d:%s]\n",
1340 encoder->base.id, encoder->name);
1341
1342
1343
1344
1345
1346 if (funcs && funcs->atomic_mode_set) {
1347 funcs->atomic_mode_set(encoder, new_crtc_state,
1348 new_conn_state);
1349 } else if (funcs && funcs->mode_set) {
1350 funcs->mode_set(encoder, mode, adjusted_mode);
1351 }
1352
1353 bridge = drm_bridge_chain_get_first_bridge(encoder);
1354 drm_bridge_chain_mode_set(bridge, mode, adjusted_mode);
1355 }
1356 }
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372 void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
1373 struct drm_atomic_state *old_state)
1374 {
1375 disable_outputs(dev, old_state);
1376
1377 drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
1378 drm_atomic_helper_calc_timestamping_constants(old_state);
1379
1380 crtc_set_mode(dev, old_state);
1381 }
1382 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
1383
1384 static void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
1385 struct drm_atomic_state *old_state)
1386 {
1387 struct drm_connector *connector;
1388 struct drm_connector_state *new_conn_state;
1389 int i;
1390
1391 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1392 const struct drm_connector_helper_funcs *funcs;
1393
1394 funcs = connector->helper_private;
1395 if (!funcs->atomic_commit)
1396 continue;
1397
1398 if (new_conn_state->writeback_job && new_conn_state->writeback_job->fb) {
1399 WARN_ON(connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK);
1400 funcs->atomic_commit(connector, old_state);
1401 }
1402 }
1403 }
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419 void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
1420 struct drm_atomic_state *old_state)
1421 {
1422 struct drm_crtc *crtc;
1423 struct drm_crtc_state *old_crtc_state;
1424 struct drm_crtc_state *new_crtc_state;
1425 struct drm_connector *connector;
1426 struct drm_connector_state *new_conn_state;
1427 int i;
1428
1429 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
1430 const struct drm_crtc_helper_funcs *funcs;
1431
1432
1433 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
1434 continue;
1435
1436 if (!new_crtc_state->active)
1437 continue;
1438
1439 funcs = crtc->helper_private;
1440
1441 if (new_crtc_state->enable) {
1442 drm_dbg_atomic(dev, "enabling [CRTC:%d:%s]\n",
1443 crtc->base.id, crtc->name);
1444 if (funcs->atomic_enable)
1445 funcs->atomic_enable(crtc, old_state);
1446 else if (funcs->commit)
1447 funcs->commit(crtc);
1448 }
1449 }
1450
1451 for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1452 const struct drm_encoder_helper_funcs *funcs;
1453 struct drm_encoder *encoder;
1454 struct drm_bridge *bridge;
1455
1456 if (!new_conn_state->best_encoder)
1457 continue;
1458
1459 if (!new_conn_state->crtc->state->active ||
1460 !drm_atomic_crtc_needs_modeset(new_conn_state->crtc->state))
1461 continue;
1462
1463 encoder = new_conn_state->best_encoder;
1464 funcs = encoder->helper_private;
1465
1466 drm_dbg_atomic(dev, "enabling [ENCODER:%d:%s]\n",
1467 encoder->base.id, encoder->name);
1468
1469
1470
1471
1472
1473 bridge = drm_bridge_chain_get_first_bridge(encoder);
1474 drm_atomic_bridge_chain_pre_enable(bridge, old_state);
1475
1476 if (funcs) {
1477 if (funcs->atomic_enable)
1478 funcs->atomic_enable(encoder, old_state);
1479 else if (funcs->enable)
1480 funcs->enable(encoder);
1481 else if (funcs->commit)
1482 funcs->commit(encoder);
1483 }
1484
1485 drm_atomic_bridge_chain_enable(bridge, old_state);
1486 }
1487
1488 drm_atomic_helper_commit_writebacks(dev, old_state);
1489 }
1490 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513 int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
1514 struct drm_atomic_state *state,
1515 bool pre_swap)
1516 {
1517 struct drm_plane *plane;
1518 struct drm_plane_state *new_plane_state;
1519 int i, ret;
1520
1521 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
1522 if (!new_plane_state->fence)
1523 continue;
1524
1525 WARN_ON(!new_plane_state->fb);
1526
1527
1528
1529
1530
1531
1532 ret = dma_fence_wait(new_plane_state->fence, pre_swap);
1533 if (ret)
1534 return ret;
1535
1536 dma_fence_put(new_plane_state->fence);
1537 new_plane_state->fence = NULL;
1538 }
1539
1540 return 0;
1541 }
1542 EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559 void
1560 drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
1561 struct drm_atomic_state *old_state)
1562 {
1563 struct drm_crtc *crtc;
1564 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
1565 int i, ret;
1566 unsigned int crtc_mask = 0;
1567
1568
1569
1570
1571
1572 if (old_state->legacy_cursor_update)
1573 return;
1574
1575 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
1576 if (!new_crtc_state->active)
1577 continue;
1578
1579 ret = drm_crtc_vblank_get(crtc);
1580 if (ret != 0)
1581 continue;
1582
1583 crtc_mask |= drm_crtc_mask(crtc);
1584 old_state->crtcs[i].last_vblank_count = drm_crtc_vblank_count(crtc);
1585 }
1586
1587 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1588 if (!(crtc_mask & drm_crtc_mask(crtc)))
1589 continue;
1590
1591 ret = wait_event_timeout(dev->vblank[i].queue,
1592 old_state->crtcs[i].last_vblank_count !=
1593 drm_crtc_vblank_count(crtc),
1594 msecs_to_jiffies(100));
1595
1596 WARN(!ret, "[CRTC:%d:%s] vblank wait timed out\n",
1597 crtc->base.id, crtc->name);
1598
1599 drm_crtc_vblank_put(crtc);
1600 }
1601 }
1602 EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619 void drm_atomic_helper_wait_for_flip_done(struct drm_device *dev,
1620 struct drm_atomic_state *old_state)
1621 {
1622 struct drm_crtc *crtc;
1623 int i;
1624
1625 for (i = 0; i < dev->mode_config.num_crtc; i++) {
1626 struct drm_crtc_commit *commit = old_state->crtcs[i].commit;
1627 int ret;
1628
1629 crtc = old_state->crtcs[i].ptr;
1630
1631 if (!crtc || !commit)
1632 continue;
1633
1634 ret = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
1635 if (ret == 0)
1636 drm_err(dev, "[CRTC:%d:%s] flip_done timed out\n",
1637 crtc->base.id, crtc->name);
1638 }
1639
1640 if (old_state->fake_commit)
1641 complete_all(&old_state->fake_commit->flip_done);
1642 }
1643 EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658 void drm_atomic_helper_commit_tail(struct drm_atomic_state *old_state)
1659 {
1660 struct drm_device *dev = old_state->dev;
1661
1662 drm_atomic_helper_commit_modeset_disables(dev, old_state);
1663
1664 drm_atomic_helper_commit_planes(dev, old_state, 0);
1665
1666 drm_atomic_helper_commit_modeset_enables(dev, old_state);
1667
1668 drm_atomic_helper_fake_vblank(old_state);
1669
1670 drm_atomic_helper_commit_hw_done(old_state);
1671
1672 drm_atomic_helper_wait_for_vblanks(dev, old_state);
1673
1674 drm_atomic_helper_cleanup_planes(dev, old_state);
1675 }
1676 EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688 void drm_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state)
1689 {
1690 struct drm_device *dev = old_state->dev;
1691
1692 drm_atomic_helper_commit_modeset_disables(dev, old_state);
1693
1694 drm_atomic_helper_commit_modeset_enables(dev, old_state);
1695
1696 drm_atomic_helper_commit_planes(dev, old_state,
1697 DRM_PLANE_COMMIT_ACTIVE_ONLY);
1698
1699 drm_atomic_helper_fake_vblank(old_state);
1700
1701 drm_atomic_helper_commit_hw_done(old_state);
1702
1703 drm_atomic_helper_wait_for_vblanks(dev, old_state);
1704
1705 drm_atomic_helper_cleanup_planes(dev, old_state);
1706 }
1707 EXPORT_SYMBOL(drm_atomic_helper_commit_tail_rpm);
1708
1709 static void commit_tail(struct drm_atomic_state *old_state)
1710 {
1711 struct drm_device *dev = old_state->dev;
1712 const struct drm_mode_config_helper_funcs *funcs;
1713 struct drm_crtc_state *new_crtc_state;
1714 struct drm_crtc *crtc;
1715 ktime_t start;
1716 s64 commit_time_ms;
1717 unsigned int i, new_self_refresh_mask = 0;
1718
1719 funcs = dev->mode_config.helper_private;
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731 start = ktime_get();
1732
1733 drm_atomic_helper_wait_for_fences(dev, old_state, false);
1734
1735 drm_atomic_helper_wait_for_dependencies(old_state);
1736
1737
1738
1739
1740
1741
1742 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i)
1743 if (new_crtc_state->self_refresh_active)
1744 new_self_refresh_mask |= BIT(i);
1745
1746 if (funcs && funcs->atomic_commit_tail)
1747 funcs->atomic_commit_tail(old_state);
1748 else
1749 drm_atomic_helper_commit_tail(old_state);
1750
1751 commit_time_ms = ktime_ms_delta(ktime_get(), start);
1752 if (commit_time_ms > 0)
1753 drm_self_refresh_helper_update_avg_times(old_state,
1754 (unsigned long)commit_time_ms,
1755 new_self_refresh_mask);
1756
1757 drm_atomic_helper_commit_cleanup_done(old_state);
1758
1759 drm_atomic_state_put(old_state);
1760 }
1761
1762 static void commit_work(struct work_struct *work)
1763 {
1764 struct drm_atomic_state *state = container_of(work,
1765 struct drm_atomic_state,
1766 commit_work);
1767 commit_tail(state);
1768 }
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783 int drm_atomic_helper_async_check(struct drm_device *dev,
1784 struct drm_atomic_state *state)
1785 {
1786 struct drm_crtc *crtc;
1787 struct drm_crtc_state *crtc_state;
1788 struct drm_plane *plane = NULL;
1789 struct drm_plane_state *old_plane_state = NULL;
1790 struct drm_plane_state *new_plane_state = NULL;
1791 const struct drm_plane_helper_funcs *funcs;
1792 int i, n_planes = 0;
1793
1794 for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
1795 if (drm_atomic_crtc_needs_modeset(crtc_state))
1796 return -EINVAL;
1797 }
1798
1799 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i)
1800 n_planes++;
1801
1802
1803 if (n_planes != 1)
1804 return -EINVAL;
1805
1806 if (!new_plane_state->crtc ||
1807 old_plane_state->crtc != new_plane_state->crtc)
1808 return -EINVAL;
1809
1810 funcs = plane->helper_private;
1811 if (!funcs->atomic_async_update)
1812 return -EINVAL;
1813
1814 if (new_plane_state->fence)
1815 return -EINVAL;
1816
1817
1818
1819
1820
1821
1822 if (old_plane_state->commit &&
1823 !try_wait_for_completion(&old_plane_state->commit->hw_done)) {
1824 drm_dbg_atomic(dev,
1825 "[PLANE:%d:%s] inflight previous commit preventing async commit\n",
1826 plane->base.id, plane->name);
1827 return -EBUSY;
1828 }
1829
1830 return funcs->atomic_async_check(plane, state);
1831 }
1832 EXPORT_SYMBOL(drm_atomic_helper_async_check);
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847 void drm_atomic_helper_async_commit(struct drm_device *dev,
1848 struct drm_atomic_state *state)
1849 {
1850 struct drm_plane *plane;
1851 struct drm_plane_state *plane_state;
1852 const struct drm_plane_helper_funcs *funcs;
1853 int i;
1854
1855 for_each_new_plane_in_state(state, plane, plane_state, i) {
1856 struct drm_framebuffer *new_fb = plane_state->fb;
1857 struct drm_framebuffer *old_fb = plane->state->fb;
1858
1859 funcs = plane->helper_private;
1860 funcs->atomic_async_update(plane, state);
1861
1862
1863
1864
1865
1866
1867 WARN_ON_ONCE(plane->state->fb != new_fb);
1868 WARN_ON_ONCE(plane->state->crtc_x != plane_state->crtc_x);
1869 WARN_ON_ONCE(plane->state->crtc_y != plane_state->crtc_y);
1870 WARN_ON_ONCE(plane->state->src_x != plane_state->src_x);
1871 WARN_ON_ONCE(plane->state->src_y != plane_state->src_y);
1872
1873
1874
1875
1876
1877 WARN_ON_ONCE(plane_state->fb != old_fb);
1878 }
1879 }
1880 EXPORT_SYMBOL(drm_atomic_helper_async_commit);
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900 int drm_atomic_helper_commit(struct drm_device *dev,
1901 struct drm_atomic_state *state,
1902 bool nonblock)
1903 {
1904 int ret;
1905
1906 if (state->async_update) {
1907 ret = drm_atomic_helper_prepare_planes(dev, state);
1908 if (ret)
1909 return ret;
1910
1911 drm_atomic_helper_async_commit(dev, state);
1912 drm_atomic_helper_cleanup_planes(dev, state);
1913
1914 return 0;
1915 }
1916
1917 ret = drm_atomic_helper_setup_commit(state, nonblock);
1918 if (ret)
1919 return ret;
1920
1921 INIT_WORK(&state->commit_work, commit_work);
1922
1923 ret = drm_atomic_helper_prepare_planes(dev, state);
1924 if (ret)
1925 return ret;
1926
1927 if (!nonblock) {
1928 ret = drm_atomic_helper_wait_for_fences(dev, state, true);
1929 if (ret)
1930 goto err;
1931 }
1932
1933
1934
1935
1936
1937
1938
1939 ret = drm_atomic_helper_swap_state(state, true);
1940 if (ret)
1941 goto err;
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963 drm_atomic_state_get(state);
1964 if (nonblock)
1965 queue_work(system_unbound_wq, &state->commit_work);
1966 else
1967 commit_tail(state);
1968
1969 return 0;
1970
1971 err:
1972 drm_atomic_helper_cleanup_planes(dev, state);
1973 return ret;
1974 }
1975 EXPORT_SYMBOL(drm_atomic_helper_commit);
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030 static int stall_checks(struct drm_crtc *crtc, bool nonblock)
2031 {
2032 struct drm_crtc_commit *commit, *stall_commit = NULL;
2033 bool completed = true;
2034 int i;
2035 long ret = 0;
2036
2037 spin_lock(&crtc->commit_lock);
2038 i = 0;
2039 list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
2040 if (i == 0) {
2041 completed = try_wait_for_completion(&commit->flip_done);
2042
2043
2044
2045
2046 if (!completed && nonblock) {
2047 spin_unlock(&crtc->commit_lock);
2048 drm_dbg_atomic(crtc->dev,
2049 "[CRTC:%d:%s] busy with a previous commit\n",
2050 crtc->base.id, crtc->name);
2051
2052 return -EBUSY;
2053 }
2054 } else if (i == 1) {
2055 stall_commit = drm_crtc_commit_get(commit);
2056 break;
2057 }
2058
2059 i++;
2060 }
2061 spin_unlock(&crtc->commit_lock);
2062
2063 if (!stall_commit)
2064 return 0;
2065
2066
2067
2068
2069 ret = wait_for_completion_interruptible_timeout(&stall_commit->cleanup_done,
2070 10*HZ);
2071 if (ret == 0)
2072 drm_err(crtc->dev, "[CRTC:%d:%s] cleanup_done timed out\n",
2073 crtc->base.id, crtc->name);
2074
2075 drm_crtc_commit_put(stall_commit);
2076
2077 return ret < 0 ? ret : 0;
2078 }
2079
2080 static void release_crtc_commit(struct completion *completion)
2081 {
2082 struct drm_crtc_commit *commit = container_of(completion,
2083 typeof(*commit),
2084 flip_done);
2085
2086 drm_crtc_commit_put(commit);
2087 }
2088
2089 static void init_commit(struct drm_crtc_commit *commit, struct drm_crtc *crtc)
2090 {
2091 init_completion(&commit->flip_done);
2092 init_completion(&commit->hw_done);
2093 init_completion(&commit->cleanup_done);
2094 INIT_LIST_HEAD(&commit->commit_entry);
2095 kref_init(&commit->ref);
2096 commit->crtc = crtc;
2097 }
2098
2099 static struct drm_crtc_commit *
2100 crtc_or_fake_commit(struct drm_atomic_state *state, struct drm_crtc *crtc)
2101 {
2102 if (crtc) {
2103 struct drm_crtc_state *new_crtc_state;
2104
2105 new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
2106
2107 return new_crtc_state->commit;
2108 }
2109
2110 if (!state->fake_commit) {
2111 state->fake_commit = kzalloc(sizeof(*state->fake_commit), GFP_KERNEL);
2112 if (!state->fake_commit)
2113 return NULL;
2114
2115 init_commit(state->fake_commit, NULL);
2116 }
2117
2118 return state->fake_commit;
2119 }
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167 int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
2168 bool nonblock)
2169 {
2170 struct drm_crtc *crtc;
2171 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2172 struct drm_connector *conn;
2173 struct drm_connector_state *old_conn_state, *new_conn_state;
2174 struct drm_plane *plane;
2175 struct drm_plane_state *old_plane_state, *new_plane_state;
2176 struct drm_crtc_commit *commit;
2177 const struct drm_mode_config_helper_funcs *funcs;
2178 int i, ret;
2179
2180 funcs = state->dev->mode_config.helper_private;
2181
2182 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
2183 commit = kzalloc(sizeof(*commit), GFP_KERNEL);
2184 if (!commit)
2185 return -ENOMEM;
2186
2187 init_commit(commit, crtc);
2188
2189 new_crtc_state->commit = commit;
2190
2191 ret = stall_checks(crtc, nonblock);
2192 if (ret)
2193 return ret;
2194
2195
2196
2197
2198
2199
2200 if (!old_crtc_state->active && !new_crtc_state->active) {
2201 complete_all(&commit->flip_done);
2202 continue;
2203 }
2204
2205
2206 if (state->legacy_cursor_update) {
2207 complete_all(&commit->flip_done);
2208 continue;
2209 }
2210
2211 if (!new_crtc_state->event) {
2212 commit->event = kzalloc(sizeof(*commit->event),
2213 GFP_KERNEL);
2214 if (!commit->event)
2215 return -ENOMEM;
2216
2217 new_crtc_state->event = commit->event;
2218 }
2219
2220 new_crtc_state->event->base.completion = &commit->flip_done;
2221 new_crtc_state->event->base.completion_release = release_crtc_commit;
2222 drm_crtc_commit_get(commit);
2223
2224 commit->abort_completion = true;
2225
2226 state->crtcs[i].commit = commit;
2227 drm_crtc_commit_get(commit);
2228 }
2229
2230 for_each_oldnew_connector_in_state(state, conn, old_conn_state, new_conn_state, i) {
2231
2232
2233
2234
2235 if (nonblock && old_conn_state->commit &&
2236 !try_wait_for_completion(&old_conn_state->commit->flip_done)) {
2237 drm_dbg_atomic(conn->dev,
2238 "[CONNECTOR:%d:%s] busy with a previous commit\n",
2239 conn->base.id, conn->name);
2240
2241 return -EBUSY;
2242 }
2243
2244
2245 commit = crtc_or_fake_commit(state, new_conn_state->crtc ?: old_conn_state->crtc);
2246 if (!commit)
2247 return -ENOMEM;
2248
2249 new_conn_state->commit = drm_crtc_commit_get(commit);
2250 }
2251
2252 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
2253
2254
2255
2256
2257 if (nonblock && old_plane_state->commit &&
2258 !try_wait_for_completion(&old_plane_state->commit->flip_done)) {
2259 drm_dbg_atomic(plane->dev,
2260 "[PLANE:%d:%s] busy with a previous commit\n",
2261 plane->base.id, plane->name);
2262
2263 return -EBUSY;
2264 }
2265
2266
2267 commit = crtc_or_fake_commit(state, new_plane_state->crtc ?: old_plane_state->crtc);
2268 if (!commit)
2269 return -ENOMEM;
2270
2271 new_plane_state->commit = drm_crtc_commit_get(commit);
2272 }
2273
2274 if (funcs && funcs->atomic_commit_setup)
2275 return funcs->atomic_commit_setup(state);
2276
2277 return 0;
2278 }
2279 EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293 void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *old_state)
2294 {
2295 struct drm_crtc *crtc;
2296 struct drm_crtc_state *old_crtc_state;
2297 struct drm_plane *plane;
2298 struct drm_plane_state *old_plane_state;
2299 struct drm_connector *conn;
2300 struct drm_connector_state *old_conn_state;
2301 int i;
2302 long ret;
2303
2304 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
2305 ret = drm_crtc_commit_wait(old_crtc_state->commit);
2306 if (ret)
2307 drm_err(crtc->dev,
2308 "[CRTC:%d:%s] commit wait timed out\n",
2309 crtc->base.id, crtc->name);
2310 }
2311
2312 for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
2313 ret = drm_crtc_commit_wait(old_conn_state->commit);
2314 if (ret)
2315 drm_err(conn->dev,
2316 "[CONNECTOR:%d:%s] commit wait timed out\n",
2317 conn->base.id, conn->name);
2318 }
2319
2320 for_each_old_plane_in_state(old_state, plane, old_plane_state, i) {
2321 ret = drm_crtc_commit_wait(old_plane_state->commit);
2322 if (ret)
2323 drm_err(plane->dev,
2324 "[PLANE:%d:%s] commit wait timed out\n",
2325 plane->base.id, plane->name);
2326 }
2327 }
2328 EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348 void drm_atomic_helper_fake_vblank(struct drm_atomic_state *old_state)
2349 {
2350 struct drm_crtc_state *new_crtc_state;
2351 struct drm_crtc *crtc;
2352 int i;
2353
2354 for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
2355 unsigned long flags;
2356
2357 if (!new_crtc_state->no_vblank)
2358 continue;
2359
2360 spin_lock_irqsave(&old_state->dev->event_lock, flags);
2361 if (new_crtc_state->event) {
2362 drm_crtc_send_vblank_event(crtc,
2363 new_crtc_state->event);
2364 new_crtc_state->event = NULL;
2365 }
2366 spin_unlock_irqrestore(&old_state->dev->event_lock, flags);
2367 }
2368 }
2369 EXPORT_SYMBOL(drm_atomic_helper_fake_vblank);
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386 void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *old_state)
2387 {
2388 struct drm_crtc *crtc;
2389 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2390 struct drm_crtc_commit *commit;
2391 int i;
2392
2393 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2394 commit = new_crtc_state->commit;
2395 if (!commit)
2396 continue;
2397
2398
2399
2400
2401
2402
2403 if (old_crtc_state->commit)
2404 drm_crtc_commit_put(old_crtc_state->commit);
2405
2406 old_crtc_state->commit = drm_crtc_commit_get(commit);
2407
2408
2409 WARN_ON(new_crtc_state->event);
2410 complete_all(&commit->hw_done);
2411 }
2412
2413 if (old_state->fake_commit) {
2414 complete_all(&old_state->fake_commit->hw_done);
2415 complete_all(&old_state->fake_commit->flip_done);
2416 }
2417 }
2418 EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431 void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
2432 {
2433 struct drm_crtc *crtc;
2434 struct drm_crtc_state *old_crtc_state;
2435 struct drm_crtc_commit *commit;
2436 int i;
2437
2438 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
2439 commit = old_crtc_state->commit;
2440 if (WARN_ON(!commit))
2441 continue;
2442
2443 complete_all(&commit->cleanup_done);
2444 WARN_ON(!try_wait_for_completion(&commit->hw_done));
2445
2446 spin_lock(&crtc->commit_lock);
2447 list_del(&commit->commit_entry);
2448 spin_unlock(&crtc->commit_lock);
2449 }
2450
2451 if (old_state->fake_commit) {
2452 complete_all(&old_state->fake_commit->cleanup_done);
2453 WARN_ON(!try_wait_for_completion(&old_state->fake_commit->hw_done));
2454 }
2455 }
2456 EXPORT_SYMBOL(drm_atomic_helper_commit_cleanup_done);
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471 int drm_atomic_helper_prepare_planes(struct drm_device *dev,
2472 struct drm_atomic_state *state)
2473 {
2474 struct drm_connector *connector;
2475 struct drm_connector_state *new_conn_state;
2476 struct drm_plane *plane;
2477 struct drm_plane_state *new_plane_state;
2478 int ret, i, j;
2479
2480 for_each_new_connector_in_state(state, connector, new_conn_state, i) {
2481 if (!new_conn_state->writeback_job)
2482 continue;
2483
2484 ret = drm_writeback_prepare_job(new_conn_state->writeback_job);
2485 if (ret < 0)
2486 return ret;
2487 }
2488
2489 for_each_new_plane_in_state(state, plane, new_plane_state, i) {
2490 const struct drm_plane_helper_funcs *funcs;
2491
2492 funcs = plane->helper_private;
2493
2494 if (funcs->prepare_fb) {
2495 ret = funcs->prepare_fb(plane, new_plane_state);
2496 if (ret)
2497 goto fail;
2498 } else {
2499 WARN_ON_ONCE(funcs->cleanup_fb);
2500
2501 if (!drm_core_check_feature(dev, DRIVER_GEM))
2502 continue;
2503
2504 ret = drm_gem_plane_helper_prepare_fb(plane, new_plane_state);
2505 if (ret)
2506 goto fail;
2507 }
2508 }
2509
2510 return 0;
2511
2512 fail:
2513 for_each_new_plane_in_state(state, plane, new_plane_state, j) {
2514 const struct drm_plane_helper_funcs *funcs;
2515
2516 if (j >= i)
2517 continue;
2518
2519 funcs = plane->helper_private;
2520
2521 if (funcs->cleanup_fb)
2522 funcs->cleanup_fb(plane, new_plane_state);
2523 }
2524
2525 return ret;
2526 }
2527 EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
2528
2529 static bool plane_crtc_active(const struct drm_plane_state *state)
2530 {
2531 return state->crtc && state->crtc->state->active;
2532 }
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575 void drm_atomic_helper_commit_planes(struct drm_device *dev,
2576 struct drm_atomic_state *old_state,
2577 uint32_t flags)
2578 {
2579 struct drm_crtc *crtc;
2580 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2581 struct drm_plane *plane;
2582 struct drm_plane_state *old_plane_state, *new_plane_state;
2583 int i;
2584 bool active_only = flags & DRM_PLANE_COMMIT_ACTIVE_ONLY;
2585 bool no_disable = flags & DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET;
2586
2587 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2588 const struct drm_crtc_helper_funcs *funcs;
2589
2590 funcs = crtc->helper_private;
2591
2592 if (!funcs || !funcs->atomic_begin)
2593 continue;
2594
2595 if (active_only && !new_crtc_state->active)
2596 continue;
2597
2598 funcs->atomic_begin(crtc, old_state);
2599 }
2600
2601 for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
2602 const struct drm_plane_helper_funcs *funcs;
2603 bool disabling;
2604
2605 funcs = plane->helper_private;
2606
2607 if (!funcs)
2608 continue;
2609
2610 disabling = drm_atomic_plane_disabling(old_plane_state,
2611 new_plane_state);
2612
2613 if (active_only) {
2614
2615
2616
2617
2618
2619
2620
2621 if (!disabling && !plane_crtc_active(new_plane_state))
2622 continue;
2623 if (disabling && !plane_crtc_active(old_plane_state))
2624 continue;
2625 }
2626
2627
2628
2629
2630 if (disabling && funcs->atomic_disable) {
2631 struct drm_crtc_state *crtc_state;
2632
2633 crtc_state = old_plane_state->crtc->state;
2634
2635 if (drm_atomic_crtc_needs_modeset(crtc_state) &&
2636 no_disable)
2637 continue;
2638
2639 funcs->atomic_disable(plane, old_state);
2640 } else if (new_plane_state->crtc || disabling) {
2641 funcs->atomic_update(plane, old_state);
2642 }
2643 }
2644
2645 for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2646 const struct drm_crtc_helper_funcs *funcs;
2647
2648 funcs = crtc->helper_private;
2649
2650 if (!funcs || !funcs->atomic_flush)
2651 continue;
2652
2653 if (active_only && !new_crtc_state->active)
2654 continue;
2655
2656 funcs->atomic_flush(crtc, old_state);
2657 }
2658 }
2659 EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678 void
2679 drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
2680 {
2681 const struct drm_crtc_helper_funcs *crtc_funcs;
2682 struct drm_crtc *crtc = old_crtc_state->crtc;
2683 struct drm_atomic_state *old_state = old_crtc_state->state;
2684 struct drm_crtc_state *new_crtc_state =
2685 drm_atomic_get_new_crtc_state(old_state, crtc);
2686 struct drm_plane *plane;
2687 unsigned int plane_mask;
2688
2689 plane_mask = old_crtc_state->plane_mask;
2690 plane_mask |= new_crtc_state->plane_mask;
2691
2692 crtc_funcs = crtc->helper_private;
2693 if (crtc_funcs && crtc_funcs->atomic_begin)
2694 crtc_funcs->atomic_begin(crtc, old_state);
2695
2696 drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
2697 struct drm_plane_state *old_plane_state =
2698 drm_atomic_get_old_plane_state(old_state, plane);
2699 struct drm_plane_state *new_plane_state =
2700 drm_atomic_get_new_plane_state(old_state, plane);
2701 const struct drm_plane_helper_funcs *plane_funcs;
2702
2703 plane_funcs = plane->helper_private;
2704
2705 if (!old_plane_state || !plane_funcs)
2706 continue;
2707
2708 WARN_ON(new_plane_state->crtc &&
2709 new_plane_state->crtc != crtc);
2710
2711 if (drm_atomic_plane_disabling(old_plane_state, new_plane_state) &&
2712 plane_funcs->atomic_disable)
2713 plane_funcs->atomic_disable(plane, old_state);
2714 else if (new_plane_state->crtc ||
2715 drm_atomic_plane_disabling(old_plane_state, new_plane_state))
2716 plane_funcs->atomic_update(plane, old_state);
2717 }
2718
2719 if (crtc_funcs && crtc_funcs->atomic_flush)
2720 crtc_funcs->atomic_flush(crtc, old_state);
2721 }
2722 EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740 void
2741 drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc_state *old_crtc_state,
2742 bool atomic)
2743 {
2744 struct drm_crtc *crtc = old_crtc_state->crtc;
2745 const struct drm_crtc_helper_funcs *crtc_funcs =
2746 crtc->helper_private;
2747 struct drm_plane *plane;
2748
2749 if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
2750 crtc_funcs->atomic_begin(crtc, NULL);
2751
2752 drm_atomic_crtc_state_for_each_plane(plane, old_crtc_state) {
2753 const struct drm_plane_helper_funcs *plane_funcs =
2754 plane->helper_private;
2755
2756 if (!plane_funcs)
2757 continue;
2758
2759 WARN_ON(!plane_funcs->atomic_disable);
2760 if (plane_funcs->atomic_disable)
2761 plane_funcs->atomic_disable(plane, NULL);
2762 }
2763
2764 if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
2765 crtc_funcs->atomic_flush(crtc, NULL);
2766 }
2767 EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781 void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
2782 struct drm_atomic_state *old_state)
2783 {
2784 struct drm_plane *plane;
2785 struct drm_plane_state *old_plane_state, *new_plane_state;
2786 int i;
2787
2788 for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
2789 const struct drm_plane_helper_funcs *funcs;
2790 struct drm_plane_state *plane_state;
2791
2792
2793
2794
2795
2796 if (old_plane_state == plane->state)
2797 plane_state = new_plane_state;
2798 else
2799 plane_state = old_plane_state;
2800
2801 funcs = plane->helper_private;
2802
2803 if (funcs->cleanup_fb)
2804 funcs->cleanup_fb(plane, plane_state);
2805 }
2806 }
2807 EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844 int drm_atomic_helper_swap_state(struct drm_atomic_state *state,
2845 bool stall)
2846 {
2847 int i, ret;
2848 struct drm_connector *connector;
2849 struct drm_connector_state *old_conn_state, *new_conn_state;
2850 struct drm_crtc *crtc;
2851 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2852 struct drm_plane *plane;
2853 struct drm_plane_state *old_plane_state, *new_plane_state;
2854 struct drm_crtc_commit *commit;
2855 struct drm_private_obj *obj;
2856 struct drm_private_state *old_obj_state, *new_obj_state;
2857
2858 if (stall) {
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868 for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) {
2869 commit = old_crtc_state->commit;
2870
2871 if (!commit)
2872 continue;
2873
2874 ret = wait_for_completion_interruptible(&commit->hw_done);
2875 if (ret)
2876 return ret;
2877 }
2878
2879 for_each_old_connector_in_state(state, connector, old_conn_state, i) {
2880 commit = old_conn_state->commit;
2881
2882 if (!commit)
2883 continue;
2884
2885 ret = wait_for_completion_interruptible(&commit->hw_done);
2886 if (ret)
2887 return ret;
2888 }
2889
2890 for_each_old_plane_in_state(state, plane, old_plane_state, i) {
2891 commit = old_plane_state->commit;
2892
2893 if (!commit)
2894 continue;
2895
2896 ret = wait_for_completion_interruptible(&commit->hw_done);
2897 if (ret)
2898 return ret;
2899 }
2900 }
2901
2902 for_each_oldnew_connector_in_state(state, connector, old_conn_state, new_conn_state, i) {
2903 WARN_ON(connector->state != old_conn_state);
2904
2905 old_conn_state->state = state;
2906 new_conn_state->state = NULL;
2907
2908 state->connectors[i].state = old_conn_state;
2909 connector->state = new_conn_state;
2910 }
2911
2912 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
2913 WARN_ON(crtc->state != old_crtc_state);
2914
2915 old_crtc_state->state = state;
2916 new_crtc_state->state = NULL;
2917
2918 state->crtcs[i].state = old_crtc_state;
2919 crtc->state = new_crtc_state;
2920
2921 if (new_crtc_state->commit) {
2922 spin_lock(&crtc->commit_lock);
2923 list_add(&new_crtc_state->commit->commit_entry,
2924 &crtc->commit_list);
2925 spin_unlock(&crtc->commit_lock);
2926
2927 new_crtc_state->commit->event = NULL;
2928 }
2929 }
2930
2931 for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
2932 WARN_ON(plane->state != old_plane_state);
2933
2934 old_plane_state->state = state;
2935 new_plane_state->state = NULL;
2936
2937 state->planes[i].state = old_plane_state;
2938 plane->state = new_plane_state;
2939 }
2940
2941 for_each_oldnew_private_obj_in_state(state, obj, old_obj_state, new_obj_state, i) {
2942 WARN_ON(obj->state != old_obj_state);
2943
2944 old_obj_state->state = state;
2945 new_obj_state->state = NULL;
2946
2947 state->private_objs[i].state = old_obj_state;
2948 obj->state = new_obj_state;
2949 }
2950
2951 return 0;
2952 }
2953 EXPORT_SYMBOL(drm_atomic_helper_swap_state);
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975 int drm_atomic_helper_update_plane(struct drm_plane *plane,
2976 struct drm_crtc *crtc,
2977 struct drm_framebuffer *fb,
2978 int crtc_x, int crtc_y,
2979 unsigned int crtc_w, unsigned int crtc_h,
2980 uint32_t src_x, uint32_t src_y,
2981 uint32_t src_w, uint32_t src_h,
2982 struct drm_modeset_acquire_ctx *ctx)
2983 {
2984 struct drm_atomic_state *state;
2985 struct drm_plane_state *plane_state;
2986 int ret = 0;
2987
2988 state = drm_atomic_state_alloc(plane->dev);
2989 if (!state)
2990 return -ENOMEM;
2991
2992 state->acquire_ctx = ctx;
2993 plane_state = drm_atomic_get_plane_state(state, plane);
2994 if (IS_ERR(plane_state)) {
2995 ret = PTR_ERR(plane_state);
2996 goto fail;
2997 }
2998
2999 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
3000 if (ret != 0)
3001 goto fail;
3002 drm_atomic_set_fb_for_plane(plane_state, fb);
3003 plane_state->crtc_x = crtc_x;
3004 plane_state->crtc_y = crtc_y;
3005 plane_state->crtc_w = crtc_w;
3006 plane_state->crtc_h = crtc_h;
3007 plane_state->src_x = src_x;
3008 plane_state->src_y = src_y;
3009 plane_state->src_w = src_w;
3010 plane_state->src_h = src_h;
3011
3012 if (plane == crtc->cursor)
3013 state->legacy_cursor_update = true;
3014
3015 ret = drm_atomic_commit(state);
3016 fail:
3017 drm_atomic_state_put(state);
3018 return ret;
3019 }
3020 EXPORT_SYMBOL(drm_atomic_helper_update_plane);
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032 int drm_atomic_helper_disable_plane(struct drm_plane *plane,
3033 struct drm_modeset_acquire_ctx *ctx)
3034 {
3035 struct drm_atomic_state *state;
3036 struct drm_plane_state *plane_state;
3037 int ret = 0;
3038
3039 state = drm_atomic_state_alloc(plane->dev);
3040 if (!state)
3041 return -ENOMEM;
3042
3043 state->acquire_ctx = ctx;
3044 plane_state = drm_atomic_get_plane_state(state, plane);
3045 if (IS_ERR(plane_state)) {
3046 ret = PTR_ERR(plane_state);
3047 goto fail;
3048 }
3049
3050 if (plane_state->crtc && plane_state->crtc->cursor == plane)
3051 plane_state->state->legacy_cursor_update = true;
3052
3053 ret = __drm_atomic_helper_disable_plane(plane, plane_state);
3054 if (ret != 0)
3055 goto fail;
3056
3057 ret = drm_atomic_commit(state);
3058 fail:
3059 drm_atomic_state_put(state);
3060 return ret;
3061 }
3062 EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080 int drm_atomic_helper_set_config(struct drm_mode_set *set,
3081 struct drm_modeset_acquire_ctx *ctx)
3082 {
3083 struct drm_atomic_state *state;
3084 struct drm_crtc *crtc = set->crtc;
3085 int ret = 0;
3086
3087 state = drm_atomic_state_alloc(crtc->dev);
3088 if (!state)
3089 return -ENOMEM;
3090
3091 state->acquire_ctx = ctx;
3092 ret = __drm_atomic_helper_set_config(set, state);
3093 if (ret != 0)
3094 goto fail;
3095
3096 ret = handle_conflicting_encoders(state, true);
3097 if (ret)
3098 goto fail;
3099
3100 ret = drm_atomic_commit(state);
3101
3102 fail:
3103 drm_atomic_state_put(state);
3104 return ret;
3105 }
3106 EXPORT_SYMBOL(drm_atomic_helper_set_config);
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131 int drm_atomic_helper_disable_all(struct drm_device *dev,
3132 struct drm_modeset_acquire_ctx *ctx)
3133 {
3134 struct drm_atomic_state *state;
3135 struct drm_connector_state *conn_state;
3136 struct drm_connector *conn;
3137 struct drm_plane_state *plane_state;
3138 struct drm_plane *plane;
3139 struct drm_crtc_state *crtc_state;
3140 struct drm_crtc *crtc;
3141 int ret, i;
3142
3143 state = drm_atomic_state_alloc(dev);
3144 if (!state)
3145 return -ENOMEM;
3146
3147 state->acquire_ctx = ctx;
3148
3149 drm_for_each_crtc(crtc, dev) {
3150 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3151 if (IS_ERR(crtc_state)) {
3152 ret = PTR_ERR(crtc_state);
3153 goto free;
3154 }
3155
3156 crtc_state->active = false;
3157
3158 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state, NULL);
3159 if (ret < 0)
3160 goto free;
3161
3162 ret = drm_atomic_add_affected_planes(state, crtc);
3163 if (ret < 0)
3164 goto free;
3165
3166 ret = drm_atomic_add_affected_connectors(state, crtc);
3167 if (ret < 0)
3168 goto free;
3169 }
3170
3171 for_each_new_connector_in_state(state, conn, conn_state, i) {
3172 ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
3173 if (ret < 0)
3174 goto free;
3175 }
3176
3177 for_each_new_plane_in_state(state, plane, plane_state, i) {
3178 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
3179 if (ret < 0)
3180 goto free;
3181
3182 drm_atomic_set_fb_for_plane(plane_state, NULL);
3183 }
3184
3185 ret = drm_atomic_commit(state);
3186 free:
3187 drm_atomic_state_put(state);
3188 return ret;
3189 }
3190 EXPORT_SYMBOL(drm_atomic_helper_disable_all);
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203 void drm_atomic_helper_shutdown(struct drm_device *dev)
3204 {
3205 struct drm_modeset_acquire_ctx ctx;
3206 int ret;
3207
3208 DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, ret);
3209
3210 ret = drm_atomic_helper_disable_all(dev, &ctx);
3211 if (ret)
3212 drm_err(dev,
3213 "Disabling all crtc's during unload failed with %i\n",
3214 ret);
3215
3216 DRM_MODESET_LOCK_ALL_END(dev, ctx, ret);
3217 }
3218 EXPORT_SYMBOL(drm_atomic_helper_shutdown);
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244 struct drm_atomic_state *
3245 drm_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_connector_list_iter conn_iter;
3251 struct drm_plane *plane;
3252 struct drm_crtc *crtc;
3253 int err = 0;
3254
3255 state = drm_atomic_state_alloc(dev);
3256 if (!state)
3257 return ERR_PTR(-ENOMEM);
3258
3259 state->acquire_ctx = ctx;
3260 state->duplicated = true;
3261
3262 drm_for_each_crtc(crtc, dev) {
3263 struct drm_crtc_state *crtc_state;
3264
3265 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3266 if (IS_ERR(crtc_state)) {
3267 err = PTR_ERR(crtc_state);
3268 goto free;
3269 }
3270 }
3271
3272 drm_for_each_plane(plane, dev) {
3273 struct drm_plane_state *plane_state;
3274
3275 plane_state = drm_atomic_get_plane_state(state, plane);
3276 if (IS_ERR(plane_state)) {
3277 err = PTR_ERR(plane_state);
3278 goto free;
3279 }
3280 }
3281
3282 drm_connector_list_iter_begin(dev, &conn_iter);
3283 drm_for_each_connector_iter(conn, &conn_iter) {
3284 struct drm_connector_state *conn_state;
3285
3286 conn_state = drm_atomic_get_connector_state(state, conn);
3287 if (IS_ERR(conn_state)) {
3288 err = PTR_ERR(conn_state);
3289 drm_connector_list_iter_end(&conn_iter);
3290 goto free;
3291 }
3292 }
3293 drm_connector_list_iter_end(&conn_iter);
3294
3295
3296 state->acquire_ctx = NULL;
3297
3298 free:
3299 if (err < 0) {
3300 drm_atomic_state_put(state);
3301 state = ERR_PTR(err);
3302 }
3303
3304 return state;
3305 }
3306 EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333 struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
3334 {
3335 struct drm_modeset_acquire_ctx ctx;
3336 struct drm_atomic_state *state;
3337 int err;
3338
3339
3340 state = ERR_PTR(-EINVAL);
3341
3342 DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, err);
3343
3344 state = drm_atomic_helper_duplicate_state(dev, &ctx);
3345 if (IS_ERR(state))
3346 goto unlock;
3347
3348 err = drm_atomic_helper_disable_all(dev, &ctx);
3349 if (err < 0) {
3350 drm_atomic_state_put(state);
3351 state = ERR_PTR(err);
3352 goto unlock;
3353 }
3354
3355 unlock:
3356 DRM_MODESET_LOCK_ALL_END(dev, ctx, err);
3357 if (err)
3358 return ERR_PTR(err);
3359
3360 return state;
3361 }
3362 EXPORT_SYMBOL(drm_atomic_helper_suspend);
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379 int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
3380 struct drm_modeset_acquire_ctx *ctx)
3381 {
3382 int i, ret;
3383 struct drm_plane *plane;
3384 struct drm_plane_state *new_plane_state;
3385 struct drm_connector *connector;
3386 struct drm_connector_state *new_conn_state;
3387 struct drm_crtc *crtc;
3388 struct drm_crtc_state *new_crtc_state;
3389
3390 state->acquire_ctx = ctx;
3391
3392 for_each_new_plane_in_state(state, plane, new_plane_state, i)
3393 state->planes[i].old_state = plane->state;
3394
3395 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
3396 state->crtcs[i].old_state = crtc->state;
3397
3398 for_each_new_connector_in_state(state, connector, new_conn_state, i)
3399 state->connectors[i].old_state = connector->state;
3400
3401 ret = drm_atomic_commit(state);
3402
3403 state->acquire_ctx = NULL;
3404
3405 return ret;
3406 }
3407 EXPORT_SYMBOL(drm_atomic_helper_commit_duplicated_state);
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425 int drm_atomic_helper_resume(struct drm_device *dev,
3426 struct drm_atomic_state *state)
3427 {
3428 struct drm_modeset_acquire_ctx ctx;
3429 int err;
3430
3431 drm_mode_config_reset(dev);
3432
3433 DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, err);
3434
3435 err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
3436
3437 DRM_MODESET_LOCK_ALL_END(dev, ctx, err);
3438 drm_atomic_state_put(state);
3439
3440 return err;
3441 }
3442 EXPORT_SYMBOL(drm_atomic_helper_resume);
3443
3444 static int page_flip_common(struct drm_atomic_state *state,
3445 struct drm_crtc *crtc,
3446 struct drm_framebuffer *fb,
3447 struct drm_pending_vblank_event *event,
3448 uint32_t flags)
3449 {
3450 struct drm_plane *plane = crtc->primary;
3451 struct drm_plane_state *plane_state;
3452 struct drm_crtc_state *crtc_state;
3453 int ret = 0;
3454
3455 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3456 if (IS_ERR(crtc_state))
3457 return PTR_ERR(crtc_state);
3458
3459 crtc_state->event = event;
3460 crtc_state->async_flip = flags & DRM_MODE_PAGE_FLIP_ASYNC;
3461
3462 plane_state = drm_atomic_get_plane_state(state, plane);
3463 if (IS_ERR(plane_state))
3464 return PTR_ERR(plane_state);
3465
3466 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
3467 if (ret != 0)
3468 return ret;
3469 drm_atomic_set_fb_for_plane(plane_state, fb);
3470
3471
3472 state->allow_modeset = false;
3473 if (!crtc_state->active) {
3474 drm_dbg_atomic(crtc->dev,
3475 "[CRTC:%d:%s] disabled, rejecting legacy flip\n",
3476 crtc->base.id, crtc->name);
3477 return -EINVAL;
3478 }
3479
3480 return ret;
3481 }
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500 int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
3501 struct drm_framebuffer *fb,
3502 struct drm_pending_vblank_event *event,
3503 uint32_t flags,
3504 struct drm_modeset_acquire_ctx *ctx)
3505 {
3506 struct drm_plane *plane = crtc->primary;
3507 struct drm_atomic_state *state;
3508 int ret = 0;
3509
3510 state = drm_atomic_state_alloc(plane->dev);
3511 if (!state)
3512 return -ENOMEM;
3513
3514 state->acquire_ctx = ctx;
3515
3516 ret = page_flip_common(state, crtc, fb, event, flags);
3517 if (ret != 0)
3518 goto fail;
3519
3520 ret = drm_atomic_nonblocking_commit(state);
3521 fail:
3522 drm_atomic_state_put(state);
3523 return ret;
3524 }
3525 EXPORT_SYMBOL(drm_atomic_helper_page_flip);
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543 int drm_atomic_helper_page_flip_target(struct drm_crtc *crtc,
3544 struct drm_framebuffer *fb,
3545 struct drm_pending_vblank_event *event,
3546 uint32_t flags,
3547 uint32_t target,
3548 struct drm_modeset_acquire_ctx *ctx)
3549 {
3550 struct drm_plane *plane = crtc->primary;
3551 struct drm_atomic_state *state;
3552 struct drm_crtc_state *crtc_state;
3553 int ret = 0;
3554
3555 state = drm_atomic_state_alloc(plane->dev);
3556 if (!state)
3557 return -ENOMEM;
3558
3559 state->acquire_ctx = ctx;
3560
3561 ret = page_flip_common(state, crtc, fb, event, flags);
3562 if (ret != 0)
3563 goto fail;
3564
3565 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
3566 if (WARN_ON(!crtc_state)) {
3567 ret = -EINVAL;
3568 goto fail;
3569 }
3570 crtc_state->target_vblank = target;
3571
3572 ret = drm_atomic_nonblocking_commit(state);
3573 fail:
3574 drm_atomic_state_put(state);
3575 return ret;
3576 }
3577 EXPORT_SYMBOL(drm_atomic_helper_page_flip_target);
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598 u32 *
3599 drm_atomic_helper_bridge_propagate_bus_fmt(struct drm_bridge *bridge,
3600 struct drm_bridge_state *bridge_state,
3601 struct drm_crtc_state *crtc_state,
3602 struct drm_connector_state *conn_state,
3603 u32 output_fmt,
3604 unsigned int *num_input_fmts)
3605 {
3606 u32 *input_fmts;
3607
3608 input_fmts = kzalloc(sizeof(*input_fmts), GFP_KERNEL);
3609 if (!input_fmts) {
3610 *num_input_fmts = 0;
3611 return NULL;
3612 }
3613
3614 *num_input_fmts = 1;
3615 input_fmts[0] = output_fmt;
3616 return input_fmts;
3617 }
3618 EXPORT_SYMBOL(drm_atomic_helper_bridge_propagate_bus_fmt);