Linux Audio

Check our new training course

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