diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_debug.c | 91 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_video.c | 3 |
4 files changed, 95 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_debug.c b/drivers/video/fbdev/msm/mdss_debug.c index 0b2a7c097562..0918db18b8d2 100644 --- a/drivers/video/fbdev/msm/mdss_debug.c +++ b/drivers/video/fbdev/msm/mdss_debug.c @@ -286,6 +286,96 @@ off_fail: return -ENODEV; } + +static int mdss_debug_stat_open(struct inode *inode, struct file *file) +{ + /* non-seekable */ + file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE); + file->private_data = inode->i_private; + return 0; +} + +static int mdss_debug_stat_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static int mdss_debug_stat_ctl_dump(struct mdss_mdp_ctl *ctl, + char *bp, int len) +{ + int tot = 0; + + if (!ctl->ref_cnt) + return 0; + + if (ctl->intf_num) { + tot = scnprintf(bp, len, + "intf%d: play: %08u \tvsync: %08u \tunderrun: %08u\n", + ctl->intf_num, ctl->play_cnt, + ctl->vsync_cnt, ctl->underrun_cnt); + } else { + tot = scnprintf(bp, len, "wb: \tmode=%x \tplay: %08u\n", + ctl->opmode, ctl->play_cnt); + } + + return tot; +} + +static ssize_t mdss_debug_stat_read(struct file *file, char __user *buff, + size_t count, loff_t *ppos) +{ + struct mdss_data_type *mdata = file->private_data; + struct mdss_mdp_pipe *pipe; + int i, len, tot; + char bp[512]; + + if (*ppos) + return 0; /* the end */ + + len = sizeof(bp); + + tot = scnprintf(bp, len, "\nmdp:\n"); + + for (i = 0; i < mdata->nctl; i++) + tot += mdss_debug_stat_ctl_dump(mdata->ctl_off + i, + bp + tot, len - tot); + tot += scnprintf(bp + tot, len - tot, "\n"); + + for (i = 0; i < mdata->nvig_pipes; i++) { + pipe = mdata->vig_pipes + i; + tot += scnprintf(bp + tot, len - tot, + "VIG%d : %08u\t", i, pipe->play_cnt); + } + tot += scnprintf(bp + tot, len - tot, "\n"); + + for (i = 0; i < mdata->nrgb_pipes; i++) { + pipe = mdata->rgb_pipes + i; + tot += scnprintf(bp + tot, len - tot, + "RGB%d : %08u\t", i, pipe->play_cnt); + } + tot += scnprintf(bp + tot, len - tot, "\n"); + + for (i = 0; i < mdata->ndma_pipes; i++) { + pipe = mdata->dma_pipes + i; + tot += scnprintf(bp + tot, len - tot, + "DMA%d : %08u\t", i, pipe->play_cnt); + } + tot += scnprintf(bp + tot, len - tot, "\n"); + + if (copy_to_user(buff, bp, tot)) + return -EFAULT; + + *ppos += tot; /* increase offset */ + + return tot; +} + +static const struct file_operations mdss_stat_fops = { + .open = mdss_debug_stat_open, + .release = mdss_debug_stat_release, + .read = mdss_debug_stat_read, +}; + static int mdss_debugfs_cleanup(struct mdss_debug_data *mdd) { struct mdss_debug_base *base, *tmp; @@ -330,6 +420,7 @@ int mdss_debugfs_init(struct mdss_data_type *mdata) mdss_debugfs_cleanup(mdd); return -ENODEV; } + debugfs_create_file("stat", 0644, mdd->root, mdata, &mdss_stat_fops); debugfs_create_u32("min_mdp_clk", 0644, mdd->root, (u32 *)&mdata->min_mdp_clk); diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 92fcfdf3a3d4..25c5871f6fc3 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -122,6 +122,7 @@ struct mdss_mdp_ctl { u32 flush_bits; u32 play_cnt; + u32 vsync_cnt; u32 underrun_cnt; u16 width; diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index d6b0fb277009..006a8dd9b81f 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -180,6 +180,7 @@ static void mdss_mdp_cmd_readptr_done(void *arg) pr_debug("%s: ctl=%d intf_num=%d\n", __func__, ctl->num, ctl->intf_num); vsync_time = ktime_get(); + ctl->vsync_cnt++; spin_lock(&ctx->vsync_lock); if (ctx->vsync_handler) diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c index 0426784be46d..6e631e94f613 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c @@ -282,8 +282,9 @@ static void mdss_mdp_video_vsync_intr_done(void *arg) } vsync_time = ktime_get(); + ctl->vsync_cnt++; - pr_debug("intr ctl=%d\n", ctl->num); + pr_debug("intr ctl=%d vsync cnt=%u\n", ctl->num, ctl->vsync_cnt); complete_all(&ctx->vsync_comp); spin_lock(&ctx->vsync_lock); |
