1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2020 Intel Corporation 4 */ 5 6 #include <linux/debugfs.h> 7 #include <linux/string_choices.h> 8 #include <linux/string_helpers.h> 9 10 #include <drm/drm_debugfs.h> 11 #include <drm/drm_drv.h> 12 #include <drm/drm_edid.h> 13 #include <drm/drm_file.h> 14 #include <drm/drm_fourcc.h> 15 #include <drm/drm_print.h> 16 #include <drm/intel/intel_gmd_misc_regs.h> 17 18 #include "hsw_ips.h" 19 #include "i9xx_wm_regs.h" 20 #include "intel_alpm.h" 21 #include "intel_bo.h" 22 #include "intel_crtc.h" 23 #include "intel_crtc_state_dump.h" 24 #include "intel_de.h" 25 #include "intel_display_debugfs.h" 26 #include "intel_display_debugfs_params.h" 27 #include "intel_display_power.h" 28 #include "intel_display_power_well.h" 29 #include "intel_display_regs.h" 30 #include "intel_display_reset.h" 31 #include "intel_display_rpm.h" 32 #include "intel_display_types.h" 33 #include "intel_dmc.h" 34 #include "intel_dp.h" 35 #include "intel_dp_link_caps.h" 36 #include "intel_dp_link_training.h" 37 #include "intel_dp_mst.h" 38 #include "intel_dp_test.h" 39 #include "intel_drrs.h" 40 #include "intel_fb.h" 41 #include "intel_fbc.h" 42 #include "intel_fbdev.h" 43 #include "intel_hdcp.h" 44 #include "intel_hdmi.h" 45 #include "intel_hotplug.h" 46 #include "intel_link_bw.h" 47 #include "intel_panel.h" 48 #include "intel_pps.h" 49 #include "intel_psr.h" 50 #include "intel_psr_regs.h" 51 #include "intel_vdsc.h" 52 #include "intel_wm.h" 53 #include "intel_tc.h" 54 55 static struct intel_display *node_to_intel_display(struct drm_info_node *node) 56 { 57 return to_intel_display(node->minor->dev); 58 } 59 60 static int intel_display_caps(struct seq_file *m, void *data) 61 { 62 struct intel_display *display = node_to_intel_display(m->private); 63 struct drm_printer p = drm_seq_file_printer(m); 64 65 drm_printf(&p, "PCH type: %d\n", INTEL_PCH_TYPE(display)); 66 67 intel_display_device_info_print(DISPLAY_INFO(display), 68 DISPLAY_RUNTIME_INFO(display), &p); 69 intel_display_params_dump(&display->params, display->drm->driver->name, &p); 70 71 return 0; 72 } 73 74 static int i915_frontbuffer_tracking(struct seq_file *m, void *unused) 75 { 76 struct intel_display *display = node_to_intel_display(m->private); 77 78 spin_lock(&display->fb_tracking.lock); 79 80 seq_printf(m, "FB tracking busy bits: 0x%08x\n", 81 display->fb_tracking.busy_bits); 82 83 spin_unlock(&display->fb_tracking.lock); 84 85 return 0; 86 } 87 88 static int i915_sr_status(struct seq_file *m, void *unused) 89 { 90 struct intel_display *display = node_to_intel_display(m->private); 91 struct ref_tracker *wakeref; 92 bool sr_enabled = false; 93 94 wakeref = intel_display_power_get(display, POWER_DOMAIN_INIT); 95 96 if (DISPLAY_VER(display) >= 9) 97 /* no global SR status; inspect per-plane WM */; 98 else if (HAS_PCH_SPLIT(display)) 99 sr_enabled = intel_de_read(display, WM1_LP_ILK) & WM_LP_ENABLE; 100 else if (display->platform.i965gm || display->platform.g4x || 101 display->platform.i945g || display->platform.i945gm) 102 sr_enabled = intel_de_read(display, FW_BLC_SELF) & FW_BLC_SELF_EN; 103 else if (display->platform.i915gm) 104 sr_enabled = intel_de_read(display, INSTPM) & INSTPM_SELF_EN; 105 else if (display->platform.pineview) 106 sr_enabled = intel_de_read(display, DSPFW3(display)) & PINEVIEW_SELF_REFRESH_EN; 107 else if (display->platform.valleyview || display->platform.cherryview) 108 sr_enabled = intel_de_read(display, FW_BLC_SELF_VLV) & FW_CSPWRDWNEN; 109 110 intel_display_power_put(display, POWER_DOMAIN_INIT, wakeref); 111 112 seq_printf(m, "self-refresh: %s\n", str_enabled_disabled(sr_enabled)); 113 114 return 0; 115 } 116 117 static int i915_gem_framebuffer_info(struct seq_file *m, void *data) 118 { 119 struct intel_display *display = node_to_intel_display(m->private); 120 struct intel_framebuffer *fbdev_fb = NULL; 121 struct drm_framebuffer *drm_fb; 122 123 fbdev_fb = intel_fbdev_framebuffer(display->fbdev.fbdev); 124 if (fbdev_fb) { 125 seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ", 126 fbdev_fb->base.width, 127 fbdev_fb->base.height, 128 fbdev_fb->base.format->depth, 129 fbdev_fb->base.format->cpp[0] * 8, 130 fbdev_fb->base.modifier, 131 drm_framebuffer_read_refcount(&fbdev_fb->base)); 132 intel_bo_describe(m, intel_fb_bo(&fbdev_fb->base)); 133 seq_putc(m, '\n'); 134 } 135 136 mutex_lock(&display->drm->mode_config.fb_lock); 137 drm_for_each_fb(drm_fb, display->drm) { 138 struct intel_framebuffer *fb = to_intel_framebuffer(drm_fb); 139 if (fb == fbdev_fb) 140 continue; 141 142 seq_printf(m, "user size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ", 143 fb->base.width, 144 fb->base.height, 145 fb->base.format->depth, 146 fb->base.format->cpp[0] * 8, 147 fb->base.modifier, 148 drm_framebuffer_read_refcount(&fb->base)); 149 intel_bo_describe(m, intel_fb_bo(&fb->base)); 150 seq_putc(m, '\n'); 151 } 152 mutex_unlock(&display->drm->mode_config.fb_lock); 153 154 return 0; 155 } 156 157 static int i915_power_domain_info(struct seq_file *m, void *unused) 158 { 159 struct intel_display *display = node_to_intel_display(m->private); 160 161 intel_display_power_debug(display, m); 162 163 return 0; 164 } 165 166 static void intel_seq_print_mode(struct seq_file *m, int tabs, 167 const struct drm_display_mode *mode) 168 { 169 int i; 170 171 for (i = 0; i < tabs; i++) 172 seq_putc(m, '\t'); 173 174 seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); 175 } 176 177 static void intel_encoder_info(struct seq_file *m, 178 struct intel_crtc *crtc, 179 struct intel_encoder *encoder) 180 { 181 struct intel_display *display = node_to_intel_display(m->private); 182 struct drm_connector_list_iter conn_iter; 183 struct drm_connector *connector; 184 185 seq_printf(m, "\t[ENCODER:%d:%s]: connectors:\n", 186 encoder->base.base.id, encoder->base.name); 187 188 drm_connector_list_iter_begin(display->drm, &conn_iter); 189 drm_for_each_connector_iter(connector, &conn_iter) { 190 const struct drm_connector_state *conn_state = 191 connector->state; 192 193 if (conn_state->best_encoder != &encoder->base) 194 continue; 195 196 seq_printf(m, "\t\t[CONNECTOR:%d:%s]\n", 197 connector->base.id, connector->name); 198 } 199 drm_connector_list_iter_end(&conn_iter); 200 } 201 202 static void intel_panel_info(struct seq_file *m, 203 struct intel_connector *connector) 204 { 205 const struct drm_display_mode *fixed_mode; 206 207 if (list_empty(&connector->panel.fixed_modes)) 208 return; 209 210 seq_puts(m, "\tfixed modes:\n"); 211 212 list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) 213 intel_seq_print_mode(m, 2, fixed_mode); 214 } 215 216 static void intel_dp_info(struct seq_file *m, struct intel_connector *connector) 217 { 218 struct intel_encoder *intel_encoder = intel_attached_encoder(connector); 219 struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder); 220 221 seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]); 222 seq_printf(m, "\taudio support: %s\n", 223 str_yes_no(connector->base.display_info.has_audio)); 224 225 drm_dp_downstream_debug(m, intel_dp->dpcd, intel_dp->downstream_ports, 226 connector->detect_edid, &intel_dp->aux); 227 } 228 229 static void intel_dp_mst_info(struct seq_file *m, 230 struct intel_connector *connector) 231 { 232 bool has_audio = connector->base.display_info.has_audio; 233 234 seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio)); 235 } 236 237 static void intel_hdmi_info(struct seq_file *m, 238 struct intel_connector *connector) 239 { 240 bool has_audio = connector->base.display_info.has_audio; 241 242 seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio)); 243 } 244 245 static void intel_connector_info(struct seq_file *m, 246 struct drm_connector *connector) 247 { 248 struct intel_connector *intel_connector = to_intel_connector(connector); 249 const struct drm_display_mode *mode; 250 struct drm_printer p = drm_seq_file_printer(m); 251 struct intel_digital_port *dig_port = NULL; 252 253 seq_printf(m, "[CONNECTOR:%d:%s]: status: %s\n", 254 connector->base.id, connector->name, 255 drm_get_connector_status_name(connector->status)); 256 257 if (connector->status == connector_status_disconnected) 258 return; 259 260 seq_printf(m, "\tphysical dimensions: %dx%dmm\n", 261 connector->display_info.width_mm, 262 connector->display_info.height_mm); 263 seq_printf(m, "\tsubpixel order: %s\n", 264 drm_get_subpixel_order_name(connector->display_info.subpixel_order)); 265 seq_printf(m, "\tCEA rev: %d\n", connector->display_info.cea_rev); 266 267 switch (connector->connector_type) { 268 case DRM_MODE_CONNECTOR_DisplayPort: 269 case DRM_MODE_CONNECTOR_eDP: 270 if (intel_connector->mst.dp) 271 intel_dp_mst_info(m, intel_connector); 272 else 273 intel_dp_info(m, intel_connector); 274 dig_port = dp_to_dig_port(intel_attached_dp(intel_connector)); 275 break; 276 case DRM_MODE_CONNECTOR_HDMIA: 277 intel_hdmi_info(m, intel_connector); 278 dig_port = hdmi_to_dig_port(intel_attached_hdmi(intel_connector)); 279 break; 280 default: 281 break; 282 } 283 284 if (dig_port != NULL && intel_encoder_is_tc(&dig_port->base)) 285 intel_tc_info(&p, dig_port); 286 287 intel_hdcp_info(m, intel_connector); 288 289 seq_printf(m, "\tmax bpc: %u\n", connector->display_info.bpc); 290 291 intel_panel_info(m, intel_connector); 292 293 seq_printf(m, "\tmodes:\n"); 294 list_for_each_entry(mode, &connector->modes, head) 295 intel_seq_print_mode(m, 2, mode); 296 } 297 298 static const char *plane_type(enum drm_plane_type type) 299 { 300 switch (type) { 301 case DRM_PLANE_TYPE_OVERLAY: 302 return "OVL"; 303 case DRM_PLANE_TYPE_PRIMARY: 304 return "PRI"; 305 case DRM_PLANE_TYPE_CURSOR: 306 return "CUR"; 307 /* 308 * Deliberately omitting default: to generate compiler warnings 309 * when a new drm_plane_type gets added. 310 */ 311 } 312 313 return "unknown"; 314 } 315 316 static void plane_rotation(char *buf, size_t bufsize, unsigned int rotation) 317 { 318 /* 319 * According to doc only one DRM_MODE_ROTATE_ is allowed but this 320 * will print them all to visualize if the values are misused 321 */ 322 snprintf(buf, bufsize, 323 "%s%s%s%s%s%s(0x%08x)", 324 (rotation & DRM_MODE_ROTATE_0) ? "0 " : "", 325 (rotation & DRM_MODE_ROTATE_90) ? "90 " : "", 326 (rotation & DRM_MODE_ROTATE_180) ? "180 " : "", 327 (rotation & DRM_MODE_ROTATE_270) ? "270 " : "", 328 (rotation & DRM_MODE_REFLECT_X) ? "FLIPX " : "", 329 (rotation & DRM_MODE_REFLECT_Y) ? "FLIPY " : "", 330 rotation); 331 } 332 333 static const char *plane_visibility(const struct intel_plane_state *plane_state) 334 { 335 if (plane_state->uapi.visible) 336 return "visible"; 337 338 if (plane_state->is_y_plane) 339 return "Y plane"; 340 341 return "hidden"; 342 } 343 344 static void intel_plane_uapi_info(struct seq_file *m, struct intel_plane *plane) 345 { 346 const struct intel_plane_state *plane_state = 347 to_intel_plane_state(plane->base.state); 348 const struct drm_framebuffer *fb = plane_state->uapi.fb; 349 struct drm_rect src, dst; 350 char rot_str[48]; 351 352 src = drm_plane_state_src(&plane_state->uapi); 353 dst = drm_plane_state_dest(&plane_state->uapi); 354 355 plane_rotation(rot_str, sizeof(rot_str), 356 plane_state->uapi.rotation); 357 358 seq_puts(m, "\t\tuapi: [FB:"); 359 if (fb) 360 seq_printf(m, "%d] %p4cc,0x%llx,%dx%d", fb->base.id, 361 &fb->format->format, fb->modifier, fb->width, 362 fb->height); 363 else 364 seq_puts(m, "0] n/a,0x0,0x0,"); 365 seq_printf(m, ", visible=%s, src=" DRM_RECT_FP_FMT ", dst=" DRM_RECT_FMT 366 ", rotation=%s\n", plane_visibility(plane_state), 367 DRM_RECT_FP_ARG(&src), DRM_RECT_ARG(&dst), rot_str); 368 369 if (plane_state->planar_linked_plane) 370 seq_printf(m, "\t\tplanar: Linked to [PLANE:%d:%s] as a %s\n", 371 plane_state->planar_linked_plane->base.base.id, plane_state->planar_linked_plane->base.name, 372 plane_state->is_y_plane ? "Y plane" : "UV plane"); 373 } 374 375 static void intel_plane_hw_info(struct seq_file *m, struct intel_plane *plane) 376 { 377 const struct intel_plane_state *plane_state = 378 to_intel_plane_state(plane->base.state); 379 const struct drm_framebuffer *fb = plane_state->hw.fb; 380 char rot_str[48]; 381 382 if (!fb) 383 return; 384 385 plane_rotation(rot_str, sizeof(rot_str), 386 plane_state->hw.rotation); 387 388 seq_printf(m, "\t\thw: [FB:%d] %p4cc,0x%llx,%dx%d, visible=%s, src=" 389 DRM_RECT_FP_FMT ", dst=" DRM_RECT_FMT ", rotation=%s\n", 390 fb->base.id, &fb->format->format, 391 fb->modifier, fb->width, fb->height, 392 str_yes_no(plane_state->uapi.visible), 393 DRM_RECT_FP_ARG(&plane_state->uapi.src), 394 DRM_RECT_ARG(&plane_state->uapi.dst), 395 rot_str); 396 } 397 398 static void intel_plane_info(struct seq_file *m, struct intel_crtc *crtc) 399 { 400 struct intel_display *display = node_to_intel_display(m->private); 401 struct intel_plane *plane; 402 403 for_each_intel_plane_on_crtc(display->drm, crtc, plane) { 404 seq_printf(m, "\t[PLANE:%d:%s]: type=%s\n", 405 plane->base.base.id, plane->base.name, 406 plane_type(plane->base.type)); 407 intel_plane_uapi_info(m, plane); 408 intel_plane_hw_info(m, plane); 409 } 410 } 411 412 static void intel_scaler_info(struct seq_file *m, struct intel_crtc *crtc) 413 { 414 const struct intel_crtc_state *crtc_state = 415 to_intel_crtc_state(crtc->base.state); 416 int num_scalers = crtc->num_scalers; 417 int i; 418 419 /* Not all platforms have a scaler */ 420 if (num_scalers) { 421 seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler_id=%d scaling_filter=%d sharpness_strength=%d", 422 num_scalers, 423 crtc_state->scaler_state.scaler_users, 424 crtc_state->scaler_state.scaler_id, 425 crtc_state->hw.scaling_filter, 426 crtc_state->hw.sharpness_strength); 427 428 for (i = 0; i < num_scalers; i++) { 429 const struct intel_scaler *sc = 430 &crtc_state->scaler_state.scalers[i]; 431 432 seq_printf(m, ", scalers[%d]: use=%s, mode=%x", 433 i, str_yes_no(sc->in_use), sc->mode); 434 } 435 seq_puts(m, "\n"); 436 } else { 437 seq_puts(m, "\tNo scalers available on this platform\n"); 438 } 439 } 440 441 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_VBLANK_EVADE) 442 static void crtc_updates_info(struct seq_file *m, 443 struct intel_crtc *crtc, 444 const char *hdr) 445 { 446 u64 count; 447 int row; 448 449 count = 0; 450 for (row = 0; row < ARRAY_SIZE(crtc->debug.vbl.times); row++) 451 count += crtc->debug.vbl.times[row]; 452 seq_printf(m, "%sUpdates: %llu\n", hdr, count); 453 if (!count) 454 return; 455 456 for (row = 0; row < ARRAY_SIZE(crtc->debug.vbl.times); row++) { 457 char columns[80] = " |"; 458 unsigned int x; 459 460 if (row & 1) { 461 const char *units; 462 463 if (row > 10) { 464 x = 1000000; 465 units = "ms"; 466 } else { 467 x = 1000; 468 units = "us"; 469 } 470 471 snprintf(columns, sizeof(columns), "%4ld%s |", 472 DIV_ROUND_CLOSEST(BIT(row + 9), x), units); 473 } 474 475 if (crtc->debug.vbl.times[row]) { 476 x = ilog2(crtc->debug.vbl.times[row]); 477 memset(columns + 8, '*', x); 478 columns[8 + x] = '\0'; 479 } 480 481 seq_printf(m, "%s%s\n", hdr, columns); 482 } 483 484 seq_printf(m, "%sMin update: %lluns\n", 485 hdr, crtc->debug.vbl.min); 486 seq_printf(m, "%sMax update: %lluns\n", 487 hdr, crtc->debug.vbl.max); 488 seq_printf(m, "%sAverage update: %lluns\n", 489 hdr, div64_u64(crtc->debug.vbl.sum, count)); 490 seq_printf(m, "%sOverruns > %uus: %u\n", 491 hdr, VBLANK_EVASION_TIME_US, crtc->debug.vbl.over); 492 } 493 494 static int crtc_updates_show(struct seq_file *m, void *data) 495 { 496 crtc_updates_info(m, m->private, ""); 497 return 0; 498 } 499 500 static int crtc_updates_open(struct inode *inode, struct file *file) 501 { 502 return single_open(file, crtc_updates_show, inode->i_private); 503 } 504 505 static ssize_t crtc_updates_write(struct file *file, 506 const char __user *ubuf, 507 size_t len, loff_t *offp) 508 { 509 struct seq_file *m = file->private_data; 510 struct intel_crtc *crtc = m->private; 511 512 /* May race with an update. Meh. */ 513 memset(&crtc->debug.vbl, 0, sizeof(crtc->debug.vbl)); 514 515 return len; 516 } 517 518 static const struct file_operations crtc_updates_fops = { 519 .owner = THIS_MODULE, 520 .open = crtc_updates_open, 521 .read = seq_read, 522 .llseek = seq_lseek, 523 .release = single_release, 524 .write = crtc_updates_write 525 }; 526 527 static void crtc_updates_add(struct intel_crtc *crtc) 528 { 529 debugfs_create_file("i915_update_info", 0644, crtc->base.debugfs_entry, 530 crtc, &crtc_updates_fops); 531 } 532 533 #else 534 static void crtc_updates_info(struct seq_file *m, 535 struct intel_crtc *crtc, 536 const char *hdr) 537 { 538 } 539 540 static void crtc_updates_add(struct intel_crtc *crtc) 541 { 542 } 543 #endif 544 545 static void intel_crtc_info(struct seq_file *m, struct intel_crtc *crtc) 546 { 547 struct intel_display *display = node_to_intel_display(m->private); 548 struct drm_printer p = drm_seq_file_printer(m); 549 const struct intel_crtc_state *crtc_state = 550 to_intel_crtc_state(crtc->base.state); 551 struct intel_encoder *encoder; 552 553 seq_printf(m, "[CRTC:%d:%s]:\n", 554 crtc->base.base.id, crtc->base.name); 555 556 seq_printf(m, "\tuapi: enable=%s, active=%s, mode=" DRM_MODE_FMT "\n", 557 str_yes_no(crtc_state->uapi.enable), 558 str_yes_no(crtc_state->uapi.active), 559 DRM_MODE_ARG(&crtc_state->uapi.mode)); 560 561 seq_printf(m, "\thw: enable=%s, active=%s\n", 562 str_yes_no(crtc_state->hw.enable), str_yes_no(crtc_state->hw.active)); 563 seq_printf(m, "\tadjusted_mode=" DRM_MODE_FMT "\n", 564 DRM_MODE_ARG(&crtc_state->hw.adjusted_mode)); 565 seq_printf(m, "\tpipe__mode=" DRM_MODE_FMT "\n", 566 DRM_MODE_ARG(&crtc_state->hw.pipe_mode)); 567 568 seq_printf(m, "\tpipe src=" DRM_RECT_FMT ", dither=%s, bpp=%d\n", 569 DRM_RECT_ARG(&crtc_state->pipe_src), 570 str_yes_no(crtc_state->dither), crtc_state->pipe_bpp); 571 seq_printf(m, "\tport_clock=%d, lane_count=%d\n", 572 crtc_state->port_clock, crtc_state->lane_count); 573 574 intel_scaler_info(m, crtc); 575 576 if (DISPLAY_VER(display) >= 9) { 577 u32 background = crtc_state->hw.background_color; 578 579 seq_printf(m, "\tbackground color (10bpc XRGB2101010): %08x\n", background); 580 } 581 582 if (crtc_state->joiner_pipes) 583 seq_printf(m, "\tLinked to 0x%x pipes as a %s\n", 584 crtc_state->joiner_pipes, 585 intel_crtc_is_joiner_secondary(crtc_state) ? "slave" : "master"); 586 587 intel_vdsc_state_dump(&p, 1, crtc_state); 588 589 for_each_intel_encoder_mask(display->drm, encoder, 590 crtc_state->uapi.encoder_mask) 591 intel_encoder_info(m, crtc, encoder); 592 593 intel_plane_info(m, crtc); 594 595 seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s\n", 596 str_yes_no(!crtc->cpu_fifo_underrun_disabled), 597 str_yes_no(!crtc->pch_fifo_underrun_disabled)); 598 599 crtc_updates_info(m, crtc, "\t"); 600 } 601 602 static int i915_display_info(struct seq_file *m, void *unused) 603 { 604 struct intel_display *display = node_to_intel_display(m->private); 605 struct intel_crtc *crtc; 606 struct drm_connector *connector; 607 struct drm_connector_list_iter conn_iter; 608 struct ref_tracker *wakeref; 609 610 wakeref = intel_display_rpm_get(display); 611 612 drm_modeset_lock_all(display->drm); 613 614 seq_printf(m, "CRTC info\n"); 615 seq_printf(m, "---------\n"); 616 for_each_intel_crtc(display, crtc) 617 intel_crtc_info(m, crtc); 618 619 seq_printf(m, "\n"); 620 seq_printf(m, "Connector info\n"); 621 seq_printf(m, "--------------\n"); 622 drm_connector_list_iter_begin(display->drm, &conn_iter); 623 drm_for_each_connector_iter(connector, &conn_iter) 624 intel_connector_info(m, connector); 625 drm_connector_list_iter_end(&conn_iter); 626 627 drm_modeset_unlock_all(display->drm); 628 629 intel_display_rpm_put(display, wakeref); 630 631 return 0; 632 } 633 634 static int i915_shared_dplls_info(struct seq_file *m, void *unused) 635 { 636 struct intel_display *display = node_to_intel_display(m->private); 637 struct drm_printer p = drm_seq_file_printer(m); 638 struct intel_dpll *pll; 639 int i; 640 641 drm_modeset_lock_all(display->drm); 642 643 drm_printf(&p, "PLL refclks: non-SSC: %d kHz, SSC: %d kHz\n", 644 display->dpll.ref_clks.nssc, 645 display->dpll.ref_clks.ssc); 646 647 for_each_dpll(display, pll, i) { 648 drm_printf(&p, "DPLL%i: %s, id: %i\n", pll->index, 649 pll->info->name, pll->info->id); 650 drm_printf(&p, " pipe_mask: 0x%x, active: 0x%x, on: %s\n", 651 pll->state.pipe_mask, pll->active_mask, 652 str_yes_no(pll->on)); 653 drm_printf(&p, " tracked hardware state:\n"); 654 intel_dpll_dump_hw_state(display, &p, &pll->state.hw_state); 655 } 656 drm_modeset_unlock_all(display->drm); 657 658 return 0; 659 } 660 661 static int i915_ddb_info(struct seq_file *m, void *unused) 662 { 663 struct intel_display *display = node_to_intel_display(m->private); 664 struct skl_ddb_entry *entry; 665 struct intel_crtc *crtc; 666 667 if (DISPLAY_VER(display) < 9) 668 return -ENODEV; 669 670 drm_modeset_lock_all(display->drm); 671 672 seq_printf(m, "%-15s%8s%8s%8s\n", "", "Start", "End", "Size"); 673 674 for_each_intel_crtc(display, crtc) { 675 struct intel_crtc_state *crtc_state = 676 to_intel_crtc_state(crtc->base.state); 677 enum pipe pipe = crtc->pipe; 678 enum plane_id plane_id; 679 680 seq_printf(m, "Pipe %c\n", pipe_name(pipe)); 681 682 for_each_plane_id_on_crtc(crtc, plane_id) { 683 entry = &crtc_state->wm.skl.plane_ddb[plane_id]; 684 seq_printf(m, " Plane%-8d%8u%8u%8u\n", plane_id + 1, 685 entry->start, entry->end, 686 skl_ddb_entry_size(entry)); 687 } 688 689 entry = &crtc_state->wm.skl.plane_ddb[PLANE_CURSOR]; 690 seq_printf(m, " %-13s%8u%8u%8u\n", "Cursor", entry->start, 691 entry->end, skl_ddb_entry_size(entry)); 692 } 693 694 drm_modeset_unlock_all(display->drm); 695 696 return 0; 697 } 698 699 static bool 700 intel_lpsp_power_well_enabled(struct intel_display *display, 701 enum i915_power_well_id power_well_id) 702 { 703 bool is_enabled; 704 705 with_intel_display_rpm(display) 706 is_enabled = intel_display_power_well_is_enabled(display, 707 power_well_id); 708 709 return is_enabled; 710 } 711 712 static int i915_lpsp_status(struct seq_file *m, void *unused) 713 { 714 struct intel_display *display = node_to_intel_display(m->private); 715 bool lpsp_enabled = false; 716 717 if (DISPLAY_VER(display) >= 13 || IS_DISPLAY_VER(display, 9, 10)) { 718 lpsp_enabled = !intel_lpsp_power_well_enabled(display, SKL_DISP_PW_2); 719 } else if (IS_DISPLAY_VER(display, 11, 12)) { 720 lpsp_enabled = !intel_lpsp_power_well_enabled(display, ICL_DISP_PW_3); 721 } else if (display->platform.haswell || display->platform.broadwell) { 722 lpsp_enabled = !intel_lpsp_power_well_enabled(display, HSW_DISP_PW_GLOBAL); 723 } else { 724 seq_puts(m, "LPSP: not supported\n"); 725 return 0; 726 } 727 728 seq_printf(m, "LPSP: %s\n", str_enabled_disabled(lpsp_enabled)); 729 730 return 0; 731 } 732 733 static int i915_dp_mst_info(struct seq_file *m, void *unused) 734 { 735 struct intel_display *display = node_to_intel_display(m->private); 736 struct intel_encoder *intel_encoder; 737 struct intel_digital_port *dig_port; 738 struct drm_connector *connector; 739 struct drm_connector_list_iter conn_iter; 740 741 drm_connector_list_iter_begin(display->drm, &conn_iter); 742 drm_for_each_connector_iter(connector, &conn_iter) { 743 if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) 744 continue; 745 746 intel_encoder = intel_attached_encoder(to_intel_connector(connector)); 747 if (!intel_encoder || intel_encoder->type == INTEL_OUTPUT_DP_MST) 748 continue; 749 750 dig_port = enc_to_dig_port(intel_encoder); 751 if (!intel_dp_mst_source_support(&dig_port->dp)) 752 continue; 753 754 seq_printf(m, "MST Source Port [ENCODER:%d:%s]\n", 755 dig_port->base.base.base.id, 756 dig_port->base.base.name); 757 drm_dp_mst_dump_topology(m, &dig_port->dp.mst.mgr); 758 } 759 drm_connector_list_iter_end(&conn_iter); 760 761 return 0; 762 } 763 764 static ssize_t 765 i915_fifo_underrun_reset_write(struct file *filp, 766 const char __user *ubuf, 767 size_t cnt, loff_t *ppos) 768 { 769 struct intel_display *display = filp->private_data; 770 struct intel_crtc *crtc; 771 int ret; 772 bool reset; 773 774 ret = kstrtobool_from_user(ubuf, cnt, &reset); 775 if (ret) 776 return ret; 777 778 if (!reset) 779 return cnt; 780 781 for_each_intel_crtc(display, crtc) { 782 struct drm_crtc_commit *commit; 783 struct intel_crtc_state *crtc_state; 784 785 ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex); 786 if (ret) 787 return ret; 788 789 crtc_state = to_intel_crtc_state(crtc->base.state); 790 commit = crtc_state->uapi.commit; 791 if (commit) { 792 ret = wait_for_completion_interruptible(&commit->hw_done); 793 if (!ret) 794 ret = wait_for_completion_interruptible(&commit->flip_done); 795 } 796 797 if (!ret && crtc_state->hw.active) { 798 drm_dbg_kms(display->drm, 799 "Re-arming FIFO underruns on pipe %c\n", 800 pipe_name(crtc->pipe)); 801 802 intel_crtc_arm_fifo_underrun(crtc, crtc_state); 803 } 804 805 drm_modeset_unlock(&crtc->base.mutex); 806 807 if (ret) 808 return ret; 809 } 810 811 intel_fbc_reset_underrun(display); 812 813 return cnt; 814 } 815 816 static const struct file_operations i915_fifo_underrun_reset_ops = { 817 .owner = THIS_MODULE, 818 .open = simple_open, 819 .write = i915_fifo_underrun_reset_write, 820 .llseek = default_llseek, 821 }; 822 823 static const struct drm_info_list intel_display_debugfs_list[] = { 824 {"intel_display_caps", intel_display_caps, 0}, 825 {"i915_frontbuffer_tracking", i915_frontbuffer_tracking, 0}, 826 {"i915_sr_status", i915_sr_status, 0}, 827 {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0}, 828 {"i915_power_domain_info", i915_power_domain_info, 0}, 829 {"i915_display_info", i915_display_info, 0}, 830 {"i915_shared_dplls_info", i915_shared_dplls_info, 0}, 831 {"i915_dp_mst_info", i915_dp_mst_info, 0}, 832 {"i915_ddb_info", i915_ddb_info, 0}, 833 {"i915_lpsp_status", i915_lpsp_status, 0}, 834 }; 835 836 void intel_display_debugfs_register(struct intel_display *display) 837 { 838 struct dentry *debugfs_root = display->drm->debugfs_root; 839 840 debugfs_create_file("i915_fifo_underrun_reset", 0644, debugfs_root, 841 display, &i915_fifo_underrun_reset_ops); 842 843 drm_debugfs_create_files(intel_display_debugfs_list, 844 ARRAY_SIZE(intel_display_debugfs_list), 845 debugfs_root, display->drm->primary); 846 847 intel_bios_debugfs_register(display); 848 intel_cdclk_debugfs_register(display); 849 intel_display_reset_debugfs_register(display); 850 intel_dmc_debugfs_register(display); 851 intel_dp_test_debugfs_register(display); 852 intel_fbc_debugfs_register(display); 853 intel_hpd_debugfs_register(display); 854 intel_opregion_debugfs_register(display); 855 intel_psr_debugfs_register(display); 856 intel_wm_debugfs_register(display); 857 intel_display_debugfs_params(display); 858 } 859 860 static int i915_lpsp_capability_show(struct seq_file *m, void *data) 861 { 862 struct intel_connector *connector = m->private; 863 struct intel_display *display = to_intel_display(connector); 864 struct intel_encoder *encoder = intel_attached_encoder(connector); 865 int connector_type = connector->base.connector_type; 866 bool lpsp_capable = false; 867 868 if (!encoder) 869 return -ENODEV; 870 871 if (connector->base.status != connector_status_connected) 872 return -ENODEV; 873 874 if (DISPLAY_VER(display) >= 13) 875 lpsp_capable = encoder->port <= PORT_B; 876 else if (DISPLAY_VER(display) >= 12) 877 /* 878 * Actually TGL can drive LPSP on port till DDI_C 879 * but there is no physical connected DDI_C on TGL sku's, 880 * even driver is not initializing DDI_C port for gen12. 881 */ 882 lpsp_capable = encoder->port <= PORT_B; 883 else if (DISPLAY_VER(display) == 11) 884 lpsp_capable = (connector_type == DRM_MODE_CONNECTOR_DSI || 885 connector_type == DRM_MODE_CONNECTOR_eDP); 886 else if (IS_DISPLAY_VER(display, 9, 10)) 887 lpsp_capable = (encoder->port == PORT_A && 888 (connector_type == DRM_MODE_CONNECTOR_DSI || 889 connector_type == DRM_MODE_CONNECTOR_eDP || 890 connector_type == DRM_MODE_CONNECTOR_DisplayPort)); 891 else if (display->platform.haswell || display->platform.broadwell) 892 lpsp_capable = connector_type == DRM_MODE_CONNECTOR_eDP; 893 894 seq_printf(m, "LPSP: %s\n", lpsp_capable ? "capable" : "incapable"); 895 896 return 0; 897 } 898 DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability); 899 900 static int i915_dsc_fec_support_show(struct seq_file *m, void *data) 901 { 902 struct intel_connector *connector = m->private; 903 struct intel_display *display = to_intel_display(connector); 904 struct drm_crtc *crtc; 905 struct intel_dp *intel_dp; 906 struct drm_modeset_acquire_ctx ctx; 907 struct intel_crtc_state *crtc_state = NULL; 908 int ret = 0; 909 bool try_again = false; 910 911 drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); 912 913 do { 914 try_again = false; 915 ret = drm_modeset_lock(&display->drm->mode_config.connection_mutex, 916 &ctx); 917 if (ret) { 918 if (ret == -EDEADLK && !drm_modeset_backoff(&ctx)) { 919 try_again = true; 920 continue; 921 } 922 break; 923 } 924 crtc = connector->base.state->crtc; 925 if (connector->base.status != connector_status_connected || !crtc) { 926 ret = -ENODEV; 927 break; 928 } 929 ret = drm_modeset_lock(&crtc->mutex, &ctx); 930 if (ret == -EDEADLK) { 931 ret = drm_modeset_backoff(&ctx); 932 if (!ret) { 933 try_again = true; 934 continue; 935 } 936 break; 937 } else if (ret) { 938 break; 939 } 940 intel_dp = intel_attached_dp(connector); 941 crtc_state = to_intel_crtc_state(crtc->state); 942 seq_printf(m, "DSC_Enabled: %s\n", 943 str_yes_no(crtc_state->dsc.compression_enable)); 944 seq_printf(m, "DSC_Sink_Support: %s\n", 945 str_yes_no(drm_dp_sink_supports_dsc(connector->dp.dsc_dpcd))); 946 seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s YCBCR420: %s YCBCR444: %s\n", 947 str_yes_no(drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd, 948 DP_DSC_RGB)), 949 str_yes_no(drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd, 950 DP_DSC_YCbCr420_Native)), 951 str_yes_no(drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd, 952 DP_DSC_YCbCr444))); 953 seq_printf(m, "DSC_Sink_BPP_Precision: %d\n", 954 drm_dp_dsc_sink_bpp_incr(connector->dp.dsc_dpcd)); 955 seq_printf(m, "DSC_Sink_Max_Slice_Count: %d\n", 956 drm_dp_dsc_sink_max_slice_count((connector->dp.dsc_dpcd), intel_dp_is_edp(intel_dp))); 957 seq_printf(m, "Force_DSC_Enable: %s\n", 958 str_yes_no(intel_dp->force_dsc_en)); 959 if (!intel_dp_is_edp(intel_dp)) 960 seq_printf(m, "FEC_Sink_Support: %s\n", 961 str_yes_no(drm_dp_sink_supports_fec(connector->dp.fec_capability))); 962 } while (try_again); 963 964 drm_modeset_drop_locks(&ctx); 965 drm_modeset_acquire_fini(&ctx); 966 967 return ret; 968 } 969 970 static ssize_t i915_dsc_fec_support_write(struct file *file, 971 const char __user *ubuf, 972 size_t len, loff_t *offp) 973 { 974 struct seq_file *m = file->private_data; 975 struct intel_connector *connector = m->private; 976 struct intel_display *display = to_intel_display(connector); 977 struct intel_encoder *encoder = intel_attached_encoder(connector); 978 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 979 bool dsc_enable = false; 980 int ret; 981 982 if (len == 0) 983 return 0; 984 985 drm_dbg(display->drm, 986 "Copied %zu bytes from user to force DSC\n", len); 987 988 ret = kstrtobool_from_user(ubuf, len, &dsc_enable); 989 if (ret < 0) 990 return ret; 991 992 drm_dbg(display->drm, "Got %s for DSC Enable\n", 993 str_true_false(dsc_enable)); 994 intel_dp->force_dsc_en = dsc_enable; 995 996 *offp += len; 997 return len; 998 } 999 1000 static int i915_dsc_fec_support_open(struct inode *inode, 1001 struct file *file) 1002 { 1003 return single_open(file, i915_dsc_fec_support_show, 1004 inode->i_private); 1005 } 1006 1007 static const struct file_operations i915_dsc_fec_support_fops = { 1008 .owner = THIS_MODULE, 1009 .open = i915_dsc_fec_support_open, 1010 .read = seq_read, 1011 .llseek = seq_lseek, 1012 .release = single_release, 1013 .write = i915_dsc_fec_support_write 1014 }; 1015 1016 static int i915_dsc_bpc_show(struct seq_file *m, void *data) 1017 { 1018 struct intel_connector *connector = m->private; 1019 struct intel_display *display = to_intel_display(connector); 1020 struct intel_encoder *encoder = intel_attached_encoder(connector); 1021 struct drm_crtc *crtc; 1022 struct intel_crtc_state *crtc_state; 1023 int ret; 1024 1025 if (!encoder) 1026 return -ENODEV; 1027 1028 ret = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex); 1029 if (ret) 1030 return ret; 1031 1032 crtc = connector->base.state->crtc; 1033 if (connector->base.status != connector_status_connected || !crtc) { 1034 ret = -ENODEV; 1035 goto out; 1036 } 1037 1038 crtc_state = to_intel_crtc_state(crtc->state); 1039 seq_printf(m, "Input_BPC: %d\n", crtc_state->dsc.config.bits_per_component); 1040 1041 out: drm_modeset_unlock(&display->drm->mode_config.connection_mutex); 1042 1043 return ret; 1044 } 1045 1046 static ssize_t i915_dsc_bpc_write(struct file *file, 1047 const char __user *ubuf, 1048 size_t len, loff_t *offp) 1049 { 1050 struct seq_file *m = file->private_data; 1051 struct intel_connector *connector = m->private; 1052 struct intel_encoder *encoder = intel_attached_encoder(connector); 1053 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1054 int dsc_bpc = 0; 1055 int ret; 1056 1057 ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpc); 1058 if (ret < 0) 1059 return ret; 1060 1061 intel_dp->force_dsc_bpc = dsc_bpc; 1062 *offp += len; 1063 1064 return len; 1065 } 1066 1067 static int i915_dsc_bpc_open(struct inode *inode, 1068 struct file *file) 1069 { 1070 return single_open(file, i915_dsc_bpc_show, inode->i_private); 1071 } 1072 1073 static const struct file_operations i915_dsc_bpc_fops = { 1074 .owner = THIS_MODULE, 1075 .open = i915_dsc_bpc_open, 1076 .read = seq_read, 1077 .llseek = seq_lseek, 1078 .release = single_release, 1079 .write = i915_dsc_bpc_write 1080 }; 1081 1082 static int i915_dsc_output_format_show(struct seq_file *m, void *data) 1083 { 1084 struct intel_connector *connector = m->private; 1085 struct intel_display *display = to_intel_display(connector); 1086 struct intel_encoder *encoder = intel_attached_encoder(connector); 1087 struct drm_crtc *crtc; 1088 struct intel_crtc_state *crtc_state; 1089 int ret; 1090 1091 if (!encoder) 1092 return -ENODEV; 1093 1094 ret = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex); 1095 if (ret) 1096 return ret; 1097 1098 crtc = connector->base.state->crtc; 1099 if (connector->base.status != connector_status_connected || !crtc) { 1100 ret = -ENODEV; 1101 goto out; 1102 } 1103 1104 crtc_state = to_intel_crtc_state(crtc->state); 1105 seq_printf(m, "DSC_Output_Format: %s\n", 1106 intel_output_format_name(crtc_state->output_format)); 1107 1108 out: drm_modeset_unlock(&display->drm->mode_config.connection_mutex); 1109 1110 return ret; 1111 } 1112 1113 static ssize_t i915_dsc_output_format_write(struct file *file, 1114 const char __user *ubuf, 1115 size_t len, loff_t *offp) 1116 { 1117 struct seq_file *m = file->private_data; 1118 struct intel_connector *connector = m->private; 1119 struct intel_encoder *encoder = intel_attached_encoder(connector); 1120 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1121 int dsc_output_format = 0; 1122 int ret; 1123 1124 ret = kstrtoint_from_user(ubuf, len, 0, &dsc_output_format); 1125 if (ret < 0) 1126 return ret; 1127 1128 intel_dp->force_dsc_output_format = dsc_output_format; 1129 *offp += len; 1130 1131 return len; 1132 } 1133 1134 static int i915_dsc_output_format_open(struct inode *inode, 1135 struct file *file) 1136 { 1137 return single_open(file, i915_dsc_output_format_show, inode->i_private); 1138 } 1139 1140 static const struct file_operations i915_dsc_output_format_fops = { 1141 .owner = THIS_MODULE, 1142 .open = i915_dsc_output_format_open, 1143 .read = seq_read, 1144 .llseek = seq_lseek, 1145 .release = single_release, 1146 .write = i915_dsc_output_format_write 1147 }; 1148 1149 static int i915_dsc_fractional_bpp_show(struct seq_file *m, void *data) 1150 { 1151 struct intel_connector *connector = m->private; 1152 struct intel_display *display = to_intel_display(connector); 1153 struct intel_encoder *encoder = intel_attached_encoder(connector); 1154 struct drm_crtc *crtc; 1155 struct intel_dp *intel_dp; 1156 int ret; 1157 1158 if (!encoder) 1159 return -ENODEV; 1160 1161 ret = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex); 1162 if (ret) 1163 return ret; 1164 1165 crtc = connector->base.state->crtc; 1166 if (connector->base.status != connector_status_connected || !crtc) { 1167 ret = -ENODEV; 1168 goto out; 1169 } 1170 1171 intel_dp = intel_attached_dp(connector); 1172 seq_printf(m, "Force_DSC_Fractional_BPP_Enable: %s\n", 1173 str_yes_no(intel_dp->force_dsc_fractional_bpp_en)); 1174 1175 out: 1176 drm_modeset_unlock(&display->drm->mode_config.connection_mutex); 1177 1178 return ret; 1179 } 1180 1181 static ssize_t i915_dsc_fractional_bpp_write(struct file *file, 1182 const char __user *ubuf, 1183 size_t len, loff_t *offp) 1184 { 1185 struct seq_file *m = file->private_data; 1186 struct intel_connector *connector = m->private; 1187 struct intel_display *display = to_intel_display(connector); 1188 struct intel_encoder *encoder = intel_attached_encoder(connector); 1189 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1190 bool dsc_fractional_bpp_enable = false; 1191 int ret; 1192 1193 if (len == 0) 1194 return 0; 1195 1196 drm_dbg(display->drm, 1197 "Copied %zu bytes from user to force fractional bpp for DSC\n", len); 1198 1199 ret = kstrtobool_from_user(ubuf, len, &dsc_fractional_bpp_enable); 1200 if (ret < 0) 1201 return ret; 1202 1203 drm_dbg(display->drm, "Got %s for DSC Fractional BPP Enable\n", 1204 str_true_false(dsc_fractional_bpp_enable)); 1205 intel_dp->force_dsc_fractional_bpp_en = dsc_fractional_bpp_enable; 1206 1207 *offp += len; 1208 1209 return len; 1210 } 1211 1212 static int i915_dsc_fractional_bpp_open(struct inode *inode, 1213 struct file *file) 1214 { 1215 return single_open(file, i915_dsc_fractional_bpp_show, inode->i_private); 1216 } 1217 1218 static const struct file_operations i915_dsc_fractional_bpp_fops = { 1219 .owner = THIS_MODULE, 1220 .open = i915_dsc_fractional_bpp_open, 1221 .read = seq_read, 1222 .llseek = seq_lseek, 1223 .release = single_release, 1224 .write = i915_dsc_fractional_bpp_write 1225 }; 1226 1227 /* 1228 * Returns the Current CRTC's bpc. 1229 * Example usage: cat /sys/kernel/debug/dri/0/crtc-0/i915_current_bpc 1230 */ 1231 static int i915_current_bpc_show(struct seq_file *m, void *data) 1232 { 1233 struct intel_crtc *crtc = m->private; 1234 struct intel_crtc_state *crtc_state; 1235 int ret; 1236 1237 ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex); 1238 if (ret) 1239 return ret; 1240 1241 crtc_state = to_intel_crtc_state(crtc->base.state); 1242 seq_printf(m, "Current: %u\n", crtc_state->pipe_bpp / 3); 1243 1244 drm_modeset_unlock(&crtc->base.mutex); 1245 1246 return ret; 1247 } 1248 DEFINE_SHOW_ATTRIBUTE(i915_current_bpc); 1249 1250 /* Pipe may differ from crtc index if pipes are fused off */ 1251 static int intel_crtc_pipe_show(struct seq_file *m, void *unused) 1252 { 1253 struct intel_crtc *crtc = m->private; 1254 1255 seq_printf(m, "%c\n", pipe_name(crtc->pipe)); 1256 1257 return 0; 1258 } 1259 DEFINE_SHOW_ATTRIBUTE(intel_crtc_pipe); 1260 1261 static int i915_joiner_show(struct seq_file *m, void *data) 1262 { 1263 struct intel_connector *connector = m->private; 1264 1265 seq_printf(m, "%d\n", connector->force_joined_pipes); 1266 1267 return 0; 1268 } 1269 1270 static ssize_t i915_joiner_write(struct file *file, 1271 const char __user *ubuf, 1272 size_t len, loff_t *offp) 1273 { 1274 struct seq_file *m = file->private_data; 1275 struct intel_connector *connector = m->private; 1276 struct intel_display *display = to_intel_display(connector); 1277 int force_joined_pipes = 0; 1278 int ret; 1279 1280 if (len == 0) 1281 return 0; 1282 1283 ret = kstrtoint_from_user(ubuf, len, 0, &force_joined_pipes); 1284 if (ret < 0) 1285 return ret; 1286 1287 switch (force_joined_pipes) { 1288 case 0: 1289 case 1: 1290 case 2: 1291 connector->force_joined_pipes = force_joined_pipes; 1292 break; 1293 case 4: 1294 if (HAS_ULTRAJOINER(display)) { 1295 connector->force_joined_pipes = force_joined_pipes; 1296 break; 1297 } 1298 1299 fallthrough; 1300 default: 1301 return -EINVAL; 1302 } 1303 1304 *offp += len; 1305 1306 return len; 1307 } 1308 1309 static int i915_joiner_open(struct inode *inode, struct file *file) 1310 { 1311 return single_open(file, i915_joiner_show, inode->i_private); 1312 } 1313 1314 static const struct file_operations i915_joiner_fops = { 1315 .owner = THIS_MODULE, 1316 .open = i915_joiner_open, 1317 .read = seq_read, 1318 .llseek = seq_lseek, 1319 .release = single_release, 1320 .write = i915_joiner_write 1321 }; 1322 1323 /** 1324 * intel_connector_debugfs_add - add i915 specific connector debugfs files 1325 * @connector: pointer to a registered intel_connector 1326 * 1327 * Cleanup will be done by drm_connector_unregister() through a call to 1328 * drm_debugfs_connector_remove(). 1329 */ 1330 void intel_connector_debugfs_add(struct intel_connector *connector) 1331 { 1332 struct intel_display *display = to_intel_display(connector); 1333 struct dentry *root = connector->base.debugfs_entry; 1334 int connector_type = connector->base.connector_type; 1335 1336 /* The connector must have been registered beforehands. */ 1337 if (!root) 1338 return; 1339 1340 intel_drrs_connector_debugfs_add(connector); 1341 intel_hdcp_connector_debugfs_add(connector); 1342 intel_pps_connector_debugfs_add(connector); 1343 intel_psr_connector_debugfs_add(connector); 1344 intel_alpm_lobf_debugfs_add(connector); 1345 intel_dp_link_training_debugfs_add(connector); 1346 intel_dp_link_caps_debugfs_add(connector); 1347 intel_link_bw_connector_debugfs_add(connector); 1348 1349 if (DISPLAY_VER(display) >= 11 && 1350 ((connector_type == DRM_MODE_CONNECTOR_DisplayPort && !connector->mst.dp) || 1351 connector_type == DRM_MODE_CONNECTOR_eDP)) { 1352 debugfs_create_file("i915_dsc_fec_support", 0644, root, 1353 connector, &i915_dsc_fec_support_fops); 1354 1355 debugfs_create_file("i915_dsc_bpc", 0644, root, 1356 connector, &i915_dsc_bpc_fops); 1357 1358 debugfs_create_file("i915_dsc_output_format", 0644, root, 1359 connector, &i915_dsc_output_format_fops); 1360 1361 debugfs_create_file("i915_dsc_fractional_bpp", 0644, root, 1362 connector, &i915_dsc_fractional_bpp_fops); 1363 } 1364 1365 if ((connector_type == DRM_MODE_CONNECTOR_DisplayPort || 1366 connector_type == DRM_MODE_CONNECTOR_eDP) && 1367 intel_dp_has_joiner(intel_attached_dp(connector))) { 1368 debugfs_create_file("i915_joiner_force_enable", 0644, root, 1369 connector, &i915_joiner_fops); 1370 } 1371 1372 if (connector_type == DRM_MODE_CONNECTOR_DSI || 1373 connector_type == DRM_MODE_CONNECTOR_eDP || 1374 connector_type == DRM_MODE_CONNECTOR_DisplayPort || 1375 connector_type == DRM_MODE_CONNECTOR_HDMIA || 1376 connector_type == DRM_MODE_CONNECTOR_HDMIB) 1377 debugfs_create_file("i915_lpsp_capability", 0444, root, 1378 connector, &i915_lpsp_capability_fops); 1379 } 1380 1381 /** 1382 * intel_crtc_debugfs_add - add i915 specific crtc debugfs files 1383 * @crtc: pointer to a drm_crtc 1384 * 1385 * Failure to add debugfs entries should generally be ignored. 1386 */ 1387 void intel_crtc_debugfs_add(struct intel_crtc *crtc) 1388 { 1389 struct dentry *root = crtc->base.debugfs_entry; 1390 1391 if (!root) 1392 return; 1393 1394 crtc_updates_add(crtc); 1395 intel_drrs_crtc_debugfs_add(crtc); 1396 intel_fbc_crtc_debugfs_add(crtc); 1397 hsw_ips_crtc_debugfs_add(crtc); 1398 1399 debugfs_create_file("i915_current_bpc", 0444, root, crtc, 1400 &i915_current_bpc_fops); 1401 debugfs_create_file("i915_pipe", 0444, root, crtc, 1402 &intel_crtc_pipe_fops); 1403 } 1404