summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJon Mayo <jmayo@nvidia.com>2011-08-26 14:49:03 -0700
committerVarun Colbert <vcolbert@nvidia.com>2011-10-06 23:58:22 -0700
commit63e747c744add595d3966f2fa0488d11181d71e9 (patch)
treef98beb3e23a10ec9661ff50e8c69b5043e1c001d /drivers
parent2cdc78408b0427516b84899be98c1bd4de19d6fa (diff)
video: tegra: dc: improve underflow statistics
Collect individual underflow counts for underflow statistics to provide a more accurate number of underflows. Changed stats to use 64-bit numbers due to the larger numbers involved, about 100x from previously. Reviewed-on: http://git-master/r/52940 (cherry picked from commit 1d39d430ad90a027be43323f65eef85a3a30faab) Change-Id: I4d253346dfcb01185a93a7602b7a1c971ea1ebb4 Reviewed-on: http://git-master/r/56301 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/tegra/dc/dc.c26
-rw-r--r--drivers/video/tegra/dc/dc_priv.h8
-rw-r--r--drivers/video/tegra/dc/dc_reg.h4
3 files changed, 27 insertions, 11 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index 0568ba4a32a5..db4c1eeea64e 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -421,10 +421,10 @@ static int dbg_dc_stats_show(struct seq_file *s, void *unused)
mutex_lock(&dc->lock);
seq_printf(s,
- "underflows: %u\n"
- "underflows_a: %u\n"
- "underflows_b: %u\n"
- "underflows_c: %u\n",
+ "underflows: %llu\n"
+ "underflows_a: %llu\n"
+ "underflows_b: %llu\n"
+ "underflows_c: %llu\n",
dc->stats.underflows,
dc->stats.underflows_a,
dc->stats.underflows_b,
@@ -1982,6 +1982,15 @@ static void tegra_dc_continuous_irq(struct tegra_dc *dc, unsigned long status)
}
#endif
+/* return an arbitrarily large number if count overflow occurs.
+ * make it a nice base-10 number to show up in stats output */
+static u64 tegra_dc_underflow_count(struct tegra_dc *dc, unsigned reg)
+{
+ unsigned count = tegra_dc_readl(dc, reg);
+ tegra_dc_writel(dc, 0, reg);
+ return ((count & 0x80000000) == 0) ? count : 10000000000ll;
+}
+
static irqreturn_t tegra_dc_irq(int irq, void *ptr)
{
#ifndef CONFIG_TEGRA_FPGA_PLATFORM
@@ -2017,11 +2026,14 @@ static irqreturn_t tegra_dc_irq(int irq, void *ptr)
dc->underflow_mask |= underflow_mask;
dc->stats.underflows++;
if (status & WIN_A_UF_INT)
- dc->stats.underflows_a++;
+ dc->stats.underflows_a += tegra_dc_underflow_count(dc,
+ DC_WINBUF_AD_UFLOW_STATUS);
if (status & WIN_B_UF_INT)
- dc->stats.underflows_b++;
+ dc->stats.underflows_b += tegra_dc_underflow_count(dc,
+ DC_WINBUF_BD_UFLOW_STATUS);
if (status & WIN_C_UF_INT)
- dc->stats.underflows_c++;
+ dc->stats.underflows_c += tegra_dc_underflow_count(dc,
+ DC_WINBUF_CD_UFLOW_STATUS);
}
if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
diff --git a/drivers/video/tegra/dc/dc_priv.h b/drivers/video/tegra/dc/dc_priv.h
index 18eab1eb2beb..d24df9d9a561 100644
--- a/drivers/video/tegra/dc/dc_priv.h
+++ b/drivers/video/tegra/dc/dc_priv.h
@@ -126,10 +126,10 @@ struct tegra_dc {
struct work_struct vblank_work;
struct {
- unsigned underflows;
- unsigned underflows_a;
- unsigned underflows_b;
- unsigned underflows_c;
+ u64 underflows;
+ u64 underflows_a;
+ u64 underflows_b;
+ u64 underflows_c;
} stats;
struct tegra_dc_ext *ext;
diff --git a/drivers/video/tegra/dc/dc_reg.h b/drivers/video/tegra/dc/dc_reg.h
index d5fb4fd7c547..241bfc0b3af2 100644
--- a/drivers/video/tegra/dc/dc_reg.h
+++ b/drivers/video/tegra/dc/dc_reg.h
@@ -471,6 +471,10 @@
#define DC_WINBUF_ADDR_V_OFFSET_NS 0x809
#define DC_WINBUF_UFLOW_STATUS 0x80a
+/* direct versions of DC_WINBUF_UFLOW_STATUS */
+#define DC_WINBUF_AD_UFLOW_STATUS 0xbca
+#define DC_WINBUF_BD_UFLOW_STATUS 0xdca
+#define DC_WINBUF_CD_UFLOW_STATUS 0xfca
#define DC_DISP_SD_CONTROL 0x4c2
#define SD_ENABLE_NORMAL (1 << 0)