coresight-tmc: save TMC registers during abort

TMC abort needs to save TMC registers so that TMC data can be extracted
from device crash dumps.

Change-Id: I4339e84dc62e589e0f4d341e8143b1cd94a9cbe2
Signed-off-by: Shashank Mittal <mittals@codeaurora.org>
This commit is contained in:
Shashank Mittal 2016-09-15 15:00:01 -07:00
parent d2afad6a90
commit 4a76273947

View file

@ -95,6 +95,7 @@
#define TMC_ETR_BAM_PIPE_INDEX 0
#define TMC_ETR_BAM_NR_PIPES 2
#define TMC_ETFETB_DUMP_MAGIC_V2 (0x42445953)
#define TMC_REG_DUMP_MAGIC_V2 (0x42445953)
#define TMC_REG_DUMP_VER (1)
@ -178,6 +179,7 @@ struct tmc_drvdata {
spinlock_t spinlock;
int read_count;
bool reading;
bool aborting;
char *buf;
dma_addr_t paddr;
void __iomem *vaddr;
@ -883,11 +885,15 @@ static void tmc_etb_dump_hw(struct tmc_drvdata *drvdata)
for (i = 0; i < memwords; i++) {
read_data = readl_relaxed(drvdata->base + TMC_RRD);
if (read_data == 0xFFFFFFFF)
return;
goto out;
memcpy(bufp, &read_data, 4);
bufp += 4;
}
}
out:
if (drvdata->aborting)
drvdata->buf_data.magic = TMC_ETFETB_DUMP_MAGIC_V2;
}
static void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
@ -1070,6 +1076,8 @@ static void tmc_abort(struct coresight_device *csdev)
unsigned long flags;
enum tmc_mode mode;
drvdata->aborting = true;
spin_lock_irqsave(&drvdata->spinlock, flags);
if (drvdata->reading)
goto out0;
@ -1728,7 +1736,7 @@ static void __tmc_reg_dump(struct tmc_drvdata *drvdata)
if (!drvdata->reg_buf)
return;
else if (!drvdata->dump_reg)
else if (!drvdata->aborting && !drvdata->dump_reg)
return;
drvdata->reg_data.version = TMC_REG_DUMP_VER;