]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - drivers/gpu/drm/i915/display/intel_display_debugfs.c
Merge tag 'drm-misc-next-2020-06-19' of git://anongit.freedesktop.org/drm/drm-misc...
[thirdparty/linux.git] / drivers / gpu / drm / i915 / display / intel_display_debugfs.c
index bbf92ae6940799ac872fee99624c15bfd8a269c6..2b640d8ab9d2ebf55c68d110e8c478e45e5fb8b3 100644 (file)
@@ -9,6 +9,7 @@
 #include "i915_debugfs.h"
 #include "intel_csr.h"
 #include "intel_display_debugfs.h"
+#include "intel_display_power.h"
 #include "intel_display_types.h"
 #include "intel_dp.h"
 #include "intel_fbc.h"
@@ -1143,6 +1144,51 @@ static int i915_drrs_status(struct seq_file *m, void *unused)
        return 0;
 }
 
+#define LPSP_STATUS(COND) (COND ? seq_puts(m, "LPSP: enabled\n") : \
+                               seq_puts(m, "LPSP: disabled\n"))
+
+static bool
+intel_lpsp_power_well_enabled(struct drm_i915_private *i915,
+                             enum i915_power_well_id power_well_id)
+{
+       intel_wakeref_t wakeref;
+       bool is_enabled;
+
+       wakeref = intel_runtime_pm_get(&i915->runtime_pm);
+       is_enabled = intel_display_power_well_is_enabled(i915,
+                                                        power_well_id);
+       intel_runtime_pm_put(&i915->runtime_pm, wakeref);
+
+       return is_enabled;
+}
+
+static int i915_lpsp_status(struct seq_file *m, void *unused)
+{
+       struct drm_i915_private *i915 = node_to_i915(m->private);
+
+       switch (INTEL_GEN(i915)) {
+       case 12:
+       case 11:
+               LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, ICL_DISP_PW_3));
+               break;
+       case 10:
+       case 9:
+               LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, SKL_DISP_PW_2));
+               break;
+       default:
+               /*
+                * Apart from HASWELL/BROADWELL other legacy platform doesn't
+                * support lpsp.
+                */
+               if (IS_HASWELL(i915) || IS_BROADWELL(i915))
+                       LPSP_STATUS(!intel_lpsp_power_well_enabled(i915, HSW_DISP_PW_GLOBAL));
+               else
+                       seq_puts(m, "LPSP: not supported\n");
+       }
+
+       return 0;
+}
+
 static int i915_dp_mst_info(struct seq_file *m, void *unused)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@ -1910,6 +1956,7 @@ static const struct drm_info_list intel_display_debugfs_list[] = {
        {"i915_dp_mst_info", i915_dp_mst_info, 0},
        {"i915_ddb_info", i915_ddb_info, 0},
        {"i915_drrs_status", i915_drrs_status, 0},
+       {"i915_lpsp_status", i915_lpsp_status, 0},
 };
 
 static const struct {
@@ -1991,6 +2038,48 @@ static int i915_hdcp_sink_capability_show(struct seq_file *m, void *data)
 }
 DEFINE_SHOW_ATTRIBUTE(i915_hdcp_sink_capability);
 
+#define LPSP_CAPABLE(COND) (COND ? seq_puts(m, "LPSP: capable\n") : \
+                               seq_puts(m, "LPSP: incapable\n"))
+
+static int i915_lpsp_capability_show(struct seq_file *m, void *data)
+{
+       struct drm_connector *connector = m->private;
+       struct intel_encoder *encoder =
+                       intel_attached_encoder(to_intel_connector(connector));
+       struct drm_i915_private *i915 = to_i915(connector->dev);
+
+       if (connector->status != connector_status_connected)
+               return -ENODEV;
+
+       switch (INTEL_GEN(i915)) {
+       case 12:
+               /*
+                * Actually TGL can drive LPSP on port till DDI_C
+                * but there is no physical connected DDI_C on TGL sku's,
+                * even driver is not initilizing DDI_C port for gen12.
+                */
+               LPSP_CAPABLE(encoder->port <= PORT_B);
+               break;
+       case 11:
+               LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
+                            connector->connector_type == DRM_MODE_CONNECTOR_eDP);
+               break;
+       case 10:
+       case 9:
+               LPSP_CAPABLE(encoder->port == PORT_A &&
+                            (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
+                            connector->connector_type == DRM_MODE_CONNECTOR_eDP  ||
+                            connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort));
+               break;
+       default:
+               if (IS_HASWELL(i915) || IS_BROADWELL(i915))
+                       LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_eDP);
+       }
+
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
+
 static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
 {
        struct drm_connector *connector = m->private;
@@ -2134,5 +2223,16 @@ int intel_connector_debugfs_add(struct drm_connector *connector)
                debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root,
                                    connector, &i915_dsc_fec_support_fops);
 
+       /* Legacy panels doesn't lpsp on any platform */
+       if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) ||
+            IS_BROADWELL(dev_priv)) &&
+            (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
+            connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
+            connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
+            connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
+            connector->connector_type == DRM_MODE_CONNECTOR_HDMIB))
+               debugfs_create_file("i915_lpsp_capability", 0444, root,
+                                   connector, &i915_lpsp_capability_fops);
+
        return 0;
 }