2 * Copyright (C) 2012 Avionic Design GmbH
3 * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
10 #include <linux/clk.h>
11 #include <linux/debugfs.h>
12 #include <linux/iommu.h>
13 #include <linux/of_device.h>
14 #include <linux/pm_runtime.h>
15 #include <linux/reset.h>
17 #include <soc/tegra/pmc.h>
25 #include <drm/drm_atomic.h>
26 #include <drm/drm_atomic_helper.h>
27 #include <drm/drm_plane_helper.h>
29 static void tegra_dc_stats_reset(struct tegra_dc_stats
*stats
)
37 /* Reads the active copy of a register. */
38 static u32
tegra_dc_readl_active(struct tegra_dc
*dc
, unsigned long offset
)
42 tegra_dc_writel(dc
, READ_MUX
, DC_CMD_STATE_ACCESS
);
43 value
= tegra_dc_readl(dc
, offset
);
44 tegra_dc_writel(dc
, 0, DC_CMD_STATE_ACCESS
);
49 static inline unsigned int tegra_plane_offset(struct tegra_plane
*plane
,
52 if (offset
>= 0x500 && offset
<= 0x638) {
53 offset
= 0x000 + (offset
- 0x500);
54 return plane
->offset
+ offset
;
57 if (offset
>= 0x700 && offset
<= 0x719) {
58 offset
= 0x180 + (offset
- 0x700);
59 return plane
->offset
+ offset
;
62 if (offset
>= 0x800 && offset
<= 0x839) {
63 offset
= 0x1c0 + (offset
- 0x800);
64 return plane
->offset
+ offset
;
67 dev_WARN(plane
->dc
->dev
, "invalid offset: %x\n", offset
);
69 return plane
->offset
+ offset
;
72 static inline u32
tegra_plane_readl(struct tegra_plane
*plane
,
75 return tegra_dc_readl(plane
->dc
, tegra_plane_offset(plane
, offset
));
78 static inline void tegra_plane_writel(struct tegra_plane
*plane
, u32 value
,
81 tegra_dc_writel(plane
->dc
, value
, tegra_plane_offset(plane
, offset
));
84 bool tegra_dc_has_output(struct tegra_dc
*dc
, struct device
*dev
)
86 struct device_node
*np
= dc
->dev
->of_node
;
87 struct of_phandle_iterator it
;
90 of_for_each_phandle(&it
, err
, np
, "nvidia,outputs", NULL
, 0)
91 if (it
.node
== dev
->of_node
)
98 * Double-buffered registers have two copies: ASSEMBLY and ACTIVE. When the
99 * *_ACT_REQ bits are set the ASSEMBLY copy is latched into the ACTIVE copy.
100 * Latching happens mmediately if the display controller is in STOP mode or
101 * on the next frame boundary otherwise.
103 * Triple-buffered registers have three copies: ASSEMBLY, ARM and ACTIVE. The
104 * ASSEMBLY copy is latched into the ARM copy immediately after *_UPDATE bits
105 * are written. When the *_ACT_REQ bits are written, the ARM copy is latched
106 * into the ACTIVE copy, either immediately if the display controller is in
107 * STOP mode, or at the next frame boundary otherwise.
109 void tegra_dc_commit(struct tegra_dc
*dc
)
111 tegra_dc_writel(dc
, GENERAL_ACT_REQ
<< 8, DC_CMD_STATE_CONTROL
);
112 tegra_dc_writel(dc
, GENERAL_ACT_REQ
, DC_CMD_STATE_CONTROL
);
115 static inline u32
compute_dda_inc(unsigned int in
, unsigned int out
, bool v
,
118 fixed20_12 outf
= dfixed_init(out
);
119 fixed20_12 inf
= dfixed_init(in
);
140 outf
.full
= max_t(u32
, outf
.full
- dfixed_const(1), dfixed_const(1));
141 inf
.full
-= dfixed_const(1);
143 dda_inc
= dfixed_div(inf
, outf
);
144 dda_inc
= min_t(u32
, dda_inc
, dfixed_const(max
));
149 static inline u32
compute_initial_dda(unsigned int in
)
151 fixed20_12 inf
= dfixed_init(in
);
152 return dfixed_frac(inf
);
155 static void tegra_plane_setup_blending_legacy(struct tegra_plane
*plane
)
157 u32 background
[3] = {
158 BLEND_WEIGHT1(0) | BLEND_WEIGHT0(0) | BLEND_COLOR_KEY_NONE
,
159 BLEND_WEIGHT1(0) | BLEND_WEIGHT0(0) | BLEND_COLOR_KEY_NONE
,
160 BLEND_WEIGHT1(0) | BLEND_WEIGHT0(0) | BLEND_COLOR_KEY_NONE
,
162 u32 foreground
= BLEND_WEIGHT1(255) | BLEND_WEIGHT0(255) |
163 BLEND_COLOR_KEY_NONE
;
164 u32 blendnokey
= BLEND_WEIGHT1(255) | BLEND_WEIGHT0(255);
165 struct tegra_plane_state
*state
;
168 state
= to_tegra_plane_state(plane
->base
.state
);
170 /* alpha contribution is 1 minus sum of overlapping windows */
171 for (i
= 0; i
< 3; i
++) {
172 if (state
->dependent
[i
])
173 background
[i
] |= BLEND_CONTROL_DEPENDENT
;
176 /* enable alpha blending if pixel format has an alpha component */
178 foreground
|= BLEND_CONTROL_ALPHA
;
181 * Disable blending and assume Window A is the bottom-most window,
182 * Window C is the top-most window and Window B is in the middle.
184 tegra_plane_writel(plane
, blendnokey
, DC_WIN_BLEND_NOKEY
);
185 tegra_plane_writel(plane
, foreground
, DC_WIN_BLEND_1WIN
);
187 switch (plane
->index
) {
189 tegra_plane_writel(plane
, background
[0], DC_WIN_BLEND_2WIN_X
);
190 tegra_plane_writel(plane
, background
[1], DC_WIN_BLEND_2WIN_Y
);
191 tegra_plane_writel(plane
, background
[2], DC_WIN_BLEND_3WIN_XY
);
195 tegra_plane_writel(plane
, foreground
, DC_WIN_BLEND_2WIN_X
);
196 tegra_plane_writel(plane
, background
[1], DC_WIN_BLEND_2WIN_Y
);
197 tegra_plane_writel(plane
, background
[2], DC_WIN_BLEND_3WIN_XY
);
201 tegra_plane_writel(plane
, foreground
, DC_WIN_BLEND_2WIN_X
);
202 tegra_plane_writel(plane
, foreground
, DC_WIN_BLEND_2WIN_Y
);
203 tegra_plane_writel(plane
, foreground
, DC_WIN_BLEND_3WIN_XY
);
208 static void tegra_plane_setup_blending(struct tegra_plane
*plane
,
209 const struct tegra_dc_window
*window
)
213 value
= BLEND_FACTOR_DST_ALPHA_ZERO
| BLEND_FACTOR_SRC_ALPHA_K2
|
214 BLEND_FACTOR_DST_COLOR_NEG_K1_TIMES_SRC
|
215 BLEND_FACTOR_SRC_COLOR_K1_TIMES_SRC
;
216 tegra_plane_writel(plane
, value
, DC_WIN_BLEND_MATCH_SELECT
);
218 value
= BLEND_FACTOR_DST_ALPHA_ZERO
| BLEND_FACTOR_SRC_ALPHA_K2
|
219 BLEND_FACTOR_DST_COLOR_NEG_K1_TIMES_SRC
|
220 BLEND_FACTOR_SRC_COLOR_K1_TIMES_SRC
;
221 tegra_plane_writel(plane
, value
, DC_WIN_BLEND_NOMATCH_SELECT
);
223 value
= K2(255) | K1(255) | WINDOW_LAYER_DEPTH(255 - window
->zpos
);
224 tegra_plane_writel(plane
, value
, DC_WIN_BLEND_LAYER_CONTROL
);
227 static void tegra_dc_setup_window(struct tegra_plane
*plane
,
228 const struct tegra_dc_window
*window
)
230 unsigned h_offset
, v_offset
, h_size
, v_size
, h_dda
, v_dda
, bpp
;
231 struct tegra_dc
*dc
= plane
->dc
;
236 * For YUV planar modes, the number of bytes per pixel takes into
237 * account only the luma component and therefore is 1.
239 yuv
= tegra_plane_format_is_yuv(window
->format
, &planar
);
241 bpp
= window
->bits_per_pixel
/ 8;
243 bpp
= planar
? 1 : 2;
245 tegra_plane_writel(plane
, window
->format
, DC_WIN_COLOR_DEPTH
);
246 tegra_plane_writel(plane
, window
->swap
, DC_WIN_BYTE_SWAP
);
248 value
= V_POSITION(window
->dst
.y
) | H_POSITION(window
->dst
.x
);
249 tegra_plane_writel(plane
, value
, DC_WIN_POSITION
);
251 value
= V_SIZE(window
->dst
.h
) | H_SIZE(window
->dst
.w
);
252 tegra_plane_writel(plane
, value
, DC_WIN_SIZE
);
254 h_offset
= window
->src
.x
* bpp
;
255 v_offset
= window
->src
.y
;
256 h_size
= window
->src
.w
* bpp
;
257 v_size
= window
->src
.h
;
259 value
= V_PRESCALED_SIZE(v_size
) | H_PRESCALED_SIZE(h_size
);
260 tegra_plane_writel(plane
, value
, DC_WIN_PRESCALED_SIZE
);
263 * For DDA computations the number of bytes per pixel for YUV planar
264 * modes needs to take into account all Y, U and V components.
269 h_dda
= compute_dda_inc(window
->src
.w
, window
->dst
.w
, false, bpp
);
270 v_dda
= compute_dda_inc(window
->src
.h
, window
->dst
.h
, true, bpp
);
272 value
= V_DDA_INC(v_dda
) | H_DDA_INC(h_dda
);
273 tegra_plane_writel(plane
, value
, DC_WIN_DDA_INC
);
275 h_dda
= compute_initial_dda(window
->src
.x
);
276 v_dda
= compute_initial_dda(window
->src
.y
);
278 tegra_plane_writel(plane
, h_dda
, DC_WIN_H_INITIAL_DDA
);
279 tegra_plane_writel(plane
, v_dda
, DC_WIN_V_INITIAL_DDA
);
281 tegra_plane_writel(plane
, 0, DC_WIN_UV_BUF_STRIDE
);
282 tegra_plane_writel(plane
, 0, DC_WIN_BUF_STRIDE
);
284 tegra_plane_writel(plane
, window
->base
[0], DC_WINBUF_START_ADDR
);
287 tegra_plane_writel(plane
, window
->base
[1], DC_WINBUF_START_ADDR_U
);
288 tegra_plane_writel(plane
, window
->base
[2], DC_WINBUF_START_ADDR_V
);
289 value
= window
->stride
[1] << 16 | window
->stride
[0];
290 tegra_plane_writel(plane
, value
, DC_WIN_LINE_STRIDE
);
292 tegra_plane_writel(plane
, window
->stride
[0], DC_WIN_LINE_STRIDE
);
295 if (window
->bottom_up
)
296 v_offset
+= window
->src
.h
- 1;
298 tegra_plane_writel(plane
, h_offset
, DC_WINBUF_ADDR_H_OFFSET
);
299 tegra_plane_writel(plane
, v_offset
, DC_WINBUF_ADDR_V_OFFSET
);
301 if (dc
->soc
->supports_block_linear
) {
302 unsigned long height
= window
->tiling
.value
;
304 switch (window
->tiling
.mode
) {
305 case TEGRA_BO_TILING_MODE_PITCH
:
306 value
= DC_WINBUF_SURFACE_KIND_PITCH
;
309 case TEGRA_BO_TILING_MODE_TILED
:
310 value
= DC_WINBUF_SURFACE_KIND_TILED
;
313 case TEGRA_BO_TILING_MODE_BLOCK
:
314 value
= DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(height
) |
315 DC_WINBUF_SURFACE_KIND_BLOCK
;
319 tegra_plane_writel(plane
, value
, DC_WINBUF_SURFACE_KIND
);
321 switch (window
->tiling
.mode
) {
322 case TEGRA_BO_TILING_MODE_PITCH
:
323 value
= DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV
|
324 DC_WIN_BUFFER_ADDR_MODE_LINEAR
;
327 case TEGRA_BO_TILING_MODE_TILED
:
328 value
= DC_WIN_BUFFER_ADDR_MODE_TILE_UV
|
329 DC_WIN_BUFFER_ADDR_MODE_TILE
;
332 case TEGRA_BO_TILING_MODE_BLOCK
:
334 * No need to handle this here because ->atomic_check
335 * will already have filtered it out.
340 tegra_plane_writel(plane
, value
, DC_WIN_BUFFER_ADDR_MODE
);
346 /* setup default colorspace conversion coefficients */
347 tegra_plane_writel(plane
, 0x00f0, DC_WIN_CSC_YOF
);
348 tegra_plane_writel(plane
, 0x012a, DC_WIN_CSC_KYRGB
);
349 tegra_plane_writel(plane
, 0x0000, DC_WIN_CSC_KUR
);
350 tegra_plane_writel(plane
, 0x0198, DC_WIN_CSC_KVR
);
351 tegra_plane_writel(plane
, 0x039b, DC_WIN_CSC_KUG
);
352 tegra_plane_writel(plane
, 0x032f, DC_WIN_CSC_KVG
);
353 tegra_plane_writel(plane
, 0x0204, DC_WIN_CSC_KUB
);
354 tegra_plane_writel(plane
, 0x0000, DC_WIN_CSC_KVB
);
357 } else if (window
->bits_per_pixel
< 24) {
358 value
|= COLOR_EXPAND
;
361 if (window
->bottom_up
)
362 value
|= V_DIRECTION
;
364 tegra_plane_writel(plane
, value
, DC_WIN_WIN_OPTIONS
);
366 if (dc
->soc
->supports_blending
)
367 tegra_plane_setup_blending(plane
, window
);
369 tegra_plane_setup_blending_legacy(plane
);
372 static const u32 tegra20_primary_formats
[] = {
379 /* non-native formats */
386 static const u32 tegra114_primary_formats
[] = {
393 /* new on Tegra114 */
408 static const u32 tegra124_primary_formats
[] = {
415 /* new on Tegra114 */
428 /* new on Tegra124 */
433 static int tegra_plane_atomic_check(struct drm_plane
*plane
,
434 struct drm_plane_state
*state
)
436 struct tegra_plane_state
*plane_state
= to_tegra_plane_state(state
);
437 struct tegra_bo_tiling
*tiling
= &plane_state
->tiling
;
438 struct tegra_plane
*tegra
= to_tegra_plane(plane
);
439 struct tegra_dc
*dc
= to_tegra_dc(state
->crtc
);
443 /* no need for further checks if the plane is being disabled */
447 err
= tegra_plane_format(state
->fb
->format
->format
, &format
,
453 * Tegra20 and Tegra30 are special cases here because they support
454 * only variants of specific formats with an alpha component, but not
455 * the corresponding opaque formats. However, the opaque formats can
456 * be emulated by disabling alpha blending for the plane.
458 if (!dc
->soc
->supports_blending
) {
459 if (!tegra_plane_format_has_alpha(format
)) {
460 err
= tegra_plane_format_get_alpha(format
, &format
);
464 plane_state
->opaque
= true;
466 plane_state
->opaque
= false;
469 tegra_plane_check_dependent(tegra
, plane_state
);
472 plane_state
->format
= format
;
474 err
= tegra_fb_get_tiling(state
->fb
, tiling
);
478 if (tiling
->mode
== TEGRA_BO_TILING_MODE_BLOCK
&&
479 !dc
->soc
->supports_block_linear
) {
480 DRM_ERROR("hardware doesn't support block linear mode\n");
485 * Tegra doesn't support different strides for U and V planes so we
486 * error out if the user tries to display a framebuffer with such a
489 if (state
->fb
->format
->num_planes
> 2) {
490 if (state
->fb
->pitches
[2] != state
->fb
->pitches
[1]) {
491 DRM_ERROR("unsupported UV-plane configuration\n");
496 err
= tegra_plane_state_add(tegra
, state
);
503 static void tegra_plane_atomic_disable(struct drm_plane
*plane
,
504 struct drm_plane_state
*old_state
)
506 struct tegra_plane
*p
= to_tegra_plane(plane
);
509 /* rien ne va plus */
510 if (!old_state
|| !old_state
->crtc
)
513 value
= tegra_plane_readl(p
, DC_WIN_WIN_OPTIONS
);
514 value
&= ~WIN_ENABLE
;
515 tegra_plane_writel(p
, value
, DC_WIN_WIN_OPTIONS
);
518 static void tegra_plane_atomic_update(struct drm_plane
*plane
,
519 struct drm_plane_state
*old_state
)
521 struct tegra_plane_state
*state
= to_tegra_plane_state(plane
->state
);
522 struct drm_framebuffer
*fb
= plane
->state
->fb
;
523 struct tegra_plane
*p
= to_tegra_plane(plane
);
524 struct tegra_dc_window window
;
527 /* rien ne va plus */
528 if (!plane
->state
->crtc
|| !plane
->state
->fb
)
531 if (!plane
->state
->visible
)
532 return tegra_plane_atomic_disable(plane
, old_state
);
534 memset(&window
, 0, sizeof(window
));
535 window
.src
.x
= plane
->state
->src
.x1
>> 16;
536 window
.src
.y
= plane
->state
->src
.y1
>> 16;
537 window
.src
.w
= drm_rect_width(&plane
->state
->src
) >> 16;
538 window
.src
.h
= drm_rect_height(&plane
->state
->src
) >> 16;
539 window
.dst
.x
= plane
->state
->dst
.x1
;
540 window
.dst
.y
= plane
->state
->dst
.y1
;
541 window
.dst
.w
= drm_rect_width(&plane
->state
->dst
);
542 window
.dst
.h
= drm_rect_height(&plane
->state
->dst
);
543 window
.bits_per_pixel
= fb
->format
->cpp
[0] * 8;
544 window
.bottom_up
= tegra_fb_is_bottom_up(fb
);
546 /* copy from state */
547 window
.zpos
= plane
->state
->normalized_zpos
;
548 window
.tiling
= state
->tiling
;
549 window
.format
= state
->format
;
550 window
.swap
= state
->swap
;
552 for (i
= 0; i
< fb
->format
->num_planes
; i
++) {
553 struct tegra_bo
*bo
= tegra_fb_get_plane(fb
, i
);
555 window
.base
[i
] = bo
->paddr
+ fb
->offsets
[i
];
558 * Tegra uses a shared stride for UV planes. Framebuffers are
559 * already checked for this in the tegra_plane_atomic_check()
560 * function, so it's safe to ignore the V-plane pitch here.
563 window
.stride
[i
] = fb
->pitches
[i
];
566 tegra_dc_setup_window(p
, &window
);
569 static const struct drm_plane_helper_funcs tegra_plane_helper_funcs
= {
570 .atomic_check
= tegra_plane_atomic_check
,
571 .atomic_disable
= tegra_plane_atomic_disable
,
572 .atomic_update
= tegra_plane_atomic_update
,
575 static unsigned long tegra_plane_get_possible_crtcs(struct drm_device
*drm
)
578 * Ideally this would use drm_crtc_mask(), but that would require the
579 * CRTC to already be in the mode_config's list of CRTCs. However, it
580 * will only be added to that list in the drm_crtc_init_with_planes()
581 * (in tegra_dc_init()), which in turn requires registration of these
582 * planes. So we have ourselves a nice little chicken and egg problem
585 * We work around this by manually creating the mask from the number
586 * of CRTCs that have been registered, and should therefore always be
587 * the same as drm_crtc_index() after registration.
589 return 1 << drm
->mode_config
.num_crtc
;
592 static struct drm_plane
*tegra_primary_plane_create(struct drm_device
*drm
,
595 unsigned long possible_crtcs
= tegra_plane_get_possible_crtcs(drm
);
596 enum drm_plane_type type
= DRM_PLANE_TYPE_PRIMARY
;
597 struct tegra_plane
*plane
;
598 unsigned int num_formats
;
602 plane
= kzalloc(sizeof(*plane
), GFP_KERNEL
);
604 return ERR_PTR(-ENOMEM
);
606 /* Always use window A as primary window */
607 plane
->offset
= 0xa00;
611 num_formats
= dc
->soc
->num_primary_formats
;
612 formats
= dc
->soc
->primary_formats
;
614 err
= drm_universal_plane_init(drm
, &plane
->base
, possible_crtcs
,
615 &tegra_plane_funcs
, formats
,
616 num_formats
, NULL
, type
, NULL
);
622 drm_plane_helper_add(&plane
->base
, &tegra_plane_helper_funcs
);
624 if (dc
->soc
->supports_blending
)
625 drm_plane_create_zpos_property(&plane
->base
, 0, 0, 255);
630 static const u32 tegra_cursor_plane_formats
[] = {
634 static int tegra_cursor_atomic_check(struct drm_plane
*plane
,
635 struct drm_plane_state
*state
)
637 struct tegra_plane
*tegra
= to_tegra_plane(plane
);
640 /* no need for further checks if the plane is being disabled */
644 /* scaling not supported for cursor */
645 if ((state
->src_w
>> 16 != state
->crtc_w
) ||
646 (state
->src_h
>> 16 != state
->crtc_h
))
649 /* only square cursors supported */
650 if (state
->src_w
!= state
->src_h
)
653 if (state
->crtc_w
!= 32 && state
->crtc_w
!= 64 &&
654 state
->crtc_w
!= 128 && state
->crtc_w
!= 256)
657 err
= tegra_plane_state_add(tegra
, state
);
664 static void tegra_cursor_atomic_update(struct drm_plane
*plane
,
665 struct drm_plane_state
*old_state
)
667 struct tegra_bo
*bo
= tegra_fb_get_plane(plane
->state
->fb
, 0);
668 struct tegra_dc
*dc
= to_tegra_dc(plane
->state
->crtc
);
669 struct drm_plane_state
*state
= plane
->state
;
670 u32 value
= CURSOR_CLIP_DISPLAY
;
672 /* rien ne va plus */
673 if (!plane
->state
->crtc
|| !plane
->state
->fb
)
676 switch (state
->crtc_w
) {
678 value
|= CURSOR_SIZE_32x32
;
682 value
|= CURSOR_SIZE_64x64
;
686 value
|= CURSOR_SIZE_128x128
;
690 value
|= CURSOR_SIZE_256x256
;
694 WARN(1, "cursor size %ux%u not supported\n", state
->crtc_w
,
699 value
|= (bo
->paddr
>> 10) & 0x3fffff;
700 tegra_dc_writel(dc
, value
, DC_DISP_CURSOR_START_ADDR
);
702 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
703 value
= (bo
->paddr
>> 32) & 0x3;
704 tegra_dc_writel(dc
, value
, DC_DISP_CURSOR_START_ADDR_HI
);
707 /* enable cursor and set blend mode */
708 value
= tegra_dc_readl(dc
, DC_DISP_DISP_WIN_OPTIONS
);
709 value
|= CURSOR_ENABLE
;
710 tegra_dc_writel(dc
, value
, DC_DISP_DISP_WIN_OPTIONS
);
712 value
= tegra_dc_readl(dc
, DC_DISP_BLEND_CURSOR_CONTROL
);
713 value
&= ~CURSOR_DST_BLEND_MASK
;
714 value
&= ~CURSOR_SRC_BLEND_MASK
;
715 value
|= CURSOR_MODE_NORMAL
;
716 value
|= CURSOR_DST_BLEND_NEG_K1_TIMES_SRC
;
717 value
|= CURSOR_SRC_BLEND_K1_TIMES_SRC
;
718 value
|= CURSOR_ALPHA
;
719 tegra_dc_writel(dc
, value
, DC_DISP_BLEND_CURSOR_CONTROL
);
721 /* position the cursor */
722 value
= (state
->crtc_y
& 0x3fff) << 16 | (state
->crtc_x
& 0x3fff);
723 tegra_dc_writel(dc
, value
, DC_DISP_CURSOR_POSITION
);
726 static void tegra_cursor_atomic_disable(struct drm_plane
*plane
,
727 struct drm_plane_state
*old_state
)
732 /* rien ne va plus */
733 if (!old_state
|| !old_state
->crtc
)
736 dc
= to_tegra_dc(old_state
->crtc
);
738 value
= tegra_dc_readl(dc
, DC_DISP_DISP_WIN_OPTIONS
);
739 value
&= ~CURSOR_ENABLE
;
740 tegra_dc_writel(dc
, value
, DC_DISP_DISP_WIN_OPTIONS
);
743 static const struct drm_plane_helper_funcs tegra_cursor_plane_helper_funcs
= {
744 .atomic_check
= tegra_cursor_atomic_check
,
745 .atomic_update
= tegra_cursor_atomic_update
,
746 .atomic_disable
= tegra_cursor_atomic_disable
,
749 static struct drm_plane
*tegra_dc_cursor_plane_create(struct drm_device
*drm
,
752 unsigned long possible_crtcs
= tegra_plane_get_possible_crtcs(drm
);
753 struct tegra_plane
*plane
;
754 unsigned int num_formats
;
758 plane
= kzalloc(sizeof(*plane
), GFP_KERNEL
);
760 return ERR_PTR(-ENOMEM
);
763 * This index is kind of fake. The cursor isn't a regular plane, but
764 * its update and activation request bits in DC_CMD_STATE_CONTROL do
765 * use the same programming. Setting this fake index here allows the
766 * code in tegra_add_plane_state() to do the right thing without the
767 * need to special-casing the cursor plane.
772 num_formats
= ARRAY_SIZE(tegra_cursor_plane_formats
);
773 formats
= tegra_cursor_plane_formats
;
775 err
= drm_universal_plane_init(drm
, &plane
->base
, possible_crtcs
,
776 &tegra_plane_funcs
, formats
,
778 DRM_PLANE_TYPE_CURSOR
, NULL
);
784 drm_plane_helper_add(&plane
->base
, &tegra_cursor_plane_helper_funcs
);
789 static const u32 tegra20_overlay_formats
[] = {
796 /* non-native formats */
808 static const u32 tegra114_overlay_formats
[] = {
815 /* new on Tegra114 */
835 static const u32 tegra124_overlay_formats
[] = {
842 /* new on Tegra114 */
855 /* new on Tegra124 */
865 static struct drm_plane
*tegra_dc_overlay_plane_create(struct drm_device
*drm
,
869 unsigned long possible_crtcs
= tegra_plane_get_possible_crtcs(drm
);
870 struct tegra_plane
*plane
;
871 unsigned int num_formats
;
875 plane
= kzalloc(sizeof(*plane
), GFP_KERNEL
);
877 return ERR_PTR(-ENOMEM
);
879 plane
->offset
= 0xa00 + 0x200 * index
;
880 plane
->index
= index
;
883 num_formats
= dc
->soc
->num_overlay_formats
;
884 formats
= dc
->soc
->overlay_formats
;
886 err
= drm_universal_plane_init(drm
, &plane
->base
, possible_crtcs
,
887 &tegra_plane_funcs
, formats
,
889 DRM_PLANE_TYPE_OVERLAY
, NULL
);
895 drm_plane_helper_add(&plane
->base
, &tegra_plane_helper_funcs
);
897 if (dc
->soc
->supports_blending
)
898 drm_plane_create_zpos_property(&plane
->base
, 0, 0, 255);
903 static struct drm_plane
*tegra_dc_add_shared_planes(struct drm_device
*drm
,
906 struct drm_plane
*plane
, *primary
= NULL
;
909 for (i
= 0; i
< dc
->soc
->num_wgrps
; i
++) {
910 const struct tegra_windowgroup_soc
*wgrp
= &dc
->soc
->wgrps
[i
];
912 if (wgrp
->dc
== dc
->pipe
) {
913 for (j
= 0; j
< wgrp
->num_windows
; j
++) {
914 unsigned int index
= wgrp
->windows
[j
];
916 plane
= tegra_shared_plane_create(drm
, dc
,
923 * Choose the first shared plane owned by this
924 * head as the primary plane.
927 plane
->type
= DRM_PLANE_TYPE_PRIMARY
;
937 static struct drm_plane
*tegra_dc_add_planes(struct drm_device
*drm
,
940 struct drm_plane
*planes
[2], *primary
;
944 primary
= tegra_primary_plane_create(drm
, dc
);
948 for (i
= 0; i
< 2; i
++) {
949 planes
[i
] = tegra_dc_overlay_plane_create(drm
, dc
, 1 + i
);
950 if (IS_ERR(planes
[i
])) {
951 err
= PTR_ERR(planes
[i
]);
954 tegra_plane_funcs
.destroy(planes
[i
]);
956 tegra_plane_funcs
.destroy(primary
);
964 static void tegra_dc_destroy(struct drm_crtc
*crtc
)
966 drm_crtc_cleanup(crtc
);
969 static void tegra_crtc_reset(struct drm_crtc
*crtc
)
971 struct tegra_dc_state
*state
;
974 __drm_atomic_helper_crtc_destroy_state(crtc
->state
);
979 state
= kzalloc(sizeof(*state
), GFP_KERNEL
);
981 crtc
->state
= &state
->base
;
982 crtc
->state
->crtc
= crtc
;
985 drm_crtc_vblank_reset(crtc
);
988 static struct drm_crtc_state
*
989 tegra_crtc_atomic_duplicate_state(struct drm_crtc
*crtc
)
991 struct tegra_dc_state
*state
= to_dc_state(crtc
->state
);
992 struct tegra_dc_state
*copy
;
994 copy
= kmalloc(sizeof(*copy
), GFP_KERNEL
);
998 __drm_atomic_helper_crtc_duplicate_state(crtc
, ©
->base
);
999 copy
->clk
= state
->clk
;
1000 copy
->pclk
= state
->pclk
;
1001 copy
->div
= state
->div
;
1002 copy
->planes
= state
->planes
;
1007 static void tegra_crtc_atomic_destroy_state(struct drm_crtc
*crtc
,
1008 struct drm_crtc_state
*state
)
1010 __drm_atomic_helper_crtc_destroy_state(state
);
1014 #define DEBUGFS_REG32(_name) { .name = #_name, .offset = _name }
1016 static const struct debugfs_reg32 tegra_dc_regs
[] = {
1017 DEBUGFS_REG32(DC_CMD_GENERAL_INCR_SYNCPT
),
1018 DEBUGFS_REG32(DC_CMD_GENERAL_INCR_SYNCPT_CNTRL
),
1019 DEBUGFS_REG32(DC_CMD_GENERAL_INCR_SYNCPT_ERROR
),
1020 DEBUGFS_REG32(DC_CMD_WIN_A_INCR_SYNCPT
),
1021 DEBUGFS_REG32(DC_CMD_WIN_A_INCR_SYNCPT_CNTRL
),
1022 DEBUGFS_REG32(DC_CMD_WIN_A_INCR_SYNCPT_ERROR
),
1023 DEBUGFS_REG32(DC_CMD_WIN_B_INCR_SYNCPT
),
1024 DEBUGFS_REG32(DC_CMD_WIN_B_INCR_SYNCPT_CNTRL
),
1025 DEBUGFS_REG32(DC_CMD_WIN_B_INCR_SYNCPT_ERROR
),
1026 DEBUGFS_REG32(DC_CMD_WIN_C_INCR_SYNCPT
),
1027 DEBUGFS_REG32(DC_CMD_WIN_C_INCR_SYNCPT_CNTRL
),
1028 DEBUGFS_REG32(DC_CMD_WIN_C_INCR_SYNCPT_ERROR
),
1029 DEBUGFS_REG32(DC_CMD_CONT_SYNCPT_VSYNC
),
1030 DEBUGFS_REG32(DC_CMD_DISPLAY_COMMAND_OPTION0
),
1031 DEBUGFS_REG32(DC_CMD_DISPLAY_COMMAND
),
1032 DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE
),
1033 DEBUGFS_REG32(DC_CMD_DISPLAY_POWER_CONTROL
),
1034 DEBUGFS_REG32(DC_CMD_INT_STATUS
),
1035 DEBUGFS_REG32(DC_CMD_INT_MASK
),
1036 DEBUGFS_REG32(DC_CMD_INT_ENABLE
),
1037 DEBUGFS_REG32(DC_CMD_INT_TYPE
),
1038 DEBUGFS_REG32(DC_CMD_INT_POLARITY
),
1039 DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE1
),
1040 DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE2
),
1041 DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE3
),
1042 DEBUGFS_REG32(DC_CMD_STATE_ACCESS
),
1043 DEBUGFS_REG32(DC_CMD_STATE_CONTROL
),
1044 DEBUGFS_REG32(DC_CMD_DISPLAY_WINDOW_HEADER
),
1045 DEBUGFS_REG32(DC_CMD_REG_ACT_CONTROL
),
1046 DEBUGFS_REG32(DC_COM_CRC_CONTROL
),
1047 DEBUGFS_REG32(DC_COM_CRC_CHECKSUM
),
1048 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(0)),
1049 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(1)),
1050 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(2)),
1051 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(3)),
1052 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(0)),
1053 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(1)),
1054 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(2)),
1055 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(3)),
1056 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(0)),
1057 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(1)),
1058 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(2)),
1059 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(3)),
1060 DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(0)),
1061 DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(1)),
1062 DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(2)),
1063 DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(3)),
1064 DEBUGFS_REG32(DC_COM_PIN_INPUT_DATA(0)),
1065 DEBUGFS_REG32(DC_COM_PIN_INPUT_DATA(1)),
1066 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(0)),
1067 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(1)),
1068 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(2)),
1069 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(3)),
1070 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(4)),
1071 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(5)),
1072 DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(6)),
1073 DEBUGFS_REG32(DC_COM_PIN_MISC_CONTROL
),
1074 DEBUGFS_REG32(DC_COM_PIN_PM0_CONTROL
),
1075 DEBUGFS_REG32(DC_COM_PIN_PM0_DUTY_CYCLE
),
1076 DEBUGFS_REG32(DC_COM_PIN_PM1_CONTROL
),
1077 DEBUGFS_REG32(DC_COM_PIN_PM1_DUTY_CYCLE
),
1078 DEBUGFS_REG32(DC_COM_SPI_CONTROL
),
1079 DEBUGFS_REG32(DC_COM_SPI_START_BYTE
),
1080 DEBUGFS_REG32(DC_COM_HSPI_WRITE_DATA_AB
),
1081 DEBUGFS_REG32(DC_COM_HSPI_WRITE_DATA_CD
),
1082 DEBUGFS_REG32(DC_COM_HSPI_CS_DC
),
1083 DEBUGFS_REG32(DC_COM_SCRATCH_REGISTER_A
),
1084 DEBUGFS_REG32(DC_COM_SCRATCH_REGISTER_B
),
1085 DEBUGFS_REG32(DC_COM_GPIO_CTRL
),
1086 DEBUGFS_REG32(DC_COM_GPIO_DEBOUNCE_COUNTER
),
1087 DEBUGFS_REG32(DC_COM_CRC_CHECKSUM_LATCHED
),
1088 DEBUGFS_REG32(DC_DISP_DISP_SIGNAL_OPTIONS0
),
1089 DEBUGFS_REG32(DC_DISP_DISP_SIGNAL_OPTIONS1
),
1090 DEBUGFS_REG32(DC_DISP_DISP_WIN_OPTIONS
),
1091 DEBUGFS_REG32(DC_DISP_DISP_MEM_HIGH_PRIORITY
),
1092 DEBUGFS_REG32(DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER
),
1093 DEBUGFS_REG32(DC_DISP_DISP_TIMING_OPTIONS
),
1094 DEBUGFS_REG32(DC_DISP_REF_TO_SYNC
),
1095 DEBUGFS_REG32(DC_DISP_SYNC_WIDTH
),
1096 DEBUGFS_REG32(DC_DISP_BACK_PORCH
),
1097 DEBUGFS_REG32(DC_DISP_ACTIVE
),
1098 DEBUGFS_REG32(DC_DISP_FRONT_PORCH
),
1099 DEBUGFS_REG32(DC_DISP_H_PULSE0_CONTROL
),
1100 DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_A
),
1101 DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_B
),
1102 DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_C
),
1103 DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_D
),
1104 DEBUGFS_REG32(DC_DISP_H_PULSE1_CONTROL
),
1105 DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_A
),
1106 DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_B
),
1107 DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_C
),
1108 DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_D
),
1109 DEBUGFS_REG32(DC_DISP_H_PULSE2_CONTROL
),
1110 DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_A
),
1111 DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_B
),
1112 DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_C
),
1113 DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_D
),
1114 DEBUGFS_REG32(DC_DISP_V_PULSE0_CONTROL
),
1115 DEBUGFS_REG32(DC_DISP_V_PULSE0_POSITION_A
),
1116 DEBUGFS_REG32(DC_DISP_V_PULSE0_POSITION_B
),
1117 DEBUGFS_REG32(DC_DISP_V_PULSE0_POSITION_C
),
1118 DEBUGFS_REG32(DC_DISP_V_PULSE1_CONTROL
),
1119 DEBUGFS_REG32(DC_DISP_V_PULSE1_POSITION_A
),
1120 DEBUGFS_REG32(DC_DISP_V_PULSE1_POSITION_B
),
1121 DEBUGFS_REG32(DC_DISP_V_PULSE1_POSITION_C
),
1122 DEBUGFS_REG32(DC_DISP_V_PULSE2_CONTROL
),
1123 DEBUGFS_REG32(DC_DISP_V_PULSE2_POSITION_A
),
1124 DEBUGFS_REG32(DC_DISP_V_PULSE3_CONTROL
),
1125 DEBUGFS_REG32(DC_DISP_V_PULSE3_POSITION_A
),
1126 DEBUGFS_REG32(DC_DISP_M0_CONTROL
),
1127 DEBUGFS_REG32(DC_DISP_M1_CONTROL
),
1128 DEBUGFS_REG32(DC_DISP_DI_CONTROL
),
1129 DEBUGFS_REG32(DC_DISP_PP_CONTROL
),
1130 DEBUGFS_REG32(DC_DISP_PP_SELECT_A
),
1131 DEBUGFS_REG32(DC_DISP_PP_SELECT_B
),
1132 DEBUGFS_REG32(DC_DISP_PP_SELECT_C
),
1133 DEBUGFS_REG32(DC_DISP_PP_SELECT_D
),
1134 DEBUGFS_REG32(DC_DISP_DISP_CLOCK_CONTROL
),
1135 DEBUGFS_REG32(DC_DISP_DISP_INTERFACE_CONTROL
),
1136 DEBUGFS_REG32(DC_DISP_DISP_COLOR_CONTROL
),
1137 DEBUGFS_REG32(DC_DISP_SHIFT_CLOCK_OPTIONS
),
1138 DEBUGFS_REG32(DC_DISP_DATA_ENABLE_OPTIONS
),
1139 DEBUGFS_REG32(DC_DISP_SERIAL_INTERFACE_OPTIONS
),
1140 DEBUGFS_REG32(DC_DISP_LCD_SPI_OPTIONS
),
1141 DEBUGFS_REG32(DC_DISP_BORDER_COLOR
),
1142 DEBUGFS_REG32(DC_DISP_COLOR_KEY0_LOWER
),
1143 DEBUGFS_REG32(DC_DISP_COLOR_KEY0_UPPER
),
1144 DEBUGFS_REG32(DC_DISP_COLOR_KEY1_LOWER
),
1145 DEBUGFS_REG32(DC_DISP_COLOR_KEY1_UPPER
),
1146 DEBUGFS_REG32(DC_DISP_CURSOR_FOREGROUND
),
1147 DEBUGFS_REG32(DC_DISP_CURSOR_BACKGROUND
),
1148 DEBUGFS_REG32(DC_DISP_CURSOR_START_ADDR
),
1149 DEBUGFS_REG32(DC_DISP_CURSOR_START_ADDR_NS
),
1150 DEBUGFS_REG32(DC_DISP_CURSOR_POSITION
),
1151 DEBUGFS_REG32(DC_DISP_CURSOR_POSITION_NS
),
1152 DEBUGFS_REG32(DC_DISP_INIT_SEQ_CONTROL
),
1153 DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_A
),
1154 DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_B
),
1155 DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_C
),
1156 DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_D
),
1157 DEBUGFS_REG32(DC_DISP_DC_MCCIF_FIFOCTRL
),
1158 DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY0A_HYST
),
1159 DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY0B_HYST
),
1160 DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY1A_HYST
),
1161 DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY1B_HYST
),
1162 DEBUGFS_REG32(DC_DISP_DAC_CRT_CTRL
),
1163 DEBUGFS_REG32(DC_DISP_DISP_MISC_CONTROL
),
1164 DEBUGFS_REG32(DC_DISP_SD_CONTROL
),
1165 DEBUGFS_REG32(DC_DISP_SD_CSC_COEFF
),
1166 DEBUGFS_REG32(DC_DISP_SD_LUT(0)),
1167 DEBUGFS_REG32(DC_DISP_SD_LUT(1)),
1168 DEBUGFS_REG32(DC_DISP_SD_LUT(2)),
1169 DEBUGFS_REG32(DC_DISP_SD_LUT(3)),
1170 DEBUGFS_REG32(DC_DISP_SD_LUT(4)),
1171 DEBUGFS_REG32(DC_DISP_SD_LUT(5)),
1172 DEBUGFS_REG32(DC_DISP_SD_LUT(6)),
1173 DEBUGFS_REG32(DC_DISP_SD_LUT(7)),
1174 DEBUGFS_REG32(DC_DISP_SD_LUT(8)),
1175 DEBUGFS_REG32(DC_DISP_SD_FLICKER_CONTROL
),
1176 DEBUGFS_REG32(DC_DISP_DC_PIXEL_COUNT
),
1177 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(0)),
1178 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(1)),
1179 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(2)),
1180 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(3)),
1181 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(4)),
1182 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(5)),
1183 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(6)),
1184 DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(7)),
1185 DEBUGFS_REG32(DC_DISP_SD_BL_TF(0)),
1186 DEBUGFS_REG32(DC_DISP_SD_BL_TF(1)),
1187 DEBUGFS_REG32(DC_DISP_SD_BL_TF(2)),
1188 DEBUGFS_REG32(DC_DISP_SD_BL_TF(3)),
1189 DEBUGFS_REG32(DC_DISP_SD_BL_CONTROL
),
1190 DEBUGFS_REG32(DC_DISP_SD_HW_K_VALUES
),
1191 DEBUGFS_REG32(DC_DISP_SD_MAN_K_VALUES
),
1192 DEBUGFS_REG32(DC_DISP_CURSOR_START_ADDR_HI
),
1193 DEBUGFS_REG32(DC_DISP_BLEND_CURSOR_CONTROL
),
1194 DEBUGFS_REG32(DC_WIN_WIN_OPTIONS
),
1195 DEBUGFS_REG32(DC_WIN_BYTE_SWAP
),
1196 DEBUGFS_REG32(DC_WIN_BUFFER_CONTROL
),
1197 DEBUGFS_REG32(DC_WIN_COLOR_DEPTH
),
1198 DEBUGFS_REG32(DC_WIN_POSITION
),
1199 DEBUGFS_REG32(DC_WIN_SIZE
),
1200 DEBUGFS_REG32(DC_WIN_PRESCALED_SIZE
),
1201 DEBUGFS_REG32(DC_WIN_H_INITIAL_DDA
),
1202 DEBUGFS_REG32(DC_WIN_V_INITIAL_DDA
),
1203 DEBUGFS_REG32(DC_WIN_DDA_INC
),
1204 DEBUGFS_REG32(DC_WIN_LINE_STRIDE
),
1205 DEBUGFS_REG32(DC_WIN_BUF_STRIDE
),
1206 DEBUGFS_REG32(DC_WIN_UV_BUF_STRIDE
),
1207 DEBUGFS_REG32(DC_WIN_BUFFER_ADDR_MODE
),
1208 DEBUGFS_REG32(DC_WIN_DV_CONTROL
),
1209 DEBUGFS_REG32(DC_WIN_BLEND_NOKEY
),
1210 DEBUGFS_REG32(DC_WIN_BLEND_1WIN
),
1211 DEBUGFS_REG32(DC_WIN_BLEND_2WIN_X
),
1212 DEBUGFS_REG32(DC_WIN_BLEND_2WIN_Y
),
1213 DEBUGFS_REG32(DC_WIN_BLEND_3WIN_XY
),
1214 DEBUGFS_REG32(DC_WIN_HP_FETCH_CONTROL
),
1215 DEBUGFS_REG32(DC_WINBUF_START_ADDR
),
1216 DEBUGFS_REG32(DC_WINBUF_START_ADDR_NS
),
1217 DEBUGFS_REG32(DC_WINBUF_START_ADDR_U
),
1218 DEBUGFS_REG32(DC_WINBUF_START_ADDR_U_NS
),
1219 DEBUGFS_REG32(DC_WINBUF_START_ADDR_V
),
1220 DEBUGFS_REG32(DC_WINBUF_START_ADDR_V_NS
),
1221 DEBUGFS_REG32(DC_WINBUF_ADDR_H_OFFSET
),
1222 DEBUGFS_REG32(DC_WINBUF_ADDR_H_OFFSET_NS
),
1223 DEBUGFS_REG32(DC_WINBUF_ADDR_V_OFFSET
),
1224 DEBUGFS_REG32(DC_WINBUF_ADDR_V_OFFSET_NS
),
1225 DEBUGFS_REG32(DC_WINBUF_UFLOW_STATUS
),
1226 DEBUGFS_REG32(DC_WINBUF_AD_UFLOW_STATUS
),
1227 DEBUGFS_REG32(DC_WINBUF_BD_UFLOW_STATUS
),
1228 DEBUGFS_REG32(DC_WINBUF_CD_UFLOW_STATUS
),
1231 static int tegra_dc_show_regs(struct seq_file
*s
, void *data
)
1233 struct drm_info_node
*node
= s
->private;
1234 struct tegra_dc
*dc
= node
->info_ent
->data
;
1238 drm_modeset_lock(&dc
->base
.mutex
, NULL
);
1240 if (!dc
->base
.state
->active
) {
1245 for (i
= 0; i
< ARRAY_SIZE(tegra_dc_regs
); i
++) {
1246 unsigned int offset
= tegra_dc_regs
[i
].offset
;
1248 seq_printf(s
, "%-40s %#05x %08x\n", tegra_dc_regs
[i
].name
,
1249 offset
, tegra_dc_readl(dc
, offset
));
1253 drm_modeset_unlock(&dc
->base
.mutex
);
1257 static int tegra_dc_show_crc(struct seq_file
*s
, void *data
)
1259 struct drm_info_node
*node
= s
->private;
1260 struct tegra_dc
*dc
= node
->info_ent
->data
;
1264 drm_modeset_lock(&dc
->base
.mutex
, NULL
);
1266 if (!dc
->base
.state
->active
) {
1271 value
= DC_COM_CRC_CONTROL_ACTIVE_DATA
| DC_COM_CRC_CONTROL_ENABLE
;
1272 tegra_dc_writel(dc
, value
, DC_COM_CRC_CONTROL
);
1273 tegra_dc_commit(dc
);
1275 drm_crtc_wait_one_vblank(&dc
->base
);
1276 drm_crtc_wait_one_vblank(&dc
->base
);
1278 value
= tegra_dc_readl(dc
, DC_COM_CRC_CHECKSUM
);
1279 seq_printf(s
, "%08x\n", value
);
1281 tegra_dc_writel(dc
, 0, DC_COM_CRC_CONTROL
);
1284 drm_modeset_unlock(&dc
->base
.mutex
);
1288 static int tegra_dc_show_stats(struct seq_file
*s
, void *data
)
1290 struct drm_info_node
*node
= s
->private;
1291 struct tegra_dc
*dc
= node
->info_ent
->data
;
1293 seq_printf(s
, "frames: %lu\n", dc
->stats
.frames
);
1294 seq_printf(s
, "vblank: %lu\n", dc
->stats
.vblank
);
1295 seq_printf(s
, "underflow: %lu\n", dc
->stats
.underflow
);
1296 seq_printf(s
, "overflow: %lu\n", dc
->stats
.overflow
);
1301 static struct drm_info_list debugfs_files
[] = {
1302 { "regs", tegra_dc_show_regs
, 0, NULL
},
1303 { "crc", tegra_dc_show_crc
, 0, NULL
},
1304 { "stats", tegra_dc_show_stats
, 0, NULL
},
1307 static int tegra_dc_late_register(struct drm_crtc
*crtc
)
1309 unsigned int i
, count
= ARRAY_SIZE(debugfs_files
);
1310 struct drm_minor
*minor
= crtc
->dev
->primary
;
1311 struct dentry
*root
;
1312 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1315 #ifdef CONFIG_DEBUG_FS
1316 root
= crtc
->debugfs_entry
;
1321 dc
->debugfs_files
= kmemdup(debugfs_files
, sizeof(debugfs_files
),
1323 if (!dc
->debugfs_files
)
1326 for (i
= 0; i
< count
; i
++)
1327 dc
->debugfs_files
[i
].data
= dc
;
1329 err
= drm_debugfs_create_files(dc
->debugfs_files
, count
, root
, minor
);
1336 kfree(dc
->debugfs_files
);
1337 dc
->debugfs_files
= NULL
;
1342 static void tegra_dc_early_unregister(struct drm_crtc
*crtc
)
1344 unsigned int count
= ARRAY_SIZE(debugfs_files
);
1345 struct drm_minor
*minor
= crtc
->dev
->primary
;
1346 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1348 drm_debugfs_remove_files(dc
->debugfs_files
, count
, minor
);
1349 kfree(dc
->debugfs_files
);
1350 dc
->debugfs_files
= NULL
;
1353 static u32
tegra_dc_get_vblank_counter(struct drm_crtc
*crtc
)
1355 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1357 /* XXX vblank syncpoints don't work with nvdisplay yet */
1358 if (dc
->syncpt
&& !dc
->soc
->has_nvdisplay
)
1359 return host1x_syncpt_read(dc
->syncpt
);
1361 /* fallback to software emulated VBLANK counter */
1362 return drm_crtc_vblank_count(&dc
->base
);
1365 static int tegra_dc_enable_vblank(struct drm_crtc
*crtc
)
1367 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1370 value
= tegra_dc_readl(dc
, DC_CMD_INT_MASK
);
1371 value
|= VBLANK_INT
;
1372 tegra_dc_writel(dc
, value
, DC_CMD_INT_MASK
);
1377 static void tegra_dc_disable_vblank(struct drm_crtc
*crtc
)
1379 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1382 value
= tegra_dc_readl(dc
, DC_CMD_INT_MASK
);
1383 value
&= ~VBLANK_INT
;
1384 tegra_dc_writel(dc
, value
, DC_CMD_INT_MASK
);
1387 static const struct drm_crtc_funcs tegra_crtc_funcs
= {
1388 .page_flip
= drm_atomic_helper_page_flip
,
1389 .set_config
= drm_atomic_helper_set_config
,
1390 .destroy
= tegra_dc_destroy
,
1391 .reset
= tegra_crtc_reset
,
1392 .atomic_duplicate_state
= tegra_crtc_atomic_duplicate_state
,
1393 .atomic_destroy_state
= tegra_crtc_atomic_destroy_state
,
1394 .late_register
= tegra_dc_late_register
,
1395 .early_unregister
= tegra_dc_early_unregister
,
1396 .get_vblank_counter
= tegra_dc_get_vblank_counter
,
1397 .enable_vblank
= tegra_dc_enable_vblank
,
1398 .disable_vblank
= tegra_dc_disable_vblank
,
1401 static int tegra_dc_set_timings(struct tegra_dc
*dc
,
1402 struct drm_display_mode
*mode
)
1404 unsigned int h_ref_to_sync
= 1;
1405 unsigned int v_ref_to_sync
= 1;
1406 unsigned long value
;
1408 if (!dc
->soc
->has_nvdisplay
) {
1409 tegra_dc_writel(dc
, 0x0, DC_DISP_DISP_TIMING_OPTIONS
);
1411 value
= (v_ref_to_sync
<< 16) | h_ref_to_sync
;
1412 tegra_dc_writel(dc
, value
, DC_DISP_REF_TO_SYNC
);
1415 value
= ((mode
->vsync_end
- mode
->vsync_start
) << 16) |
1416 ((mode
->hsync_end
- mode
->hsync_start
) << 0);
1417 tegra_dc_writel(dc
, value
, DC_DISP_SYNC_WIDTH
);
1419 value
= ((mode
->vtotal
- mode
->vsync_end
) << 16) |
1420 ((mode
->htotal
- mode
->hsync_end
) << 0);
1421 tegra_dc_writel(dc
, value
, DC_DISP_BACK_PORCH
);
1423 value
= ((mode
->vsync_start
- mode
->vdisplay
) << 16) |
1424 ((mode
->hsync_start
- mode
->hdisplay
) << 0);
1425 tegra_dc_writel(dc
, value
, DC_DISP_FRONT_PORCH
);
1427 value
= (mode
->vdisplay
<< 16) | mode
->hdisplay
;
1428 tegra_dc_writel(dc
, value
, DC_DISP_ACTIVE
);
1434 * tegra_dc_state_setup_clock - check clock settings and store them in atomic
1436 * @dc: display controller
1437 * @crtc_state: CRTC atomic state
1438 * @clk: parent clock for display controller
1439 * @pclk: pixel clock
1440 * @div: shift clock divider
1443 * 0 on success or a negative error-code on failure.
1445 int tegra_dc_state_setup_clock(struct tegra_dc
*dc
,
1446 struct drm_crtc_state
*crtc_state
,
1447 struct clk
*clk
, unsigned long pclk
,
1450 struct tegra_dc_state
*state
= to_dc_state(crtc_state
);
1452 if (!clk_has_parent(dc
->clk
, clk
))
1462 static void tegra_dc_commit_state(struct tegra_dc
*dc
,
1463 struct tegra_dc_state
*state
)
1468 err
= clk_set_parent(dc
->clk
, state
->clk
);
1470 dev_err(dc
->dev
, "failed to set parent clock: %d\n", err
);
1473 * Outputs may not want to change the parent clock rate. This is only
1474 * relevant to Tegra20 where only a single display PLL is available.
1475 * Since that PLL would typically be used for HDMI, an internal LVDS
1476 * panel would need to be driven by some other clock such as PLL_P
1477 * which is shared with other peripherals. Changing the clock rate
1478 * should therefore be avoided.
1480 if (state
->pclk
> 0) {
1481 err
= clk_set_rate(state
->clk
, state
->pclk
);
1484 "failed to set clock rate to %lu Hz\n",
1488 DRM_DEBUG_KMS("rate: %lu, div: %u\n", clk_get_rate(dc
->clk
),
1490 DRM_DEBUG_KMS("pclk: %lu\n", state
->pclk
);
1492 if (!dc
->soc
->has_nvdisplay
) {
1493 value
= SHIFT_CLK_DIVIDER(state
->div
) | PIXEL_CLK_DIVIDER_PCD1
;
1494 tegra_dc_writel(dc
, value
, DC_DISP_DISP_CLOCK_CONTROL
);
1497 err
= clk_set_rate(dc
->clk
, state
->pclk
);
1499 dev_err(dc
->dev
, "failed to set clock %pC to %lu Hz: %d\n",
1500 dc
->clk
, state
->pclk
, err
);
1503 static void tegra_dc_stop(struct tegra_dc
*dc
)
1507 /* stop the display controller */
1508 value
= tegra_dc_readl(dc
, DC_CMD_DISPLAY_COMMAND
);
1509 value
&= ~DISP_CTRL_MODE_MASK
;
1510 tegra_dc_writel(dc
, value
, DC_CMD_DISPLAY_COMMAND
);
1512 tegra_dc_commit(dc
);
1515 static bool tegra_dc_idle(struct tegra_dc
*dc
)
1519 value
= tegra_dc_readl_active(dc
, DC_CMD_DISPLAY_COMMAND
);
1521 return (value
& DISP_CTRL_MODE_MASK
) == 0;
1524 static int tegra_dc_wait_idle(struct tegra_dc
*dc
, unsigned long timeout
)
1526 timeout
= jiffies
+ msecs_to_jiffies(timeout
);
1528 while (time_before(jiffies
, timeout
)) {
1529 if (tegra_dc_idle(dc
))
1532 usleep_range(1000, 2000);
1535 dev_dbg(dc
->dev
, "timeout waiting for DC to become idle\n");
1539 static void tegra_crtc_atomic_disable(struct drm_crtc
*crtc
,
1540 struct drm_crtc_state
*old_state
)
1542 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1545 if (!tegra_dc_idle(dc
)) {
1549 * Ignore the return value, there isn't anything useful to do
1550 * in case this fails.
1552 tegra_dc_wait_idle(dc
, 100);
1556 * This should really be part of the RGB encoder driver, but clearing
1557 * these bits has the side-effect of stopping the display controller.
1558 * When that happens no VBLANK interrupts will be raised. At the same
1559 * time the encoder is disabled before the display controller, so the
1560 * above code is always going to timeout waiting for the controller
1563 * Given the close coupling between the RGB encoder and the display
1564 * controller doing it here is still kind of okay. None of the other
1565 * encoder drivers require these bits to be cleared.
1567 * XXX: Perhaps given that the display controller is switched off at
1568 * this point anyway maybe clearing these bits isn't even useful for
1572 value
= tegra_dc_readl(dc
, DC_CMD_DISPLAY_POWER_CONTROL
);
1573 value
&= ~(PW0_ENABLE
| PW1_ENABLE
| PW2_ENABLE
| PW3_ENABLE
|
1574 PW4_ENABLE
| PM0_ENABLE
| PM1_ENABLE
);
1575 tegra_dc_writel(dc
, value
, DC_CMD_DISPLAY_POWER_CONTROL
);
1578 tegra_dc_stats_reset(&dc
->stats
);
1579 drm_crtc_vblank_off(crtc
);
1581 spin_lock_irq(&crtc
->dev
->event_lock
);
1583 if (crtc
->state
->event
) {
1584 drm_crtc_send_vblank_event(crtc
, crtc
->state
->event
);
1585 crtc
->state
->event
= NULL
;
1588 spin_unlock_irq(&crtc
->dev
->event_lock
);
1590 pm_runtime_put_sync(dc
->dev
);
1593 static void tegra_crtc_atomic_enable(struct drm_crtc
*crtc
,
1594 struct drm_crtc_state
*old_state
)
1596 struct drm_display_mode
*mode
= &crtc
->state
->adjusted_mode
;
1597 struct tegra_dc_state
*state
= to_dc_state(crtc
->state
);
1598 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1601 pm_runtime_get_sync(dc
->dev
);
1603 /* initialize display controller */
1605 u32 syncpt
= host1x_syncpt_id(dc
->syncpt
), enable
;
1607 if (dc
->soc
->has_nvdisplay
)
1612 value
= SYNCPT_CNTRL_NO_STALL
;
1613 tegra_dc_writel(dc
, value
, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL
);
1615 value
= enable
| syncpt
;
1616 tegra_dc_writel(dc
, value
, DC_CMD_CONT_SYNCPT_VSYNC
);
1619 if (dc
->soc
->has_nvdisplay
) {
1620 value
= DSC_TO_UF_INT
| DSC_BBUF_UF_INT
| DSC_RBUF_UF_INT
|
1622 tegra_dc_writel(dc
, value
, DC_CMD_INT_TYPE
);
1624 value
= DSC_TO_UF_INT
| DSC_BBUF_UF_INT
| DSC_RBUF_UF_INT
|
1625 DSC_OBUF_UF_INT
| SD3_BUCKET_WALK_DONE_INT
|
1626 HEAD_UF_INT
| MSF_INT
| REG_TMOUT_INT
|
1627 REGION_CRC_INT
| V_PULSE2_INT
| V_PULSE3_INT
|
1628 VBLANK_INT
| FRAME_END_INT
;
1629 tegra_dc_writel(dc
, value
, DC_CMD_INT_POLARITY
);
1631 value
= SD3_BUCKET_WALK_DONE_INT
| HEAD_UF_INT
| VBLANK_INT
|
1633 tegra_dc_writel(dc
, value
, DC_CMD_INT_ENABLE
);
1635 value
= HEAD_UF_INT
| REG_TMOUT_INT
| FRAME_END_INT
;
1636 tegra_dc_writel(dc
, value
, DC_CMD_INT_MASK
);
1638 tegra_dc_writel(dc
, READ_MUX
, DC_CMD_STATE_ACCESS
);
1640 value
= WIN_A_UF_INT
| WIN_B_UF_INT
| WIN_C_UF_INT
|
1641 WIN_A_OF_INT
| WIN_B_OF_INT
| WIN_C_OF_INT
;
1642 tegra_dc_writel(dc
, value
, DC_CMD_INT_TYPE
);
1644 value
= WIN_A_UF_INT
| WIN_B_UF_INT
| WIN_C_UF_INT
|
1645 WIN_A_OF_INT
| WIN_B_OF_INT
| WIN_C_OF_INT
;
1646 tegra_dc_writel(dc
, value
, DC_CMD_INT_POLARITY
);
1648 /* initialize timer */
1649 value
= CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(0x20) |
1650 WINDOW_B_THRESHOLD(0x20) | WINDOW_C_THRESHOLD(0x20);
1651 tegra_dc_writel(dc
, value
, DC_DISP_DISP_MEM_HIGH_PRIORITY
);
1653 value
= CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(1) |
1654 WINDOW_B_THRESHOLD(1) | WINDOW_C_THRESHOLD(1);
1655 tegra_dc_writel(dc
, value
, DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER
);
1657 value
= VBLANK_INT
| WIN_A_UF_INT
| WIN_B_UF_INT
| WIN_C_UF_INT
|
1658 WIN_A_OF_INT
| WIN_B_OF_INT
| WIN_C_OF_INT
;
1659 tegra_dc_writel(dc
, value
, DC_CMD_INT_ENABLE
);
1661 value
= WIN_A_UF_INT
| WIN_B_UF_INT
| WIN_C_UF_INT
|
1662 WIN_A_OF_INT
| WIN_B_OF_INT
| WIN_C_OF_INT
;
1663 tegra_dc_writel(dc
, value
, DC_CMD_INT_MASK
);
1666 if (dc
->soc
->supports_background_color
)
1667 tegra_dc_writel(dc
, 0, DC_DISP_BLEND_BACKGROUND_COLOR
);
1669 tegra_dc_writel(dc
, 0, DC_DISP_BORDER_COLOR
);
1671 /* apply PLL and pixel clock changes */
1672 tegra_dc_commit_state(dc
, state
);
1674 /* program display mode */
1675 tegra_dc_set_timings(dc
, mode
);
1677 /* interlacing isn't supported yet, so disable it */
1678 if (dc
->soc
->supports_interlacing
) {
1679 value
= tegra_dc_readl(dc
, DC_DISP_INTERLACE_CONTROL
);
1680 value
&= ~INTERLACE_ENABLE
;
1681 tegra_dc_writel(dc
, value
, DC_DISP_INTERLACE_CONTROL
);
1684 value
= tegra_dc_readl(dc
, DC_CMD_DISPLAY_COMMAND
);
1685 value
&= ~DISP_CTRL_MODE_MASK
;
1686 value
|= DISP_CTRL_MODE_C_DISPLAY
;
1687 tegra_dc_writel(dc
, value
, DC_CMD_DISPLAY_COMMAND
);
1689 if (!dc
->soc
->has_nvdisplay
) {
1690 value
= tegra_dc_readl(dc
, DC_CMD_DISPLAY_POWER_CONTROL
);
1691 value
|= PW0_ENABLE
| PW1_ENABLE
| PW2_ENABLE
| PW3_ENABLE
|
1692 PW4_ENABLE
| PM0_ENABLE
| PM1_ENABLE
;
1693 tegra_dc_writel(dc
, value
, DC_CMD_DISPLAY_POWER_CONTROL
);
1696 /* enable underflow reporting and display red for missing pixels */
1697 if (dc
->soc
->has_nvdisplay
) {
1698 value
= UNDERFLOW_MODE_RED
| UNDERFLOW_REPORT_ENABLE
;
1699 tegra_dc_writel(dc
, value
, DC_COM_RG_UNDERFLOW
);
1702 tegra_dc_commit(dc
);
1704 drm_crtc_vblank_on(crtc
);
1707 static int tegra_crtc_atomic_check(struct drm_crtc
*crtc
,
1708 struct drm_crtc_state
*state
)
1710 struct tegra_atomic_state
*s
= to_tegra_atomic_state(state
->state
);
1711 struct tegra_dc_state
*tegra
= to_dc_state(state
);
1714 * The display hub display clock needs to be fed by the display clock
1715 * with the highest frequency to ensure proper functioning of all the
1718 * Note that this isn't used before Tegra186, but it doesn't hurt and
1719 * conditionalizing it would make the code less clean.
1721 if (state
->active
) {
1722 if (!s
->clk_disp
|| tegra
->pclk
> s
->rate
) {
1723 s
->dc
= to_tegra_dc(crtc
);
1724 s
->clk_disp
= s
->dc
->clk
;
1725 s
->rate
= tegra
->pclk
;
1732 static void tegra_crtc_atomic_begin(struct drm_crtc
*crtc
,
1733 struct drm_crtc_state
*old_crtc_state
)
1735 unsigned long flags
;
1737 if (crtc
->state
->event
) {
1738 spin_lock_irqsave(&crtc
->dev
->event_lock
, flags
);
1740 if (drm_crtc_vblank_get(crtc
) != 0)
1741 drm_crtc_send_vblank_event(crtc
, crtc
->state
->event
);
1743 drm_crtc_arm_vblank_event(crtc
, crtc
->state
->event
);
1745 spin_unlock_irqrestore(&crtc
->dev
->event_lock
, flags
);
1747 crtc
->state
->event
= NULL
;
1751 static void tegra_crtc_atomic_flush(struct drm_crtc
*crtc
,
1752 struct drm_crtc_state
*old_crtc_state
)
1754 struct tegra_dc_state
*state
= to_dc_state(crtc
->state
);
1755 struct tegra_dc
*dc
= to_tegra_dc(crtc
);
1758 value
= state
->planes
<< 8 | GENERAL_UPDATE
;
1759 tegra_dc_writel(dc
, value
, DC_CMD_STATE_CONTROL
);
1760 value
= tegra_dc_readl(dc
, DC_CMD_STATE_CONTROL
);
1762 value
= state
->planes
| GENERAL_ACT_REQ
;
1763 tegra_dc_writel(dc
, value
, DC_CMD_STATE_CONTROL
);
1764 value
= tegra_dc_readl(dc
, DC_CMD_STATE_CONTROL
);
1767 static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs
= {
1768 .atomic_check
= tegra_crtc_atomic_check
,
1769 .atomic_begin
= tegra_crtc_atomic_begin
,
1770 .atomic_flush
= tegra_crtc_atomic_flush
,
1771 .atomic_enable
= tegra_crtc_atomic_enable
,
1772 .atomic_disable
= tegra_crtc_atomic_disable
,
1775 static irqreturn_t
tegra_dc_irq(int irq
, void *data
)
1777 struct tegra_dc
*dc
= data
;
1778 unsigned long status
;
1780 status
= tegra_dc_readl(dc
, DC_CMD_INT_STATUS
);
1781 tegra_dc_writel(dc
, status
, DC_CMD_INT_STATUS
);
1783 if (status
& FRAME_END_INT
) {
1785 dev_dbg(dc->dev, "%s(): frame end\n", __func__);
1790 if (status
& VBLANK_INT
) {
1792 dev_dbg(dc->dev, "%s(): vertical blank\n", __func__);
1794 drm_crtc_handle_vblank(&dc
->base
);
1798 if (status
& (WIN_A_UF_INT
| WIN_B_UF_INT
| WIN_C_UF_INT
)) {
1800 dev_dbg(dc->dev, "%s(): underflow\n", __func__);
1802 dc
->stats
.underflow
++;
1805 if (status
& (WIN_A_OF_INT
| WIN_B_OF_INT
| WIN_C_OF_INT
)) {
1807 dev_dbg(dc->dev, "%s(): overflow\n", __func__);
1809 dc
->stats
.overflow
++;
1812 if (status
& HEAD_UF_INT
) {
1813 dev_dbg_ratelimited(dc
->dev
, "%s(): head underflow\n", __func__
);
1814 dc
->stats
.underflow
++;
1820 static int tegra_dc_init(struct host1x_client
*client
)
1822 struct drm_device
*drm
= dev_get_drvdata(client
->parent
);
1823 struct iommu_group
*group
= iommu_group_get(client
->dev
);
1824 unsigned long flags
= HOST1X_SYNCPT_CLIENT_MANAGED
;
1825 struct tegra_dc
*dc
= host1x_client_to_dc(client
);
1826 struct tegra_drm
*tegra
= drm
->dev_private
;
1827 struct drm_plane
*primary
= NULL
;
1828 struct drm_plane
*cursor
= NULL
;
1831 dc
->syncpt
= host1x_syncpt_request(client
, flags
);
1833 dev_warn(dc
->dev
, "failed to allocate syncpoint\n");
1835 if (group
&& tegra
->domain
) {
1836 if (group
!= tegra
->group
) {
1837 err
= iommu_attach_group(tegra
->domain
, group
);
1840 "failed to attach to domain: %d\n",
1845 tegra
->group
= group
;
1848 dc
->domain
= tegra
->domain
;
1852 primary
= tegra_dc_add_shared_planes(drm
, dc
);
1854 primary
= tegra_dc_add_planes(drm
, dc
);
1856 if (IS_ERR(primary
)) {
1857 err
= PTR_ERR(primary
);
1861 if (dc
->soc
->supports_cursor
) {
1862 cursor
= tegra_dc_cursor_plane_create(drm
, dc
);
1863 if (IS_ERR(cursor
)) {
1864 err
= PTR_ERR(cursor
);
1869 err
= drm_crtc_init_with_planes(drm
, &dc
->base
, primary
, cursor
,
1870 &tegra_crtc_funcs
, NULL
);
1874 drm_crtc_helper_add(&dc
->base
, &tegra_crtc_helper_funcs
);
1877 * Keep track of the minimum pitch alignment across all display
1880 if (dc
->soc
->pitch_align
> tegra
->pitch_align
)
1881 tegra
->pitch_align
= dc
->soc
->pitch_align
;
1883 err
= tegra_dc_rgb_init(drm
, dc
);
1884 if (err
< 0 && err
!= -ENODEV
) {
1885 dev_err(dc
->dev
, "failed to initialize RGB output: %d\n", err
);
1889 err
= devm_request_irq(dc
->dev
, dc
->irq
, tegra_dc_irq
, 0,
1890 dev_name(dc
->dev
), dc
);
1892 dev_err(dc
->dev
, "failed to request IRQ#%u: %d\n", dc
->irq
,
1900 if (!IS_ERR_OR_NULL(cursor
))
1901 drm_plane_cleanup(cursor
);
1903 if (!IS_ERR(primary
))
1904 drm_plane_cleanup(primary
);
1906 if (group
&& tegra
->domain
) {
1907 iommu_detach_group(tegra
->domain
, group
);
1914 static int tegra_dc_exit(struct host1x_client
*client
)
1916 struct iommu_group
*group
= iommu_group_get(client
->dev
);
1917 struct tegra_dc
*dc
= host1x_client_to_dc(client
);
1920 devm_free_irq(dc
->dev
, dc
->irq
, dc
);
1922 err
= tegra_dc_rgb_exit(dc
);
1924 dev_err(dc
->dev
, "failed to shutdown RGB output: %d\n", err
);
1928 if (group
&& dc
->domain
) {
1929 iommu_detach_group(dc
->domain
, group
);
1933 host1x_syncpt_free(dc
->syncpt
);
1938 static const struct host1x_client_ops dc_client_ops
= {
1939 .init
= tegra_dc_init
,
1940 .exit
= tegra_dc_exit
,
1943 static const struct tegra_dc_soc_info tegra20_dc_soc_info
= {
1944 .supports_background_color
= false,
1945 .supports_interlacing
= false,
1946 .supports_cursor
= false,
1947 .supports_block_linear
= false,
1948 .supports_blending
= false,
1950 .has_powergate
= false,
1952 .has_nvdisplay
= false,
1953 .num_primary_formats
= ARRAY_SIZE(tegra20_primary_formats
),
1954 .primary_formats
= tegra20_primary_formats
,
1955 .num_overlay_formats
= ARRAY_SIZE(tegra20_overlay_formats
),
1956 .overlay_formats
= tegra20_overlay_formats
,
1959 static const struct tegra_dc_soc_info tegra30_dc_soc_info
= {
1960 .supports_background_color
= false,
1961 .supports_interlacing
= false,
1962 .supports_cursor
= false,
1963 .supports_block_linear
= false,
1964 .supports_blending
= false,
1966 .has_powergate
= false,
1967 .coupled_pm
= false,
1968 .has_nvdisplay
= false,
1969 .num_primary_formats
= ARRAY_SIZE(tegra20_primary_formats
),
1970 .primary_formats
= tegra20_primary_formats
,
1971 .num_overlay_formats
= ARRAY_SIZE(tegra20_overlay_formats
),
1972 .overlay_formats
= tegra20_overlay_formats
,
1975 static const struct tegra_dc_soc_info tegra114_dc_soc_info
= {
1976 .supports_background_color
= false,
1977 .supports_interlacing
= false,
1978 .supports_cursor
= false,
1979 .supports_block_linear
= false,
1980 .supports_blending
= false,
1982 .has_powergate
= true,
1983 .coupled_pm
= false,
1984 .has_nvdisplay
= false,
1985 .num_primary_formats
= ARRAY_SIZE(tegra114_primary_formats
),
1986 .primary_formats
= tegra114_primary_formats
,
1987 .num_overlay_formats
= ARRAY_SIZE(tegra114_overlay_formats
),
1988 .overlay_formats
= tegra114_overlay_formats
,
1991 static const struct tegra_dc_soc_info tegra124_dc_soc_info
= {
1992 .supports_background_color
= true,
1993 .supports_interlacing
= true,
1994 .supports_cursor
= true,
1995 .supports_block_linear
= true,
1996 .supports_blending
= true,
1998 .has_powergate
= true,
1999 .coupled_pm
= false,
2000 .has_nvdisplay
= false,
2001 .num_primary_formats
= ARRAY_SIZE(tegra124_primary_formats
),
2002 .primary_formats
= tegra114_primary_formats
,
2003 .num_overlay_formats
= ARRAY_SIZE(tegra124_overlay_formats
),
2004 .overlay_formats
= tegra114_overlay_formats
,
2007 static const struct tegra_dc_soc_info tegra210_dc_soc_info
= {
2008 .supports_background_color
= true,
2009 .supports_interlacing
= true,
2010 .supports_cursor
= true,
2011 .supports_block_linear
= true,
2012 .supports_blending
= true,
2014 .has_powergate
= true,
2015 .coupled_pm
= false,
2016 .has_nvdisplay
= false,
2017 .num_primary_formats
= ARRAY_SIZE(tegra114_primary_formats
),
2018 .primary_formats
= tegra114_primary_formats
,
2019 .num_overlay_formats
= ARRAY_SIZE(tegra114_overlay_formats
),
2020 .overlay_formats
= tegra114_overlay_formats
,
2023 static const struct tegra_windowgroup_soc tegra186_dc_wgrps
[] = {
2027 .windows
= (const unsigned int[]) { 0 },
2032 .windows
= (const unsigned int[]) { 1 },
2037 .windows
= (const unsigned int[]) { 2 },
2042 .windows
= (const unsigned int[]) { 3 },
2047 .windows
= (const unsigned int[]) { 4 },
2052 .windows
= (const unsigned int[]) { 5 },
2057 static const struct tegra_dc_soc_info tegra186_dc_soc_info
= {
2058 .supports_background_color
= true,
2059 .supports_interlacing
= true,
2060 .supports_cursor
= true,
2061 .supports_block_linear
= true,
2062 .supports_blending
= true,
2064 .has_powergate
= false,
2065 .coupled_pm
= false,
2066 .has_nvdisplay
= true,
2067 .wgrps
= tegra186_dc_wgrps
,
2068 .num_wgrps
= ARRAY_SIZE(tegra186_dc_wgrps
),
2071 static const struct of_device_id tegra_dc_of_match
[] = {
2073 .compatible
= "nvidia,tegra186-dc",
2074 .data
= &tegra186_dc_soc_info
,
2076 .compatible
= "nvidia,tegra210-dc",
2077 .data
= &tegra210_dc_soc_info
,
2079 .compatible
= "nvidia,tegra124-dc",
2080 .data
= &tegra124_dc_soc_info
,
2082 .compatible
= "nvidia,tegra114-dc",
2083 .data
= &tegra114_dc_soc_info
,
2085 .compatible
= "nvidia,tegra30-dc",
2086 .data
= &tegra30_dc_soc_info
,
2088 .compatible
= "nvidia,tegra20-dc",
2089 .data
= &tegra20_dc_soc_info
,
2094 MODULE_DEVICE_TABLE(of
, tegra_dc_of_match
);
2096 static int tegra_dc_parse_dt(struct tegra_dc
*dc
)
2098 struct device_node
*np
;
2102 err
= of_property_read_u32(dc
->dev
->of_node
, "nvidia,head", &value
);
2104 dev_err(dc
->dev
, "missing \"nvidia,head\" property\n");
2107 * If the nvidia,head property isn't present, try to find the
2108 * correct head number by looking up the position of this
2109 * display controller's node within the device tree. Assuming
2110 * that the nodes are ordered properly in the DTS file and
2111 * that the translation into a flattened device tree blob
2112 * preserves that ordering this will actually yield the right
2115 * If those assumptions don't hold, this will still work for
2116 * cases where only a single display controller is used.
2118 for_each_matching_node(np
, tegra_dc_of_match
) {
2119 if (np
== dc
->dev
->of_node
) {
2133 static int tegra_dc_match_by_pipe(struct device
*dev
, void *data
)
2135 struct tegra_dc
*dc
= dev_get_drvdata(dev
);
2136 unsigned int pipe
= (unsigned long)data
;
2138 return dc
->pipe
== pipe
;
2141 static int tegra_dc_couple(struct tegra_dc
*dc
)
2144 * On Tegra20, DC1 requires DC0 to be taken out of reset in order to
2145 * be enabled, otherwise CPU hangs on writing to CMD_DISPLAY_COMMAND /
2146 * POWER_CONTROL registers during CRTC enabling.
2148 if (dc
->soc
->coupled_pm
&& dc
->pipe
== 1) {
2149 u32 flags
= DL_FLAG_PM_RUNTIME
| DL_FLAG_AUTOREMOVE
;
2150 struct device_link
*link
;
2151 struct device
*partner
;
2153 partner
= driver_find_device(dc
->dev
->driver
, NULL
, 0,
2154 tegra_dc_match_by_pipe
);
2156 return -EPROBE_DEFER
;
2158 link
= device_link_add(dc
->dev
, partner
, flags
);
2160 dev_err(dc
->dev
, "failed to link controllers\n");
2164 dev_dbg(dc
->dev
, "coupled to %s\n", dev_name(partner
));
2170 static int tegra_dc_probe(struct platform_device
*pdev
)
2172 struct resource
*regs
;
2173 struct tegra_dc
*dc
;
2176 dc
= devm_kzalloc(&pdev
->dev
, sizeof(*dc
), GFP_KERNEL
);
2180 dc
->soc
= of_device_get_match_data(&pdev
->dev
);
2182 INIT_LIST_HEAD(&dc
->list
);
2183 dc
->dev
= &pdev
->dev
;
2185 err
= tegra_dc_parse_dt(dc
);
2189 err
= tegra_dc_couple(dc
);
2193 dc
->clk
= devm_clk_get(&pdev
->dev
, NULL
);
2194 if (IS_ERR(dc
->clk
)) {
2195 dev_err(&pdev
->dev
, "failed to get clock\n");
2196 return PTR_ERR(dc
->clk
);
2199 dc
->rst
= devm_reset_control_get(&pdev
->dev
, "dc");
2200 if (IS_ERR(dc
->rst
)) {
2201 dev_err(&pdev
->dev
, "failed to get reset\n");
2202 return PTR_ERR(dc
->rst
);
2205 /* assert reset and disable clock */
2206 err
= clk_prepare_enable(dc
->clk
);
2210 usleep_range(2000, 4000);
2212 err
= reset_control_assert(dc
->rst
);
2216 usleep_range(2000, 4000);
2218 clk_disable_unprepare(dc
->clk
);
2220 if (dc
->soc
->has_powergate
) {
2222 dc
->powergate
= TEGRA_POWERGATE_DIS
;
2224 dc
->powergate
= TEGRA_POWERGATE_DISB
;
2226 tegra_powergate_power_off(dc
->powergate
);
2229 regs
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
2230 dc
->regs
= devm_ioremap_resource(&pdev
->dev
, regs
);
2231 if (IS_ERR(dc
->regs
))
2232 return PTR_ERR(dc
->regs
);
2234 dc
->irq
= platform_get_irq(pdev
, 0);
2236 dev_err(&pdev
->dev
, "failed to get IRQ\n");
2240 err
= tegra_dc_rgb_probe(dc
);
2241 if (err
< 0 && err
!= -ENODEV
) {
2242 dev_err(&pdev
->dev
, "failed to probe RGB output: %d\n", err
);
2246 platform_set_drvdata(pdev
, dc
);
2247 pm_runtime_enable(&pdev
->dev
);
2249 INIT_LIST_HEAD(&dc
->client
.list
);
2250 dc
->client
.ops
= &dc_client_ops
;
2251 dc
->client
.dev
= &pdev
->dev
;
2253 err
= host1x_client_register(&dc
->client
);
2255 dev_err(&pdev
->dev
, "failed to register host1x client: %d\n",
2263 static int tegra_dc_remove(struct platform_device
*pdev
)
2265 struct tegra_dc
*dc
= platform_get_drvdata(pdev
);
2268 err
= host1x_client_unregister(&dc
->client
);
2270 dev_err(&pdev
->dev
, "failed to unregister host1x client: %d\n",
2275 err
= tegra_dc_rgb_remove(dc
);
2277 dev_err(&pdev
->dev
, "failed to remove RGB output: %d\n", err
);
2281 pm_runtime_disable(&pdev
->dev
);
2287 static int tegra_dc_suspend(struct device
*dev
)
2289 struct tegra_dc
*dc
= dev_get_drvdata(dev
);
2292 err
= reset_control_assert(dc
->rst
);
2294 dev_err(dev
, "failed to assert reset: %d\n", err
);
2298 if (dc
->soc
->has_powergate
)
2299 tegra_powergate_power_off(dc
->powergate
);
2301 clk_disable_unprepare(dc
->clk
);
2306 static int tegra_dc_resume(struct device
*dev
)
2308 struct tegra_dc
*dc
= dev_get_drvdata(dev
);
2311 if (dc
->soc
->has_powergate
) {
2312 err
= tegra_powergate_sequence_power_up(dc
->powergate
, dc
->clk
,
2315 dev_err(dev
, "failed to power partition: %d\n", err
);
2319 err
= clk_prepare_enable(dc
->clk
);
2321 dev_err(dev
, "failed to enable clock: %d\n", err
);
2325 err
= reset_control_deassert(dc
->rst
);
2327 dev_err(dev
, "failed to deassert reset: %d\n", err
);
2336 static const struct dev_pm_ops tegra_dc_pm_ops
= {
2337 SET_RUNTIME_PM_OPS(tegra_dc_suspend
, tegra_dc_resume
, NULL
)
2340 struct platform_driver tegra_dc_driver
= {
2343 .of_match_table
= tegra_dc_of_match
,
2344 .pm
= &tegra_dc_pm_ops
,
2346 .probe
= tegra_dc_probe
,
2347 .remove
= tegra_dc_remove
,