[PATCH v4 04/15] coresight: etm4x: Hook CPU PM callbacks
James Clark
james.clark at linaro.org
Mon Nov 10 02:50:46 PST 2025
On 04/11/2025 3:21 pm, Leo Yan wrote:
> Since the CoreSight core layer has registered CPU PM notifiers, this
> patch hooks CPU save and restore callbacks to be invoked from the core
> layer.
>
> The CPU PM notifier in the ETMv4 driver is no longer needed, remove it
> along with its registration and unregistration code.
>
> Signed-off-by: Leo Yan <leo.yan at arm.com>
Reviewed-by: James Clark <james.clark at linaro.org>
> ---
> drivers/hwtracing/coresight/coresight-etm4x-core.c | 59 ++++------------------
> 1 file changed, 11 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index 15bf825a346826cd534ef3cd4f41c885c66321da..adb5c6b12c6f3113747f1f455087b1ab497a53f6 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -1185,11 +1185,6 @@ static const struct coresight_ops_source etm4_source_ops = {
> .pause_perf = etm4_pause_perf,
> };
>
> -static const struct coresight_ops etm4_cs_ops = {
> - .trace_id = coresight_etm_get_trace_id,
> - .source_ops = &etm4_source_ops,
> -};
> -
> static bool cpu_supports_sysreg_trace(void)
> {
> u64 dfr0 = read_sysreg_s(SYS_ID_AA64DFR0_EL1);
> @@ -1894,8 +1889,9 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata)
> return ret;
> }
>
> -static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
> +static int etm4_cpu_save(struct coresight_device *csdev)
> {
> + struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
> int ret = 0;
>
> if (pm_save_enable != PARAM_PM_SAVE_SELF_HOSTED)
> @@ -1918,8 +1914,10 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)
> etm4_enable_hw(drvdata, false);
> }
>
> -static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
> +static void etm4_cpu_restore(struct coresight_device *csdev)
> {
> + struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
> +
> if (pm_save_enable != PARAM_PM_SAVE_SELF_HOSTED)
> return;
>
> @@ -1927,38 +1925,11 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
> __etm4_cpu_restore(drvdata);
> }
>
> -static int etm4_cpu_pm_notify(struct notifier_block *nb, unsigned long cmd,
> - void *v)
> -{
> - struct etmv4_drvdata *drvdata;
> - unsigned int cpu = smp_processor_id();
> -
> - if (!etmdrvdata[cpu])
> - return NOTIFY_OK;
> -
> - drvdata = etmdrvdata[cpu];
> -
> - if (WARN_ON_ONCE(drvdata->cpu != cpu))
> - return NOTIFY_BAD;
> -
> - switch (cmd) {
> - case CPU_PM_ENTER:
> - if (etm4_cpu_save(drvdata))
> - return NOTIFY_BAD;
> - break;
> - case CPU_PM_EXIT:
> - case CPU_PM_ENTER_FAILED:
> - etm4_cpu_restore(drvdata);
> - break;
> - default:
> - return NOTIFY_DONE;
> - }
> -
> - return NOTIFY_OK;
> -}
> -
> -static struct notifier_block etm4_cpu_pm_nb = {
> - .notifier_call = etm4_cpu_pm_notify,
> +static const struct coresight_ops etm4_cs_ops = {
> + .trace_id = coresight_etm_get_trace_id,
> + .pm_save_disable = etm4_cpu_save,
> + .pm_restore_enable = etm4_cpu_restore,
> + .source_ops = &etm4_source_ops,
> };
>
> /* Setup PM. Deals with error conditions and counts */
> @@ -1966,16 +1937,12 @@ static int __init etm4_pm_setup(void)
> {
> int ret;
>
> - ret = cpu_pm_register_notifier(&etm4_cpu_pm_nb);
> - if (ret)
> - return ret;
> -
> ret = cpuhp_setup_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING,
> "arm/coresight4:starting",
> etm4_starting_cpu, etm4_dying_cpu);
>
> if (ret)
> - goto unregister_notifier;
> + return ret;
>
> ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
> "arm/coresight4:online",
> @@ -1989,15 +1956,11 @@ static int __init etm4_pm_setup(void)
>
> /* failed dyn state - remove others */
> cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING);
> -
> -unregister_notifier:
> - cpu_pm_unregister_notifier(&etm4_cpu_pm_nb);
> return ret;
> }
>
> static void etm4_pm_clear(void)
> {
> - cpu_pm_unregister_notifier(&etm4_cpu_pm_nb);
> cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_STARTING);
> if (hp_online) {
> cpuhp_remove_state_nocalls(hp_online);
>
More information about the linux-arm-kernel
mailing list