#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"
        };
        const char *str;
        int ret;
-       u8 val;
+       u8 status, error_status;
 
        if (!CAN_PSR(intel_dp)) {
                seq_puts(m, "PSR Unsupported\n");
        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);