|
@@ -22,7 +22,7 @@
|
|
|
|
|
|
static void tmc_etr_enable_hw(struct tmc_drvdata *drvdata)
|
|
|
{
|
|
|
- u32 axictl;
|
|
|
+ u32 axictl, sts;
|
|
|
|
|
|
/* Zero out the memory to help with debug */
|
|
|
memset(drvdata->vaddr, 0, drvdata->size);
|
|
@@ -47,6 +47,17 @@ static void tmc_etr_enable_hw(struct tmc_drvdata *drvdata)
|
|
|
|
|
|
writel_relaxed(axictl, drvdata->base + TMC_AXICTL);
|
|
|
tmc_write_dba(drvdata, drvdata->paddr);
|
|
|
+ /*
|
|
|
+ * If the TMC pointers must be programmed before the session,
|
|
|
+ * we have to set it properly (i.e, RRP/RWP to base address and
|
|
|
+ * STS to "not full").
|
|
|
+ */
|
|
|
+ if (tmc_etr_has_cap(drvdata, TMC_ETR_SAVE_RESTORE)) {
|
|
|
+ tmc_write_rrp(drvdata, drvdata->paddr);
|
|
|
+ tmc_write_rwp(drvdata, drvdata->paddr);
|
|
|
+ sts = readl_relaxed(drvdata->base + TMC_STS) & ~TMC_STS_FULL;
|
|
|
+ writel_relaxed(sts, drvdata->base + TMC_STS);
|
|
|
+ }
|
|
|
|
|
|
writel_relaxed(TMC_FFCR_EN_FMT | TMC_FFCR_EN_TI |
|
|
|
TMC_FFCR_FON_FLIN | TMC_FFCR_FON_TRIG_EVT |
|