blob: 7eefd549051b5e5466c7b82eb165a2b2d91230b0 [file] [log] [blame]
/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef _ARCH_ARM_MACH_MSM_MSM_DCVS_SCM_H
#define _ARCH_ARM_MACH_MSM_MSM_DCVS_SCM_H
enum msm_dcvs_core_type {
MSM_DCVS_CORE_TYPE_CPU = 0,
MSM_DCVS_CORE_TYPE_GPU = 1,
};
enum msm_dcvs_algo_param_type {
MSM_DCVS_ALGO_DCVS_PARAM = 0,
MSM_DCVS_ALGO_MPD_PARAM = 1,
};
enum msm_dcvs_scm_event {
MSM_DCVS_SCM_IDLE_ENTER = 0, /* Core enters idle */
MSM_DCVS_SCM_IDLE_EXIT = 1, /* Core exits idle */
MSM_DCVS_SCM_QOS_TIMER_EXPIRED = 2, /* Core slack timer expired */
MSM_DCVS_SCM_CLOCK_FREQ_UPDATE = 3, /* Core freq change complete */
MSM_DCVS_SCM_CORE_ONLINE = 4, /* Core is online */
MSM_DCVS_SCM_CORE_OFFLINE = 5, /* Core is offline */
MSM_DCVS_SCM_CORE_UNAVAILABLE = 6, /* Core is offline + unavailable */
MSM_DCVS_SCM_DCVS_ENABLE = 7, /* DCVS is enabled/disabled for core */
MSM_DCVS_SCM_MPD_ENABLE = 8, /* Enable/disable MP Decision */
MSM_DCVS_SCM_RUNQ_UPDATE = 9, /* Update running threads */
MSM_DCVS_SCM_MPD_QOS_TIMER_EXPIRED = 10, /* MPDecision slack timer */
};
struct msm_dcvs_algo_param {
uint32_t disable_pc_threshold;
uint32_t em_win_size_min_us;
uint32_t em_win_size_max_us;
uint32_t em_max_util_pct;
uint32_t group_id;
uint32_t max_freq_chg_time_us;
uint32_t slack_mode_dynamic;
uint32_t slack_time_min_us;
uint32_t slack_time_max_us;
uint32_t slack_weight_thresh_pct;
uint32_t ss_no_corr_below_freq;
uint32_t ss_win_size_min_us;
uint32_t ss_win_size_max_us;
uint32_t ss_util_pct;
};
struct msm_dcvs_freq_entry {
uint32_t freq;
uint32_t voltage;
uint32_t is_trans_level;
uint32_t active_energy_offset;
uint32_t leakage_energy_offset;
};
struct msm_dcvs_energy_curve_coeffs {
int32_t active_coeff_a;
int32_t active_coeff_b;
int32_t active_coeff_c;
int32_t leakage_coeff_a;
int32_t leakage_coeff_b;
int32_t leakage_coeff_c;
int32_t leakage_coeff_d;
};
struct msm_dcvs_power_params {
uint32_t current_temp;
uint32_t num_freq; /* number of msm_dcvs_freq_entry passed */
};
struct msm_dcvs_core_param {
uint32_t core_type;
uint32_t core_bitmask_id;
};
struct msm_mpd_algo_param {
uint32_t em_win_size_min_us;
uint32_t em_win_size_max_us;
uint32_t em_max_util_pct;
uint32_t mp_em_rounding_point_min;
uint32_t mp_em_rounding_point_max;
uint32_t online_util_pct_min;
uint32_t online_util_pct_max;
uint32_t slack_time_min_us;
uint32_t slack_time_max_us;
};
#ifdef CONFIG_MSM_DCVS
/**
* Initialize DCVS algorithm in TrustZone.
* Must call before invoking any other DCVS call into TZ.
*
* @size: Size of buffer in bytes
*
* @return:
* 0 on success.
* -EEXIST: DCVS algorithm already initialized.
* -EINVAL: Invalid args.
*/
extern int msm_dcvs_scm_init(size_t size);
/**
* Registers cores with the DCVS algo.
*
* @core_id: The core identifier that will be used for communication with DCVS
* @param: The core parameters
* @freq: Array of frequency and energy values
*
* @return:
* 0 on success.
* -ENOMEM: Insufficient memory.
* -EINVAL: Invalid args.
*/
extern int msm_dcvs_scm_register_core(uint32_t core_id,
struct msm_dcvs_core_param *param);
/**
* Set DCVS algorithm parameters
*
* @core_id: The algorithm parameters specific for the core
* @param: The param data structure
*
* @return:
* 0 on success.
* -EINVAL: Invalid args.
*/
extern int msm_dcvs_scm_set_algo_params(uint32_t core_id,
struct msm_dcvs_algo_param *param);
/**
* Set MPDecision algorithm parameters
*
* @param: The param data structure
* 0 on success.
* -EINVAL: Invalid args.
*/
extern int msm_mpd_scm_set_algo_params(struct msm_mpd_algo_param *param);
/**
* Set frequency and power characteristics for the core.
*
* @param core_id: The core identifier that will be used to interace with the
* DCVS algo.
* @param pwr_param: power params
* @param freq_entry: frequency characteristics desired
* @param coeffs: Coefficients that will describe the power curve
*
* @return int
* 0 on success.
* -EINVAL: Invalid args.
*/
extern int msm_dcvs_scm_set_power_params(uint32_t core_id,
struct msm_dcvs_power_params *pwr_param,
struct msm_dcvs_freq_entry *freq_entry,
struct msm_dcvs_energy_curve_coeffs *coeffs);
/**
* Do an SCM call.
*
* @core_id: The core identifier.
* @event_id: The event that occured.
* Possible values:
* MSM_DCVS_SCM_IDLE_ENTER
* @param0: unused
* @param1: unused
* @ret0: unused
* @ret1: unused
* MSM_DCVS_SCM_IDLE_EXIT
* @param0: Did the core iowait
* @param1: unused
* @ret0: New clock frequency for the core in KHz
* @ret1: New QoS timer value for the core in usec
* MSM_DCVS_SCM_QOS_TIMER_EXPIRED
* @param0: unused
* @param1: unused
* @ret0: New clock frequency for the core in KHz
* @ret1: unused
* MSM_DCVS_SCM_CLOCK_FREQ_UPDATE
* @param0: active clock frequency of the core in KHz
* @param1: time taken in usec to switch to the frequency
* @ret0: New QoS timer value for the core in usec
* @ret1: unused
* MSM_DCVS_SCM_CORE_ONLINE
* @param0: active clock frequency of the core in KHz
* @param1: time taken to online the core
* @ret0: unused
* @ret1: unused
* MSM_DCVS_SCM_CORE_OFFLINE
* @param0: time taken to offline the core
* @param1: unused
* @ret0: unused
* @ret1: unused
* MSM_DCVS_SCM_CORE_UNAVAILABLE
* @param0: TODO:bitmask
* @param1: unused
* @ret0: Bitmask of cores to bring online/offline.
* @ret1: Mp Decision slack time. Common to all cores.
* MSM_DCVS_SCM_DCVS_ENABLE
* @param0: 1 to enable; 0 to disable DCVS
* @param1: unused
* @ret0: New clock frequency for the core in KHz
* @ret1: unused
* MSM_DCVS_SCM_MPD_ENABLE
* @param0: 1 to enable; 0 to disable MP Decision
* @param1: unused
* @ret0: unused
* @ret1: unused
* MSM_DCVS_SCM_RUNQ_UPDATE
* @param0: run q value
* @param1: unused
* @ret0: Bitmask of cores online
* @ret1: New QoS timer for MP Decision (usec)
* MSM_DCVS_SCM_MPD_QOS_TIMER_EXPIRED
* @param0: unused
* @param1: unused
* @ret0: Bitmask of cores online
* @ret1: New QoS timer for MP Decision (usec)
* @return:
* 0 on success,
* SCM return values
*/
extern int msm_dcvs_scm_event(uint32_t core_id,
enum msm_dcvs_scm_event event_id,
uint32_t param0, uint32_t param1,
uint32_t *ret0, uint32_t *ret1);
#else
static inline int msm_dcvs_scm_init(uint32_t phy, size_t bytes)
{ return -ENOSYS; }
static inline int msm_dcvs_scm_register_core(uint32_t core_id,
struct msm_dcvs_core_param *param,
struct msm_dcvs_freq_entry *freq)
{ return -ENOSYS; }
static inline int msm_dcvs_scm_set_algo_params(uint32_t core_id,
struct msm_dcvs_algo_param *param)
{ return -ENOSYS; }
static inline int msm_mpd_scm_set_algo_params(
struct msm_mpd_algo_param *param)
{ return -ENOSYS; }
static inline int msm_dcvs_set_power_params(uint32_t core_id,
struct msm_dcvs_power_params *pwr_param,
struct msm_dcvs_freq_entry *freq_entry,
struct msm_dcvs_energy_curve_coeffs *coeffs)
{ return -ENOSYS; }
static inline int msm_dcvs_scm_event(uint32_t core_id,
enum msm_dcvs_scm_event event_id,
uint32_t param0, uint32_t param1,
uint32_t *ret0, uint32_t *ret1)
{ return -ENOSYS; }
#endif
#endif