linux/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2014-2018 The Linux Foundation. All rights reserved.
   4 * Copyright (C) 2013 Red Hat
   5 * Author: Rob Clark <robdclark@gmail.com>
   6 */
   7
   8#define pr_fmt(fmt)     "[drm:%s:%d] " fmt, __func__, __LINE__
   9#include <linux/sort.h>
  10#include <linux/debugfs.h>
  11#include <linux/ktime.h>
  12#include <linux/bits.h>
  13
  14#include <drm/drm_atomic.h>
  15#include <drm/drm_crtc.h>
  16#include <drm/drm_flip_work.h>
  17#include <drm/drm_mode.h>
  18#include <drm/drm_probe_helper.h>
  19#include <drm/drm_rect.h>
  20#include <drm/drm_vblank.h>
  21
  22#include "dpu_kms.h"
  23#include "dpu_hw_lm.h"
  24#include "dpu_hw_ctl.h"
  25#include "dpu_hw_dspp.h"
  26#include "dpu_crtc.h"
  27#include "dpu_plane.h"
  28#include "dpu_encoder.h"
  29#include "dpu_vbif.h"
  30#include "dpu_core_perf.h"
  31#include "dpu_trace.h"
  32
  33#define DPU_DRM_BLEND_OP_NOT_DEFINED    0
  34#define DPU_DRM_BLEND_OP_OPAQUE         1
  35#define DPU_DRM_BLEND_OP_PREMULTIPLIED  2
  36#define DPU_DRM_BLEND_OP_COVERAGE       3
  37#define DPU_DRM_BLEND_OP_MAX            4
  38
  39/* layer mixer index on dpu_crtc */
  40#define LEFT_MIXER 0
  41#define RIGHT_MIXER 1
  42
  43/* timeout in ms waiting for frame done */
  44#define DPU_CRTC_FRAME_DONE_TIMEOUT_MS  60
  45
  46#define CONVERT_S3_15(val) \
  47        (((((u64)val) & ~BIT_ULL(63)) >> 17) & GENMASK_ULL(17, 0))
  48
  49static struct dpu_kms *_dpu_crtc_get_kms(struct drm_crtc *crtc)
  50{
  51        struct msm_drm_private *priv = crtc->dev->dev_private;
  52
  53        return to_dpu_kms(priv->kms);
  54}
  55
  56static void dpu_crtc_destroy(struct drm_crtc *crtc)
  57{
  58        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
  59
  60        if (!crtc)
  61                return;
  62
  63        drm_crtc_cleanup(crtc);
  64        kfree(dpu_crtc);
  65}
  66
  67static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc)
  68{
  69        struct drm_device *dev = crtc->dev;
  70        struct drm_encoder *encoder;
  71
  72        drm_for_each_encoder(encoder, dev)
  73                if (encoder->crtc == crtc)
  74                        return encoder;
  75
  76        return NULL;
  77}
  78
  79static u32 dpu_crtc_get_vblank_counter(struct drm_crtc *crtc)
  80{
  81        struct drm_encoder *encoder;
  82
  83        encoder = get_encoder_from_crtc(crtc);
  84        if (!encoder) {
  85                DRM_ERROR("no encoder found for crtc %d\n", crtc->index);
  86                return false;
  87        }
  88
  89        return dpu_encoder_get_frame_count(encoder);
  90}
  91
  92static bool dpu_crtc_get_scanout_position(struct drm_crtc *crtc,
  93                                           bool in_vblank_irq,
  94                                           int *vpos, int *hpos,
  95                                           ktime_t *stime, ktime_t *etime,
  96                                           const struct drm_display_mode *mode)
  97{
  98        unsigned int pipe = crtc->index;
  99        struct drm_encoder *encoder;
 100        int line, vsw, vbp, vactive_start, vactive_end, vfp_end;
 101
 102        encoder = get_encoder_from_crtc(crtc);
 103        if (!encoder) {
 104                DRM_ERROR("no encoder found for crtc %d\n", pipe);
 105                return false;
 106        }
 107
 108        vsw = mode->crtc_vsync_end - mode->crtc_vsync_start;
 109        vbp = mode->crtc_vtotal - mode->crtc_vsync_end;
 110
 111        /*
 112         * the line counter is 1 at the start of the VSYNC pulse and VTOTAL at
 113         * the end of VFP. Translate the porch values relative to the line
 114         * counter positions.
 115         */
 116
 117        vactive_start = vsw + vbp + 1;
 118        vactive_end = vactive_start + mode->crtc_vdisplay;
 119
 120        /* last scan line before VSYNC */
 121        vfp_end = mode->crtc_vtotal;
 122
 123        if (stime)
 124                *stime = ktime_get();
 125
 126        line = dpu_encoder_get_linecount(encoder);
 127
 128        if (line < vactive_start)
 129                line -= vactive_start;
 130        else if (line > vactive_end)
 131                line = line - vfp_end - vactive_start;
 132        else
 133                line -= vactive_start;
 134
 135        *vpos = line;
 136        *hpos = 0;
 137
 138        if (etime)
 139                *etime = ktime_get();
 140
 141        return true;
 142}
 143
 144static void _dpu_crtc_setup_blend_cfg(struct dpu_crtc_mixer *mixer,
 145                struct dpu_plane_state *pstate, struct dpu_format *format)
 146{
 147        struct dpu_hw_mixer *lm = mixer->hw_lm;
 148        uint32_t blend_op;
 149
 150        /* default to opaque blending */
 151        blend_op = DPU_BLEND_FG_ALPHA_FG_CONST |
 152                DPU_BLEND_BG_ALPHA_BG_CONST;
 153
 154        if (format->alpha_enable) {
 155                /* coverage blending */
 156                blend_op = DPU_BLEND_FG_ALPHA_FG_PIXEL |
 157                        DPU_BLEND_BG_ALPHA_FG_PIXEL |
 158                        DPU_BLEND_BG_INV_ALPHA;
 159        }
 160
 161        lm->ops.setup_blend_config(lm, pstate->stage,
 162                                0xFF, 0, blend_op);
 163
 164        DRM_DEBUG_ATOMIC("format:%p4cc, alpha_en:%u blend_op:0x%x\n",
 165                  &format->base.pixel_format, format->alpha_enable, blend_op);
 166}
 167
 168static void _dpu_crtc_program_lm_output_roi(struct drm_crtc *crtc)
 169{
 170        struct dpu_crtc_state *crtc_state;
 171        int lm_idx, lm_horiz_position;
 172
 173        crtc_state = to_dpu_crtc_state(crtc->state);
 174
 175        lm_horiz_position = 0;
 176        for (lm_idx = 0; lm_idx < crtc_state->num_mixers; lm_idx++) {
 177                const struct drm_rect *lm_roi = &crtc_state->lm_bounds[lm_idx];
 178                struct dpu_hw_mixer *hw_lm = crtc_state->mixers[lm_idx].hw_lm;
 179                struct dpu_hw_mixer_cfg cfg;
 180
 181                if (!lm_roi || !drm_rect_visible(lm_roi))
 182                        continue;
 183
 184                cfg.out_width = drm_rect_width(lm_roi);
 185                cfg.out_height = drm_rect_height(lm_roi);
 186                cfg.right_mixer = lm_horiz_position++;
 187                cfg.flags = 0;
 188                hw_lm->ops.setup_mixer_out(hw_lm, &cfg);
 189        }
 190}
 191
 192static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
 193        struct dpu_crtc *dpu_crtc, struct dpu_crtc_mixer *mixer)
 194{
 195        struct drm_plane *plane;
 196        struct drm_framebuffer *fb;
 197        struct drm_plane_state *state;
 198        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
 199        struct dpu_plane_state *pstate = NULL;
 200        struct dpu_format *format;
 201        struct dpu_hw_ctl *ctl = mixer->lm_ctl;
 202        struct dpu_hw_stage_cfg *stage_cfg = &dpu_crtc->stage_cfg;
 203
 204        u32 flush_mask;
 205        uint32_t stage_idx, lm_idx;
 206        int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 };
 207        bool bg_alpha_enable = false;
 208        DECLARE_BITMAP(fetch_active, SSPP_MAX);
 209
 210        memset(fetch_active, 0, sizeof(fetch_active));
 211        drm_atomic_crtc_for_each_plane(plane, crtc) {
 212                state = plane->state;
 213                if (!state)
 214                        continue;
 215
 216                pstate = to_dpu_plane_state(state);
 217                fb = state->fb;
 218
 219                dpu_plane_get_ctl_flush(plane, ctl, &flush_mask);
 220                set_bit(dpu_plane_pipe(plane), fetch_active);
 221
 222                DRM_DEBUG_ATOMIC("crtc %d stage:%d - plane %d sspp %d fb %d\n",
 223                                crtc->base.id,
 224                                pstate->stage,
 225                                plane->base.id,
 226                                dpu_plane_pipe(plane) - SSPP_VIG0,
 227                                state->fb ? state->fb->base.id : -1);
 228
 229                format = to_dpu_format(msm_framebuffer_format(pstate->base.fb));
 230
 231                if (pstate->stage == DPU_STAGE_BASE && format->alpha_enable)
 232                        bg_alpha_enable = true;
 233
 234                stage_idx = zpos_cnt[pstate->stage]++;
 235                stage_cfg->stage[pstate->stage][stage_idx] =
 236                                        dpu_plane_pipe(plane);
 237                stage_cfg->multirect_index[pstate->stage][stage_idx] =
 238                                        pstate->multirect_index;
 239
 240                trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane),
 241                                           state, pstate, stage_idx,
 242                                           dpu_plane_pipe(plane) - SSPP_VIG0,
 243                                           format->base.pixel_format,
 244                                           fb ? fb->modifier : 0);
 245
 246                /* blend config update */
 247                for (lm_idx = 0; lm_idx < cstate->num_mixers; lm_idx++) {
 248                        _dpu_crtc_setup_blend_cfg(mixer + lm_idx,
 249                                                pstate, format);
 250
 251                        mixer[lm_idx].flush_mask |= flush_mask;
 252
 253                        if (bg_alpha_enable && !format->alpha_enable)
 254                                mixer[lm_idx].mixer_op_mode = 0;
 255                        else
 256                                mixer[lm_idx].mixer_op_mode |=
 257                                                1 << pstate->stage;
 258                }
 259        }
 260
 261        if (ctl->ops.set_active_pipes)
 262                ctl->ops.set_active_pipes(ctl, fetch_active);
 263
 264         _dpu_crtc_program_lm_output_roi(crtc);
 265}
 266
 267/**
 268 * _dpu_crtc_blend_setup - configure crtc mixers
 269 * @crtc: Pointer to drm crtc structure
 270 */
 271static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
 272{
 273        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 274        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
 275        struct dpu_crtc_mixer *mixer = cstate->mixers;
 276        struct dpu_hw_ctl *ctl;
 277        struct dpu_hw_mixer *lm;
 278        int i;
 279
 280        DRM_DEBUG_ATOMIC("%s\n", dpu_crtc->name);
 281
 282        for (i = 0; i < cstate->num_mixers; i++) {
 283                mixer[i].mixer_op_mode = 0;
 284                mixer[i].flush_mask = 0;
 285                if (mixer[i].lm_ctl->ops.clear_all_blendstages)
 286                        mixer[i].lm_ctl->ops.clear_all_blendstages(
 287                                        mixer[i].lm_ctl);
 288        }
 289
 290        /* initialize stage cfg */
 291        memset(&dpu_crtc->stage_cfg, 0, sizeof(struct dpu_hw_stage_cfg));
 292
 293        _dpu_crtc_blend_setup_mixer(crtc, dpu_crtc, mixer);
 294
 295        for (i = 0; i < cstate->num_mixers; i++) {
 296                ctl = mixer[i].lm_ctl;
 297                lm = mixer[i].hw_lm;
 298
 299                lm->ops.setup_alpha_out(lm, mixer[i].mixer_op_mode);
 300
 301                mixer[i].flush_mask |= ctl->ops.get_bitmask_mixer(ctl,
 302                        mixer[i].hw_lm->idx);
 303
 304                /* stage config flush mask */
 305                ctl->ops.update_pending_flush(ctl, mixer[i].flush_mask);
 306
 307                DRM_DEBUG_ATOMIC("lm %d, op_mode 0x%X, ctl %d, flush mask 0x%x\n",
 308                        mixer[i].hw_lm->idx - LM_0,
 309                        mixer[i].mixer_op_mode,
 310                        ctl->idx - CTL_0,
 311                        mixer[i].flush_mask);
 312
 313                ctl->ops.setup_blendstage(ctl, mixer[i].hw_lm->idx,
 314                        &dpu_crtc->stage_cfg);
 315        }
 316}
 317
 318/**
 319 *  _dpu_crtc_complete_flip - signal pending page_flip events
 320 * Any pending vblank events are added to the vblank_event_list
 321 * so that the next vblank interrupt shall signal them.
 322 * However PAGE_FLIP events are not handled through the vblank_event_list.
 323 * This API signals any pending PAGE_FLIP events requested through
 324 * DRM_IOCTL_MODE_PAGE_FLIP and are cached in the dpu_crtc->event.
 325 * @crtc: Pointer to drm crtc structure
 326 */
 327static void _dpu_crtc_complete_flip(struct drm_crtc *crtc)
 328{
 329        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 330        struct drm_device *dev = crtc->dev;
 331        unsigned long flags;
 332
 333        spin_lock_irqsave(&dev->event_lock, flags);
 334        if (dpu_crtc->event) {
 335                DRM_DEBUG_VBL("%s: send event: %pK\n", dpu_crtc->name,
 336                              dpu_crtc->event);
 337                trace_dpu_crtc_complete_flip(DRMID(crtc));
 338                drm_crtc_send_vblank_event(crtc, dpu_crtc->event);
 339                dpu_crtc->event = NULL;
 340        }
 341        spin_unlock_irqrestore(&dev->event_lock, flags);
 342}
 343
 344enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)
 345{
 346        struct drm_encoder *encoder;
 347
 348        /*
 349         * TODO: This function is called from dpu debugfs and as part of atomic
 350         * check. When called from debugfs, the crtc->mutex must be held to
 351         * read crtc->state. However reading crtc->state from atomic check isn't
 352         * allowed (unless you have a good reason, a big comment, and a deep
 353         * understanding of how the atomic/modeset locks work (<- and this is
 354         * probably not possible)). So we'll keep the WARN_ON here for now, but
 355         * really we need to figure out a better way to track our operating mode
 356         */
 357        WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
 358
 359        /* TODO: Returns the first INTF_MODE, could there be multiple values? */
 360        drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
 361                return dpu_encoder_get_intf_mode(encoder);
 362
 363        return INTF_MODE_NONE;
 364}
 365
 366void dpu_crtc_vblank_callback(struct drm_crtc *crtc)
 367{
 368        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 369
 370        /* keep statistics on vblank callback - with auto reset via debugfs */
 371        if (ktime_compare(dpu_crtc->vblank_cb_time, ktime_set(0, 0)) == 0)
 372                dpu_crtc->vblank_cb_time = ktime_get();
 373        else
 374                dpu_crtc->vblank_cb_count++;
 375        drm_crtc_handle_vblank(crtc);
 376        trace_dpu_crtc_vblank_cb(DRMID(crtc));
 377}
 378
 379static void dpu_crtc_frame_event_work(struct kthread_work *work)
 380{
 381        struct dpu_crtc_frame_event *fevent = container_of(work,
 382                        struct dpu_crtc_frame_event, work);
 383        struct drm_crtc *crtc = fevent->crtc;
 384        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 385        unsigned long flags;
 386        bool frame_done = false;
 387
 388        DPU_ATRACE_BEGIN("crtc_frame_event");
 389
 390        DRM_DEBUG_ATOMIC("crtc%d event:%u ts:%lld\n", crtc->base.id, fevent->event,
 391                        ktime_to_ns(fevent->ts));
 392
 393        if (fevent->event & (DPU_ENCODER_FRAME_EVENT_DONE
 394                                | DPU_ENCODER_FRAME_EVENT_ERROR
 395                                | DPU_ENCODER_FRAME_EVENT_PANEL_DEAD)) {
 396
 397                if (atomic_read(&dpu_crtc->frame_pending) < 1) {
 398                        /* ignore vblank when not pending */
 399                } else if (atomic_dec_return(&dpu_crtc->frame_pending) == 0) {
 400                        /* release bandwidth and other resources */
 401                        trace_dpu_crtc_frame_event_done(DRMID(crtc),
 402                                                        fevent->event);
 403                        dpu_core_perf_crtc_release_bw(crtc);
 404                } else {
 405                        trace_dpu_crtc_frame_event_more_pending(DRMID(crtc),
 406                                                                fevent->event);
 407                }
 408
 409                if (fevent->event & (DPU_ENCODER_FRAME_EVENT_DONE
 410                                        | DPU_ENCODER_FRAME_EVENT_ERROR))
 411                        frame_done = true;
 412        }
 413
 414        if (fevent->event & DPU_ENCODER_FRAME_EVENT_PANEL_DEAD)
 415                DPU_ERROR("crtc%d ts:%lld received panel dead event\n",
 416                                crtc->base.id, ktime_to_ns(fevent->ts));
 417
 418        if (frame_done)
 419                complete_all(&dpu_crtc->frame_done_comp);
 420
 421        spin_lock_irqsave(&dpu_crtc->spin_lock, flags);
 422        list_add_tail(&fevent->list, &dpu_crtc->frame_event_list);
 423        spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags);
 424        DPU_ATRACE_END("crtc_frame_event");
 425}
 426
 427/*
 428 * dpu_crtc_frame_event_cb - crtc frame event callback API. CRTC module
 429 * registers this API to encoder for all frame event callbacks like
 430 * frame_error, frame_done, idle_timeout, etc. Encoder may call different events
 431 * from different context - IRQ, user thread, commit_thread, etc. Each event
 432 * should be carefully reviewed and should be processed in proper task context
 433 * to avoid schedulin delay or properly manage the irq context's bottom half
 434 * processing.
 435 */
 436static void dpu_crtc_frame_event_cb(void *data, u32 event)
 437{
 438        struct drm_crtc *crtc = (struct drm_crtc *)data;
 439        struct dpu_crtc *dpu_crtc;
 440        struct msm_drm_private *priv;
 441        struct dpu_crtc_frame_event *fevent;
 442        unsigned long flags;
 443        u32 crtc_id;
 444
 445        /* Nothing to do on idle event */
 446        if (event & DPU_ENCODER_FRAME_EVENT_IDLE)
 447                return;
 448
 449        dpu_crtc = to_dpu_crtc(crtc);
 450        priv = crtc->dev->dev_private;
 451        crtc_id = drm_crtc_index(crtc);
 452
 453        trace_dpu_crtc_frame_event_cb(DRMID(crtc), event);
 454
 455        spin_lock_irqsave(&dpu_crtc->spin_lock, flags);
 456        fevent = list_first_entry_or_null(&dpu_crtc->frame_event_list,
 457                        struct dpu_crtc_frame_event, list);
 458        if (fevent)
 459                list_del_init(&fevent->list);
 460        spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags);
 461
 462        if (!fevent) {
 463                DRM_ERROR_RATELIMITED("crtc%d event %d overflow\n", crtc->base.id, event);
 464                return;
 465        }
 466
 467        fevent->event = event;
 468        fevent->crtc = crtc;
 469        fevent->ts = ktime_get();
 470        kthread_queue_work(priv->event_thread[crtc_id].worker, &fevent->work);
 471}
 472
 473void dpu_crtc_complete_commit(struct drm_crtc *crtc)
 474{
 475        trace_dpu_crtc_complete_commit(DRMID(crtc));
 476        dpu_core_perf_crtc_update(crtc, 0, false);
 477        _dpu_crtc_complete_flip(crtc);
 478}
 479
 480static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc,
 481                struct drm_crtc_state *state)
 482{
 483        struct dpu_crtc_state *cstate = to_dpu_crtc_state(state);
 484        struct drm_display_mode *adj_mode = &state->adjusted_mode;
 485        u32 crtc_split_width = adj_mode->hdisplay / cstate->num_mixers;
 486        int i;
 487
 488        for (i = 0; i < cstate->num_mixers; i++) {
 489                struct drm_rect *r = &cstate->lm_bounds[i];
 490                r->x1 = crtc_split_width * i;
 491                r->y1 = 0;
 492                r->x2 = r->x1 + crtc_split_width;
 493                r->y2 = adj_mode->vdisplay;
 494
 495                trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r);
 496        }
 497}
 498
 499static void _dpu_crtc_get_pcc_coeff(struct drm_crtc_state *state,
 500                struct dpu_hw_pcc_cfg *cfg)
 501{
 502        struct drm_color_ctm *ctm;
 503
 504        memset(cfg, 0, sizeof(struct dpu_hw_pcc_cfg));
 505
 506        ctm = (struct drm_color_ctm *)state->ctm->data;
 507
 508        if (!ctm)
 509                return;
 510
 511        cfg->r.r = CONVERT_S3_15(ctm->matrix[0]);
 512        cfg->g.r = CONVERT_S3_15(ctm->matrix[1]);
 513        cfg->b.r = CONVERT_S3_15(ctm->matrix[2]);
 514
 515        cfg->r.g = CONVERT_S3_15(ctm->matrix[3]);
 516        cfg->g.g = CONVERT_S3_15(ctm->matrix[4]);
 517        cfg->b.g = CONVERT_S3_15(ctm->matrix[5]);
 518
 519        cfg->r.b = CONVERT_S3_15(ctm->matrix[6]);
 520        cfg->g.b = CONVERT_S3_15(ctm->matrix[7]);
 521        cfg->b.b = CONVERT_S3_15(ctm->matrix[8]);
 522}
 523
 524static void _dpu_crtc_setup_cp_blocks(struct drm_crtc *crtc)
 525{
 526        struct drm_crtc_state *state = crtc->state;
 527        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
 528        struct dpu_crtc_mixer *mixer = cstate->mixers;
 529        struct dpu_hw_pcc_cfg cfg;
 530        struct dpu_hw_ctl *ctl;
 531        struct dpu_hw_dspp *dspp;
 532        int i;
 533
 534
 535        if (!state->color_mgmt_changed)
 536                return;
 537
 538        for (i = 0; i < cstate->num_mixers; i++) {
 539                ctl = mixer[i].lm_ctl;
 540                dspp = mixer[i].hw_dspp;
 541
 542                if (!dspp || !dspp->ops.setup_pcc)
 543                        continue;
 544
 545                if (!state->ctm) {
 546                        dspp->ops.setup_pcc(dspp, NULL);
 547                } else {
 548                        _dpu_crtc_get_pcc_coeff(state, &cfg);
 549                        dspp->ops.setup_pcc(dspp, &cfg);
 550                }
 551
 552                mixer[i].flush_mask |= ctl->ops.get_bitmask_dspp(ctl,
 553                        mixer[i].hw_dspp->idx);
 554
 555                /* stage config flush mask */
 556                ctl->ops.update_pending_flush(ctl, mixer[i].flush_mask);
 557
 558                DRM_DEBUG_ATOMIC("lm %d, ctl %d, flush mask 0x%x\n",
 559                        mixer[i].hw_lm->idx - DSPP_0,
 560                        ctl->idx - CTL_0,
 561                        mixer[i].flush_mask);
 562        }
 563}
 564
 565static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
 566                struct drm_atomic_state *state)
 567{
 568        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
 569        struct drm_encoder *encoder;
 570
 571        if (!crtc->state->enable) {
 572                DRM_DEBUG_ATOMIC("crtc%d -> enable %d, skip atomic_begin\n",
 573                                crtc->base.id, crtc->state->enable);
 574                return;
 575        }
 576
 577        DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id);
 578
 579        _dpu_crtc_setup_lm_bounds(crtc, crtc->state);
 580
 581        /* encoder will trigger pending mask now */
 582        drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
 583                dpu_encoder_trigger_kickoff_pending(encoder);
 584
 585        /*
 586         * If no mixers have been allocated in dpu_crtc_atomic_check(),
 587         * it means we are trying to flush a CRTC whose state is disabled:
 588         * nothing else needs to be done.
 589         */
 590        if (unlikely(!cstate->num_mixers))
 591                return;
 592
 593        _dpu_crtc_blend_setup(crtc);
 594
 595        _dpu_crtc_setup_cp_blocks(crtc);
 596
 597        /*
 598         * PP_DONE irq is only used by command mode for now.
 599         * It is better to request pending before FLUSH and START trigger
 600         * to make sure no pp_done irq missed.
 601         * This is safe because no pp_done will happen before SW trigger
 602         * in command mode.
 603         */
 604}
 605
 606static void dpu_crtc_atomic_flush(struct drm_crtc *crtc,
 607                struct drm_atomic_state *state)
 608{
 609        struct dpu_crtc *dpu_crtc;
 610        struct drm_device *dev;
 611        struct drm_plane *plane;
 612        struct msm_drm_private *priv;
 613        unsigned long flags;
 614        struct dpu_crtc_state *cstate;
 615
 616        if (!crtc->state->enable) {
 617                DRM_DEBUG_ATOMIC("crtc%d -> enable %d, skip atomic_flush\n",
 618                                crtc->base.id, crtc->state->enable);
 619                return;
 620        }
 621
 622        DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id);
 623
 624        dpu_crtc = to_dpu_crtc(crtc);
 625        cstate = to_dpu_crtc_state(crtc->state);
 626        dev = crtc->dev;
 627        priv = dev->dev_private;
 628
 629        if (crtc->index >= ARRAY_SIZE(priv->event_thread)) {
 630                DPU_ERROR("invalid crtc index[%d]\n", crtc->index);
 631                return;
 632        }
 633
 634        WARN_ON(dpu_crtc->event);
 635        spin_lock_irqsave(&dev->event_lock, flags);
 636        dpu_crtc->event = crtc->state->event;
 637        crtc->state->event = NULL;
 638        spin_unlock_irqrestore(&dev->event_lock, flags);
 639
 640        /*
 641         * If no mixers has been allocated in dpu_crtc_atomic_check(),
 642         * it means we are trying to flush a CRTC whose state is disabled:
 643         * nothing else needs to be done.
 644         */
 645        if (unlikely(!cstate->num_mixers))
 646                return;
 647
 648        /* update performance setting before crtc kickoff */
 649        dpu_core_perf_crtc_update(crtc, 1, false);
 650
 651        /*
 652         * Final plane updates: Give each plane a chance to complete all
 653         *                      required writes/flushing before crtc's "flush
 654         *                      everything" call below.
 655         */
 656        drm_atomic_crtc_for_each_plane(plane, crtc) {
 657                if (dpu_crtc->smmu_state.transition_error)
 658                        dpu_plane_set_error(plane, true);
 659                dpu_plane_flush(plane);
 660        }
 661
 662        /* Kickoff will be scheduled by outer layer */
 663}
 664
 665/**
 666 * dpu_crtc_destroy_state - state destroy hook
 667 * @crtc: drm CRTC
 668 * @state: CRTC state object to release
 669 */
 670static void dpu_crtc_destroy_state(struct drm_crtc *crtc,
 671                struct drm_crtc_state *state)
 672{
 673        struct dpu_crtc_state *cstate = to_dpu_crtc_state(state);
 674
 675        DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id);
 676
 677        __drm_atomic_helper_crtc_destroy_state(state);
 678
 679        kfree(cstate);
 680}
 681
 682static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)
 683{
 684        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 685        int ret, rc = 0;
 686
 687        if (!atomic_read(&dpu_crtc->frame_pending)) {
 688                DRM_DEBUG_ATOMIC("no frames pending\n");
 689                return 0;
 690        }
 691
 692        DPU_ATRACE_BEGIN("frame done completion wait");
 693        ret = wait_for_completion_timeout(&dpu_crtc->frame_done_comp,
 694                        msecs_to_jiffies(DPU_CRTC_FRAME_DONE_TIMEOUT_MS));
 695        if (!ret) {
 696                DRM_ERROR("frame done wait timed out, ret:%d\n", ret);
 697                rc = -ETIMEDOUT;
 698        }
 699        DPU_ATRACE_END("frame done completion wait");
 700
 701        return rc;
 702}
 703
 704void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)
 705{
 706        struct drm_encoder *encoder;
 707        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 708        struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
 709        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
 710
 711        /*
 712         * If no mixers has been allocated in dpu_crtc_atomic_check(),
 713         * it means we are trying to start a CRTC whose state is disabled:
 714         * nothing else needs to be done.
 715         */
 716        if (unlikely(!cstate->num_mixers))
 717                return;
 718
 719        DPU_ATRACE_BEGIN("crtc_commit");
 720
 721        /*
 722         * Encoder will flush/start now, unless it has a tx pending. If so, it
 723         * may delay and flush at an irq event (e.g. ppdone)
 724         */
 725        drm_for_each_encoder_mask(encoder, crtc->dev,
 726                                  crtc->state->encoder_mask)
 727                dpu_encoder_prepare_for_kickoff(encoder);
 728
 729        if (atomic_inc_return(&dpu_crtc->frame_pending) == 1) {
 730                /* acquire bandwidth and other resources */
 731                DRM_DEBUG_ATOMIC("crtc%d first commit\n", crtc->base.id);
 732        } else
 733                DRM_DEBUG_ATOMIC("crtc%d commit\n", crtc->base.id);
 734
 735        dpu_crtc->play_count++;
 736
 737        dpu_vbif_clear_errors(dpu_kms);
 738
 739        drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
 740                dpu_encoder_kickoff(encoder);
 741
 742        reinit_completion(&dpu_crtc->frame_done_comp);
 743        DPU_ATRACE_END("crtc_commit");
 744}
 745
 746static void dpu_crtc_reset(struct drm_crtc *crtc)
 747{
 748        struct dpu_crtc_state *cstate = kzalloc(sizeof(*cstate), GFP_KERNEL);
 749
 750        if (crtc->state)
 751                dpu_crtc_destroy_state(crtc, crtc->state);
 752
 753        __drm_atomic_helper_crtc_reset(crtc, &cstate->base);
 754}
 755
 756/**
 757 * dpu_crtc_duplicate_state - state duplicate hook
 758 * @crtc: Pointer to drm crtc structure
 759 */
 760static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc)
 761{
 762        struct dpu_crtc_state *cstate, *old_cstate = to_dpu_crtc_state(crtc->state);
 763
 764        cstate = kmemdup(old_cstate, sizeof(*old_cstate), GFP_KERNEL);
 765        if (!cstate) {
 766                DPU_ERROR("failed to allocate state\n");
 767                return NULL;
 768        }
 769
 770        /* duplicate base helper */
 771        __drm_atomic_helper_crtc_duplicate_state(crtc, &cstate->base);
 772
 773        return &cstate->base;
 774}
 775
 776static void dpu_crtc_disable(struct drm_crtc *crtc,
 777                             struct drm_atomic_state *state)
 778{
 779        struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
 780                                                                              crtc);
 781        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 782        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
 783        struct drm_encoder *encoder;
 784        unsigned long flags;
 785        bool release_bandwidth = false;
 786
 787        DRM_DEBUG_KMS("crtc%d\n", crtc->base.id);
 788
 789        /* Disable/save vblank irq handling */
 790        drm_crtc_vblank_off(crtc);
 791
 792        drm_for_each_encoder_mask(encoder, crtc->dev,
 793                                  old_crtc_state->encoder_mask) {
 794                /* in video mode, we hold an extra bandwidth reference
 795                 * as we cannot drop bandwidth at frame-done if any
 796                 * crtc is being used in video mode.
 797                 */
 798                if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO)
 799                        release_bandwidth = true;
 800                dpu_encoder_assign_crtc(encoder, NULL);
 801        }
 802
 803        /* wait for frame_event_done completion */
 804        if (_dpu_crtc_wait_for_frame_done(crtc))
 805                DPU_ERROR("crtc%d wait for frame done failed;frame_pending%d\n",
 806                                crtc->base.id,
 807                                atomic_read(&dpu_crtc->frame_pending));
 808
 809        trace_dpu_crtc_disable(DRMID(crtc), false, dpu_crtc);
 810        dpu_crtc->enabled = false;
 811
 812        if (atomic_read(&dpu_crtc->frame_pending)) {
 813                trace_dpu_crtc_disable_frame_pending(DRMID(crtc),
 814                                     atomic_read(&dpu_crtc->frame_pending));
 815                if (release_bandwidth)
 816                        dpu_core_perf_crtc_release_bw(crtc);
 817                atomic_set(&dpu_crtc->frame_pending, 0);
 818        }
 819
 820        dpu_core_perf_crtc_update(crtc, 0, true);
 821
 822        drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
 823                dpu_encoder_register_frame_event_callback(encoder, NULL, NULL);
 824
 825        memset(cstate->mixers, 0, sizeof(cstate->mixers));
 826        cstate->num_mixers = 0;
 827
 828        /* disable clk & bw control until clk & bw properties are set */
 829        cstate->bw_control = false;
 830        cstate->bw_split_vote = false;
 831
 832        if (crtc->state->event && !crtc->state->active) {
 833                spin_lock_irqsave(&crtc->dev->event_lock, flags);
 834                drm_crtc_send_vblank_event(crtc, crtc->state->event);
 835                crtc->state->event = NULL;
 836                spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 837        }
 838
 839        pm_runtime_put_sync(crtc->dev->dev);
 840}
 841
 842static void dpu_crtc_enable(struct drm_crtc *crtc,
 843                struct drm_atomic_state *state)
 844{
 845        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 846        struct drm_encoder *encoder;
 847        bool request_bandwidth = false;
 848
 849        pm_runtime_get_sync(crtc->dev->dev);
 850
 851        DRM_DEBUG_KMS("crtc%d\n", crtc->base.id);
 852
 853        drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) {
 854                /* in video mode, we hold an extra bandwidth reference
 855                 * as we cannot drop bandwidth at frame-done if any
 856                 * crtc is being used in video mode.
 857                 */
 858                if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO)
 859                        request_bandwidth = true;
 860                dpu_encoder_register_frame_event_callback(encoder,
 861                                dpu_crtc_frame_event_cb, (void *)crtc);
 862        }
 863
 864        if (request_bandwidth)
 865                atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref);
 866
 867        trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc);
 868        dpu_crtc->enabled = true;
 869
 870        drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
 871                dpu_encoder_assign_crtc(encoder, crtc);
 872
 873        /* Enable/restore vblank irq handling */
 874        drm_crtc_vblank_on(crtc);
 875}
 876
 877struct plane_state {
 878        struct dpu_plane_state *dpu_pstate;
 879        const struct drm_plane_state *drm_pstate;
 880        int stage;
 881        u32 pipe_id;
 882};
 883
 884static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
 885                struct drm_atomic_state *state)
 886{
 887        struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
 888                                                                          crtc);
 889        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
 890        struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc_state);
 891        struct plane_state *pstates;
 892
 893        const struct drm_plane_state *pstate;
 894        struct drm_plane *plane;
 895        struct drm_display_mode *mode;
 896
 897        int cnt = 0, rc = 0, mixer_width = 0, i, z_pos;
 898
 899        struct dpu_multirect_plane_states multirect_plane[DPU_STAGE_MAX * 2];
 900        int multirect_count = 0;
 901        const struct drm_plane_state *pipe_staged[SSPP_MAX];
 902        int left_zpos_cnt = 0, right_zpos_cnt = 0;
 903        struct drm_rect crtc_rect = { 0 };
 904
 905        pstates = kzalloc(sizeof(*pstates) * DPU_STAGE_MAX * 4, GFP_KERNEL);
 906
 907        if (!crtc_state->enable || !crtc_state->active) {
 908                DRM_DEBUG_ATOMIC("crtc%d -> enable %d, active %d, skip atomic_check\n",
 909                                crtc->base.id, crtc_state->enable,
 910                                crtc_state->active);
 911                memset(&cstate->new_perf, 0, sizeof(cstate->new_perf));
 912                goto end;
 913        }
 914
 915        mode = &crtc_state->adjusted_mode;
 916        DRM_DEBUG_ATOMIC("%s: check\n", dpu_crtc->name);
 917
 918        /* force a full mode set if active state changed */
 919        if (crtc_state->active_changed)
 920                crtc_state->mode_changed = true;
 921
 922        memset(pipe_staged, 0, sizeof(pipe_staged));
 923
 924        if (cstate->num_mixers) {
 925                mixer_width = mode->hdisplay / cstate->num_mixers;
 926
 927                _dpu_crtc_setup_lm_bounds(crtc, crtc_state);
 928        }
 929
 930        crtc_rect.x2 = mode->hdisplay;
 931        crtc_rect.y2 = mode->vdisplay;
 932
 933         /* get plane state for all drm planes associated with crtc state */
 934        drm_atomic_crtc_state_for_each_plane_state(plane, pstate, crtc_state) {
 935                struct drm_rect dst, clip = crtc_rect;
 936
 937                if (IS_ERR_OR_NULL(pstate)) {
 938                        rc = PTR_ERR(pstate);
 939                        DPU_ERROR("%s: failed to get plane%d state, %d\n",
 940                                        dpu_crtc->name, plane->base.id, rc);
 941                        goto end;
 942                }
 943                if (cnt >= DPU_STAGE_MAX * 4)
 944                        continue;
 945
 946                pstates[cnt].dpu_pstate = to_dpu_plane_state(pstate);
 947                pstates[cnt].drm_pstate = pstate;
 948                pstates[cnt].stage = pstate->normalized_zpos;
 949                pstates[cnt].pipe_id = dpu_plane_pipe(plane);
 950
 951                if (pipe_staged[pstates[cnt].pipe_id]) {
 952                        multirect_plane[multirect_count].r0 =
 953                                pipe_staged[pstates[cnt].pipe_id];
 954                        multirect_plane[multirect_count].r1 = pstate;
 955                        multirect_count++;
 956
 957                        pipe_staged[pstates[cnt].pipe_id] = NULL;
 958                } else {
 959                        pipe_staged[pstates[cnt].pipe_id] = pstate;
 960                }
 961
 962                cnt++;
 963
 964                dst = drm_plane_state_dest(pstate);
 965                if (!drm_rect_intersect(&clip, &dst)) {
 966                        DPU_ERROR("invalid vertical/horizontal destination\n");
 967                        DPU_ERROR("display: " DRM_RECT_FMT " plane: "
 968                                  DRM_RECT_FMT "\n", DRM_RECT_ARG(&crtc_rect),
 969                                  DRM_RECT_ARG(&dst));
 970                        rc = -E2BIG;
 971                        goto end;
 972                }
 973        }
 974
 975        for (i = 1; i < SSPP_MAX; i++) {
 976                if (pipe_staged[i]) {
 977                        dpu_plane_clear_multirect(pipe_staged[i]);
 978
 979                        if (is_dpu_plane_virtual(pipe_staged[i]->plane)) {
 980                                DPU_ERROR(
 981                                        "r1 only virt plane:%d not supported\n",
 982                                        pipe_staged[i]->plane->base.id);
 983                                rc  = -EINVAL;
 984                                goto end;
 985                        }
 986                }
 987        }
 988
 989        z_pos = -1;
 990        for (i = 0; i < cnt; i++) {
 991                /* reset counts at every new blend stage */
 992                if (pstates[i].stage != z_pos) {
 993                        left_zpos_cnt = 0;
 994                        right_zpos_cnt = 0;
 995                        z_pos = pstates[i].stage;
 996                }
 997
 998                /* verify z_pos setting before using it */
 999                if (z_pos >= DPU_STAGE_MAX - DPU_STAGE_0) {
1000                        DPU_ERROR("> %d plane stages assigned\n",
1001                                        DPU_STAGE_MAX - DPU_STAGE_0);
1002                        rc = -EINVAL;
1003                        goto end;
1004                } else if (pstates[i].drm_pstate->crtc_x < mixer_width) {
1005                        if (left_zpos_cnt == 2) {
1006                                DPU_ERROR("> 2 planes @ stage %d on left\n",
1007                                        z_pos);
1008                                rc = -EINVAL;
1009                                goto end;
1010                        }
1011                        left_zpos_cnt++;
1012
1013                } else {
1014                        if (right_zpos_cnt == 2) {
1015                                DPU_ERROR("> 2 planes @ stage %d on right\n",
1016                                        z_pos);
1017                                rc = -EINVAL;
1018                                goto end;
1019                        }
1020                        right_zpos_cnt++;
1021                }
1022
1023                pstates[i].dpu_pstate->stage = z_pos + DPU_STAGE_0;
1024                DRM_DEBUG_ATOMIC("%s: zpos %d\n", dpu_crtc->name, z_pos);
1025        }
1026
1027        for (i = 0; i < multirect_count; i++) {
1028                if (dpu_plane_validate_multirect_v2(&multirect_plane[i])) {
1029                        DPU_ERROR(
1030                        "multirect validation failed for planes (%d - %d)\n",
1031                                        multirect_plane[i].r0->plane->base.id,
1032                                        multirect_plane[i].r1->plane->base.id);
1033                        rc = -EINVAL;
1034                        goto end;
1035                }
1036        }
1037
1038        atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref);
1039
1040        rc = dpu_core_perf_crtc_check(crtc, crtc_state);
1041        if (rc) {
1042                DPU_ERROR("crtc%d failed performance check %d\n",
1043                                crtc->base.id, rc);
1044                goto end;
1045        }
1046
1047        /* validate source split:
1048         * use pstates sorted by stage to check planes on same stage
1049         * we assume that all pipes are in source split so its valid to compare
1050         * without taking into account left/right mixer placement
1051         */
1052        for (i = 1; i < cnt; i++) {
1053                struct plane_state *prv_pstate, *cur_pstate;
1054                struct drm_rect left_rect, right_rect;
1055                int32_t left_pid, right_pid;
1056                int32_t stage;
1057
1058                prv_pstate = &pstates[i - 1];
1059                cur_pstate = &pstates[i];
1060                if (prv_pstate->stage != cur_pstate->stage)
1061                        continue;
1062
1063                stage = cur_pstate->stage;
1064
1065                left_pid = prv_pstate->dpu_pstate->base.plane->base.id;
1066                left_rect = drm_plane_state_dest(prv_pstate->drm_pstate);
1067
1068                right_pid = cur_pstate->dpu_pstate->base.plane->base.id;
1069                right_rect = drm_plane_state_dest(cur_pstate->drm_pstate);
1070
1071                if (right_rect.x1 < left_rect.x1) {
1072                        swap(left_pid, right_pid);
1073                        swap(left_rect, right_rect);
1074                }
1075
1076                /**
1077                 * - planes are enumerated in pipe-priority order such that
1078                 *   planes with lower drm_id must be left-most in a shared
1079                 *   blend-stage when using source split.
1080                 * - planes in source split must be contiguous in width
1081                 * - planes in source split must have same dest yoff and height
1082                 */
1083                if (right_pid < left_pid) {
1084                        DPU_ERROR(
1085                                "invalid src split cfg. priority mismatch. stage: %d left: %d right: %d\n",
1086                                stage, left_pid, right_pid);
1087                        rc = -EINVAL;
1088                        goto end;
1089                } else if (right_rect.x1 != drm_rect_width(&left_rect)) {
1090                        DPU_ERROR("non-contiguous coordinates for src split. "
1091                                  "stage: %d left: " DRM_RECT_FMT " right: "
1092                                  DRM_RECT_FMT "\n", stage,
1093                                  DRM_RECT_ARG(&left_rect),
1094                                  DRM_RECT_ARG(&right_rect));
1095                        rc = -EINVAL;
1096                        goto end;
1097                } else if (left_rect.y1 != right_rect.y1 ||
1098                           drm_rect_height(&left_rect) != drm_rect_height(&right_rect)) {
1099                        DPU_ERROR("source split at stage: %d. invalid "
1100                                  "yoff/height: left: " DRM_RECT_FMT " right: "
1101                                  DRM_RECT_FMT "\n", stage,
1102                                  DRM_RECT_ARG(&left_rect),
1103                                  DRM_RECT_ARG(&right_rect));
1104                        rc = -EINVAL;
1105                        goto end;
1106                }
1107        }
1108
1109end:
1110        kfree(pstates);
1111        return rc;
1112}
1113
1114int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)
1115{
1116        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
1117        struct drm_encoder *enc;
1118
1119        trace_dpu_crtc_vblank(DRMID(&dpu_crtc->base), en, dpu_crtc);
1120
1121        /*
1122         * Normally we would iterate through encoder_mask in crtc state to find
1123         * attached encoders. In this case, we might be disabling vblank _after_
1124         * encoder_mask has been cleared.
1125         *
1126         * Instead, we "assign" a crtc to the encoder in enable and clear it in
1127         * disable (which is also after encoder_mask is cleared). So instead of
1128         * using encoder mask, we'll ask the encoder to toggle itself iff it's
1129         * currently assigned to our crtc.
1130         *
1131         * Note also that this function cannot be called while crtc is disabled
1132         * since we use drm_crtc_vblank_on/off. So we don't need to worry
1133         * about the assigned crtcs being inconsistent with the current state
1134         * (which means no need to worry about modeset locks).
1135         */
1136        list_for_each_entry(enc, &crtc->dev->mode_config.encoder_list, head) {
1137                trace_dpu_crtc_vblank_enable(DRMID(crtc), DRMID(enc), en,
1138                                             dpu_crtc);
1139
1140                dpu_encoder_toggle_vblank_for_crtc(enc, crtc, en);
1141        }
1142
1143        return 0;
1144}
1145
1146#ifdef CONFIG_DEBUG_FS
1147static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
1148{
1149        struct dpu_crtc *dpu_crtc;
1150        struct dpu_plane_state *pstate = NULL;
1151        struct dpu_crtc_mixer *m;
1152
1153        struct drm_crtc *crtc;
1154        struct drm_plane *plane;
1155        struct drm_display_mode *mode;
1156        struct drm_framebuffer *fb;
1157        struct drm_plane_state *state;
1158        struct dpu_crtc_state *cstate;
1159
1160        int i, out_width;
1161
1162        dpu_crtc = s->private;
1163        crtc = &dpu_crtc->base;
1164
1165        drm_modeset_lock_all(crtc->dev);
1166        cstate = to_dpu_crtc_state(crtc->state);
1167
1168        mode = &crtc->state->adjusted_mode;
1169        out_width = mode->hdisplay / cstate->num_mixers;
1170
1171        seq_printf(s, "crtc:%d width:%d height:%d\n", crtc->base.id,
1172                                mode->hdisplay, mode->vdisplay);
1173
1174        seq_puts(s, "\n");
1175
1176        for (i = 0; i < cstate->num_mixers; ++i) {
1177                m = &cstate->mixers[i];
1178                seq_printf(s, "\tmixer:%d ctl:%d width:%d height:%d\n",
1179                        m->hw_lm->idx - LM_0, m->lm_ctl->idx - CTL_0,
1180                        out_width, mode->vdisplay);
1181        }
1182
1183        seq_puts(s, "\n");
1184
1185        drm_atomic_crtc_for_each_plane(plane, crtc) {
1186                pstate = to_dpu_plane_state(plane->state);
1187                state = plane->state;
1188
1189                if (!pstate || !state)
1190                        continue;
1191
1192                seq_printf(s, "\tplane:%u stage:%d\n", plane->base.id,
1193                        pstate->stage);
1194
1195                if (plane->state->fb) {
1196                        fb = plane->state->fb;
1197
1198                        seq_printf(s, "\tfb:%d image format:%4.4s wxh:%ux%u ",
1199                                fb->base.id, (char *) &fb->format->format,
1200                                fb->width, fb->height);
1201                        for (i = 0; i < ARRAY_SIZE(fb->format->cpp); ++i)
1202                                seq_printf(s, "cpp[%d]:%u ",
1203                                                i, fb->format->cpp[i]);
1204                        seq_puts(s, "\n\t");
1205
1206                        seq_printf(s, "modifier:%8llu ", fb->modifier);
1207                        seq_puts(s, "\n");
1208
1209                        seq_puts(s, "\t");
1210                        for (i = 0; i < ARRAY_SIZE(fb->pitches); i++)
1211                                seq_printf(s, "pitches[%d]:%8u ", i,
1212                                                        fb->pitches[i]);
1213                        seq_puts(s, "\n");
1214
1215                        seq_puts(s, "\t");
1216                        for (i = 0; i < ARRAY_SIZE(fb->offsets); i++)
1217                                seq_printf(s, "offsets[%d]:%8u ", i,
1218                                                        fb->offsets[i]);
1219                        seq_puts(s, "\n");
1220                }
1221
1222                seq_printf(s, "\tsrc_x:%4d src_y:%4d src_w:%4d src_h:%4d\n",
1223                        state->src_x, state->src_y, state->src_w, state->src_h);
1224
1225                seq_printf(s, "\tdst x:%4d dst_y:%4d dst_w:%4d dst_h:%4d\n",
1226                        state->crtc_x, state->crtc_y, state->crtc_w,
1227                        state->crtc_h);
1228                seq_printf(s, "\tmultirect: mode: %d index: %d\n",
1229                        pstate->multirect_mode, pstate->multirect_index);
1230
1231                seq_puts(s, "\n");
1232        }
1233        if (dpu_crtc->vblank_cb_count) {
1234                ktime_t diff = ktime_sub(ktime_get(), dpu_crtc->vblank_cb_time);
1235                s64 diff_ms = ktime_to_ms(diff);
1236                s64 fps = diff_ms ? div_s64(
1237                                dpu_crtc->vblank_cb_count * 1000, diff_ms) : 0;
1238
1239                seq_printf(s,
1240                        "vblank fps:%lld count:%u total:%llums total_framecount:%llu\n",
1241                                fps, dpu_crtc->vblank_cb_count,
1242                                ktime_to_ms(diff), dpu_crtc->play_count);
1243
1244                /* reset time & count for next measurement */
1245                dpu_crtc->vblank_cb_count = 0;
1246                dpu_crtc->vblank_cb_time = ktime_set(0, 0);
1247        }
1248
1249        drm_modeset_unlock_all(crtc->dev);
1250
1251        return 0;
1252}
1253
1254DEFINE_SHOW_ATTRIBUTE(_dpu_debugfs_status);
1255
1256static int dpu_crtc_debugfs_state_show(struct seq_file *s, void *v)
1257{
1258        struct drm_crtc *crtc = (struct drm_crtc *) s->private;
1259        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
1260
1261        seq_printf(s, "client type: %d\n", dpu_crtc_get_client_type(crtc));
1262        seq_printf(s, "intf_mode: %d\n", dpu_crtc_get_intf_mode(crtc));
1263        seq_printf(s, "core_clk_rate: %llu\n",
1264                        dpu_crtc->cur_perf.core_clk_rate);
1265        seq_printf(s, "bw_ctl: %llu\n", dpu_crtc->cur_perf.bw_ctl);
1266        seq_printf(s, "max_per_pipe_ib: %llu\n",
1267                                dpu_crtc->cur_perf.max_per_pipe_ib);
1268
1269        return 0;
1270}
1271DEFINE_SHOW_ATTRIBUTE(dpu_crtc_debugfs_state);
1272
1273static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc)
1274{
1275        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
1276
1277        dpu_crtc->debugfs_root = debugfs_create_dir(dpu_crtc->name,
1278                        crtc->dev->primary->debugfs_root);
1279
1280        debugfs_create_file("status", 0400,
1281                        dpu_crtc->debugfs_root,
1282                        dpu_crtc, &_dpu_debugfs_status_fops);
1283        debugfs_create_file("state", 0600,
1284                        dpu_crtc->debugfs_root,
1285                        &dpu_crtc->base,
1286                        &dpu_crtc_debugfs_state_fops);
1287
1288        return 0;
1289}
1290#else
1291static int _dpu_crtc_init_debugfs(struct drm_crtc *crtc)
1292{
1293        return 0;
1294}
1295#endif /* CONFIG_DEBUG_FS */
1296
1297static int dpu_crtc_late_register(struct drm_crtc *crtc)
1298{
1299        return _dpu_crtc_init_debugfs(crtc);
1300}
1301
1302static void dpu_crtc_early_unregister(struct drm_crtc *crtc)
1303{
1304        struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
1305
1306        debugfs_remove_recursive(dpu_crtc->debugfs_root);
1307}
1308
1309static const struct drm_crtc_funcs dpu_crtc_funcs = {
1310        .set_config = drm_atomic_helper_set_config,
1311        .destroy = dpu_crtc_destroy,
1312        .page_flip = drm_atomic_helper_page_flip,
1313        .reset = dpu_crtc_reset,
1314        .atomic_duplicate_state = dpu_crtc_duplicate_state,
1315        .atomic_destroy_state = dpu_crtc_destroy_state,
1316        .late_register = dpu_crtc_late_register,
1317        .early_unregister = dpu_crtc_early_unregister,
1318        .enable_vblank  = msm_crtc_enable_vblank,
1319        .disable_vblank = msm_crtc_disable_vblank,
1320        .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
1321        .get_vblank_counter = dpu_crtc_get_vblank_counter,
1322};
1323
1324static const struct drm_crtc_helper_funcs dpu_crtc_helper_funcs = {
1325        .atomic_disable = dpu_crtc_disable,
1326        .atomic_enable = dpu_crtc_enable,
1327        .atomic_check = dpu_crtc_atomic_check,
1328        .atomic_begin = dpu_crtc_atomic_begin,
1329        .atomic_flush = dpu_crtc_atomic_flush,
1330        .get_scanout_position = dpu_crtc_get_scanout_position,
1331};
1332
1333/* initialize crtc */
1334struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
1335                                struct drm_plane *cursor)
1336{
1337        struct drm_crtc *crtc = NULL;
1338        struct dpu_crtc *dpu_crtc = NULL;
1339        int i;
1340
1341        dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);
1342        if (!dpu_crtc)
1343                return ERR_PTR(-ENOMEM);
1344
1345        crtc = &dpu_crtc->base;
1346        crtc->dev = dev;
1347
1348        spin_lock_init(&dpu_crtc->spin_lock);
1349        atomic_set(&dpu_crtc->frame_pending, 0);
1350
1351        init_completion(&dpu_crtc->frame_done_comp);
1352
1353        INIT_LIST_HEAD(&dpu_crtc->frame_event_list);
1354
1355        for (i = 0; i < ARRAY_SIZE(dpu_crtc->frame_events); i++) {
1356                INIT_LIST_HEAD(&dpu_crtc->frame_events[i].list);
1357                list_add(&dpu_crtc->frame_events[i].list,
1358                                &dpu_crtc->frame_event_list);
1359                kthread_init_work(&dpu_crtc->frame_events[i].work,
1360                                dpu_crtc_frame_event_work);
1361        }
1362
1363        drm_crtc_init_with_planes(dev, crtc, plane, cursor, &dpu_crtc_funcs,
1364                                NULL);
1365
1366        drm_crtc_helper_add(crtc, &dpu_crtc_helper_funcs);
1367
1368        drm_crtc_enable_color_mgmt(crtc, 0, true, 0);
1369
1370        /* save user friendly CRTC name for later */
1371        snprintf(dpu_crtc->name, DPU_CRTC_NAME_SIZE, "crtc%u", crtc->base.id);
1372
1373        /* initialize event handling */
1374        spin_lock_init(&dpu_crtc->event_lock);
1375
1376        DRM_DEBUG_KMS("%s: successfully initialized crtc\n", dpu_crtc->name);
1377        return crtc;
1378}
1379