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/reset.h>
15 #include <soc/tegra/pmc.h>
21 #include <drm/drm_plane_helper.h>
23 struct tegra_dc_soc_info {
24 bool supports_interlacing;
26 bool supports_block_linear;
27 unsigned int pitch_align;
32 struct drm_plane base;
36 static inline struct tegra_plane *to_tegra_plane(struct drm_plane *plane)
38 return container_of(plane, struct tegra_plane, base);
41 static void tegra_dc_window_commit(struct tegra_dc *dc, unsigned int index)
43 u32 value = WIN_A_ACT_REQ << index;
45 tegra_dc_writel(dc, value << 8, DC_CMD_STATE_CONTROL);
46 tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
49 static void tegra_dc_cursor_commit(struct tegra_dc *dc)
51 tegra_dc_writel(dc, CURSOR_ACT_REQ << 8, DC_CMD_STATE_CONTROL);
52 tegra_dc_writel(dc, CURSOR_ACT_REQ, DC_CMD_STATE_CONTROL);
55 static void tegra_dc_commit(struct tegra_dc *dc)
57 tegra_dc_writel(dc, GENERAL_ACT_REQ << 8, DC_CMD_STATE_CONTROL);
58 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
61 static unsigned int tegra_dc_format(uint32_t format, uint32_t *swap)
63 /* assume no swapping of fetched data */
65 *swap = BYTE_SWAP_NOSWAP;
68 case DRM_FORMAT_XBGR8888:
69 return WIN_COLOR_DEPTH_R8G8B8A8;
71 case DRM_FORMAT_XRGB8888:
72 return WIN_COLOR_DEPTH_B8G8R8A8;
74 case DRM_FORMAT_RGB565:
75 return WIN_COLOR_DEPTH_B5G6R5;
78 return WIN_COLOR_DEPTH_YCbCr422;
82 *swap = BYTE_SWAP_SWAP2;
84 return WIN_COLOR_DEPTH_YCbCr422;
86 case DRM_FORMAT_YUV420:
87 return WIN_COLOR_DEPTH_YCbCr420P;
89 case DRM_FORMAT_YUV422:
90 return WIN_COLOR_DEPTH_YCbCr422P;
96 WARN(1, "unsupported pixel format %u, using default\n", format);
97 return WIN_COLOR_DEPTH_B8G8R8A8;
100 static bool tegra_dc_format_is_yuv(unsigned int format, bool *planar)
103 case WIN_COLOR_DEPTH_YCbCr422:
104 case WIN_COLOR_DEPTH_YUV422:
110 case WIN_COLOR_DEPTH_YCbCr420P:
111 case WIN_COLOR_DEPTH_YUV420P:
112 case WIN_COLOR_DEPTH_YCbCr422P:
113 case WIN_COLOR_DEPTH_YUV422P:
114 case WIN_COLOR_DEPTH_YCbCr422R:
115 case WIN_COLOR_DEPTH_YUV422R:
116 case WIN_COLOR_DEPTH_YCbCr422RA:
117 case WIN_COLOR_DEPTH_YUV422RA:
127 static inline u32 compute_dda_inc(unsigned int in, unsigned int out, bool v,
130 fixed20_12 outf = dfixed_init(out);
131 fixed20_12 inf = dfixed_init(in);
152 outf.full = max_t(u32, outf.full - dfixed_const(1), dfixed_const(1));
153 inf.full -= dfixed_const(1);
155 dda_inc = dfixed_div(inf, outf);
156 dda_inc = min_t(u32, dda_inc, dfixed_const(max));
161 static inline u32 compute_initial_dda(unsigned int in)
163 fixed20_12 inf = dfixed_init(in);
164 return dfixed_frac(inf);
167 static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index,
168 const struct tegra_dc_window *window)
170 unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp;
175 * For YUV planar modes, the number of bytes per pixel takes into
176 * account only the luma component and therefore is 1.
178 yuv = tegra_dc_format_is_yuv(window->format, &planar);
180 bpp = window->bits_per_pixel / 8;
182 bpp = planar ? 1 : 2;
184 value = WINDOW_A_SELECT << index;
185 tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER);
187 tegra_dc_writel(dc, window->format, DC_WIN_COLOR_DEPTH);
188 tegra_dc_writel(dc, window->swap, DC_WIN_BYTE_SWAP);
190 value = V_POSITION(window->dst.y) | H_POSITION(window->dst.x);
191 tegra_dc_writel(dc, value, DC_WIN_POSITION);
193 value = V_SIZE(window->dst.h) | H_SIZE(window->dst.w);
194 tegra_dc_writel(dc, value, DC_WIN_SIZE);
196 h_offset = window->src.x * bpp;
197 v_offset = window->src.y;
198 h_size = window->src.w * bpp;
199 v_size = window->src.h;
201 value = V_PRESCALED_SIZE(v_size) | H_PRESCALED_SIZE(h_size);
202 tegra_dc_writel(dc, value, DC_WIN_PRESCALED_SIZE);
205 * For DDA computations the number of bytes per pixel for YUV planar
206 * modes needs to take into account all Y, U and V components.
211 h_dda = compute_dda_inc(window->src.w, window->dst.w, false, bpp);
212 v_dda = compute_dda_inc(window->src.h, window->dst.h, true, bpp);
214 value = V_DDA_INC(v_dda) | H_DDA_INC(h_dda);
215 tegra_dc_writel(dc, value, DC_WIN_DDA_INC);
217 h_dda = compute_initial_dda(window->src.x);
218 v_dda = compute_initial_dda(window->src.y);
220 tegra_dc_writel(dc, h_dda, DC_WIN_H_INITIAL_DDA);
221 tegra_dc_writel(dc, v_dda, DC_WIN_V_INITIAL_DDA);
223 tegra_dc_writel(dc, 0, DC_WIN_UV_BUF_STRIDE);
224 tegra_dc_writel(dc, 0, DC_WIN_BUF_STRIDE);
226 tegra_dc_writel(dc, window->base[0], DC_WINBUF_START_ADDR);
229 tegra_dc_writel(dc, window->base[1], DC_WINBUF_START_ADDR_U);
230 tegra_dc_writel(dc, window->base[2], DC_WINBUF_START_ADDR_V);
231 value = window->stride[1] << 16 | window->stride[0];
232 tegra_dc_writel(dc, value, DC_WIN_LINE_STRIDE);
234 tegra_dc_writel(dc, window->stride[0], DC_WIN_LINE_STRIDE);
237 if (window->bottom_up)
238 v_offset += window->src.h - 1;
240 tegra_dc_writel(dc, h_offset, DC_WINBUF_ADDR_H_OFFSET);
241 tegra_dc_writel(dc, v_offset, DC_WINBUF_ADDR_V_OFFSET);
243 if (dc->soc->supports_block_linear) {
244 unsigned long height = window->tiling.value;
246 switch (window->tiling.mode) {
247 case TEGRA_BO_TILING_MODE_PITCH:
248 value = DC_WINBUF_SURFACE_KIND_PITCH;
251 case TEGRA_BO_TILING_MODE_TILED:
252 value = DC_WINBUF_SURFACE_KIND_TILED;
255 case TEGRA_BO_TILING_MODE_BLOCK:
256 value = DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(height) |
257 DC_WINBUF_SURFACE_KIND_BLOCK;
261 tegra_dc_writel(dc, value, DC_WINBUF_SURFACE_KIND);
263 switch (window->tiling.mode) {
264 case TEGRA_BO_TILING_MODE_PITCH:
265 value = DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV |
266 DC_WIN_BUFFER_ADDR_MODE_LINEAR;
269 case TEGRA_BO_TILING_MODE_TILED:
270 value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
271 DC_WIN_BUFFER_ADDR_MODE_TILE;
274 case TEGRA_BO_TILING_MODE_BLOCK:
275 DRM_ERROR("hardware doesn't support block linear mode\n");
279 tegra_dc_writel(dc, value, DC_WIN_BUFFER_ADDR_MODE);
285 /* setup default colorspace conversion coefficients */
286 tegra_dc_writel(dc, 0x00f0, DC_WIN_CSC_YOF);
287 tegra_dc_writel(dc, 0x012a, DC_WIN_CSC_KYRGB);
288 tegra_dc_writel(dc, 0x0000, DC_WIN_CSC_KUR);
289 tegra_dc_writel(dc, 0x0198, DC_WIN_CSC_KVR);
290 tegra_dc_writel(dc, 0x039b, DC_WIN_CSC_KUG);
291 tegra_dc_writel(dc, 0x032f, DC_WIN_CSC_KVG);
292 tegra_dc_writel(dc, 0x0204, DC_WIN_CSC_KUB);
293 tegra_dc_writel(dc, 0x0000, DC_WIN_CSC_KVB);
296 } else if (window->bits_per_pixel < 24) {
297 value |= COLOR_EXPAND;
300 if (window->bottom_up)
301 value |= V_DIRECTION;
303 tegra_dc_writel(dc, value, DC_WIN_WIN_OPTIONS);
306 * Disable blending and assume Window A is the bottom-most window,
307 * Window C is the top-most window and Window B is in the middle.
309 tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_NOKEY);
310 tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_1WIN);
314 tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_2WIN_X);
315 tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_2WIN_Y);
316 tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_3WIN_XY);
320 tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_X);
321 tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_2WIN_Y);
322 tegra_dc_writel(dc, 0x000000, DC_WIN_BLEND_3WIN_XY);
326 tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_X);
327 tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_2WIN_Y);
328 tegra_dc_writel(dc, 0xffff00, DC_WIN_BLEND_3WIN_XY);
332 tegra_dc_window_commit(dc, index);
337 static int tegra_window_plane_disable(struct drm_plane *plane)
339 struct tegra_dc *dc = to_tegra_dc(plane->crtc);
340 struct tegra_plane *p = to_tegra_plane(plane);
346 value = WINDOW_A_SELECT << p->index;
347 tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER);
349 value = tegra_dc_readl(dc, DC_WIN_WIN_OPTIONS);
350 value &= ~WIN_ENABLE;
351 tegra_dc_writel(dc, value, DC_WIN_WIN_OPTIONS);
353 tegra_dc_window_commit(dc, p->index);
358 static void tegra_plane_destroy(struct drm_plane *plane)
360 struct tegra_plane *p = to_tegra_plane(plane);
362 drm_plane_cleanup(plane);
366 static const u32 tegra_primary_plane_formats[] = {
372 static int tegra_primary_plane_update(struct drm_plane *plane,
373 struct drm_crtc *crtc,
374 struct drm_framebuffer *fb, int crtc_x,
375 int crtc_y, unsigned int crtc_w,
376 unsigned int crtc_h, uint32_t src_x,
377 uint32_t src_y, uint32_t src_w,
380 struct tegra_bo *bo = tegra_fb_get_plane(fb, 0);
381 struct tegra_plane *p = to_tegra_plane(plane);
382 struct tegra_dc *dc = to_tegra_dc(crtc);
383 struct tegra_dc_window window;
386 memset(&window, 0, sizeof(window));
387 window.src.x = src_x >> 16;
388 window.src.y = src_y >> 16;
389 window.src.w = src_w >> 16;
390 window.src.h = src_h >> 16;
391 window.dst.x = crtc_x;
392 window.dst.y = crtc_y;
393 window.dst.w = crtc_w;
394 window.dst.h = crtc_h;
395 window.format = tegra_dc_format(fb->pixel_format, &window.swap);
396 window.bits_per_pixel = fb->bits_per_pixel;
397 window.bottom_up = tegra_fb_is_bottom_up(fb);
399 err = tegra_fb_get_tiling(fb, &window.tiling);
403 window.base[0] = bo->paddr + fb->offsets[0];
404 window.stride[0] = fb->pitches[0];
406 err = tegra_dc_setup_window(dc, p->index, &window);
413 static void tegra_primary_plane_destroy(struct drm_plane *plane)
415 tegra_window_plane_disable(plane);
416 tegra_plane_destroy(plane);
419 static const struct drm_plane_funcs tegra_primary_plane_funcs = {
420 .update_plane = tegra_primary_plane_update,
421 .disable_plane = tegra_window_plane_disable,
422 .destroy = tegra_primary_plane_destroy,
425 static struct drm_plane *tegra_dc_primary_plane_create(struct drm_device *drm,
428 struct tegra_plane *plane;
429 unsigned int num_formats;
433 plane = kzalloc(sizeof(*plane), GFP_KERNEL);
435 return ERR_PTR(-ENOMEM);
437 num_formats = ARRAY_SIZE(tegra_primary_plane_formats);
438 formats = tegra_primary_plane_formats;
440 err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe,
441 &tegra_primary_plane_funcs, formats,
442 num_formats, DRM_PLANE_TYPE_PRIMARY);
451 static const u32 tegra_cursor_plane_formats[] = {
455 static int tegra_cursor_plane_update(struct drm_plane *plane,
456 struct drm_crtc *crtc,
457 struct drm_framebuffer *fb, int crtc_x,
458 int crtc_y, unsigned int crtc_w,
459 unsigned int crtc_h, uint32_t src_x,
460 uint32_t src_y, uint32_t src_w,
463 struct tegra_bo *bo = tegra_fb_get_plane(fb, 0);
464 struct tegra_dc *dc = to_tegra_dc(crtc);
465 u32 value = CURSOR_CLIP_DISPLAY;
467 /* scaling not supported for cursor */
468 if ((src_w >> 16 != crtc_w) || (src_h >> 16 != crtc_h))
471 /* only square cursors supported */
477 value |= CURSOR_SIZE_32x32;
481 value |= CURSOR_SIZE_64x64;
485 value |= CURSOR_SIZE_128x128;
489 value |= CURSOR_SIZE_256x256;
496 value |= (bo->paddr >> 10) & 0x3fffff;
497 tegra_dc_writel(dc, value, DC_DISP_CURSOR_START_ADDR);
499 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
500 value = (bo->paddr >> 32) & 0x3;
501 tegra_dc_writel(dc, value, DC_DISP_CURSOR_START_ADDR_HI);
504 /* enable cursor and set blend mode */
505 value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
506 value |= CURSOR_ENABLE;
507 tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
509 value = tegra_dc_readl(dc, DC_DISP_BLEND_CURSOR_CONTROL);
510 value &= ~CURSOR_DST_BLEND_MASK;
511 value &= ~CURSOR_SRC_BLEND_MASK;
512 value |= CURSOR_MODE_NORMAL;
513 value |= CURSOR_DST_BLEND_NEG_K1_TIMES_SRC;
514 value |= CURSOR_SRC_BLEND_K1_TIMES_SRC;
515 value |= CURSOR_ALPHA;
516 tegra_dc_writel(dc, value, DC_DISP_BLEND_CURSOR_CONTROL);
518 /* position the cursor */
519 value = (crtc_y & 0x3fff) << 16 | (crtc_x & 0x3fff);
520 tegra_dc_writel(dc, value, DC_DISP_CURSOR_POSITION);
523 tegra_dc_cursor_commit(dc);
529 static int tegra_cursor_plane_disable(struct drm_plane *plane)
531 struct tegra_dc *dc = to_tegra_dc(plane->crtc);
537 value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
538 value &= ~CURSOR_ENABLE;
539 tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
541 tegra_dc_cursor_commit(dc);
547 static const struct drm_plane_funcs tegra_cursor_plane_funcs = {
548 .update_plane = tegra_cursor_plane_update,
549 .disable_plane = tegra_cursor_plane_disable,
550 .destroy = tegra_plane_destroy,
553 static struct drm_plane *tegra_dc_cursor_plane_create(struct drm_device *drm,
556 struct tegra_plane *plane;
557 unsigned int num_formats;
561 plane = kzalloc(sizeof(*plane), GFP_KERNEL);
563 return ERR_PTR(-ENOMEM);
565 num_formats = ARRAY_SIZE(tegra_cursor_plane_formats);
566 formats = tegra_cursor_plane_formats;
568 err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe,
569 &tegra_cursor_plane_funcs, formats,
570 num_formats, DRM_PLANE_TYPE_CURSOR);
579 static int tegra_overlay_plane_update(struct drm_plane *plane,
580 struct drm_crtc *crtc,
581 struct drm_framebuffer *fb, int crtc_x,
582 int crtc_y, unsigned int crtc_w,
583 unsigned int crtc_h, uint32_t src_x,
584 uint32_t src_y, uint32_t src_w,
587 struct tegra_plane *p = to_tegra_plane(plane);
588 struct tegra_dc *dc = to_tegra_dc(crtc);
589 struct tegra_dc_window window;
593 memset(&window, 0, sizeof(window));
594 window.src.x = src_x >> 16;
595 window.src.y = src_y >> 16;
596 window.src.w = src_w >> 16;
597 window.src.h = src_h >> 16;
598 window.dst.x = crtc_x;
599 window.dst.y = crtc_y;
600 window.dst.w = crtc_w;
601 window.dst.h = crtc_h;
602 window.format = tegra_dc_format(fb->pixel_format, &window.swap);
603 window.bits_per_pixel = fb->bits_per_pixel;
604 window.bottom_up = tegra_fb_is_bottom_up(fb);
606 err = tegra_fb_get_tiling(fb, &window.tiling);
610 for (i = 0; i < drm_format_num_planes(fb->pixel_format); i++) {
611 struct tegra_bo *bo = tegra_fb_get_plane(fb, i);
613 window.base[i] = bo->paddr + fb->offsets[i];
616 * Tegra doesn't support different strides for U and V planes
617 * so we display a warning if the user tries to display a
618 * framebuffer with such a configuration.
621 if (fb->pitches[i] != window.stride[1])
622 DRM_ERROR("unsupported UV-plane configuration\n");
624 window.stride[i] = fb->pitches[i];
628 return tegra_dc_setup_window(dc, p->index, &window);
631 static void tegra_overlay_plane_destroy(struct drm_plane *plane)
633 tegra_window_plane_disable(plane);
634 tegra_plane_destroy(plane);
637 static const struct drm_plane_funcs tegra_overlay_plane_funcs = {
638 .update_plane = tegra_overlay_plane_update,
639 .disable_plane = tegra_window_plane_disable,
640 .destroy = tegra_overlay_plane_destroy,
643 static const uint32_t tegra_overlay_plane_formats[] = {
653 static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
657 struct tegra_plane *plane;
658 unsigned int num_formats;
662 plane = kzalloc(sizeof(*plane), GFP_KERNEL);
664 return ERR_PTR(-ENOMEM);
666 plane->index = index;
668 num_formats = ARRAY_SIZE(tegra_overlay_plane_formats);
669 formats = tegra_overlay_plane_formats;
671 err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe,
672 &tegra_overlay_plane_funcs, formats,
673 num_formats, DRM_PLANE_TYPE_OVERLAY);
682 static int tegra_dc_add_planes(struct drm_device *drm, struct tegra_dc *dc)
684 struct drm_plane *plane;
687 for (i = 0; i < 2; i++) {
688 plane = tegra_dc_overlay_plane_create(drm, dc, 1 + i);
690 return PTR_ERR(plane);
696 static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y,
697 struct drm_framebuffer *fb)
699 struct tegra_bo *bo = tegra_fb_get_plane(fb, 0);
700 unsigned int h_offset = 0, v_offset = 0;
701 struct tegra_bo_tiling tiling;
702 unsigned int format, swap;
706 err = tegra_fb_get_tiling(fb, &tiling);
710 tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER);
712 value = fb->offsets[0] + y * fb->pitches[0] +
713 x * fb->bits_per_pixel / 8;
715 tegra_dc_writel(dc, bo->paddr + value, DC_WINBUF_START_ADDR);
716 tegra_dc_writel(dc, fb->pitches[0], DC_WIN_LINE_STRIDE);
718 format = tegra_dc_format(fb->pixel_format, &swap);
719 tegra_dc_writel(dc, format, DC_WIN_COLOR_DEPTH);
720 tegra_dc_writel(dc, swap, DC_WIN_BYTE_SWAP);
722 if (dc->soc->supports_block_linear) {
723 unsigned long height = tiling.value;
725 switch (tiling.mode) {
726 case TEGRA_BO_TILING_MODE_PITCH:
727 value = DC_WINBUF_SURFACE_KIND_PITCH;
730 case TEGRA_BO_TILING_MODE_TILED:
731 value = DC_WINBUF_SURFACE_KIND_TILED;
734 case TEGRA_BO_TILING_MODE_BLOCK:
735 value = DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(height) |
736 DC_WINBUF_SURFACE_KIND_BLOCK;
740 tegra_dc_writel(dc, value, DC_WINBUF_SURFACE_KIND);
742 switch (tiling.mode) {
743 case TEGRA_BO_TILING_MODE_PITCH:
744 value = DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV |
745 DC_WIN_BUFFER_ADDR_MODE_LINEAR;
748 case TEGRA_BO_TILING_MODE_TILED:
749 value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
750 DC_WIN_BUFFER_ADDR_MODE_TILE;
753 case TEGRA_BO_TILING_MODE_BLOCK:
754 DRM_ERROR("hardware doesn't support block linear mode\n");
758 tegra_dc_writel(dc, value, DC_WIN_BUFFER_ADDR_MODE);
761 /* make sure bottom-up buffers are properly displayed */
762 if (tegra_fb_is_bottom_up(fb)) {
763 value = tegra_dc_readl(dc, DC_WIN_WIN_OPTIONS);
764 value |= V_DIRECTION;
765 tegra_dc_writel(dc, value, DC_WIN_WIN_OPTIONS);
767 v_offset += fb->height - 1;
769 value = tegra_dc_readl(dc, DC_WIN_WIN_OPTIONS);
770 value &= ~V_DIRECTION;
771 tegra_dc_writel(dc, value, DC_WIN_WIN_OPTIONS);
774 tegra_dc_writel(dc, h_offset, DC_WINBUF_ADDR_H_OFFSET);
775 tegra_dc_writel(dc, v_offset, DC_WINBUF_ADDR_V_OFFSET);
777 value = GENERAL_ACT_REQ | WIN_A_ACT_REQ;
778 tegra_dc_writel(dc, value << 8, DC_CMD_STATE_CONTROL);
779 tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
784 void tegra_dc_enable_vblank(struct tegra_dc *dc)
786 unsigned long value, flags;
788 spin_lock_irqsave(&dc->lock, flags);
790 value = tegra_dc_readl(dc, DC_CMD_INT_MASK);
792 tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
794 spin_unlock_irqrestore(&dc->lock, flags);
797 void tegra_dc_disable_vblank(struct tegra_dc *dc)
799 unsigned long value, flags;
801 spin_lock_irqsave(&dc->lock, flags);
803 value = tegra_dc_readl(dc, DC_CMD_INT_MASK);
804 value &= ~VBLANK_INT;
805 tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
807 spin_unlock_irqrestore(&dc->lock, flags);
810 static void tegra_dc_finish_page_flip(struct tegra_dc *dc)
812 struct drm_device *drm = dc->base.dev;
813 struct drm_crtc *crtc = &dc->base;
814 unsigned long flags, base;
820 bo = tegra_fb_get_plane(crtc->primary->fb, 0);
822 /* check if new start address has been latched */
823 tegra_dc_writel(dc, READ_MUX, DC_CMD_STATE_ACCESS);
824 base = tegra_dc_readl(dc, DC_WINBUF_START_ADDR);
825 tegra_dc_writel(dc, 0, DC_CMD_STATE_ACCESS);
827 if (base == bo->paddr + crtc->primary->fb->offsets[0]) {
828 spin_lock_irqsave(&drm->event_lock, flags);
829 drm_send_vblank_event(drm, dc->pipe, dc->event);
830 drm_vblank_put(drm, dc->pipe);
832 spin_unlock_irqrestore(&drm->event_lock, flags);
836 void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file)
838 struct tegra_dc *dc = to_tegra_dc(crtc);
839 struct drm_device *drm = crtc->dev;
842 spin_lock_irqsave(&drm->event_lock, flags);
844 if (dc->event && dc->event->base.file_priv == file) {
845 dc->event->base.destroy(&dc->event->base);
846 drm_vblank_put(drm, dc->pipe);
850 spin_unlock_irqrestore(&drm->event_lock, flags);
853 static int tegra_dc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
854 struct drm_pending_vblank_event *event, uint32_t page_flip_flags)
856 struct tegra_dc *dc = to_tegra_dc(crtc);
857 struct drm_device *drm = crtc->dev;
863 event->pipe = dc->pipe;
865 drm_vblank_get(drm, dc->pipe);
868 tegra_dc_set_base(dc, 0, 0, fb);
869 crtc->primary->fb = fb;
874 static void drm_crtc_clear(struct drm_crtc *crtc)
876 memset(crtc, 0, sizeof(*crtc));
879 static void tegra_dc_destroy(struct drm_crtc *crtc)
881 drm_crtc_cleanup(crtc);
882 drm_crtc_clear(crtc);
885 static const struct drm_crtc_funcs tegra_crtc_funcs = {
886 .page_flip = tegra_dc_page_flip,
887 .set_config = drm_crtc_helper_set_config,
888 .destroy = tegra_dc_destroy,
891 static void tegra_crtc_disable(struct drm_crtc *crtc)
893 struct tegra_dc *dc = to_tegra_dc(crtc);
894 struct drm_device *drm = crtc->dev;
895 struct drm_plane *plane;
897 drm_for_each_legacy_plane(plane, &drm->mode_config.plane_list) {
898 if (plane->crtc == crtc) {
899 tegra_window_plane_disable(plane);
903 drm_framebuffer_unreference(plane->fb);
909 drm_crtc_vblank_off(crtc);
913 static bool tegra_crtc_mode_fixup(struct drm_crtc *crtc,
914 const struct drm_display_mode *mode,
915 struct drm_display_mode *adjusted)
920 static int tegra_dc_set_timings(struct tegra_dc *dc,
921 struct drm_display_mode *mode)
923 unsigned int h_ref_to_sync = 1;
924 unsigned int v_ref_to_sync = 1;
927 tegra_dc_writel(dc, 0x0, DC_DISP_DISP_TIMING_OPTIONS);
929 value = (v_ref_to_sync << 16) | h_ref_to_sync;
930 tegra_dc_writel(dc, value, DC_DISP_REF_TO_SYNC);
932 value = ((mode->vsync_end - mode->vsync_start) << 16) |
933 ((mode->hsync_end - mode->hsync_start) << 0);
934 tegra_dc_writel(dc, value, DC_DISP_SYNC_WIDTH);
936 value = ((mode->vtotal - mode->vsync_end) << 16) |
937 ((mode->htotal - mode->hsync_end) << 0);
938 tegra_dc_writel(dc, value, DC_DISP_BACK_PORCH);
940 value = ((mode->vsync_start - mode->vdisplay) << 16) |
941 ((mode->hsync_start - mode->hdisplay) << 0);
942 tegra_dc_writel(dc, value, DC_DISP_FRONT_PORCH);
944 value = (mode->vdisplay << 16) | mode->hdisplay;
945 tegra_dc_writel(dc, value, DC_DISP_ACTIVE);
950 static int tegra_crtc_setup_clk(struct drm_crtc *crtc,
951 struct drm_display_mode *mode)
953 unsigned long pclk = mode->clock * 1000;
954 struct tegra_dc *dc = to_tegra_dc(crtc);
955 struct tegra_output *output = NULL;
956 struct drm_encoder *encoder;
961 list_for_each_entry(encoder, &crtc->dev->mode_config.encoder_list, head)
962 if (encoder->crtc == crtc) {
963 output = encoder_to_output(encoder);
971 * This assumes that the parent clock is pll_d_out0 or pll_d2_out
972 * respectively, each of which divides the base pll_d by 2.
974 err = tegra_output_setup_clock(output, dc->clk, pclk, &div);
976 dev_err(dc->dev, "failed to setup clock: %ld\n", err);
980 DRM_DEBUG_KMS("rate: %lu, div: %u\n", clk_get_rate(dc->clk), div);
982 value = SHIFT_CLK_DIVIDER(div) | PIXEL_CLK_DIVIDER_PCD1;
983 tegra_dc_writel(dc, value, DC_DISP_DISP_CLOCK_CONTROL);
988 static int tegra_crtc_mode_set(struct drm_crtc *crtc,
989 struct drm_display_mode *mode,
990 struct drm_display_mode *adjusted,
991 int x, int y, struct drm_framebuffer *old_fb)
993 struct tegra_bo *bo = tegra_fb_get_plane(crtc->primary->fb, 0);
994 struct tegra_dc *dc = to_tegra_dc(crtc);
995 struct tegra_dc_window window;
999 err = tegra_crtc_setup_clk(crtc, mode);
1001 dev_err(dc->dev, "failed to setup clock for CRTC: %d\n", err);
1005 /* program display mode */
1006 tegra_dc_set_timings(dc, mode);
1008 /* interlacing isn't supported yet, so disable it */
1009 if (dc->soc->supports_interlacing) {
1010 value = tegra_dc_readl(dc, DC_DISP_INTERLACE_CONTROL);
1011 value &= ~INTERLACE_ENABLE;
1012 tegra_dc_writel(dc, value, DC_DISP_INTERLACE_CONTROL);
1015 /* setup window parameters */
1016 memset(&window, 0, sizeof(window));
1019 window.src.w = mode->hdisplay;
1020 window.src.h = mode->vdisplay;
1023 window.dst.w = mode->hdisplay;
1024 window.dst.h = mode->vdisplay;
1025 window.format = tegra_dc_format(crtc->primary->fb->pixel_format,
1027 window.bits_per_pixel = crtc->primary->fb->bits_per_pixel;
1028 window.stride[0] = crtc->primary->fb->pitches[0];
1029 window.base[0] = bo->paddr;
1031 err = tegra_dc_setup_window(dc, 0, &window);
1033 dev_err(dc->dev, "failed to enable root plane\n");
1038 static int tegra_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
1039 struct drm_framebuffer *old_fb)
1041 struct tegra_dc *dc = to_tegra_dc(crtc);
1043 return tegra_dc_set_base(dc, x, y, crtc->primary->fb);
1046 static void tegra_crtc_prepare(struct drm_crtc *crtc)
1048 struct tegra_dc *dc = to_tegra_dc(crtc);
1049 unsigned int syncpt;
1050 unsigned long value;
1052 drm_crtc_vblank_off(crtc);
1054 /* hardware initialization */
1055 reset_control_deassert(dc->rst);
1056 usleep_range(10000, 20000);
1059 syncpt = SYNCPT_VBLANK1;
1061 syncpt = SYNCPT_VBLANK0;
1063 /* initialize display controller */
1064 tegra_dc_writel(dc, 0x00000100, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL);
1065 tegra_dc_writel(dc, 0x100 | syncpt, DC_CMD_CONT_SYNCPT_VSYNC);
1067 value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT | WIN_A_OF_INT;
1068 tegra_dc_writel(dc, value, DC_CMD_INT_TYPE);
1070 value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT |
1071 WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT;
1072 tegra_dc_writel(dc, value, DC_CMD_INT_POLARITY);
1074 /* initialize timer */
1075 value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(0x20) |
1076 WINDOW_B_THRESHOLD(0x20) | WINDOW_C_THRESHOLD(0x20);
1077 tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY);
1079 value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(1) |
1080 WINDOW_B_THRESHOLD(1) | WINDOW_C_THRESHOLD(1);
1081 tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER);
1083 value = VBLANK_INT | WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT;
1084 tegra_dc_writel(dc, value, DC_CMD_INT_ENABLE);
1086 value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT;
1087 tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
1090 static void tegra_crtc_commit(struct drm_crtc *crtc)
1092 struct tegra_dc *dc = to_tegra_dc(crtc);
1094 drm_crtc_vblank_on(crtc);
1095 tegra_dc_commit(dc);
1098 static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = {
1099 .disable = tegra_crtc_disable,
1100 .mode_fixup = tegra_crtc_mode_fixup,
1101 .mode_set = tegra_crtc_mode_set,
1102 .mode_set_base = tegra_crtc_mode_set_base,
1103 .prepare = tegra_crtc_prepare,
1104 .commit = tegra_crtc_commit,
1107 static irqreturn_t tegra_dc_irq(int irq, void *data)
1109 struct tegra_dc *dc = data;
1110 unsigned long status;
1112 status = tegra_dc_readl(dc, DC_CMD_INT_STATUS);
1113 tegra_dc_writel(dc, status, DC_CMD_INT_STATUS);
1115 if (status & FRAME_END_INT) {
1117 dev_dbg(dc->dev, "%s(): frame end\n", __func__);
1121 if (status & VBLANK_INT) {
1123 dev_dbg(dc->dev, "%s(): vertical blank\n", __func__);
1125 drm_handle_vblank(dc->base.dev, dc->pipe);
1126 tegra_dc_finish_page_flip(dc);
1129 if (status & (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT)) {
1131 dev_dbg(dc->dev, "%s(): underflow\n", __func__);
1138 static int tegra_dc_show_regs(struct seq_file *s, void *data)
1140 struct drm_info_node *node = s->private;
1141 struct tegra_dc *dc = node->info_ent->data;
1143 #define DUMP_REG(name) \
1144 seq_printf(s, "%-40s %#05x %08x\n", #name, name, \
1145 tegra_dc_readl(dc, name))
1147 DUMP_REG(DC_CMD_GENERAL_INCR_SYNCPT);
1148 DUMP_REG(DC_CMD_GENERAL_INCR_SYNCPT_CNTRL);
1149 DUMP_REG(DC_CMD_GENERAL_INCR_SYNCPT_ERROR);
1150 DUMP_REG(DC_CMD_WIN_A_INCR_SYNCPT);
1151 DUMP_REG(DC_CMD_WIN_A_INCR_SYNCPT_CNTRL);
1152 DUMP_REG(DC_CMD_WIN_A_INCR_SYNCPT_ERROR);
1153 DUMP_REG(DC_CMD_WIN_B_INCR_SYNCPT);
1154 DUMP_REG(DC_CMD_WIN_B_INCR_SYNCPT_CNTRL);
1155 DUMP_REG(DC_CMD_WIN_B_INCR_SYNCPT_ERROR);
1156 DUMP_REG(DC_CMD_WIN_C_INCR_SYNCPT);
1157 DUMP_REG(DC_CMD_WIN_C_INCR_SYNCPT_CNTRL);
1158 DUMP_REG(DC_CMD_WIN_C_INCR_SYNCPT_ERROR);
1159 DUMP_REG(DC_CMD_CONT_SYNCPT_VSYNC);
1160 DUMP_REG(DC_CMD_DISPLAY_COMMAND_OPTION0);
1161 DUMP_REG(DC_CMD_DISPLAY_COMMAND);
1162 DUMP_REG(DC_CMD_SIGNAL_RAISE);
1163 DUMP_REG(DC_CMD_DISPLAY_POWER_CONTROL);
1164 DUMP_REG(DC_CMD_INT_STATUS);
1165 DUMP_REG(DC_CMD_INT_MASK);
1166 DUMP_REG(DC_CMD_INT_ENABLE);
1167 DUMP_REG(DC_CMD_INT_TYPE);
1168 DUMP_REG(DC_CMD_INT_POLARITY);
1169 DUMP_REG(DC_CMD_SIGNAL_RAISE1);
1170 DUMP_REG(DC_CMD_SIGNAL_RAISE2);
1171 DUMP_REG(DC_CMD_SIGNAL_RAISE3);
1172 DUMP_REG(DC_CMD_STATE_ACCESS);
1173 DUMP_REG(DC_CMD_STATE_CONTROL);
1174 DUMP_REG(DC_CMD_DISPLAY_WINDOW_HEADER);
1175 DUMP_REG(DC_CMD_REG_ACT_CONTROL);
1176 DUMP_REG(DC_COM_CRC_CONTROL);
1177 DUMP_REG(DC_COM_CRC_CHECKSUM);
1178 DUMP_REG(DC_COM_PIN_OUTPUT_ENABLE(0));
1179 DUMP_REG(DC_COM_PIN_OUTPUT_ENABLE(1));
1180 DUMP_REG(DC_COM_PIN_OUTPUT_ENABLE(2));
1181 DUMP_REG(DC_COM_PIN_OUTPUT_ENABLE(3));
1182 DUMP_REG(DC_COM_PIN_OUTPUT_POLARITY(0));
1183 DUMP_REG(DC_COM_PIN_OUTPUT_POLARITY(1));
1184 DUMP_REG(DC_COM_PIN_OUTPUT_POLARITY(2));
1185 DUMP_REG(DC_COM_PIN_OUTPUT_POLARITY(3));
1186 DUMP_REG(DC_COM_PIN_OUTPUT_DATA(0));
1187 DUMP_REG(DC_COM_PIN_OUTPUT_DATA(1));
1188 DUMP_REG(DC_COM_PIN_OUTPUT_DATA(2));
1189 DUMP_REG(DC_COM_PIN_OUTPUT_DATA(3));
1190 DUMP_REG(DC_COM_PIN_INPUT_ENABLE(0));
1191 DUMP_REG(DC_COM_PIN_INPUT_ENABLE(1));
1192 DUMP_REG(DC_COM_PIN_INPUT_ENABLE(2));
1193 DUMP_REG(DC_COM_PIN_INPUT_ENABLE(3));
1194 DUMP_REG(DC_COM_PIN_INPUT_DATA(0));
1195 DUMP_REG(DC_COM_PIN_INPUT_DATA(1));
1196 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(0));
1197 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(1));
1198 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(2));
1199 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(3));
1200 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(4));
1201 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(5));
1202 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT(6));
1203 DUMP_REG(DC_COM_PIN_MISC_CONTROL);
1204 DUMP_REG(DC_COM_PIN_PM0_CONTROL);
1205 DUMP_REG(DC_COM_PIN_PM0_DUTY_CYCLE);
1206 DUMP_REG(DC_COM_PIN_PM1_CONTROL);
1207 DUMP_REG(DC_COM_PIN_PM1_DUTY_CYCLE);
1208 DUMP_REG(DC_COM_SPI_CONTROL);
1209 DUMP_REG(DC_COM_SPI_START_BYTE);
1210 DUMP_REG(DC_COM_HSPI_WRITE_DATA_AB);
1211 DUMP_REG(DC_COM_HSPI_WRITE_DATA_CD);
1212 DUMP_REG(DC_COM_HSPI_CS_DC);
1213 DUMP_REG(DC_COM_SCRATCH_REGISTER_A);
1214 DUMP_REG(DC_COM_SCRATCH_REGISTER_B);
1215 DUMP_REG(DC_COM_GPIO_CTRL);
1216 DUMP_REG(DC_COM_GPIO_DEBOUNCE_COUNTER);
1217 DUMP_REG(DC_COM_CRC_CHECKSUM_LATCHED);
1218 DUMP_REG(DC_DISP_DISP_SIGNAL_OPTIONS0);
1219 DUMP_REG(DC_DISP_DISP_SIGNAL_OPTIONS1);
1220 DUMP_REG(DC_DISP_DISP_WIN_OPTIONS);
1221 DUMP_REG(DC_DISP_DISP_MEM_HIGH_PRIORITY);
1222 DUMP_REG(DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER);
1223 DUMP_REG(DC_DISP_DISP_TIMING_OPTIONS);
1224 DUMP_REG(DC_DISP_REF_TO_SYNC);
1225 DUMP_REG(DC_DISP_SYNC_WIDTH);
1226 DUMP_REG(DC_DISP_BACK_PORCH);
1227 DUMP_REG(DC_DISP_ACTIVE);
1228 DUMP_REG(DC_DISP_FRONT_PORCH);
1229 DUMP_REG(DC_DISP_H_PULSE0_CONTROL);
1230 DUMP_REG(DC_DISP_H_PULSE0_POSITION_A);
1231 DUMP_REG(DC_DISP_H_PULSE0_POSITION_B);
1232 DUMP_REG(DC_DISP_H_PULSE0_POSITION_C);
1233 DUMP_REG(DC_DISP_H_PULSE0_POSITION_D);
1234 DUMP_REG(DC_DISP_H_PULSE1_CONTROL);
1235 DUMP_REG(DC_DISP_H_PULSE1_POSITION_A);
1236 DUMP_REG(DC_DISP_H_PULSE1_POSITION_B);
1237 DUMP_REG(DC_DISP_H_PULSE1_POSITION_C);
1238 DUMP_REG(DC_DISP_H_PULSE1_POSITION_D);
1239 DUMP_REG(DC_DISP_H_PULSE2_CONTROL);
1240 DUMP_REG(DC_DISP_H_PULSE2_POSITION_A);
1241 DUMP_REG(DC_DISP_H_PULSE2_POSITION_B);
1242 DUMP_REG(DC_DISP_H_PULSE2_POSITION_C);
1243 DUMP_REG(DC_DISP_H_PULSE2_POSITION_D);
1244 DUMP_REG(DC_DISP_V_PULSE0_CONTROL);
1245 DUMP_REG(DC_DISP_V_PULSE0_POSITION_A);
1246 DUMP_REG(DC_DISP_V_PULSE0_POSITION_B);
1247 DUMP_REG(DC_DISP_V_PULSE0_POSITION_C);
1248 DUMP_REG(DC_DISP_V_PULSE1_CONTROL);
1249 DUMP_REG(DC_DISP_V_PULSE1_POSITION_A);
1250 DUMP_REG(DC_DISP_V_PULSE1_POSITION_B);
1251 DUMP_REG(DC_DISP_V_PULSE1_POSITION_C);
1252 DUMP_REG(DC_DISP_V_PULSE2_CONTROL);
1253 DUMP_REG(DC_DISP_V_PULSE2_POSITION_A);
1254 DUMP_REG(DC_DISP_V_PULSE3_CONTROL);
1255 DUMP_REG(DC_DISP_V_PULSE3_POSITION_A);
1256 DUMP_REG(DC_DISP_M0_CONTROL);
1257 DUMP_REG(DC_DISP_M1_CONTROL);
1258 DUMP_REG(DC_DISP_DI_CONTROL);
1259 DUMP_REG(DC_DISP_PP_CONTROL);
1260 DUMP_REG(DC_DISP_PP_SELECT_A);
1261 DUMP_REG(DC_DISP_PP_SELECT_B);
1262 DUMP_REG(DC_DISP_PP_SELECT_C);
1263 DUMP_REG(DC_DISP_PP_SELECT_D);
1264 DUMP_REG(DC_DISP_DISP_CLOCK_CONTROL);
1265 DUMP_REG(DC_DISP_DISP_INTERFACE_CONTROL);
1266 DUMP_REG(DC_DISP_DISP_COLOR_CONTROL);
1267 DUMP_REG(DC_DISP_SHIFT_CLOCK_OPTIONS);
1268 DUMP_REG(DC_DISP_DATA_ENABLE_OPTIONS);
1269 DUMP_REG(DC_DISP_SERIAL_INTERFACE_OPTIONS);
1270 DUMP_REG(DC_DISP_LCD_SPI_OPTIONS);
1271 DUMP_REG(DC_DISP_BORDER_COLOR);
1272 DUMP_REG(DC_DISP_COLOR_KEY0_LOWER);
1273 DUMP_REG(DC_DISP_COLOR_KEY0_UPPER);
1274 DUMP_REG(DC_DISP_COLOR_KEY1_LOWER);
1275 DUMP_REG(DC_DISP_COLOR_KEY1_UPPER);
1276 DUMP_REG(DC_DISP_CURSOR_FOREGROUND);
1277 DUMP_REG(DC_DISP_CURSOR_BACKGROUND);
1278 DUMP_REG(DC_DISP_CURSOR_START_ADDR);
1279 DUMP_REG(DC_DISP_CURSOR_START_ADDR_NS);
1280 DUMP_REG(DC_DISP_CURSOR_POSITION);
1281 DUMP_REG(DC_DISP_CURSOR_POSITION_NS);
1282 DUMP_REG(DC_DISP_INIT_SEQ_CONTROL);
1283 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_A);
1284 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_B);
1285 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_C);
1286 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_D);
1287 DUMP_REG(DC_DISP_DC_MCCIF_FIFOCTRL);
1288 DUMP_REG(DC_DISP_MCCIF_DISPLAY0A_HYST);
1289 DUMP_REG(DC_DISP_MCCIF_DISPLAY0B_HYST);
1290 DUMP_REG(DC_DISP_MCCIF_DISPLAY1A_HYST);
1291 DUMP_REG(DC_DISP_MCCIF_DISPLAY1B_HYST);
1292 DUMP_REG(DC_DISP_DAC_CRT_CTRL);
1293 DUMP_REG(DC_DISP_DISP_MISC_CONTROL);
1294 DUMP_REG(DC_DISP_SD_CONTROL);
1295 DUMP_REG(DC_DISP_SD_CSC_COEFF);
1296 DUMP_REG(DC_DISP_SD_LUT(0));
1297 DUMP_REG(DC_DISP_SD_LUT(1));
1298 DUMP_REG(DC_DISP_SD_LUT(2));
1299 DUMP_REG(DC_DISP_SD_LUT(3));
1300 DUMP_REG(DC_DISP_SD_LUT(4));
1301 DUMP_REG(DC_DISP_SD_LUT(5));
1302 DUMP_REG(DC_DISP_SD_LUT(6));
1303 DUMP_REG(DC_DISP_SD_LUT(7));
1304 DUMP_REG(DC_DISP_SD_LUT(8));
1305 DUMP_REG(DC_DISP_SD_FLICKER_CONTROL);
1306 DUMP_REG(DC_DISP_DC_PIXEL_COUNT);
1307 DUMP_REG(DC_DISP_SD_HISTOGRAM(0));
1308 DUMP_REG(DC_DISP_SD_HISTOGRAM(1));
1309 DUMP_REG(DC_DISP_SD_HISTOGRAM(2));
1310 DUMP_REG(DC_DISP_SD_HISTOGRAM(3));
1311 DUMP_REG(DC_DISP_SD_HISTOGRAM(4));
1312 DUMP_REG(DC_DISP_SD_HISTOGRAM(5));
1313 DUMP_REG(DC_DISP_SD_HISTOGRAM(6));
1314 DUMP_REG(DC_DISP_SD_HISTOGRAM(7));
1315 DUMP_REG(DC_DISP_SD_BL_TF(0));
1316 DUMP_REG(DC_DISP_SD_BL_TF(1));
1317 DUMP_REG(DC_DISP_SD_BL_TF(2));
1318 DUMP_REG(DC_DISP_SD_BL_TF(3));
1319 DUMP_REG(DC_DISP_SD_BL_CONTROL);
1320 DUMP_REG(DC_DISP_SD_HW_K_VALUES);
1321 DUMP_REG(DC_DISP_SD_MAN_K_VALUES);
1322 DUMP_REG(DC_DISP_CURSOR_START_ADDR_HI);
1323 DUMP_REG(DC_DISP_BLEND_CURSOR_CONTROL);
1324 DUMP_REG(DC_WIN_WIN_OPTIONS);
1325 DUMP_REG(DC_WIN_BYTE_SWAP);
1326 DUMP_REG(DC_WIN_BUFFER_CONTROL);
1327 DUMP_REG(DC_WIN_COLOR_DEPTH);
1328 DUMP_REG(DC_WIN_POSITION);
1329 DUMP_REG(DC_WIN_SIZE);
1330 DUMP_REG(DC_WIN_PRESCALED_SIZE);
1331 DUMP_REG(DC_WIN_H_INITIAL_DDA);
1332 DUMP_REG(DC_WIN_V_INITIAL_DDA);
1333 DUMP_REG(DC_WIN_DDA_INC);
1334 DUMP_REG(DC_WIN_LINE_STRIDE);
1335 DUMP_REG(DC_WIN_BUF_STRIDE);
1336 DUMP_REG(DC_WIN_UV_BUF_STRIDE);
1337 DUMP_REG(DC_WIN_BUFFER_ADDR_MODE);
1338 DUMP_REG(DC_WIN_DV_CONTROL);
1339 DUMP_REG(DC_WIN_BLEND_NOKEY);
1340 DUMP_REG(DC_WIN_BLEND_1WIN);
1341 DUMP_REG(DC_WIN_BLEND_2WIN_X);
1342 DUMP_REG(DC_WIN_BLEND_2WIN_Y);
1343 DUMP_REG(DC_WIN_BLEND_3WIN_XY);
1344 DUMP_REG(DC_WIN_HP_FETCH_CONTROL);
1345 DUMP_REG(DC_WINBUF_START_ADDR);
1346 DUMP_REG(DC_WINBUF_START_ADDR_NS);
1347 DUMP_REG(DC_WINBUF_START_ADDR_U);
1348 DUMP_REG(DC_WINBUF_START_ADDR_U_NS);
1349 DUMP_REG(DC_WINBUF_START_ADDR_V);
1350 DUMP_REG(DC_WINBUF_START_ADDR_V_NS);
1351 DUMP_REG(DC_WINBUF_ADDR_H_OFFSET);
1352 DUMP_REG(DC_WINBUF_ADDR_H_OFFSET_NS);
1353 DUMP_REG(DC_WINBUF_ADDR_V_OFFSET);
1354 DUMP_REG(DC_WINBUF_ADDR_V_OFFSET_NS);
1355 DUMP_REG(DC_WINBUF_UFLOW_STATUS);
1356 DUMP_REG(DC_WINBUF_AD_UFLOW_STATUS);
1357 DUMP_REG(DC_WINBUF_BD_UFLOW_STATUS);
1358 DUMP_REG(DC_WINBUF_CD_UFLOW_STATUS);
1365 static struct drm_info_list debugfs_files[] = {
1366 { "regs", tegra_dc_show_regs, 0, NULL },
1369 static int tegra_dc_debugfs_init(struct tegra_dc *dc, struct drm_minor *minor)
1375 name = kasprintf(GFP_KERNEL, "dc.%d", dc->pipe);
1376 dc->debugfs = debugfs_create_dir(name, minor->debugfs_root);
1382 dc->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
1384 if (!dc->debugfs_files) {
1389 for (i = 0; i < ARRAY_SIZE(debugfs_files); i++)
1390 dc->debugfs_files[i].data = dc;
1392 err = drm_debugfs_create_files(dc->debugfs_files,
1393 ARRAY_SIZE(debugfs_files),
1394 dc->debugfs, minor);
1403 kfree(dc->debugfs_files);
1404 dc->debugfs_files = NULL;
1406 debugfs_remove(dc->debugfs);
1412 static int tegra_dc_debugfs_exit(struct tegra_dc *dc)
1414 drm_debugfs_remove_files(dc->debugfs_files, ARRAY_SIZE(debugfs_files),
1418 kfree(dc->debugfs_files);
1419 dc->debugfs_files = NULL;
1421 debugfs_remove(dc->debugfs);
1427 static int tegra_dc_init(struct host1x_client *client)
1429 struct drm_device *drm = dev_get_drvdata(client->parent);
1430 struct tegra_dc *dc = host1x_client_to_dc(client);
1431 struct tegra_drm *tegra = drm->dev_private;
1432 struct drm_plane *primary = NULL;
1433 struct drm_plane *cursor = NULL;
1436 if (tegra->domain) {
1437 err = iommu_attach_device(tegra->domain, dc->dev);
1439 dev_err(dc->dev, "failed to attach to domain: %d\n",
1444 dc->domain = tegra->domain;
1447 primary = tegra_dc_primary_plane_create(drm, dc);
1448 if (IS_ERR(primary)) {
1449 err = PTR_ERR(primary);
1453 if (dc->soc->supports_cursor) {
1454 cursor = tegra_dc_cursor_plane_create(drm, dc);
1455 if (IS_ERR(cursor)) {
1456 err = PTR_ERR(cursor);
1461 err = drm_crtc_init_with_planes(drm, &dc->base, primary, cursor,
1466 drm_mode_crtc_set_gamma_size(&dc->base, 256);
1467 drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
1470 * Keep track of the minimum pitch alignment across all display
1473 if (dc->soc->pitch_align > tegra->pitch_align)
1474 tegra->pitch_align = dc->soc->pitch_align;
1476 err = tegra_dc_rgb_init(drm, dc);
1477 if (err < 0 && err != -ENODEV) {
1478 dev_err(dc->dev, "failed to initialize RGB output: %d\n", err);
1482 err = tegra_dc_add_planes(drm, dc);
1486 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
1487 err = tegra_dc_debugfs_init(dc, drm->primary);
1489 dev_err(dc->dev, "debugfs setup failed: %d\n", err);
1492 err = devm_request_irq(dc->dev, dc->irq, tegra_dc_irq, 0,
1493 dev_name(dc->dev), dc);
1495 dev_err(dc->dev, "failed to request IRQ#%u: %d\n", dc->irq,
1504 drm_plane_cleanup(cursor);
1507 drm_plane_cleanup(primary);
1509 if (tegra->domain) {
1510 iommu_detach_device(tegra->domain, dc->dev);
1517 static int tegra_dc_exit(struct host1x_client *client)
1519 struct tegra_dc *dc = host1x_client_to_dc(client);
1522 devm_free_irq(dc->dev, dc->irq, dc);
1524 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
1525 err = tegra_dc_debugfs_exit(dc);
1527 dev_err(dc->dev, "debugfs cleanup failed: %d\n", err);
1530 err = tegra_dc_rgb_exit(dc);
1532 dev_err(dc->dev, "failed to shutdown RGB output: %d\n", err);
1537 iommu_detach_device(dc->domain, dc->dev);
1544 static const struct host1x_client_ops dc_client_ops = {
1545 .init = tegra_dc_init,
1546 .exit = tegra_dc_exit,
1549 static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
1550 .supports_interlacing = false,
1551 .supports_cursor = false,
1552 .supports_block_linear = false,
1554 .has_powergate = false,
1557 static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
1558 .supports_interlacing = false,
1559 .supports_cursor = false,
1560 .supports_block_linear = false,
1562 .has_powergate = false,
1565 static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
1566 .supports_interlacing = false,
1567 .supports_cursor = false,
1568 .supports_block_linear = false,
1570 .has_powergate = true,
1573 static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
1574 .supports_interlacing = true,
1575 .supports_cursor = true,
1576 .supports_block_linear = true,
1578 .has_powergate = true,
1581 static const struct of_device_id tegra_dc_of_match[] = {
1583 .compatible = "nvidia,tegra124-dc",
1584 .data = &tegra124_dc_soc_info,
1586 .compatible = "nvidia,tegra114-dc",
1587 .data = &tegra114_dc_soc_info,
1589 .compatible = "nvidia,tegra30-dc",
1590 .data = &tegra30_dc_soc_info,
1592 .compatible = "nvidia,tegra20-dc",
1593 .data = &tegra20_dc_soc_info,
1598 MODULE_DEVICE_TABLE(of, tegra_dc_of_match);
1600 static int tegra_dc_parse_dt(struct tegra_dc *dc)
1602 struct device_node *np;
1606 err = of_property_read_u32(dc->dev->of_node, "nvidia,head", &value);
1608 dev_err(dc->dev, "missing \"nvidia,head\" property\n");
1611 * If the nvidia,head property isn't present, try to find the
1612 * correct head number by looking up the position of this
1613 * display controller's node within the device tree. Assuming
1614 * that the nodes are ordered properly in the DTS file and
1615 * that the translation into a flattened device tree blob
1616 * preserves that ordering this will actually yield the right
1619 * If those assumptions don't hold, this will still work for
1620 * cases where only a single display controller is used.
1622 for_each_matching_node(np, tegra_dc_of_match) {
1623 if (np == dc->dev->of_node)
1635 static int tegra_dc_probe(struct platform_device *pdev)
1637 const struct of_device_id *id;
1638 struct resource *regs;
1639 struct tegra_dc *dc;
1642 dc = devm_kzalloc(&pdev->dev, sizeof(*dc), GFP_KERNEL);
1646 id = of_match_node(tegra_dc_of_match, pdev->dev.of_node);
1650 spin_lock_init(&dc->lock);
1651 INIT_LIST_HEAD(&dc->list);
1652 dc->dev = &pdev->dev;
1655 err = tegra_dc_parse_dt(dc);
1659 dc->clk = devm_clk_get(&pdev->dev, NULL);
1660 if (IS_ERR(dc->clk)) {
1661 dev_err(&pdev->dev, "failed to get clock\n");
1662 return PTR_ERR(dc->clk);
1665 dc->rst = devm_reset_control_get(&pdev->dev, "dc");
1666 if (IS_ERR(dc->rst)) {
1667 dev_err(&pdev->dev, "failed to get reset\n");
1668 return PTR_ERR(dc->rst);
1671 if (dc->soc->has_powergate) {
1673 dc->powergate = TEGRA_POWERGATE_DIS;
1675 dc->powergate = TEGRA_POWERGATE_DISB;
1677 err = tegra_powergate_sequence_power_up(dc->powergate, dc->clk,
1680 dev_err(&pdev->dev, "failed to power partition: %d\n",
1685 err = clk_prepare_enable(dc->clk);
1687 dev_err(&pdev->dev, "failed to enable clock: %d\n",
1692 err = reset_control_deassert(dc->rst);
1694 dev_err(&pdev->dev, "failed to deassert reset: %d\n",
1700 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1701 dc->regs = devm_ioremap_resource(&pdev->dev, regs);
1702 if (IS_ERR(dc->regs))
1703 return PTR_ERR(dc->regs);
1705 dc->irq = platform_get_irq(pdev, 0);
1707 dev_err(&pdev->dev, "failed to get IRQ\n");
1711 INIT_LIST_HEAD(&dc->client.list);
1712 dc->client.ops = &dc_client_ops;
1713 dc->client.dev = &pdev->dev;
1715 err = tegra_dc_rgb_probe(dc);
1716 if (err < 0 && err != -ENODEV) {
1717 dev_err(&pdev->dev, "failed to probe RGB output: %d\n", err);
1721 err = host1x_client_register(&dc->client);
1723 dev_err(&pdev->dev, "failed to register host1x client: %d\n",
1728 platform_set_drvdata(pdev, dc);
1733 static int tegra_dc_remove(struct platform_device *pdev)
1735 struct tegra_dc *dc = platform_get_drvdata(pdev);
1738 err = host1x_client_unregister(&dc->client);
1740 dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
1745 err = tegra_dc_rgb_remove(dc);
1747 dev_err(&pdev->dev, "failed to remove RGB output: %d\n", err);
1751 reset_control_assert(dc->rst);
1753 if (dc->soc->has_powergate)
1754 tegra_powergate_power_off(dc->powergate);
1756 clk_disable_unprepare(dc->clk);
1761 struct platform_driver tegra_dc_driver = {
1764 .owner = THIS_MODULE,
1765 .of_match_table = tegra_dc_of_match,
1767 .probe = tegra_dc_probe,
1768 .remove = tegra_dc_remove,