Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
54336 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
4
* Author: James.Qian.Wang <[email protected]>
5
*
6
*/
7
#include <linux/clk.h>
8
#include <linux/of.h>
9
#include <linux/pm_runtime.h>
10
#include <linux/spinlock.h>
11
12
#include <drm/drm_atomic.h>
13
#include <drm/drm_atomic_helper.h>
14
#include <drm/drm_print.h>
15
#include <drm/drm_vblank.h>
16
#include <drm/drm_simple_kms_helper.h>
17
#include <drm/drm_bridge.h>
18
19
#include "komeda_dev.h"
20
#include "komeda_kms.h"
21
22
void komeda_crtc_get_color_config(struct drm_crtc_state *crtc_st,
23
u32 *color_depths, u32 *color_formats)
24
{
25
struct drm_connector *conn;
26
struct drm_connector_state *conn_st;
27
u32 conn_color_formats = ~0u;
28
int i, min_bpc = 31, conn_bpc = 0;
29
30
for_each_new_connector_in_state(crtc_st->state, conn, conn_st, i) {
31
if (conn_st->crtc != crtc_st->crtc)
32
continue;
33
34
conn_bpc = conn->display_info.bpc ? conn->display_info.bpc : 8;
35
conn_color_formats &= conn->display_info.color_formats;
36
37
if (conn_bpc < min_bpc)
38
min_bpc = conn_bpc;
39
}
40
41
/* connector doesn't config any color_format, use RGB444 as default */
42
if (!conn_color_formats)
43
conn_color_formats = DRM_COLOR_FORMAT_RGB444;
44
45
*color_depths = GENMASK(min_bpc, 0);
46
*color_formats = conn_color_formats;
47
}
48
49
static void komeda_crtc_update_clock_ratio(struct komeda_crtc_state *kcrtc_st)
50
{
51
u64 pxlclk, aclk;
52
53
if (!kcrtc_st->base.active) {
54
kcrtc_st->clock_ratio = 0;
55
return;
56
}
57
58
pxlclk = kcrtc_st->base.adjusted_mode.crtc_clock * 1000ULL;
59
aclk = komeda_crtc_get_aclk(kcrtc_st);
60
61
kcrtc_st->clock_ratio = div64_u64(aclk << 32, pxlclk);
62
}
63
64
/**
65
* komeda_crtc_atomic_check - build display output data flow
66
* @crtc: DRM crtc
67
* @state: the crtc state object
68
*
69
* crtc_atomic_check is the final check stage, so beside build a display data
70
* pipeline according to the crtc_state, but still needs to release or disable
71
* the unclaimed pipeline resources.
72
*
73
* RETURNS:
74
* Zero for success or -errno
75
*/
76
static int
77
komeda_crtc_atomic_check(struct drm_crtc *crtc,
78
struct drm_atomic_state *state)
79
{
80
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
81
crtc);
82
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
83
struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(crtc_state);
84
int err;
85
86
if (drm_atomic_crtc_needs_modeset(crtc_state))
87
komeda_crtc_update_clock_ratio(kcrtc_st);
88
89
if (crtc_state->active) {
90
err = komeda_build_display_data_flow(kcrtc, kcrtc_st);
91
if (err)
92
return err;
93
}
94
95
/* release unclaimed pipeline resources */
96
err = komeda_release_unclaimed_resources(kcrtc->slave, kcrtc_st);
97
if (err)
98
return err;
99
100
err = komeda_release_unclaimed_resources(kcrtc->master, kcrtc_st);
101
if (err)
102
return err;
103
104
return 0;
105
}
106
107
/* For active a crtc, mainly need two parts of preparation
108
* 1. adjust display operation mode.
109
* 2. enable needed clk
110
*/
111
static int
112
komeda_crtc_prepare(struct komeda_crtc *kcrtc)
113
{
114
struct drm_device *drm = kcrtc->base.dev;
115
struct komeda_dev *mdev = kcrtc->base.dev->dev_private;
116
struct komeda_pipeline *master = kcrtc->master;
117
struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(kcrtc->base.state);
118
struct drm_display_mode *mode = &kcrtc_st->base.adjusted_mode;
119
u32 new_mode;
120
int err;
121
122
mutex_lock(&mdev->lock);
123
124
new_mode = mdev->dpmode | BIT(master->id);
125
if (WARN_ON(new_mode == mdev->dpmode)) {
126
err = 0;
127
goto unlock;
128
}
129
130
err = mdev->funcs->change_opmode(mdev, new_mode);
131
if (err) {
132
drm_err(drm, "failed to change opmode: 0x%x -> 0x%x.\n,",
133
mdev->dpmode, new_mode);
134
goto unlock;
135
}
136
137
mdev->dpmode = new_mode;
138
/* Only need to enable aclk on single display mode, but no need to
139
* enable aclk it on dual display mode, since the dual mode always
140
* switch from single display mode, the aclk already enabled, no need
141
* to enable it again.
142
*/
143
if (new_mode != KOMEDA_MODE_DUAL_DISP) {
144
err = clk_set_rate(mdev->aclk, komeda_crtc_get_aclk(kcrtc_st));
145
if (err)
146
drm_err(drm, "failed to set aclk.\n");
147
err = clk_prepare_enable(mdev->aclk);
148
if (err)
149
drm_err(drm, "failed to enable aclk.\n");
150
}
151
152
err = clk_set_rate(master->pxlclk, mode->crtc_clock * 1000);
153
if (err)
154
drm_err(drm, "failed to set pxlclk for pipe%d\n", master->id);
155
err = clk_prepare_enable(master->pxlclk);
156
if (err)
157
drm_err(drm, "failed to enable pxl clk for pipe%d.\n", master->id);
158
159
unlock:
160
mutex_unlock(&mdev->lock);
161
162
return err;
163
}
164
165
static int
166
komeda_crtc_unprepare(struct komeda_crtc *kcrtc)
167
{
168
struct drm_device *drm = kcrtc->base.dev;
169
struct komeda_dev *mdev = kcrtc->base.dev->dev_private;
170
struct komeda_pipeline *master = kcrtc->master;
171
u32 new_mode;
172
int err;
173
174
mutex_lock(&mdev->lock);
175
176
new_mode = mdev->dpmode & (~BIT(master->id));
177
178
if (WARN_ON(new_mode == mdev->dpmode)) {
179
err = 0;
180
goto unlock;
181
}
182
183
err = mdev->funcs->change_opmode(mdev, new_mode);
184
if (err) {
185
drm_err(drm, "failed to change opmode: 0x%x -> 0x%x.\n,",
186
mdev->dpmode, new_mode);
187
goto unlock;
188
}
189
190
mdev->dpmode = new_mode;
191
192
clk_disable_unprepare(master->pxlclk);
193
if (new_mode == KOMEDA_MODE_INACTIVE)
194
clk_disable_unprepare(mdev->aclk);
195
196
unlock:
197
mutex_unlock(&mdev->lock);
198
199
return err;
200
}
201
202
void komeda_crtc_handle_event(struct komeda_crtc *kcrtc,
203
struct komeda_events *evts)
204
{
205
struct drm_device *drm = kcrtc->base.dev;
206
struct drm_crtc *crtc = &kcrtc->base;
207
u32 events = evts->pipes[kcrtc->master->id];
208
209
if (events & KOMEDA_EVENT_VSYNC)
210
drm_crtc_handle_vblank(crtc);
211
212
if (events & KOMEDA_EVENT_EOW) {
213
struct komeda_wb_connector *wb_conn = kcrtc->wb_conn;
214
215
if (wb_conn)
216
drm_writeback_signal_completion(&wb_conn->base, 0);
217
else
218
drm_warn(drm, "CRTC[%d]: EOW happen but no wb_connector.\n",
219
drm_crtc_index(&kcrtc->base));
220
}
221
/* will handle it together with the write back support */
222
if (events & KOMEDA_EVENT_EOW)
223
DRM_DEBUG("EOW.\n");
224
225
if (events & KOMEDA_EVENT_FLIP) {
226
unsigned long flags;
227
struct drm_pending_vblank_event *event;
228
229
spin_lock_irqsave(&crtc->dev->event_lock, flags);
230
if (kcrtc->disable_done) {
231
complete_all(kcrtc->disable_done);
232
kcrtc->disable_done = NULL;
233
} else if (crtc->state->event) {
234
event = crtc->state->event;
235
/*
236
* Consume event before notifying drm core that flip
237
* happened.
238
*/
239
crtc->state->event = NULL;
240
drm_crtc_send_vblank_event(crtc, event);
241
} else {
242
drm_warn(drm, "CRTC[%d]: FLIP happened but no pending commit.\n",
243
drm_crtc_index(&kcrtc->base));
244
}
245
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
246
}
247
}
248
249
static void
250
komeda_crtc_do_flush(struct drm_crtc *crtc,
251
struct drm_crtc_state *old)
252
{
253
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
254
struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(crtc->state);
255
struct komeda_dev *mdev = kcrtc->base.dev->dev_private;
256
struct komeda_pipeline *master = kcrtc->master;
257
struct komeda_pipeline *slave = kcrtc->slave;
258
struct komeda_wb_connector *wb_conn = kcrtc->wb_conn;
259
struct drm_connector_state *conn_st;
260
261
DRM_DEBUG_ATOMIC("CRTC%d_FLUSH: active_pipes: 0x%x, affected: 0x%x.\n",
262
drm_crtc_index(crtc),
263
kcrtc_st->active_pipes, kcrtc_st->affected_pipes);
264
265
/* step 1: update the pipeline/component state to HW */
266
if (has_bit(master->id, kcrtc_st->affected_pipes))
267
komeda_pipeline_update(master, old->state);
268
269
if (slave && has_bit(slave->id, kcrtc_st->affected_pipes))
270
komeda_pipeline_update(slave, old->state);
271
272
conn_st = wb_conn ? wb_conn->base.base.state : NULL;
273
if (conn_st && conn_st->writeback_job)
274
drm_writeback_queue_job(&wb_conn->base, conn_st);
275
276
/* step 2: notify the HW to kickoff the update */
277
mdev->funcs->flush(mdev, master->id, kcrtc_st->active_pipes);
278
}
279
280
static void
281
komeda_crtc_atomic_enable(struct drm_crtc *crtc,
282
struct drm_atomic_state *state)
283
{
284
struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
285
crtc);
286
pm_runtime_get_sync(crtc->dev->dev);
287
komeda_crtc_prepare(to_kcrtc(crtc));
288
drm_crtc_vblank_on(crtc);
289
WARN_ON(drm_crtc_vblank_get(crtc));
290
komeda_crtc_do_flush(crtc, old);
291
}
292
293
void
294
komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc,
295
struct completion *input_flip_done)
296
{
297
struct drm_device *drm = kcrtc->base.dev;
298
struct komeda_dev *mdev = kcrtc->master->mdev;
299
struct completion *flip_done;
300
struct completion temp;
301
302
/* if caller doesn't send a flip_done, use a private flip_done */
303
if (input_flip_done) {
304
flip_done = input_flip_done;
305
} else {
306
init_completion(&temp);
307
kcrtc->disable_done = &temp;
308
flip_done = &temp;
309
}
310
311
mdev->funcs->flush(mdev, kcrtc->master->id, 0);
312
313
/* wait the flip take affect.*/
314
if (wait_for_completion_timeout(flip_done, HZ) == 0) {
315
drm_err(drm, "wait pipe%d flip done timeout\n", kcrtc->master->id);
316
if (!input_flip_done) {
317
unsigned long flags;
318
319
spin_lock_irqsave(&drm->event_lock, flags);
320
kcrtc->disable_done = NULL;
321
spin_unlock_irqrestore(&drm->event_lock, flags);
322
}
323
}
324
}
325
326
static void
327
komeda_crtc_atomic_disable(struct drm_crtc *crtc,
328
struct drm_atomic_state *state)
329
{
330
struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
331
crtc);
332
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
333
struct komeda_crtc_state *old_st = to_kcrtc_st(old);
334
struct komeda_pipeline *master = kcrtc->master;
335
struct komeda_pipeline *slave = kcrtc->slave;
336
struct completion *disable_done;
337
bool needs_phase2 = false;
338
339
DRM_DEBUG_ATOMIC("CRTC%d_DISABLE: active_pipes: 0x%x, affected: 0x%x\n",
340
drm_crtc_index(crtc),
341
old_st->active_pipes, old_st->affected_pipes);
342
343
if (slave && has_bit(slave->id, old_st->active_pipes))
344
komeda_pipeline_disable(slave, old->state);
345
346
if (has_bit(master->id, old_st->active_pipes))
347
needs_phase2 = komeda_pipeline_disable(master, old->state);
348
349
/* crtc_disable has two scenarios according to the state->active switch.
350
* 1. active -> inactive
351
* this commit is a disable commit. and the commit will be finished
352
* or done after the disable operation. on this case we can directly
353
* use the crtc->state->event to tracking the HW disable operation.
354
* 2. active -> active
355
* the crtc->commit is not for disable, but a modeset operation when
356
* crtc is active, such commit actually has been completed by 3
357
* DRM operations:
358
* crtc_disable, update_planes(crtc_flush), crtc_enable
359
* so on this case the crtc->commit is for the whole process.
360
* we can not use it for tracing the disable, we need a temporary
361
* flip_done for tracing the disable. and crtc->state->event for
362
* the crtc_enable operation.
363
* That's also the reason why skip modeset commit in
364
* komeda_crtc_atomic_flush()
365
*/
366
disable_done = (needs_phase2 || crtc->state->active) ?
367
NULL : &crtc->state->commit->flip_done;
368
369
/* wait phase 1 disable done */
370
komeda_crtc_flush_and_wait_for_flip_done(kcrtc, disable_done);
371
372
/* phase 2 */
373
if (needs_phase2) {
374
komeda_pipeline_disable(kcrtc->master, old->state);
375
376
disable_done = crtc->state->active ?
377
NULL : &crtc->state->commit->flip_done;
378
379
komeda_crtc_flush_and_wait_for_flip_done(kcrtc, disable_done);
380
}
381
382
drm_crtc_vblank_put(crtc);
383
drm_crtc_vblank_off(crtc);
384
komeda_crtc_unprepare(kcrtc);
385
pm_runtime_put(crtc->dev->dev);
386
}
387
388
static void
389
komeda_crtc_atomic_flush(struct drm_crtc *crtc,
390
struct drm_atomic_state *state)
391
{
392
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
393
crtc);
394
struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
395
crtc);
396
/* commit with modeset will be handled in enable/disable */
397
if (drm_atomic_crtc_needs_modeset(crtc_state))
398
return;
399
400
komeda_crtc_do_flush(crtc, old);
401
}
402
403
/* Returns the minimum frequency of the aclk rate (main engine clock) in Hz */
404
static unsigned long
405
komeda_calc_min_aclk_rate(struct komeda_crtc *kcrtc,
406
unsigned long pxlclk)
407
{
408
/* Once dual-link one display pipeline drives two display outputs,
409
* the aclk needs run on the double rate of pxlclk
410
*/
411
if (kcrtc->master->dual_link)
412
return pxlclk * 2;
413
else
414
return pxlclk;
415
}
416
417
/* Get current aclk rate that specified by state */
418
unsigned long komeda_crtc_get_aclk(struct komeda_crtc_state *kcrtc_st)
419
{
420
struct drm_crtc *crtc = kcrtc_st->base.crtc;
421
struct komeda_dev *mdev = crtc->dev->dev_private;
422
unsigned long pxlclk = kcrtc_st->base.adjusted_mode.crtc_clock * 1000;
423
unsigned long min_aclk;
424
425
min_aclk = komeda_calc_min_aclk_rate(to_kcrtc(crtc), pxlclk);
426
427
return clk_round_rate(mdev->aclk, min_aclk);
428
}
429
430
static enum drm_mode_status
431
komeda_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *m)
432
{
433
struct komeda_dev *mdev = crtc->dev->dev_private;
434
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
435
struct komeda_pipeline *master = kcrtc->master;
436
unsigned long min_pxlclk, min_aclk;
437
438
if (m->flags & DRM_MODE_FLAG_INTERLACE)
439
return MODE_NO_INTERLACE;
440
441
min_pxlclk = m->clock * 1000;
442
if (master->dual_link)
443
min_pxlclk /= 2;
444
445
if (min_pxlclk != clk_round_rate(master->pxlclk, min_pxlclk)) {
446
DRM_DEBUG_ATOMIC("pxlclk doesn't support %lu Hz\n", min_pxlclk);
447
448
return MODE_NOCLOCK;
449
}
450
451
min_aclk = komeda_calc_min_aclk_rate(to_kcrtc(crtc), min_pxlclk);
452
if (clk_round_rate(mdev->aclk, min_aclk) < min_aclk) {
453
DRM_DEBUG_ATOMIC("engine clk can't satisfy the requirement of %s-clk: %lu.\n",
454
m->name, min_pxlclk);
455
456
return MODE_CLOCK_HIGH;
457
}
458
459
return MODE_OK;
460
}
461
462
static bool komeda_crtc_mode_fixup(struct drm_crtc *crtc,
463
const struct drm_display_mode *m,
464
struct drm_display_mode *adjusted_mode)
465
{
466
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
467
unsigned long clk_rate;
468
469
drm_mode_set_crtcinfo(adjusted_mode, 0);
470
/* In dual link half the horizontal settings */
471
if (kcrtc->master->dual_link) {
472
adjusted_mode->crtc_clock /= 2;
473
adjusted_mode->crtc_hdisplay /= 2;
474
adjusted_mode->crtc_hsync_start /= 2;
475
adjusted_mode->crtc_hsync_end /= 2;
476
adjusted_mode->crtc_htotal /= 2;
477
}
478
479
clk_rate = adjusted_mode->crtc_clock * 1000;
480
/* crtc_clock will be used as the komeda output pixel clock */
481
adjusted_mode->crtc_clock = clk_round_rate(kcrtc->master->pxlclk,
482
clk_rate) / 1000;
483
484
return true;
485
}
486
487
static const struct drm_crtc_helper_funcs komeda_crtc_helper_funcs = {
488
.atomic_check = komeda_crtc_atomic_check,
489
.atomic_flush = komeda_crtc_atomic_flush,
490
.atomic_enable = komeda_crtc_atomic_enable,
491
.atomic_disable = komeda_crtc_atomic_disable,
492
.mode_valid = komeda_crtc_mode_valid,
493
.mode_fixup = komeda_crtc_mode_fixup,
494
};
495
496
static void komeda_crtc_reset(struct drm_crtc *crtc)
497
{
498
struct komeda_crtc_state *state;
499
500
if (crtc->state)
501
__drm_atomic_helper_crtc_destroy_state(crtc->state);
502
503
kfree(to_kcrtc_st(crtc->state));
504
crtc->state = NULL;
505
506
state = kzalloc(sizeof(*state), GFP_KERNEL);
507
if (state)
508
__drm_atomic_helper_crtc_reset(crtc, &state->base);
509
}
510
511
static struct drm_crtc_state *
512
komeda_crtc_atomic_duplicate_state(struct drm_crtc *crtc)
513
{
514
struct komeda_crtc_state *old = to_kcrtc_st(crtc->state);
515
struct komeda_crtc_state *new;
516
517
new = kzalloc(sizeof(*new), GFP_KERNEL);
518
if (!new)
519
return NULL;
520
521
__drm_atomic_helper_crtc_duplicate_state(crtc, &new->base);
522
523
new->affected_pipes = old->active_pipes;
524
new->clock_ratio = old->clock_ratio;
525
new->max_slave_zorder = old->max_slave_zorder;
526
527
return &new->base;
528
}
529
530
static void komeda_crtc_atomic_destroy_state(struct drm_crtc *crtc,
531
struct drm_crtc_state *state)
532
{
533
__drm_atomic_helper_crtc_destroy_state(state);
534
kfree(to_kcrtc_st(state));
535
}
536
537
static int komeda_crtc_vblank_enable(struct drm_crtc *crtc)
538
{
539
struct komeda_dev *mdev = crtc->dev->dev_private;
540
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
541
542
mdev->funcs->on_off_vblank(mdev, kcrtc->master->id, true);
543
return 0;
544
}
545
546
static void komeda_crtc_vblank_disable(struct drm_crtc *crtc)
547
{
548
struct komeda_dev *mdev = crtc->dev->dev_private;
549
struct komeda_crtc *kcrtc = to_kcrtc(crtc);
550
551
mdev->funcs->on_off_vblank(mdev, kcrtc->master->id, false);
552
}
553
554
static const struct drm_crtc_funcs komeda_crtc_funcs = {
555
.destroy = drm_crtc_cleanup,
556
.set_config = drm_atomic_helper_set_config,
557
.page_flip = drm_atomic_helper_page_flip,
558
.reset = komeda_crtc_reset,
559
.atomic_duplicate_state = komeda_crtc_atomic_duplicate_state,
560
.atomic_destroy_state = komeda_crtc_atomic_destroy_state,
561
.enable_vblank = komeda_crtc_vblank_enable,
562
.disable_vblank = komeda_crtc_vblank_disable,
563
};
564
565
int komeda_kms_setup_crtcs(struct komeda_kms_dev *kms,
566
struct komeda_dev *mdev)
567
{
568
struct drm_device *drm = &kms->base;
569
struct komeda_crtc *crtc;
570
struct komeda_pipeline *master;
571
char str[16];
572
int i;
573
574
kms->n_crtcs = 0;
575
576
for (i = 0; i < mdev->n_pipelines; i++) {
577
crtc = &kms->crtcs[kms->n_crtcs];
578
master = mdev->pipelines[i];
579
580
crtc->master = master;
581
crtc->slave = komeda_pipeline_get_slave(master);
582
583
if (crtc->slave)
584
sprintf(str, "pipe-%d", crtc->slave->id);
585
else
586
sprintf(str, "None");
587
588
drm_info(drm, "CRTC-%d: master(pipe-%d) slave(%s).\n",
589
kms->n_crtcs, master->id, str);
590
591
kms->n_crtcs++;
592
}
593
594
return 0;
595
}
596
597
static struct drm_plane *
598
get_crtc_primary(struct komeda_kms_dev *kms, struct komeda_crtc *crtc)
599
{
600
struct komeda_plane *kplane;
601
struct drm_plane *plane;
602
603
drm_for_each_plane(plane, &kms->base) {
604
if (plane->type != DRM_PLANE_TYPE_PRIMARY)
605
continue;
606
607
kplane = to_kplane(plane);
608
/* only master can be primary */
609
if (kplane->layer->base.pipeline == crtc->master)
610
return plane;
611
}
612
613
return NULL;
614
}
615
616
static int komeda_attach_bridge(struct device *dev,
617
struct komeda_pipeline *pipe,
618
struct drm_encoder *encoder)
619
{
620
struct drm_device *drm = encoder->dev;
621
struct drm_bridge *bridge;
622
int err;
623
624
bridge = devm_drm_of_get_bridge(dev, pipe->of_node,
625
KOMEDA_OF_PORT_OUTPUT, 0);
626
if (IS_ERR(bridge))
627
return dev_err_probe(dev, PTR_ERR(bridge), "remote bridge not found for pipe: %s\n",
628
of_node_full_name(pipe->of_node));
629
630
err = drm_bridge_attach(encoder, bridge, NULL, 0);
631
if (err)
632
drm_err(drm, "bridge_attach() failed for pipe: %s\n",
633
of_node_full_name(pipe->of_node));
634
635
return err;
636
}
637
638
static int komeda_crtc_add(struct komeda_kms_dev *kms,
639
struct komeda_crtc *kcrtc)
640
{
641
struct drm_crtc *crtc = &kcrtc->base;
642
struct drm_device *base = &kms->base;
643
struct komeda_pipeline *pipe = kcrtc->master;
644
struct drm_encoder *encoder = &kcrtc->encoder;
645
int err;
646
647
err = drm_crtc_init_with_planes(base, crtc,
648
get_crtc_primary(kms, kcrtc), NULL,
649
&komeda_crtc_funcs, NULL);
650
if (err)
651
return err;
652
653
drm_crtc_helper_add(crtc, &komeda_crtc_helper_funcs);
654
655
crtc->port = pipe->of_output_port;
656
657
/* Construct an encoder for each pipeline and attach it to the remote
658
* bridge
659
*/
660
kcrtc->encoder.possible_crtcs = drm_crtc_mask(crtc);
661
err = drm_simple_encoder_init(base, encoder, DRM_MODE_ENCODER_TMDS);
662
if (err)
663
return err;
664
665
if (pipe->of_output_links[0]) {
666
err = komeda_attach_bridge(base->dev, pipe, encoder);
667
if (err)
668
return err;
669
}
670
671
drm_crtc_enable_color_mgmt(crtc, 0, true, KOMEDA_COLOR_LUT_SIZE);
672
673
komeda_pipeline_dump(pipe);
674
675
return 0;
676
}
677
678
int komeda_kms_add_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev)
679
{
680
int i, err;
681
682
for (i = 0; i < kms->n_crtcs; i++) {
683
err = komeda_crtc_add(kms, &kms->crtcs[i]);
684
if (err)
685
return err;
686
}
687
688
return 0;
689
}
690
691