drm/i915/psr: Add psr sink error status into sink status debugfs
authorJouni Högander <jouni.hogander@intel.com>
Mon, 28 Aug 2023 08:31:07 +0000 (11:31 +0300)
committerJouni Högander <jouni.hogander@intel.com>
Wed, 6 Sep 2023 06:00:06 +0000 (09:00 +0300)
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: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Animesh Manna <animesh.manna@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230828083107.1520501-1-jouni.hogander@intel.com
drivers/gpu/drm/i915/display/intel_psr.c

index b9e38acc513209ddb1573784af2a2579ca5017a1..850b11f2028521e735e73d336ff28f5264b29baa 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_damage_helper.h>
+#include <drm/drm_debugfs.h>
 
 #include "i915_drv.h"
 #include "i915_reg.h"
@@ -3159,7 +3160,7 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data)
        };
        const char *str;
        int ret;
-       u8 val;
+       u8 status, error_status;
 
        if (!CAN_PSR(intel_dp)) {
                seq_puts(m, "PSR Unsupported\n");
@@ -3169,19 +3170,34 @@ static int i915_psr_sink_status_show(struct seq_file *m, void *data)
        if (connector->base.status != connector_status_connected)
                return -ENODEV;
 
-       ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_PSR_STATUS, &val);
-       if (ret != 1)
-               return ret < 0 ? ret : -EIO;
+       ret = psr_get_status_and_error_status(intel_dp, &status, &error_status);
+       if (ret)
+               return ret;
 
-       val &= DP_PSR_SINK_STATE_MASK;
-       if (val < ARRAY_SIZE(sink_status))
-               str = sink_status[val];
+       status &= DP_PSR_SINK_STATE_MASK;
+       if (status < ARRAY_SIZE(sink_status))
+               str = sink_status[status];
        else
                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);