<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 10/9/2024 11:36 AM, Rodrigo Vivi
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:20241009183648.36948-1-rodrigo.vivi@intel.com">
      <pre wrap="" class="moz-quote-pre">Allows the visualization of the current GuC power conservation
status and policies.

Cc: Vinay Belgaumkar <a class="moz-txt-link-rfc2396E" href="mailto:vinay.belgaumkar@intel.com"><vinay.belgaumkar@intel.com></a>
Signed-off-by: Rodrigo Vivi <a class="moz-txt-link-rfc2396E" href="mailto:rodrigo.vivi@intel.com"><rodrigo.vivi@intel.com></a>
---
 drivers/gpu/drm/xe/xe_guc_debugfs.c | 15 +++++++
 drivers/gpu/drm/xe/xe_guc_pc.c      | 67 +++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_guc_pc.h      |  2 +
 3 files changed, 84 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_guc_debugfs.c b/drivers/gpu/drm/xe/xe_guc_debugfs.c
index d3822cbea273..8baa4913dbc0 100644
--- a/drivers/gpu/drm/xe/xe_guc_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_guc_debugfs.c
@@ -13,6 +13,7 @@
 #include "xe_guc.h"
 #include "xe_guc_ct.h"
 #include "xe_guc_log.h"
+#include "xe_guc_pc.h"
 #include "xe_macros.h"
 #include "xe_pm.h"
 
@@ -47,9 +48,23 @@ static int guc_log(struct seq_file *m, void *data)
        return 0;
 }
 
+static int guc_pc(struct seq_file *m, void *data)
+{
+       struct xe_guc *guc = node_to_guc(m->private);
+       struct xe_device *xe = guc_to_xe(guc);
+       struct drm_printer p = drm_seq_file_printer(m);
+
+       xe_pm_runtime_get(xe);
+       xe_guc_pc_print(&guc->pc, &p);
+       xe_pm_runtime_put(xe);
+
+       return 0;
+}
+
 static const struct drm_info_list debugfs_list[] = {
        {"guc_info", guc_info, 0},
        {"guc_log", guc_log, 0},
+       {"guc_pc", guc_pc, 0},
 };
 
 void xe_guc_debugfs_register(struct xe_guc *guc, struct dentry *parent)
diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c
index 2b654f820ae2..4b38523c49e9 100644
--- a/drivers/gpu/drm/xe/xe_guc_pc.c
+++ b/drivers/gpu/drm/xe/xe_guc_pc.c
@@ -8,6 +8,7 @@
 #include <linux/delay.h>
 
 #include <drm/drm_managed.h>
+#include <drm/drm_print.h>
 #include <generated/xe_wa_oob.h>
 
 #include "abi/guc_actions_slpc_abi.h"
@@ -1082,3 +1083,69 @@ int xe_guc_pc_init(struct xe_guc_pc *pc)
 
        return devm_add_action_or_reset(xe->drm.dev, xe_guc_pc_fini_hw, pc);
 }
+
+static const char *slpc_global_state_to_string(enum slpc_global_state state)
+{
+       switch (state) {
+       case SLPC_GLOBAL_STATE_NOT_RUNNING:
+               return "not running";
+       case SLPC_GLOBAL_STATE_INITIALIZING:
+               return "initializing";
+       case SLPC_GLOBAL_STATE_RESETTING:
+               return "resetting";
+       case SLPC_GLOBAL_STATE_RUNNING:
+               return "running";
+       case SLPC_GLOBAL_STATE_SHUTTING_DOWN:
+               return "shutting down";
+       case SLPC_GLOBAL_STATE_ERROR:
+               return "error";
+       default:
+               return "unknown";
+       }
+}
+
+static const char *pc_get_state_string(struct xe_guc_pc *pc)
+{
+       enum slpc_global_state state;
+
+       state = slpc_shared_data_read(pc, header.global_state);
+       return slpc_global_state_to_string(state);
+}
+
+/**
+ * xe_guc_pc_print - Print GuC's Power Conservation information for debug
+ * @pc: Xe_GuC_PC instance
+ * @p: drm_printer
+ */
+void xe_guc_pc_print(struct xe_guc_pc *pc, struct drm_printer *p)
+{
+       drm_printf(p, "SLPC Shared Data Header:\n");
+       drm_printf(p, "\tSize: %x\n", slpc_shared_data_read(pc, header.size));
+       drm_printf(p, "\tGlobal State: %s\n", pc_get_state_string(pc));
+
+       if (pc_action_query_task_state(pc))
+               return;
+
+       drm_printf(p, "\nSLPC Tasks Status:\n");
+       drm_printf(p, "\tGTPERF enabled: %s\n",
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_GTPERF_TASK_ENABLED));
+       drm_printf(p, "\tDCC enabled: %s\n",
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_DCC_TASK_ENABLED));
+       drm_printf(p, "\tDCC in: %s\n",</pre>
    </blockquote>
    <p>DCC in <b>use</b>: ? <br>
    </p>
    <p>Otherwise LGTM,</p>
    <p>Reviewed-by: Vinay Belgaumkar <a class="moz-txt-link-rfc2396E" href="mailto:vinay.belgaumkar@intel.com"><vinay.belgaumkar@intel.com></a><br>
    </p>
    <blockquote type="cite" cite="mid:20241009183648.36948-1-rodrigo.vivi@intel.com">
      <pre wrap="" class="moz-quote-pre">
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_IN_DCC));
+       drm_printf(p, "\tBalancer enabled: %s\n",
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_BALANCER_ENABLED));
+       drm_printf(p, "\tIBC enabled: %s\n",
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_IBC_TASK_ENABLED));
+       drm_printf(p, "\tBalancer IA LMT enabled: %s\n",
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_BALANCER_IA_LMT_ENABLED));
+       drm_printf(p, "\tBalancer IA LMT active: %s\n",
+                  str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
+                             SLPC_BALANCER_IA_LMT_ACTIVE));
+}
diff --git a/drivers/gpu/drm/xe/xe_guc_pc.h b/drivers/gpu/drm/xe/xe_guc_pc.h
index efda432fadfc..e333eddafcef 100644
--- a/drivers/gpu/drm/xe/xe_guc_pc.h
+++ b/drivers/gpu/drm/xe/xe_guc_pc.h
@@ -10,6 +10,7 @@
 
 struct xe_guc_pc;
 enum slpc_gucrc_mode;
+struct drm_printer;
 
 int xe_guc_pc_init(struct xe_guc_pc *pc);
 int xe_guc_pc_start(struct xe_guc_pc *pc);
@@ -17,6 +18,7 @@ int xe_guc_pc_stop(struct xe_guc_pc *pc);
 int xe_guc_pc_gucrc_disable(struct xe_guc_pc *pc);
 int xe_guc_pc_override_gucrc_mode(struct xe_guc_pc *pc, enum slpc_gucrc_mode mode);
 int xe_guc_pc_unset_gucrc_mode(struct xe_guc_pc *pc);
+void xe_guc_pc_print(struct xe_guc_pc *pc, struct drm_printer *p);
 
 u32 xe_guc_pc_get_act_freq(struct xe_guc_pc *pc);
 int xe_guc_pc_get_cur_freq(struct xe_guc_pc *pc, u32 *freq);
</pre>
    </blockquote>
  </body>
</html>