kfree(mdp5_state);
 }
 
+static void mdp5_global_print_state(struct drm_printer *p,
+                                   const struct drm_private_state *state)
+{
+       struct mdp5_global_state *mdp5_state = to_mdp5_global_state(state);
+
+       if (mdp5_state->mdp5_kms->smp)
+               mdp5_smp_dump(mdp5_state->mdp5_kms->smp, p, mdp5_state);
+}
+
 static const struct drm_private_state_funcs mdp5_global_state_funcs = {
        .atomic_duplicate_state = mdp5_global_duplicate_state,
        .atomic_destroy_state = mdp5_global_destroy_state,
+       .atomic_print_state = mdp5_global_print_state,
 };
 
 static int mdp5_global_obj_init(struct mdp5_kms *mdp5_kms)
        mdp5_destroy(mdp5_kms);
 }
 
-#ifdef CONFIG_DEBUG_FS
-static int smp_show(struct seq_file *m, void *arg)
-{
-       struct drm_info_node *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)
-{
-       drm_debugfs_create_files(mdp5_debugfs_list,
-                                ARRAY_SIZE(mdp5_debugfs_list),
-                                minor->debugfs_root, minor);
-
-       return 0;
-}
-#endif
-
 static const struct mdp_kms_funcs kms_funcs = {
        .base = {
                .hw_init         = mdp5_hw_init,
                .complete_commit = mdp5_complete_commit,
                .get_format      = mdp_get_format,
                .destroy         = mdp5_kms_destroy,
-#ifdef CONFIG_DEBUG_FS
-               .debugfs_init    = mdp5_kms_debugfs_init,
-#endif
        },
        .set_irqmask         = mdp5_set_irqmask,
 };
 
        state->released = 0;
 }
 
-void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p)
+void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p,
+                  struct mdp5_global_state *global_state)
 {
        struct mdp5_kms *mdp5_kms = get_kms(smp);
        struct mdp5_hw_pipe_state *hwpstate;
        struct mdp5_smp_state *state;
-       struct mdp5_global_state *global_state;
        int total = 0, i, j;
 
        drm_printf(p, "name\tinuse\tplane\n");
        drm_printf(p, "----\t-----\t-----\n");
 
-       if (drm_can_sleep())
-               drm_modeset_lock(&mdp5_kms->glob_state_lock, NULL);
-
-       global_state = mdp5_get_existing_global_state(mdp5_kms);
-
        /* grab these *after* we hold the state_lock */
        hwpstate = &global_state->hwpipe;
        state = &global_state->smp;
        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));
-
-       if (drm_can_sleep())
-               drm_modeset_unlock(&mdp5_kms->glob_state_lock);
 }
 
 
 
 struct mdp5_smp *mdp5_smp_init(struct mdp5_kms *mdp5_kms,
                const struct mdp5_smp_block *cfg);
 
-void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p);
+struct mdp5_global_state;
+void mdp5_smp_dump(struct mdp5_smp *smp, struct drm_printer *p,
+                  struct mdp5_global_state *global_state);
 
 uint32_t mdp5_smp_calculate(struct mdp5_smp *smp,
                const struct mdp_format *format,