Skip to content

Commit 69f6c43

Browse files
rodrigovivilutzbichler
authored andcommitted
drm/xe: Introduce GuC PC debugfs
Allows the visualization of the current GuC power conservation status and policies. v2: Fix DCC msg (Vinay) v3: Simplify pc_get_state_string (Jonathan) Reviewed-by: Vinay Belgaumkar <[email protected]> Reviewed-by: Jonathan Cavitt <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 6d24ad1 commit 69f6c43

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

drivers/gpu/drm/xe/xe_guc_debugfs.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "xe_guc.h"
1414
#include "xe_guc_ct.h"
1515
#include "xe_guc_log.h"
16+
#include "xe_guc_pc.h"
1617
#include "xe_macros.h"
1718
#include "xe_pm.h"
1819

@@ -60,10 +61,24 @@ static int guc_ctb(struct seq_file *m, void *data)
6061
return 0;
6162
}
6263

64+
static int guc_pc(struct seq_file *m, void *data)
65+
{
66+
struct xe_guc *guc = node_to_guc(m->private);
67+
struct xe_device *xe = guc_to_xe(guc);
68+
struct drm_printer p = drm_seq_file_printer(m);
69+
70+
xe_pm_runtime_get(xe);
71+
xe_guc_pc_print(&guc->pc, &p);
72+
xe_pm_runtime_put(xe);
73+
74+
return 0;
75+
}
76+
6377
static const struct drm_info_list debugfs_list[] = {
6478
{"guc_info", guc_info, 0},
6579
{"guc_log", guc_log, 0},
6680
{"guc_ctb", guc_ctb, 0},
81+
{"guc_pc", guc_pc, 0},
6782
};
6883

6984
void xe_guc_debugfs_register(struct xe_guc *guc, struct dentry *parent)

drivers/gpu/drm/xe/xe_guc_pc.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <linux/ktime.h>
1010

1111
#include <drm/drm_managed.h>
12+
#include <drm/drm_print.h>
1213
#include <generated/xe_wa_oob.h>
1314

1415
#include "abi/guc_actions_slpc_abi.h"
@@ -1158,3 +1159,61 @@ int xe_guc_pc_init(struct xe_guc_pc *pc)
11581159

11591160
return devm_add_action_or_reset(xe->drm.dev, xe_guc_pc_fini_hw, pc);
11601161
}
1162+
1163+
static const char *pc_get_state_string(struct xe_guc_pc *pc)
1164+
{
1165+
switch (slpc_shared_data_read(pc, header.global_state)) {
1166+
case SLPC_GLOBAL_STATE_NOT_RUNNING:
1167+
return "not running";
1168+
case SLPC_GLOBAL_STATE_INITIALIZING:
1169+
return "initializing";
1170+
case SLPC_GLOBAL_STATE_RESETTING:
1171+
return "resetting";
1172+
case SLPC_GLOBAL_STATE_RUNNING:
1173+
return "running";
1174+
case SLPC_GLOBAL_STATE_SHUTTING_DOWN:
1175+
return "shutting down";
1176+
case SLPC_GLOBAL_STATE_ERROR:
1177+
return "error";
1178+
default:
1179+
return "unknown";
1180+
}
1181+
}
1182+
1183+
/**
1184+
* xe_guc_pc_print - Print GuC's Power Conservation information for debug
1185+
* @pc: Xe_GuC_PC instance
1186+
* @p: drm_printer
1187+
*/
1188+
void xe_guc_pc_print(struct xe_guc_pc *pc, struct drm_printer *p)
1189+
{
1190+
drm_printf(p, "SLPC Shared Data Header:\n");
1191+
drm_printf(p, "\tSize: %x\n", slpc_shared_data_read(pc, header.size));
1192+
drm_printf(p, "\tGlobal State: %s\n", pc_get_state_string(pc));
1193+
1194+
if (pc_action_query_task_state(pc))
1195+
return;
1196+
1197+
drm_printf(p, "\nSLPC Tasks Status:\n");
1198+
drm_printf(p, "\tGTPERF enabled: %s\n",
1199+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1200+
SLPC_GTPERF_TASK_ENABLED));
1201+
drm_printf(p, "\tDCC enabled: %s\n",
1202+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1203+
SLPC_DCC_TASK_ENABLED));
1204+
drm_printf(p, "\tDCC in use: %s\n",
1205+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1206+
SLPC_IN_DCC));
1207+
drm_printf(p, "\tBalancer enabled: %s\n",
1208+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1209+
SLPC_BALANCER_ENABLED));
1210+
drm_printf(p, "\tIBC enabled: %s\n",
1211+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1212+
SLPC_IBC_TASK_ENABLED));
1213+
drm_printf(p, "\tBalancer IA LMT enabled: %s\n",
1214+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1215+
SLPC_BALANCER_IA_LMT_ENABLED));
1216+
drm_printf(p, "\tBalancer IA LMT active: %s\n",
1217+
str_yes_no(slpc_shared_data_read(pc, task_state_data.status) &
1218+
SLPC_BALANCER_IA_LMT_ACTIVE));
1219+
}

drivers/gpu/drm/xe/xe_guc_pc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010

1111
struct xe_guc_pc;
1212
enum slpc_gucrc_mode;
13+
struct drm_printer;
1314

1415
int xe_guc_pc_init(struct xe_guc_pc *pc);
1516
int xe_guc_pc_start(struct xe_guc_pc *pc);
1617
int xe_guc_pc_stop(struct xe_guc_pc *pc);
1718
int xe_guc_pc_gucrc_disable(struct xe_guc_pc *pc);
1819
int xe_guc_pc_override_gucrc_mode(struct xe_guc_pc *pc, enum slpc_gucrc_mode mode);
1920
int xe_guc_pc_unset_gucrc_mode(struct xe_guc_pc *pc);
21+
void xe_guc_pc_print(struct xe_guc_pc *pc, struct drm_printer *p);
2022

2123
u32 xe_guc_pc_get_act_freq(struct xe_guc_pc *pc);
2224
int xe_guc_pc_get_cur_freq(struct xe_guc_pc *pc, u32 *freq);

0 commit comments

Comments
 (0)