On Tue, Jun 16, 2020 at 10:26:23AM +0530, Sai Prakash Ranjan wrote: > Implement a shutdown callback to ensure ETR hardware is > properly shutdown in reboot/shutdown path. This is required > for ETR which has SMMU address translation enabled like on > SC7180 SoC and few others. If the hardware is still accessing > memory after SMMU translation is disabled as part of SMMU > shutdown callback in system reboot or shutdown path, then > IOVAs(I/O virtual address) which it was using will go on the > bus as the physical addresses which might result in unknown > crashes (NoC/interconnect errors). So we make sure from this > shutdown callback that the ETR is shutdown before SMMU translation > is disabled and device_link in SMMU driver will take care of > ordering of shutdown callbacks such that SMMU shutdown callback > is not called before any of its consumer shutdown callbacks. > > Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@xxxxxxxxxxxxxx> > --- I have applied your patch. Thanks, Mathieu > > Changes since v2: > * Remove ETF/ETB disable as suggested by Mathieu and Mike since they are > not really affected. > * Remove coresight and misc device unregister since it is not required > for shutdown callback unlike remove callback and userspace is long gone > by this time. > > Changes since v1: > * Use mode flag and drop enable flag as Mike suggested. > * Use spinlock before tmc hw disable as Mike suggested. > > --- > .../hwtracing/coresight/coresight-tmc-etr.c | 2 +- > drivers/hwtracing/coresight/coresight-tmc.c | 23 +++++++++++++++++++ > drivers/hwtracing/coresight/coresight-tmc.h | 1 + > 3 files changed, 25 insertions(+), 1 deletion(-) > > diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c > index 625882bc8b08..b29c2db94d96 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c > +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c > @@ -1110,7 +1110,7 @@ static void __tmc_etr_disable_hw(struct tmc_drvdata *drvdata) > > } > > -static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata) > +void tmc_etr_disable_hw(struct tmc_drvdata *drvdata) > { > __tmc_etr_disable_hw(drvdata); > /* Disable CATU device if this ETR is connected to one */ > diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c > index 39fba1d16e6e..b13ce0daa572 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc.c > +++ b/drivers/hwtracing/coresight/coresight-tmc.c > @@ -538,6 +538,28 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) > return ret; > } > > +static void tmc_shutdown(struct amba_device *adev) > +{ > + unsigned long flags; > + struct tmc_drvdata *drvdata = amba_get_drvdata(adev); > + > + spin_lock_irqsave(&drvdata->spinlock, flags); > + > + if (drvdata->mode == CS_MODE_DISABLED) > + goto out; > + > + if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) > + tmc_etr_disable_hw(drvdata); > + > + /* > + * We do not care about coresight unregister here unlike remove > + * callback which is required for making coresight modular since > + * the system is going down after this. > + */ > +out: > + spin_unlock_irqrestore(&drvdata->spinlock, flags); > +} > + > static const struct amba_id tmc_ids[] = { > CS_AMBA_ID(0x000bb961), > /* Coresight SoC 600 TMC-ETR/ETS */ > @@ -556,6 +578,7 @@ static struct amba_driver tmc_driver = { > .suppress_bind_attrs = true, > }, > .probe = tmc_probe, > + .shutdown = tmc_shutdown, > .id_table = tmc_ids, > }; > builtin_amba_driver(tmc_driver); > diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h > index 71de978575f3..6e8d2dc33d17 100644 > --- a/drivers/hwtracing/coresight/coresight-tmc.h > +++ b/drivers/hwtracing/coresight/coresight-tmc.h > @@ -268,6 +268,7 @@ ssize_t tmc_etb_get_sysfs_trace(struct tmc_drvdata *drvdata, > /* ETR functions */ > int tmc_read_prepare_etr(struct tmc_drvdata *drvdata); > int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata); > +void tmc_etr_disable_hw(struct tmc_drvdata *drvdata); > extern const struct coresight_ops tmc_etr_cs_ops; > ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata, > loff_t pos, size_t len, char **bufpp); > > base-commit: 059e38815950dbec65beafe03757bce9436e89a4 > -- > QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member > of Code Aurora Forum, hosted by The Linux Foundation >