Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/gpu/drm/drm_atomic.c
26428 views
1
/*
2
* Copyright (C) 2014 Red Hat
3
* Copyright (C) 2014 Intel Corp.
4
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
12
*
13
* The above copyright notice and this permission notice shall be included in
14
* all copies or substantial portions of the Software.
15
*
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
* OTHER DEALINGS IN THE SOFTWARE.
23
*
24
* Authors:
25
* Rob Clark <[email protected]>
26
* Daniel Vetter <[email protected]>
27
*/
28
29
#include <linux/export.h>
30
#include <linux/sync_file.h>
31
32
#include <drm/drm_atomic.h>
33
#include <drm/drm_atomic_uapi.h>
34
#include <drm/drm_blend.h>
35
#include <drm/drm_bridge.h>
36
#include <drm/drm_debugfs.h>
37
#include <drm/drm_device.h>
38
#include <drm/drm_drv.h>
39
#include <drm/drm_file.h>
40
#include <drm/drm_fourcc.h>
41
#include <drm/drm_framebuffer.h>
42
#include <drm/drm_mode.h>
43
#include <drm/drm_print.h>
44
#include <drm/drm_writeback.h>
45
46
#include "drm_crtc_internal.h"
47
#include "drm_internal.h"
48
49
void __drm_crtc_commit_free(struct kref *kref)
50
{
51
struct drm_crtc_commit *commit =
52
container_of(kref, struct drm_crtc_commit, ref);
53
54
kfree(commit);
55
}
56
EXPORT_SYMBOL(__drm_crtc_commit_free);
57
58
/**
59
* drm_crtc_commit_wait - Waits for a commit to complete
60
* @commit: &drm_crtc_commit to wait for
61
*
62
* Waits for a given &drm_crtc_commit to be programmed into the
63
* hardware and flipped to.
64
*
65
* Returns:
66
* 0 on success, a negative error code otherwise.
67
*/
68
int drm_crtc_commit_wait(struct drm_crtc_commit *commit)
69
{
70
unsigned long timeout = 10 * HZ;
71
int ret;
72
73
if (!commit)
74
return 0;
75
76
ret = wait_for_completion_timeout(&commit->hw_done, timeout);
77
if (!ret) {
78
drm_err(commit->crtc->dev, "hw_done timed out\n");
79
return -ETIMEDOUT;
80
}
81
82
/*
83
* Currently no support for overwriting flips, hence
84
* stall for previous one to execute completely.
85
*/
86
ret = wait_for_completion_timeout(&commit->flip_done, timeout);
87
if (!ret) {
88
drm_err(commit->crtc->dev, "flip_done timed out\n");
89
return -ETIMEDOUT;
90
}
91
92
return 0;
93
}
94
EXPORT_SYMBOL(drm_crtc_commit_wait);
95
96
/**
97
* drm_atomic_state_default_release -
98
* release memory initialized by drm_atomic_state_init
99
* @state: atomic state
100
*
101
* Free all the memory allocated by drm_atomic_state_init.
102
* This should only be used by drivers which are still subclassing
103
* &drm_atomic_state and haven't switched to &drm_private_state yet.
104
*/
105
void drm_atomic_state_default_release(struct drm_atomic_state *state)
106
{
107
kfree(state->connectors);
108
kfree(state->crtcs);
109
kfree(state->planes);
110
kfree(state->private_objs);
111
}
112
EXPORT_SYMBOL(drm_atomic_state_default_release);
113
114
/**
115
* drm_atomic_state_init - init new atomic state
116
* @dev: DRM device
117
* @state: atomic state
118
*
119
* Default implementation for filling in a new atomic state.
120
* This should only be used by drivers which are still subclassing
121
* &drm_atomic_state and haven't switched to &drm_private_state yet.
122
*/
123
int
124
drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state)
125
{
126
kref_init(&state->ref);
127
128
/* TODO legacy paths should maybe do a better job about
129
* setting this appropriately?
130
*/
131
state->allow_modeset = true;
132
133
state->crtcs = kcalloc(dev->mode_config.num_crtc,
134
sizeof(*state->crtcs), GFP_KERNEL);
135
if (!state->crtcs)
136
goto fail;
137
state->planes = kcalloc(dev->mode_config.num_total_plane,
138
sizeof(*state->planes), GFP_KERNEL);
139
if (!state->planes)
140
goto fail;
141
142
/*
143
* Because drm_atomic_state can be committed asynchronously we need our
144
* own reference and cannot rely on the on implied by drm_file in the
145
* ioctl call.
146
*/
147
drm_dev_get(dev);
148
state->dev = dev;
149
150
drm_dbg_atomic(dev, "Allocated atomic state %p\n", state);
151
152
return 0;
153
fail:
154
drm_atomic_state_default_release(state);
155
return -ENOMEM;
156
}
157
EXPORT_SYMBOL(drm_atomic_state_init);
158
159
/**
160
* drm_atomic_state_alloc - allocate atomic state
161
* @dev: DRM device
162
*
163
* This allocates an empty atomic state to track updates.
164
*/
165
struct drm_atomic_state *
166
drm_atomic_state_alloc(struct drm_device *dev)
167
{
168
struct drm_mode_config *config = &dev->mode_config;
169
170
if (!config->funcs->atomic_state_alloc) {
171
struct drm_atomic_state *state;
172
173
state = kzalloc(sizeof(*state), GFP_KERNEL);
174
if (!state)
175
return NULL;
176
if (drm_atomic_state_init(dev, state) < 0) {
177
kfree(state);
178
return NULL;
179
}
180
return state;
181
}
182
183
return config->funcs->atomic_state_alloc(dev);
184
}
185
EXPORT_SYMBOL(drm_atomic_state_alloc);
186
187
/**
188
* drm_atomic_state_default_clear - clear base atomic state
189
* @state: atomic state
190
*
191
* Default implementation for clearing atomic state.
192
* This should only be used by drivers which are still subclassing
193
* &drm_atomic_state and haven't switched to &drm_private_state yet.
194
*/
195
void drm_atomic_state_default_clear(struct drm_atomic_state *state)
196
{
197
struct drm_device *dev = state->dev;
198
struct drm_mode_config *config = &dev->mode_config;
199
int i;
200
201
drm_dbg_atomic(dev, "Clearing atomic state %p\n", state);
202
203
for (i = 0; i < state->num_connector; i++) {
204
struct drm_connector *connector = state->connectors[i].ptr;
205
206
if (!connector)
207
continue;
208
209
connector->funcs->atomic_destroy_state(connector,
210
state->connectors[i].state);
211
state->connectors[i].ptr = NULL;
212
state->connectors[i].state = NULL;
213
state->connectors[i].old_state = NULL;
214
state->connectors[i].new_state = NULL;
215
drm_connector_put(connector);
216
}
217
218
for (i = 0; i < config->num_crtc; i++) {
219
struct drm_crtc *crtc = state->crtcs[i].ptr;
220
221
if (!crtc)
222
continue;
223
224
crtc->funcs->atomic_destroy_state(crtc,
225
state->crtcs[i].state);
226
227
state->crtcs[i].ptr = NULL;
228
state->crtcs[i].state = NULL;
229
state->crtcs[i].old_state = NULL;
230
state->crtcs[i].new_state = NULL;
231
232
if (state->crtcs[i].commit) {
233
drm_crtc_commit_put(state->crtcs[i].commit);
234
state->crtcs[i].commit = NULL;
235
}
236
}
237
238
for (i = 0; i < config->num_total_plane; i++) {
239
struct drm_plane *plane = state->planes[i].ptr;
240
241
if (!plane)
242
continue;
243
244
plane->funcs->atomic_destroy_state(plane,
245
state->planes[i].state);
246
state->planes[i].ptr = NULL;
247
state->planes[i].state = NULL;
248
state->planes[i].old_state = NULL;
249
state->planes[i].new_state = NULL;
250
}
251
252
for (i = 0; i < state->num_private_objs; i++) {
253
struct drm_private_obj *obj = state->private_objs[i].ptr;
254
255
obj->funcs->atomic_destroy_state(obj,
256
state->private_objs[i].state);
257
state->private_objs[i].ptr = NULL;
258
state->private_objs[i].state = NULL;
259
state->private_objs[i].old_state = NULL;
260
state->private_objs[i].new_state = NULL;
261
}
262
state->num_private_objs = 0;
263
264
if (state->fake_commit) {
265
drm_crtc_commit_put(state->fake_commit);
266
state->fake_commit = NULL;
267
}
268
}
269
EXPORT_SYMBOL(drm_atomic_state_default_clear);
270
271
/**
272
* drm_atomic_state_clear - clear state object
273
* @state: atomic state
274
*
275
* When the w/w mutex algorithm detects a deadlock we need to back off and drop
276
* all locks. So someone else could sneak in and change the current modeset
277
* configuration. Which means that all the state assembled in @state is no
278
* longer an atomic update to the current state, but to some arbitrary earlier
279
* state. Which could break assumptions the driver's
280
* &drm_mode_config_funcs.atomic_check likely relies on.
281
*
282
* Hence we must clear all cached state and completely start over, using this
283
* function.
284
*/
285
void drm_atomic_state_clear(struct drm_atomic_state *state)
286
{
287
struct drm_device *dev = state->dev;
288
struct drm_mode_config *config = &dev->mode_config;
289
290
if (config->funcs->atomic_state_clear)
291
config->funcs->atomic_state_clear(state);
292
else
293
drm_atomic_state_default_clear(state);
294
}
295
EXPORT_SYMBOL(drm_atomic_state_clear);
296
297
/**
298
* __drm_atomic_state_free - free all memory for an atomic state
299
* @ref: This atomic state to deallocate
300
*
301
* This frees all memory associated with an atomic state, including all the
302
* per-object state for planes, CRTCs and connectors.
303
*/
304
void __drm_atomic_state_free(struct kref *ref)
305
{
306
struct drm_atomic_state *state = container_of(ref, typeof(*state), ref);
307
struct drm_device *dev = state->dev;
308
struct drm_mode_config *config = &dev->mode_config;
309
310
drm_atomic_state_clear(state);
311
312
drm_dbg_atomic(state->dev, "Freeing atomic state %p\n", state);
313
314
if (config->funcs->atomic_state_free) {
315
config->funcs->atomic_state_free(state);
316
} else {
317
drm_atomic_state_default_release(state);
318
kfree(state);
319
}
320
321
drm_dev_put(dev);
322
}
323
EXPORT_SYMBOL(__drm_atomic_state_free);
324
325
/**
326
* drm_atomic_get_crtc_state - get CRTC state
327
* @state: global atomic state object
328
* @crtc: CRTC to get state object for
329
*
330
* This function returns the CRTC state for the given CRTC, allocating it if
331
* needed. It will also grab the relevant CRTC lock to make sure that the state
332
* is consistent.
333
*
334
* WARNING: Drivers may only add new CRTC states to a @state if
335
* drm_atomic_state.allow_modeset is set, or if it's a driver-internal commit
336
* not created by userspace through an IOCTL call.
337
*
338
* Returns:
339
* Either the allocated state or the error code encoded into the pointer. When
340
* the error is EDEADLK then the w/w mutex code has detected a deadlock and the
341
* entire atomic sequence must be restarted. All other errors are fatal.
342
*/
343
struct drm_crtc_state *
344
drm_atomic_get_crtc_state(struct drm_atomic_state *state,
345
struct drm_crtc *crtc)
346
{
347
int ret, index = drm_crtc_index(crtc);
348
struct drm_crtc_state *crtc_state;
349
350
WARN_ON(!state->acquire_ctx);
351
352
crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
353
if (crtc_state)
354
return crtc_state;
355
356
ret = drm_modeset_lock(&crtc->mutex, state->acquire_ctx);
357
if (ret)
358
return ERR_PTR(ret);
359
360
crtc_state = crtc->funcs->atomic_duplicate_state(crtc);
361
if (!crtc_state)
362
return ERR_PTR(-ENOMEM);
363
364
state->crtcs[index].state = crtc_state;
365
state->crtcs[index].old_state = crtc->state;
366
state->crtcs[index].new_state = crtc_state;
367
state->crtcs[index].ptr = crtc;
368
crtc_state->state = state;
369
370
drm_dbg_atomic(state->dev, "Added [CRTC:%d:%s] %p state to %p\n",
371
crtc->base.id, crtc->name, crtc_state, state);
372
373
return crtc_state;
374
}
375
EXPORT_SYMBOL(drm_atomic_get_crtc_state);
376
377
static int drm_atomic_crtc_check(const struct drm_crtc_state *old_crtc_state,
378
const struct drm_crtc_state *new_crtc_state)
379
{
380
struct drm_crtc *crtc = new_crtc_state->crtc;
381
382
/* NOTE: we explicitly don't enforce constraints such as primary
383
* layer covering entire screen, since that is something we want
384
* to allow (on hw that supports it). For hw that does not, it
385
* should be checked in driver's crtc->atomic_check() vfunc.
386
*
387
* TODO: Add generic modeset state checks once we support those.
388
*/
389
390
if (new_crtc_state->active && !new_crtc_state->enable) {
391
drm_dbg_atomic(crtc->dev,
392
"[CRTC:%d:%s] active without enabled\n",
393
crtc->base.id, crtc->name);
394
return -EINVAL;
395
}
396
397
/* The state->enable vs. state->mode_blob checks can be WARN_ON,
398
* as this is a kernel-internal detail that userspace should never
399
* be able to trigger.
400
*/
401
if (drm_core_check_feature(crtc->dev, DRIVER_ATOMIC) &&
402
WARN_ON(new_crtc_state->enable && !new_crtc_state->mode_blob)) {
403
drm_dbg_atomic(crtc->dev,
404
"[CRTC:%d:%s] enabled without mode blob\n",
405
crtc->base.id, crtc->name);
406
return -EINVAL;
407
}
408
409
if (drm_core_check_feature(crtc->dev, DRIVER_ATOMIC) &&
410
WARN_ON(!new_crtc_state->enable && new_crtc_state->mode_blob)) {
411
drm_dbg_atomic(crtc->dev,
412
"[CRTC:%d:%s] disabled with mode blob\n",
413
crtc->base.id, crtc->name);
414
return -EINVAL;
415
}
416
417
/*
418
* Reject event generation for when a CRTC is off and stays off.
419
* It wouldn't be hard to implement this, but userspace has a track
420
* record of happily burning through 100% cpu (or worse, crash) when the
421
* display pipe is suspended. To avoid all that fun just reject updates
422
* that ask for events since likely that indicates a bug in the
423
* compositor's drawing loop. This is consistent with the vblank IOCTL
424
* and legacy page_flip IOCTL which also reject service on a disabled
425
* pipe.
426
*/
427
if (new_crtc_state->event &&
428
!new_crtc_state->active && !old_crtc_state->active) {
429
drm_dbg_atomic(crtc->dev,
430
"[CRTC:%d:%s] requesting event but off\n",
431
crtc->base.id, crtc->name);
432
return -EINVAL;
433
}
434
435
return 0;
436
}
437
438
static void drm_atomic_crtc_print_state(struct drm_printer *p,
439
const struct drm_crtc_state *state)
440
{
441
struct drm_crtc *crtc = state->crtc;
442
443
drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name);
444
drm_printf(p, "\tenable=%d\n", state->enable);
445
drm_printf(p, "\tactive=%d\n", state->active);
446
drm_printf(p, "\tself_refresh_active=%d\n", state->self_refresh_active);
447
drm_printf(p, "\tplanes_changed=%d\n", state->planes_changed);
448
drm_printf(p, "\tmode_changed=%d\n", state->mode_changed);
449
drm_printf(p, "\tactive_changed=%d\n", state->active_changed);
450
drm_printf(p, "\tconnectors_changed=%d\n", state->connectors_changed);
451
drm_printf(p, "\tcolor_mgmt_changed=%d\n", state->color_mgmt_changed);
452
drm_printf(p, "\tplane_mask=%x\n", state->plane_mask);
453
drm_printf(p, "\tconnector_mask=%x\n", state->connector_mask);
454
drm_printf(p, "\tencoder_mask=%x\n", state->encoder_mask);
455
drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode));
456
457
if (crtc->funcs->atomic_print_state)
458
crtc->funcs->atomic_print_state(p, state);
459
}
460
461
static int drm_atomic_connector_check(struct drm_connector *connector,
462
struct drm_connector_state *state)
463
{
464
struct drm_crtc_state *crtc_state;
465
struct drm_writeback_job *writeback_job = state->writeback_job;
466
const struct drm_display_info *info = &connector->display_info;
467
468
state->max_bpc = info->bpc ? info->bpc : 8;
469
if (connector->max_bpc_property)
470
state->max_bpc = min(state->max_bpc, state->max_requested_bpc);
471
472
if ((connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) || !writeback_job)
473
return 0;
474
475
if (writeback_job->fb && !state->crtc) {
476
drm_dbg_atomic(connector->dev,
477
"[CONNECTOR:%d:%s] framebuffer without CRTC\n",
478
connector->base.id, connector->name);
479
return -EINVAL;
480
}
481
482
if (state->crtc)
483
crtc_state = drm_atomic_get_existing_crtc_state(state->state,
484
state->crtc);
485
486
if (writeback_job->fb && !crtc_state->active) {
487
drm_dbg_atomic(connector->dev,
488
"[CONNECTOR:%d:%s] has framebuffer, but [CRTC:%d] is off\n",
489
connector->base.id, connector->name,
490
state->crtc->base.id);
491
return -EINVAL;
492
}
493
494
if (!writeback_job->fb) {
495
if (writeback_job->out_fence) {
496
drm_dbg_atomic(connector->dev,
497
"[CONNECTOR:%d:%s] requesting out-fence without framebuffer\n",
498
connector->base.id, connector->name);
499
return -EINVAL;
500
}
501
502
drm_writeback_cleanup_job(writeback_job);
503
state->writeback_job = NULL;
504
}
505
506
return 0;
507
}
508
509
/**
510
* drm_atomic_get_plane_state - get plane state
511
* @state: global atomic state object
512
* @plane: plane to get state object for
513
*
514
* This function returns the plane state for the given plane, allocating it if
515
* needed. It will also grab the relevant plane lock to make sure that the state
516
* is consistent.
517
*
518
* Returns:
519
* Either the allocated state or the error code encoded into the pointer. When
520
* the error is EDEADLK then the w/w mutex code has detected a deadlock and the
521
* entire atomic sequence must be restarted. All other errors are fatal.
522
*/
523
struct drm_plane_state *
524
drm_atomic_get_plane_state(struct drm_atomic_state *state,
525
struct drm_plane *plane)
526
{
527
int ret, index = drm_plane_index(plane);
528
struct drm_plane_state *plane_state;
529
530
WARN_ON(!state->acquire_ctx);
531
532
/* the legacy pointers should never be set */
533
WARN_ON(plane->fb);
534
WARN_ON(plane->old_fb);
535
WARN_ON(plane->crtc);
536
537
plane_state = drm_atomic_get_existing_plane_state(state, plane);
538
if (plane_state)
539
return plane_state;
540
541
ret = drm_modeset_lock(&plane->mutex, state->acquire_ctx);
542
if (ret)
543
return ERR_PTR(ret);
544
545
plane_state = plane->funcs->atomic_duplicate_state(plane);
546
if (!plane_state)
547
return ERR_PTR(-ENOMEM);
548
549
state->planes[index].state = plane_state;
550
state->planes[index].ptr = plane;
551
state->planes[index].old_state = plane->state;
552
state->planes[index].new_state = plane_state;
553
plane_state->state = state;
554
555
drm_dbg_atomic(plane->dev, "Added [PLANE:%d:%s] %p state to %p\n",
556
plane->base.id, plane->name, plane_state, state);
557
558
if (plane_state->crtc) {
559
struct drm_crtc_state *crtc_state;
560
561
crtc_state = drm_atomic_get_crtc_state(state,
562
plane_state->crtc);
563
if (IS_ERR(crtc_state))
564
return ERR_CAST(crtc_state);
565
}
566
567
return plane_state;
568
}
569
EXPORT_SYMBOL(drm_atomic_get_plane_state);
570
571
static bool
572
plane_switching_crtc(const struct drm_plane_state *old_plane_state,
573
const struct drm_plane_state *new_plane_state)
574
{
575
if (!old_plane_state->crtc || !new_plane_state->crtc)
576
return false;
577
578
if (old_plane_state->crtc == new_plane_state->crtc)
579
return false;
580
581
/* This could be refined, but currently there's no helper or driver code
582
* to implement direct switching of active planes nor userspace to take
583
* advantage of more direct plane switching without the intermediate
584
* full OFF state.
585
*/
586
return true;
587
}
588
589
/**
590
* drm_atomic_plane_check - check plane state
591
* @old_plane_state: old plane state to check
592
* @new_plane_state: new plane state to check
593
*
594
* Provides core sanity checks for plane state.
595
*
596
* RETURNS:
597
* Zero on success, error code on failure
598
*/
599
static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
600
const struct drm_plane_state *new_plane_state)
601
{
602
struct drm_plane *plane = new_plane_state->plane;
603
struct drm_crtc *crtc = new_plane_state->crtc;
604
const struct drm_framebuffer *fb = new_plane_state->fb;
605
unsigned int fb_width, fb_height;
606
struct drm_mode_rect *clips;
607
uint32_t num_clips;
608
609
/* either *both* CRTC and FB must be set, or neither */
610
if (crtc && !fb) {
611
drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] CRTC set but no FB\n",
612
plane->base.id, plane->name);
613
return -EINVAL;
614
} else if (fb && !crtc) {
615
drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] FB set but no CRTC\n",
616
plane->base.id, plane->name);
617
return -EINVAL;
618
}
619
620
/* if disabled, we don't care about the rest of the state: */
621
if (!crtc)
622
return 0;
623
624
/* Check whether this plane is usable on this CRTC */
625
if (!(plane->possible_crtcs & drm_crtc_mask(crtc))) {
626
drm_dbg_atomic(plane->dev,
627
"Invalid [CRTC:%d:%s] for [PLANE:%d:%s]\n",
628
crtc->base.id, crtc->name,
629
plane->base.id, plane->name);
630
return -EINVAL;
631
}
632
633
/* Check whether this plane supports the fb pixel format. */
634
if (!drm_plane_has_format(plane, fb->format->format, fb->modifier)) {
635
drm_dbg_atomic(plane->dev,
636
"[PLANE:%d:%s] invalid pixel format %p4cc, modifier 0x%llx\n",
637
plane->base.id, plane->name,
638
&fb->format->format, fb->modifier);
639
return -EINVAL;
640
}
641
642
/* Give drivers some help against integer overflows */
643
if (new_plane_state->crtc_w > INT_MAX ||
644
new_plane_state->crtc_x > INT_MAX - (int32_t) new_plane_state->crtc_w ||
645
new_plane_state->crtc_h > INT_MAX ||
646
new_plane_state->crtc_y > INT_MAX - (int32_t) new_plane_state->crtc_h) {
647
drm_dbg_atomic(plane->dev,
648
"[PLANE:%d:%s] invalid CRTC coordinates %ux%u+%d+%d\n",
649
plane->base.id, plane->name,
650
new_plane_state->crtc_w, new_plane_state->crtc_h,
651
new_plane_state->crtc_x, new_plane_state->crtc_y);
652
return -ERANGE;
653
}
654
655
fb_width = fb->width << 16;
656
fb_height = fb->height << 16;
657
658
/* Make sure source coordinates are inside the fb. */
659
if (new_plane_state->src_w > fb_width ||
660
new_plane_state->src_x > fb_width - new_plane_state->src_w ||
661
new_plane_state->src_h > fb_height ||
662
new_plane_state->src_y > fb_height - new_plane_state->src_h) {
663
drm_dbg_atomic(plane->dev,
664
"[PLANE:%d:%s] invalid source coordinates "
665
"%u.%06ux%u.%06u+%u.%06u+%u.%06u (fb %ux%u)\n",
666
plane->base.id, plane->name,
667
new_plane_state->src_w >> 16,
668
((new_plane_state->src_w & 0xffff) * 15625) >> 10,
669
new_plane_state->src_h >> 16,
670
((new_plane_state->src_h & 0xffff) * 15625) >> 10,
671
new_plane_state->src_x >> 16,
672
((new_plane_state->src_x & 0xffff) * 15625) >> 10,
673
new_plane_state->src_y >> 16,
674
((new_plane_state->src_y & 0xffff) * 15625) >> 10,
675
fb->width, fb->height);
676
return -ENOSPC;
677
}
678
679
clips = __drm_plane_get_damage_clips(new_plane_state);
680
num_clips = drm_plane_get_damage_clips_count(new_plane_state);
681
682
/* Make sure damage clips are valid and inside the fb. */
683
while (num_clips > 0) {
684
if (clips->x1 >= clips->x2 ||
685
clips->y1 >= clips->y2 ||
686
clips->x1 < 0 ||
687
clips->y1 < 0 ||
688
clips->x2 > fb_width ||
689
clips->y2 > fb_height) {
690
drm_dbg_atomic(plane->dev,
691
"[PLANE:%d:%s] invalid damage clip %d %d %d %d\n",
692
plane->base.id, plane->name, clips->x1,
693
clips->y1, clips->x2, clips->y2);
694
return -EINVAL;
695
}
696
clips++;
697
num_clips--;
698
}
699
700
if (plane_switching_crtc(old_plane_state, new_plane_state)) {
701
drm_dbg_atomic(plane->dev,
702
"[PLANE:%d:%s] switching CRTC directly\n",
703
plane->base.id, plane->name);
704
return -EINVAL;
705
}
706
707
return 0;
708
}
709
710
static void drm_atomic_plane_print_state(struct drm_printer *p,
711
const struct drm_plane_state *state)
712
{
713
struct drm_plane *plane = state->plane;
714
struct drm_rect src = drm_plane_state_src(state);
715
struct drm_rect dest = drm_plane_state_dest(state);
716
717
drm_printf(p, "plane[%u]: %s\n", plane->base.id, plane->name);
718
drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
719
drm_printf(p, "\tfb=%u\n", state->fb ? state->fb->base.id : 0);
720
if (state->fb)
721
drm_framebuffer_print_info(p, 2, state->fb);
722
drm_printf(p, "\tcrtc-pos=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&dest));
723
drm_printf(p, "\tsrc-pos=" DRM_RECT_FP_FMT "\n", DRM_RECT_FP_ARG(&src));
724
drm_printf(p, "\trotation=%x\n", state->rotation);
725
drm_printf(p, "\tnormalized-zpos=%x\n", state->normalized_zpos);
726
drm_printf(p, "\tcolor-encoding=%s\n",
727
drm_get_color_encoding_name(state->color_encoding));
728
drm_printf(p, "\tcolor-range=%s\n",
729
drm_get_color_range_name(state->color_range));
730
drm_printf(p, "\tcolor_mgmt_changed=%d\n", state->color_mgmt_changed);
731
732
if (plane->funcs->atomic_print_state)
733
plane->funcs->atomic_print_state(p, state);
734
}
735
736
/**
737
* DOC: handling driver private state
738
*
739
* Very often the DRM objects exposed to userspace in the atomic modeset api
740
* (&drm_connector, &drm_crtc and &drm_plane) do not map neatly to the
741
* underlying hardware. Especially for any kind of shared resources (e.g. shared
742
* clocks, scaler units, bandwidth and fifo limits shared among a group of
743
* planes or CRTCs, and so on) it makes sense to model these as independent
744
* objects. Drivers then need to do similar state tracking and commit ordering for
745
* such private (since not exposed to userspace) objects as the atomic core and
746
* helpers already provide for connectors, planes and CRTCs.
747
*
748
* To make this easier on drivers the atomic core provides some support to track
749
* driver private state objects using struct &drm_private_obj, with the
750
* associated state struct &drm_private_state.
751
*
752
* Similar to userspace-exposed objects, private state structures can be
753
* acquired by calling drm_atomic_get_private_obj_state(). This also takes care
754
* of locking, hence drivers should not have a need to call drm_modeset_lock()
755
* directly. Sequence of the actual hardware state commit is not handled,
756
* drivers might need to keep track of struct drm_crtc_commit within subclassed
757
* structure of &drm_private_state as necessary, e.g. similar to
758
* &drm_plane_state.commit. See also &drm_atomic_state.fake_commit.
759
*
760
* All private state structures contained in a &drm_atomic_state update can be
761
* iterated using for_each_oldnew_private_obj_in_state(),
762
* for_each_new_private_obj_in_state() and for_each_old_private_obj_in_state().
763
* Drivers are recommended to wrap these for each type of driver private state
764
* object they have, filtering on &drm_private_obj.funcs using for_each_if(), at
765
* least if they want to iterate over all objects of a given type.
766
*
767
* An earlier way to handle driver private state was by subclassing struct
768
* &drm_atomic_state. But since that encourages non-standard ways to implement
769
* the check/commit split atomic requires (by using e.g. "check and rollback or
770
* commit instead" of "duplicate state, check, then either commit or release
771
* duplicated state) it is deprecated in favour of using &drm_private_state.
772
*/
773
774
/**
775
* drm_atomic_private_obj_init - initialize private object
776
* @dev: DRM device this object will be attached to
777
* @obj: private object
778
* @state: initial private object state
779
* @funcs: pointer to the struct of function pointers that identify the object
780
* type
781
*
782
* Initialize the private object, which can be embedded into any
783
* driver private object that needs its own atomic state.
784
*/
785
void
786
drm_atomic_private_obj_init(struct drm_device *dev,
787
struct drm_private_obj *obj,
788
struct drm_private_state *state,
789
const struct drm_private_state_funcs *funcs)
790
{
791
memset(obj, 0, sizeof(*obj));
792
793
drm_modeset_lock_init(&obj->lock);
794
795
obj->state = state;
796
obj->funcs = funcs;
797
list_add_tail(&obj->head, &dev->mode_config.privobj_list);
798
799
state->obj = obj;
800
}
801
EXPORT_SYMBOL(drm_atomic_private_obj_init);
802
803
/**
804
* drm_atomic_private_obj_fini - finalize private object
805
* @obj: private object
806
*
807
* Finalize the private object.
808
*/
809
void
810
drm_atomic_private_obj_fini(struct drm_private_obj *obj)
811
{
812
list_del(&obj->head);
813
obj->funcs->atomic_destroy_state(obj, obj->state);
814
drm_modeset_lock_fini(&obj->lock);
815
}
816
EXPORT_SYMBOL(drm_atomic_private_obj_fini);
817
818
/**
819
* drm_atomic_get_private_obj_state - get private object state
820
* @state: global atomic state
821
* @obj: private object to get the state for
822
*
823
* This function returns the private object state for the given private object,
824
* allocating the state if needed. It will also grab the relevant private
825
* object lock to make sure that the state is consistent.
826
*
827
* RETURNS:
828
* Either the allocated state or the error code encoded into a pointer.
829
*/
830
struct drm_private_state *
831
drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
832
struct drm_private_obj *obj)
833
{
834
int index, num_objs, i, ret;
835
size_t size;
836
struct __drm_private_objs_state *arr;
837
struct drm_private_state *obj_state;
838
839
for (i = 0; i < state->num_private_objs; i++)
840
if (obj == state->private_objs[i].ptr)
841
return state->private_objs[i].state;
842
843
ret = drm_modeset_lock(&obj->lock, state->acquire_ctx);
844
if (ret)
845
return ERR_PTR(ret);
846
847
num_objs = state->num_private_objs + 1;
848
size = sizeof(*state->private_objs) * num_objs;
849
arr = krealloc(state->private_objs, size, GFP_KERNEL);
850
if (!arr)
851
return ERR_PTR(-ENOMEM);
852
853
state->private_objs = arr;
854
index = state->num_private_objs;
855
memset(&state->private_objs[index], 0, sizeof(*state->private_objs));
856
857
obj_state = obj->funcs->atomic_duplicate_state(obj);
858
if (!obj_state)
859
return ERR_PTR(-ENOMEM);
860
861
state->private_objs[index].state = obj_state;
862
state->private_objs[index].old_state = obj->state;
863
state->private_objs[index].new_state = obj_state;
864
state->private_objs[index].ptr = obj;
865
obj_state->state = state;
866
867
state->num_private_objs = num_objs;
868
869
drm_dbg_atomic(state->dev,
870
"Added new private object %p state %p to %p\n",
871
obj, obj_state, state);
872
873
return obj_state;
874
}
875
EXPORT_SYMBOL(drm_atomic_get_private_obj_state);
876
877
/**
878
* drm_atomic_get_old_private_obj_state
879
* @state: global atomic state object
880
* @obj: private_obj to grab
881
*
882
* This function returns the old private object state for the given private_obj,
883
* or NULL if the private_obj is not part of the global atomic state.
884
*/
885
struct drm_private_state *
886
drm_atomic_get_old_private_obj_state(const struct drm_atomic_state *state,
887
struct drm_private_obj *obj)
888
{
889
int i;
890
891
for (i = 0; i < state->num_private_objs; i++)
892
if (obj == state->private_objs[i].ptr)
893
return state->private_objs[i].old_state;
894
895
return NULL;
896
}
897
EXPORT_SYMBOL(drm_atomic_get_old_private_obj_state);
898
899
/**
900
* drm_atomic_get_new_private_obj_state
901
* @state: global atomic state object
902
* @obj: private_obj to grab
903
*
904
* This function returns the new private object state for the given private_obj,
905
* or NULL if the private_obj is not part of the global atomic state.
906
*/
907
struct drm_private_state *
908
drm_atomic_get_new_private_obj_state(const struct drm_atomic_state *state,
909
struct drm_private_obj *obj)
910
{
911
int i;
912
913
for (i = 0; i < state->num_private_objs; i++)
914
if (obj == state->private_objs[i].ptr)
915
return state->private_objs[i].new_state;
916
917
return NULL;
918
}
919
EXPORT_SYMBOL(drm_atomic_get_new_private_obj_state);
920
921
/**
922
* drm_atomic_get_old_connector_for_encoder - Get old connector for an encoder
923
* @state: Atomic state
924
* @encoder: The encoder to fetch the connector state for
925
*
926
* This function finds and returns the connector that was connected to @encoder
927
* as specified by the @state.
928
*
929
* If there is no connector in @state which previously had @encoder connected to
930
* it, this function will return NULL. While this may seem like an invalid use
931
* case, it is sometimes useful to differentiate commits which had no prior
932
* connectors attached to @encoder vs ones that did (and to inspect their
933
* state). This is especially true in enable hooks because the pipeline has
934
* changed.
935
*
936
* If you don't have access to the atomic state, see
937
* drm_atomic_get_connector_for_encoder().
938
*
939
* Returns: The old connector connected to @encoder, or NULL if the encoder is
940
* not connected.
941
*/
942
struct drm_connector *
943
drm_atomic_get_old_connector_for_encoder(const struct drm_atomic_state *state,
944
struct drm_encoder *encoder)
945
{
946
struct drm_connector_state *conn_state;
947
struct drm_connector *connector;
948
unsigned int i;
949
950
for_each_old_connector_in_state(state, connector, conn_state, i) {
951
if (conn_state->best_encoder == encoder)
952
return connector;
953
}
954
955
return NULL;
956
}
957
EXPORT_SYMBOL(drm_atomic_get_old_connector_for_encoder);
958
959
/**
960
* drm_atomic_get_new_connector_for_encoder - Get new connector for an encoder
961
* @state: Atomic state
962
* @encoder: The encoder to fetch the connector state for
963
*
964
* This function finds and returns the connector that will be connected to
965
* @encoder as specified by the @state.
966
*
967
* If there is no connector in @state which will have @encoder connected to it,
968
* this function will return NULL. While this may seem like an invalid use case,
969
* it is sometimes useful to differentiate commits which have no connectors
970
* attached to @encoder vs ones that do (and to inspect their state). This is
971
* especially true in disable hooks because the pipeline will change.
972
*
973
* If you don't have access to the atomic state, see
974
* drm_atomic_get_connector_for_encoder().
975
*
976
* Returns: The new connector connected to @encoder, or NULL if the encoder is
977
* not connected.
978
*/
979
struct drm_connector *
980
drm_atomic_get_new_connector_for_encoder(const struct drm_atomic_state *state,
981
struct drm_encoder *encoder)
982
{
983
struct drm_connector_state *conn_state;
984
struct drm_connector *connector;
985
unsigned int i;
986
987
for_each_new_connector_in_state(state, connector, conn_state, i) {
988
if (conn_state->best_encoder == encoder)
989
return connector;
990
}
991
992
return NULL;
993
}
994
EXPORT_SYMBOL(drm_atomic_get_new_connector_for_encoder);
995
996
/**
997
* drm_atomic_get_connector_for_encoder - Get connector currently assigned to an encoder
998
* @encoder: The encoder to find the connector of
999
* @ctx: Modeset locking context
1000
*
1001
* This function finds and returns the connector currently assigned to
1002
* an @encoder.
1003
*
1004
* It is similar to the drm_atomic_get_old_connector_for_encoder() and
1005
* drm_atomic_get_new_connector_for_encoder() helpers, but doesn't
1006
* require access to the atomic state. If you have access to it, prefer
1007
* using these. This helper is typically useful in situations where you
1008
* don't have access to the atomic state, like detect, link repair,
1009
* threaded interrupt handlers, or hooks from other frameworks (ALSA,
1010
* CEC, etc.).
1011
*
1012
* Returns:
1013
* The connector connected to @encoder, or an error pointer otherwise.
1014
* When the error is EDEADLK, a deadlock has been detected and the
1015
* sequence must be restarted.
1016
*/
1017
struct drm_connector *
1018
drm_atomic_get_connector_for_encoder(const struct drm_encoder *encoder,
1019
struct drm_modeset_acquire_ctx *ctx)
1020
{
1021
struct drm_connector_list_iter conn_iter;
1022
struct drm_connector *out_connector = ERR_PTR(-EINVAL);
1023
struct drm_connector *connector;
1024
struct drm_device *dev = encoder->dev;
1025
int ret;
1026
1027
ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
1028
if (ret)
1029
return ERR_PTR(ret);
1030
1031
drm_connector_list_iter_begin(dev, &conn_iter);
1032
drm_for_each_connector_iter(connector, &conn_iter) {
1033
if (!connector->state)
1034
continue;
1035
1036
if (encoder == connector->state->best_encoder) {
1037
out_connector = connector;
1038
break;
1039
}
1040
}
1041
drm_connector_list_iter_end(&conn_iter);
1042
drm_modeset_unlock(&dev->mode_config.connection_mutex);
1043
1044
return out_connector;
1045
}
1046
EXPORT_SYMBOL(drm_atomic_get_connector_for_encoder);
1047
1048
1049
/**
1050
* drm_atomic_get_old_crtc_for_encoder - Get old crtc for an encoder
1051
* @state: Atomic state
1052
* @encoder: The encoder to fetch the crtc state for
1053
*
1054
* This function finds and returns the crtc that was connected to @encoder
1055
* as specified by the @state.
1056
*
1057
* Returns: The old crtc connected to @encoder, or NULL if the encoder is
1058
* not connected.
1059
*/
1060
struct drm_crtc *
1061
drm_atomic_get_old_crtc_for_encoder(struct drm_atomic_state *state,
1062
struct drm_encoder *encoder)
1063
{
1064
struct drm_connector *connector;
1065
struct drm_connector_state *conn_state;
1066
1067
connector = drm_atomic_get_old_connector_for_encoder(state, encoder);
1068
if (!connector)
1069
return NULL;
1070
1071
conn_state = drm_atomic_get_old_connector_state(state, connector);
1072
if (!conn_state)
1073
return NULL;
1074
1075
return conn_state->crtc;
1076
}
1077
EXPORT_SYMBOL(drm_atomic_get_old_crtc_for_encoder);
1078
1079
/**
1080
* drm_atomic_get_new_crtc_for_encoder - Get new crtc for an encoder
1081
* @state: Atomic state
1082
* @encoder: The encoder to fetch the crtc state for
1083
*
1084
* This function finds and returns the crtc that will be connected to @encoder
1085
* as specified by the @state.
1086
*
1087
* Returns: The new crtc connected to @encoder, or NULL if the encoder is
1088
* not connected.
1089
*/
1090
struct drm_crtc *
1091
drm_atomic_get_new_crtc_for_encoder(struct drm_atomic_state *state,
1092
struct drm_encoder *encoder)
1093
{
1094
struct drm_connector *connector;
1095
struct drm_connector_state *conn_state;
1096
1097
connector = drm_atomic_get_new_connector_for_encoder(state, encoder);
1098
if (!connector)
1099
return NULL;
1100
1101
conn_state = drm_atomic_get_new_connector_state(state, connector);
1102
if (!conn_state)
1103
return NULL;
1104
1105
return conn_state->crtc;
1106
}
1107
EXPORT_SYMBOL(drm_atomic_get_new_crtc_for_encoder);
1108
1109
/**
1110
* drm_atomic_get_connector_state - get connector state
1111
* @state: global atomic state object
1112
* @connector: connector to get state object for
1113
*
1114
* This function returns the connector state for the given connector,
1115
* allocating it if needed. It will also grab the relevant connector lock to
1116
* make sure that the state is consistent.
1117
*
1118
* Returns:
1119
* Either the allocated state or the error code encoded into the pointer. When
1120
* the error is EDEADLK then the w/w mutex code has detected a deadlock and the
1121
* entire atomic sequence must be restarted. All other errors are fatal.
1122
*/
1123
struct drm_connector_state *
1124
drm_atomic_get_connector_state(struct drm_atomic_state *state,
1125
struct drm_connector *connector)
1126
{
1127
int ret, index;
1128
struct drm_mode_config *config = &connector->dev->mode_config;
1129
struct drm_connector_state *connector_state;
1130
1131
WARN_ON(!state->acquire_ctx);
1132
1133
ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx);
1134
if (ret)
1135
return ERR_PTR(ret);
1136
1137
index = drm_connector_index(connector);
1138
1139
if (index >= state->num_connector) {
1140
struct __drm_connnectors_state *c;
1141
int alloc = max(index + 1, config->num_connector);
1142
1143
c = krealloc_array(state->connectors, alloc,
1144
sizeof(*state->connectors), GFP_KERNEL);
1145
if (!c)
1146
return ERR_PTR(-ENOMEM);
1147
1148
state->connectors = c;
1149
memset(&state->connectors[state->num_connector], 0,
1150
sizeof(*state->connectors) * (alloc - state->num_connector));
1151
1152
state->num_connector = alloc;
1153
}
1154
1155
if (state->connectors[index].state)
1156
return state->connectors[index].state;
1157
1158
connector_state = connector->funcs->atomic_duplicate_state(connector);
1159
if (!connector_state)
1160
return ERR_PTR(-ENOMEM);
1161
1162
drm_connector_get(connector);
1163
state->connectors[index].state = connector_state;
1164
state->connectors[index].old_state = connector->state;
1165
state->connectors[index].new_state = connector_state;
1166
state->connectors[index].ptr = connector;
1167
connector_state->state = state;
1168
1169
drm_dbg_atomic(connector->dev, "Added [CONNECTOR:%d:%s] %p state to %p\n",
1170
connector->base.id, connector->name,
1171
connector_state, state);
1172
1173
if (connector_state->crtc) {
1174
struct drm_crtc_state *crtc_state;
1175
1176
crtc_state = drm_atomic_get_crtc_state(state,
1177
connector_state->crtc);
1178
if (IS_ERR(crtc_state))
1179
return ERR_CAST(crtc_state);
1180
}
1181
1182
return connector_state;
1183
}
1184
EXPORT_SYMBOL(drm_atomic_get_connector_state);
1185
1186
static void drm_atomic_connector_print_state(struct drm_printer *p,
1187
const struct drm_connector_state *state)
1188
{
1189
struct drm_connector *connector = state->connector;
1190
1191
drm_printf(p, "connector[%u]: %s\n", connector->base.id, connector->name);
1192
drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
1193
drm_printf(p, "\tself_refresh_aware=%d\n", state->self_refresh_aware);
1194
drm_printf(p, "\tinterlace_allowed=%d\n", connector->interlace_allowed);
1195
drm_printf(p, "\tycbcr_420_allowed=%d\n", connector->ycbcr_420_allowed);
1196
drm_printf(p, "\tmax_requested_bpc=%d\n", state->max_requested_bpc);
1197
drm_printf(p, "\tcolorspace=%s\n", drm_get_colorspace_name(state->colorspace));
1198
1199
if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
1200
connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) {
1201
drm_printf(p, "\tbroadcast_rgb=%s\n",
1202
drm_hdmi_connector_get_broadcast_rgb_name(state->hdmi.broadcast_rgb));
1203
drm_printf(p, "\tis_limited_range=%c\n", state->hdmi.is_limited_range ? 'y' : 'n');
1204
drm_printf(p, "\toutput_bpc=%u\n", state->hdmi.output_bpc);
1205
drm_printf(p, "\toutput_format=%s\n",
1206
drm_hdmi_connector_get_output_format_name(state->hdmi.output_format));
1207
drm_printf(p, "\ttmds_char_rate=%llu\n", state->hdmi.tmds_char_rate);
1208
}
1209
1210
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
1211
if (state->writeback_job && state->writeback_job->fb)
1212
drm_printf(p, "\tfb=%d\n", state->writeback_job->fb->base.id);
1213
1214
if (connector->funcs->atomic_print_state)
1215
connector->funcs->atomic_print_state(p, state);
1216
}
1217
1218
/**
1219
* drm_atomic_get_bridge_state - get bridge state
1220
* @state: global atomic state object
1221
* @bridge: bridge to get state object for
1222
*
1223
* This function returns the bridge state for the given bridge, allocating it
1224
* if needed. It will also grab the relevant bridge lock to make sure that the
1225
* state is consistent.
1226
*
1227
* Returns:
1228
* Either the allocated state or the error code encoded into the pointer. When
1229
* the error is EDEADLK then the w/w mutex code has detected a deadlock and the
1230
* entire atomic sequence must be restarted.
1231
*/
1232
struct drm_bridge_state *
1233
drm_atomic_get_bridge_state(struct drm_atomic_state *state,
1234
struct drm_bridge *bridge)
1235
{
1236
struct drm_private_state *obj_state;
1237
1238
obj_state = drm_atomic_get_private_obj_state(state, &bridge->base);
1239
if (IS_ERR(obj_state))
1240
return ERR_CAST(obj_state);
1241
1242
return drm_priv_to_bridge_state(obj_state);
1243
}
1244
EXPORT_SYMBOL(drm_atomic_get_bridge_state);
1245
1246
/**
1247
* drm_atomic_get_old_bridge_state - get old bridge state, if it exists
1248
* @state: global atomic state object
1249
* @bridge: bridge to grab
1250
*
1251
* This function returns the old bridge state for the given bridge, or NULL if
1252
* the bridge is not part of the global atomic state.
1253
*/
1254
struct drm_bridge_state *
1255
drm_atomic_get_old_bridge_state(const struct drm_atomic_state *state,
1256
struct drm_bridge *bridge)
1257
{
1258
struct drm_private_state *obj_state;
1259
1260
obj_state = drm_atomic_get_old_private_obj_state(state, &bridge->base);
1261
if (!obj_state)
1262
return NULL;
1263
1264
return drm_priv_to_bridge_state(obj_state);
1265
}
1266
EXPORT_SYMBOL(drm_atomic_get_old_bridge_state);
1267
1268
/**
1269
* drm_atomic_get_new_bridge_state - get new bridge state, if it exists
1270
* @state: global atomic state object
1271
* @bridge: bridge to grab
1272
*
1273
* This function returns the new bridge state for the given bridge, or NULL if
1274
* the bridge is not part of the global atomic state.
1275
*/
1276
struct drm_bridge_state *
1277
drm_atomic_get_new_bridge_state(const struct drm_atomic_state *state,
1278
struct drm_bridge *bridge)
1279
{
1280
struct drm_private_state *obj_state;
1281
1282
obj_state = drm_atomic_get_new_private_obj_state(state, &bridge->base);
1283
if (!obj_state)
1284
return NULL;
1285
1286
return drm_priv_to_bridge_state(obj_state);
1287
}
1288
EXPORT_SYMBOL(drm_atomic_get_new_bridge_state);
1289
1290
/**
1291
* drm_atomic_add_encoder_bridges - add bridges attached to an encoder
1292
* @state: atomic state
1293
* @encoder: DRM encoder
1294
*
1295
* This function adds all bridges attached to @encoder. This is needed to add
1296
* bridge states to @state and make them available when
1297
* &drm_bridge_funcs.atomic_check(), &drm_bridge_funcs.atomic_pre_enable(),
1298
* &drm_bridge_funcs.atomic_enable(),
1299
* &drm_bridge_funcs.atomic_disable_post_disable() are called.
1300
*
1301
* Returns:
1302
* 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1303
* then the w/w mutex code has detected a deadlock and the entire atomic
1304
* sequence must be restarted. All other errors are fatal.
1305
*/
1306
int
1307
drm_atomic_add_encoder_bridges(struct drm_atomic_state *state,
1308
struct drm_encoder *encoder)
1309
{
1310
struct drm_bridge_state *bridge_state;
1311
struct drm_bridge *bridge;
1312
1313
if (!encoder)
1314
return 0;
1315
1316
drm_dbg_atomic(encoder->dev,
1317
"Adding all bridges for [encoder:%d:%s] to %p\n",
1318
encoder->base.id, encoder->name, state);
1319
1320
drm_for_each_bridge_in_chain(encoder, bridge) {
1321
/* Skip bridges that don't implement the atomic state hooks. */
1322
if (!bridge->funcs->atomic_duplicate_state)
1323
continue;
1324
1325
bridge_state = drm_atomic_get_bridge_state(state, bridge);
1326
if (IS_ERR(bridge_state))
1327
return PTR_ERR(bridge_state);
1328
}
1329
1330
return 0;
1331
}
1332
EXPORT_SYMBOL(drm_atomic_add_encoder_bridges);
1333
1334
/**
1335
* drm_atomic_add_affected_connectors - add connectors for CRTC
1336
* @state: atomic state
1337
* @crtc: DRM CRTC
1338
*
1339
* This function walks the current configuration and adds all connectors
1340
* currently using @crtc to the atomic configuration @state. Note that this
1341
* function must acquire the connection mutex. This can potentially cause
1342
* unneeded serialization if the update is just for the planes on one CRTC. Hence
1343
* drivers and helpers should only call this when really needed (e.g. when a
1344
* full modeset needs to happen due to some change).
1345
*
1346
* Returns:
1347
* 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1348
* then the w/w mutex code has detected a deadlock and the entire atomic
1349
* sequence must be restarted. All other errors are fatal.
1350
*/
1351
int
1352
drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
1353
struct drm_crtc *crtc)
1354
{
1355
struct drm_mode_config *config = &state->dev->mode_config;
1356
struct drm_connector *connector;
1357
struct drm_connector_state *conn_state;
1358
struct drm_connector_list_iter conn_iter;
1359
struct drm_crtc_state *crtc_state;
1360
int ret;
1361
1362
crtc_state = drm_atomic_get_crtc_state(state, crtc);
1363
if (IS_ERR(crtc_state))
1364
return PTR_ERR(crtc_state);
1365
1366
ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx);
1367
if (ret)
1368
return ret;
1369
1370
drm_dbg_atomic(crtc->dev,
1371
"Adding all current connectors for [CRTC:%d:%s] to %p\n",
1372
crtc->base.id, crtc->name, state);
1373
1374
/*
1375
* Changed connectors are already in @state, so only need to look
1376
* at the connector_mask in crtc_state.
1377
*/
1378
drm_connector_list_iter_begin(state->dev, &conn_iter);
1379
drm_for_each_connector_iter(connector, &conn_iter) {
1380
if (!(crtc_state->connector_mask & drm_connector_mask(connector)))
1381
continue;
1382
1383
conn_state = drm_atomic_get_connector_state(state, connector);
1384
if (IS_ERR(conn_state)) {
1385
drm_connector_list_iter_end(&conn_iter);
1386
return PTR_ERR(conn_state);
1387
}
1388
}
1389
drm_connector_list_iter_end(&conn_iter);
1390
1391
return 0;
1392
}
1393
EXPORT_SYMBOL(drm_atomic_add_affected_connectors);
1394
1395
/**
1396
* drm_atomic_add_affected_planes - add planes for CRTC
1397
* @state: atomic state
1398
* @crtc: DRM CRTC
1399
*
1400
* This function walks the current configuration and adds all planes
1401
* currently used by @crtc to the atomic configuration @state. This is useful
1402
* when an atomic commit also needs to check all currently enabled plane on
1403
* @crtc, e.g. when changing the mode. It's also useful when re-enabling a CRTC
1404
* to avoid special code to force-enable all planes.
1405
*
1406
* Since acquiring a plane state will always also acquire the w/w mutex of the
1407
* current CRTC for that plane (if there is any) adding all the plane states for
1408
* a CRTC will not reduce parallelism of atomic updates.
1409
*
1410
* Returns:
1411
* 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1412
* then the w/w mutex code has detected a deadlock and the entire atomic
1413
* sequence must be restarted. All other errors are fatal.
1414
*/
1415
int
1416
drm_atomic_add_affected_planes(struct drm_atomic_state *state,
1417
struct drm_crtc *crtc)
1418
{
1419
const struct drm_crtc_state *old_crtc_state =
1420
drm_atomic_get_old_crtc_state(state, crtc);
1421
struct drm_plane *plane;
1422
1423
WARN_ON(!drm_atomic_get_new_crtc_state(state, crtc));
1424
1425
drm_dbg_atomic(crtc->dev,
1426
"Adding all current planes for [CRTC:%d:%s] to %p\n",
1427
crtc->base.id, crtc->name, state);
1428
1429
drm_for_each_plane_mask(plane, state->dev, old_crtc_state->plane_mask) {
1430
struct drm_plane_state *plane_state =
1431
drm_atomic_get_plane_state(state, plane);
1432
1433
if (IS_ERR(plane_state))
1434
return PTR_ERR(plane_state);
1435
}
1436
return 0;
1437
}
1438
EXPORT_SYMBOL(drm_atomic_add_affected_planes);
1439
1440
/**
1441
* drm_atomic_check_only - check whether a given config would work
1442
* @state: atomic configuration to check
1443
*
1444
* Note that this function can return -EDEADLK if the driver needed to acquire
1445
* more locks but encountered a deadlock. The caller must then do the usual w/w
1446
* backoff dance and restart. All other errors are fatal.
1447
*
1448
* Returns:
1449
* 0 on success, negative error code on failure.
1450
*/
1451
int drm_atomic_check_only(struct drm_atomic_state *state)
1452
{
1453
struct drm_device *dev = state->dev;
1454
struct drm_mode_config *config = &dev->mode_config;
1455
struct drm_plane *plane;
1456
struct drm_plane_state *old_plane_state;
1457
struct drm_plane_state *new_plane_state;
1458
struct drm_crtc *crtc;
1459
struct drm_crtc_state *old_crtc_state;
1460
struct drm_crtc_state *new_crtc_state;
1461
struct drm_connector *conn;
1462
struct drm_connector_state *conn_state;
1463
unsigned int requested_crtc = 0;
1464
unsigned int affected_crtc = 0;
1465
int i, ret = 0;
1466
1467
drm_dbg_atomic(dev, "checking %p\n", state);
1468
1469
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1470
if (new_crtc_state->enable)
1471
requested_crtc |= drm_crtc_mask(crtc);
1472
}
1473
1474
for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
1475
ret = drm_atomic_plane_check(old_plane_state, new_plane_state);
1476
if (ret) {
1477
drm_dbg_atomic(dev, "[PLANE:%d:%s] atomic core check failed\n",
1478
plane->base.id, plane->name);
1479
return ret;
1480
}
1481
}
1482
1483
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
1484
ret = drm_atomic_crtc_check(old_crtc_state, new_crtc_state);
1485
if (ret) {
1486
drm_dbg_atomic(dev, "[CRTC:%d:%s] atomic core check failed\n",
1487
crtc->base.id, crtc->name);
1488
return ret;
1489
}
1490
}
1491
1492
for_each_new_connector_in_state(state, conn, conn_state, i) {
1493
ret = drm_atomic_connector_check(conn, conn_state);
1494
if (ret) {
1495
drm_dbg_atomic(dev, "[CONNECTOR:%d:%s] atomic core check failed\n",
1496
conn->base.id, conn->name);
1497
return ret;
1498
}
1499
}
1500
1501
if (config->funcs->atomic_check) {
1502
ret = config->funcs->atomic_check(state->dev, state);
1503
1504
if (ret) {
1505
drm_dbg_atomic(dev, "atomic driver check for %p failed: %d\n",
1506
state, ret);
1507
return ret;
1508
}
1509
}
1510
1511
if (!state->allow_modeset) {
1512
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1513
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
1514
drm_dbg_atomic(dev, "[CRTC:%d:%s] requires full modeset\n",
1515
crtc->base.id, crtc->name);
1516
return -EINVAL;
1517
}
1518
}
1519
}
1520
1521
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1522
if (new_crtc_state->enable)
1523
affected_crtc |= drm_crtc_mask(crtc);
1524
}
1525
1526
/*
1527
* For commits that allow modesets drivers can add other CRTCs to the
1528
* atomic commit, e.g. when they need to reallocate global resources.
1529
* This can cause spurious EBUSY, which robs compositors of a very
1530
* effective sanity check for their drawing loop. Therefor only allow
1531
* drivers to add unrelated CRTC states for modeset commits.
1532
*
1533
* FIXME: Should add affected_crtc mask to the ATOMIC IOCTL as an output
1534
* so compositors know what's going on.
1535
*/
1536
if (affected_crtc != requested_crtc) {
1537
drm_dbg_atomic(dev,
1538
"driver added CRTC to commit: requested 0x%x, affected 0x%0x\n",
1539
requested_crtc, affected_crtc);
1540
WARN(!state->allow_modeset, "adding CRTC not allowed without modesets: requested 0x%x, affected 0x%0x\n",
1541
requested_crtc, affected_crtc);
1542
}
1543
1544
return 0;
1545
}
1546
EXPORT_SYMBOL(drm_atomic_check_only);
1547
1548
/**
1549
* drm_atomic_commit - commit configuration atomically
1550
* @state: atomic configuration to check
1551
*
1552
* Note that this function can return -EDEADLK if the driver needed to acquire
1553
* more locks but encountered a deadlock. The caller must then do the usual w/w
1554
* backoff dance and restart. All other errors are fatal.
1555
*
1556
* This function will take its own reference on @state.
1557
* Callers should always release their reference with drm_atomic_state_put().
1558
*
1559
* Returns:
1560
* 0 on success, negative error code on failure.
1561
*/
1562
int drm_atomic_commit(struct drm_atomic_state *state)
1563
{
1564
struct drm_mode_config *config = &state->dev->mode_config;
1565
struct drm_printer p = drm_info_printer(state->dev->dev);
1566
int ret;
1567
1568
if (drm_debug_enabled(DRM_UT_STATE))
1569
drm_atomic_print_new_state(state, &p);
1570
1571
ret = drm_atomic_check_only(state);
1572
if (ret)
1573
return ret;
1574
1575
drm_dbg_atomic(state->dev, "committing %p\n", state);
1576
1577
return config->funcs->atomic_commit(state->dev, state, false);
1578
}
1579
EXPORT_SYMBOL(drm_atomic_commit);
1580
1581
/**
1582
* drm_atomic_nonblocking_commit - atomic nonblocking commit
1583
* @state: atomic configuration to check
1584
*
1585
* Note that this function can return -EDEADLK if the driver needed to acquire
1586
* more locks but encountered a deadlock. The caller must then do the usual w/w
1587
* backoff dance and restart. All other errors are fatal.
1588
*
1589
* This function will take its own reference on @state.
1590
* Callers should always release their reference with drm_atomic_state_put().
1591
*
1592
* Returns:
1593
* 0 on success, negative error code on failure.
1594
*/
1595
int drm_atomic_nonblocking_commit(struct drm_atomic_state *state)
1596
{
1597
struct drm_mode_config *config = &state->dev->mode_config;
1598
int ret;
1599
1600
ret = drm_atomic_check_only(state);
1601
if (ret)
1602
return ret;
1603
1604
drm_dbg_atomic(state->dev, "committing %p nonblocking\n", state);
1605
1606
return config->funcs->atomic_commit(state->dev, state, true);
1607
}
1608
EXPORT_SYMBOL(drm_atomic_nonblocking_commit);
1609
1610
/* just used from drm-client and atomic-helper: */
1611
int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
1612
struct drm_plane_state *plane_state)
1613
{
1614
int ret;
1615
1616
ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
1617
if (ret != 0)
1618
return ret;
1619
1620
drm_atomic_set_fb_for_plane(plane_state, NULL);
1621
plane_state->crtc_x = 0;
1622
plane_state->crtc_y = 0;
1623
plane_state->crtc_w = 0;
1624
plane_state->crtc_h = 0;
1625
plane_state->src_x = 0;
1626
plane_state->src_y = 0;
1627
plane_state->src_w = 0;
1628
plane_state->src_h = 0;
1629
1630
return 0;
1631
}
1632
EXPORT_SYMBOL(__drm_atomic_helper_disable_plane);
1633
1634
static int update_output_state(struct drm_atomic_state *state,
1635
struct drm_mode_set *set)
1636
{
1637
struct drm_device *dev = set->crtc->dev;
1638
struct drm_crtc *crtc;
1639
struct drm_crtc_state *new_crtc_state;
1640
struct drm_connector *connector;
1641
struct drm_connector_state *new_conn_state;
1642
int ret, i;
1643
1644
ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
1645
state->acquire_ctx);
1646
if (ret)
1647
return ret;
1648
1649
/* First disable all connectors on the target crtc. */
1650
ret = drm_atomic_add_affected_connectors(state, set->crtc);
1651
if (ret)
1652
return ret;
1653
1654
for_each_new_connector_in_state(state, connector, new_conn_state, i) {
1655
if (new_conn_state->crtc == set->crtc) {
1656
ret = drm_atomic_set_crtc_for_connector(new_conn_state,
1657
NULL);
1658
if (ret)
1659
return ret;
1660
1661
/* Make sure legacy setCrtc always re-trains */
1662
new_conn_state->link_status = DRM_LINK_STATUS_GOOD;
1663
}
1664
}
1665
1666
/* Then set all connectors from set->connectors on the target crtc */
1667
for (i = 0; i < set->num_connectors; i++) {
1668
new_conn_state = drm_atomic_get_connector_state(state,
1669
set->connectors[i]);
1670
if (IS_ERR(new_conn_state))
1671
return PTR_ERR(new_conn_state);
1672
1673
ret = drm_atomic_set_crtc_for_connector(new_conn_state,
1674
set->crtc);
1675
if (ret)
1676
return ret;
1677
}
1678
1679
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
1680
/*
1681
* Don't update ->enable for the CRTC in the set_config request,
1682
* since a mismatch would indicate a bug in the upper layers.
1683
* The actual modeset code later on will catch any
1684
* inconsistencies here.
1685
*/
1686
if (crtc == set->crtc)
1687
continue;
1688
1689
if (!new_crtc_state->connector_mask) {
1690
ret = drm_atomic_set_mode_prop_for_crtc(new_crtc_state,
1691
NULL);
1692
if (ret < 0)
1693
return ret;
1694
1695
new_crtc_state->active = false;
1696
}
1697
}
1698
1699
return 0;
1700
}
1701
1702
/* just used from drm-client and atomic-helper: */
1703
int __drm_atomic_helper_set_config(struct drm_mode_set *set,
1704
struct drm_atomic_state *state)
1705
{
1706
struct drm_crtc_state *crtc_state;
1707
struct drm_plane_state *primary_state;
1708
struct drm_crtc *crtc = set->crtc;
1709
int hdisplay, vdisplay;
1710
int ret;
1711
1712
crtc_state = drm_atomic_get_crtc_state(state, crtc);
1713
if (IS_ERR(crtc_state))
1714
return PTR_ERR(crtc_state);
1715
1716
primary_state = drm_atomic_get_plane_state(state, crtc->primary);
1717
if (IS_ERR(primary_state))
1718
return PTR_ERR(primary_state);
1719
1720
if (!set->mode) {
1721
WARN_ON(set->fb);
1722
WARN_ON(set->num_connectors);
1723
1724
ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
1725
if (ret != 0)
1726
return ret;
1727
1728
crtc_state->active = false;
1729
1730
ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
1731
if (ret != 0)
1732
return ret;
1733
1734
drm_atomic_set_fb_for_plane(primary_state, NULL);
1735
1736
goto commit;
1737
}
1738
1739
WARN_ON(!set->fb);
1740
WARN_ON(!set->num_connectors);
1741
1742
ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
1743
if (ret != 0)
1744
return ret;
1745
1746
crtc_state->active = true;
1747
1748
ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
1749
if (ret != 0)
1750
return ret;
1751
1752
drm_mode_get_hv_timing(set->mode, &hdisplay, &vdisplay);
1753
1754
drm_atomic_set_fb_for_plane(primary_state, set->fb);
1755
primary_state->crtc_x = 0;
1756
primary_state->crtc_y = 0;
1757
primary_state->crtc_w = hdisplay;
1758
primary_state->crtc_h = vdisplay;
1759
primary_state->src_x = set->x << 16;
1760
primary_state->src_y = set->y << 16;
1761
if (drm_rotation_90_or_270(primary_state->rotation)) {
1762
primary_state->src_w = vdisplay << 16;
1763
primary_state->src_h = hdisplay << 16;
1764
} else {
1765
primary_state->src_w = hdisplay << 16;
1766
primary_state->src_h = vdisplay << 16;
1767
}
1768
1769
commit:
1770
ret = update_output_state(state, set);
1771
if (ret)
1772
return ret;
1773
1774
return 0;
1775
}
1776
EXPORT_SYMBOL(__drm_atomic_helper_set_config);
1777
1778
static void drm_atomic_private_obj_print_state(struct drm_printer *p,
1779
const struct drm_private_state *state)
1780
{
1781
struct drm_private_obj *obj = state->obj;
1782
1783
if (obj->funcs->atomic_print_state)
1784
obj->funcs->atomic_print_state(p, state);
1785
}
1786
1787
/**
1788
* drm_atomic_print_new_state - prints drm atomic state
1789
* @state: atomic configuration to check
1790
* @p: drm printer
1791
*
1792
* This functions prints the drm atomic state snapshot using the drm printer
1793
* which is passed to it. This snapshot can be used for debugging purposes.
1794
*
1795
* Note that this function looks into the new state objects and hence its not
1796
* safe to be used after the call to drm_atomic_helper_commit_hw_done().
1797
*/
1798
void drm_atomic_print_new_state(const struct drm_atomic_state *state,
1799
struct drm_printer *p)
1800
{
1801
struct drm_plane *plane;
1802
struct drm_plane_state *plane_state;
1803
struct drm_crtc *crtc;
1804
struct drm_crtc_state *crtc_state;
1805
struct drm_connector *connector;
1806
struct drm_connector_state *connector_state;
1807
struct drm_private_obj *obj;
1808
struct drm_private_state *obj_state;
1809
int i;
1810
1811
if (!p) {
1812
drm_err(state->dev, "invalid drm printer\n");
1813
return;
1814
}
1815
1816
drm_dbg_atomic(state->dev, "checking %p\n", state);
1817
1818
for_each_new_plane_in_state(state, plane, plane_state, i)
1819
drm_atomic_plane_print_state(p, plane_state);
1820
1821
for_each_new_crtc_in_state(state, crtc, crtc_state, i)
1822
drm_atomic_crtc_print_state(p, crtc_state);
1823
1824
for_each_new_connector_in_state(state, connector, connector_state, i)
1825
drm_atomic_connector_print_state(p, connector_state);
1826
1827
for_each_new_private_obj_in_state(state, obj, obj_state, i)
1828
drm_atomic_private_obj_print_state(p, obj_state);
1829
}
1830
EXPORT_SYMBOL(drm_atomic_print_new_state);
1831
1832
static void __drm_state_dump(struct drm_device *dev, struct drm_printer *p,
1833
bool take_locks)
1834
{
1835
struct drm_mode_config *config = &dev->mode_config;
1836
struct drm_plane *plane;
1837
struct drm_crtc *crtc;
1838
struct drm_connector *connector;
1839
struct drm_connector_list_iter conn_iter;
1840
struct drm_private_obj *obj;
1841
1842
if (!drm_drv_uses_atomic_modeset(dev))
1843
return;
1844
1845
list_for_each_entry(plane, &config->plane_list, head) {
1846
if (take_locks)
1847
drm_modeset_lock(&plane->mutex, NULL);
1848
drm_atomic_plane_print_state(p, plane->state);
1849
if (take_locks)
1850
drm_modeset_unlock(&plane->mutex);
1851
}
1852
1853
list_for_each_entry(crtc, &config->crtc_list, head) {
1854
if (take_locks)
1855
drm_modeset_lock(&crtc->mutex, NULL);
1856
drm_atomic_crtc_print_state(p, crtc->state);
1857
if (take_locks)
1858
drm_modeset_unlock(&crtc->mutex);
1859
}
1860
1861
drm_connector_list_iter_begin(dev, &conn_iter);
1862
if (take_locks)
1863
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
1864
drm_for_each_connector_iter(connector, &conn_iter)
1865
drm_atomic_connector_print_state(p, connector->state);
1866
if (take_locks)
1867
drm_modeset_unlock(&dev->mode_config.connection_mutex);
1868
drm_connector_list_iter_end(&conn_iter);
1869
1870
list_for_each_entry(obj, &config->privobj_list, head) {
1871
if (take_locks)
1872
drm_modeset_lock(&obj->lock, NULL);
1873
drm_atomic_private_obj_print_state(p, obj->state);
1874
if (take_locks)
1875
drm_modeset_unlock(&obj->lock);
1876
}
1877
}
1878
1879
/**
1880
* drm_state_dump - dump entire device atomic state
1881
* @dev: the drm device
1882
* @p: where to print the state to
1883
*
1884
* Just for debugging. Drivers might want an option to dump state
1885
* to dmesg in case of error irq's. (Hint, you probably want to
1886
* ratelimit this!)
1887
*
1888
* The caller must wrap this drm_modeset_lock_all_ctx() and
1889
* drm_modeset_drop_locks(). If this is called from error irq handler, it should
1890
* not be enabled by default - if you are debugging errors you might
1891
* not care that this is racey, but calling this without all modeset locks held
1892
* is inherently unsafe.
1893
*/
1894
void drm_state_dump(struct drm_device *dev, struct drm_printer *p)
1895
{
1896
__drm_state_dump(dev, p, false);
1897
}
1898
EXPORT_SYMBOL(drm_state_dump);
1899
1900
#ifdef CONFIG_DEBUG_FS
1901
static int drm_state_info(struct seq_file *m, void *data)
1902
{
1903
struct drm_debugfs_entry *entry = m->private;
1904
struct drm_device *dev = entry->dev;
1905
struct drm_printer p = drm_seq_file_printer(m);
1906
1907
__drm_state_dump(dev, &p, true);
1908
1909
return 0;
1910
}
1911
1912
/* any use in debugfs files to dump individual planes/crtc/etc? */
1913
static const struct drm_debugfs_info drm_atomic_debugfs_list[] = {
1914
{"state", drm_state_info, 0},
1915
};
1916
1917
void drm_atomic_debugfs_init(struct drm_device *dev)
1918
{
1919
drm_debugfs_add_files(dev, drm_atomic_debugfs_list,
1920
ARRAY_SIZE(drm_atomic_debugfs_list));
1921
}
1922
#endif
1923
1924