Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm/dpu: add current resource allocation to dumped state

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

+78
+12
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 348 348 kfree(dpu_state); 349 349 } 350 350 351 + static void dpu_kms_global_print_state(struct drm_printer *p, 352 + const struct drm_private_state *state) 353 + { 354 + const struct dpu_global_state *global_state = to_dpu_global_state(state); 355 + 356 + dpu_rm_print_state(p, global_state); 357 + } 358 + 351 359 static const struct drm_private_state_funcs dpu_kms_global_state_funcs = { 352 360 .atomic_duplicate_state = dpu_kms_global_duplicate_state, 353 361 .atomic_destroy_state = dpu_kms_global_destroy_state, 362 + .atomic_print_state = dpu_kms_global_print_state, 354 363 }; 355 364 356 365 static int dpu_kms_global_obj_init(struct dpu_kms *dpu_kms) ··· 373 364 drm_atomic_private_obj_init(dpu_kms->dev, &dpu_kms->global_state, 374 365 &state->base, 375 366 &dpu_kms_global_state_funcs); 367 + 368 + state->rm = &dpu_kms->rm; 369 + 376 370 return 0; 377 371 } 378 372
+2
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
··· 130 130 struct dpu_global_state { 131 131 struct drm_private_state base; 132 132 133 + struct dpu_rm *rm; 134 + 133 135 uint32_t pingpong_to_enc_id[PINGPONG_MAX - PINGPONG_0]; 134 136 uint32_t mixer_to_enc_id[LM_MAX - LM_0]; 135 137 uint32_t ctl_to_enc_id[CTL_MAX - CTL_0];
+56
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
··· 758 758 759 759 return num_blks; 760 760 } 761 + 762 + static void dpu_rm_print_state_helper(struct drm_printer *p, 763 + struct dpu_hw_blk *blk, 764 + uint32_t mapping) 765 + { 766 + if (!blk) 767 + drm_puts(p, "- "); 768 + else if (!mapping) 769 + drm_puts(p, "# "); 770 + else 771 + drm_printf(p, "%d ", mapping); 772 + } 773 + 774 + 775 + void dpu_rm_print_state(struct drm_printer *p, 776 + const struct dpu_global_state *global_state) 777 + { 778 + const struct dpu_rm *rm = global_state->rm; 779 + int i; 780 + 781 + drm_puts(p, "resource mapping:\n"); 782 + drm_puts(p, "\tpingpong="); 783 + for (i = 0; i < ARRAY_SIZE(global_state->pingpong_to_enc_id); i++) 784 + dpu_rm_print_state_helper(p, rm->pingpong_blks[i], 785 + global_state->pingpong_to_enc_id[i]); 786 + drm_puts(p, "\n"); 787 + 788 + drm_puts(p, "\tmixer="); 789 + for (i = 0; i < ARRAY_SIZE(global_state->mixer_to_enc_id); i++) 790 + dpu_rm_print_state_helper(p, rm->mixer_blks[i], 791 + global_state->mixer_to_enc_id[i]); 792 + drm_puts(p, "\n"); 793 + 794 + drm_puts(p, "\tctl="); 795 + for (i = 0; i < ARRAY_SIZE(global_state->ctl_to_enc_id); i++) 796 + dpu_rm_print_state_helper(p, rm->ctl_blks[i], 797 + global_state->ctl_to_enc_id[i]); 798 + drm_puts(p, "\n"); 799 + 800 + drm_puts(p, "\tdspp="); 801 + for (i = 0; i < ARRAY_SIZE(global_state->dspp_to_enc_id); i++) 802 + dpu_rm_print_state_helper(p, rm->dspp_blks[i], 803 + global_state->dspp_to_enc_id[i]); 804 + drm_puts(p, "\n"); 805 + 806 + drm_puts(p, "\tdsc="); 807 + for (i = 0; i < ARRAY_SIZE(global_state->dsc_to_enc_id); i++) 808 + dpu_rm_print_state_helper(p, rm->dsc_blks[i], 809 + global_state->dsc_to_enc_id[i]); 810 + drm_puts(p, "\n"); 811 + 812 + drm_puts(p, "\tcdm="); 813 + dpu_rm_print_state_helper(p, rm->cdm_blk, 814 + global_state->cdm_to_enc_id); 815 + drm_puts(p, "\n"); 816 + }
+8
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h
··· 90 90 enum dpu_hw_blk_type type, struct dpu_hw_blk **blks, int blks_size); 91 91 92 92 /** 93 + * dpu_rm_print_state - output the RM private state 94 + * @p: DRM printer 95 + * @global_state: global state 96 + */ 97 + void dpu_rm_print_state(struct drm_printer *p, 98 + const struct dpu_global_state *global_state); 99 + 100 + /** 93 101 * dpu_rm_get_intf - Return a struct dpu_hw_intf instance given it's index. 94 102 * @rm: DPU Resource Manager handle 95 103 * @intf_idx: INTF's index