[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