| /* 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 |