263 lines
7.4 KiB
C
263 lines
7.4 KiB
C
![]() |
/* 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
|