[PATCH 1/3] drm/xe: Introduce GuC PC debugfs
Belgaumkar, Vinay
vinay.belgaumkar at intel.com
Tue Oct 22 23:55:30 UTC 2024
On 10/9/2024 11:36 AM, Rodrigo Vivi wrote:
> Allows the visualization of the current GuC power conservation
> status and policies.
>
> Cc: Vinay Belgaumkar<vinay.belgaumkar at intel.com>
> Signed-off-by: Rodrigo Vivi<rodrigo.vivi at intel.com>
> ---
> 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",
DCC in *use*: ?
Otherwise LGTM,
Reviewed-by: Vinay Belgaumkar <vinay.belgaumkar at intel.com>
> + 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);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/intel-xe/attachments/20241022/f9de04e1/attachment.htm>
More information about the Intel-xe
mailing list