Commit dc38fd9d authored by David Francis's avatar David Francis Committed by Alex Deucher
Browse files

drm/amd/display: Add front end for dp debugfs files



As part of hardware certification, read-write access to
the link rate, lane count, voltage swing, pre-emphasis,
and PHY test pattern of DP connectors is required.  This commit
adds debugfs files that will correspond to these values.
The file operations are not yet implemented: currently
writing or reading them does nothing.

Signed-off-by: default avatarDavid Francis <David.Francis@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 0176e8c4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ AMDGPUDM += amdgpu_dm_services.o amdgpu_dm_helpers.o
endif

ifneq ($(CONFIG_DEBUG_FS),)
AMDGPUDM += amdgpu_dm_crc.o
AMDGPUDM += amdgpu_dm_crc.o amdgpu_dm_debugfs.o
endif

subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc
+10 −0
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@
#include "dm_helpers.h"
#include "dm_services_types.h"
#include "amdgpu_dm_mst_types.h"
#if defined(CONFIG_DEBUG_FS)
#include "amdgpu_dm_debugfs.h"
#endif

#include "ivsrcid/ivsrcid_vislands30.h"

@@ -3619,6 +3622,13 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
		&aconnector->base, &aencoder->base);

	drm_connector_register(&aconnector->base);
#if defined(CONFIG_DEBUG_FS)
	res = connector_debugfs_init(aconnector);
	if (res) {
		DRM_ERROR("Failed to create debugfs for connector");
		goto out_free;
	}
#endif

	if (connector_type == DRM_MODE_CONNECTOR_DisplayPort
		|| connector_type == DRM_MODE_CONNECTOR_eDP)
+170 −0
Original line number Diff line number Diff line
/*
 * Copyright 2018 Advanced Micro Devices, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: AMD
 *
 */

#include <linux/debugfs.h>

#include "dc.h"
#include "dc_link.h"

#include "amdgpu.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_debugfs.h"

static ssize_t dp_link_rate_debugfs_read(struct file *f, char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to read link rate */
	return 1;
}

static ssize_t dp_link_rate_debugfs_write(struct file *f, const char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to write link rate */
	return 1;
}

static ssize_t dp_lane_count_debugfs_read(struct file *f, char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to read lane count */
	return 1;
}

static ssize_t dp_lane_count_debugfs_write(struct file *f, const char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to write lane count */
	return 1;
}

static ssize_t dp_voltage_swing_debugfs_read(struct file *f, char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to read voltage swing */
	return 1;
}

static ssize_t dp_voltage_swing_debugfs_write(struct file *f, const char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to write voltage swing */
	return 1;
}

static ssize_t dp_pre_emphasis_debugfs_read(struct file *f, char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to read pre-emphasis */
	return 1;
}

static ssize_t dp_pre_emphasis_debugfs_write(struct file *f, const char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to write pre-emphasis */
	return 1;
}

static ssize_t dp_phy_test_pattern_debugfs_read(struct file *f, char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to read PHY test pattern */
	return 1;
}

static ssize_t dp_phy_test_pattern_debugfs_write(struct file *f, const char __user *buf,
				 size_t size, loff_t *pos)
{
	/* TODO: create method to write PHY test pattern */
	return 1;
}

static const struct file_operations dp_link_rate_fops = {
	.owner = THIS_MODULE,
	.read = dp_link_rate_debugfs_read,
	.write = dp_link_rate_debugfs_write,
	.llseek = default_llseek
};

static const struct file_operations dp_lane_count_fops = {
	.owner = THIS_MODULE,
	.read = dp_lane_count_debugfs_read,
	.write = dp_lane_count_debugfs_write,
	.llseek = default_llseek
};

static const struct file_operations dp_voltage_swing_fops = {
	.owner = THIS_MODULE,
	.read = dp_voltage_swing_debugfs_read,
	.write = dp_voltage_swing_debugfs_write,
	.llseek = default_llseek
};

static const struct file_operations dp_pre_emphasis_fops = {
	.owner = THIS_MODULE,
	.read = dp_pre_emphasis_debugfs_read,
	.write = dp_pre_emphasis_debugfs_write,
	.llseek = default_llseek
};

static const struct file_operations dp_phy_test_pattern_fops = {
	.owner = THIS_MODULE,
	.read = dp_phy_test_pattern_debugfs_read,
	.write = dp_phy_test_pattern_debugfs_write,
	.llseek = default_llseek
};

static const struct {
	char *name;
	const struct file_operations *fops;
} dp_debugfs_entries[] = {
		{"link_rate", &dp_link_rate_fops},
		{"lane_count", &dp_lane_count_fops},
		{"voltage_swing", &dp_voltage_swing_fops},
		{"pre_emphasis", &dp_pre_emphasis_fops},
		{"phy_test_pattern", &dp_phy_test_pattern_fops}
};

int connector_debugfs_init(struct amdgpu_dm_connector *connector)
{
	int i;
	struct dentry *ent, *dir = connector->base.debugfs_entry;

	if (connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
		for (i = 0; i < ARRAY_SIZE(dp_debugfs_entries); i++) {
			ent = debugfs_create_file(dp_debugfs_entries[i].name,
						  0644,
						  dir,
						  connector,
						  dp_debugfs_entries[i].fops);
			if (IS_ERR(ent))
				return PTR_ERR(ent);
		}
	}

	return 0;
}
+34 −0
Original line number Diff line number Diff line
/*
 * Copyright 2018 Advanced Micro Devices, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: AMD
 *
 */

#ifndef __AMDGPU_DM_DEBUGFS_H__
#define __AMDGPU_DM_DEBUGFS_H__

#include "amdgpu.h"
#include "amdgpu_dm.h"

int connector_debugfs_init(struct amdgpu_dm_connector *connector);

#endif