diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1656-drm-amd-display-Add-debugfs-dpcd-interface.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1656-drm-amd-display-Add-debugfs-dpcd-interface.patch | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1656-drm-amd-display-Add-debugfs-dpcd-interface.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1656-drm-amd-display-Add-debugfs-dpcd-interface.patch new file mode 100644 index 00000000..ce41f914 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1656-drm-amd-display-Add-debugfs-dpcd-interface.patch @@ -0,0 +1,207 @@ +From f1130ecac340915679f637fc07f7ad7d7240c0b8 Mon Sep 17 00:00:00 2001 +From: David Francis <David.Francis@amd.com> +Date: Tue, 5 Mar 2019 10:04:15 -0500 +Subject: [PATCH 1656/2940] drm/amd/display: Add debugfs dpcd interface + +[Why] +We need arbitrary read/write over DP AUX DPCD +for debugging + +[How] +Three debugfs entries + +Set the target address by writing to +"aux_dpcd_address" +(The first four bytes written are used) + +Set the transaction size in bytes by writing to +"aux_dpcd_size" +(The first four bytes written are used) + +Start a transaction by reading/writing +"aux_dpcd_data" + +Do note: there is no concerrency protection at all +Accessing these entries in quick succession can lead +to strange behaviour + +Change-Id: Ibf146c674fce12510fa20b28a976eb9986b341d4 +Signed-off-by: David Francis <David.Francis@amd.com> +Reviewed-by: Harry Wentland <Harry.Wentland@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 + + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 4 + + .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 107 +++++++++++++++++- + 3 files changed, 112 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index ccbc434893a7..8e090c6957df 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -4522,6 +4522,8 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, + DRM_ERROR("Failed to create debugfs for connector"); + goto out_free; + } ++ aconnector->debugfs_dpcd_address = 0; ++ aconnector->debugfs_dpcd_size = 0; + #endif + + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +index 624bb2e69e94..bfe82b457ab7 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +@@ -235,6 +235,10 @@ struct amdgpu_dm_connector { + struct mutex hpd_lock; + + bool fake_enable; ++#ifdef CONFIG_DEBUG_FS ++ uint32_t debugfs_dpcd_address; ++ uint32_t debugfs_dpcd_size; ++#endif + }; + + #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +index 842ddd37fb81..1a9e3d3dfa38 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +@@ -29,6 +29,7 @@ + #include "amdgpu.h" + #include "amdgpu_dm.h" + #include "amdgpu_dm_debugfs.h" ++#include "dm_helpers.h" + + /* function description + * get/ set DP configuration: lane_count, link_rate, spread_spectrum +@@ -731,6 +732,88 @@ static ssize_t dp_sdp_message_debugfs_write(struct file *f, const char __user *b + + DEFINE_SHOW_ATTRIBUTE(vrr_range); + ++static ssize_t dp_dpcd_address_write(struct file *f, const char __user *buf, ++ size_t size, loff_t *pos) ++{ ++ int r; ++ struct amdgpu_dm_connector *connector = file_inode(f)->i_private; ++ ++ if (size < sizeof(connector->debugfs_dpcd_address)) ++ return 0; ++ ++ r = copy_from_user(&connector->debugfs_dpcd_address, ++ buf, sizeof(connector->debugfs_dpcd_address)); ++ ++ return size - r; ++} ++ ++static ssize_t dp_dpcd_size_write(struct file *f, const char __user *buf, ++ size_t size, loff_t *pos) ++{ ++ int r; ++ struct amdgpu_dm_connector *connector = file_inode(f)->i_private; ++ ++ if (size < sizeof(connector->debugfs_dpcd_size)) ++ return 0; ++ ++ r = copy_from_user(&connector->debugfs_dpcd_size, ++ buf, sizeof(connector->debugfs_dpcd_size)); ++ ++ if (connector->debugfs_dpcd_size > 256) ++ connector->debugfs_dpcd_size = 0; ++ ++ return size - r; ++} ++ ++static ssize_t dp_dpcd_data_write(struct file *f, const char __user *buf, ++ size_t size, loff_t *pos) ++{ ++ int r; ++ char *data; ++ struct amdgpu_dm_connector *connector = file_inode(f)->i_private; ++ struct dc_link *link = connector->dc_link; ++ uint32_t write_size = connector->debugfs_dpcd_size; ++ ++ if (size < write_size) ++ return 0; ++ ++ data = kzalloc(write_size, GFP_KERNEL); ++ if (!data) ++ return 0; ++ ++ r = copy_from_user(data, buf, write_size); ++ ++ dm_helpers_dp_write_dpcd(link->ctx, link, ++ connector->debugfs_dpcd_address, data, write_size - r); ++ kfree(data); ++ return write_size - r; ++} ++ ++static ssize_t dp_dpcd_data_read(struct file *f, char __user *buf, ++ size_t size, loff_t *pos) ++{ ++ int r; ++ char *data; ++ struct amdgpu_dm_connector *connector = file_inode(f)->i_private; ++ struct dc_link *link = connector->dc_link; ++ uint32_t read_size = connector->debugfs_dpcd_size; ++ ++ if (size < read_size) ++ return 0; ++ ++ data = kzalloc(read_size, GFP_KERNEL); ++ if (!data) ++ return 0; ++ ++ dm_helpers_dp_read_dpcd(link->ctx, link, ++ connector->debugfs_dpcd_address, data, read_size); ++ ++ r = copy_to_user(buf, data, read_size); ++ ++ kfree(data); ++ return read_size - r; ++} ++ + static const struct file_operations dp_link_settings_debugfs_fops = { + .owner = THIS_MODULE, + .read = dp_link_settings_read, +@@ -757,6 +840,25 @@ static const struct file_operations sdp_message_fops = { + .llseek = default_llseek + }; + ++static const struct file_operations dp_dpcd_address_debugfs_fops = { ++ .owner = THIS_MODULE, ++ .write = dp_dpcd_address_write, ++ .llseek = default_llseek ++}; ++ ++static const struct file_operations dp_dpcd_size_debugfs_fops = { ++ .owner = THIS_MODULE, ++ .write = dp_dpcd_size_write, ++ .llseek = default_llseek ++}; ++ ++static const struct file_operations dp_dpcd_data_debugfs_fops = { ++ .owner = THIS_MODULE, ++ .read = dp_dpcd_data_read, ++ .write = dp_dpcd_data_write, ++ .llseek = default_llseek ++}; ++ + static const struct { + char *name; + const struct file_operations *fops; +@@ -765,7 +867,10 @@ static const struct { + {"phy_settings", &dp_phy_settings_debugfs_fop}, + {"test_pattern", &dp_phy_test_pattern_fops}, + {"vrr_range", &vrr_range_fops}, +- {"sdp_message", &sdp_message_fops} ++ {"sdp_message", &sdp_message_fops}, ++ {"aux_dpcd_address", &dp_dpcd_address_debugfs_fops}, ++ {"aux_dpcd_size", &dp_dpcd_size_debugfs_fops}, ++ {"aux_dpcd_data", &dp_dpcd_data_debugfs_fops} + }; + + int connector_debugfs_init(struct amdgpu_dm_connector *connector) +-- +2.17.1 + |