Loading drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +52 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,53 @@ static void mdp5_kms_destroy(struct msm_kms *kms) } } #ifdef CONFIG_DEBUG_FS static int smp_show(struct seq_file *m, void *arg) { struct drm_info_node *node = (struct drm_info_node *) m->private; struct drm_device *dev = node->minor->dev; struct msm_drm_private *priv = dev->dev_private; struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); struct drm_printer p = drm_seq_file_printer(m); if (!mdp5_kms->smp) { drm_printf(&p, "no SMP pool\n"); return 0; } mdp5_smp_dump(mdp5_kms->smp, &p); return 0; } static struct drm_info_list mdp5_debugfs_list[] = { {"smp", smp_show }, }; static int mdp5_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor) { struct drm_device *dev = minor->dev; int ret; ret = drm_debugfs_create_files(mdp5_debugfs_list, ARRAY_SIZE(mdp5_debugfs_list), minor->debugfs_root, minor); if (ret) { dev_err(dev->dev, "could not install mdp5_debugfs_list\n"); return ret; } return 0; } static void mdp5_kms_debugfs_cleanup(struct msm_kms *kms, struct drm_minor *minor) { drm_debugfs_remove_files(mdp5_debugfs_list, ARRAY_SIZE(mdp5_debugfs_list), minor); } #endif static const struct mdp_kms_funcs kms_funcs = { .base = { .hw_init = mdp5_hw_init, Loading @@ -190,6 +237,10 @@ static const struct mdp_kms_funcs kms_funcs = { .round_pixclk = mdp5_round_pixclk, .set_split_display = mdp5_set_split_display, .destroy = mdp5_kms_destroy, #ifdef CONFIG_DEBUG_FS .debugfs_init = mdp5_kms_debugfs_init, .debugfs_cleanup = mdp5_kms_debugfs_cleanup, #endif }, .set_irqmask = mdp5_set_irqmask, }; Loading Loading @@ -392,6 +443,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) dev_err(dev->dev, "failed to construct plane %d (%d)\n", i, ret); goto fail; } priv->planes[priv->num_planes++] = plane; if (!primary) continue; Loading drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c +40 −0 Original line number Diff line number Diff line Loading @@ -292,6 +292,46 @@ void mdp5_smp_complete_commit(struct mdp5_smp *smp, struct mdp5_smp_state *state state->released = 0; } void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p) { struct mdp5_kms *mdp5_kms = get_kms(smp); struct mdp5_hw_pipe_state *hwpstate; struct mdp5_smp_state *state; int total = 0, i, j; drm_printf(p, "name\tinuse\tplane\n"); drm_printf(p, "----\t-----\t-----\n"); drm_modeset_lock(&mdp5_kms->state_lock, NULL); /* grab these *after* we hold the state_lock */ hwpstate = &mdp5_kms->state->hwpipe; state = &mdp5_kms->state->smp; for (i = 0; i < mdp5_kms->num_hwpipes; i++) { struct mdp5_hw_pipe *hwpipe = mdp5_kms->hwpipes[i]; struct drm_plane *plane = hwpstate->hwpipe_to_plane[hwpipe->idx]; enum mdp5_pipe pipe = hwpipe->pipe; for (j = 0; j < pipe2nclients(pipe); j++) { u32 cid = pipe2client(pipe, j); void *cs = state->client_state[cid]; int inuse = bitmap_weight(cs, smp->blk_cnt); drm_printf(p, "%s:%d\t%d\t%s\n", pipe2name(pipe), j, inuse, plane ? plane->name : NULL); total += inuse; } } drm_printf(p, "TOTAL:\t%d\t(of %d)\n", total, smp->blk_cnt); drm_printf(p, "AVAIL:\t%d\n", smp->blk_cnt - bitmap_weight(state->state, smp->blk_cnt)); drm_modeset_unlock(&mdp5_kms->state_lock); } void mdp5_smp_destroy(struct mdp5_smp *smp) { kfree(smp); Loading drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.h +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #ifndef __MDP5_SMP_H__ #define __MDP5_SMP_H__ #include <drm/drm_print.h> #include "msm_drv.h" /* Loading Loading @@ -79,6 +81,8 @@ struct mdp5_smp *mdp5_smp_init(struct mdp5_kms *mdp5_kms, const struct mdp5_smp_block *cfg); void mdp5_smp_destroy(struct mdp5_smp *smp); void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p); uint32_t mdp5_smp_calculate(struct mdp5_smp *smp, const struct mdp_format *format, u32 width, bool hdecim); Loading drivers/gpu/drm/msm/msm_debugfs.c +14 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #ifdef CONFIG_DEBUG_FS #include "msm_drv.h" #include "msm_gpu.h" #include "msm_kms.h" #include "msm_debugfs.h" static int msm_gpu_show(struct drm_device *dev, struct seq_file *m) Loading Loading @@ -142,6 +143,7 @@ int msm_debugfs_late_init(struct drm_device *dev) int msm_debugfs_init(struct drm_minor *minor) { struct drm_device *dev = minor->dev; struct msm_drm_private *priv = dev->dev_private; int ret; ret = drm_debugfs_create_files(msm_debugfs_list, Loading @@ -153,15 +155,25 @@ int msm_debugfs_init(struct drm_minor *minor) return ret; } return 0; if (priv->kms->funcs->debugfs_init) ret = priv->kms->funcs->debugfs_init(priv->kms, minor); return ret; } void msm_debugfs_cleanup(struct drm_minor *minor) { struct drm_device *dev = minor->dev; struct msm_drm_private *priv = dev->dev_private; drm_debugfs_remove_files(msm_debugfs_list, ARRAY_SIZE(msm_debugfs_list), minor); if (!minor->dev->dev_private) if (!priv) return; if (priv->kms->funcs->debugfs_cleanup) priv->kms->funcs->debugfs_cleanup(priv->kms, minor); msm_rd_debugfs_cleanup(minor); msm_perf_debugfs_cleanup(minor); } Loading drivers/gpu/drm/msm/msm_drv.h +1 −1 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ struct msm_drm_private { struct msm_gem_address_space *aspace[NUM_DOMAINS]; unsigned int num_planes; struct drm_plane *planes[8]; struct drm_plane *planes[16]; unsigned int num_crtcs; struct drm_crtc *crtcs[8]; Loading Loading
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +52 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,53 @@ static void mdp5_kms_destroy(struct msm_kms *kms) } } #ifdef CONFIG_DEBUG_FS static int smp_show(struct seq_file *m, void *arg) { struct drm_info_node *node = (struct drm_info_node *) m->private; struct drm_device *dev = node->minor->dev; struct msm_drm_private *priv = dev->dev_private; struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); struct drm_printer p = drm_seq_file_printer(m); if (!mdp5_kms->smp) { drm_printf(&p, "no SMP pool\n"); return 0; } mdp5_smp_dump(mdp5_kms->smp, &p); return 0; } static struct drm_info_list mdp5_debugfs_list[] = { {"smp", smp_show }, }; static int mdp5_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor) { struct drm_device *dev = minor->dev; int ret; ret = drm_debugfs_create_files(mdp5_debugfs_list, ARRAY_SIZE(mdp5_debugfs_list), minor->debugfs_root, minor); if (ret) { dev_err(dev->dev, "could not install mdp5_debugfs_list\n"); return ret; } return 0; } static void mdp5_kms_debugfs_cleanup(struct msm_kms *kms, struct drm_minor *minor) { drm_debugfs_remove_files(mdp5_debugfs_list, ARRAY_SIZE(mdp5_debugfs_list), minor); } #endif static const struct mdp_kms_funcs kms_funcs = { .base = { .hw_init = mdp5_hw_init, Loading @@ -190,6 +237,10 @@ static const struct mdp_kms_funcs kms_funcs = { .round_pixclk = mdp5_round_pixclk, .set_split_display = mdp5_set_split_display, .destroy = mdp5_kms_destroy, #ifdef CONFIG_DEBUG_FS .debugfs_init = mdp5_kms_debugfs_init, .debugfs_cleanup = mdp5_kms_debugfs_cleanup, #endif }, .set_irqmask = mdp5_set_irqmask, }; Loading Loading @@ -392,6 +443,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) dev_err(dev->dev, "failed to construct plane %d (%d)\n", i, ret); goto fail; } priv->planes[priv->num_planes++] = plane; if (!primary) continue; Loading
drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.c +40 −0 Original line number Diff line number Diff line Loading @@ -292,6 +292,46 @@ void mdp5_smp_complete_commit(struct mdp5_smp *smp, struct mdp5_smp_state *state state->released = 0; } void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p) { struct mdp5_kms *mdp5_kms = get_kms(smp); struct mdp5_hw_pipe_state *hwpstate; struct mdp5_smp_state *state; int total = 0, i, j; drm_printf(p, "name\tinuse\tplane\n"); drm_printf(p, "----\t-----\t-----\n"); drm_modeset_lock(&mdp5_kms->state_lock, NULL); /* grab these *after* we hold the state_lock */ hwpstate = &mdp5_kms->state->hwpipe; state = &mdp5_kms->state->smp; for (i = 0; i < mdp5_kms->num_hwpipes; i++) { struct mdp5_hw_pipe *hwpipe = mdp5_kms->hwpipes[i]; struct drm_plane *plane = hwpstate->hwpipe_to_plane[hwpipe->idx]; enum mdp5_pipe pipe = hwpipe->pipe; for (j = 0; j < pipe2nclients(pipe); j++) { u32 cid = pipe2client(pipe, j); void *cs = state->client_state[cid]; int inuse = bitmap_weight(cs, smp->blk_cnt); drm_printf(p, "%s:%d\t%d\t%s\n", pipe2name(pipe), j, inuse, plane ? plane->name : NULL); total += inuse; } } drm_printf(p, "TOTAL:\t%d\t(of %d)\n", total, smp->blk_cnt); drm_printf(p, "AVAIL:\t%d\n", smp->blk_cnt - bitmap_weight(state->state, smp->blk_cnt)); drm_modeset_unlock(&mdp5_kms->state_lock); } void mdp5_smp_destroy(struct mdp5_smp *smp) { kfree(smp); Loading
drivers/gpu/drm/msm/mdp/mdp5/mdp5_smp.h +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #ifndef __MDP5_SMP_H__ #define __MDP5_SMP_H__ #include <drm/drm_print.h> #include "msm_drv.h" /* Loading Loading @@ -79,6 +81,8 @@ struct mdp5_smp *mdp5_smp_init(struct mdp5_kms *mdp5_kms, const struct mdp5_smp_block *cfg); void mdp5_smp_destroy(struct mdp5_smp *smp); void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p); uint32_t mdp5_smp_calculate(struct mdp5_smp *smp, const struct mdp_format *format, u32 width, bool hdecim); Loading
drivers/gpu/drm/msm/msm_debugfs.c +14 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #ifdef CONFIG_DEBUG_FS #include "msm_drv.h" #include "msm_gpu.h" #include "msm_kms.h" #include "msm_debugfs.h" static int msm_gpu_show(struct drm_device *dev, struct seq_file *m) Loading Loading @@ -142,6 +143,7 @@ int msm_debugfs_late_init(struct drm_device *dev) int msm_debugfs_init(struct drm_minor *minor) { struct drm_device *dev = minor->dev; struct msm_drm_private *priv = dev->dev_private; int ret; ret = drm_debugfs_create_files(msm_debugfs_list, Loading @@ -153,15 +155,25 @@ int msm_debugfs_init(struct drm_minor *minor) return ret; } return 0; if (priv->kms->funcs->debugfs_init) ret = priv->kms->funcs->debugfs_init(priv->kms, minor); return ret; } void msm_debugfs_cleanup(struct drm_minor *minor) { struct drm_device *dev = minor->dev; struct msm_drm_private *priv = dev->dev_private; drm_debugfs_remove_files(msm_debugfs_list, ARRAY_SIZE(msm_debugfs_list), minor); if (!minor->dev->dev_private) if (!priv) return; if (priv->kms->funcs->debugfs_cleanup) priv->kms->funcs->debugfs_cleanup(priv->kms, minor); msm_rd_debugfs_cleanup(minor); msm_perf_debugfs_cleanup(minor); } Loading
drivers/gpu/drm/msm/msm_drv.h +1 −1 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ struct msm_drm_private { struct msm_gem_address_space *aspace[NUM_DOMAINS]; unsigned int num_planes; struct drm_plane *planes[8]; struct drm_plane *planes[16]; unsigned int num_crtcs; struct drm_crtc *crtcs[8]; Loading