xref: /openbmc/linux/drivers/gpu/drm/tegra/dc.c (revision a48c7709)
1 /*
2  * Copyright (C) 2012 Avionic Design GmbH
3  * Copyright (C) 2012 NVIDIA CORPORATION.  All rights reserved.
4  *
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.
8  */
9 
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>
16 
17 #include <soc/tegra/pmc.h>
18 
19 #include "dc.h"
20 #include "drm.h"
21 #include "gem.h"
22 #include "hub.h"
23 #include "plane.h"
24 
25 #include <drm/drm_atomic.h>
26 #include <drm/drm_atomic_helper.h>
27 #include <drm/drm_plane_helper.h>
28 
29 static void tegra_dc_stats_reset(struct tegra_dc_stats *stats)
30 {
31 	stats->frames = 0;
32 	stats->vblank = 0;
33 	stats->underflow = 0;
34 	stats->overflow = 0;
35 }
36 
37 /* Reads the active copy of a register. */
38 static u32 tegra_dc_readl_active(struct tegra_dc *dc, unsigned long offset)
39 {
40 	u32 value;
41 
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);
45 
46 	return value;
47 }
48 
49 static inline unsigned int tegra_plane_offset(struct tegra_plane *plane,
50 					      unsigned int offset)
51 {
52 	if (offset >= 0x500 && offset <= 0x638) {
53 		offset = 0x000 + (offset - 0x500);
54 		return plane->offset + offset;
55 	}
56 
57 	if (offset >= 0x700 && offset <= 0x719) {
58 		offset = 0x180 + (offset - 0x700);
59 		return plane->offset + offset;
60 	}
61 
62 	if (offset >= 0x800 && offset <= 0x839) {
63 		offset = 0x1c0 + (offset - 0x800);
64 		return plane->offset + offset;
65 	}
66 
67 	dev_WARN(plane->dc->dev, "invalid offset: %x\n", offset);
68 
69 	return plane->offset + offset;
70 }
71 
72 static inline u32 tegra_plane_readl(struct tegra_plane *plane,
73 				    unsigned int offset)
74 {
75 	return tegra_dc_readl(plane->dc, tegra_plane_offset(plane, offset));
76 }
77 
78 static inline void tegra_plane_writel(struct tegra_plane *plane, u32 value,
79 				      unsigned int offset)
80 {
81 	tegra_dc_writel(plane->dc, value, tegra_plane_offset(plane, offset));
82 }
83 
84 bool tegra_dc_has_output(struct tegra_dc *dc, struct device *dev)
85 {
86 	struct device_node *np = dc->dev->of_node;
87 	struct of_phandle_iterator it;
88 	int err;
89 
90 	of_for_each_phandle(&it, err, np, "nvidia,outputs", NULL, 0)
91 		if (it.node == dev->of_node)
92 			return true;
93 
94 	return false;
95 }
96 
97 /*
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.
102  *
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.
108  */
109 void tegra_dc_commit(struct tegra_dc *dc)
110 {
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);
113 }
114 
115 static inline u32 compute_dda_inc(unsigned int in, unsigned int out, bool v,
116 				  unsigned int bpp)
117 {
118 	fixed20_12 outf = dfixed_init(out);
119 	fixed20_12 inf = dfixed_init(in);
120 	u32 dda_inc;
121 	int max;
122 
123 	if (v)
124 		max = 15;
125 	else {
126 		switch (bpp) {
127 		case 2:
128 			max = 8;
129 			break;
130 
131 		default:
132 			WARN_ON_ONCE(1);
133 			/* fallthrough */
134 		case 4:
135 			max = 4;
136 			break;
137 		}
138 	}
139 
140 	outf.full = max_t(u32, outf.full - dfixed_const(1), dfixed_const(1));
141 	inf.full -= dfixed_const(1);
142 
143 	dda_inc = dfixed_div(inf, outf);
144 	dda_inc = min_t(u32, dda_inc, dfixed_const(max));
145 
146 	return dda_inc;
147 }
148 
149 static inline u32 compute_initial_dda(unsigned int in)
150 {
151 	fixed20_12 inf = dfixed_init(in);
152 	return dfixed_frac(inf);
153 }
154 
155 static void tegra_plane_setup_blending_legacy(struct tegra_plane *plane)
156 {
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,
161 	};
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;
166 	unsigned int i;
167 
168 	state = to_tegra_plane_state(plane->base.state);
169 
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;
174 	}
175 
176 	/* enable alpha blending if pixel format has an alpha component */
177 	if (!state->opaque)
178 		foreground |= BLEND_CONTROL_ALPHA;
179 
180 	/*
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.
183 	 */
184 	tegra_plane_writel(plane, blendnokey, DC_WIN_BLEND_NOKEY);
185 	tegra_plane_writel(plane, foreground, DC_WIN_BLEND_1WIN);
186 
187 	switch (plane->index) {
188 	case 0:
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);
192 		break;
193 
194 	case 1:
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);
198 		break;
199 
200 	case 2:
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);
204 		break;
205 	}
206 }
207 
208 static void tegra_plane_setup_blending(struct tegra_plane *plane,
209 				       const struct tegra_dc_window *window)
210 {
211 	u32 value;
212 
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);
217 
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);
222 
223 	value = K2(255) | K1(255) | WINDOW_LAYER_DEPTH(255 - window->zpos);
224 	tegra_plane_writel(plane, value, DC_WIN_BLEND_LAYER_CONTROL);
225 }
226 
227 static void tegra_dc_setup_window(struct tegra_plane *plane,
228 				  const struct tegra_dc_window *window)
229 {
230 	unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp;
231 	struct tegra_dc *dc = plane->dc;
232 	bool yuv, planar;
233 	u32 value;
234 
235 	/*
236 	 * For YUV planar modes, the number of bytes per pixel takes into
237 	 * account only the luma component and therefore is 1.
238 	 */
239 	yuv = tegra_plane_format_is_yuv(window->format, &planar);
240 	if (!yuv)
241 		bpp = window->bits_per_pixel / 8;
242 	else
243 		bpp = planar ? 1 : 2;
244 
245 	tegra_plane_writel(plane, window->format, DC_WIN_COLOR_DEPTH);
246 	tegra_plane_writel(plane, window->swap, DC_WIN_BYTE_SWAP);
247 
248 	value = V_POSITION(window->dst.y) | H_POSITION(window->dst.x);
249 	tegra_plane_writel(plane, value, DC_WIN_POSITION);
250 
251 	value = V_SIZE(window->dst.h) | H_SIZE(window->dst.w);
252 	tegra_plane_writel(plane, value, DC_WIN_SIZE);
253 
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;
258 
259 	value = V_PRESCALED_SIZE(v_size) | H_PRESCALED_SIZE(h_size);
260 	tegra_plane_writel(plane, value, DC_WIN_PRESCALED_SIZE);
261 
262 	/*
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.
265 	 */
266 	if (yuv && planar)
267 		bpp = 2;
268 
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);
271 
272 	value = V_DDA_INC(v_dda) | H_DDA_INC(h_dda);
273 	tegra_plane_writel(plane, value, DC_WIN_DDA_INC);
274 
275 	h_dda = compute_initial_dda(window->src.x);
276 	v_dda = compute_initial_dda(window->src.y);
277 
278 	tegra_plane_writel(plane, h_dda, DC_WIN_H_INITIAL_DDA);
279 	tegra_plane_writel(plane, v_dda, DC_WIN_V_INITIAL_DDA);
280 
281 	tegra_plane_writel(plane, 0, DC_WIN_UV_BUF_STRIDE);
282 	tegra_plane_writel(plane, 0, DC_WIN_BUF_STRIDE);
283 
284 	tegra_plane_writel(plane, window->base[0], DC_WINBUF_START_ADDR);
285 
286 	if (yuv && planar) {
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);
291 	} else {
292 		tegra_plane_writel(plane, window->stride[0], DC_WIN_LINE_STRIDE);
293 	}
294 
295 	if (window->bottom_up)
296 		v_offset += window->src.h - 1;
297 
298 	tegra_plane_writel(plane, h_offset, DC_WINBUF_ADDR_H_OFFSET);
299 	tegra_plane_writel(plane, v_offset, DC_WINBUF_ADDR_V_OFFSET);
300 
301 	if (dc->soc->supports_block_linear) {
302 		unsigned long height = window->tiling.value;
303 
304 		switch (window->tiling.mode) {
305 		case TEGRA_BO_TILING_MODE_PITCH:
306 			value = DC_WINBUF_SURFACE_KIND_PITCH;
307 			break;
308 
309 		case TEGRA_BO_TILING_MODE_TILED:
310 			value = DC_WINBUF_SURFACE_KIND_TILED;
311 			break;
312 
313 		case TEGRA_BO_TILING_MODE_BLOCK:
314 			value = DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(height) |
315 				DC_WINBUF_SURFACE_KIND_BLOCK;
316 			break;
317 		}
318 
319 		tegra_plane_writel(plane, value, DC_WINBUF_SURFACE_KIND);
320 	} else {
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;
325 			break;
326 
327 		case TEGRA_BO_TILING_MODE_TILED:
328 			value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
329 				DC_WIN_BUFFER_ADDR_MODE_TILE;
330 			break;
331 
332 		case TEGRA_BO_TILING_MODE_BLOCK:
333 			/*
334 			 * No need to handle this here because ->atomic_check
335 			 * will already have filtered it out.
336 			 */
337 			break;
338 		}
339 
340 		tegra_plane_writel(plane, value, DC_WIN_BUFFER_ADDR_MODE);
341 	}
342 
343 	value = WIN_ENABLE;
344 
345 	if (yuv) {
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);
355 
356 		value |= CSC_ENABLE;
357 	} else if (window->bits_per_pixel < 24) {
358 		value |= COLOR_EXPAND;
359 	}
360 
361 	if (window->bottom_up)
362 		value |= V_DIRECTION;
363 
364 	tegra_plane_writel(plane, value, DC_WIN_WIN_OPTIONS);
365 
366 	if (dc->soc->supports_blending)
367 		tegra_plane_setup_blending(plane, window);
368 	else
369 		tegra_plane_setup_blending_legacy(plane);
370 }
371 
372 static const u32 tegra20_primary_formats[] = {
373 	DRM_FORMAT_ARGB4444,
374 	DRM_FORMAT_ARGB1555,
375 	DRM_FORMAT_RGB565,
376 	DRM_FORMAT_RGBA5551,
377 	DRM_FORMAT_ABGR8888,
378 	DRM_FORMAT_ARGB8888,
379 	/* non-native formats */
380 	DRM_FORMAT_XRGB1555,
381 	DRM_FORMAT_RGBX5551,
382 	DRM_FORMAT_XBGR8888,
383 	DRM_FORMAT_XRGB8888,
384 };
385 
386 static const u64 tegra20_modifiers[] = {
387 	DRM_FORMAT_MOD_LINEAR,
388 	DRM_FORMAT_MOD_NVIDIA_TEGRA_TILED,
389 	DRM_FORMAT_MOD_INVALID
390 };
391 
392 static const u32 tegra114_primary_formats[] = {
393 	DRM_FORMAT_ARGB4444,
394 	DRM_FORMAT_ARGB1555,
395 	DRM_FORMAT_RGB565,
396 	DRM_FORMAT_RGBA5551,
397 	DRM_FORMAT_ABGR8888,
398 	DRM_FORMAT_ARGB8888,
399 	/* new on Tegra114 */
400 	DRM_FORMAT_ABGR4444,
401 	DRM_FORMAT_ABGR1555,
402 	DRM_FORMAT_BGRA5551,
403 	DRM_FORMAT_XRGB1555,
404 	DRM_FORMAT_RGBX5551,
405 	DRM_FORMAT_XBGR1555,
406 	DRM_FORMAT_BGRX5551,
407 	DRM_FORMAT_BGR565,
408 	DRM_FORMAT_BGRA8888,
409 	DRM_FORMAT_RGBA8888,
410 	DRM_FORMAT_XRGB8888,
411 	DRM_FORMAT_XBGR8888,
412 };
413 
414 static const u32 tegra124_primary_formats[] = {
415 	DRM_FORMAT_ARGB4444,
416 	DRM_FORMAT_ARGB1555,
417 	DRM_FORMAT_RGB565,
418 	DRM_FORMAT_RGBA5551,
419 	DRM_FORMAT_ABGR8888,
420 	DRM_FORMAT_ARGB8888,
421 	/* new on Tegra114 */
422 	DRM_FORMAT_ABGR4444,
423 	DRM_FORMAT_ABGR1555,
424 	DRM_FORMAT_BGRA5551,
425 	DRM_FORMAT_XRGB1555,
426 	DRM_FORMAT_RGBX5551,
427 	DRM_FORMAT_XBGR1555,
428 	DRM_FORMAT_BGRX5551,
429 	DRM_FORMAT_BGR565,
430 	DRM_FORMAT_BGRA8888,
431 	DRM_FORMAT_RGBA8888,
432 	DRM_FORMAT_XRGB8888,
433 	DRM_FORMAT_XBGR8888,
434 	/* new on Tegra124 */
435 	DRM_FORMAT_RGBX8888,
436 	DRM_FORMAT_BGRX8888,
437 };
438 
439 static const u64 tegra124_modifiers[] = {
440 	DRM_FORMAT_MOD_LINEAR,
441 	DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(0),
442 	DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(1),
443 	DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(2),
444 	DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(3),
445 	DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(4),
446 	DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(5),
447 	DRM_FORMAT_MOD_INVALID
448 };
449 
450 static int tegra_plane_atomic_check(struct drm_plane *plane,
451 				    struct drm_plane_state *state)
452 {
453 	struct tegra_plane_state *plane_state = to_tegra_plane_state(state);
454 	struct tegra_bo_tiling *tiling = &plane_state->tiling;
455 	struct tegra_plane *tegra = to_tegra_plane(plane);
456 	struct tegra_dc *dc = to_tegra_dc(state->crtc);
457 	unsigned int format;
458 	int err;
459 
460 	/* no need for further checks if the plane is being disabled */
461 	if (!state->crtc)
462 		return 0;
463 
464 	err = tegra_plane_format(state->fb->format->format, &format,
465 				 &plane_state->swap);
466 	if (err < 0)
467 		return err;
468 
469 	/*
470 	 * Tegra20 and Tegra30 are special cases here because they support
471 	 * only variants of specific formats with an alpha component, but not
472 	 * the corresponding opaque formats. However, the opaque formats can
473 	 * be emulated by disabling alpha blending for the plane.
474 	 */
475 	if (!dc->soc->supports_blending) {
476 		if (!tegra_plane_format_has_alpha(format)) {
477 			err = tegra_plane_format_get_alpha(format, &format);
478 			if (err < 0)
479 				return err;
480 
481 			plane_state->opaque = true;
482 		} else {
483 			plane_state->opaque = false;
484 		}
485 
486 		tegra_plane_check_dependent(tegra, plane_state);
487 	}
488 
489 	plane_state->format = format;
490 
491 	err = tegra_fb_get_tiling(state->fb, tiling);
492 	if (err < 0)
493 		return err;
494 
495 	if (tiling->mode == TEGRA_BO_TILING_MODE_BLOCK &&
496 	    !dc->soc->supports_block_linear) {
497 		DRM_ERROR("hardware doesn't support block linear mode\n");
498 		return -EINVAL;
499 	}
500 
501 	/*
502 	 * Tegra doesn't support different strides for U and V planes so we
503 	 * error out if the user tries to display a framebuffer with such a
504 	 * configuration.
505 	 */
506 	if (state->fb->format->num_planes > 2) {
507 		if (state->fb->pitches[2] != state->fb->pitches[1]) {
508 			DRM_ERROR("unsupported UV-plane configuration\n");
509 			return -EINVAL;
510 		}
511 	}
512 
513 	err = tegra_plane_state_add(tegra, state);
514 	if (err < 0)
515 		return err;
516 
517 	return 0;
518 }
519 
520 static void tegra_plane_atomic_disable(struct drm_plane *plane,
521 				       struct drm_plane_state *old_state)
522 {
523 	struct tegra_plane *p = to_tegra_plane(plane);
524 	u32 value;
525 
526 	/* rien ne va plus */
527 	if (!old_state || !old_state->crtc)
528 		return;
529 
530 	value = tegra_plane_readl(p, DC_WIN_WIN_OPTIONS);
531 	value &= ~WIN_ENABLE;
532 	tegra_plane_writel(p, value, DC_WIN_WIN_OPTIONS);
533 }
534 
535 static void tegra_plane_atomic_update(struct drm_plane *plane,
536 				      struct drm_plane_state *old_state)
537 {
538 	struct tegra_plane_state *state = to_tegra_plane_state(plane->state);
539 	struct drm_framebuffer *fb = plane->state->fb;
540 	struct tegra_plane *p = to_tegra_plane(plane);
541 	struct tegra_dc_window window;
542 	unsigned int i;
543 
544 	/* rien ne va plus */
545 	if (!plane->state->crtc || !plane->state->fb)
546 		return;
547 
548 	if (!plane->state->visible)
549 		return tegra_plane_atomic_disable(plane, old_state);
550 
551 	memset(&window, 0, sizeof(window));
552 	window.src.x = plane->state->src.x1 >> 16;
553 	window.src.y = plane->state->src.y1 >> 16;
554 	window.src.w = drm_rect_width(&plane->state->src) >> 16;
555 	window.src.h = drm_rect_height(&plane->state->src) >> 16;
556 	window.dst.x = plane->state->dst.x1;
557 	window.dst.y = plane->state->dst.y1;
558 	window.dst.w = drm_rect_width(&plane->state->dst);
559 	window.dst.h = drm_rect_height(&plane->state->dst);
560 	window.bits_per_pixel = fb->format->cpp[0] * 8;
561 	window.bottom_up = tegra_fb_is_bottom_up(fb);
562 
563 	/* copy from state */
564 	window.zpos = plane->state->normalized_zpos;
565 	window.tiling = state->tiling;
566 	window.format = state->format;
567 	window.swap = state->swap;
568 
569 	for (i = 0; i < fb->format->num_planes; i++) {
570 		struct tegra_bo *bo = tegra_fb_get_plane(fb, i);
571 
572 		window.base[i] = bo->paddr + fb->offsets[i];
573 
574 		/*
575 		 * Tegra uses a shared stride for UV planes. Framebuffers are
576 		 * already checked for this in the tegra_plane_atomic_check()
577 		 * function, so it's safe to ignore the V-plane pitch here.
578 		 */
579 		if (i < 2)
580 			window.stride[i] = fb->pitches[i];
581 	}
582 
583 	tegra_dc_setup_window(p, &window);
584 }
585 
586 static const struct drm_plane_helper_funcs tegra_plane_helper_funcs = {
587 	.atomic_check = tegra_plane_atomic_check,
588 	.atomic_disable = tegra_plane_atomic_disable,
589 	.atomic_update = tegra_plane_atomic_update,
590 };
591 
592 static unsigned long tegra_plane_get_possible_crtcs(struct drm_device *drm)
593 {
594 	/*
595 	 * Ideally this would use drm_crtc_mask(), but that would require the
596 	 * CRTC to already be in the mode_config's list of CRTCs. However, it
597 	 * will only be added to that list in the drm_crtc_init_with_planes()
598 	 * (in tegra_dc_init()), which in turn requires registration of these
599 	 * planes. So we have ourselves a nice little chicken and egg problem
600 	 * here.
601 	 *
602 	 * We work around this by manually creating the mask from the number
603 	 * of CRTCs that have been registered, and should therefore always be
604 	 * the same as drm_crtc_index() after registration.
605 	 */
606 	return 1 << drm->mode_config.num_crtc;
607 }
608 
609 static struct drm_plane *tegra_primary_plane_create(struct drm_device *drm,
610 						    struct tegra_dc *dc)
611 {
612 	unsigned long possible_crtcs = tegra_plane_get_possible_crtcs(drm);
613 	enum drm_plane_type type = DRM_PLANE_TYPE_PRIMARY;
614 	struct tegra_plane *plane;
615 	unsigned int num_formats;
616 	const u64 *modifiers;
617 	const u32 *formats;
618 	int err;
619 
620 	plane = kzalloc(sizeof(*plane), GFP_KERNEL);
621 	if (!plane)
622 		return ERR_PTR(-ENOMEM);
623 
624 	/* Always use window A as primary window */
625 	plane->offset = 0xa00;
626 	plane->index = 0;
627 	plane->dc = dc;
628 
629 	num_formats = dc->soc->num_primary_formats;
630 	formats = dc->soc->primary_formats;
631 	modifiers = dc->soc->modifiers;
632 
633 	err = drm_universal_plane_init(drm, &plane->base, possible_crtcs,
634 				       &tegra_plane_funcs, formats,
635 				       num_formats, modifiers, type, NULL);
636 	if (err < 0) {
637 		kfree(plane);
638 		return ERR_PTR(err);
639 	}
640 
641 	drm_plane_helper_add(&plane->base, &tegra_plane_helper_funcs);
642 
643 	if (dc->soc->supports_blending)
644 		drm_plane_create_zpos_property(&plane->base, 0, 0, 255);
645 
646 	return &plane->base;
647 }
648 
649 static const u32 tegra_cursor_plane_formats[] = {
650 	DRM_FORMAT_RGBA8888,
651 };
652 
653 static int tegra_cursor_atomic_check(struct drm_plane *plane,
654 				     struct drm_plane_state *state)
655 {
656 	struct tegra_plane *tegra = to_tegra_plane(plane);
657 	int err;
658 
659 	/* no need for further checks if the plane is being disabled */
660 	if (!state->crtc)
661 		return 0;
662 
663 	/* scaling not supported for cursor */
664 	if ((state->src_w >> 16 != state->crtc_w) ||
665 	    (state->src_h >> 16 != state->crtc_h))
666 		return -EINVAL;
667 
668 	/* only square cursors supported */
669 	if (state->src_w != state->src_h)
670 		return -EINVAL;
671 
672 	if (state->crtc_w != 32 && state->crtc_w != 64 &&
673 	    state->crtc_w != 128 && state->crtc_w != 256)
674 		return -EINVAL;
675 
676 	err = tegra_plane_state_add(tegra, state);
677 	if (err < 0)
678 		return err;
679 
680 	return 0;
681 }
682 
683 static void tegra_cursor_atomic_update(struct drm_plane *plane,
684 				       struct drm_plane_state *old_state)
685 {
686 	struct tegra_bo *bo = tegra_fb_get_plane(plane->state->fb, 0);
687 	struct tegra_dc *dc = to_tegra_dc(plane->state->crtc);
688 	struct drm_plane_state *state = plane->state;
689 	u32 value = CURSOR_CLIP_DISPLAY;
690 
691 	/* rien ne va plus */
692 	if (!plane->state->crtc || !plane->state->fb)
693 		return;
694 
695 	switch (state->crtc_w) {
696 	case 32:
697 		value |= CURSOR_SIZE_32x32;
698 		break;
699 
700 	case 64:
701 		value |= CURSOR_SIZE_64x64;
702 		break;
703 
704 	case 128:
705 		value |= CURSOR_SIZE_128x128;
706 		break;
707 
708 	case 256:
709 		value |= CURSOR_SIZE_256x256;
710 		break;
711 
712 	default:
713 		WARN(1, "cursor size %ux%u not supported\n", state->crtc_w,
714 		     state->crtc_h);
715 		return;
716 	}
717 
718 	value |= (bo->paddr >> 10) & 0x3fffff;
719 	tegra_dc_writel(dc, value, DC_DISP_CURSOR_START_ADDR);
720 
721 #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
722 	value = (bo->paddr >> 32) & 0x3;
723 	tegra_dc_writel(dc, value, DC_DISP_CURSOR_START_ADDR_HI);
724 #endif
725 
726 	/* enable cursor and set blend mode */
727 	value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
728 	value |= CURSOR_ENABLE;
729 	tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
730 
731 	value = tegra_dc_readl(dc, DC_DISP_BLEND_CURSOR_CONTROL);
732 	value &= ~CURSOR_DST_BLEND_MASK;
733 	value &= ~CURSOR_SRC_BLEND_MASK;
734 	value |= CURSOR_MODE_NORMAL;
735 	value |= CURSOR_DST_BLEND_NEG_K1_TIMES_SRC;
736 	value |= CURSOR_SRC_BLEND_K1_TIMES_SRC;
737 	value |= CURSOR_ALPHA;
738 	tegra_dc_writel(dc, value, DC_DISP_BLEND_CURSOR_CONTROL);
739 
740 	/* position the cursor */
741 	value = (state->crtc_y & 0x3fff) << 16 | (state->crtc_x & 0x3fff);
742 	tegra_dc_writel(dc, value, DC_DISP_CURSOR_POSITION);
743 }
744 
745 static void tegra_cursor_atomic_disable(struct drm_plane *plane,
746 					struct drm_plane_state *old_state)
747 {
748 	struct tegra_dc *dc;
749 	u32 value;
750 
751 	/* rien ne va plus */
752 	if (!old_state || !old_state->crtc)
753 		return;
754 
755 	dc = to_tegra_dc(old_state->crtc);
756 
757 	value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
758 	value &= ~CURSOR_ENABLE;
759 	tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
760 }
761 
762 static const struct drm_plane_helper_funcs tegra_cursor_plane_helper_funcs = {
763 	.atomic_check = tegra_cursor_atomic_check,
764 	.atomic_update = tegra_cursor_atomic_update,
765 	.atomic_disable = tegra_cursor_atomic_disable,
766 };
767 
768 static struct drm_plane *tegra_dc_cursor_plane_create(struct drm_device *drm,
769 						      struct tegra_dc *dc)
770 {
771 	unsigned long possible_crtcs = tegra_plane_get_possible_crtcs(drm);
772 	struct tegra_plane *plane;
773 	unsigned int num_formats;
774 	const u32 *formats;
775 	int err;
776 
777 	plane = kzalloc(sizeof(*plane), GFP_KERNEL);
778 	if (!plane)
779 		return ERR_PTR(-ENOMEM);
780 
781 	/*
782 	 * This index is kind of fake. The cursor isn't a regular plane, but
783 	 * its update and activation request bits in DC_CMD_STATE_CONTROL do
784 	 * use the same programming. Setting this fake index here allows the
785 	 * code in tegra_add_plane_state() to do the right thing without the
786 	 * need to special-casing the cursor plane.
787 	 */
788 	plane->index = 6;
789 	plane->dc = dc;
790 
791 	num_formats = ARRAY_SIZE(tegra_cursor_plane_formats);
792 	formats = tegra_cursor_plane_formats;
793 
794 	err = drm_universal_plane_init(drm, &plane->base, possible_crtcs,
795 				       &tegra_plane_funcs, formats,
796 				       num_formats, NULL,
797 				       DRM_PLANE_TYPE_CURSOR, NULL);
798 	if (err < 0) {
799 		kfree(plane);
800 		return ERR_PTR(err);
801 	}
802 
803 	drm_plane_helper_add(&plane->base, &tegra_cursor_plane_helper_funcs);
804 
805 	return &plane->base;
806 }
807 
808 static const u32 tegra20_overlay_formats[] = {
809 	DRM_FORMAT_ARGB4444,
810 	DRM_FORMAT_ARGB1555,
811 	DRM_FORMAT_RGB565,
812 	DRM_FORMAT_RGBA5551,
813 	DRM_FORMAT_ABGR8888,
814 	DRM_FORMAT_ARGB8888,
815 	/* non-native formats */
816 	DRM_FORMAT_XRGB1555,
817 	DRM_FORMAT_RGBX5551,
818 	DRM_FORMAT_XBGR8888,
819 	DRM_FORMAT_XRGB8888,
820 	/* planar formats */
821 	DRM_FORMAT_UYVY,
822 	DRM_FORMAT_YUYV,
823 	DRM_FORMAT_YUV420,
824 	DRM_FORMAT_YUV422,
825 };
826 
827 static const u32 tegra114_overlay_formats[] = {
828 	DRM_FORMAT_ARGB4444,
829 	DRM_FORMAT_ARGB1555,
830 	DRM_FORMAT_RGB565,
831 	DRM_FORMAT_RGBA5551,
832 	DRM_FORMAT_ABGR8888,
833 	DRM_FORMAT_ARGB8888,
834 	/* new on Tegra114 */
835 	DRM_FORMAT_ABGR4444,
836 	DRM_FORMAT_ABGR1555,
837 	DRM_FORMAT_BGRA5551,
838 	DRM_FORMAT_XRGB1555,
839 	DRM_FORMAT_RGBX5551,
840 	DRM_FORMAT_XBGR1555,
841 	DRM_FORMAT_BGRX5551,
842 	DRM_FORMAT_BGR565,
843 	DRM_FORMAT_BGRA8888,
844 	DRM_FORMAT_RGBA8888,
845 	DRM_FORMAT_XRGB8888,
846 	DRM_FORMAT_XBGR8888,
847 	/* planar formats */
848 	DRM_FORMAT_UYVY,
849 	DRM_FORMAT_YUYV,
850 	DRM_FORMAT_YUV420,
851 	DRM_FORMAT_YUV422,
852 };
853 
854 static const u32 tegra124_overlay_formats[] = {
855 	DRM_FORMAT_ARGB4444,
856 	DRM_FORMAT_ARGB1555,
857 	DRM_FORMAT_RGB565,
858 	DRM_FORMAT_RGBA5551,
859 	DRM_FORMAT_ABGR8888,
860 	DRM_FORMAT_ARGB8888,
861 	/* new on Tegra114 */
862 	DRM_FORMAT_ABGR4444,
863 	DRM_FORMAT_ABGR1555,
864 	DRM_FORMAT_BGRA5551,
865 	DRM_FORMAT_XRGB1555,
866 	DRM_FORMAT_RGBX5551,
867 	DRM_FORMAT_XBGR1555,
868 	DRM_FORMAT_BGRX5551,
869 	DRM_FORMAT_BGR565,
870 	DRM_FORMAT_BGRA8888,
871 	DRM_FORMAT_RGBA8888,
872 	DRM_FORMAT_XRGB8888,
873 	DRM_FORMAT_XBGR8888,
874 	/* new on Tegra124 */
875 	DRM_FORMAT_RGBX8888,
876 	DRM_FORMAT_BGRX8888,
877 	/* planar formats */
878 	DRM_FORMAT_UYVY,
879 	DRM_FORMAT_YUYV,
880 	DRM_FORMAT_YUV420,
881 	DRM_FORMAT_YUV422,
882 };
883 
884 static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
885 						       struct tegra_dc *dc,
886 						       unsigned int index,
887 						       bool cursor)
888 {
889 	unsigned long possible_crtcs = tegra_plane_get_possible_crtcs(drm);
890 	struct tegra_plane *plane;
891 	unsigned int num_formats;
892 	enum drm_plane_type type;
893 	const u32 *formats;
894 	int err;
895 
896 	plane = kzalloc(sizeof(*plane), GFP_KERNEL);
897 	if (!plane)
898 		return ERR_PTR(-ENOMEM);
899 
900 	plane->offset = 0xa00 + 0x200 * index;
901 	plane->index = index;
902 	plane->dc = dc;
903 
904 	num_formats = dc->soc->num_overlay_formats;
905 	formats = dc->soc->overlay_formats;
906 
907 	if (!cursor)
908 		type = DRM_PLANE_TYPE_OVERLAY;
909 	else
910 		type = DRM_PLANE_TYPE_CURSOR;
911 
912 	err = drm_universal_plane_init(drm, &plane->base, possible_crtcs,
913 				       &tegra_plane_funcs, formats,
914 				       num_formats, NULL, type, NULL);
915 	if (err < 0) {
916 		kfree(plane);
917 		return ERR_PTR(err);
918 	}
919 
920 	drm_plane_helper_add(&plane->base, &tegra_plane_helper_funcs);
921 
922 	if (dc->soc->supports_blending)
923 		drm_plane_create_zpos_property(&plane->base, 0, 0, 255);
924 
925 	return &plane->base;
926 }
927 
928 static struct drm_plane *tegra_dc_add_shared_planes(struct drm_device *drm,
929 						    struct tegra_dc *dc)
930 {
931 	struct drm_plane *plane, *primary = NULL;
932 	unsigned int i, j;
933 
934 	for (i = 0; i < dc->soc->num_wgrps; i++) {
935 		const struct tegra_windowgroup_soc *wgrp = &dc->soc->wgrps[i];
936 
937 		if (wgrp->dc == dc->pipe) {
938 			for (j = 0; j < wgrp->num_windows; j++) {
939 				unsigned int index = wgrp->windows[j];
940 
941 				plane = tegra_shared_plane_create(drm, dc,
942 								  wgrp->index,
943 								  index);
944 				if (IS_ERR(plane))
945 					return plane;
946 
947 				/*
948 				 * Choose the first shared plane owned by this
949 				 * head as the primary plane.
950 				 */
951 				if (!primary) {
952 					plane->type = DRM_PLANE_TYPE_PRIMARY;
953 					primary = plane;
954 				}
955 			}
956 		}
957 	}
958 
959 	return primary;
960 }
961 
962 static struct drm_plane *tegra_dc_add_planes(struct drm_device *drm,
963 					     struct tegra_dc *dc)
964 {
965 	struct drm_plane *planes[2], *primary;
966 	unsigned int planes_num;
967 	unsigned int i;
968 	int err;
969 
970 	primary = tegra_primary_plane_create(drm, dc);
971 	if (IS_ERR(primary))
972 		return primary;
973 
974 	if (dc->soc->supports_cursor)
975 		planes_num = 2;
976 	else
977 		planes_num = 1;
978 
979 	for (i = 0; i < planes_num; i++) {
980 		planes[i] = tegra_dc_overlay_plane_create(drm, dc, 1 + i,
981 							  false);
982 		if (IS_ERR(planes[i])) {
983 			err = PTR_ERR(planes[i]);
984 
985 			while (i--)
986 				tegra_plane_funcs.destroy(planes[i]);
987 
988 			tegra_plane_funcs.destroy(primary);
989 			return ERR_PTR(err);
990 		}
991 	}
992 
993 	return primary;
994 }
995 
996 static void tegra_dc_destroy(struct drm_crtc *crtc)
997 {
998 	drm_crtc_cleanup(crtc);
999 }
1000 
1001 static void tegra_crtc_reset(struct drm_crtc *crtc)
1002 {
1003 	struct tegra_dc_state *state;
1004 
1005 	if (crtc->state)
1006 		__drm_atomic_helper_crtc_destroy_state(crtc->state);
1007 
1008 	kfree(crtc->state);
1009 	crtc->state = NULL;
1010 
1011 	state = kzalloc(sizeof(*state), GFP_KERNEL);
1012 	if (state) {
1013 		crtc->state = &state->base;
1014 		crtc->state->crtc = crtc;
1015 	}
1016 
1017 	drm_crtc_vblank_reset(crtc);
1018 }
1019 
1020 static struct drm_crtc_state *
1021 tegra_crtc_atomic_duplicate_state(struct drm_crtc *crtc)
1022 {
1023 	struct tegra_dc_state *state = to_dc_state(crtc->state);
1024 	struct tegra_dc_state *copy;
1025 
1026 	copy = kmalloc(sizeof(*copy), GFP_KERNEL);
1027 	if (!copy)
1028 		return NULL;
1029 
1030 	__drm_atomic_helper_crtc_duplicate_state(crtc, &copy->base);
1031 	copy->clk = state->clk;
1032 	copy->pclk = state->pclk;
1033 	copy->div = state->div;
1034 	copy->planes = state->planes;
1035 
1036 	return &copy->base;
1037 }
1038 
1039 static void tegra_crtc_atomic_destroy_state(struct drm_crtc *crtc,
1040 					    struct drm_crtc_state *state)
1041 {
1042 	__drm_atomic_helper_crtc_destroy_state(state);
1043 	kfree(state);
1044 }
1045 
1046 #define DEBUGFS_REG32(_name) { .name = #_name, .offset = _name }
1047 
1048 static const struct debugfs_reg32 tegra_dc_regs[] = {
1049 	DEBUGFS_REG32(DC_CMD_GENERAL_INCR_SYNCPT),
1050 	DEBUGFS_REG32(DC_CMD_GENERAL_INCR_SYNCPT_CNTRL),
1051 	DEBUGFS_REG32(DC_CMD_GENERAL_INCR_SYNCPT_ERROR),
1052 	DEBUGFS_REG32(DC_CMD_WIN_A_INCR_SYNCPT),
1053 	DEBUGFS_REG32(DC_CMD_WIN_A_INCR_SYNCPT_CNTRL),
1054 	DEBUGFS_REG32(DC_CMD_WIN_A_INCR_SYNCPT_ERROR),
1055 	DEBUGFS_REG32(DC_CMD_WIN_B_INCR_SYNCPT),
1056 	DEBUGFS_REG32(DC_CMD_WIN_B_INCR_SYNCPT_CNTRL),
1057 	DEBUGFS_REG32(DC_CMD_WIN_B_INCR_SYNCPT_ERROR),
1058 	DEBUGFS_REG32(DC_CMD_WIN_C_INCR_SYNCPT),
1059 	DEBUGFS_REG32(DC_CMD_WIN_C_INCR_SYNCPT_CNTRL),
1060 	DEBUGFS_REG32(DC_CMD_WIN_C_INCR_SYNCPT_ERROR),
1061 	DEBUGFS_REG32(DC_CMD_CONT_SYNCPT_VSYNC),
1062 	DEBUGFS_REG32(DC_CMD_DISPLAY_COMMAND_OPTION0),
1063 	DEBUGFS_REG32(DC_CMD_DISPLAY_COMMAND),
1064 	DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE),
1065 	DEBUGFS_REG32(DC_CMD_DISPLAY_POWER_CONTROL),
1066 	DEBUGFS_REG32(DC_CMD_INT_STATUS),
1067 	DEBUGFS_REG32(DC_CMD_INT_MASK),
1068 	DEBUGFS_REG32(DC_CMD_INT_ENABLE),
1069 	DEBUGFS_REG32(DC_CMD_INT_TYPE),
1070 	DEBUGFS_REG32(DC_CMD_INT_POLARITY),
1071 	DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE1),
1072 	DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE2),
1073 	DEBUGFS_REG32(DC_CMD_SIGNAL_RAISE3),
1074 	DEBUGFS_REG32(DC_CMD_STATE_ACCESS),
1075 	DEBUGFS_REG32(DC_CMD_STATE_CONTROL),
1076 	DEBUGFS_REG32(DC_CMD_DISPLAY_WINDOW_HEADER),
1077 	DEBUGFS_REG32(DC_CMD_REG_ACT_CONTROL),
1078 	DEBUGFS_REG32(DC_COM_CRC_CONTROL),
1079 	DEBUGFS_REG32(DC_COM_CRC_CHECKSUM),
1080 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(0)),
1081 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(1)),
1082 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(2)),
1083 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_ENABLE(3)),
1084 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(0)),
1085 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(1)),
1086 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(2)),
1087 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_POLARITY(3)),
1088 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(0)),
1089 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(1)),
1090 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(2)),
1091 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_DATA(3)),
1092 	DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(0)),
1093 	DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(1)),
1094 	DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(2)),
1095 	DEBUGFS_REG32(DC_COM_PIN_INPUT_ENABLE(3)),
1096 	DEBUGFS_REG32(DC_COM_PIN_INPUT_DATA(0)),
1097 	DEBUGFS_REG32(DC_COM_PIN_INPUT_DATA(1)),
1098 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(0)),
1099 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(1)),
1100 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(2)),
1101 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(3)),
1102 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(4)),
1103 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(5)),
1104 	DEBUGFS_REG32(DC_COM_PIN_OUTPUT_SELECT(6)),
1105 	DEBUGFS_REG32(DC_COM_PIN_MISC_CONTROL),
1106 	DEBUGFS_REG32(DC_COM_PIN_PM0_CONTROL),
1107 	DEBUGFS_REG32(DC_COM_PIN_PM0_DUTY_CYCLE),
1108 	DEBUGFS_REG32(DC_COM_PIN_PM1_CONTROL),
1109 	DEBUGFS_REG32(DC_COM_PIN_PM1_DUTY_CYCLE),
1110 	DEBUGFS_REG32(DC_COM_SPI_CONTROL),
1111 	DEBUGFS_REG32(DC_COM_SPI_START_BYTE),
1112 	DEBUGFS_REG32(DC_COM_HSPI_WRITE_DATA_AB),
1113 	DEBUGFS_REG32(DC_COM_HSPI_WRITE_DATA_CD),
1114 	DEBUGFS_REG32(DC_COM_HSPI_CS_DC),
1115 	DEBUGFS_REG32(DC_COM_SCRATCH_REGISTER_A),
1116 	DEBUGFS_REG32(DC_COM_SCRATCH_REGISTER_B),
1117 	DEBUGFS_REG32(DC_COM_GPIO_CTRL),
1118 	DEBUGFS_REG32(DC_COM_GPIO_DEBOUNCE_COUNTER),
1119 	DEBUGFS_REG32(DC_COM_CRC_CHECKSUM_LATCHED),
1120 	DEBUGFS_REG32(DC_DISP_DISP_SIGNAL_OPTIONS0),
1121 	DEBUGFS_REG32(DC_DISP_DISP_SIGNAL_OPTIONS1),
1122 	DEBUGFS_REG32(DC_DISP_DISP_WIN_OPTIONS),
1123 	DEBUGFS_REG32(DC_DISP_DISP_MEM_HIGH_PRIORITY),
1124 	DEBUGFS_REG32(DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER),
1125 	DEBUGFS_REG32(DC_DISP_DISP_TIMING_OPTIONS),
1126 	DEBUGFS_REG32(DC_DISP_REF_TO_SYNC),
1127 	DEBUGFS_REG32(DC_DISP_SYNC_WIDTH),
1128 	DEBUGFS_REG32(DC_DISP_BACK_PORCH),
1129 	DEBUGFS_REG32(DC_DISP_ACTIVE),
1130 	DEBUGFS_REG32(DC_DISP_FRONT_PORCH),
1131 	DEBUGFS_REG32(DC_DISP_H_PULSE0_CONTROL),
1132 	DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_A),
1133 	DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_B),
1134 	DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_C),
1135 	DEBUGFS_REG32(DC_DISP_H_PULSE0_POSITION_D),
1136 	DEBUGFS_REG32(DC_DISP_H_PULSE1_CONTROL),
1137 	DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_A),
1138 	DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_B),
1139 	DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_C),
1140 	DEBUGFS_REG32(DC_DISP_H_PULSE1_POSITION_D),
1141 	DEBUGFS_REG32(DC_DISP_H_PULSE2_CONTROL),
1142 	DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_A),
1143 	DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_B),
1144 	DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_C),
1145 	DEBUGFS_REG32(DC_DISP_H_PULSE2_POSITION_D),
1146 	DEBUGFS_REG32(DC_DISP_V_PULSE0_CONTROL),
1147 	DEBUGFS_REG32(DC_DISP_V_PULSE0_POSITION_A),
1148 	DEBUGFS_REG32(DC_DISP_V_PULSE0_POSITION_B),
1149 	DEBUGFS_REG32(DC_DISP_V_PULSE0_POSITION_C),
1150 	DEBUGFS_REG32(DC_DISP_V_PULSE1_CONTROL),
1151 	DEBUGFS_REG32(DC_DISP_V_PULSE1_POSITION_A),
1152 	DEBUGFS_REG32(DC_DISP_V_PULSE1_POSITION_B),
1153 	DEBUGFS_REG32(DC_DISP_V_PULSE1_POSITION_C),
1154 	DEBUGFS_REG32(DC_DISP_V_PULSE2_CONTROL),
1155 	DEBUGFS_REG32(DC_DISP_V_PULSE2_POSITION_A),
1156 	DEBUGFS_REG32(DC_DISP_V_PULSE3_CONTROL),
1157 	DEBUGFS_REG32(DC_DISP_V_PULSE3_POSITION_A),
1158 	DEBUGFS_REG32(DC_DISP_M0_CONTROL),
1159 	DEBUGFS_REG32(DC_DISP_M1_CONTROL),
1160 	DEBUGFS_REG32(DC_DISP_DI_CONTROL),
1161 	DEBUGFS_REG32(DC_DISP_PP_CONTROL),
1162 	DEBUGFS_REG32(DC_DISP_PP_SELECT_A),
1163 	DEBUGFS_REG32(DC_DISP_PP_SELECT_B),
1164 	DEBUGFS_REG32(DC_DISP_PP_SELECT_C),
1165 	DEBUGFS_REG32(DC_DISP_PP_SELECT_D),
1166 	DEBUGFS_REG32(DC_DISP_DISP_CLOCK_CONTROL),
1167 	DEBUGFS_REG32(DC_DISP_DISP_INTERFACE_CONTROL),
1168 	DEBUGFS_REG32(DC_DISP_DISP_COLOR_CONTROL),
1169 	DEBUGFS_REG32(DC_DISP_SHIFT_CLOCK_OPTIONS),
1170 	DEBUGFS_REG32(DC_DISP_DATA_ENABLE_OPTIONS),
1171 	DEBUGFS_REG32(DC_DISP_SERIAL_INTERFACE_OPTIONS),
1172 	DEBUGFS_REG32(DC_DISP_LCD_SPI_OPTIONS),
1173 	DEBUGFS_REG32(DC_DISP_BORDER_COLOR),
1174 	DEBUGFS_REG32(DC_DISP_COLOR_KEY0_LOWER),
1175 	DEBUGFS_REG32(DC_DISP_COLOR_KEY0_UPPER),
1176 	DEBUGFS_REG32(DC_DISP_COLOR_KEY1_LOWER),
1177 	DEBUGFS_REG32(DC_DISP_COLOR_KEY1_UPPER),
1178 	DEBUGFS_REG32(DC_DISP_CURSOR_FOREGROUND),
1179 	DEBUGFS_REG32(DC_DISP_CURSOR_BACKGROUND),
1180 	DEBUGFS_REG32(DC_DISP_CURSOR_START_ADDR),
1181 	DEBUGFS_REG32(DC_DISP_CURSOR_START_ADDR_NS),
1182 	DEBUGFS_REG32(DC_DISP_CURSOR_POSITION),
1183 	DEBUGFS_REG32(DC_DISP_CURSOR_POSITION_NS),
1184 	DEBUGFS_REG32(DC_DISP_INIT_SEQ_CONTROL),
1185 	DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_A),
1186 	DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_B),
1187 	DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_C),
1188 	DEBUGFS_REG32(DC_DISP_SPI_INIT_SEQ_DATA_D),
1189 	DEBUGFS_REG32(DC_DISP_DC_MCCIF_FIFOCTRL),
1190 	DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY0A_HYST),
1191 	DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY0B_HYST),
1192 	DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY1A_HYST),
1193 	DEBUGFS_REG32(DC_DISP_MCCIF_DISPLAY1B_HYST),
1194 	DEBUGFS_REG32(DC_DISP_DAC_CRT_CTRL),
1195 	DEBUGFS_REG32(DC_DISP_DISP_MISC_CONTROL),
1196 	DEBUGFS_REG32(DC_DISP_SD_CONTROL),
1197 	DEBUGFS_REG32(DC_DISP_SD_CSC_COEFF),
1198 	DEBUGFS_REG32(DC_DISP_SD_LUT(0)),
1199 	DEBUGFS_REG32(DC_DISP_SD_LUT(1)),
1200 	DEBUGFS_REG32(DC_DISP_SD_LUT(2)),
1201 	DEBUGFS_REG32(DC_DISP_SD_LUT(3)),
1202 	DEBUGFS_REG32(DC_DISP_SD_LUT(4)),
1203 	DEBUGFS_REG32(DC_DISP_SD_LUT(5)),
1204 	DEBUGFS_REG32(DC_DISP_SD_LUT(6)),
1205 	DEBUGFS_REG32(DC_DISP_SD_LUT(7)),
1206 	DEBUGFS_REG32(DC_DISP_SD_LUT(8)),
1207 	DEBUGFS_REG32(DC_DISP_SD_FLICKER_CONTROL),
1208 	DEBUGFS_REG32(DC_DISP_DC_PIXEL_COUNT),
1209 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(0)),
1210 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(1)),
1211 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(2)),
1212 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(3)),
1213 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(4)),
1214 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(5)),
1215 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(6)),
1216 	DEBUGFS_REG32(DC_DISP_SD_HISTOGRAM(7)),
1217 	DEBUGFS_REG32(DC_DISP_SD_BL_TF(0)),
1218 	DEBUGFS_REG32(DC_DISP_SD_BL_TF(1)),
1219 	DEBUGFS_REG32(DC_DISP_SD_BL_TF(2)),
1220 	DEBUGFS_REG32(DC_DISP_SD_BL_TF(3)),
1221 	DEBUGFS_REG32(DC_DISP_SD_BL_CONTROL),
1222 	DEBUGFS_REG32(DC_DISP_SD_HW_K_VALUES),
1223 	DEBUGFS_REG32(DC_DISP_SD_MAN_K_VALUES),
1224 	DEBUGFS_REG32(DC_DISP_CURSOR_START_ADDR_HI),
1225 	DEBUGFS_REG32(DC_DISP_BLEND_CURSOR_CONTROL),
1226 	DEBUGFS_REG32(DC_WIN_WIN_OPTIONS),
1227 	DEBUGFS_REG32(DC_WIN_BYTE_SWAP),
1228 	DEBUGFS_REG32(DC_WIN_BUFFER_CONTROL),
1229 	DEBUGFS_REG32(DC_WIN_COLOR_DEPTH),
1230 	DEBUGFS_REG32(DC_WIN_POSITION),
1231 	DEBUGFS_REG32(DC_WIN_SIZE),
1232 	DEBUGFS_REG32(DC_WIN_PRESCALED_SIZE),
1233 	DEBUGFS_REG32(DC_WIN_H_INITIAL_DDA),
1234 	DEBUGFS_REG32(DC_WIN_V_INITIAL_DDA),
1235 	DEBUGFS_REG32(DC_WIN_DDA_INC),
1236 	DEBUGFS_REG32(DC_WIN_LINE_STRIDE),
1237 	DEBUGFS_REG32(DC_WIN_BUF_STRIDE),
1238 	DEBUGFS_REG32(DC_WIN_UV_BUF_STRIDE),
1239 	DEBUGFS_REG32(DC_WIN_BUFFER_ADDR_MODE),
1240 	DEBUGFS_REG32(DC_WIN_DV_CONTROL),
1241 	DEBUGFS_REG32(DC_WIN_BLEND_NOKEY),
1242 	DEBUGFS_REG32(DC_WIN_BLEND_1WIN),
1243 	DEBUGFS_REG32(DC_WIN_BLEND_2WIN_X),
1244 	DEBUGFS_REG32(DC_WIN_BLEND_2WIN_Y),
1245 	DEBUGFS_REG32(DC_WIN_BLEND_3WIN_XY),
1246 	DEBUGFS_REG32(DC_WIN_HP_FETCH_CONTROL),
1247 	DEBUGFS_REG32(DC_WINBUF_START_ADDR),
1248 	DEBUGFS_REG32(DC_WINBUF_START_ADDR_NS),
1249 	DEBUGFS_REG32(DC_WINBUF_START_ADDR_U),
1250 	DEBUGFS_REG32(DC_WINBUF_START_ADDR_U_NS),
1251 	DEBUGFS_REG32(DC_WINBUF_START_ADDR_V),
1252 	DEBUGFS_REG32(DC_WINBUF_START_ADDR_V_NS),
1253 	DEBUGFS_REG32(DC_WINBUF_ADDR_H_OFFSET),
1254 	DEBUGFS_REG32(DC_WINBUF_ADDR_H_OFFSET_NS),
1255 	DEBUGFS_REG32(DC_WINBUF_ADDR_V_OFFSET),
1256 	DEBUGFS_REG32(DC_WINBUF_ADDR_V_OFFSET_NS),
1257 	DEBUGFS_REG32(DC_WINBUF_UFLOW_STATUS),
1258 	DEBUGFS_REG32(DC_WINBUF_AD_UFLOW_STATUS),
1259 	DEBUGFS_REG32(DC_WINBUF_BD_UFLOW_STATUS),
1260 	DEBUGFS_REG32(DC_WINBUF_CD_UFLOW_STATUS),
1261 };
1262 
1263 static int tegra_dc_show_regs(struct seq_file *s, void *data)
1264 {
1265 	struct drm_info_node *node = s->private;
1266 	struct tegra_dc *dc = node->info_ent->data;
1267 	unsigned int i;
1268 	int err = 0;
1269 
1270 	drm_modeset_lock(&dc->base.mutex, NULL);
1271 
1272 	if (!dc->base.state->active) {
1273 		err = -EBUSY;
1274 		goto unlock;
1275 	}
1276 
1277 	for (i = 0; i < ARRAY_SIZE(tegra_dc_regs); i++) {
1278 		unsigned int offset = tegra_dc_regs[i].offset;
1279 
1280 		seq_printf(s, "%-40s %#05x %08x\n", tegra_dc_regs[i].name,
1281 			   offset, tegra_dc_readl(dc, offset));
1282 	}
1283 
1284 unlock:
1285 	drm_modeset_unlock(&dc->base.mutex);
1286 	return err;
1287 }
1288 
1289 static int tegra_dc_show_crc(struct seq_file *s, void *data)
1290 {
1291 	struct drm_info_node *node = s->private;
1292 	struct tegra_dc *dc = node->info_ent->data;
1293 	int err = 0;
1294 	u32 value;
1295 
1296 	drm_modeset_lock(&dc->base.mutex, NULL);
1297 
1298 	if (!dc->base.state->active) {
1299 		err = -EBUSY;
1300 		goto unlock;
1301 	}
1302 
1303 	value = DC_COM_CRC_CONTROL_ACTIVE_DATA | DC_COM_CRC_CONTROL_ENABLE;
1304 	tegra_dc_writel(dc, value, DC_COM_CRC_CONTROL);
1305 	tegra_dc_commit(dc);
1306 
1307 	drm_crtc_wait_one_vblank(&dc->base);
1308 	drm_crtc_wait_one_vblank(&dc->base);
1309 
1310 	value = tegra_dc_readl(dc, DC_COM_CRC_CHECKSUM);
1311 	seq_printf(s, "%08x\n", value);
1312 
1313 	tegra_dc_writel(dc, 0, DC_COM_CRC_CONTROL);
1314 
1315 unlock:
1316 	drm_modeset_unlock(&dc->base.mutex);
1317 	return err;
1318 }
1319 
1320 static int tegra_dc_show_stats(struct seq_file *s, void *data)
1321 {
1322 	struct drm_info_node *node = s->private;
1323 	struct tegra_dc *dc = node->info_ent->data;
1324 
1325 	seq_printf(s, "frames: %lu\n", dc->stats.frames);
1326 	seq_printf(s, "vblank: %lu\n", dc->stats.vblank);
1327 	seq_printf(s, "underflow: %lu\n", dc->stats.underflow);
1328 	seq_printf(s, "overflow: %lu\n", dc->stats.overflow);
1329 
1330 	return 0;
1331 }
1332 
1333 static struct drm_info_list debugfs_files[] = {
1334 	{ "regs", tegra_dc_show_regs, 0, NULL },
1335 	{ "crc", tegra_dc_show_crc, 0, NULL },
1336 	{ "stats", tegra_dc_show_stats, 0, NULL },
1337 };
1338 
1339 static int tegra_dc_late_register(struct drm_crtc *crtc)
1340 {
1341 	unsigned int i, count = ARRAY_SIZE(debugfs_files);
1342 	struct drm_minor *minor = crtc->dev->primary;
1343 	struct dentry *root;
1344 	struct tegra_dc *dc = to_tegra_dc(crtc);
1345 	int err;
1346 
1347 #ifdef CONFIG_DEBUG_FS
1348 	root = crtc->debugfs_entry;
1349 #else
1350 	root = NULL;
1351 #endif
1352 
1353 	dc->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
1354 				    GFP_KERNEL);
1355 	if (!dc->debugfs_files)
1356 		return -ENOMEM;
1357 
1358 	for (i = 0; i < count; i++)
1359 		dc->debugfs_files[i].data = dc;
1360 
1361 	err = drm_debugfs_create_files(dc->debugfs_files, count, root, minor);
1362 	if (err < 0)
1363 		goto free;
1364 
1365 	return 0;
1366 
1367 free:
1368 	kfree(dc->debugfs_files);
1369 	dc->debugfs_files = NULL;
1370 
1371 	return err;
1372 }
1373 
1374 static void tegra_dc_early_unregister(struct drm_crtc *crtc)
1375 {
1376 	unsigned int count = ARRAY_SIZE(debugfs_files);
1377 	struct drm_minor *minor = crtc->dev->primary;
1378 	struct tegra_dc *dc = to_tegra_dc(crtc);
1379 
1380 	drm_debugfs_remove_files(dc->debugfs_files, count, minor);
1381 	kfree(dc->debugfs_files);
1382 	dc->debugfs_files = NULL;
1383 }
1384 
1385 static u32 tegra_dc_get_vblank_counter(struct drm_crtc *crtc)
1386 {
1387 	struct tegra_dc *dc = to_tegra_dc(crtc);
1388 
1389 	/* XXX vblank syncpoints don't work with nvdisplay yet */
1390 	if (dc->syncpt && !dc->soc->has_nvdisplay)
1391 		return host1x_syncpt_read(dc->syncpt);
1392 
1393 	/* fallback to software emulated VBLANK counter */
1394 	return (u32)drm_crtc_vblank_count(&dc->base);
1395 }
1396 
1397 static int tegra_dc_enable_vblank(struct drm_crtc *crtc)
1398 {
1399 	struct tegra_dc *dc = to_tegra_dc(crtc);
1400 	u32 value;
1401 
1402 	value = tegra_dc_readl(dc, DC_CMD_INT_MASK);
1403 	value |= VBLANK_INT;
1404 	tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
1405 
1406 	return 0;
1407 }
1408 
1409 static void tegra_dc_disable_vblank(struct drm_crtc *crtc)
1410 {
1411 	struct tegra_dc *dc = to_tegra_dc(crtc);
1412 	u32 value;
1413 
1414 	value = tegra_dc_readl(dc, DC_CMD_INT_MASK);
1415 	value &= ~VBLANK_INT;
1416 	tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
1417 }
1418 
1419 static const struct drm_crtc_funcs tegra_crtc_funcs = {
1420 	.page_flip = drm_atomic_helper_page_flip,
1421 	.set_config = drm_atomic_helper_set_config,
1422 	.destroy = tegra_dc_destroy,
1423 	.reset = tegra_crtc_reset,
1424 	.atomic_duplicate_state = tegra_crtc_atomic_duplicate_state,
1425 	.atomic_destroy_state = tegra_crtc_atomic_destroy_state,
1426 	.late_register = tegra_dc_late_register,
1427 	.early_unregister = tegra_dc_early_unregister,
1428 	.get_vblank_counter = tegra_dc_get_vblank_counter,
1429 	.enable_vblank = tegra_dc_enable_vblank,
1430 	.disable_vblank = tegra_dc_disable_vblank,
1431 };
1432 
1433 static int tegra_dc_set_timings(struct tegra_dc *dc,
1434 				struct drm_display_mode *mode)
1435 {
1436 	unsigned int h_ref_to_sync = 1;
1437 	unsigned int v_ref_to_sync = 1;
1438 	unsigned long value;
1439 
1440 	if (!dc->soc->has_nvdisplay) {
1441 		tegra_dc_writel(dc, 0x0, DC_DISP_DISP_TIMING_OPTIONS);
1442 
1443 		value = (v_ref_to_sync << 16) | h_ref_to_sync;
1444 		tegra_dc_writel(dc, value, DC_DISP_REF_TO_SYNC);
1445 	}
1446 
1447 	value = ((mode->vsync_end - mode->vsync_start) << 16) |
1448 		((mode->hsync_end - mode->hsync_start) <<  0);
1449 	tegra_dc_writel(dc, value, DC_DISP_SYNC_WIDTH);
1450 
1451 	value = ((mode->vtotal - mode->vsync_end) << 16) |
1452 		((mode->htotal - mode->hsync_end) <<  0);
1453 	tegra_dc_writel(dc, value, DC_DISP_BACK_PORCH);
1454 
1455 	value = ((mode->vsync_start - mode->vdisplay) << 16) |
1456 		((mode->hsync_start - mode->hdisplay) <<  0);
1457 	tegra_dc_writel(dc, value, DC_DISP_FRONT_PORCH);
1458 
1459 	value = (mode->vdisplay << 16) | mode->hdisplay;
1460 	tegra_dc_writel(dc, value, DC_DISP_ACTIVE);
1461 
1462 	return 0;
1463 }
1464 
1465 /**
1466  * tegra_dc_state_setup_clock - check clock settings and store them in atomic
1467  *     state
1468  * @dc: display controller
1469  * @crtc_state: CRTC atomic state
1470  * @clk: parent clock for display controller
1471  * @pclk: pixel clock
1472  * @div: shift clock divider
1473  *
1474  * Returns:
1475  * 0 on success or a negative error-code on failure.
1476  */
1477 int tegra_dc_state_setup_clock(struct tegra_dc *dc,
1478 			       struct drm_crtc_state *crtc_state,
1479 			       struct clk *clk, unsigned long pclk,
1480 			       unsigned int div)
1481 {
1482 	struct tegra_dc_state *state = to_dc_state(crtc_state);
1483 
1484 	if (!clk_has_parent(dc->clk, clk))
1485 		return -EINVAL;
1486 
1487 	state->clk = clk;
1488 	state->pclk = pclk;
1489 	state->div = div;
1490 
1491 	return 0;
1492 }
1493 
1494 static void tegra_dc_commit_state(struct tegra_dc *dc,
1495 				  struct tegra_dc_state *state)
1496 {
1497 	u32 value;
1498 	int err;
1499 
1500 	err = clk_set_parent(dc->clk, state->clk);
1501 	if (err < 0)
1502 		dev_err(dc->dev, "failed to set parent clock: %d\n", err);
1503 
1504 	/*
1505 	 * Outputs may not want to change the parent clock rate. This is only
1506 	 * relevant to Tegra20 where only a single display PLL is available.
1507 	 * Since that PLL would typically be used for HDMI, an internal LVDS
1508 	 * panel would need to be driven by some other clock such as PLL_P
1509 	 * which is shared with other peripherals. Changing the clock rate
1510 	 * should therefore be avoided.
1511 	 */
1512 	if (state->pclk > 0) {
1513 		err = clk_set_rate(state->clk, state->pclk);
1514 		if (err < 0)
1515 			dev_err(dc->dev,
1516 				"failed to set clock rate to %lu Hz\n",
1517 				state->pclk);
1518 	}
1519 
1520 	DRM_DEBUG_KMS("rate: %lu, div: %u\n", clk_get_rate(dc->clk),
1521 		      state->div);
1522 	DRM_DEBUG_KMS("pclk: %lu\n", state->pclk);
1523 
1524 	if (!dc->soc->has_nvdisplay) {
1525 		value = SHIFT_CLK_DIVIDER(state->div) | PIXEL_CLK_DIVIDER_PCD1;
1526 		tegra_dc_writel(dc, value, DC_DISP_DISP_CLOCK_CONTROL);
1527 	}
1528 
1529 	err = clk_set_rate(dc->clk, state->pclk);
1530 	if (err < 0)
1531 		dev_err(dc->dev, "failed to set clock %pC to %lu Hz: %d\n",
1532 			dc->clk, state->pclk, err);
1533 }
1534 
1535 static void tegra_dc_stop(struct tegra_dc *dc)
1536 {
1537 	u32 value;
1538 
1539 	/* stop the display controller */
1540 	value = tegra_dc_readl(dc, DC_CMD_DISPLAY_COMMAND);
1541 	value &= ~DISP_CTRL_MODE_MASK;
1542 	tegra_dc_writel(dc, value, DC_CMD_DISPLAY_COMMAND);
1543 
1544 	tegra_dc_commit(dc);
1545 }
1546 
1547 static bool tegra_dc_idle(struct tegra_dc *dc)
1548 {
1549 	u32 value;
1550 
1551 	value = tegra_dc_readl_active(dc, DC_CMD_DISPLAY_COMMAND);
1552 
1553 	return (value & DISP_CTRL_MODE_MASK) == 0;
1554 }
1555 
1556 static int tegra_dc_wait_idle(struct tegra_dc *dc, unsigned long timeout)
1557 {
1558 	timeout = jiffies + msecs_to_jiffies(timeout);
1559 
1560 	while (time_before(jiffies, timeout)) {
1561 		if (tegra_dc_idle(dc))
1562 			return 0;
1563 
1564 		usleep_range(1000, 2000);
1565 	}
1566 
1567 	dev_dbg(dc->dev, "timeout waiting for DC to become idle\n");
1568 	return -ETIMEDOUT;
1569 }
1570 
1571 static void tegra_crtc_atomic_disable(struct drm_crtc *crtc,
1572 				      struct drm_crtc_state *old_state)
1573 {
1574 	struct tegra_dc *dc = to_tegra_dc(crtc);
1575 	u32 value;
1576 
1577 	if (!tegra_dc_idle(dc)) {
1578 		tegra_dc_stop(dc);
1579 
1580 		/*
1581 		 * Ignore the return value, there isn't anything useful to do
1582 		 * in case this fails.
1583 		 */
1584 		tegra_dc_wait_idle(dc, 100);
1585 	}
1586 
1587 	/*
1588 	 * This should really be part of the RGB encoder driver, but clearing
1589 	 * these bits has the side-effect of stopping the display controller.
1590 	 * When that happens no VBLANK interrupts will be raised. At the same
1591 	 * time the encoder is disabled before the display controller, so the
1592 	 * above code is always going to timeout waiting for the controller
1593 	 * to go idle.
1594 	 *
1595 	 * Given the close coupling between the RGB encoder and the display
1596 	 * controller doing it here is still kind of okay. None of the other
1597 	 * encoder drivers require these bits to be cleared.
1598 	 *
1599 	 * XXX: Perhaps given that the display controller is switched off at
1600 	 * this point anyway maybe clearing these bits isn't even useful for
1601 	 * the RGB encoder?
1602 	 */
1603 	if (dc->rgb) {
1604 		value = tegra_dc_readl(dc, DC_CMD_DISPLAY_POWER_CONTROL);
1605 		value &= ~(PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
1606 			   PW4_ENABLE | PM0_ENABLE | PM1_ENABLE);
1607 		tegra_dc_writel(dc, value, DC_CMD_DISPLAY_POWER_CONTROL);
1608 	}
1609 
1610 	tegra_dc_stats_reset(&dc->stats);
1611 	drm_crtc_vblank_off(crtc);
1612 
1613 	spin_lock_irq(&crtc->dev->event_lock);
1614 
1615 	if (crtc->state->event) {
1616 		drm_crtc_send_vblank_event(crtc, crtc->state->event);
1617 		crtc->state->event = NULL;
1618 	}
1619 
1620 	spin_unlock_irq(&crtc->dev->event_lock);
1621 
1622 	pm_runtime_put_sync(dc->dev);
1623 }
1624 
1625 static void tegra_crtc_atomic_enable(struct drm_crtc *crtc,
1626 				     struct drm_crtc_state *old_state)
1627 {
1628 	struct drm_display_mode *mode = &crtc->state->adjusted_mode;
1629 	struct tegra_dc_state *state = to_dc_state(crtc->state);
1630 	struct tegra_dc *dc = to_tegra_dc(crtc);
1631 	u32 value;
1632 
1633 	pm_runtime_get_sync(dc->dev);
1634 
1635 	/* initialize display controller */
1636 	if (dc->syncpt) {
1637 		u32 syncpt = host1x_syncpt_id(dc->syncpt), enable;
1638 
1639 		if (dc->soc->has_nvdisplay)
1640 			enable = 1 << 31;
1641 		else
1642 			enable = 1 << 8;
1643 
1644 		value = SYNCPT_CNTRL_NO_STALL;
1645 		tegra_dc_writel(dc, value, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL);
1646 
1647 		value = enable | syncpt;
1648 		tegra_dc_writel(dc, value, DC_CMD_CONT_SYNCPT_VSYNC);
1649 	}
1650 
1651 	if (dc->soc->has_nvdisplay) {
1652 		value = DSC_TO_UF_INT | DSC_BBUF_UF_INT | DSC_RBUF_UF_INT |
1653 			DSC_OBUF_UF_INT;
1654 		tegra_dc_writel(dc, value, DC_CMD_INT_TYPE);
1655 
1656 		value = DSC_TO_UF_INT | DSC_BBUF_UF_INT | DSC_RBUF_UF_INT |
1657 			DSC_OBUF_UF_INT | SD3_BUCKET_WALK_DONE_INT |
1658 			HEAD_UF_INT | MSF_INT | REG_TMOUT_INT |
1659 			REGION_CRC_INT | V_PULSE2_INT | V_PULSE3_INT |
1660 			VBLANK_INT | FRAME_END_INT;
1661 		tegra_dc_writel(dc, value, DC_CMD_INT_POLARITY);
1662 
1663 		value = SD3_BUCKET_WALK_DONE_INT | HEAD_UF_INT | VBLANK_INT |
1664 			FRAME_END_INT;
1665 		tegra_dc_writel(dc, value, DC_CMD_INT_ENABLE);
1666 
1667 		value = HEAD_UF_INT | REG_TMOUT_INT | FRAME_END_INT;
1668 		tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
1669 
1670 		tegra_dc_writel(dc, READ_MUX, DC_CMD_STATE_ACCESS);
1671 	} else {
1672 		value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT |
1673 			WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT;
1674 		tegra_dc_writel(dc, value, DC_CMD_INT_TYPE);
1675 
1676 		value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT |
1677 			WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT;
1678 		tegra_dc_writel(dc, value, DC_CMD_INT_POLARITY);
1679 
1680 		/* initialize timer */
1681 		value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(0x20) |
1682 			WINDOW_B_THRESHOLD(0x20) | WINDOW_C_THRESHOLD(0x20);
1683 		tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY);
1684 
1685 		value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(1) |
1686 			WINDOW_B_THRESHOLD(1) | WINDOW_C_THRESHOLD(1);
1687 		tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER);
1688 
1689 		value = VBLANK_INT | WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT |
1690 			WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT;
1691 		tegra_dc_writel(dc, value, DC_CMD_INT_ENABLE);
1692 
1693 		value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT |
1694 			WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT;
1695 		tegra_dc_writel(dc, value, DC_CMD_INT_MASK);
1696 	}
1697 
1698 	if (dc->soc->supports_background_color)
1699 		tegra_dc_writel(dc, 0, DC_DISP_BLEND_BACKGROUND_COLOR);
1700 	else
1701 		tegra_dc_writel(dc, 0, DC_DISP_BORDER_COLOR);
1702 
1703 	/* apply PLL and pixel clock changes */
1704 	tegra_dc_commit_state(dc, state);
1705 
1706 	/* program display mode */
1707 	tegra_dc_set_timings(dc, mode);
1708 
1709 	/* interlacing isn't supported yet, so disable it */
1710 	if (dc->soc->supports_interlacing) {
1711 		value = tegra_dc_readl(dc, DC_DISP_INTERLACE_CONTROL);
1712 		value &= ~INTERLACE_ENABLE;
1713 		tegra_dc_writel(dc, value, DC_DISP_INTERLACE_CONTROL);
1714 	}
1715 
1716 	value = tegra_dc_readl(dc, DC_CMD_DISPLAY_COMMAND);
1717 	value &= ~DISP_CTRL_MODE_MASK;
1718 	value |= DISP_CTRL_MODE_C_DISPLAY;
1719 	tegra_dc_writel(dc, value, DC_CMD_DISPLAY_COMMAND);
1720 
1721 	if (!dc->soc->has_nvdisplay) {
1722 		value = tegra_dc_readl(dc, DC_CMD_DISPLAY_POWER_CONTROL);
1723 		value |= PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
1724 			 PW4_ENABLE | PM0_ENABLE | PM1_ENABLE;
1725 		tegra_dc_writel(dc, value, DC_CMD_DISPLAY_POWER_CONTROL);
1726 	}
1727 
1728 	/* enable underflow reporting and display red for missing pixels */
1729 	if (dc->soc->has_nvdisplay) {
1730 		value = UNDERFLOW_MODE_RED | UNDERFLOW_REPORT_ENABLE;
1731 		tegra_dc_writel(dc, value, DC_COM_RG_UNDERFLOW);
1732 	}
1733 
1734 	tegra_dc_commit(dc);
1735 
1736 	drm_crtc_vblank_on(crtc);
1737 }
1738 
1739 static void tegra_crtc_atomic_begin(struct drm_crtc *crtc,
1740 				    struct drm_crtc_state *old_crtc_state)
1741 {
1742 	unsigned long flags;
1743 
1744 	if (crtc->state->event) {
1745 		spin_lock_irqsave(&crtc->dev->event_lock, flags);
1746 
1747 		if (drm_crtc_vblank_get(crtc) != 0)
1748 			drm_crtc_send_vblank_event(crtc, crtc->state->event);
1749 		else
1750 			drm_crtc_arm_vblank_event(crtc, crtc->state->event);
1751 
1752 		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
1753 
1754 		crtc->state->event = NULL;
1755 	}
1756 }
1757 
1758 static void tegra_crtc_atomic_flush(struct drm_crtc *crtc,
1759 				    struct drm_crtc_state *old_crtc_state)
1760 {
1761 	struct tegra_dc_state *state = to_dc_state(crtc->state);
1762 	struct tegra_dc *dc = to_tegra_dc(crtc);
1763 	u32 value;
1764 
1765 	value = state->planes << 8 | GENERAL_UPDATE;
1766 	tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
1767 	value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
1768 
1769 	value = state->planes | GENERAL_ACT_REQ;
1770 	tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
1771 	value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
1772 }
1773 
1774 static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = {
1775 	.atomic_begin = tegra_crtc_atomic_begin,
1776 	.atomic_flush = tegra_crtc_atomic_flush,
1777 	.atomic_enable = tegra_crtc_atomic_enable,
1778 	.atomic_disable = tegra_crtc_atomic_disable,
1779 };
1780 
1781 static irqreturn_t tegra_dc_irq(int irq, void *data)
1782 {
1783 	struct tegra_dc *dc = data;
1784 	unsigned long status;
1785 
1786 	status = tegra_dc_readl(dc, DC_CMD_INT_STATUS);
1787 	tegra_dc_writel(dc, status, DC_CMD_INT_STATUS);
1788 
1789 	if (status & FRAME_END_INT) {
1790 		/*
1791 		dev_dbg(dc->dev, "%s(): frame end\n", __func__);
1792 		*/
1793 		dc->stats.frames++;
1794 	}
1795 
1796 	if (status & VBLANK_INT) {
1797 		/*
1798 		dev_dbg(dc->dev, "%s(): vertical blank\n", __func__);
1799 		*/
1800 		drm_crtc_handle_vblank(&dc->base);
1801 		dc->stats.vblank++;
1802 	}
1803 
1804 	if (status & (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT)) {
1805 		/*
1806 		dev_dbg(dc->dev, "%s(): underflow\n", __func__);
1807 		*/
1808 		dc->stats.underflow++;
1809 	}
1810 
1811 	if (status & (WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT)) {
1812 		/*
1813 		dev_dbg(dc->dev, "%s(): overflow\n", __func__);
1814 		*/
1815 		dc->stats.overflow++;
1816 	}
1817 
1818 	if (status & HEAD_UF_INT) {
1819 		dev_dbg_ratelimited(dc->dev, "%s(): head underflow\n", __func__);
1820 		dc->stats.underflow++;
1821 	}
1822 
1823 	return IRQ_HANDLED;
1824 }
1825 
1826 static int tegra_dc_init(struct host1x_client *client)
1827 {
1828 	struct drm_device *drm = dev_get_drvdata(client->parent);
1829 	struct iommu_group *group = iommu_group_get(client->dev);
1830 	unsigned long flags = HOST1X_SYNCPT_CLIENT_MANAGED;
1831 	struct tegra_dc *dc = host1x_client_to_dc(client);
1832 	struct tegra_drm *tegra = drm->dev_private;
1833 	struct drm_plane *primary = NULL;
1834 	struct drm_plane *cursor = NULL;
1835 	int err;
1836 
1837 	dc->syncpt = host1x_syncpt_request(client, flags);
1838 	if (!dc->syncpt)
1839 		dev_warn(dc->dev, "failed to allocate syncpoint\n");
1840 
1841 	if (group && tegra->domain) {
1842 		if (group != tegra->group) {
1843 			err = iommu_attach_group(tegra->domain, group);
1844 			if (err < 0) {
1845 				dev_err(dc->dev,
1846 					"failed to attach to domain: %d\n",
1847 					err);
1848 				return err;
1849 			}
1850 
1851 			tegra->group = group;
1852 		}
1853 
1854 		dc->domain = tegra->domain;
1855 	}
1856 
1857 	if (dc->soc->wgrps)
1858 		primary = tegra_dc_add_shared_planes(drm, dc);
1859 	else
1860 		primary = tegra_dc_add_planes(drm, dc);
1861 
1862 	if (IS_ERR(primary)) {
1863 		err = PTR_ERR(primary);
1864 		goto cleanup;
1865 	}
1866 
1867 	if (dc->soc->supports_cursor) {
1868 		cursor = tegra_dc_cursor_plane_create(drm, dc);
1869 		if (IS_ERR(cursor)) {
1870 			err = PTR_ERR(cursor);
1871 			goto cleanup;
1872 		}
1873 	} else {
1874 		/* dedicate one overlay to mouse cursor */
1875 		cursor = tegra_dc_overlay_plane_create(drm, dc, 2, true);
1876 		if (IS_ERR(cursor)) {
1877 			err = PTR_ERR(cursor);
1878 			goto cleanup;
1879 		}
1880 	}
1881 
1882 	err = drm_crtc_init_with_planes(drm, &dc->base, primary, cursor,
1883 					&tegra_crtc_funcs, NULL);
1884 	if (err < 0)
1885 		goto cleanup;
1886 
1887 	drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
1888 
1889 	/*
1890 	 * Keep track of the minimum pitch alignment across all display
1891 	 * controllers.
1892 	 */
1893 	if (dc->soc->pitch_align > tegra->pitch_align)
1894 		tegra->pitch_align = dc->soc->pitch_align;
1895 
1896 	err = tegra_dc_rgb_init(drm, dc);
1897 	if (err < 0 && err != -ENODEV) {
1898 		dev_err(dc->dev, "failed to initialize RGB output: %d\n", err);
1899 		goto cleanup;
1900 	}
1901 
1902 	err = devm_request_irq(dc->dev, dc->irq, tegra_dc_irq, 0,
1903 			       dev_name(dc->dev), dc);
1904 	if (err < 0) {
1905 		dev_err(dc->dev, "failed to request IRQ#%u: %d\n", dc->irq,
1906 			err);
1907 		goto cleanup;
1908 	}
1909 
1910 	return 0;
1911 
1912 cleanup:
1913 	if (!IS_ERR_OR_NULL(cursor))
1914 		drm_plane_cleanup(cursor);
1915 
1916 	if (!IS_ERR(primary))
1917 		drm_plane_cleanup(primary);
1918 
1919 	if (group && dc->domain) {
1920 		if (group == tegra->group) {
1921 			iommu_detach_group(dc->domain, group);
1922 			tegra->group = NULL;
1923 		}
1924 
1925 		dc->domain = NULL;
1926 	}
1927 
1928 	return err;
1929 }
1930 
1931 static int tegra_dc_exit(struct host1x_client *client)
1932 {
1933 	struct drm_device *drm = dev_get_drvdata(client->parent);
1934 	struct iommu_group *group = iommu_group_get(client->dev);
1935 	struct tegra_dc *dc = host1x_client_to_dc(client);
1936 	struct tegra_drm *tegra = drm->dev_private;
1937 	int err;
1938 
1939 	devm_free_irq(dc->dev, dc->irq, dc);
1940 
1941 	err = tegra_dc_rgb_exit(dc);
1942 	if (err) {
1943 		dev_err(dc->dev, "failed to shutdown RGB output: %d\n", err);
1944 		return err;
1945 	}
1946 
1947 	if (group && dc->domain) {
1948 		if (group == tegra->group) {
1949 			iommu_detach_group(dc->domain, group);
1950 			tegra->group = NULL;
1951 		}
1952 
1953 		dc->domain = NULL;
1954 	}
1955 
1956 	host1x_syncpt_free(dc->syncpt);
1957 
1958 	return 0;
1959 }
1960 
1961 static const struct host1x_client_ops dc_client_ops = {
1962 	.init = tegra_dc_init,
1963 	.exit = tegra_dc_exit,
1964 };
1965 
1966 static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
1967 	.supports_background_color = false,
1968 	.supports_interlacing = false,
1969 	.supports_cursor = false,
1970 	.supports_block_linear = false,
1971 	.supports_blending = false,
1972 	.pitch_align = 8,
1973 	.has_powergate = false,
1974 	.coupled_pm = true,
1975 	.has_nvdisplay = false,
1976 	.num_primary_formats = ARRAY_SIZE(tegra20_primary_formats),
1977 	.primary_formats = tegra20_primary_formats,
1978 	.num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats),
1979 	.overlay_formats = tegra20_overlay_formats,
1980 	.modifiers = tegra20_modifiers,
1981 };
1982 
1983 static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
1984 	.supports_background_color = false,
1985 	.supports_interlacing = false,
1986 	.supports_cursor = false,
1987 	.supports_block_linear = false,
1988 	.supports_blending = false,
1989 	.pitch_align = 8,
1990 	.has_powergate = false,
1991 	.coupled_pm = false,
1992 	.has_nvdisplay = false,
1993 	.num_primary_formats = ARRAY_SIZE(tegra20_primary_formats),
1994 	.primary_formats = tegra20_primary_formats,
1995 	.num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats),
1996 	.overlay_formats = tegra20_overlay_formats,
1997 	.modifiers = tegra20_modifiers,
1998 };
1999 
2000 static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
2001 	.supports_background_color = false,
2002 	.supports_interlacing = false,
2003 	.supports_cursor = false,
2004 	.supports_block_linear = false,
2005 	.supports_blending = false,
2006 	.pitch_align = 64,
2007 	.has_powergate = true,
2008 	.coupled_pm = false,
2009 	.has_nvdisplay = false,
2010 	.num_primary_formats = ARRAY_SIZE(tegra114_primary_formats),
2011 	.primary_formats = tegra114_primary_formats,
2012 	.num_overlay_formats = ARRAY_SIZE(tegra114_overlay_formats),
2013 	.overlay_formats = tegra114_overlay_formats,
2014 	.modifiers = tegra20_modifiers,
2015 };
2016 
2017 static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
2018 	.supports_background_color = true,
2019 	.supports_interlacing = true,
2020 	.supports_cursor = true,
2021 	.supports_block_linear = true,
2022 	.supports_blending = true,
2023 	.pitch_align = 64,
2024 	.has_powergate = true,
2025 	.coupled_pm = false,
2026 	.has_nvdisplay = false,
2027 	.num_primary_formats = ARRAY_SIZE(tegra124_primary_formats),
2028 	.primary_formats = tegra124_primary_formats,
2029 	.num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats),
2030 	.overlay_formats = tegra124_overlay_formats,
2031 	.modifiers = tegra124_modifiers,
2032 };
2033 
2034 static const struct tegra_dc_soc_info tegra210_dc_soc_info = {
2035 	.supports_background_color = true,
2036 	.supports_interlacing = true,
2037 	.supports_cursor = true,
2038 	.supports_block_linear = true,
2039 	.supports_blending = true,
2040 	.pitch_align = 64,
2041 	.has_powergate = true,
2042 	.coupled_pm = false,
2043 	.has_nvdisplay = false,
2044 	.num_primary_formats = ARRAY_SIZE(tegra114_primary_formats),
2045 	.primary_formats = tegra114_primary_formats,
2046 	.num_overlay_formats = ARRAY_SIZE(tegra114_overlay_formats),
2047 	.overlay_formats = tegra114_overlay_formats,
2048 	.modifiers = tegra124_modifiers,
2049 };
2050 
2051 static const struct tegra_windowgroup_soc tegra186_dc_wgrps[] = {
2052 	{
2053 		.index = 0,
2054 		.dc = 0,
2055 		.windows = (const unsigned int[]) { 0 },
2056 		.num_windows = 1,
2057 	}, {
2058 		.index = 1,
2059 		.dc = 1,
2060 		.windows = (const unsigned int[]) { 1 },
2061 		.num_windows = 1,
2062 	}, {
2063 		.index = 2,
2064 		.dc = 1,
2065 		.windows = (const unsigned int[]) { 2 },
2066 		.num_windows = 1,
2067 	}, {
2068 		.index = 3,
2069 		.dc = 2,
2070 		.windows = (const unsigned int[]) { 3 },
2071 		.num_windows = 1,
2072 	}, {
2073 		.index = 4,
2074 		.dc = 2,
2075 		.windows = (const unsigned int[]) { 4 },
2076 		.num_windows = 1,
2077 	}, {
2078 		.index = 5,
2079 		.dc = 2,
2080 		.windows = (const unsigned int[]) { 5 },
2081 		.num_windows = 1,
2082 	},
2083 };
2084 
2085 static const struct tegra_dc_soc_info tegra186_dc_soc_info = {
2086 	.supports_background_color = true,
2087 	.supports_interlacing = true,
2088 	.supports_cursor = true,
2089 	.supports_block_linear = true,
2090 	.supports_blending = true,
2091 	.pitch_align = 64,
2092 	.has_powergate = false,
2093 	.coupled_pm = false,
2094 	.has_nvdisplay = true,
2095 	.wgrps = tegra186_dc_wgrps,
2096 	.num_wgrps = ARRAY_SIZE(tegra186_dc_wgrps),
2097 };
2098 
2099 static const struct of_device_id tegra_dc_of_match[] = {
2100 	{
2101 		.compatible = "nvidia,tegra186-dc",
2102 		.data = &tegra186_dc_soc_info,
2103 	}, {
2104 		.compatible = "nvidia,tegra210-dc",
2105 		.data = &tegra210_dc_soc_info,
2106 	}, {
2107 		.compatible = "nvidia,tegra124-dc",
2108 		.data = &tegra124_dc_soc_info,
2109 	}, {
2110 		.compatible = "nvidia,tegra114-dc",
2111 		.data = &tegra114_dc_soc_info,
2112 	}, {
2113 		.compatible = "nvidia,tegra30-dc",
2114 		.data = &tegra30_dc_soc_info,
2115 	}, {
2116 		.compatible = "nvidia,tegra20-dc",
2117 		.data = &tegra20_dc_soc_info,
2118 	}, {
2119 		/* sentinel */
2120 	}
2121 };
2122 MODULE_DEVICE_TABLE(of, tegra_dc_of_match);
2123 
2124 static int tegra_dc_parse_dt(struct tegra_dc *dc)
2125 {
2126 	struct device_node *np;
2127 	u32 value = 0;
2128 	int err;
2129 
2130 	err = of_property_read_u32(dc->dev->of_node, "nvidia,head", &value);
2131 	if (err < 0) {
2132 		dev_err(dc->dev, "missing \"nvidia,head\" property\n");
2133 
2134 		/*
2135 		 * If the nvidia,head property isn't present, try to find the
2136 		 * correct head number by looking up the position of this
2137 		 * display controller's node within the device tree. Assuming
2138 		 * that the nodes are ordered properly in the DTS file and
2139 		 * that the translation into a flattened device tree blob
2140 		 * preserves that ordering this will actually yield the right
2141 		 * head number.
2142 		 *
2143 		 * If those assumptions don't hold, this will still work for
2144 		 * cases where only a single display controller is used.
2145 		 */
2146 		for_each_matching_node(np, tegra_dc_of_match) {
2147 			if (np == dc->dev->of_node) {
2148 				of_node_put(np);
2149 				break;
2150 			}
2151 
2152 			value++;
2153 		}
2154 	}
2155 
2156 	dc->pipe = value;
2157 
2158 	return 0;
2159 }
2160 
2161 static int tegra_dc_match_by_pipe(struct device *dev, void *data)
2162 {
2163 	struct tegra_dc *dc = dev_get_drvdata(dev);
2164 	unsigned int pipe = (unsigned long)data;
2165 
2166 	return dc->pipe == pipe;
2167 }
2168 
2169 static int tegra_dc_couple(struct tegra_dc *dc)
2170 {
2171 	/*
2172 	 * On Tegra20, DC1 requires DC0 to be taken out of reset in order to
2173 	 * be enabled, otherwise CPU hangs on writing to CMD_DISPLAY_COMMAND /
2174 	 * POWER_CONTROL registers during CRTC enabling.
2175 	 */
2176 	if (dc->soc->coupled_pm && dc->pipe == 1) {
2177 		u32 flags = DL_FLAG_PM_RUNTIME | DL_FLAG_AUTOREMOVE;
2178 		struct device_link *link;
2179 		struct device *partner;
2180 
2181 		partner = driver_find_device(dc->dev->driver, NULL, NULL,
2182 					     tegra_dc_match_by_pipe);
2183 		if (!partner)
2184 			return -EPROBE_DEFER;
2185 
2186 		link = device_link_add(dc->dev, partner, flags);
2187 		if (!link) {
2188 			dev_err(dc->dev, "failed to link controllers\n");
2189 			return -EINVAL;
2190 		}
2191 
2192 		dev_dbg(dc->dev, "coupled to %s\n", dev_name(partner));
2193 	}
2194 
2195 	return 0;
2196 }
2197 
2198 static int tegra_dc_probe(struct platform_device *pdev)
2199 {
2200 	struct resource *regs;
2201 	struct tegra_dc *dc;
2202 	int err;
2203 
2204 	dc = devm_kzalloc(&pdev->dev, sizeof(*dc), GFP_KERNEL);
2205 	if (!dc)
2206 		return -ENOMEM;
2207 
2208 	dc->soc = of_device_get_match_data(&pdev->dev);
2209 
2210 	INIT_LIST_HEAD(&dc->list);
2211 	dc->dev = &pdev->dev;
2212 
2213 	err = tegra_dc_parse_dt(dc);
2214 	if (err < 0)
2215 		return err;
2216 
2217 	err = tegra_dc_couple(dc);
2218 	if (err < 0)
2219 		return err;
2220 
2221 	dc->clk = devm_clk_get(&pdev->dev, NULL);
2222 	if (IS_ERR(dc->clk)) {
2223 		dev_err(&pdev->dev, "failed to get clock\n");
2224 		return PTR_ERR(dc->clk);
2225 	}
2226 
2227 	dc->rst = devm_reset_control_get(&pdev->dev, "dc");
2228 	if (IS_ERR(dc->rst)) {
2229 		dev_err(&pdev->dev, "failed to get reset\n");
2230 		return PTR_ERR(dc->rst);
2231 	}
2232 
2233 	/* assert reset and disable clock */
2234 	err = clk_prepare_enable(dc->clk);
2235 	if (err < 0)
2236 		return err;
2237 
2238 	usleep_range(2000, 4000);
2239 
2240 	err = reset_control_assert(dc->rst);
2241 	if (err < 0)
2242 		return err;
2243 
2244 	usleep_range(2000, 4000);
2245 
2246 	clk_disable_unprepare(dc->clk);
2247 
2248 	if (dc->soc->has_powergate) {
2249 		if (dc->pipe == 0)
2250 			dc->powergate = TEGRA_POWERGATE_DIS;
2251 		else
2252 			dc->powergate = TEGRA_POWERGATE_DISB;
2253 
2254 		tegra_powergate_power_off(dc->powergate);
2255 	}
2256 
2257 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2258 	dc->regs = devm_ioremap_resource(&pdev->dev, regs);
2259 	if (IS_ERR(dc->regs))
2260 		return PTR_ERR(dc->regs);
2261 
2262 	dc->irq = platform_get_irq(pdev, 0);
2263 	if (dc->irq < 0) {
2264 		dev_err(&pdev->dev, "failed to get IRQ\n");
2265 		return -ENXIO;
2266 	}
2267 
2268 	err = tegra_dc_rgb_probe(dc);
2269 	if (err < 0 && err != -ENODEV) {
2270 		dev_err(&pdev->dev, "failed to probe RGB output: %d\n", err);
2271 		return err;
2272 	}
2273 
2274 	platform_set_drvdata(pdev, dc);
2275 	pm_runtime_enable(&pdev->dev);
2276 
2277 	INIT_LIST_HEAD(&dc->client.list);
2278 	dc->client.ops = &dc_client_ops;
2279 	dc->client.dev = &pdev->dev;
2280 
2281 	err = host1x_client_register(&dc->client);
2282 	if (err < 0) {
2283 		dev_err(&pdev->dev, "failed to register host1x client: %d\n",
2284 			err);
2285 		return err;
2286 	}
2287 
2288 	return 0;
2289 }
2290 
2291 static int tegra_dc_remove(struct platform_device *pdev)
2292 {
2293 	struct tegra_dc *dc = platform_get_drvdata(pdev);
2294 	int err;
2295 
2296 	err = host1x_client_unregister(&dc->client);
2297 	if (err < 0) {
2298 		dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
2299 			err);
2300 		return err;
2301 	}
2302 
2303 	err = tegra_dc_rgb_remove(dc);
2304 	if (err < 0) {
2305 		dev_err(&pdev->dev, "failed to remove RGB output: %d\n", err);
2306 		return err;
2307 	}
2308 
2309 	pm_runtime_disable(&pdev->dev);
2310 
2311 	return 0;
2312 }
2313 
2314 #ifdef CONFIG_PM
2315 static int tegra_dc_suspend(struct device *dev)
2316 {
2317 	struct tegra_dc *dc = dev_get_drvdata(dev);
2318 	int err;
2319 
2320 	err = reset_control_assert(dc->rst);
2321 	if (err < 0) {
2322 		dev_err(dev, "failed to assert reset: %d\n", err);
2323 		return err;
2324 	}
2325 
2326 	if (dc->soc->has_powergate)
2327 		tegra_powergate_power_off(dc->powergate);
2328 
2329 	clk_disable_unprepare(dc->clk);
2330 
2331 	return 0;
2332 }
2333 
2334 static int tegra_dc_resume(struct device *dev)
2335 {
2336 	struct tegra_dc *dc = dev_get_drvdata(dev);
2337 	int err;
2338 
2339 	if (dc->soc->has_powergate) {
2340 		err = tegra_powergate_sequence_power_up(dc->powergate, dc->clk,
2341 							dc->rst);
2342 		if (err < 0) {
2343 			dev_err(dev, "failed to power partition: %d\n", err);
2344 			return err;
2345 		}
2346 	} else {
2347 		err = clk_prepare_enable(dc->clk);
2348 		if (err < 0) {
2349 			dev_err(dev, "failed to enable clock: %d\n", err);
2350 			return err;
2351 		}
2352 
2353 		err = reset_control_deassert(dc->rst);
2354 		if (err < 0) {
2355 			dev_err(dev, "failed to deassert reset: %d\n", err);
2356 			return err;
2357 		}
2358 	}
2359 
2360 	return 0;
2361 }
2362 #endif
2363 
2364 static const struct dev_pm_ops tegra_dc_pm_ops = {
2365 	SET_RUNTIME_PM_OPS(tegra_dc_suspend, tegra_dc_resume, NULL)
2366 };
2367 
2368 struct platform_driver tegra_dc_driver = {
2369 	.driver = {
2370 		.name = "tegra-dc",
2371 		.of_match_table = tegra_dc_of_match,
2372 		.pm = &tegra_dc_pm_ops,
2373 	},
2374 	.probe = tegra_dc_probe,
2375 	.remove = tegra_dc_remove,
2376 };
2377