/*
 * Copyright (C) 2011-2016 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 license.
 *
 * A copy of the license 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_PM_H__
#define __MALI_PM_H__

#include "mali_osk.h"
#include "mali_pm_domain.h"

#define MALI_DOMAIN_INDEX_GP        0
#define MALI_DOMAIN_INDEX_PP0       1
#define MALI_DOMAIN_INDEX_PP1       2
#define MALI_DOMAIN_INDEX_PP2       3
#define MALI_DOMAIN_INDEX_PP3       4
#define MALI_DOMAIN_INDEX_PP4       5
#define MALI_DOMAIN_INDEX_PP5       6
#define MALI_DOMAIN_INDEX_PP6       7
#define MALI_DOMAIN_INDEX_PP7       8
#define MALI_DOMAIN_INDEX_L20       9
#define MALI_DOMAIN_INDEX_L21      10
#define MALI_DOMAIN_INDEX_L22      11
/*
 * The dummy domain is used when there is no physical power domain
 * (e.g. no PMU or always on cores)
 */
#define MALI_DOMAIN_INDEX_DUMMY    12
#define MALI_MAX_NUMBER_OF_DOMAINS 13

/**
 * Initialize the Mali PM module
 *
 * PM module covers Mali PM core, PM domains and Mali PMU
 */
_mali_osk_errcode_t mali_pm_initialize(void);

/**
 * Terminate the Mali PM module
 */
void mali_pm_terminate(void);

void mali_pm_exec_lock(void);
void mali_pm_exec_unlock(void);


struct mali_pm_domain *mali_pm_register_l2_cache(u32 domain_index,
		struct mali_l2_cache_core *l2_cache);
struct mali_pm_domain *mali_pm_register_group(u32 domain_index,
		struct mali_group *group);

mali_bool mali_pm_get_domain_refs(struct mali_pm_domain **domains,
				  struct mali_group **groups,
				  u32 num_domains);
mali_bool mali_pm_put_domain_refs(struct mali_pm_domain **domains,
				  u32 num_domains);

void mali_pm_init_begin(void);
void mali_pm_init_end(void);

void mali_pm_update_sync(void);
void mali_pm_update_async(void);

/* Callback functions for system power management */
void mali_pm_os_suspend(mali_bool os_suspend);
void mali_pm_os_resume(void);

mali_bool mali_pm_runtime_suspend(void);
void mali_pm_runtime_resume(void);

#if MALI_STATE_TRACKING
u32 mali_pm_dump_state_domain(struct mali_pm_domain *domain,
			      char *buf, u32 size);
#endif

void mali_pm_power_cost_setup(void);

void mali_pm_get_best_power_cost_mask(int num_requested, int *dst);

#if defined(DEBUG)
const char *mali_pm_mask_to_string(u32 mask);
#endif

u32 mali_pm_get_current_mask(void);
u32 mali_pm_get_wanted_mask(void);
#endif /* __MALI_PM_H__ */
