[PATCH 3/3] perf/imx_ddr: don't enable counter0 if none of 4 counters are used

Frank Li frank.li at nxp.com
Wed Jul 5 07:50:37 PDT 2023


> 
> diff --git a/drivers/perf/fsl_imx8_ddr_perf.c
> b/drivers/perf/fsl_imx8_ddr_perf.c
> index 4e6cbfc48429..f7c832611713 100644
> --- a/drivers/perf/fsl_imx8_ddr_perf.c
> +++ b/drivers/perf/fsl_imx8_ddr_perf.c
> @@ -591,7 +591,9 @@ static void ddr_perf_pmu_enable(struct pmu *pmu)
>  	struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
> 
>  	/* enable cycle counter if cycle is not active event list */
> -	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL)
> +	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL &&

EVENT_CYCLES_COUNTER is 0,  if only enable cycles counter,  below logic
Will failure.   Then counter will not work. 

> +	   (ddr_pmu->events[0] || ddr_pmu->events[1] ||
> +	    ddr_pmu->events[2] || ddr_pmu->events[3]))

 I suggest maintain a enabled_event counter, 

	If(ddr_pmu->active_num==0)
		ddr_perf_counter_enable(..., true);
	ddr_pmu->active_num++;

At disable function()
{
       ddr_pmu->active_num --;
       if( ddr_pmu->active_num == 0)
	ddr_perf_counter_enable(.., false);
}


>  		ddr_perf_counter_enable(ddr_pmu,
>  				      EVENT_CYCLES_ID,
>  				      EVENT_CYCLES_COUNTER,
> @@ -602,7 +604,9 @@ static void ddr_perf_pmu_disable(struct pmu *pmu)
>  {
>  	struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
> 
> -	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL)
> +	if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL &&
> +	   (ddr_pmu->events[0] || ddr_pmu->events[1] ||
> +	    ddr_pmu->events[2] || ddr_pmu->events[3]))
>  		ddr_perf_counter_enable(ddr_pmu,
>  				      EVENT_CYCLES_ID,
>  				      EVENT_CYCLES_COUNTER,
> --
> 2.34.1




More information about the linux-arm-kernel mailing list