On 15 October 2012 14:20, Amit Kucheria <amit.kuche...@linaro.org> wrote:
> On Mon, Oct 15, 2012 at 1:51 PM, Rajagopal Venkat
> <rajagopal.ven...@linaro.org> wrote:
>> This patch adds devfreq support for Mali driver. Though mali driver
>> has its own mechanism for load monitoring, this patch makes use of
>> devfreq framework to achieve same functionality. The goal is to
>> export gpu dvfs information to user space.
>>
>> Depends on devfreq patchset - https://lkml.org/lkml/2012/10/4/95
>>
>> Patch is based on git://git.linaro.org/people/chunsangjeong/mali-dev.git
>> tree.
>
> Adding Jesse and Andrey to cc.
>
> Let's make sure that we coordinate this patch integration into the
> mali driver with the integration of your devfreq patches to LLCT. In
> fact, I suggest that Andrey pull in your devfreq patchset into LLCT
> now since it won't break anything.

The devfreq patches have dependency on workqueue related patches
available in 3.7-rc1. I suggest we wait till linux-linaro tree is rebased
to 3.7-rc1. Then pulling the devfreq and mali changes is straight forward.

>
> /Amit
>
>> Signed-off-by: Rajagopal Venkat <rajagopal.ven...@linaro.org>
>> ---
>>  drivers/gpu/arm/mali/Kconfig                       |   7 +
>>  drivers/gpu/arm/mali/Makefile                      |  11 ++
>>  drivers/gpu/arm/mali/linux/mali_kernel_devfreq.c   | 188 
>> +++++++++++++++++++++
>>  drivers/gpu/arm/mali/linux/mali_kernel_devfreq.h   |  51 ++++++
>>  drivers/gpu/arm/mali/linux/mali_kernel_pm.c        |  10 ++
>>  .../gpu/arm/mali/platform/default/mali_platform.c  |   5 +-
>>  drivers/gpu/arm/mali/platform/mali_platform.h      |   8 +
>>  7 files changed, 279 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/gpu/arm/mali/linux/mali_kernel_devfreq.c
>>  create mode 100644 drivers/gpu/arm/mali/linux/mali_kernel_devfreq.h
>>
>> diff --git a/drivers/gpu/arm/mali/Kconfig b/drivers/gpu/arm/mali/Kconfig
>> index 416c231..41634f9 100644
>> --- a/drivers/gpu/arm/mali/Kconfig
>> +++ b/drivers/gpu/arm/mali/Kconfig
>> @@ -39,6 +39,13 @@ config USING_GPU_UTILIZATION
>>          ---help---
>>                  This enables GPU utilization information.
>>
>> +config USING_GPU_DEVFREQ
>> +       bool "GPU devfreq"
>> +        depends on MALI400MP && USING_GPU_UTILIZATION
>> +        default n
>> +        ---help---
>> +                This enables GPU devfreq.
>> +
>>  config USING_MALI_RUN_TIME_PM
>>          bool "Using Run time Power Management"
>>          depends on MALI400MP
>> diff --git a/drivers/gpu/arm/mali/Makefile b/drivers/gpu/arm/mali/Makefile
>> index 525a23e..6c854b1 100755
>> --- a/drivers/gpu/arm/mali/Makefile
>> +++ b/drivers/gpu/arm/mali/Makefile
>> @@ -45,6 +45,10 @@ ifeq ($(CONFIG_USING_GPU_UTILIZATION),y)
>>  USING_GPU_UTILIZATION =1
>>  endif
>>
>> +ifeq ($(CONFIG_USING_GPU_DEVFREQ),y)
>> +USING_GPU_DEVFREQ =1
>> +endif
>> +
>>  ifeq ($(CONFIG_USING_MALI_RUN_TIME_PM),y)
>>  USING_MALI_RUN_TIME_PM =1
>>  endif
>> @@ -64,6 +68,7 @@ USING_UMP ?= 0
>>  USING_OS_MEMORY ?= 0
>>  USING_PMM ?= 0
>>  USING_GPU_UTILIZATION ?= 0
>> +USING_GPU_DEVFREQ ?= 0
>>  USING_MALI_RUN_TIME_PM ?= 0
>>  USING_MALI_PMM_TESTSUITE ?= 0
>>  OS_MEMORY_KERNEL_BUFFER_SIZE_IN_MB ?= 6
>> @@ -105,6 +110,7 @@ endif
>>
>>  DEFINES += -DUSING_MALI_PMM=$(USING_PMM)
>>  DEFINES += -DMALI_GPU_UTILIZATION=$(USING_GPU_UTILIZATION)
>> +DEFINES += -DMALI_GPU_DEVFREQ=$(USING_GPU_DEVFREQ)
>>
>>  ifeq ($(CONFIG_DEBUG_BUILD),y)
>>  DEFINES += -DDEBUG
>> @@ -201,9 +207,14 @@ mali-y += \
>>  endif
>>
>>  ifeq ($(USING_GPU_UTILIZATION),1)
>> +ifeq ($(USING_GPU_DEVFREQ),1)
>> +mali-y += \
>> +       linux/mali_kernel_devfreq.o
>> +else
>>  mali-y += \
>>         common/mali_kernel_utilization.o
>>  endif
>> +endif
>>
>>  ifneq ($(call submodule_enabled, $M, MALI400PP),0)
>>         # Mali-400 PP in use
>> diff --git a/drivers/gpu/arm/mali/linux/mali_kernel_devfreq.c 
>> b/drivers/gpu/arm/mali/linux/mali_kernel_devfreq.c
>> new file mode 100644
>> index 0000000..1213e7b
>> --- /dev/null
>> +++ b/drivers/gpu/arm/mali/linux/mali_kernel_devfreq.c
>> @@ -0,0 +1,188 @@
>> +/*
>> + * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
>> + *
>> + * This program is free software and is provided to you under the terms of 
>> the GNU General Public License version 2
>> + * as published by the Free Software Foundation, and any use by you of this 
>> program is subject to the terms of such GNU licence.
>> + *
>> + * A copy of the licence is included with the program, and can also be 
>> obtained from Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  
>> 02110-1301, USA.
>> + */
>> +
>> +#include <linux/devfreq.h>
>> +#include <linux/platform_device.h>
>> +#include "mali_kernel_devfreq.h"
>> +#include "mali_osk.h"
>> +#include "mali_platform.h"
>> +#include "mali_linux_pm.h"
>> +
>> +#define MALI_GPU_UTILIZATION_PERIOD    500
>> +
>> +static _mali_osk_lock_t *time_data_lock;
>> +
>> +static _mali_osk_atomic_t num_running_cores;
>> +
>> +static u64 period_start_time = 0;
>> +static u64 work_start_time = 0;
>> +static u64 accumulated_work_time = 0;
>> +static mali_bool timer_running = MALI_FALSE;
>> +
>> +static struct devfreq *mali_devfreq;
>> +
>> +static int mali_get_dev_status(struct device *dev,
>> +                               struct devfreq_dev_status *stat)
>> +{
>> +       u64 time_now;
>> +       u64 time_period;
>> +
>> +       _mali_osk_lock_wait(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +
>> +       if (accumulated_work_time == 0 && work_start_time == 0)
>> +       {
>> +               /* No work done for this period, report zero usage */
>> +               stat->total_time = 0;
>> +               stat->busy_time = 0;
>> +               stat->current_frequency = get_mali_platform_cur_freq();
>> +
>> +               _mali_osk_lock_signal(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +
>> +               return 0;
>> +       }
>> +
>> +       time_now = _mali_osk_time_get_ns();
>> +       time_period = time_now - period_start_time;
>> +
>> +       /* If we are currently busy, update working period up to now */
>> +       if (work_start_time != 0)
>> +       {
>> +               accumulated_work_time += (time_now - work_start_time);
>> +               work_start_time = time_now;
>> +       }
>> +
>> +       stat->total_time = time_period;
>> +       stat->busy_time = accumulated_work_time;
>> +       stat->current_frequency = get_mali_platform_cur_freq();
>> +
>> +       accumulated_work_time = 0;
>> +       /* start a new period */
>> +       period_start_time = time_now;
>> +       _mali_osk_lock_signal(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +
>> +       return 0;
>> +}
>> +
>> +static int mali_set_target_freq(struct device *dev,
>> +                               unsigned long *freq,
>> +                               u32 flags)
>> +{
>> +       mali_gpu_utilization_handler(*freq);
>> +       return 0;
>> +}
>> +
>> +static int mali_get_cur_freq(struct device *dev, unsigned long *freq)
>> +{
>> +       *freq = get_mali_platform_cur_freq();
>> +       return 0;
>> +}
>> +
>> +static struct devfreq_dev_profile mali_devfreq_profile = {
>> +       .polling_ms = MALI_GPU_UTILIZATION_PERIOD,
>> +       .initial_freq = 0,
>> +       .target = mali_set_target_freq,
>> +       .get_dev_status = mali_get_dev_status,
>> +       .get_cur_freq = mali_get_cur_freq,
>> +};
>> +
>> +_mali_osk_errcode_t mali_utilization_init(void)
>> +{
>> +       /* Register mali devfreq with ondemand governor */
>> +       mali_devfreq = devfreq_add_device(&mali_gpu_device.dev,
>> +                                       &mali_devfreq_profile,
>> +                                       &devfreq_simple_ondemand,
>> +                                       NULL);
>> +       if (NULL == mali_devfreq)
>> +       {
>> +               return _MALI_OSK_ERR_FAULT;
>> +       }
>> +
>> +       time_data_lock = _mali_osk_lock_init( 0, 0, 0 );
>> +       if (NULL == time_data_lock)
>> +       {
>> +               return _MALI_OSK_ERR_FAULT;
>> +       }
>> +
>> +       _mali_osk_atomic_init(&num_running_cores, 0);
>> +
>> +       return _MALI_OSK_ERR_OK;
>> +}
>> +
>> +void mali_utilization_suspend(void)
>> +{
>> +       if (timer_running == MALI_TRUE)
>> +       {
>> +               devfreq_suspend_device(mali_devfreq);
>> +               _mali_osk_lock_wait(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +               timer_running = MALI_FALSE;
>> +               work_start_time = 0;
>> +               period_start_time = 0;
>> +               accumulated_work_time = 0;
>> +               _mali_osk_lock_signal(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +       }
>> +}
>> +
>> +void mali_utilization_resume(void)
>> +{
>> +       devfreq_resume_device(mali_devfreq);
>> +}
>> +
>> +void mali_utilization_term(void)
>> +{
>> +       devfreq_remove_device(mali_devfreq);
>> +       mali_devfreq = NULL;
>> +
>> +       timer_running = MALI_FALSE;
>> +
>> +       _mali_osk_atomic_term(&num_running_cores);
>> +
>> +       _mali_osk_lock_term(time_data_lock);
>> +}
>> +
>> +void mali_utilization_core_start(void)
>> +{
>> +       if (_mali_osk_atomic_inc_return(&num_running_cores) == 1)
>> +       {
>> +               /*
>> +                * We went from zero cores working, to one core working,
>> +                * we now consider the entire GPU for being busy
>> +                */
>> +               _mali_osk_lock_wait(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +
>> +               work_start_time = _mali_osk_time_get_ns();
>> +
>> +               if (timer_running != MALI_TRUE)
>> +               {
>> +                       timer_running = MALI_TRUE;
>> +                       period_start_time = work_start_time;
>> +               }
>> +
>> +               _mali_osk_lock_signal(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +       }
>> +}
>> +
>> +void mali_utilization_core_end(void)
>> +{
>> +       if (_mali_osk_atomic_dec_return(&num_running_cores) == 0)
>> +       {
>> +               /*
>> +                * No more cores are working, so accumulate the time we was 
>> busy.
>> +                */
>> +               u64 time_now;
>> +
>> +               _mali_osk_lock_wait(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +
>> +               time_now = _mali_osk_time_get_ns();
>> +               accumulated_work_time += (time_now - work_start_time);
>> +               work_start_time = 0;
>> +
>> +               _mali_osk_lock_signal(time_data_lock, _MALI_OSK_LOCKMODE_RW);
>> +       }
>> +}
>> diff --git a/drivers/gpu/arm/mali/linux/mali_kernel_devfreq.h 
>> b/drivers/gpu/arm/mali/linux/mali_kernel_devfreq.h
>> new file mode 100644
>> index 0000000..e0a76dc
>> --- /dev/null
>> +++ b/drivers/gpu/arm/mali/linux/mali_kernel_devfreq.h
>> @@ -0,0 +1,51 @@
>> +/*
>> + * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
>> + *
>> + * This program is free software and is provided to you under the terms of 
>> the GNU General Public License version 2
>> + * as published by the Free Software Foundation, and any use by you of this 
>> program is subject to the terms of such GNU licence.
>> + *
>> + * A copy of the licence is included with the program, and can also be 
>> obtained from Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  
>> 02110-1301, USA.
>> + */
>> +
>> +#ifndef __MALI_KERNEL_DEVFREQ_H__
>> +#define __MALI_KERNEL_DEVFREQ_H__
>> +
>> +#include "mali_osk.h"
>> +
>> +/**
>> + * Initialize/start the Mali GPU utilization metrics reporting.
>> + *
>> + * @return _MALI_OSK_ERR_OK on success, otherwise failure.
>> + */
>> +_mali_osk_errcode_t mali_utilization_init(void);
>> +
>> +/**
>> + * Terminate the Mali GPU utilization metrics reporting
>> + */
>> +void mali_utilization_term(void);
>> +
>> +/**
>> + * Should be called when a job is about to execute a job
>> + */
>> +void mali_utilization_core_start(void);
>> +
>> +/**
>> + * Should be called to suspend the utilization monitoring during
>> + * system suspend or device pm-runtime suspend
>> + */
>> +void mali_utilization_suspend(void);
>> +
>> +/**
>> + * Should be called to resume the utilization monitoring during
>> + * system resume or device pm-runtime resume
>> + */
>> +void mali_utilization_resume(void);
>> +
>> +/**
>> + * Should be called when a job has completed executing a job
>> + */
>> +void mali_utilization_core_end(void);
>> +
>> +
>> +#endif /* __MALI_KERNEL_DEVFREQ_H__ */
>> diff --git a/drivers/gpu/arm/mali/linux/mali_kernel_pm.c 
>> b/drivers/gpu/arm/mali/linux/mali_kernel_pm.c
>> index 0c03678..958164e 100644
>> --- a/drivers/gpu/arm/mali/linux/mali_kernel_pm.c
>> +++ b/drivers/gpu/arm/mali/linux/mali_kernel_pm.c
>> @@ -40,6 +40,10 @@
>>  #include "mali_kernel_utilization.h"
>>  #endif /* MALI_GPU_UTILIZATION */
>>
>> +#if MALI_GPU_DEVFREQ
>> +#include "mali_kernel_devfreq.h"
>> +#endif /* MALI_GPU_DEVFREQ */
>> +
>>  #if MALI_POWER_MGMT_TEST_SUITE
>>  #ifdef CONFIG_PM
>>  #include "mali_linux_pm_testsuite.h"
>> @@ -418,6 +422,9 @@ static int mali_pm_os_resume_on_hibernation(struct 
>> device *dev)
>>   */
>>  static int mali_device_runtime_suspend(struct device *dev)
>>  {
>> +#if MALI_GPU_DEVFREQ
>> +       mali_utilization_suspend();
>> +#endif /* MALI_GPU_DEVFREQ */
>>         MALI_DEBUG_PRINT(4, ("PMMDEBUG: Mali device Run time suspended \n" 
>> ));
>>         return 0;
>>  }
>> @@ -426,6 +433,9 @@ static int mali_device_runtime_suspend(struct device 
>> *dev)
>>   */
>>  static int mali_device_runtime_resume(struct device *dev)
>>  {
>> +#if MALI_GPU_DEVFREQ
>> +       mali_utilization_resume();
>> +#endif /* MALI_GPU_DEVFREQ */
>>         MALI_DEBUG_PRINT(4, ("PMMDEBUG: Mali device Run time Resumed \n" ));
>>         return 0;
>>  }
>> diff --git a/drivers/gpu/arm/mali/platform/default/mali_platform.c 
>> b/drivers/gpu/arm/mali/platform/default/mali_platform.c
>> index d966f25..8247856 100644
>> --- a/drivers/gpu/arm/mali/platform/default/mali_platform.c
>> +++ b/drivers/gpu/arm/mali/platform/default/mali_platform.c
>> @@ -40,4 +40,7 @@ void set_mali_parent_power_domain(void* dev)
>>  {
>>  }
>>
>> -
>> +unsigned long get_mali_platform_cur_freq(void)
>> +{
>> +    return 0;
>> +}
>> diff --git a/drivers/gpu/arm/mali/platform/mali_platform.h 
>> b/drivers/gpu/arm/mali/platform/mali_platform.h
>> index 078bcef..f1bb2b5 100644
>> --- a/drivers/gpu/arm/mali/platform/mali_platform.h
>> +++ b/drivers/gpu/arm/mali/platform/mali_platform.h
>> @@ -93,6 +93,14 @@ void mali_gpu_utilization_handler(u32 utilization);
>>   */
>>  void set_mali_parent_power_domain(void* dev);
>>
>> +/** @brief Get MALI current running frequency
>> + *
>> + * This function gets the current running frequency of MALI
>> + *
>> + * @return frequency in Hz
>> + */
>> +unsigned long get_mali_platform_cur_freq(void);
>> +
>>  #ifdef __cplusplus
>>  }
>>  #endif
>> --
>> 1.7.11.3
>>
>>
>> _______________________________________________
>> linaro-dev mailing list
>> linaro-dev@lists.linaro.org
>> http://lists.linaro.org/mailman/listinfo/linaro-dev



-- 
Regards,
Rajagopal

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to