Commit a3f84a67 authored by Jouni Högander's avatar Jouni Högander

drm/i915/psr: Add psr sink error status into sink status debugfs

Normally PSR errors detected by the panel are triggering HPD interrupt and
seen as error in dmesg. Some panels are not triggering the interrupt even
it is requested and they are detecting error. Due to this it would be good
to have possibility to check panel detected errors. Add PSR error status
into PSR sink status debugfs interface.
Signed-off-by: default avatarJouni Högander <jouni.hogander@intel.com>
Reviewed-by: default avatarAnimesh Manna <animesh.manna@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230828083107.1520501-1-jouni.hogander@intel.com
parent 182ccc43
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <drm/drm_atomic_helper.h> #include <drm/drm_atomic_helper.h>
#include <drm/drm_damage_helper.h> #include <drm/drm_damage_helper.h>
#include <drm/drm_debugfs.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_reg.h" #include "i915_reg.h"
...@@ -3159,7 +3160,7 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data) ...@@ -3159,7 +3160,7 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data)
}; };
const char *str; const char *str;
int ret; int ret;
u8 val; u8 status, error_status;
if (!CAN_PSR(intel_dp)) { if (!CAN_PSR(intel_dp)) {
seq_puts(m, "PSR Unsupported\n"); seq_puts(m, "PSR Unsupported\n");
...@@ -3169,19 +3170,34 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data) ...@@ -3169,19 +3170,34 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data)
if (connector->base.status != connector_status_connected) if (connector->base.status != connector_status_connected)
return -ENODEV; return -ENODEV;
ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val); ret = psr_get_status_and_error_status(intel_dp, &status, &error_status);
if (ret != 1) if (ret)
return ret < 0 ? ret : -EIO; return ret;
val &= DP_PSR_SINK_STATE_MASK; status &= DP_PSR_SINK_STATE_MASK;
if (val < ARRAY_SIZE(sink_status)) if (status < ARRAY_SIZE(sink_status))
str = sink_status[val]; str = sink_status[status];
else else
str = "unknown"; str = "unknown";
seq_printf(m, "Sink PSR status: 0x%x [%s]\n", val, str); seq_printf(m, "Sink PSR status: 0x%x [%s]\n", status, str);
return 0; seq_printf(m, "Sink PSR error status: 0x%x", error_status);
if (error_status & (DP_PSR_RFB_STORAGE_ERROR |
DP_PSR_VSC_SDP_UNCORRECTABLE_ERROR |
DP_PSR_LINK_CRC_ERROR))
seq_puts(m, ":\n");
else
seq_puts(m, "\n");
if (error_status & DP_PSR_RFB_STORAGE_ERROR)
seq_puts(m, "\tPSR RFB storage error\n");
if (error_status & DP_PSR_VSC_SDP_UNCORRECTABLE_ERROR)
seq_puts(m, "\tPSR VSC SDP uncorrectable error\n");
if (error_status & DP_PSR_LINK_CRC_ERROR)
seq_puts(m, "\tPSR Link CRC error\n");
return ret;
} }
DEFINE_SHOW_ATTRIBUTE(i915_psr_sink_status); DEFINE_SHOW_ATTRIBUTE(i915_psr_sink_status);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment