[PATCH] drm/amd/display: fix read errors pertaining to dp_lttpr_status_show()
Aurabindo Pillai
aurabindo.pillai at amd.com
Fri Feb 3 16:26:19 UTC 2023
On 2/3/23 10:43, Hamza Mahfooz wrote:
> Currently, it is likely that we will read the relevant LTTPR caps after
> link training has completed (which can cause garbage data to be read),
> however according to the DP 2.0 spec that should be done before link
> training has commenced. So, instead of reading the registers on demand,
> use the values provided to us by DC.
>
> Signed-off-by: Hamza Mahfooz<hamza.mahfooz at amd.com>
> ---
> .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 72 ++++++-------------
> 1 file changed, 22 insertions(+), 50 deletions(-)
>
> 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 e783082a4eef..cbc241596c1f 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
> @@ -36,6 +36,7 @@
> #include "dsc.h"
> #include "link_hwss.h"
> #include "dc/dc_dmub_srv.h"
> +#include "link/protocols/link_dp_capability.h"
>
> #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
> #include "amdgpu_dm_psr.h"
> @@ -418,67 +419,38 @@ static ssize_t dp_phy_settings_read(struct file *f, char __user *buf,
> return result;
> }
>
> -static int dp_lttpr_status_show(struct seq_file *m, void *d)
> +static int dp_lttpr_status_show(struct seq_file *m, void *unused)
> {
> - char *data;
> - struct amdgpu_dm_connector *connector = file_inode(m->file)->i_private;
> - struct dc_link *link = connector->dc_link;
> - uint32_t read_size = 1;
> - uint8_t repeater_count = 0;
> + struct drm_connector *connector = m->private;
> + struct amdgpu_dm_connector *aconnector =
> + to_amdgpu_dm_connector(connector);
> + struct dc_lttpr_caps caps = aconnector->dc_link->dpcd_caps.lttpr_caps;
>
> - data = kzalloc(read_size, GFP_KERNEL);
> - if (!data)
> - return 0;
> + if (connector->status != connector_status_connected)
> + return -ENODEV;
>
> - dm_helpers_dp_read_dpcd(link->ctx, link, 0xF0002, data, read_size);
> + seq_printf(m, "phy repeater count: %u (raw: 0x%x)\n",
> + dp_parse_lttpr_repeater_count(caps.phy_repeater_cnt),
> + caps.phy_repeater_cnt);
>
> - switch ((uint8_t)*data) {
> - case 0x80:
> - repeater_count = 1;
> - break;
> - case 0x40:
> - repeater_count = 2;
> - break;
> - case 0x20:
> - repeater_count = 3;
> - break;
> - case 0x10:
> - repeater_count = 4;
> - break;
> - case 0x8:
> - repeater_count = 5;
> - break;
> - case 0x4:
> - repeater_count = 6;
> - break;
> - case 0x2:
> - repeater_count = 7;
> + seq_puts(m, "phy repeater mode: ");
> +
> + switch (caps.mode) {
> + case DP_PHY_REPEATER_MODE_TRANSPARENT:
> + seq_puts(m, "transparent");
> break;
> - case 0x1:
> - repeater_count = 8;
> + case DP_PHY_REPEATER_MODE_NON_TRANSPARENT:
> + seq_puts(m, "non-transparent");
> break;
> - case 0x0:
> - repeater_count = 0;
> + case 0x00:
> + seq_puts(m, "non lttpr");
> break;
> default:
> - repeater_count = (uint8_t)*data;
> + seq_printf(m, "read error (raw: 0x%x)", caps.mode);
> break;
> }
>
> - seq_printf(m, "phy repeater count: %d\n", repeater_count);
> -
> - dm_helpers_dp_read_dpcd(link->ctx, link, 0xF0003, data, read_size);
> -
> - if ((uint8_t)*data == 0x55)
> - seq_printf(m, "phy repeater mode: transparent\n");
> - else if ((uint8_t)*data == 0xAA)
> - seq_printf(m, "phy repeater mode: non-transparent\n");
> - else if ((uint8_t)*data == 0x00)
> - seq_printf(m, "phy repeater mode: non lttpr\n");
> - else
> - seq_printf(m, "phy repeater mode: read error\n");
> -
> - kfree(data);
> + seq_puts(m, "\n");
> return 0;
> }
>
Reviewed-by: Aurabindo Pillai <aurabindo.pillai at amd.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20230203/875741f1/attachment-0001.htm>
More information about the amd-gfx
mailing list