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