summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorArve Hjønnevåg <arve@android.com>2011-02-04 22:38:14 -0800
committerFrank Li <Frank.Li@freescale.com>2012-09-26 13:23:41 +0800
commit019c28e12dc0f6cb196de13489cad65a90edd9b0 (patch)
tree37fc6ed02a18499a4a02548bd5b4af8561c54f87 /arch
parentc56e52b3453ea8d3b5e385b3cd914272cc2b6d88 (diff)
ARM: etm: Return the entire trace buffer if it is empty after reset
On some SOCs the read and write pointer are reset when the chip resets, but the trace buffer content is preserved. If the status bits indicates that the buffer is empty and we have never started tracing, assume the buffer is full instead. This can be useful if the system rebooted from a watchdog reset. Change-Id: Iaf21c2c329c6059004ee1d38e3dfff66d7d28029 Signed-off-by: Arve Hjønnevåg <arve@android.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/kernel/etm.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c
index 2dac2bdafeef..037c5e1e916c 100644
--- a/arch/arm/kernel/etm.c
+++ b/arch/arm/kernel/etm.c
@@ -44,6 +44,7 @@ struct tracectx {
unsigned long range_end;
unsigned long data_range_start;
unsigned long data_range_end;
+ bool dump_initial_etb;
struct device *dev;
struct clk *emu_clk;
struct mutex mutex;
@@ -105,6 +106,7 @@ static int trace_start(struct tracectx *t)
etb_unlock(t);
+ t->dump_initial_etb = false;
etb_writel(t, 0, ETBR_WRITEADDR);
etb_writel(t, 0, ETBR_FORMATTERCTRL);
etb_writel(t, 1, ETBR_CTRL);
@@ -311,6 +313,8 @@ static ssize_t etb_read(struct file *file, char __user *data,
etb_unlock(t);
total = etb_getdatalen(t);
+ if (total == 0 && t->dump_initial_etb)
+ total = t->etb_bufsz;
if (total == t->etb_bufsz)
first = etb_readl(t, ETBR_WRITEADDR);
@@ -385,6 +389,7 @@ static int __devinit etb_probe(struct amba_device *dev, const struct amba_id *id
goto out_release;
}
+ t->dump_initial_etb = true;
amba_set_drvdata(dev, t);
etb_unlock(t);