2022-08-03 19:51:40

by Bhupesh Sharma

[permalink] [raw]
Subject: [PATCH] coresight: etm4x: Fix crash observed on Qcom ETM parts with 'Low power override'

Some Qualcomm ETM implementations require skipping powering up
the trace unit, as the ETMs are in the same power domain as
their CPU cores.

Via commit 5214b563588e ("coresight: etm4x: Add support for
sysreg only devices"), the setting of 'skip_power_up' flag was
moved after the 'etm4_init_arch_data' function is called, whereas
the flag value is itself used inside the function. This causes
a crash when ETM mode 'Low-power state behavior override' is set
on some Qualcomm parts.

Fix the same.

Fixes: 5214b563588e ("coresight: etm4x: Add support for sysreg only devices")
Cc: Mike Leach <[email protected]>
Cc: Suzuki K Poulose <[email protected]>
Cc: Mathieu Poirier <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Bhupesh Sharma <[email protected]>
---
drivers/hwtracing/coresight/coresight-etm4x-core.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
index d39660a3e50c..cf6254b87fd5 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
@@ -1943,6 +1943,16 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
init_arg.csa = &desc.access;
init_arg.pid = etm_pid;

+ /*
+ * Some Qualcomm implementations require skipping powering up the trace unit,
+ * as the ETMs are in the same power domain as their CPU cores.
+ *
+ * Since the 'skip_power_up' flag is used inside 'etm4_init_arch_data' function,
+ * initialize it before the function is called.
+ */
+ if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
+ drvdata->skip_power_up = true;
+
if (smp_call_function_single(drvdata->cpu,
etm4_init_arch_data, &init_arg, 1))
dev_err(dev, "ETM arch init failed\n");
@@ -1951,8 +1961,7 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
return -EINVAL;

/* TRCPDCR is not accessible with system instructions. */
- if (!desc.access.io_mem ||
- fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
+ if (!desc.access.io_mem)
drvdata->skip_power_up = true;

major = ETM_ARCH_MAJOR_VERSION(drvdata->arch);
--
2.35.3



2022-08-04 14:02:47

by Suzuki K Poulose

[permalink] [raw]
Subject: Re: [PATCH] coresight: etm4x: Fix crash observed on Qcom ETM parts with 'Low power override'

Hi Bhupesh,


On 03/08/2022 20:12, Bhupesh Sharma wrote:
> Some Qualcomm ETM implementations require skipping powering up
> the trace unit, as the ETMs are in the same power domain as
> their CPU cores.
>
> Via commit 5214b563588e ("coresight: etm4x: Add support for
> sysreg only devices"), the setting of 'skip_power_up' flag was
> moved after the 'etm4_init_arch_data' function is called, whereas
> the flag value is itself used inside the function. This causes
> a crash when ETM mode 'Low-power state behavior override' is set
> on some Qualcomm parts.
>
> Fix the same.
>

Thanks for the patch. The patch is correct. But please see my comment
below.

> Fixes: 5214b563588e ("coresight: etm4x: Add support for sysreg only devices")
> Cc: Mike Leach <[email protected]>
> Cc: Suzuki K Poulose <[email protected]>
> Cc: Mathieu Poirier <[email protected]>
> Cc: Greg Kroah-Hartman <[email protected]>
> Signed-off-by: Bhupesh Sharma <[email protected]>
> ---
> drivers/hwtracing/coresight/coresight-etm4x-core.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index d39660a3e50c..cf6254b87fd5 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -1943,6 +1943,16 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
> init_arg.csa = &desc.access;
> init_arg.pid = etm_pid;
>
> + /*
> + * Some Qualcomm implementations require skipping powering up the trace unit,
> + * as the ETMs are in the same power domain as their CPU cores.
> + *
> + * Since the 'skip_power_up' flag is used inside 'etm4_init_arch_data' function,
> + * initialize it before the function is called.
> + */
> + if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
> + drvdata->skip_power_up = true;
> +
> if (smp_call_function_single(drvdata->cpu,
> etm4_init_arch_data, &init_arg, 1))
> dev_err(dev, "ETM arch init failed\n");
> @@ -1951,8 +1961,7 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
> return -EINVAL;
>
> /* TRCPDCR is not accessible with system instructions. */
> - if (!desc.access.io_mem ||
> - fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
> + if (!desc.access.io_mem)
> drvdata->skip_power_up = true;
>

Please could you move this setting into "etm4_init_sysreg_access()" ? It
looks a bit odd to split the check in the same function. Moving this to
the sysreg_access() makes it explicit.

Suzuki



> major = ETM_ARCH_MAJOR_VERSION(drvdata->arch);


2022-08-04 15:57:57

by Bhupesh Sharma

[permalink] [raw]
Subject: Re: [PATCH] coresight: etm4x: Fix crash observed on Qcom ETM parts with 'Low power override'

Hi Suzuki,

On Thu, 4 Aug 2022 at 19:02, Suzuki K Poulose <[email protected]> wrote:
>
> Hi Bhupesh,
>
>
> On 03/08/2022 20:12, Bhupesh Sharma wrote:
> > Some Qualcomm ETM implementations require skipping powering up
> > the trace unit, as the ETMs are in the same power domain as
> > their CPU cores.
> >
> > Via commit 5214b563588e ("coresight: etm4x: Add support for
> > sysreg only devices"), the setting of 'skip_power_up' flag was
> > moved after the 'etm4_init_arch_data' function is called, whereas
> > the flag value is itself used inside the function. This causes
> > a crash when ETM mode 'Low-power state behavior override' is set
> > on some Qualcomm parts.
> >
> > Fix the same.
> >
>
> Thanks for the patch. The patch is correct. But please see my comment
> below.
>
> > Fixes: 5214b563588e ("coresight: etm4x: Add support for sysreg only devices")
> > Cc: Mike Leach <[email protected]>
> > Cc: Suzuki K Poulose <[email protected]>
> > Cc: Mathieu Poirier <[email protected]>
> > Cc: Greg Kroah-Hartman <[email protected]>
> > Signed-off-by: Bhupesh Sharma <[email protected]>
> > ---
> > drivers/hwtracing/coresight/coresight-etm4x-core.c | 13 +++++++++++--
> > 1 file changed, 11 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> > index d39660a3e50c..cf6254b87fd5 100644
> > --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> > +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> > @@ -1943,6 +1943,16 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
> > init_arg.csa = &desc.access;
> > init_arg.pid = etm_pid;
> >
> > + /*
> > + * Some Qualcomm implementations require skipping powering up the trace unit,
> > + * as the ETMs are in the same power domain as their CPU cores.
> > + *
> > + * Since the 'skip_power_up' flag is used inside 'etm4_init_arch_data' function,
> > + * initialize it before the function is called.
> > + */
> > + if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
> > + drvdata->skip_power_up = true;
> > +
> > if (smp_call_function_single(drvdata->cpu,
> > etm4_init_arch_data, &init_arg, 1))
> > dev_err(dev, "ETM arch init failed\n");
> > @@ -1951,8 +1961,7 @@ static int etm4_probe(struct device *dev, void __iomem *base, u32 etm_pid)
> > return -EINVAL;
> >
> > /* TRCPDCR is not accessible with system instructions. */
> > - if (!desc.access.io_mem ||
> > - fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
> > + if (!desc.access.io_mem)
> > drvdata->skip_power_up = true;
> >
>
> Please could you move this setting into "etm4_init_sysreg_access()" ? It
> looks a bit odd to split the check in the same function. Moving this to
> the sysreg_access() makes it explicit.

Sure, let me fix this in v2.

Regards,
Bhupesh

> > major = ETM_ARCH_MAJOR_VERSION(drvdata->arch);
>