]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ARM: etm: Return the entire trace buffer if it is empty after reset
authorArve Hjønnevåg <arve@android.com>
Sat, 5 Feb 2011 06:38:14 +0000 (22:38 -0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:27 +0000 (08:35 +0200)
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>
arch/arm/kernel/etm.c

index 2dac2bdafeef57c79bed827d763cc5f0f9c04e40..037c5e1e916cca247251878a4a060df0b04a7079 100644 (file)
@@ -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);