drm/msm/dpu: add current resource allocation to dumped state
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Thu, 22 Feb 2024 21:47:49 +0000 (23:47 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 8 Apr 2024 15:56:58 +0000 (18:56 +0300)
Provide atomic_print_state callback to the DPU's private object. This
way the debugfs/dri/0/state will also include RM's internal state.

Example output (RB5 board, HDMI and writeback encoder enabled)

resource mapping:
pingpong=31 36 # # # # - - - - -
mixer=31 36 # # # # -
ctl=# # 31 36 # #
dspp=# # # #
dsc=# # # # - -
cdm=#

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/579648/
Link: https://lore.kernel.org/r/20240222-fd-rm-state-v5-1-4a6c81e87f63@linaro.org
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h

index a1f5d7c4ab916f653474699d89ec6d64a773d856..9a1fe6868979a5982eabad069e0081cd99bbb8cd 100644 (file)
@@ -348,9 +348,18 @@ static void dpu_kms_global_destroy_state(struct drm_private_obj *obj,
        kfree(dpu_state);
 }
 
+static void dpu_kms_global_print_state(struct drm_printer *p,
+                                      const struct drm_private_state *state)
+{
+       const struct dpu_global_state *global_state = to_dpu_global_state(state);
+
+       dpu_rm_print_state(p, global_state);
+}
+
 static const struct drm_private_state_funcs dpu_kms_global_state_funcs = {
        .atomic_duplicate_state = dpu_kms_global_duplicate_state,
        .atomic_destroy_state = dpu_kms_global_destroy_state,
+       .atomic_print_state = dpu_kms_global_print_state,
 };
 
 static int dpu_kms_global_obj_init(struct dpu_kms *dpu_kms)
@@ -364,6 +373,9 @@ static int dpu_kms_global_obj_init(struct dpu_kms *dpu_kms)
        drm_atomic_private_obj_init(dpu_kms->dev, &dpu_kms->global_state,
                                    &state->base,
                                    &dpu_kms_global_state_funcs);
+
+       state->rm = &dpu_kms->rm;
+
        return 0;
 }
 
index b5db3fc76ca6a11453d0eb9eca5c38884dcaa5b4..e2adc937ea63b23cb3bbb9ca367e8b8290e6d6f1 100644 (file)
@@ -130,6 +130,8 @@ struct vsync_info {
 struct dpu_global_state {
        struct drm_private_state base;
 
+       struct dpu_rm *rm;
+
        uint32_t pingpong_to_enc_id[PINGPONG_MAX - PINGPONG_0];
        uint32_t mixer_to_enc_id[LM_MAX - LM_0];
        uint32_t ctl_to_enc_id[CTL_MAX - CTL_0];
index cb5ce3c62a22f2b79a3803ceaa58e72ac63bb105..44938ba7a2b7e618735447e0af51e91f9fa3242a 100644 (file)
@@ -758,3 +758,59 @@ int dpu_rm_get_assigned_resources(struct dpu_rm *rm,
 
        return num_blks;
 }
+
+static void dpu_rm_print_state_helper(struct drm_printer *p,
+                                           struct dpu_hw_blk *blk,
+                                           uint32_t mapping)
+{
+       if (!blk)
+               drm_puts(p, "- ");
+       else if (!mapping)
+               drm_puts(p, "# ");
+       else
+               drm_printf(p, "%d ", mapping);
+}
+
+
+void dpu_rm_print_state(struct drm_printer *p,
+                       const struct dpu_global_state *global_state)
+{
+       const struct dpu_rm *rm = global_state->rm;
+       int i;
+
+       drm_puts(p, "resource mapping:\n");
+       drm_puts(p, "\tpingpong=");
+       for (i = 0; i < ARRAY_SIZE(global_state->pingpong_to_enc_id); i++)
+               dpu_rm_print_state_helper(p, rm->pingpong_blks[i],
+                                         global_state->pingpong_to_enc_id[i]);
+       drm_puts(p, "\n");
+
+       drm_puts(p, "\tmixer=");
+       for (i = 0; i < ARRAY_SIZE(global_state->mixer_to_enc_id); i++)
+               dpu_rm_print_state_helper(p, rm->mixer_blks[i],
+                                         global_state->mixer_to_enc_id[i]);
+       drm_puts(p, "\n");
+
+       drm_puts(p, "\tctl=");
+       for (i = 0; i < ARRAY_SIZE(global_state->ctl_to_enc_id); i++)
+               dpu_rm_print_state_helper(p, rm->ctl_blks[i],
+                                         global_state->ctl_to_enc_id[i]);
+       drm_puts(p, "\n");
+
+       drm_puts(p, "\tdspp=");
+       for (i = 0; i < ARRAY_SIZE(global_state->dspp_to_enc_id); i++)
+               dpu_rm_print_state_helper(p, rm->dspp_blks[i],
+                                         global_state->dspp_to_enc_id[i]);
+       drm_puts(p, "\n");
+
+       drm_puts(p, "\tdsc=");
+       for (i = 0; i < ARRAY_SIZE(global_state->dsc_to_enc_id); i++)
+               dpu_rm_print_state_helper(p, rm->dsc_blks[i],
+                                         global_state->dsc_to_enc_id[i]);
+       drm_puts(p, "\n");
+
+       drm_puts(p, "\tcdm=");
+       dpu_rm_print_state_helper(p, rm->cdm_blk,
+                                 global_state->cdm_to_enc_id);
+       drm_puts(p, "\n");
+}
index e3f83ebc656b3e9020187e720d9de799f642a99b..e63db8ace6b940c48e081c9e11926788f6e333a3 100644 (file)
@@ -89,6 +89,14 @@ int dpu_rm_get_assigned_resources(struct dpu_rm *rm,
        struct dpu_global_state *global_state, uint32_t enc_id,
        enum dpu_hw_blk_type type, struct dpu_hw_blk **blks, int blks_size);
 
+/**
+ * dpu_rm_print_state - output the RM private state
+ * @p: DRM printer
+ * @global_state: global state
+ */
+void dpu_rm_print_state(struct drm_printer *p,
+                       const struct dpu_global_state *global_state);
+
 /**
  * dpu_rm_get_intf - Return a struct dpu_hw_intf instance given it's index.
  * @rm: DPU Resource Manager handle