On Fri, 13 Sep 2024 13:42:10 +0100
Adrián Larumbe <adrian.laru...@collabora.com> wrote:

> In order to support UM in calculating rates of GPU utilisation, the current
> operating and maximum GPU clock frequencies must be recorded during device
> initialisation, and also during OPP state transitions.
> 
> Signed-off-by: Adrián Larumbe <adrian.laru...@collabora.com>

Reviewed-by: Boris Brezillon <boris.brezil...@collabora.com>

> ---
>  drivers/gpu/drm/panthor/panthor_devfreq.c | 18 +++++++++++++++++-
>  drivers/gpu/drm/panthor/panthor_device.h  |  6 ++++++
>  2 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/panthor/panthor_devfreq.c 
> b/drivers/gpu/drm/panthor/panthor_devfreq.c
> index c6d3c327cc24..9d0f891b9b53 100644
> --- a/drivers/gpu/drm/panthor/panthor_devfreq.c
> +++ b/drivers/gpu/drm/panthor/panthor_devfreq.c
> @@ -62,14 +62,20 @@ static void panthor_devfreq_update_utilization(struct 
> panthor_devfreq *pdevfreq)
>  static int panthor_devfreq_target(struct device *dev, unsigned long *freq,
>                                 u32 flags)
>  {
> +     struct panthor_device *ptdev = dev_get_drvdata(dev);
>       struct dev_pm_opp *opp;
> +     int err;
>  
>       opp = devfreq_recommended_opp(dev, freq, flags);
>       if (IS_ERR(opp))
>               return PTR_ERR(opp);
>       dev_pm_opp_put(opp);
>  
> -     return dev_pm_opp_set_rate(dev, *freq);
> +     err = dev_pm_opp_set_rate(dev, *freq);
> +     if (!err)
> +             ptdev->current_frequency = *freq;
> +
> +     return err;
>  }
>  
>  static void panthor_devfreq_reset(struct panthor_devfreq *pdevfreq)
> @@ -130,6 +136,7 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
>       struct panthor_devfreq *pdevfreq;
>       struct dev_pm_opp *opp;
>       unsigned long cur_freq;
> +     unsigned long freq = ULONG_MAX;
>       int ret;
>  
>       pdevfreq = drmm_kzalloc(&ptdev->base, sizeof(*ptdev->devfreq), 
> GFP_KERNEL);
> @@ -161,6 +168,7 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
>               return PTR_ERR(opp);
>  
>       panthor_devfreq_profile.initial_freq = cur_freq;
> +     ptdev->current_frequency = cur_freq;
>  
>       /* Regulator coupling only takes care of synchronizing/balancing voltage
>        * updates, but the coupled regulator needs to be enabled manually.
> @@ -204,6 +212,14 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
>  
>       dev_pm_opp_put(opp);
>  
> +     /* Find the fastest defined rate  */
> +     opp = dev_pm_opp_find_freq_floor(dev, &freq);
> +     if (IS_ERR(opp))
> +             return PTR_ERR(opp);
> +     ptdev->fast_rate = freq;
> +
> +     dev_pm_opp_put(opp);
> +
>       /*
>        * Setup default thresholds for the simple_ondemand governor.
>        * The values are chosen based on experiments.
> diff --git a/drivers/gpu/drm/panthor/panthor_device.h 
> b/drivers/gpu/drm/panthor/panthor_device.h
> index a48e30d0af30..2109905813e8 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.h
> +++ b/drivers/gpu/drm/panthor/panthor_device.h
> @@ -184,6 +184,12 @@ struct panthor_device {
>  
>       /** @profile_mask: User-set profiling flags for job accounting. */
>       u32 profile_mask;
> +
> +     /** @current_frequency: Device clock frequency at present. Set by DVFS*/
> +     unsigned long current_frequency;
> +
> +     /** @fast_rate: Maximum device clock frequency. Set by DVFS */
> +     unsigned long fast_rate;
>  };
>  
>  /**

Reply via email to