I had intended to lazily allocate memory for the save_state structure when it is first used. Following is a patch that I will squash into "[PATCH v3 5/6] coresight: etm4x: save/restore state across CPU low power states" on my next respin. I thought I'd share it here to get some feedback along with the rest of v3.
Thanks,
Andrew Murray
--- drivers/hwtracing/coresight/coresight-etm4x.c | 14 +++++++++++--- drivers/hwtracing/coresight/coresight-etm4x.h | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c index b0bd8158bf13..cd02372194bc 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x.c +++ b/drivers/hwtracing/coresight/coresight-etm4x.c @@ -1112,6 +1112,13 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) struct etmv4_save_state *state; struct device *etm_dev = &drvdata->csdev->dev;
+ if (!drvdata->save_state) { + drvdata->save_state = devm_kmalloc(etm_dev, + sizeof(struct etmv4_save_state), GFP_KERNEL); + if (!drvdata->save_state) + return -ENOMEM; + } + /* * As recommended by 3.4.1 ("The procedure when powering down the PE") * of ARM IHI 0064D @@ -1134,7 +1141,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) goto out; }
- state = &drvdata->save_state; + state = drvdata->save_state;
state->trcprgctlr = readl(drvdata->base + TRCPRGCTLR); state->trcprocselr = readl(drvdata->base + TRCPROCSELR); @@ -1234,9 +1241,10 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) static void etm4_cpu_restore(struct etmv4_drvdata *drvdata) { int i; - struct etmv4_save_state *state; + struct etmv4_save_state *state = drvdata->save_state;
- state = &drvdata->save_state; + if (WARN_ON_ONCE(!state)) + return;
CS_UNLOCK(drvdata->base);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h index c31634c64f87..a70cafbbb8cf 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x.h +++ b/drivers/hwtracing/coresight/coresight-etm4x.h @@ -441,7 +441,7 @@ struct etmv4_drvdata { bool atbtrig; bool lpoverride; struct etmv4_config config; - struct etmv4_save_state save_state; + struct etmv4_save_state *save_state; bool state_needs_restore; };