root/drivers/gpu/drm/tegra/dc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. tegra_dc_stats_reset
  2. tegra_dc_readl_active
  3. tegra_plane_offset
  4. tegra_plane_readl
  5. tegra_plane_writel
  6. tegra_dc_has_output
  7. tegra_dc_commit
  8. compute_dda_inc
  9. compute_initial_dda
  10. tegra_plane_setup_blending_legacy
  11. tegra_plane_setup_blending
  12. tegra_plane_use_horizontal_filtering
  13. tegra_plane_use_vertical_filtering
  14. tegra_dc_setup_window
  15. tegra_plane_atomic_check
  16. tegra_plane_atomic_disable
  17. tegra_plane_atomic_update
  18. tegra_plane_get_possible_crtcs
  19. tegra_primary_plane_create
  20. tegra_cursor_atomic_check
  21. tegra_cursor_atomic_update
  22. tegra_cursor_atomic_disable
  23. tegra_dc_cursor_plane_create
  24. tegra_dc_overlay_plane_create
  25. tegra_dc_add_shared_planes
  26. tegra_dc_add_planes
  27. tegra_dc_destroy
  28. tegra_crtc_reset
  29. tegra_crtc_atomic_duplicate_state
  30. tegra_crtc_atomic_destroy_state
  31. tegra_dc_show_regs
  32. tegra_dc_show_crc
  33. tegra_dc_show_stats
  34. tegra_dc_late_register
  35. tegra_dc_early_unregister
  36. tegra_dc_get_vblank_counter
  37. tegra_dc_enable_vblank
  38. tegra_dc_disable_vblank
  39. tegra_dc_set_timings
  40. tegra_dc_state_setup_clock
  41. tegra_dc_commit_state
  42. tegra_dc_stop
  43. tegra_dc_idle
  44. tegra_dc_wait_idle
  45. tegra_crtc_atomic_disable
  46. tegra_crtc_atomic_enable
  47. tegra_crtc_atomic_begin
  48. tegra_crtc_atomic_flush
  49. tegra_dc_irq
  50. tegra_dc_has_window_groups
  51. tegra_dc_init
  52. tegra_dc_exit
  53. tegra_dc_parse_dt
  54. tegra_dc_match_by_pipe
  55. tegra_dc_couple
  56. tegra_dc_probe
  57. tegra_dc_remove
  58. tegra_dc_suspend
  59. tegra_dc_resume

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

/* [<][>][^][v][top][bottom][index][help] */