162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2013 Advanced Micro Devices, Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1262306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci#ifndef __KV_DPM_H__ 2462306a36Sopenharmony_ci#define __KV_DPM_H__ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define SMU__NUM_SCLK_DPM_STATE 8 2762306a36Sopenharmony_ci#define SMU__NUM_MCLK_DPM_LEVELS 4 2862306a36Sopenharmony_ci#define SMU__NUM_LCLK_DPM_LEVELS 8 2962306a36Sopenharmony_ci#define SMU__NUM_PCIE_DPM_LEVELS 0 /* ??? */ 3062306a36Sopenharmony_ci#include "smu7_fusion.h" 3162306a36Sopenharmony_ci#include "trinity_dpm.h" 3262306a36Sopenharmony_ci#include "ppsmc.h" 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define KV_NUM_NBPSTATES 4 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cienum kv_pt_config_reg_type { 3762306a36Sopenharmony_ci KV_CONFIGREG_MMR = 0, 3862306a36Sopenharmony_ci KV_CONFIGREG_SMC_IND, 3962306a36Sopenharmony_ci KV_CONFIGREG_DIDT_IND, 4062306a36Sopenharmony_ci KV_CONFIGREG_CACHE, 4162306a36Sopenharmony_ci KV_CONFIGREG_MAX 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistruct kv_pt_config_reg { 4562306a36Sopenharmony_ci u32 offset; 4662306a36Sopenharmony_ci u32 mask; 4762306a36Sopenharmony_ci u32 shift; 4862306a36Sopenharmony_ci u32 value; 4962306a36Sopenharmony_ci enum kv_pt_config_reg_type type; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct kv_lcac_config_values { 5362306a36Sopenharmony_ci u32 block_id; 5462306a36Sopenharmony_ci u32 signal_id; 5562306a36Sopenharmony_ci u32 t; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct kv_lcac_config_reg { 5962306a36Sopenharmony_ci u32 cntl; 6062306a36Sopenharmony_ci u32 block_mask; 6162306a36Sopenharmony_ci u32 block_shift; 6262306a36Sopenharmony_ci u32 signal_mask; 6362306a36Sopenharmony_ci u32 signal_shift; 6462306a36Sopenharmony_ci u32 t_mask; 6562306a36Sopenharmony_ci u32 t_shift; 6662306a36Sopenharmony_ci u32 enable_mask; 6762306a36Sopenharmony_ci u32 enable_shift; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistruct kv_pl { 7162306a36Sopenharmony_ci u32 sclk; 7262306a36Sopenharmony_ci u8 vddc_index; 7362306a36Sopenharmony_ci u8 ds_divider_index; 7462306a36Sopenharmony_ci u8 ss_divider_index; 7562306a36Sopenharmony_ci u8 allow_gnb_slow; 7662306a36Sopenharmony_ci u8 force_nbp_state; 7762306a36Sopenharmony_ci u8 display_wm; 7862306a36Sopenharmony_ci u8 vce_wm; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct kv_ps { 8262306a36Sopenharmony_ci struct kv_pl levels[SUMO_MAX_HARDWARE_POWERLEVELS]; 8362306a36Sopenharmony_ci u32 num_levels; 8462306a36Sopenharmony_ci bool need_dfs_bypass; 8562306a36Sopenharmony_ci u8 dpm0_pg_nb_ps_lo; 8662306a36Sopenharmony_ci u8 dpm0_pg_nb_ps_hi; 8762306a36Sopenharmony_ci u8 dpmx_nb_ps_lo; 8862306a36Sopenharmony_ci u8 dpmx_nb_ps_hi; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistruct kv_sys_info { 9262306a36Sopenharmony_ci u32 bootup_uma_clk; 9362306a36Sopenharmony_ci u32 bootup_sclk; 9462306a36Sopenharmony_ci u32 dentist_vco_freq; 9562306a36Sopenharmony_ci u32 nb_dpm_enable; 9662306a36Sopenharmony_ci u32 nbp_memory_clock[KV_NUM_NBPSTATES]; 9762306a36Sopenharmony_ci u32 nbp_n_clock[KV_NUM_NBPSTATES]; 9862306a36Sopenharmony_ci u16 bootup_nb_voltage_index; 9962306a36Sopenharmony_ci u8 htc_tmp_lmt; 10062306a36Sopenharmony_ci u8 htc_hyst_lmt; 10162306a36Sopenharmony_ci struct sumo_sclk_voltage_mapping_table sclk_voltage_mapping_table; 10262306a36Sopenharmony_ci struct sumo_vid_mapping_table vid_mapping_table; 10362306a36Sopenharmony_ci u32 uma_channel_number; 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistruct kv_power_info { 10762306a36Sopenharmony_ci u32 at[SUMO_MAX_HARDWARE_POWERLEVELS]; 10862306a36Sopenharmony_ci u32 voltage_drop_t; 10962306a36Sopenharmony_ci struct kv_sys_info sys_info; 11062306a36Sopenharmony_ci struct kv_pl boot_pl; 11162306a36Sopenharmony_ci bool enable_nb_ps_policy; 11262306a36Sopenharmony_ci bool disable_nb_ps3_in_battery; 11362306a36Sopenharmony_ci bool video_start; 11462306a36Sopenharmony_ci bool battery_state; 11562306a36Sopenharmony_ci u32 lowest_valid; 11662306a36Sopenharmony_ci u32 highest_valid; 11762306a36Sopenharmony_ci u16 high_voltage_t; 11862306a36Sopenharmony_ci bool cac_enabled; 11962306a36Sopenharmony_ci bool bapm_enable; 12062306a36Sopenharmony_ci /* smc offsets */ 12162306a36Sopenharmony_ci u32 sram_end; 12262306a36Sopenharmony_ci u32 dpm_table_start; 12362306a36Sopenharmony_ci u32 soft_regs_start; 12462306a36Sopenharmony_ci /* dpm SMU tables */ 12562306a36Sopenharmony_ci u8 graphics_dpm_level_count; 12662306a36Sopenharmony_ci u8 uvd_level_count; 12762306a36Sopenharmony_ci u8 vce_level_count; 12862306a36Sopenharmony_ci u8 acp_level_count; 12962306a36Sopenharmony_ci u8 samu_level_count; 13062306a36Sopenharmony_ci u16 fps_high_t; 13162306a36Sopenharmony_ci SMU7_Fusion_GraphicsLevel graphics_level[SMU__NUM_SCLK_DPM_STATE]; 13262306a36Sopenharmony_ci SMU7_Fusion_ACPILevel acpi_level; 13362306a36Sopenharmony_ci SMU7_Fusion_UvdLevel uvd_level[SMU7_MAX_LEVELS_UVD]; 13462306a36Sopenharmony_ci SMU7_Fusion_ExtClkLevel vce_level[SMU7_MAX_LEVELS_VCE]; 13562306a36Sopenharmony_ci SMU7_Fusion_ExtClkLevel acp_level[SMU7_MAX_LEVELS_ACP]; 13662306a36Sopenharmony_ci SMU7_Fusion_ExtClkLevel samu_level[SMU7_MAX_LEVELS_SAMU]; 13762306a36Sopenharmony_ci u8 uvd_boot_level; 13862306a36Sopenharmony_ci u8 vce_boot_level; 13962306a36Sopenharmony_ci u8 acp_boot_level; 14062306a36Sopenharmony_ci u8 samu_boot_level; 14162306a36Sopenharmony_ci u8 uvd_interval; 14262306a36Sopenharmony_ci u8 vce_interval; 14362306a36Sopenharmony_ci u8 acp_interval; 14462306a36Sopenharmony_ci u8 samu_interval; 14562306a36Sopenharmony_ci u8 graphics_boot_level; 14662306a36Sopenharmony_ci u8 graphics_interval; 14762306a36Sopenharmony_ci u8 graphics_therm_throttle_enable; 14862306a36Sopenharmony_ci u8 graphics_voltage_change_enable; 14962306a36Sopenharmony_ci u8 graphics_clk_slow_enable; 15062306a36Sopenharmony_ci u8 graphics_clk_slow_divider; 15162306a36Sopenharmony_ci u8 fps_low_t; 15262306a36Sopenharmony_ci u32 low_sclk_interrupt_t; 15362306a36Sopenharmony_ci bool uvd_power_gated; 15462306a36Sopenharmony_ci bool vce_power_gated; 15562306a36Sopenharmony_ci bool acp_power_gated; 15662306a36Sopenharmony_ci bool samu_power_gated; 15762306a36Sopenharmony_ci bool nb_dpm_enabled; 15862306a36Sopenharmony_ci /* flags */ 15962306a36Sopenharmony_ci bool enable_didt; 16062306a36Sopenharmony_ci bool enable_dpm; 16162306a36Sopenharmony_ci bool enable_auto_thermal_throttling; 16262306a36Sopenharmony_ci bool enable_nb_dpm; 16362306a36Sopenharmony_ci /* caps */ 16462306a36Sopenharmony_ci bool caps_cac; 16562306a36Sopenharmony_ci bool caps_power_containment; 16662306a36Sopenharmony_ci bool caps_sq_ramping; 16762306a36Sopenharmony_ci bool caps_db_ramping; 16862306a36Sopenharmony_ci bool caps_td_ramping; 16962306a36Sopenharmony_ci bool caps_tcp_ramping; 17062306a36Sopenharmony_ci bool caps_sclk_throttle_low_notification; 17162306a36Sopenharmony_ci bool caps_fps; 17262306a36Sopenharmony_ci bool caps_uvd_dpm; 17362306a36Sopenharmony_ci bool caps_uvd_pg; 17462306a36Sopenharmony_ci bool caps_vce_pg; 17562306a36Sopenharmony_ci bool caps_samu_pg; 17662306a36Sopenharmony_ci bool caps_acp_pg; 17762306a36Sopenharmony_ci bool caps_stable_p_state; 17862306a36Sopenharmony_ci bool caps_enable_dfs_bypass; 17962306a36Sopenharmony_ci bool caps_sclk_ds; 18062306a36Sopenharmony_ci struct radeon_ps current_rps; 18162306a36Sopenharmony_ci struct kv_ps current_ps; 18262306a36Sopenharmony_ci struct radeon_ps requested_rps; 18362306a36Sopenharmony_ci struct kv_ps requested_ps; 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* kv_smc.c */ 18862306a36Sopenharmony_ciint kv_notify_message_to_smu(struct radeon_device *rdev, u32 id); 18962306a36Sopenharmony_ciint kv_dpm_get_enable_mask(struct radeon_device *rdev, u32 *enable_mask); 19062306a36Sopenharmony_ciint kv_send_msg_to_smc_with_parameter(struct radeon_device *rdev, 19162306a36Sopenharmony_ci PPSMC_Msg msg, u32 parameter); 19262306a36Sopenharmony_ciint kv_read_smc_sram_dword(struct radeon_device *rdev, u32 smc_address, 19362306a36Sopenharmony_ci u32 *value, u32 limit); 19462306a36Sopenharmony_ciint kv_smc_dpm_enable(struct radeon_device *rdev, bool enable); 19562306a36Sopenharmony_ciint kv_smc_bapm_enable(struct radeon_device *rdev, bool enable); 19662306a36Sopenharmony_ciint kv_copy_bytes_to_smc(struct radeon_device *rdev, 19762306a36Sopenharmony_ci u32 smc_start_address, 19862306a36Sopenharmony_ci const u8 *src, u32 byte_count, u32 limit); 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci#endif 201