blob: 2a7f3ed10f3d9054ed09c87f12b32547c46c6323 [file] [log] [blame]
/*
* Copyright (C) 2011-2013 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 "mali_pm.h"
#include "mali_kernel_common.h"
#include "mali_osk.h"
#include "mali_gp_scheduler.h"
#include "mali_pp_scheduler.h"
#include "mali_scheduler.h"
#include "mali_kernel_utilization.h"
#include "mali_group.h"
#include "mali_pm_domain.h"
#include "mali_pmu.h"
static mali_bool mali_power_on = MALI_FALSE;
_mali_osk_errcode_t mali_pm_initialize(void)
{
_mali_osk_pm_dev_enable();
return _MALI_OSK_ERR_OK;
}
void mali_pm_terminate(void)
{
mali_pm_domain_terminate();
_mali_osk_pm_dev_disable();
}
/* Reset GPU after power up */
static void mali_pm_reset_gpu(void)
{
/* Reset all L2 caches */
mali_l2_cache_reset_all();
/* Reset all groups */
mali_scheduler_reset_all_groups();
}
void mali_pm_os_suspend(void)
{
MALI_DEBUG_PRINT(3, ("Mali PM: OS suspend\n"));
mali_gp_scheduler_suspend();
mali_pp_scheduler_suspend();
mali_utilization_suspend();
mali_group_power_off();
mali_power_on = MALI_FALSE;
}
void mali_pm_os_resume(void)
{
struct mali_pmu_core *pmu = mali_pmu_get_global_pmu_core();
mali_bool do_reset = MALI_FALSE;
MALI_DEBUG_PRINT(3, ("Mali PM: OS resume\n"));
if (MALI_TRUE != mali_power_on)
{
do_reset = MALI_TRUE;
}
if (NULL != pmu)
{
mali_pmu_reset(pmu);
}
mali_power_on = MALI_TRUE;
_mali_osk_write_mem_barrier();
if (do_reset)
{
mali_pm_reset_gpu();
mali_group_power_on();
}
mali_gp_scheduler_resume();
mali_pp_scheduler_resume();
}
void mali_pm_runtime_suspend(void)
{
MALI_DEBUG_PRINT(3, ("Mali PM: Runtime suspend\n"));
mali_group_power_off();
mali_power_on = MALI_FALSE;
}
void mali_pm_runtime_resume(void)
{
struct mali_pmu_core *pmu = mali_pmu_get_global_pmu_core();
mali_bool do_reset = MALI_FALSE;
MALI_DEBUG_PRINT(3, ("Mali PM: Runtime resume\n"));
if (MALI_TRUE != mali_power_on)
{
do_reset = MALI_TRUE;
}
if (NULL != pmu)
{
mali_pmu_reset(pmu);
}
mali_power_on = MALI_TRUE;
_mali_osk_write_mem_barrier();
if (do_reset)
{
mali_pm_reset_gpu();
mali_group_power_on();
}
}
void mali_pm_set_power_is_on(void)
{
mali_power_on = MALI_TRUE;
}
mali_bool mali_pm_is_power_on(void)
{
return mali_power_on;
}