linux/drivers/gpu/drm/i915/display/intel_display_debugfs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: MIT
   2/*
   3 * Copyright © 2020 Intel Corporation
   4 */
   5
   6#include <drm/drm_debugfs.h>
   7#include <drm/drm_fourcc.h>
   8
   9#include "i915_debugfs.h"
  10#include "intel_csr.h"
  11#include "intel_display_debugfs.h"
  12#include "intel_display_power.h"
  13#include "intel_display_types.h"
  14#include "intel_dp.h"
  15#include "intel_fbc.h"
  16#include "intel_hdcp.h"
  17#include "intel_hdmi.h"
  18#include "intel_pm.h"
  19#include "intel_psr.h"
  20#include "intel_sideband.h"
  21
  22static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
  23{
  24        return to_i915(node->minor->dev);
  25}
  26
  27static int i915_frontbuffer_tracking(struct seq_file *m, void *unused)
  28{
  29        struct drm_i915_private *dev_priv = node_to_i915(m->private);
  30
  31        seq_printf(m, "FB tracking busy bits: 0x%08x\n",
  32                   dev_priv->fb_tracking.busy_bits);
  33
  34        seq_printf(m, "FB tracking flip bits: 0x%08x\n",
  35                   dev_priv->fb_tracking.flip_bits);
  36
  37        return 0;
  38}
  39
  40static int i915_fbc_status(struct seq_file *m, void *unused)
  41{
  42        struct drm_i915_private *dev_priv = node_to_i915(m->private);
  43        struct intel_fbc *fbc = &dev_priv->fbc;
  44        intel_wakeref_t wakeref;
  45
  46        if (!HAS_FBC(dev_priv))
  47                return -ENODEV;
  48
  49        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
  50        mutex_lock(&fbc->lock);
  51
  52        if (intel_fbc_is_active(dev_priv))
  53                seq_puts(m, "FBC enabled\n");
  54        else
  55                seq_printf(m, "FBC disabled: %s\n", fbc->no_fbc_reason);
  56
  57        if (intel_fbc_is_active(dev_priv)) {
  58                u32 mask;
  59
  60                if (INTEL_GEN(dev_priv) >= 8)
  61                        mask = intel_de_read(dev_priv, IVB_FBC_STATUS2) & BDW_FBC_COMP_SEG_MASK;
  62                else if (INTEL_GEN(dev_priv) >= 7)
  63                        mask = intel_de_read(dev_priv, IVB_FBC_STATUS2) & IVB_FBC_COMP_SEG_MASK;
  64                else if (INTEL_GEN(dev_priv) >= 5)
  65                        mask = intel_de_read(dev_priv, ILK_DPFC_STATUS) & ILK_DPFC_COMP_SEG_MASK;
  66                else if (IS_G4X(dev_priv))
  67                        mask = intel_de_read(dev_priv, DPFC_STATUS) & DPFC_COMP_SEG_MASK;
  68                else
  69                        mask = intel_de_read(dev_priv, FBC_STATUS) &
  70                                (FBC_STAT_COMPRESSING | FBC_STAT_COMPRESSED);
  71
  72                seq_printf(m, "Compressing: %s\n", yesno(mask));
  73        }
  74
  75        mutex_unlock(&fbc->lock);
  76        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
  77
  78        return 0;
  79}
  80
  81static int i915_fbc_false_color_get(void *data, u64 *val)
  82{
  83        struct drm_i915_private *dev_priv = data;
  84
  85        if (INTEL_GEN(dev_priv) < 7 || !HAS_FBC(dev_priv))
  86                return -ENODEV;
  87
  88        *val = dev_priv->fbc.false_color;
  89
  90        return 0;
  91}
  92
  93static int i915_fbc_false_color_set(void *data, u64 val)
  94{
  95        struct drm_i915_private *dev_priv = data;
  96        u32 reg;
  97
  98        if (INTEL_GEN(dev_priv) < 7 || !HAS_FBC(dev_priv))
  99                return -ENODEV;
 100
 101        mutex_lock(&dev_priv->fbc.lock);
 102
 103        reg = intel_de_read(dev_priv, ILK_DPFC_CONTROL);
 104        dev_priv->fbc.false_color = val;
 105
 106        intel_de_write(dev_priv, ILK_DPFC_CONTROL,
 107                       val ? (reg | FBC_CTL_FALSE_COLOR) : (reg & ~FBC_CTL_FALSE_COLOR));
 108
 109        mutex_unlock(&dev_priv->fbc.lock);
 110        return 0;
 111}
 112
 113DEFINE_SIMPLE_ATTRIBUTE(i915_fbc_false_color_fops,
 114                        i915_fbc_false_color_get, i915_fbc_false_color_set,
 115                        "%llu\n");
 116
 117static int i915_ips_status(struct seq_file *m, void *unused)
 118{
 119        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 120        intel_wakeref_t wakeref;
 121
 122        if (!HAS_IPS(dev_priv))
 123                return -ENODEV;
 124
 125        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 126
 127        seq_printf(m, "Enabled by kernel parameter: %s\n",
 128                   yesno(dev_priv->params.enable_ips));
 129
 130        if (INTEL_GEN(dev_priv) >= 8) {
 131                seq_puts(m, "Currently: unknown\n");
 132        } else {
 133                if (intel_de_read(dev_priv, IPS_CTL) & IPS_ENABLE)
 134                        seq_puts(m, "Currently: enabled\n");
 135                else
 136                        seq_puts(m, "Currently: disabled\n");
 137        }
 138
 139        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 140
 141        return 0;
 142}
 143
 144static int i915_sr_status(struct seq_file *m, void *unused)
 145{
 146        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 147        intel_wakeref_t wakeref;
 148        bool sr_enabled = false;
 149
 150        wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
 151
 152        if (INTEL_GEN(dev_priv) >= 9)
 153                /* no global SR status; inspect per-plane WM */;
 154        else if (HAS_PCH_SPLIT(dev_priv))
 155                sr_enabled = intel_de_read(dev_priv, WM1_LP_ILK) & WM1_LP_SR_EN;
 156        else if (IS_I965GM(dev_priv) || IS_G4X(dev_priv) ||
 157                 IS_I945G(dev_priv) || IS_I945GM(dev_priv))
 158                sr_enabled = intel_de_read(dev_priv, FW_BLC_SELF) & FW_BLC_SELF_EN;
 159        else if (IS_I915GM(dev_priv))
 160                sr_enabled = intel_de_read(dev_priv, INSTPM) & INSTPM_SELF_EN;
 161        else if (IS_PINEVIEW(dev_priv))
 162                sr_enabled = intel_de_read(dev_priv, DSPFW3) & PINEVIEW_SELF_REFRESH_EN;
 163        else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
 164                sr_enabled = intel_de_read(dev_priv, FW_BLC_SELF_VLV) & FW_CSPWRDWNEN;
 165
 166        intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
 167
 168        seq_printf(m, "self-refresh: %s\n", enableddisabled(sr_enabled));
 169
 170        return 0;
 171}
 172
 173static int i915_opregion(struct seq_file *m, void *unused)
 174{
 175        struct intel_opregion *opregion = &node_to_i915(m->private)->opregion;
 176
 177        if (opregion->header)
 178                seq_write(m, opregion->header, OPREGION_SIZE);
 179
 180        return 0;
 181}
 182
 183static int i915_vbt(struct seq_file *m, void *unused)
 184{
 185        struct intel_opregion *opregion = &node_to_i915(m->private)->opregion;
 186
 187        if (opregion->vbt)
 188                seq_write(m, opregion->vbt, opregion->vbt_size);
 189
 190        return 0;
 191}
 192
 193static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 194{
 195        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 196        struct drm_device *dev = &dev_priv->drm;
 197        struct intel_framebuffer *fbdev_fb = NULL;
 198        struct drm_framebuffer *drm_fb;
 199
 200#ifdef CONFIG_DRM_FBDEV_EMULATION
 201        if (dev_priv->fbdev && dev_priv->fbdev->helper.fb) {
 202                fbdev_fb = to_intel_framebuffer(dev_priv->fbdev->helper.fb);
 203
 204                seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
 205                           fbdev_fb->base.width,
 206                           fbdev_fb->base.height,
 207                           fbdev_fb->base.format->depth,
 208                           fbdev_fb->base.format->cpp[0] * 8,
 209                           fbdev_fb->base.modifier,
 210                           drm_framebuffer_read_refcount(&fbdev_fb->base));
 211                i915_debugfs_describe_obj(m, intel_fb_obj(&fbdev_fb->base));
 212                seq_putc(m, '\n');
 213        }
 214#endif
 215
 216        mutex_lock(&dev->mode_config.fb_lock);
 217        drm_for_each_fb(drm_fb, dev) {
 218                struct intel_framebuffer *fb = to_intel_framebuffer(drm_fb);
 219                if (fb == fbdev_fb)
 220                        continue;
 221
 222                seq_printf(m, "user size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
 223                           fb->base.width,
 224                           fb->base.height,
 225                           fb->base.format->depth,
 226                           fb->base.format->cpp[0] * 8,
 227                           fb->base.modifier,
 228                           drm_framebuffer_read_refcount(&fb->base));
 229                i915_debugfs_describe_obj(m, intel_fb_obj(&fb->base));
 230                seq_putc(m, '\n');
 231        }
 232        mutex_unlock(&dev->mode_config.fb_lock);
 233
 234        return 0;
 235}
 236
 237static int i915_psr_sink_status_show(struct seq_file *m, void *data)
 238{
 239        u8 val;
 240        static const char * const sink_status[] = {
 241                "inactive",
 242                "transition to active, capture and display",
 243                "active, display from RFB",
 244                "active, capture and display on sink device timings",
 245                "transition to inactive, capture and display, timing re-sync",
 246                "reserved",
 247                "reserved",
 248                "sink internal error",
 249        };
 250        struct drm_connector *connector = m->private;
 251        struct drm_i915_private *dev_priv = to_i915(connector->dev);
 252        struct intel_dp *intel_dp =
 253                intel_attached_dp(to_intel_connector(connector));
 254        int ret;
 255
 256        if (!CAN_PSR(dev_priv)) {
 257                seq_puts(m, "PSR Unsupported\n");
 258                return -ENODEV;
 259        }
 260
 261        if (connector->status != connector_status_connected)
 262                return -ENODEV;
 263
 264        ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val);
 265
 266        if (ret == 1) {
 267                const char *str = "unknown";
 268
 269                val &= DP_PSR_SINK_STATE_MASK;
 270                if (val < ARRAY_SIZE(sink_status))
 271                        str = sink_status[val];
 272                seq_printf(m, "Sink PSR status: 0x%x [%s]\n", val, str);
 273        } else {
 274                return ret;
 275        }
 276
 277        return 0;
 278}
 279DEFINE_SHOW_ATTRIBUTE(i915_psr_sink_status);
 280
 281static void
 282psr_source_status(struct drm_i915_private *dev_priv, struct seq_file *m)
 283{
 284        u32 val, status_val;
 285        const char *status = "unknown";
 286
 287        if (dev_priv->psr.psr2_enabled) {
 288                static const char * const live_status[] = {
 289                        "IDLE",
 290                        "CAPTURE",
 291                        "CAPTURE_FS",
 292                        "SLEEP",
 293                        "BUFON_FW",
 294                        "ML_UP",
 295                        "SU_STANDBY",
 296                        "FAST_SLEEP",
 297                        "DEEP_SLEEP",
 298                        "BUF_ON",
 299                        "TG_ON"
 300                };
 301                val = intel_de_read(dev_priv,
 302                                    EDP_PSR2_STATUS(dev_priv->psr.transcoder));
 303                status_val = (val & EDP_PSR2_STATUS_STATE_MASK) >>
 304                              EDP_PSR2_STATUS_STATE_SHIFT;
 305                if (status_val < ARRAY_SIZE(live_status))
 306                        status = live_status[status_val];
 307        } else {
 308                static const char * const live_status[] = {
 309                        "IDLE",
 310                        "SRDONACK",
 311                        "SRDENT",
 312                        "BUFOFF",
 313                        "BUFON",
 314                        "AUXACK",
 315                        "SRDOFFACK",
 316                        "SRDENT_ON",
 317                };
 318                val = intel_de_read(dev_priv,
 319                                    EDP_PSR_STATUS(dev_priv->psr.transcoder));
 320                status_val = (val & EDP_PSR_STATUS_STATE_MASK) >>
 321                              EDP_PSR_STATUS_STATE_SHIFT;
 322                if (status_val < ARRAY_SIZE(live_status))
 323                        status = live_status[status_val];
 324        }
 325
 326        seq_printf(m, "Source PSR status: %s [0x%08x]\n", status, val);
 327}
 328
 329static int i915_edp_psr_status(struct seq_file *m, void *data)
 330{
 331        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 332        struct i915_psr *psr = &dev_priv->psr;
 333        intel_wakeref_t wakeref;
 334        const char *status;
 335        bool enabled;
 336        u32 val;
 337
 338        if (!HAS_PSR(dev_priv))
 339                return -ENODEV;
 340
 341        seq_printf(m, "Sink support: %s", yesno(psr->sink_support));
 342        if (psr->dp)
 343                seq_printf(m, " [0x%02x]", psr->dp->psr_dpcd[0]);
 344        seq_puts(m, "\n");
 345
 346        if (!psr->sink_support)
 347                return 0;
 348
 349        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 350        mutex_lock(&psr->lock);
 351
 352        if (psr->enabled)
 353                status = psr->psr2_enabled ? "PSR2 enabled" : "PSR1 enabled";
 354        else
 355                status = "disabled";
 356        seq_printf(m, "PSR mode: %s\n", status);
 357
 358        if (!psr->enabled) {
 359                seq_printf(m, "PSR sink not reliable: %s\n",
 360                           yesno(psr->sink_not_reliable));
 361
 362                goto unlock;
 363        }
 364
 365        if (psr->psr2_enabled) {
 366                val = intel_de_read(dev_priv,
 367                                    EDP_PSR2_CTL(dev_priv->psr.transcoder));
 368                enabled = val & EDP_PSR2_ENABLE;
 369        } else {
 370                val = intel_de_read(dev_priv,
 371                                    EDP_PSR_CTL(dev_priv->psr.transcoder));
 372                enabled = val & EDP_PSR_ENABLE;
 373        }
 374        seq_printf(m, "Source PSR ctl: %s [0x%08x]\n",
 375                   enableddisabled(enabled), val);
 376        psr_source_status(dev_priv, m);
 377        seq_printf(m, "Busy frontbuffer bits: 0x%08x\n",
 378                   psr->busy_frontbuffer_bits);
 379
 380        /*
 381         * SKL+ Perf counter is reset to 0 everytime DC state is entered
 382         */
 383        if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
 384                val = intel_de_read(dev_priv,
 385                                    EDP_PSR_PERF_CNT(dev_priv->psr.transcoder));
 386                val &= EDP_PSR_PERF_CNT_MASK;
 387                seq_printf(m, "Performance counter: %u\n", val);
 388        }
 389
 390        if (psr->debug & I915_PSR_DEBUG_IRQ) {
 391                seq_printf(m, "Last attempted entry at: %lld\n",
 392                           psr->last_entry_attempt);
 393                seq_printf(m, "Last exit at: %lld\n", psr->last_exit);
 394        }
 395
 396        if (psr->psr2_enabled) {
 397                u32 su_frames_val[3];
 398                int frame;
 399
 400                /*
 401                 * Reading all 3 registers before hand to minimize crossing a
 402                 * frame boundary between register reads
 403                 */
 404                for (frame = 0; frame < PSR2_SU_STATUS_FRAMES; frame += 3) {
 405                        val = intel_de_read(dev_priv,
 406                                            PSR2_SU_STATUS(dev_priv->psr.transcoder, frame));
 407                        su_frames_val[frame / 3] = val;
 408                }
 409
 410                seq_puts(m, "Frame:\tPSR2 SU blocks:\n");
 411
 412                for (frame = 0; frame < PSR2_SU_STATUS_FRAMES; frame++) {
 413                        u32 su_blocks;
 414
 415                        su_blocks = su_frames_val[frame / 3] &
 416                                    PSR2_SU_STATUS_MASK(frame);
 417                        su_blocks = su_blocks >> PSR2_SU_STATUS_SHIFT(frame);
 418                        seq_printf(m, "%d\t%d\n", frame, su_blocks);
 419                }
 420
 421                seq_printf(m, "PSR2 selective fetch: %s\n",
 422                           enableddisabled(psr->psr2_sel_fetch_enabled));
 423        }
 424
 425unlock:
 426        mutex_unlock(&psr->lock);
 427        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 428
 429        return 0;
 430}
 431
 432static int
 433i915_edp_psr_debug_set(void *data, u64 val)
 434{
 435        struct drm_i915_private *dev_priv = data;
 436        intel_wakeref_t wakeref;
 437        int ret;
 438
 439        if (!CAN_PSR(dev_priv))
 440                return -ENODEV;
 441
 442        drm_dbg_kms(&dev_priv->drm, "Setting PSR debug to %llx\n", val);
 443
 444        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 445
 446        ret = intel_psr_debug_set(dev_priv, val);
 447
 448        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 449
 450        return ret;
 451}
 452
 453static int
 454i915_edp_psr_debug_get(void *data, u64 *val)
 455{
 456        struct drm_i915_private *dev_priv = data;
 457
 458        if (!CAN_PSR(dev_priv))
 459                return -ENODEV;
 460
 461        *val = READ_ONCE(dev_priv->psr.debug);
 462        return 0;
 463}
 464
 465DEFINE_SIMPLE_ATTRIBUTE(i915_edp_psr_debug_fops,
 466                        i915_edp_psr_debug_get, i915_edp_psr_debug_set,
 467                        "%llu\n");
 468
 469static int i915_power_domain_info(struct seq_file *m, void *unused)
 470{
 471        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 472        struct i915_power_domains *power_domains = &dev_priv->power_domains;
 473        int i;
 474
 475        mutex_lock(&power_domains->lock);
 476
 477        seq_printf(m, "%-25s %s\n", "Power well/domain", "Use count");
 478        for (i = 0; i < power_domains->power_well_count; i++) {
 479                struct i915_power_well *power_well;
 480                enum intel_display_power_domain power_domain;
 481
 482                power_well = &power_domains->power_wells[i];
 483                seq_printf(m, "%-25s %d\n", power_well->desc->name,
 484                           power_well->count);
 485
 486                for_each_power_domain(power_domain, power_well->desc->domains)
 487                        seq_printf(m, "  %-23s %d\n",
 488                                 intel_display_power_domain_str(power_domain),
 489                                 power_domains->domain_use_count[power_domain]);
 490        }
 491
 492        mutex_unlock(&power_domains->lock);
 493
 494        return 0;
 495}
 496
 497static int i915_dmc_info(struct seq_file *m, void *unused)
 498{
 499        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 500        intel_wakeref_t wakeref;
 501        struct intel_csr *csr;
 502        i915_reg_t dc5_reg, dc6_reg = {};
 503
 504        if (!HAS_CSR(dev_priv))
 505                return -ENODEV;
 506
 507        csr = &dev_priv->csr;
 508
 509        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 510
 511        seq_printf(m, "fw loaded: %s\n", yesno(csr->dmc_payload != NULL));
 512        seq_printf(m, "path: %s\n", csr->fw_path);
 513
 514        if (!csr->dmc_payload)
 515                goto out;
 516
 517        seq_printf(m, "version: %d.%d\n", CSR_VERSION_MAJOR(csr->version),
 518                   CSR_VERSION_MINOR(csr->version));
 519
 520        if (INTEL_GEN(dev_priv) >= 12) {
 521                dc5_reg = TGL_DMC_DEBUG_DC5_COUNT;
 522                dc6_reg = TGL_DMC_DEBUG_DC6_COUNT;
 523                /*
 524                 * NOTE: DMC_DEBUG3 is a general purpose reg.
 525                 * According to B.Specs:49196 DMC f/w reuses DC5/6 counter
 526                 * reg for DC3CO debugging and validation,
 527                 * but TGL DMC f/w is using DMC_DEBUG3 reg for DC3CO counter.
 528                 */
 529                seq_printf(m, "DC3CO count: %d\n",
 530                           intel_de_read(dev_priv, DMC_DEBUG3));
 531        } else {
 532                dc5_reg = IS_BROXTON(dev_priv) ? BXT_CSR_DC3_DC5_COUNT :
 533                                                 SKL_CSR_DC3_DC5_COUNT;
 534                if (!IS_GEN9_LP(dev_priv))
 535                        dc6_reg = SKL_CSR_DC5_DC6_COUNT;
 536        }
 537
 538        seq_printf(m, "DC3 -> DC5 count: %d\n",
 539                   intel_de_read(dev_priv, dc5_reg));
 540        if (dc6_reg.reg)
 541                seq_printf(m, "DC5 -> DC6 count: %d\n",
 542                           intel_de_read(dev_priv, dc6_reg));
 543
 544out:
 545        seq_printf(m, "program base: 0x%08x\n",
 546                   intel_de_read(dev_priv, CSR_PROGRAM(0)));
 547        seq_printf(m, "ssp base: 0x%08x\n",
 548                   intel_de_read(dev_priv, CSR_SSP_BASE));
 549        seq_printf(m, "htp: 0x%08x\n", intel_de_read(dev_priv, CSR_HTP_SKL));
 550
 551        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 552
 553        return 0;
 554}
 555
 556static void intel_seq_print_mode(struct seq_file *m, int tabs,
 557                                 const struct drm_display_mode *mode)
 558{
 559        int i;
 560
 561        for (i = 0; i < tabs; i++)
 562                seq_putc(m, '\t');
 563
 564        seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
 565}
 566
 567static void intel_encoder_info(struct seq_file *m,
 568                               struct intel_crtc *crtc,
 569                               struct intel_encoder *encoder)
 570{
 571        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 572        struct drm_connector_list_iter conn_iter;
 573        struct drm_connector *connector;
 574
 575        seq_printf(m, "\t[ENCODER:%d:%s]: connectors:\n",
 576                   encoder->base.base.id, encoder->base.name);
 577
 578        drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
 579        drm_for_each_connector_iter(connector, &conn_iter) {
 580                const struct drm_connector_state *conn_state =
 581                        connector->state;
 582
 583                if (conn_state->best_encoder != &encoder->base)
 584                        continue;
 585
 586                seq_printf(m, "\t\t[CONNECTOR:%d:%s]\n",
 587                           connector->base.id, connector->name);
 588        }
 589        drm_connector_list_iter_end(&conn_iter);
 590}
 591
 592static void intel_panel_info(struct seq_file *m, struct intel_panel *panel)
 593{
 594        const struct drm_display_mode *mode = panel->fixed_mode;
 595
 596        seq_printf(m, "\tfixed mode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
 597}
 598
 599static void intel_hdcp_info(struct seq_file *m,
 600                            struct intel_connector *intel_connector)
 601{
 602        bool hdcp_cap, hdcp2_cap;
 603
 604        if (!intel_connector->hdcp.shim) {
 605                seq_puts(m, "No Connector Support");
 606                goto out;
 607        }
 608
 609        hdcp_cap = intel_hdcp_capable(intel_connector);
 610        hdcp2_cap = intel_hdcp2_capable(intel_connector);
 611
 612        if (hdcp_cap)
 613                seq_puts(m, "HDCP1.4 ");
 614        if (hdcp2_cap)
 615                seq_puts(m, "HDCP2.2 ");
 616
 617        if (!hdcp_cap && !hdcp2_cap)
 618                seq_puts(m, "None");
 619
 620out:
 621        seq_puts(m, "\n");
 622}
 623
 624static void intel_dp_info(struct seq_file *m,
 625                          struct intel_connector *intel_connector)
 626{
 627        struct intel_encoder *intel_encoder = intel_attached_encoder(intel_connector);
 628        struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder);
 629        const struct drm_property_blob *edid = intel_connector->base.edid_blob_ptr;
 630
 631        seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]);
 632        seq_printf(m, "\taudio support: %s\n", yesno(intel_dp->has_audio));
 633        if (intel_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)
 634                intel_panel_info(m, &intel_connector->panel);
 635
 636        drm_dp_downstream_debug(m, intel_dp->dpcd, intel_dp->downstream_ports,
 637                                edid ? edid->data : NULL, &intel_dp->aux);
 638}
 639
 640static void intel_dp_mst_info(struct seq_file *m,
 641                              struct intel_connector *intel_connector)
 642{
 643        bool has_audio = intel_connector->port->has_audio;
 644
 645        seq_printf(m, "\taudio support: %s\n", yesno(has_audio));
 646}
 647
 648static void intel_hdmi_info(struct seq_file *m,
 649                            struct intel_connector *intel_connector)
 650{
 651        struct intel_encoder *intel_encoder = intel_attached_encoder(intel_connector);
 652        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(intel_encoder);
 653
 654        seq_printf(m, "\taudio support: %s\n", yesno(intel_hdmi->has_audio));
 655}
 656
 657static void intel_lvds_info(struct seq_file *m,
 658                            struct intel_connector *intel_connector)
 659{
 660        intel_panel_info(m, &intel_connector->panel);
 661}
 662
 663static void intel_connector_info(struct seq_file *m,
 664                                 struct drm_connector *connector)
 665{
 666        struct intel_connector *intel_connector = to_intel_connector(connector);
 667        const struct drm_connector_state *conn_state = connector->state;
 668        struct intel_encoder *encoder =
 669                to_intel_encoder(conn_state->best_encoder);
 670        const struct drm_display_mode *mode;
 671
 672        seq_printf(m, "[CONNECTOR:%d:%s]: status: %s\n",
 673                   connector->base.id, connector->name,
 674                   drm_get_connector_status_name(connector->status));
 675
 676        if (connector->status == connector_status_disconnected)
 677                return;
 678
 679        seq_printf(m, "\tphysical dimensions: %dx%dmm\n",
 680                   connector->display_info.width_mm,
 681                   connector->display_info.height_mm);
 682        seq_printf(m, "\tsubpixel order: %s\n",
 683                   drm_get_subpixel_order_name(connector->display_info.subpixel_order));
 684        seq_printf(m, "\tCEA rev: %d\n", connector->display_info.cea_rev);
 685
 686        if (!encoder)
 687                return;
 688
 689        switch (connector->connector_type) {
 690        case DRM_MODE_CONNECTOR_DisplayPort:
 691        case DRM_MODE_CONNECTOR_eDP:
 692                if (encoder->type == INTEL_OUTPUT_DP_MST)
 693                        intel_dp_mst_info(m, intel_connector);
 694                else
 695                        intel_dp_info(m, intel_connector);
 696                break;
 697        case DRM_MODE_CONNECTOR_LVDS:
 698                if (encoder->type == INTEL_OUTPUT_LVDS)
 699                        intel_lvds_info(m, intel_connector);
 700                break;
 701        case DRM_MODE_CONNECTOR_HDMIA:
 702                if (encoder->type == INTEL_OUTPUT_HDMI ||
 703                    encoder->type == INTEL_OUTPUT_DDI)
 704                        intel_hdmi_info(m, intel_connector);
 705                break;
 706        default:
 707                break;
 708        }
 709
 710        seq_puts(m, "\tHDCP version: ");
 711        intel_hdcp_info(m, intel_connector);
 712
 713        seq_printf(m, "\tmodes:\n");
 714        list_for_each_entry(mode, &connector->modes, head)
 715                intel_seq_print_mode(m, 2, mode);
 716}
 717
 718static const char *plane_type(enum drm_plane_type type)
 719{
 720        switch (type) {
 721        case DRM_PLANE_TYPE_OVERLAY:
 722                return "OVL";
 723        case DRM_PLANE_TYPE_PRIMARY:
 724                return "PRI";
 725        case DRM_PLANE_TYPE_CURSOR:
 726                return "CUR";
 727        /*
 728         * Deliberately omitting default: to generate compiler warnings
 729         * when a new drm_plane_type gets added.
 730         */
 731        }
 732
 733        return "unknown";
 734}
 735
 736static void plane_rotation(char *buf, size_t bufsize, unsigned int rotation)
 737{
 738        /*
 739         * According to doc only one DRM_MODE_ROTATE_ is allowed but this
 740         * will print them all to visualize if the values are misused
 741         */
 742        snprintf(buf, bufsize,
 743                 "%s%s%s%s%s%s(0x%08x)",
 744                 (rotation & DRM_MODE_ROTATE_0) ? "0 " : "",
 745                 (rotation & DRM_MODE_ROTATE_90) ? "90 " : "",
 746                 (rotation & DRM_MODE_ROTATE_180) ? "180 " : "",
 747                 (rotation & DRM_MODE_ROTATE_270) ? "270 " : "",
 748                 (rotation & DRM_MODE_REFLECT_X) ? "FLIPX " : "",
 749                 (rotation & DRM_MODE_REFLECT_Y) ? "FLIPY " : "",
 750                 rotation);
 751}
 752
 753static void intel_plane_uapi_info(struct seq_file *m, struct intel_plane *plane)
 754{
 755        const struct intel_plane_state *plane_state =
 756                to_intel_plane_state(plane->base.state);
 757        const struct drm_framebuffer *fb = plane_state->uapi.fb;
 758        struct drm_format_name_buf format_name;
 759        struct drm_rect src, dst;
 760        char rot_str[48];
 761
 762        src = drm_plane_state_src(&plane_state->uapi);
 763        dst = drm_plane_state_dest(&plane_state->uapi);
 764
 765        if (fb)
 766                drm_get_format_name(fb->format->format, &format_name);
 767
 768        plane_rotation(rot_str, sizeof(rot_str),
 769                       plane_state->uapi.rotation);
 770
 771        seq_printf(m, "\t\tuapi: fb=%d,%s,%dx%d, src=" DRM_RECT_FP_FMT ", dst=" DRM_RECT_FMT ", rotation=%s\n",
 772                   fb ? fb->base.id : 0, fb ? format_name.str : "n/a",
 773                   fb ? fb->width : 0, fb ? fb->height : 0,
 774                   DRM_RECT_FP_ARG(&src),
 775                   DRM_RECT_ARG(&dst),
 776                   rot_str);
 777}
 778
 779static void intel_plane_hw_info(struct seq_file *m, struct intel_plane *plane)
 780{
 781        const struct intel_plane_state *plane_state =
 782                to_intel_plane_state(plane->base.state);
 783        const struct drm_framebuffer *fb = plane_state->hw.fb;
 784        struct drm_format_name_buf format_name;
 785        char rot_str[48];
 786
 787        if (!fb)
 788                return;
 789
 790        drm_get_format_name(fb->format->format, &format_name);
 791
 792        plane_rotation(rot_str, sizeof(rot_str),
 793                       plane_state->hw.rotation);
 794
 795        seq_printf(m, "\t\thw: fb=%d,%s,%dx%d, visible=%s, src=" DRM_RECT_FP_FMT ", dst=" DRM_RECT_FMT ", rotation=%s\n",
 796                   fb->base.id, format_name.str,
 797                   fb->width, fb->height,
 798                   yesno(plane_state->uapi.visible),
 799                   DRM_RECT_FP_ARG(&plane_state->uapi.src),
 800                   DRM_RECT_ARG(&plane_state->uapi.dst),
 801                   rot_str);
 802}
 803
 804static void intel_plane_info(struct seq_file *m, struct intel_crtc *crtc)
 805{
 806        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 807        struct intel_plane *plane;
 808
 809        for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
 810                seq_printf(m, "\t[PLANE:%d:%s]: type=%s\n",
 811                           plane->base.base.id, plane->base.name,
 812                           plane_type(plane->base.type));
 813                intel_plane_uapi_info(m, plane);
 814                intel_plane_hw_info(m, plane);
 815        }
 816}
 817
 818static void intel_scaler_info(struct seq_file *m, struct intel_crtc *crtc)
 819{
 820        const struct intel_crtc_state *crtc_state =
 821                to_intel_crtc_state(crtc->base.state);
 822        int num_scalers = crtc->num_scalers;
 823        int i;
 824
 825        /* Not all platformas have a scaler */
 826        if (num_scalers) {
 827                seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler_id=%d",
 828                           num_scalers,
 829                           crtc_state->scaler_state.scaler_users,
 830                           crtc_state->scaler_state.scaler_id);
 831
 832                for (i = 0; i < num_scalers; i++) {
 833                        const struct intel_scaler *sc =
 834                                &crtc_state->scaler_state.scalers[i];
 835
 836                        seq_printf(m, ", scalers[%d]: use=%s, mode=%x",
 837                                   i, yesno(sc->in_use), sc->mode);
 838                }
 839                seq_puts(m, "\n");
 840        } else {
 841                seq_puts(m, "\tNo scalers available on this platform\n");
 842        }
 843}
 844
 845static void intel_crtc_info(struct seq_file *m, struct intel_crtc *crtc)
 846{
 847        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 848        const struct intel_crtc_state *crtc_state =
 849                to_intel_crtc_state(crtc->base.state);
 850        struct intel_encoder *encoder;
 851
 852        seq_printf(m, "[CRTC:%d:%s]:\n",
 853                   crtc->base.base.id, crtc->base.name);
 854
 855        seq_printf(m, "\tuapi: enable=%s, active=%s, mode=" DRM_MODE_FMT "\n",
 856                   yesno(crtc_state->uapi.enable),
 857                   yesno(crtc_state->uapi.active),
 858                   DRM_MODE_ARG(&crtc_state->uapi.mode));
 859
 860        if (crtc_state->hw.enable) {
 861                seq_printf(m, "\thw: active=%s, adjusted_mode=" DRM_MODE_FMT "\n",
 862                           yesno(crtc_state->hw.active),
 863                           DRM_MODE_ARG(&crtc_state->hw.adjusted_mode));
 864
 865                seq_printf(m, "\tpipe src size=%dx%d, dither=%s, bpp=%d\n",
 866                           crtc_state->pipe_src_w, crtc_state->pipe_src_h,
 867                           yesno(crtc_state->dither), crtc_state->pipe_bpp);
 868
 869                intel_scaler_info(m, crtc);
 870        }
 871
 872        for_each_intel_encoder_mask(&dev_priv->drm, encoder,
 873                                    crtc_state->uapi.encoder_mask)
 874                intel_encoder_info(m, crtc, encoder);
 875
 876        intel_plane_info(m, crtc);
 877
 878        seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s\n",
 879                   yesno(!crtc->cpu_fifo_underrun_disabled),
 880                   yesno(!crtc->pch_fifo_underrun_disabled));
 881}
 882
 883static int i915_display_info(struct seq_file *m, void *unused)
 884{
 885        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 886        struct drm_device *dev = &dev_priv->drm;
 887        struct intel_crtc *crtc;
 888        struct drm_connector *connector;
 889        struct drm_connector_list_iter conn_iter;
 890        intel_wakeref_t wakeref;
 891
 892        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 893
 894        drm_modeset_lock_all(dev);
 895
 896        seq_printf(m, "CRTC info\n");
 897        seq_printf(m, "---------\n");
 898        for_each_intel_crtc(dev, crtc)
 899                intel_crtc_info(m, crtc);
 900
 901        seq_printf(m, "\n");
 902        seq_printf(m, "Connector info\n");
 903        seq_printf(m, "--------------\n");
 904        drm_connector_list_iter_begin(dev, &conn_iter);
 905        drm_for_each_connector_iter(connector, &conn_iter)
 906                intel_connector_info(m, connector);
 907        drm_connector_list_iter_end(&conn_iter);
 908
 909        drm_modeset_unlock_all(dev);
 910
 911        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 912
 913        return 0;
 914}
 915
 916static int i915_shared_dplls_info(struct seq_file *m, void *unused)
 917{
 918        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 919        struct drm_device *dev = &dev_priv->drm;
 920        int i;
 921
 922        drm_modeset_lock_all(dev);
 923
 924        seq_printf(m, "PLL refclks: non-SSC: %d kHz, SSC: %d kHz\n",
 925                   dev_priv->dpll.ref_clks.nssc,
 926                   dev_priv->dpll.ref_clks.ssc);
 927
 928        for (i = 0; i < dev_priv->dpll.num_shared_dpll; i++) {
 929                struct intel_shared_dpll *pll = &dev_priv->dpll.shared_dplls[i];
 930
 931                seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->info->name,
 932                           pll->info->id);
 933                seq_printf(m, " crtc_mask: 0x%08x, active: 0x%x, on: %s\n",
 934                           pll->state.crtc_mask, pll->active_mask, yesno(pll->on));
 935                seq_printf(m, " tracked hardware state:\n");
 936                seq_printf(m, " dpll:    0x%08x\n", pll->state.hw_state.dpll);
 937                seq_printf(m, " dpll_md: 0x%08x\n",
 938                           pll->state.hw_state.dpll_md);
 939                seq_printf(m, " fp0:     0x%08x\n", pll->state.hw_state.fp0);
 940                seq_printf(m, " fp1:     0x%08x\n", pll->state.hw_state.fp1);
 941                seq_printf(m, " wrpll:   0x%08x\n", pll->state.hw_state.wrpll);
 942                seq_printf(m, " cfgcr0:  0x%08x\n", pll->state.hw_state.cfgcr0);
 943                seq_printf(m, " cfgcr1:  0x%08x\n", pll->state.hw_state.cfgcr1);
 944                seq_printf(m, " mg_refclkin_ctl:        0x%08x\n",
 945                           pll->state.hw_state.mg_refclkin_ctl);
 946                seq_printf(m, " mg_clktop2_coreclkctl1: 0x%08x\n",
 947                           pll->state.hw_state.mg_clktop2_coreclkctl1);
 948                seq_printf(m, " mg_clktop2_hsclkctl:    0x%08x\n",
 949                           pll->state.hw_state.mg_clktop2_hsclkctl);
 950                seq_printf(m, " mg_pll_div0:  0x%08x\n",
 951                           pll->state.hw_state.mg_pll_div0);
 952                seq_printf(m, " mg_pll_div1:  0x%08x\n",
 953                           pll->state.hw_state.mg_pll_div1);
 954                seq_printf(m, " mg_pll_lf:    0x%08x\n",
 955                           pll->state.hw_state.mg_pll_lf);
 956                seq_printf(m, " mg_pll_frac_lock: 0x%08x\n",
 957                           pll->state.hw_state.mg_pll_frac_lock);
 958                seq_printf(m, " mg_pll_ssc:   0x%08x\n",
 959                           pll->state.hw_state.mg_pll_ssc);
 960                seq_printf(m, " mg_pll_bias:  0x%08x\n",
 961                           pll->state.hw_state.mg_pll_bias);
 962                seq_printf(m, " mg_pll_tdc_coldst_bias: 0x%08x\n",
 963                           pll->state.hw_state.mg_pll_tdc_coldst_bias);
 964        }
 965        drm_modeset_unlock_all(dev);
 966
 967        return 0;
 968}
 969
 970static int i915_ipc_status_show(struct seq_file *m, void *data)
 971{
 972        struct drm_i915_private *dev_priv = m->private;
 973
 974        seq_printf(m, "Isochronous Priority Control: %s\n",
 975                        yesno(dev_priv->ipc_enabled));
 976        return 0;
 977}
 978
 979static int i915_ipc_status_open(struct inode *inode, struct file *file)
 980{
 981        struct drm_i915_private *dev_priv = inode->i_private;
 982
 983        if (!HAS_IPC(dev_priv))
 984                return -ENODEV;
 985
 986        return single_open(file, i915_ipc_status_show, dev_priv);
 987}
 988
 989static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf,
 990                                     size_t len, loff_t *offp)
 991{
 992        struct seq_file *m = file->private_data;
 993        struct drm_i915_private *dev_priv = m->private;
 994        intel_wakeref_t wakeref;
 995        bool enable;
 996        int ret;
 997
 998        ret = kstrtobool_from_user(ubuf, len, &enable);
 999        if (ret < 0)
1000                return ret;
1001
1002        with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
1003                if (!dev_priv->ipc_enabled && enable)
1004                        drm_info(&dev_priv->drm,
1005                                 "Enabling IPC: WM will be proper only after next commit\n");
1006                dev_priv->wm.distrust_bios_wm = true;
1007                dev_priv->ipc_enabled = enable;
1008                intel_enable_ipc(dev_priv);
1009        }
1010
1011        return len;
1012}
1013
1014static const struct file_operations i915_ipc_status_fops = {
1015        .owner = THIS_MODULE,
1016        .open = i915_ipc_status_open,
1017        .read = seq_read,
1018        .llseek = seq_lseek,
1019        .release = single_release,
1020        .write = i915_ipc_status_write
1021};
1022
1023static int i915_ddb_info(struct seq_file *m, void *unused)
1024{
1025        struct drm_i915_private *dev_priv = node_to_i915(m->private);
1026        struct drm_device *dev = &dev_priv->drm;
1027        struct skl_ddb_entry *entry;
1028        struct intel_crtc *crtc;
1029
1030        if (INTEL_GEN(dev_priv) < 9)
1031                return -ENODEV;
1032
1033        drm_modeset_lock_all(dev);
1034
1035        seq_printf(m, "%-15s%8s%8s%8s\n", "", "Start", "End", "Size");
1036
1037        for_each_intel_crtc(&dev_priv->drm, crtc) {
1038                struct intel_crtc_state *crtc_state =
1039                        to_intel_crtc_state(crtc->base.state);
1040                enum pipe pipe = crtc->pipe;
1041                enum plane_id plane_id;
1042
1043                seq_printf(m, "Pipe %c\n", pipe_name(pipe));
1044
1045                for_each_plane_id_on_crtc(crtc, plane_id) {
1046                        entry = &crtc_state->wm.skl.plane_ddb_y[plane_id];
1047                        seq_printf(m, "  Plane%-8d%8u%8u%8u\n", plane_id + 1,
1048                                   entry->start, entry->end,
1049                                   skl_ddb_entry_size(entry));
1050                }
1051
1052                entry = &crtc_state->wm.skl.plane_ddb_y[PLANE_CURSOR];
1053                seq_printf(m, "  %-13s%8u%8u%8u\n", "Cursor", entry->start,
1054                           entry->end, skl_ddb_entry_size(entry));
1055        }
1056
1057        drm_modeset_unlock_all(dev);
1058
1059        return 0;
1060}
1061
1062static void drrs_status_per_crtc(struct seq_file *m,
1063                                 struct drm_device *dev,
1064                                 struct intel_crtc *intel_crtc)
1065{
1066        struct drm_i915_private *dev_priv = to_i915(dev);
1067        struct i915_drrs *drrs = &dev_priv->drrs;
1068        int vrefresh = 0;
1069        struct drm_connector *connector;
1070        struct drm_connector_list_iter conn_iter;
1071
1072        drm_connector_list_iter_begin(dev, &conn_iter);
1073        drm_for_each_connector_iter(connector, &conn_iter) {
1074                bool supported = false;
1075
1076                if (connector->state->crtc != &intel_crtc->base)
1077                        continue;
1078
1079                seq_printf(m, "%s:\n", connector->name);
1080
1081                if (connector->connector_type == DRM_MODE_CONNECTOR_eDP &&
1082                    drrs->type == SEAMLESS_DRRS_SUPPORT)
1083                        supported = true;
1084
1085                seq_printf(m, "\tDRRS Supported: %s\n", yesno(supported));
1086        }
1087        drm_connector_list_iter_end(&conn_iter);
1088
1089        seq_puts(m, "\n");
1090
1091        if (to_intel_crtc_state(intel_crtc->base.state)->has_drrs) {
1092                struct intel_panel *panel;
1093
1094                mutex_lock(&drrs->mutex);
1095                /* DRRS Supported */
1096                seq_puts(m, "\tDRRS Enabled: Yes\n");
1097
1098                /* disable_drrs() will make drrs->dp NULL */
1099                if (!drrs->dp) {
1100                        seq_puts(m, "Idleness DRRS: Disabled\n");
1101                        if (dev_priv->psr.enabled)
1102                                seq_puts(m,
1103                                "\tAs PSR is enabled, DRRS is not enabled\n");
1104                        mutex_unlock(&drrs->mutex);
1105                        return;
1106                }
1107
1108                panel = &drrs->dp->attached_connector->panel;
1109                seq_printf(m, "\t\tBusy_frontbuffer_bits: 0x%X",
1110                                        drrs->busy_frontbuffer_bits);
1111
1112                seq_puts(m, "\n\t\t");
1113                if (drrs->refresh_rate_type == DRRS_HIGH_RR) {
1114                        seq_puts(m, "DRRS_State: DRRS_HIGH_RR\n");
1115                        vrefresh = drm_mode_vrefresh(panel->fixed_mode);
1116                } else if (drrs->refresh_rate_type == DRRS_LOW_RR) {
1117                        seq_puts(m, "DRRS_State: DRRS_LOW_RR\n");
1118                        vrefresh = drm_mode_vrefresh(panel->downclock_mode);
1119                } else {
1120                        seq_printf(m, "DRRS_State: Unknown(%d)\n",
1121                                                drrs->refresh_rate_type);
1122                        mutex_unlock(&drrs->mutex);
1123                        return;
1124                }
1125                seq_printf(m, "\t\tVrefresh: %d", vrefresh);
1126
1127                seq_puts(m, "\n\t\t");
1128                mutex_unlock(&drrs->mutex);
1129        } else {
1130                /* DRRS not supported. Print the VBT parameter*/
1131                seq_puts(m, "\tDRRS Enabled : No");
1132        }
1133        seq_puts(m, "\n");
1134}
1135
1136static int i915_drrs_status(struct seq_file *m, void *unused)
1137{
1138        struct drm_i915_private *dev_priv = node_to_i915(m->private);
1139        struct drm_device *dev = &dev_priv->drm;
1140        struct intel_crtc *intel_crtc;
1141        int active_crtc_cnt = 0;
1142
1143        drm_modeset_lock_all(dev);
1144        for_each_intel_crtc(dev, intel_crtc) {
1145                if (intel_crtc->base.state->active) {
1146                        active_crtc_cnt++;
1147                        seq_printf(m, "\nCRTC %d:  ", active_crtc_cnt);
1148
1149                        drrs_status_per_crtc(m, dev, intel_crtc);
1150                }
1151        }
1152        drm_modeset_unlock_all(dev);
1153
1154        if (!active_crtc_cnt)
1155                seq_puts(m, "No active crtc found\n");
1156
1157        return 0;
1158}
1159
1160#define LPSP_STATUS(COND) (COND ? seq_puts(m, "LPSP: enabled\n") : \
1161                                seq_puts(m, "LPSP: disabled\n"))
1162
1163static bool
1164intel_lpsp_power_well_enabled(struct drm_i915_private *i915,
1165                              enum i915_power_well_id power_well_id)
1166{
1167        intel_wakeref_t wakeref;
1168        bool is_enabled;
1169
1170        wakeref = intel_runtime_pm_get(&i915->runtime_pm);
1171        is_enabled = intel_display_power_well_is_enabled(i915,
1172                                                         power_well_id);
1173        intel_runtime_pm_put(&i915->runtime_pm, wakeref);
1174
1175        return is_enabled;
1176}
1177
1178static int i915_lpsp_status(struct seq_file *m, void *unused)
1179{
1180        struct drm_i915_private *i915 = node_to_i915(m->private);
1181
1182        switch (INTEL_GEN(i915)) {
1183        case 12:
1184        case 11:
1185                LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, ICL_DISP_PW_3));
1186                break;
1187        case 10:
1188        case 9:
1189                LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, SKL_DISP_PW_2));
1190                break;
1191        default:
1192                /*
1193                 * Apart from HASWELL/BROADWELL other legacy platform doesn't
1194                 * support lpsp.
1195                 */
1196                if (IS_HASWELL(i915) || IS_BROADWELL(i915))
1197                        LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, HSW_DISP_PW_GLOBAL));
1198                else
1199                        seq_puts(m, "LPSP: not supported\n");
1200        }
1201
1202        return 0;
1203}
1204
1205static int i915_dp_mst_info(struct seq_file *m, void *unused)
1206{
1207        struct drm_i915_private *dev_priv = node_to_i915(m->private);
1208        struct drm_device *dev = &dev_priv->drm;
1209        struct intel_encoder *intel_encoder;
1210        struct intel_digital_port *dig_port;
1211        struct drm_connector *connector;
1212        struct drm_connector_list_iter conn_iter;
1213
1214        drm_connector_list_iter_begin(dev, &conn_iter);
1215        drm_for_each_connector_iter(connector, &conn_iter) {
1216                if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
1217                        continue;
1218
1219                intel_encoder = intel_attached_encoder(to_intel_connector(connector));
1220                if (!intel_encoder || intel_encoder->type == INTEL_OUTPUT_DP_MST)
1221                        continue;
1222
1223                dig_port = enc_to_dig_port(intel_encoder);
1224                if (!dig_port->dp.can_mst)
1225                        continue;
1226
1227                seq_printf(m, "MST Source Port [ENCODER:%d:%s]\n",
1228                           dig_port->base.base.base.id,
1229                           dig_port->base.base.name);
1230                drm_dp_mst_dump_topology(m, &dig_port->dp.mst_mgr);
1231        }
1232        drm_connector_list_iter_end(&conn_iter);
1233
1234        return 0;
1235}
1236
1237static ssize_t i915_displayport_test_active_write(struct file *file,
1238                                                  const char __user *ubuf,
1239                                                  size_t len, loff_t *offp)
1240{
1241        char *input_buffer;
1242        int status = 0;
1243        struct drm_device *dev;
1244        struct drm_connector *connector;
1245        struct drm_connector_list_iter conn_iter;
1246        struct intel_dp *intel_dp;
1247        int val = 0;
1248
1249        dev = ((struct seq_file *)file->private_data)->private;
1250
1251        if (len == 0)
1252                return 0;
1253
1254        input_buffer = memdup_user_nul(ubuf, len);
1255        if (IS_ERR(input_buffer))
1256                return PTR_ERR(input_buffer);
1257
1258        drm_dbg(&to_i915(dev)->drm,
1259                "Copied %d bytes from user\n", (unsigned int)len);
1260
1261        drm_connector_list_iter_begin(dev, &conn_iter);
1262        drm_for_each_connector_iter(connector, &conn_iter) {
1263                struct intel_encoder *encoder;
1264
1265                if (connector->connector_type !=
1266                    DRM_MODE_CONNECTOR_DisplayPort)
1267                        continue;
1268
1269                encoder = to_intel_encoder(connector->encoder);
1270                if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
1271                        continue;
1272
1273                if (encoder && connector->status == connector_status_connected) {
1274                        intel_dp = enc_to_intel_dp(encoder);
1275                        status = kstrtoint(input_buffer, 10, &val);
1276                        if (status < 0)
1277                                break;
1278                        drm_dbg(&to_i915(dev)->drm,
1279                                "Got %d for test active\n", val);
1280                        /* To prevent erroneous activation of the compliance
1281                         * testing code, only accept an actual value of 1 here
1282                         */
1283                        if (val == 1)
1284                                intel_dp->compliance.test_active = true;
1285                        else
1286                                intel_dp->compliance.test_active = false;
1287                }
1288        }
1289        drm_connector_list_iter_end(&conn_iter);
1290        kfree(input_buffer);
1291        if (status < 0)
1292                return status;
1293
1294        *offp += len;
1295        return len;
1296}
1297
1298static int i915_displayport_test_active_show(struct seq_file *m, void *data)
1299{
1300        struct drm_i915_private *dev_priv = m->private;
1301        struct drm_device *dev = &dev_priv->drm;
1302        struct drm_connector *connector;
1303        struct drm_connector_list_iter conn_iter;
1304        struct intel_dp *intel_dp;
1305
1306        drm_connector_list_iter_begin(dev, &conn_iter);
1307        drm_for_each_connector_iter(connector, &conn_iter) {
1308                struct intel_encoder *encoder;
1309
1310                if (connector->connector_type !=
1311                    DRM_MODE_CONNECTOR_DisplayPort)
1312                        continue;
1313
1314                encoder = to_intel_encoder(connector->encoder);
1315                if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
1316                        continue;
1317
1318                if (encoder && connector->status == connector_status_connected) {
1319                        intel_dp = enc_to_intel_dp(encoder);
1320                        if (intel_dp->compliance.test_active)
1321                                seq_puts(m, "1");
1322                        else
1323                                seq_puts(m, "0");
1324                } else
1325                        seq_puts(m, "0");
1326        }
1327        drm_connector_list_iter_end(&conn_iter);
1328
1329        return 0;
1330}
1331
1332static int i915_displayport_test_active_open(struct inode *inode,
1333                                             struct file *file)
1334{
1335        return single_open(file, i915_displayport_test_active_show,
1336                           inode->i_private);
1337}
1338
1339static const struct file_operations i915_displayport_test_active_fops = {
1340        .owner = THIS_MODULE,
1341        .open = i915_displayport_test_active_open,
1342        .read = seq_read,
1343        .llseek = seq_lseek,
1344        .release = single_release,
1345        .write = i915_displayport_test_active_write
1346};
1347
1348static int i915_displayport_test_data_show(struct seq_file *m, void *data)
1349{
1350        struct drm_i915_private *dev_priv = m->private;
1351        struct drm_device *dev = &dev_priv->drm;
1352        struct drm_connector *connector;
1353        struct drm_connector_list_iter conn_iter;
1354        struct intel_dp *intel_dp;
1355
1356        drm_connector_list_iter_begin(dev, &conn_iter);
1357        drm_for_each_connector_iter(connector, &conn_iter) {
1358                struct intel_encoder *encoder;
1359
1360                if (connector->connector_type !=
1361                    DRM_MODE_CONNECTOR_DisplayPort)
1362                        continue;
1363
1364                encoder = to_intel_encoder(connector->encoder);
1365                if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
1366                        continue;
1367
1368                if (encoder && connector->status == connector_status_connected) {
1369                        intel_dp = enc_to_intel_dp(encoder);
1370                        if (intel_dp->compliance.test_type ==
1371                            DP_TEST_LINK_EDID_READ)
1372                                seq_printf(m, "%lx",
1373                                           intel_dp->compliance.test_data.edid);
1374                        else if (intel_dp->compliance.test_type ==
1375                                 DP_TEST_LINK_VIDEO_PATTERN) {
1376                                seq_printf(m, "hdisplay: %d\n",
1377                                           intel_dp->compliance.test_data.hdisplay);
1378                                seq_printf(m, "vdisplay: %d\n",
1379                                           intel_dp->compliance.test_data.vdisplay);
1380                                seq_printf(m, "bpc: %u\n",
1381                                           intel_dp->compliance.test_data.bpc);
1382                        } else if (intel_dp->compliance.test_type ==
1383                                   DP_TEST_LINK_PHY_TEST_PATTERN) {
1384                                seq_printf(m, "pattern: %d\n",
1385                                           intel_dp->compliance.test_data.phytest.phy_pattern);
1386                                seq_printf(m, "Number of lanes: %d\n",
1387                                           intel_dp->compliance.test_data.phytest.num_lanes);
1388                                seq_printf(m, "Link Rate: %d\n",
1389                                           intel_dp->compliance.test_data.phytest.link_rate);
1390                                seq_printf(m, "level: %02x\n",
1391                                           intel_dp->train_set[0]);
1392                        }
1393                } else
1394                        seq_puts(m, "0");
1395        }
1396        drm_connector_list_iter_end(&conn_iter);
1397
1398        return 0;
1399}
1400DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_data);
1401
1402static int i915_displayport_test_type_show(struct seq_file *m, void *data)
1403{
1404        struct drm_i915_private *dev_priv = m->private;
1405        struct drm_device *dev = &dev_priv->drm;
1406        struct drm_connector *connector;
1407        struct drm_connector_list_iter conn_iter;
1408        struct intel_dp *intel_dp;
1409
1410        drm_connector_list_iter_begin(dev, &conn_iter);
1411        drm_for_each_connector_iter(connector, &conn_iter) {
1412                struct intel_encoder *encoder;
1413
1414                if (connector->connector_type !=
1415                    DRM_MODE_CONNECTOR_DisplayPort)
1416                        continue;
1417
1418                encoder = to_intel_encoder(connector->encoder);
1419                if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
1420                        continue;
1421
1422                if (encoder && connector->status == connector_status_connected) {
1423                        intel_dp = enc_to_intel_dp(encoder);
1424                        seq_printf(m, "%02lx\n", intel_dp->compliance.test_type);
1425                } else
1426                        seq_puts(m, "0");
1427        }
1428        drm_connector_list_iter_end(&conn_iter);
1429
1430        return 0;
1431}
1432DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_type);
1433
1434static void wm_latency_show(struct seq_file *m, const u16 wm[8])
1435{
1436        struct drm_i915_private *dev_priv = m->private;
1437        struct drm_device *dev = &dev_priv->drm;
1438        int level;
1439        int num_levels;
1440
1441        if (IS_CHERRYVIEW(dev_priv))
1442                num_levels = 3;
1443        else if (IS_VALLEYVIEW(dev_priv))
1444                num_levels = 1;
1445        else if (IS_G4X(dev_priv))
1446                num_levels = 3;
1447        else
1448                num_levels = ilk_wm_max_level(dev_priv) + 1;
1449
1450        drm_modeset_lock_all(dev);
1451
1452        for (level = 0; level < num_levels; level++) {
1453                unsigned int latency = wm[level];
1454
1455                /*
1456                 * - WM1+ latency values in 0.5us units
1457                 * - latencies are in us on gen9/vlv/chv
1458                 */
1459                if (INTEL_GEN(dev_priv) >= 9 ||
1460                    IS_VALLEYVIEW(dev_priv) ||
1461                    IS_CHERRYVIEW(dev_priv) ||
1462                    IS_G4X(dev_priv))
1463                        latency *= 10;
1464                else if (level > 0)
1465                        latency *= 5;
1466
1467                seq_printf(m, "WM%d %u (%u.%u usec)\n",
1468                           level, wm[level], latency / 10, latency % 10);
1469        }
1470
1471        drm_modeset_unlock_all(dev);
1472}
1473
1474static int pri_wm_latency_show(struct seq_file *m, void *data)
1475{
1476        struct drm_i915_private *dev_priv = m->private;
1477        const u16 *latencies;
1478
1479        if (INTEL_GEN(dev_priv) >= 9)
1480                latencies = dev_priv->wm.skl_latency;
1481        else
1482                latencies = dev_priv->wm.pri_latency;
1483
1484        wm_latency_show(m, latencies);
1485
1486        return 0;
1487}
1488
1489static int spr_wm_latency_show(struct seq_file *m, void *data)
1490{
1491        struct drm_i915_private *dev_priv = m->private;
1492        const u16 *latencies;
1493
1494        if (INTEL_GEN(dev_priv) >= 9)
1495                latencies = dev_priv->wm.skl_latency;
1496        else
1497                latencies = dev_priv->wm.spr_latency;
1498
1499        wm_latency_show(m, latencies);
1500
1501        return 0;
1502}
1503
1504static int cur_wm_latency_show(struct seq_file *m, void *data)
1505{
1506        struct drm_i915_private *dev_priv = m->private;
1507        const u16 *latencies;
1508
1509        if (INTEL_GEN(dev_priv) >= 9)
1510                latencies = dev_priv->wm.skl_latency;
1511        else
1512                latencies = dev_priv->wm.cur_latency;
1513
1514        wm_latency_show(m, latencies);
1515
1516        return 0;
1517}
1518
1519static int pri_wm_latency_open(struct inode *inode, struct file *file)
1520{
1521        struct drm_i915_private *dev_priv = inode->i_private;
1522
1523        if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
1524                return -ENODEV;
1525
1526        return single_open(file, pri_wm_latency_show, dev_priv);
1527}
1528
1529static int spr_wm_latency_open(struct inode *inode, struct file *file)
1530{
1531        struct drm_i915_private *dev_priv = inode->i_private;
1532
1533        if (HAS_GMCH(dev_priv))
1534                return -ENODEV;
1535
1536        return single_open(file, spr_wm_latency_show, dev_priv);
1537}
1538
1539static int cur_wm_latency_open(struct inode *inode, struct file *file)
1540{
1541        struct drm_i915_private *dev_priv = inode->i_private;
1542
1543        if (HAS_GMCH(dev_priv))
1544                return -ENODEV;
1545
1546        return single_open(file, cur_wm_latency_show, dev_priv);
1547}
1548
1549static ssize_t wm_latency_write(struct file *file, const char __user *ubuf,
1550                                size_t len, loff_t *offp, u16 wm[8])
1551{
1552        struct seq_file *m = file->private_data;
1553        struct drm_i915_private *dev_priv = m->private;
1554        struct drm_device *dev = &dev_priv->drm;
1555        u16 new[8] = { 0 };
1556        int num_levels;
1557        int level;
1558        int ret;
1559        char tmp[32];
1560
1561        if (IS_CHERRYVIEW(dev_priv))
1562                num_levels = 3;
1563        else if (IS_VALLEYVIEW(dev_priv))
1564                num_levels = 1;
1565        else if (IS_G4X(dev_priv))
1566                num_levels = 3;
1567        else
1568                num_levels = ilk_wm_max_level(dev_priv) + 1;
1569
1570        if (len >= sizeof(tmp))
1571                return -EINVAL;
1572
1573        if (copy_from_user(tmp, ubuf, len))
1574                return -EFAULT;
1575
1576        tmp[len] = '\0';
1577
1578        ret = sscanf(tmp, "%hu %hu %hu %hu %hu %hu %hu %hu",
1579                     &new[0], &new[1], &new[2], &new[3],
1580                     &new[4], &new[5], &new[6], &new[7]);
1581        if (ret != num_levels)
1582                return -EINVAL;
1583
1584        drm_modeset_lock_all(dev);
1585
1586        for (level = 0; level < num_levels; level++)
1587                wm[level] = new[level];
1588
1589        drm_modeset_unlock_all(dev);
1590
1591        return len;
1592}
1593
1594
1595static ssize_t pri_wm_latency_write(struct file *file, const char __user *ubuf,
1596                                    size_t len, loff_t *offp)
1597{
1598        struct seq_file *m = file->private_data;
1599        struct drm_i915_private *dev_priv = m->private;
1600        u16 *latencies;
1601
1602        if (INTEL_GEN(dev_priv) >= 9)
1603                latencies = dev_priv->wm.skl_latency;
1604        else
1605                latencies = dev_priv->wm.pri_latency;
1606
1607        return wm_latency_write(file, ubuf, len, offp, latencies);
1608}
1609
1610static ssize_t spr_wm_latency_write(struct file *file, const char __user *ubuf,
1611                                    size_t len, loff_t *offp)
1612{
1613        struct seq_file *m = file->private_data;
1614        struct drm_i915_private *dev_priv = m->private;
1615        u16 *latencies;
1616
1617        if (INTEL_GEN(dev_priv) >= 9)
1618                latencies = dev_priv->wm.skl_latency;
1619        else
1620                latencies = dev_priv->wm.spr_latency;
1621
1622        return wm_latency_write(file, ubuf, len, offp, latencies);
1623}
1624
1625static ssize_t cur_wm_latency_write(struct file *file, const char __user *ubuf,
1626                                    size_t len, loff_t *offp)
1627{
1628        struct seq_file *m = file->private_data;
1629        struct drm_i915_private *dev_priv = m->private;
1630        u16 *latencies;
1631
1632        if (INTEL_GEN(dev_priv) >= 9)
1633                latencies = dev_priv->wm.skl_latency;
1634        else
1635                latencies = dev_priv->wm.cur_latency;
1636
1637        return wm_latency_write(file, ubuf, len, offp, latencies);
1638}
1639
1640static const struct file_operations i915_pri_wm_latency_fops = {
1641        .owner = THIS_MODULE,
1642        .open = pri_wm_latency_open,
1643        .read = seq_read,
1644        .llseek = seq_lseek,
1645        .release = single_release,
1646        .write = pri_wm_latency_write
1647};
1648
1649static const struct file_operations i915_spr_wm_latency_fops = {
1650        .owner = THIS_MODULE,
1651        .open = spr_wm_latency_open,
1652        .read = seq_read,
1653        .llseek = seq_lseek,
1654        .release = single_release,
1655        .write = spr_wm_latency_write
1656};
1657
1658static const struct file_operations i915_cur_wm_latency_fops = {
1659        .owner = THIS_MODULE,
1660        .open = cur_wm_latency_open,
1661        .read = seq_read,
1662        .llseek = seq_lseek,
1663        .release = single_release,
1664        .write = cur_wm_latency_write
1665};
1666
1667static int i915_hpd_storm_ctl_show(struct seq_file *m, void *data)
1668{
1669        struct drm_i915_private *dev_priv = m->private;
1670        struct i915_hotplug *hotplug = &dev_priv->hotplug;
1671
1672        /* Synchronize with everything first in case there's been an HPD
1673         * storm, but we haven't finished handling it in the kernel yet
1674         */
1675        intel_synchronize_irq(dev_priv);
1676        flush_work(&dev_priv->hotplug.dig_port_work);
1677        flush_delayed_work(&dev_priv->hotplug.hotplug_work);
1678
1679        seq_printf(m, "Threshold: %d\n", hotplug->hpd_storm_threshold);
1680        seq_printf(m, "Detected: %s\n",
1681                   yesno(delayed_work_pending(&hotplug->reenable_work)));
1682
1683        return 0;
1684}
1685
1686static ssize_t i915_hpd_storm_ctl_write(struct file *file,
1687                                        const char __user *ubuf, size_t len,
1688                                        loff_t *offp)
1689{
1690        struct seq_file *m = file->private_data;
1691        struct drm_i915_private *dev_priv = m->private;
1692        struct i915_hotplug *hotplug = &dev_priv->hotplug;
1693        unsigned int new_threshold;
1694        int i;
1695        char *newline;
1696        char tmp[16];
1697
1698        if (len >= sizeof(tmp))
1699                return -EINVAL;
1700
1701        if (copy_from_user(tmp, ubuf, len))
1702                return -EFAULT;
1703
1704        tmp[len] = '\0';
1705
1706        /* Strip newline, if any */
1707        newline = strchr(tmp, '\n');
1708        if (newline)
1709                *newline = '\0';
1710
1711        if (strcmp(tmp, "reset") == 0)
1712                new_threshold = HPD_STORM_DEFAULT_THRESHOLD;
1713        else if (kstrtouint(tmp, 10, &new_threshold) != 0)
1714                return -EINVAL;
1715
1716        if (new_threshold > 0)
1717                drm_dbg_kms(&dev_priv->drm,
1718                            "Setting HPD storm detection threshold to %d\n",
1719                            new_threshold);
1720        else
1721                drm_dbg_kms(&dev_priv->drm, "Disabling HPD storm detection\n");
1722
1723        spin_lock_irq(&dev_priv->irq_lock);
1724        hotplug->hpd_storm_threshold = new_threshold;
1725        /* Reset the HPD storm stats so we don't accidentally trigger a storm */
1726        for_each_hpd_pin(i)
1727                hotplug->stats[i].count = 0;
1728        spin_unlock_irq(&dev_priv->irq_lock);
1729
1730        /* Re-enable hpd immediately if we were in an irq storm */
1731        flush_delayed_work(&dev_priv->hotplug.reenable_work);
1732
1733        return len;
1734}
1735
1736static int i915_hpd_storm_ctl_open(struct inode *inode, struct file *file)
1737{
1738        return single_open(file, i915_hpd_storm_ctl_show, inode->i_private);
1739}
1740
1741static const struct file_operations i915_hpd_storm_ctl_fops = {
1742        .owner = THIS_MODULE,
1743        .open = i915_hpd_storm_ctl_open,
1744        .read = seq_read,
1745        .llseek = seq_lseek,
1746        .release = single_release,
1747        .write = i915_hpd_storm_ctl_write
1748};
1749
1750static int i915_hpd_short_storm_ctl_show(struct seq_file *m, void *data)
1751{
1752        struct drm_i915_private *dev_priv = m->private;
1753
1754        seq_printf(m, "Enabled: %s\n",
1755                   yesno(dev_priv->hotplug.hpd_short_storm_enabled));
1756
1757        return 0;
1758}
1759
1760static int
1761i915_hpd_short_storm_ctl_open(struct inode *inode, struct file *file)
1762{
1763        return single_open(file, i915_hpd_short_storm_ctl_show,
1764                           inode->i_private);
1765}
1766
1767static ssize_t i915_hpd_short_storm_ctl_write(struct file *file,
1768                                              const char __user *ubuf,
1769                                              size_t len, loff_t *offp)
1770{
1771        struct seq_file *m = file->private_data;
1772        struct drm_i915_private *dev_priv = m->private;
1773        struct i915_hotplug *hotplug = &dev_priv->hotplug;
1774        char *newline;
1775        char tmp[16];
1776        int i;
1777        bool new_state;
1778
1779        if (len >= sizeof(tmp))
1780                return -EINVAL;
1781
1782        if (copy_from_user(tmp, ubuf, len))
1783                return -EFAULT;
1784
1785        tmp[len] = '\0';
1786
1787        /* Strip newline, if any */
1788        newline = strchr(tmp, '\n');
1789        if (newline)
1790                *newline = '\0';
1791
1792        /* Reset to the "default" state for this system */
1793        if (strcmp(tmp, "reset") == 0)
1794                new_state = !HAS_DP_MST(dev_priv);
1795        else if (kstrtobool(tmp, &new_state) != 0)
1796                return -EINVAL;
1797
1798        drm_dbg_kms(&dev_priv->drm, "%sabling HPD short storm detection\n",
1799                    new_state ? "En" : "Dis");
1800
1801        spin_lock_irq(&dev_priv->irq_lock);
1802        hotplug->hpd_short_storm_enabled = new_state;
1803        /* Reset the HPD storm stats so we don't accidentally trigger a storm */
1804        for_each_hpd_pin(i)
1805                hotplug->stats[i].count = 0;
1806        spin_unlock_irq(&dev_priv->irq_lock);
1807
1808        /* Re-enable hpd immediately if we were in an irq storm */
1809        flush_delayed_work(&dev_priv->hotplug.reenable_work);
1810
1811        return len;
1812}
1813
1814static const struct file_operations i915_hpd_short_storm_ctl_fops = {
1815        .owner = THIS_MODULE,
1816        .open = i915_hpd_short_storm_ctl_open,
1817        .read = seq_read,
1818        .llseek = seq_lseek,
1819        .release = single_release,
1820        .write = i915_hpd_short_storm_ctl_write,
1821};
1822
1823static int i915_drrs_ctl_set(void *data, u64 val)
1824{
1825        struct drm_i915_private *dev_priv = data;
1826        struct drm_device *dev = &dev_priv->drm;
1827        struct intel_crtc *crtc;
1828
1829        if (INTEL_GEN(dev_priv) < 7)
1830                return -ENODEV;
1831
1832        for_each_intel_crtc(dev, crtc) {
1833                struct drm_connector_list_iter conn_iter;
1834                struct intel_crtc_state *crtc_state;
1835                struct drm_connector *connector;
1836                struct drm_crtc_commit *commit;
1837                int ret;
1838
1839                ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex);
1840                if (ret)
1841                        return ret;
1842
1843                crtc_state = to_intel_crtc_state(crtc->base.state);
1844
1845                if (!crtc_state->hw.active ||
1846                    !crtc_state->has_drrs)
1847                        goto out;
1848
1849                commit = crtc_state->uapi.commit;
1850                if (commit) {
1851                        ret = wait_for_completion_interruptible(&commit->hw_done);
1852                        if (ret)
1853                                goto out;
1854                }
1855
1856                drm_connector_list_iter_begin(dev, &conn_iter);
1857                drm_for_each_connector_iter(connector, &conn_iter) {
1858                        struct intel_encoder *encoder;
1859                        struct intel_dp *intel_dp;
1860
1861                        if (!(crtc_state->uapi.connector_mask &
1862                              drm_connector_mask(connector)))
1863                                continue;
1864
1865                        encoder = intel_attached_encoder(to_intel_connector(connector));
1866                        if (encoder->type != INTEL_OUTPUT_EDP)
1867                                continue;
1868
1869                        drm_dbg(&dev_priv->drm,
1870                                "Manually %sabling DRRS. %llu\n",
1871                                val ? "en" : "dis", val);
1872
1873                        intel_dp = enc_to_intel_dp(encoder);
1874                        if (val)
1875                                intel_edp_drrs_enable(intel_dp,
1876                                                      crtc_state);
1877                        else
1878                                intel_edp_drrs_disable(intel_dp,
1879                                                       crtc_state);
1880                }
1881                drm_connector_list_iter_end(&conn_iter);
1882
1883out:
1884                drm_modeset_unlock(&crtc->base.mutex);
1885                if (ret)
1886                        return ret;
1887        }
1888
1889        return 0;
1890}
1891
1892DEFINE_SIMPLE_ATTRIBUTE(i915_drrs_ctl_fops, NULL, i915_drrs_ctl_set, "%llu\n");
1893
1894static ssize_t
1895i915_fifo_underrun_reset_write(struct file *filp,
1896                               const char __user *ubuf,
1897                               size_t cnt, loff_t *ppos)
1898{
1899        struct drm_i915_private *dev_priv = filp->private_data;
1900        struct intel_crtc *intel_crtc;
1901        struct drm_device *dev = &dev_priv->drm;
1902        int ret;
1903        bool reset;
1904
1905        ret = kstrtobool_from_user(ubuf, cnt, &reset);
1906        if (ret)
1907                return ret;
1908
1909        if (!reset)
1910                return cnt;
1911
1912        for_each_intel_crtc(dev, intel_crtc) {
1913                struct drm_crtc_commit *commit;
1914                struct intel_crtc_state *crtc_state;
1915
1916                ret = drm_modeset_lock_single_interruptible(&intel_crtc->base.mutex);
1917                if (ret)
1918                        return ret;
1919
1920                crtc_state = to_intel_crtc_state(intel_crtc->base.state);
1921                commit = crtc_state->uapi.commit;
1922                if (commit) {
1923                        ret = wait_for_completion_interruptible(&commit->hw_done);
1924                        if (!ret)
1925                                ret = wait_for_completion_interruptible(&commit->flip_done);
1926                }
1927
1928                if (!ret && crtc_state->hw.active) {
1929                        drm_dbg_kms(&dev_priv->drm,
1930                                    "Re-arming FIFO underruns on pipe %c\n",
1931                                    pipe_name(intel_crtc->pipe));
1932
1933                        intel_crtc_arm_fifo_underrun(intel_crtc, crtc_state);
1934                }
1935
1936                drm_modeset_unlock(&intel_crtc->base.mutex);
1937
1938                if (ret)
1939                        return ret;
1940        }
1941
1942        ret = intel_fbc_reset_underrun(dev_priv);
1943        if (ret)
1944                return ret;
1945
1946        return cnt;
1947}
1948
1949static const struct file_operations i915_fifo_underrun_reset_ops = {
1950        .owner = THIS_MODULE,
1951        .open = simple_open,
1952        .write = i915_fifo_underrun_reset_write,
1953        .llseek = default_llseek,
1954};
1955
1956static const struct drm_info_list intel_display_debugfs_list[] = {
1957        {"i915_frontbuffer_tracking", i915_frontbuffer_tracking, 0},
1958        {"i915_fbc_status", i915_fbc_status, 0},
1959        {"i915_ips_status", i915_ips_status, 0},
1960        {"i915_sr_status", i915_sr_status, 0},
1961        {"i915_opregion", i915_opregion, 0},
1962        {"i915_vbt", i915_vbt, 0},
1963        {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
1964        {"i915_edp_psr_status", i915_edp_psr_status, 0},
1965        {"i915_power_domain_info", i915_power_domain_info, 0},
1966        {"i915_dmc_info", i915_dmc_info, 0},
1967        {"i915_display_info", i915_display_info, 0},
1968        {"i915_shared_dplls_info", i915_shared_dplls_info, 0},
1969        {"i915_dp_mst_info", i915_dp_mst_info, 0},
1970        {"i915_ddb_info", i915_ddb_info, 0},
1971        {"i915_drrs_status", i915_drrs_status, 0},
1972        {"i915_lpsp_status", i915_lpsp_status, 0},
1973};
1974
1975static const struct {
1976        const char *name;
1977        const struct file_operations *fops;
1978} intel_display_debugfs_files[] = {
1979        {"i915_fifo_underrun_reset", &i915_fifo_underrun_reset_ops},
1980        {"i915_pri_wm_latency", &i915_pri_wm_latency_fops},
1981        {"i915_spr_wm_latency", &i915_spr_wm_latency_fops},
1982        {"i915_cur_wm_latency", &i915_cur_wm_latency_fops},
1983        {"i915_fbc_false_color", &i915_fbc_false_color_fops},
1984        {"i915_dp_test_data", &i915_displayport_test_data_fops},
1985        {"i915_dp_test_type", &i915_displayport_test_type_fops},
1986        {"i915_dp_test_active", &i915_displayport_test_active_fops},
1987        {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops},
1988        {"i915_hpd_short_storm_ctl", &i915_hpd_short_storm_ctl_fops},
1989        {"i915_ipc_status", &i915_ipc_status_fops},
1990        {"i915_drrs_ctl", &i915_drrs_ctl_fops},
1991        {"i915_edp_psr_debug", &i915_edp_psr_debug_fops},
1992};
1993
1994void intel_display_debugfs_register(struct drm_i915_private *i915)
1995{
1996        struct drm_minor *minor = i915->drm.primary;
1997        int i;
1998
1999        for (i = 0; i < ARRAY_SIZE(intel_display_debugfs_files); i++) {
2000                debugfs_create_file(intel_display_debugfs_files[i].name,
2001                                    S_IRUGO | S_IWUSR,
2002                                    minor->debugfs_root,
2003                                    to_i915(minor->dev),
2004                                    intel_display_debugfs_files[i].fops);
2005        }
2006
2007        drm_debugfs_create_files(intel_display_debugfs_list,
2008                                 ARRAY_SIZE(intel_display_debugfs_list),
2009                                 minor->debugfs_root, minor);
2010}
2011
2012static int i915_panel_show(struct seq_file *m, void *data)
2013{
2014        struct drm_connector *connector = m->private;
2015        struct intel_dp *intel_dp =
2016                intel_attached_dp(to_intel_connector(connector));
2017
2018        if (connector->status != connector_status_connected)
2019                return -ENODEV;
2020
2021        seq_printf(m, "Panel power up delay: %d\n",
2022                   intel_dp->panel_power_up_delay);
2023        seq_printf(m, "Panel power down delay: %d\n",
2024                   intel_dp->panel_power_down_delay);
2025        seq_printf(m, "Backlight on delay: %d\n",
2026                   intel_dp->backlight_on_delay);
2027        seq_printf(m, "Backlight off delay: %d\n",
2028                   intel_dp->backlight_off_delay);
2029
2030        return 0;
2031}
2032DEFINE_SHOW_ATTRIBUTE(i915_panel);
2033
2034static int i915_hdcp_sink_capability_show(struct seq_file *m, void *data)
2035{
2036        struct drm_connector *connector = m->private;
2037        struct intel_connector *intel_connector = to_intel_connector(connector);
2038
2039        if (connector->status != connector_status_connected)
2040                return -ENODEV;
2041
2042        seq_printf(m, "%s:%d HDCP version: ", connector->name,
2043                   connector->base.id);
2044        intel_hdcp_info(m, intel_connector);
2045
2046        return 0;
2047}
2048DEFINE_SHOW_ATTRIBUTE(i915_hdcp_sink_capability);
2049
2050#define LPSP_CAPABLE(COND) (COND ? seq_puts(m, "LPSP: capable\n") : \
2051                                seq_puts(m, "LPSP: incapable\n"))
2052
2053static int i915_lpsp_capability_show(struct seq_file *m, void *data)
2054{
2055        struct drm_connector *connector = m->private;
2056        struct drm_i915_private *i915 = to_i915(connector->dev);
2057        struct intel_encoder *encoder;
2058
2059        encoder = intel_attached_encoder(to_intel_connector(connector));
2060        if (!encoder)
2061                return -ENODEV;
2062
2063        if (connector->status != connector_status_connected)
2064                return -ENODEV;
2065
2066        switch (INTEL_GEN(i915)) {
2067        case 12:
2068                /*
2069                 * Actually TGL can drive LPSP on port till DDI_C
2070                 * but there is no physical connected DDI_C on TGL sku's,
2071                 * even driver is not initilizing DDI_C port for gen12.
2072                 */
2073                LPSP_CAPABLE(encoder->port <= PORT_B);
2074                break;
2075        case 11:
2076                LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
2077                             connector->connector_type == DRM_MODE_CONNECTOR_eDP);
2078                break;
2079        case 10:
2080        case 9:
2081                LPSP_CAPABLE(encoder->port == PORT_A &&
2082                             (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
2083                             connector->connector_type == DRM_MODE_CONNECTOR_eDP  ||
2084                             connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort));
2085                break;
2086        default:
2087                if (IS_HASWELL(i915) || IS_BROADWELL(i915))
2088                        LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_eDP);
2089        }
2090
2091        return 0;
2092}
2093DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
2094
2095static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
2096{
2097        struct drm_connector *connector = m->private;
2098        struct drm_device *dev = connector->dev;
2099        struct drm_crtc *crtc;
2100        struct intel_dp *intel_dp;
2101        struct drm_modeset_acquire_ctx ctx;
2102        struct intel_crtc_state *crtc_state = NULL;
2103        int ret = 0;
2104        bool try_again = false;
2105
2106        drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
2107
2108        do {
2109                try_again = false;
2110                ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
2111                                       &ctx);
2112                if (ret) {
2113                        if (ret == -EDEADLK && !drm_modeset_backoff(&ctx)) {
2114                                try_again = true;
2115                                continue;
2116                        }
2117                        break;
2118                }
2119                crtc = connector->state->crtc;
2120                if (connector->status != connector_status_connected || !crtc) {
2121                        ret = -ENODEV;
2122                        break;
2123                }
2124                ret = drm_modeset_lock(&crtc->mutex, &ctx);
2125                if (ret == -EDEADLK) {
2126                        ret = drm_modeset_backoff(&ctx);
2127                        if (!ret) {
2128                                try_again = true;
2129                                continue;
2130                        }
2131                        break;
2132                } else if (ret) {
2133                        break;
2134                }
2135                intel_dp = intel_attached_dp(to_intel_connector(connector));
2136                crtc_state = to_intel_crtc_state(crtc->state);
2137                seq_printf(m, "DSC_Enabled: %s\n",
2138                           yesno(crtc_state->dsc.compression_enable));
2139                seq_printf(m, "DSC_Sink_Support: %s\n",
2140                           yesno(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
2141                seq_printf(m, "Force_DSC_Enable: %s\n",
2142                           yesno(intel_dp->force_dsc_en));
2143                if (!intel_dp_is_edp(intel_dp))
2144                        seq_printf(m, "FEC_Sink_Support: %s\n",
2145                                   yesno(drm_dp_sink_supports_fec(intel_dp->fec_capable)));
2146        } while (try_again);
2147
2148        drm_modeset_drop_locks(&ctx);
2149        drm_modeset_acquire_fini(&ctx);
2150
2151        return ret;
2152}
2153
2154static ssize_t i915_dsc_fec_support_write(struct file *file,
2155                                          const char __user *ubuf,
2156                                          size_t len, loff_t *offp)
2157{
2158        bool dsc_enable = false;
2159        int ret;
2160        struct drm_connector *connector =
2161                ((struct seq_file *)file->private_data)->private;
2162        struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
2163        struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2164        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2165
2166        if (len == 0)
2167                return 0;
2168
2169        drm_dbg(&i915->drm,
2170                "Copied %zu bytes from user to force DSC\n", len);
2171
2172        ret = kstrtobool_from_user(ubuf, len, &dsc_enable);
2173        if (ret < 0)
2174                return ret;
2175
2176        drm_dbg(&i915->drm, "Got %s for DSC Enable\n",
2177                (dsc_enable) ? "true" : "false");
2178        intel_dp->force_dsc_en = dsc_enable;
2179
2180        *offp += len;
2181        return len;
2182}
2183
2184static int i915_dsc_fec_support_open(struct inode *inode,
2185                                     struct file *file)
2186{
2187        return single_open(file, i915_dsc_fec_support_show,
2188                           inode->i_private);
2189}
2190
2191static const struct file_operations i915_dsc_fec_support_fops = {
2192        .owner = THIS_MODULE,
2193        .open = i915_dsc_fec_support_open,
2194        .read = seq_read,
2195        .llseek = seq_lseek,
2196        .release = single_release,
2197        .write = i915_dsc_fec_support_write
2198};
2199
2200/**
2201 * intel_connector_debugfs_add - add i915 specific connector debugfs files
2202 * @connector: pointer to a registered drm_connector
2203 *
2204 * Cleanup will be done by drm_connector_unregister() through a call to
2205 * drm_debugfs_connector_remove().
2206 *
2207 * Returns 0 on success, negative error codes on error.
2208 */
2209int intel_connector_debugfs_add(struct drm_connector *connector)
2210{
2211        struct dentry *root = connector->debugfs_entry;
2212        struct drm_i915_private *dev_priv = to_i915(connector->dev);
2213
2214        /* The connector must have been registered beforehands. */
2215        if (!root)
2216                return -ENODEV;
2217
2218        if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
2219                debugfs_create_file("i915_panel_timings", S_IRUGO, root,
2220                                    connector, &i915_panel_fops);
2221                debugfs_create_file("i915_psr_sink_status", S_IRUGO, root,
2222                                    connector, &i915_psr_sink_status_fops);
2223        }
2224
2225        if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
2226            connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
2227            connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) {
2228                debugfs_create_file("i915_hdcp_sink_capability", S_IRUGO, root,
2229                                    connector, &i915_hdcp_sink_capability_fops);
2230        }
2231
2232        if (INTEL_GEN(dev_priv) >= 10 &&
2233            ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
2234              !to_intel_connector(connector)->mst_port) ||
2235             connector->connector_type == DRM_MODE_CONNECTOR_eDP))
2236                debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root,
2237                                    connector, &i915_dsc_fec_support_fops);
2238
2239        /* Legacy panels doesn't lpsp on any platform */
2240        if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) ||
2241             IS_BROADWELL(dev_priv)) &&
2242             (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
2243             connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
2244             connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
2245             connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
2246             connector->connector_type == DRM_MODE_CONNECTOR_HDMIB))
2247                debugfs_create_file("i915_lpsp_capability", 0444, root,
2248                                    connector, &i915_lpsp_capability_fops);
2249
2250        return 0;
2251}
2252