mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 16:22:41 -04:00
drm/i915/dp: move DP test debugfs files next to the functionality
Move the DP test debugfs files to intel_dp_test.[ch]. Side note: The debugfs looks like it begs to be converted to connector debugfs, but that's for another day. Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/46779bc4e420868e21bd5e72fdf245a541252fde.1726833193.git.jani.nikula@intel.com Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#include "intel_dp.h"
|
||||
#include "intel_dp_link_training.h"
|
||||
#include "intel_dp_mst.h"
|
||||
#include "intel_dp_test.h"
|
||||
#include "intel_drrs.h"
|
||||
#include "intel_fb.h"
|
||||
#include "intel_fbc.h"
|
||||
@@ -792,198 +793,6 @@ static int i915_dp_mst_info(struct seq_file *m, void *unused)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t i915_displayport_test_active_write(struct file *file,
|
||||
const char __user *ubuf,
|
||||
size_t len, loff_t *offp)
|
||||
{
|
||||
char *input_buffer;
|
||||
int status = 0;
|
||||
struct drm_device *dev;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
int val = 0;
|
||||
|
||||
dev = ((struct seq_file *)file->private_data)->private;
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
input_buffer = memdup_user_nul(ubuf, len);
|
||||
if (IS_ERR(input_buffer))
|
||||
return PTR_ERR(input_buffer);
|
||||
|
||||
drm_dbg(dev, "Copied %d bytes from user\n", (unsigned int)len);
|
||||
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
status = kstrtoint(input_buffer, 10, &val);
|
||||
if (status < 0)
|
||||
break;
|
||||
drm_dbg(dev, "Got %d for test active\n", val);
|
||||
/* To prevent erroneous activation of the compliance
|
||||
* testing code, only accept an actual value of 1 here
|
||||
*/
|
||||
if (val == 1)
|
||||
intel_dp->compliance.test_active = true;
|
||||
else
|
||||
intel_dp->compliance.test_active = false;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
kfree(input_buffer);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
*offp += len;
|
||||
return len;
|
||||
}
|
||||
|
||||
static int i915_displayport_test_active_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
|
||||
drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
if (intel_dp->compliance.test_active)
|
||||
seq_puts(m, "1");
|
||||
else
|
||||
seq_puts(m, "0");
|
||||
} else
|
||||
seq_puts(m, "0");
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int i915_displayport_test_active_open(struct inode *inode,
|
||||
struct file *file)
|
||||
{
|
||||
return single_open(file, i915_displayport_test_active_show,
|
||||
inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations i915_displayport_test_active_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = i915_displayport_test_active_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.write = i915_displayport_test_active_write
|
||||
};
|
||||
|
||||
static int i915_displayport_test_data_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
|
||||
drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
if (intel_dp->compliance.test_type ==
|
||||
DP_TEST_LINK_EDID_READ)
|
||||
seq_printf(m, "%lx",
|
||||
intel_dp->compliance.test_data.edid);
|
||||
else if (intel_dp->compliance.test_type ==
|
||||
DP_TEST_LINK_VIDEO_PATTERN) {
|
||||
seq_printf(m, "hdisplay: %d\n",
|
||||
intel_dp->compliance.test_data.hdisplay);
|
||||
seq_printf(m, "vdisplay: %d\n",
|
||||
intel_dp->compliance.test_data.vdisplay);
|
||||
seq_printf(m, "bpc: %u\n",
|
||||
intel_dp->compliance.test_data.bpc);
|
||||
} else if (intel_dp->compliance.test_type ==
|
||||
DP_TEST_LINK_PHY_TEST_PATTERN) {
|
||||
seq_printf(m, "pattern: %d\n",
|
||||
intel_dp->compliance.test_data.phytest.phy_pattern);
|
||||
seq_printf(m, "Number of lanes: %d\n",
|
||||
intel_dp->compliance.test_data.phytest.num_lanes);
|
||||
seq_printf(m, "Link Rate: %d\n",
|
||||
intel_dp->compliance.test_data.phytest.link_rate);
|
||||
seq_printf(m, "level: %02x\n",
|
||||
intel_dp->train_set[0]);
|
||||
}
|
||||
} else
|
||||
seq_puts(m, "0");
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_data);
|
||||
|
||||
static int i915_displayport_test_type_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
|
||||
drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
seq_printf(m, "%02lx\n", intel_dp->compliance.test_type);
|
||||
} else
|
||||
seq_puts(m, "0");
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_type);
|
||||
|
||||
static ssize_t
|
||||
i915_fifo_underrun_reset_write(struct file *filp,
|
||||
const char __user *ubuf,
|
||||
@@ -1062,9 +871,6 @@ static const struct {
|
||||
const struct file_operations *fops;
|
||||
} intel_display_debugfs_files[] = {
|
||||
{"i915_fifo_underrun_reset", &i915_fifo_underrun_reset_ops},
|
||||
{"i915_dp_test_data", &i915_displayport_test_data_fops},
|
||||
{"i915_dp_test_type", &i915_displayport_test_type_fops},
|
||||
{"i915_dp_test_active", &i915_displayport_test_active_fops},
|
||||
};
|
||||
|
||||
void intel_display_debugfs_register(struct drm_i915_private *i915)
|
||||
@@ -1088,6 +894,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915)
|
||||
intel_bios_debugfs_register(display);
|
||||
intel_cdclk_debugfs_register(display);
|
||||
intel_dmc_debugfs_register(display);
|
||||
intel_dp_test_debugfs_register(display);
|
||||
intel_fbc_debugfs_register(display);
|
||||
intel_hpd_debugfs_register(i915);
|
||||
intel_opregion_debugfs_register(display);
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/* Copyright © 2024 Intel Corporation */
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
|
||||
#include <drm/display/drm_dp.h>
|
||||
#include <drm/display/drm_dp_helper.h>
|
||||
#include <drm/drm_edid.h>
|
||||
@@ -507,3 +509,218 @@ bool intel_dp_test_phy(struct intel_dp *intel_dp)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static ssize_t i915_displayport_test_active_write(struct file *file,
|
||||
const char __user *ubuf,
|
||||
size_t len, loff_t *offp)
|
||||
{
|
||||
char *input_buffer;
|
||||
int status = 0;
|
||||
struct drm_device *dev;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
int val = 0;
|
||||
|
||||
dev = ((struct seq_file *)file->private_data)->private;
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
input_buffer = memdup_user_nul(ubuf, len);
|
||||
if (IS_ERR(input_buffer))
|
||||
return PTR_ERR(input_buffer);
|
||||
|
||||
drm_dbg(dev, "Copied %d bytes from user\n", (unsigned int)len);
|
||||
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
status = kstrtoint(input_buffer, 10, &val);
|
||||
if (status < 0)
|
||||
break;
|
||||
drm_dbg(dev, "Got %d for test active\n", val);
|
||||
/* To prevent erroneous activation of the compliance
|
||||
* testing code, only accept an actual value of 1 here
|
||||
*/
|
||||
if (val == 1)
|
||||
intel_dp->compliance.test_active = true;
|
||||
else
|
||||
intel_dp->compliance.test_active = false;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
kfree(input_buffer);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
*offp += len;
|
||||
return len;
|
||||
}
|
||||
|
||||
static int i915_displayport_test_active_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
|
||||
drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
if (intel_dp->compliance.test_active)
|
||||
seq_puts(m, "1");
|
||||
else
|
||||
seq_puts(m, "0");
|
||||
} else
|
||||
seq_puts(m, "0");
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int i915_displayport_test_active_open(struct inode *inode,
|
||||
struct file *file)
|
||||
{
|
||||
return single_open(file, i915_displayport_test_active_show,
|
||||
inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations i915_displayport_test_active_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = i915_displayport_test_active_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.write = i915_displayport_test_active_write
|
||||
};
|
||||
|
||||
static int i915_displayport_test_data_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
|
||||
drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
if (intel_dp->compliance.test_type ==
|
||||
DP_TEST_LINK_EDID_READ)
|
||||
seq_printf(m, "%lx",
|
||||
intel_dp->compliance.test_data.edid);
|
||||
else if (intel_dp->compliance.test_type ==
|
||||
DP_TEST_LINK_VIDEO_PATTERN) {
|
||||
seq_printf(m, "hdisplay: %d\n",
|
||||
intel_dp->compliance.test_data.hdisplay);
|
||||
seq_printf(m, "vdisplay: %d\n",
|
||||
intel_dp->compliance.test_data.vdisplay);
|
||||
seq_printf(m, "bpc: %u\n",
|
||||
intel_dp->compliance.test_data.bpc);
|
||||
} else if (intel_dp->compliance.test_type ==
|
||||
DP_TEST_LINK_PHY_TEST_PATTERN) {
|
||||
seq_printf(m, "pattern: %d\n",
|
||||
intel_dp->compliance.test_data.phytest.phy_pattern);
|
||||
seq_printf(m, "Number of lanes: %d\n",
|
||||
intel_dp->compliance.test_data.phytest.num_lanes);
|
||||
seq_printf(m, "Link Rate: %d\n",
|
||||
intel_dp->compliance.test_data.phytest.link_rate);
|
||||
seq_printf(m, "level: %02x\n",
|
||||
intel_dp->train_set[0]);
|
||||
}
|
||||
} else
|
||||
seq_puts(m, "0");
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_data);
|
||||
|
||||
static int i915_displayport_test_type_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
struct intel_dp *intel_dp;
|
||||
|
||||
drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (connector->connector_type !=
|
||||
DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
|
||||
encoder = to_intel_encoder(connector->encoder);
|
||||
if (encoder && encoder->type == INTEL_OUTPUT_DP_MST)
|
||||
continue;
|
||||
|
||||
if (encoder && connector->status == connector_status_connected) {
|
||||
intel_dp = enc_to_intel_dp(encoder);
|
||||
seq_printf(m, "%02lx\n", intel_dp->compliance.test_type);
|
||||
} else
|
||||
seq_puts(m, "0");
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_type);
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
const struct file_operations *fops;
|
||||
} intel_display_debugfs_files[] = {
|
||||
{"i915_dp_test_data", &i915_displayport_test_data_fops},
|
||||
{"i915_dp_test_type", &i915_displayport_test_type_fops},
|
||||
{"i915_dp_test_active", &i915_displayport_test_active_fops},
|
||||
};
|
||||
|
||||
void intel_dp_test_debugfs_register(struct intel_display *display)
|
||||
{
|
||||
struct drm_minor *minor = display->drm->primary;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(intel_display_debugfs_files); i++) {
|
||||
debugfs_create_file(intel_display_debugfs_files[i].name,
|
||||
0644,
|
||||
minor->debugfs_root,
|
||||
to_i915(minor->dev),
|
||||
intel_display_debugfs_files[i].fops);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
struct intel_crtc_state;
|
||||
struct intel_display;
|
||||
struct intel_dp;
|
||||
struct link_config_limits;
|
||||
|
||||
@@ -15,5 +16,6 @@ void intel_dp_test_compute_config(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct link_config_limits *limits);
|
||||
bool intel_dp_test_phy(struct intel_dp *intel_dp);
|
||||
void intel_dp_test_debugfs_register(struct intel_display *display);
|
||||
|
||||
#endif /* __INTEL_DP_TEST_H__ */
|
||||
|
||||
Reference in New Issue
Block a user