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