mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	drm/radeon: add dpm support for CI dGPUs (v2)
This adds dpm support for btc asics. This includes:
- dynamic engine clock scaling
- dynamic memory clock scaling
- dynamic voltage scaling
- dynamic pcie gen switching
Set radeon.dpm=1 to enable.
v2: remove unused radeon_atombios.c changes,
    make missing smc ucode non-fatal
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
			
			
This commit is contained in:
		
							parent
							
								
									41a524abff
								
							
						
					
					
						commit
						cc8dbbb4f6
					
				
					 15 changed files with 6447 additions and 15 deletions
				
			
		| 
						 | 
					@ -79,7 +79,8 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
 | 
				
			||||||
	si_blit_shaders.o radeon_prime.o radeon_uvd.o cik.o cik_blit_shaders.o \
 | 
						si_blit_shaders.o radeon_prime.o radeon_uvd.o cik.o cik_blit_shaders.o \
 | 
				
			||||||
	r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
 | 
						r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
 | 
				
			||||||
	rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
 | 
						rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
 | 
				
			||||||
	trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o
 | 
						trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
 | 
				
			||||||
 | 
						ci_dpm.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
 | 
					radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
 | 
				
			||||||
radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
 | 
					radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5006
									
								
								drivers/gpu/drm/radeon/ci_dpm.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5006
									
								
								drivers/gpu/drm/radeon/ci_dpm.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										331
									
								
								drivers/gpu/drm/radeon/ci_dpm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								drivers/gpu/drm/radeon/ci_dpm.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,331 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2013 Advanced Micro Devices, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
				
			||||||
 | 
					 * copy of this software and associated documentation files (the "Software"),
 | 
				
			||||||
 | 
					 * to deal in the Software without restriction, including without limitation
 | 
				
			||||||
 | 
					 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
				
			||||||
 | 
					 * and/or sell copies of the Software, and to permit persons to whom the
 | 
				
			||||||
 | 
					 * Software is furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					 * all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
				
			||||||
 | 
					 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
				
			||||||
 | 
					 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
				
			||||||
 | 
					 * OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef __CI_DPM_H__
 | 
				
			||||||
 | 
					#define __CI_DPM_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ppsmc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMU__NUM_SCLK_DPM_STATE  8
 | 
				
			||||||
 | 
					#define SMU__NUM_MCLK_DPM_LEVELS 6
 | 
				
			||||||
 | 
					#define SMU__NUM_LCLK_DPM_LEVELS 8
 | 
				
			||||||
 | 
					#define SMU__NUM_PCIE_DPM_LEVELS 8
 | 
				
			||||||
 | 
					#include "smu7_discrete.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLANDS_MAX_HARDWARE_POWERLEVELS 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_pl {
 | 
				
			||||||
 | 
						u32 mclk;
 | 
				
			||||||
 | 
						u32 sclk;
 | 
				
			||||||
 | 
						enum radeon_pcie_gen pcie_gen;
 | 
				
			||||||
 | 
						u16 pcie_lane;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_ps {
 | 
				
			||||||
 | 
						u16 performance_level_count;
 | 
				
			||||||
 | 
						bool dc_compatible;
 | 
				
			||||||
 | 
						u32 sclk_t;
 | 
				
			||||||
 | 
						struct ci_pl performance_levels[CISLANDS_MAX_HARDWARE_POWERLEVELS];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_dpm_level {
 | 
				
			||||||
 | 
						bool enabled;
 | 
				
			||||||
 | 
						u32 value;
 | 
				
			||||||
 | 
						u32 param1;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLAND_MAX_DEEPSLEEP_DIVIDER_ID 5
 | 
				
			||||||
 | 
					#define MAX_REGULAR_DPM_NUMBER 8
 | 
				
			||||||
 | 
					#define CISLAND_MINIMUM_ENGINE_CLOCK 800
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_single_dpm_table {
 | 
				
			||||||
 | 
						u32 count;
 | 
				
			||||||
 | 
						struct ci_dpm_level dpm_levels[MAX_REGULAR_DPM_NUMBER];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_dpm_table {
 | 
				
			||||||
 | 
						struct ci_single_dpm_table sclk_table;
 | 
				
			||||||
 | 
						struct ci_single_dpm_table mclk_table;
 | 
				
			||||||
 | 
						struct ci_single_dpm_table pcie_speed_table;
 | 
				
			||||||
 | 
						struct ci_single_dpm_table vddc_table;
 | 
				
			||||||
 | 
						struct ci_single_dpm_table vddci_table;
 | 
				
			||||||
 | 
						struct ci_single_dpm_table mvdd_table;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_mc_reg_entry {
 | 
				
			||||||
 | 
						u32 mclk_max;
 | 
				
			||||||
 | 
						u32 mc_data[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_mc_reg_table {
 | 
				
			||||||
 | 
						u8 last;
 | 
				
			||||||
 | 
						u8 num_entries;
 | 
				
			||||||
 | 
						u16 valid_flag;
 | 
				
			||||||
 | 
						struct ci_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
 | 
				
			||||||
 | 
						SMU7_Discrete_MCRegisterAddress mc_reg_address[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_ulv_parm
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool supported;
 | 
				
			||||||
 | 
						u32 cg_ulv_parameter;
 | 
				
			||||||
 | 
						u32 volt_change_delay;
 | 
				
			||||||
 | 
						struct ci_pl pl;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLANDS_MAX_LEAKAGE_COUNT  8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_leakage_voltage {
 | 
				
			||||||
 | 
						u16 count;
 | 
				
			||||||
 | 
						u16 leakage_id[CISLANDS_MAX_LEAKAGE_COUNT];
 | 
				
			||||||
 | 
						u16 actual_voltage[CISLANDS_MAX_LEAKAGE_COUNT];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_dpm_level_enable_mask {
 | 
				
			||||||
 | 
						u32 uvd_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 vce_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 acp_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 samu_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 sclk_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 mclk_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 pcie_dpm_enable_mask;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_vbios_boot_state
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u16 mvdd_bootup_value;
 | 
				
			||||||
 | 
						u16 vddc_bootup_value;
 | 
				
			||||||
 | 
						u16 vddci_bootup_value;
 | 
				
			||||||
 | 
						u32 sclk_bootup_value;
 | 
				
			||||||
 | 
						u32 mclk_bootup_value;
 | 
				
			||||||
 | 
						u16 pcie_gen_bootup_value;
 | 
				
			||||||
 | 
						u16 pcie_lane_bootup_value;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_clock_registers {
 | 
				
			||||||
 | 
						u32 cg_spll_func_cntl;
 | 
				
			||||||
 | 
						u32 cg_spll_func_cntl_2;
 | 
				
			||||||
 | 
						u32 cg_spll_func_cntl_3;
 | 
				
			||||||
 | 
						u32 cg_spll_func_cntl_4;
 | 
				
			||||||
 | 
						u32 cg_spll_spread_spectrum;
 | 
				
			||||||
 | 
						u32 cg_spll_spread_spectrum_2;
 | 
				
			||||||
 | 
						u32 dll_cntl;
 | 
				
			||||||
 | 
						u32 mclk_pwrmgt_cntl;
 | 
				
			||||||
 | 
						u32 mpll_ad_func_cntl;
 | 
				
			||||||
 | 
						u32 mpll_dq_func_cntl;
 | 
				
			||||||
 | 
						u32 mpll_func_cntl;
 | 
				
			||||||
 | 
						u32 mpll_func_cntl_1;
 | 
				
			||||||
 | 
						u32 mpll_func_cntl_2;
 | 
				
			||||||
 | 
						u32 mpll_ss1;
 | 
				
			||||||
 | 
						u32 mpll_ss2;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_thermal_temperature_setting {
 | 
				
			||||||
 | 
						s32 temperature_low;
 | 
				
			||||||
 | 
						s32 temperature_high;
 | 
				
			||||||
 | 
						s32 temperature_shutdown;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_pcie_perf_range {
 | 
				
			||||||
 | 
						u16 max;
 | 
				
			||||||
 | 
						u16 min;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ci_pt_config_reg_type {
 | 
				
			||||||
 | 
						CISLANDS_CONFIGREG_MMR = 0,
 | 
				
			||||||
 | 
						CISLANDS_CONFIGREG_SMC_IND,
 | 
				
			||||||
 | 
						CISLANDS_CONFIGREG_DIDT_IND,
 | 
				
			||||||
 | 
						CISLANDS_CONFIGREG_CACHE,
 | 
				
			||||||
 | 
						CISLANDS_CONFIGREG_MAX
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define POWERCONTAINMENT_FEATURE_BAPM            0x00000001
 | 
				
			||||||
 | 
					#define POWERCONTAINMENT_FEATURE_TDCLimit        0x00000002
 | 
				
			||||||
 | 
					#define POWERCONTAINMENT_FEATURE_PkgPwrLimit     0x00000004
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_pt_config_reg {
 | 
				
			||||||
 | 
						u32 offset;
 | 
				
			||||||
 | 
						u32 mask;
 | 
				
			||||||
 | 
						u32 shift;
 | 
				
			||||||
 | 
						u32 value;
 | 
				
			||||||
 | 
						enum ci_pt_config_reg_type type;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_pt_defaults {
 | 
				
			||||||
 | 
						u8 svi_load_line_en;
 | 
				
			||||||
 | 
						u8 svi_load_line_vddc;
 | 
				
			||||||
 | 
						u8 tdc_vddc_throttle_release_limit_perc;
 | 
				
			||||||
 | 
						u8 tdc_mawt;
 | 
				
			||||||
 | 
						u8 tdc_waterfall_ctl;
 | 
				
			||||||
 | 
						u8 dte_ambient_temp_base;
 | 
				
			||||||
 | 
						u32 display_cac;
 | 
				
			||||||
 | 
						u32 bapm_temp_gradient;
 | 
				
			||||||
 | 
						u16 bapmti_r[SMU7_DTE_ITERATIONS * SMU7_DTE_SOURCES * SMU7_DTE_SINKS];
 | 
				
			||||||
 | 
						u16 bapmti_rc[SMU7_DTE_ITERATIONS * SMU7_DTE_SOURCES * SMU7_DTE_SINKS];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DPMTABLE_OD_UPDATE_SCLK     0x00000001
 | 
				
			||||||
 | 
					#define DPMTABLE_OD_UPDATE_MCLK     0x00000002
 | 
				
			||||||
 | 
					#define DPMTABLE_UPDATE_SCLK        0x00000004
 | 
				
			||||||
 | 
					#define DPMTABLE_UPDATE_MCLK        0x00000008
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ci_power_info {
 | 
				
			||||||
 | 
						struct ci_dpm_table dpm_table;
 | 
				
			||||||
 | 
						u32 voltage_control;
 | 
				
			||||||
 | 
						u32 mvdd_control;
 | 
				
			||||||
 | 
						u32 vddci_control;
 | 
				
			||||||
 | 
						u32 active_auto_throttle_sources;
 | 
				
			||||||
 | 
						struct ci_clock_registers clock_registers;
 | 
				
			||||||
 | 
						u16 acpi_vddc;
 | 
				
			||||||
 | 
						u16 acpi_vddci;
 | 
				
			||||||
 | 
						enum radeon_pcie_gen force_pcie_gen;
 | 
				
			||||||
 | 
						enum radeon_pcie_gen acpi_pcie_gen;
 | 
				
			||||||
 | 
						struct ci_leakage_voltage vddc_leakage;
 | 
				
			||||||
 | 
						struct ci_leakage_voltage vddci_leakage;
 | 
				
			||||||
 | 
						u16 max_vddc_in_pp_table;
 | 
				
			||||||
 | 
						u16 min_vddc_in_pp_table;
 | 
				
			||||||
 | 
						u16 max_vddci_in_pp_table;
 | 
				
			||||||
 | 
						u16 min_vddci_in_pp_table;
 | 
				
			||||||
 | 
						u32 mclk_strobe_mode_threshold;
 | 
				
			||||||
 | 
						u32 mclk_stutter_mode_threshold;
 | 
				
			||||||
 | 
						u32 mclk_edc_enable_threshold;
 | 
				
			||||||
 | 
						u32 mclk_edc_wr_enable_threshold;
 | 
				
			||||||
 | 
						struct ci_vbios_boot_state vbios_boot_state;
 | 
				
			||||||
 | 
						/* smc offsets */
 | 
				
			||||||
 | 
						u32 sram_end;
 | 
				
			||||||
 | 
						u32 dpm_table_start;
 | 
				
			||||||
 | 
						u32 soft_regs_start;
 | 
				
			||||||
 | 
						u32 mc_reg_table_start;
 | 
				
			||||||
 | 
						u32 fan_table_start;
 | 
				
			||||||
 | 
						u32 arb_table_start;
 | 
				
			||||||
 | 
						/* smc tables */
 | 
				
			||||||
 | 
						SMU7_Discrete_DpmTable smc_state_table;
 | 
				
			||||||
 | 
						SMU7_Discrete_MCRegisters smc_mc_reg_table;
 | 
				
			||||||
 | 
						SMU7_Discrete_PmFuses smc_powertune_table;
 | 
				
			||||||
 | 
						/* other stuff */
 | 
				
			||||||
 | 
						struct ci_mc_reg_table mc_reg_table;
 | 
				
			||||||
 | 
						struct atom_voltage_table vddc_voltage_table;
 | 
				
			||||||
 | 
						struct atom_voltage_table vddci_voltage_table;
 | 
				
			||||||
 | 
						struct atom_voltage_table mvdd_voltage_table;
 | 
				
			||||||
 | 
						struct ci_ulv_parm ulv;
 | 
				
			||||||
 | 
						u32 power_containment_features;
 | 
				
			||||||
 | 
						const struct ci_pt_defaults *powertune_defaults;
 | 
				
			||||||
 | 
						u32 dte_tj_offset;
 | 
				
			||||||
 | 
						bool vddc_phase_shed_control;
 | 
				
			||||||
 | 
						struct ci_thermal_temperature_setting thermal_temp_setting;
 | 
				
			||||||
 | 
						struct ci_dpm_level_enable_mask dpm_level_enable_mask;
 | 
				
			||||||
 | 
						u32 need_update_smu7_dpm_table;
 | 
				
			||||||
 | 
						u32 sclk_dpm_key_disabled;
 | 
				
			||||||
 | 
						u32 mclk_dpm_key_disabled;
 | 
				
			||||||
 | 
						u32 pcie_dpm_key_disabled;
 | 
				
			||||||
 | 
						struct ci_pcie_perf_range pcie_gen_performance;
 | 
				
			||||||
 | 
						struct ci_pcie_perf_range pcie_lane_performance;
 | 
				
			||||||
 | 
						struct ci_pcie_perf_range pcie_gen_powersaving;
 | 
				
			||||||
 | 
						struct ci_pcie_perf_range pcie_lane_powersaving;
 | 
				
			||||||
 | 
						u32 activity_target[SMU7_MAX_LEVELS_GRAPHICS];
 | 
				
			||||||
 | 
						u32 mclk_activity_target;
 | 
				
			||||||
 | 
						u32 low_sclk_interrupt_t;
 | 
				
			||||||
 | 
						u32 last_mclk_dpm_enable_mask;
 | 
				
			||||||
 | 
						u32 sys_pcie_mask;
 | 
				
			||||||
 | 
						/* caps */
 | 
				
			||||||
 | 
						bool caps_power_containment;
 | 
				
			||||||
 | 
						bool caps_cac;
 | 
				
			||||||
 | 
						bool caps_sq_ramping;
 | 
				
			||||||
 | 
						bool caps_db_ramping;
 | 
				
			||||||
 | 
						bool caps_td_ramping;
 | 
				
			||||||
 | 
						bool caps_tcp_ramping;
 | 
				
			||||||
 | 
						bool caps_fps;
 | 
				
			||||||
 | 
						bool caps_sclk_ds;
 | 
				
			||||||
 | 
						bool caps_sclk_ss_support;
 | 
				
			||||||
 | 
						bool caps_mclk_ss_support;
 | 
				
			||||||
 | 
						bool caps_uvd_dpm;
 | 
				
			||||||
 | 
						bool caps_vce_dpm;
 | 
				
			||||||
 | 
						bool caps_samu_dpm;
 | 
				
			||||||
 | 
						bool caps_acp_dpm;
 | 
				
			||||||
 | 
						bool caps_automatic_dc_transition;
 | 
				
			||||||
 | 
						bool caps_sclk_throttle_low_notification;
 | 
				
			||||||
 | 
						bool caps_dynamic_ac_timing;
 | 
				
			||||||
 | 
						/* flags */
 | 
				
			||||||
 | 
						bool thermal_protection;
 | 
				
			||||||
 | 
						bool pcie_performance_request;
 | 
				
			||||||
 | 
						bool dynamic_ss;
 | 
				
			||||||
 | 
						bool dll_default_on;
 | 
				
			||||||
 | 
						bool cac_enabled;
 | 
				
			||||||
 | 
						bool uvd_enabled;
 | 
				
			||||||
 | 
						bool battery_state;
 | 
				
			||||||
 | 
						bool pspp_notify_required;
 | 
				
			||||||
 | 
						bool mem_gddr5;
 | 
				
			||||||
 | 
						bool enable_bapm_feature;
 | 
				
			||||||
 | 
						bool enable_tdc_limit_feature;
 | 
				
			||||||
 | 
						bool enable_pkg_pwr_tracking_feature;
 | 
				
			||||||
 | 
						bool use_pcie_performance_levels;
 | 
				
			||||||
 | 
						bool use_pcie_powersaving_levels;
 | 
				
			||||||
 | 
						/* driver states */
 | 
				
			||||||
 | 
						struct radeon_ps current_rps;
 | 
				
			||||||
 | 
						struct ci_ps current_ps;
 | 
				
			||||||
 | 
						struct radeon_ps requested_rps;
 | 
				
			||||||
 | 
						struct ci_ps requested_ps;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLANDS_VOLTAGE_CONTROL_NONE                   0x0
 | 
				
			||||||
 | 
					#define CISLANDS_VOLTAGE_CONTROL_BY_GPIO                0x1
 | 
				
			||||||
 | 
					#define CISLANDS_VOLTAGE_CONTROL_BY_SVID2               0x2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLANDS_Q88_FORMAT_CONVERSION_UNIT             256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT0                              0x3FFFC000
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT1                              0x000400
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT2                              0xC00080
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT3                              0xC00200
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT4                              0xC01680
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT5                              0xC00033
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT6                              0xC00033
 | 
				
			||||||
 | 
					#define CISLANDS_VRC_DFLT7                              0x3FFFC000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CISLANDS_CGULVPARAMETER_DFLT                    0x00040035
 | 
				
			||||||
 | 
					#define CISLAND_TARGETACTIVITY_DFLT                     30
 | 
				
			||||||
 | 
					#define CISLAND_MCLK_TARGETACTIVITY_DFLT                10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PCIE_PERF_REQ_REMOVE_REGISTRY   0
 | 
				
			||||||
 | 
					#define PCIE_PERF_REQ_FORCE_LOWPOWER    1
 | 
				
			||||||
 | 
					#define PCIE_PERF_REQ_PECI_GEN1         2
 | 
				
			||||||
 | 
					#define PCIE_PERF_REQ_PECI_GEN2         3
 | 
				
			||||||
 | 
					#define PCIE_PERF_REQ_PECI_GEN3         4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_copy_bytes_to_smc(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								 u32 smc_start_address,
 | 
				
			||||||
 | 
								 const u8 *src, u32 byte_count, u32 limit);
 | 
				
			||||||
 | 
					void ci_start_smc(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_reset_smc(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					int ci_program_jump_on_start(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_stop_smc_clock(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_start_smc_clock(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					bool ci_is_smc_running(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					PPSMC_Result ci_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg);
 | 
				
			||||||
 | 
					PPSMC_Result ci_wait_for_smc_inactive(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit);
 | 
				
			||||||
 | 
					int ci_read_smc_sram_dword(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								   u32 smc_address, u32 *value, u32 limit);
 | 
				
			||||||
 | 
					int ci_write_smc_sram_dword(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								    u32 smc_address, u32 value, u32 limit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										262
									
								
								drivers/gpu/drm/radeon/ci_smc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								drivers/gpu/drm/radeon/ci_smc.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,262 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2011 Advanced Micro Devices, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
				
			||||||
 | 
					 * copy of this software and associated documentation files (the "Software"),
 | 
				
			||||||
 | 
					 * to deal in the Software without restriction, including without limitation
 | 
				
			||||||
 | 
					 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
				
			||||||
 | 
					 * and/or sell copies of the Software, and to permit persons to whom the
 | 
				
			||||||
 | 
					 * Software is furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					 * all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
				
			||||||
 | 
					 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
				
			||||||
 | 
					 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
				
			||||||
 | 
					 * OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Authors: Alex Deucher
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/firmware.h>
 | 
				
			||||||
 | 
					#include "drmP.h"
 | 
				
			||||||
 | 
					#include "radeon.h"
 | 
				
			||||||
 | 
					#include "cikd.h"
 | 
				
			||||||
 | 
					#include "ppsmc.h"
 | 
				
			||||||
 | 
					#include "radeon_ucode.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int ci_set_smc_sram_address(struct radeon_device *rdev,
 | 
				
			||||||
 | 
									   u32 smc_address, u32 limit)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (smc_address & 3)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						if ((smc_address + 3) > limit)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						WREG32(SMC_IND_INDEX_0, smc_address);
 | 
				
			||||||
 | 
						WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_copy_bytes_to_smc(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								 u32 smc_start_address,
 | 
				
			||||||
 | 
								 const u8 *src, u32 byte_count, u32 limit)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 data, original_data;
 | 
				
			||||||
 | 
						u32 addr;
 | 
				
			||||||
 | 
						u32 extra_shift;
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (smc_start_address & 3)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						if ((smc_start_address + byte_count) > limit)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addr = smc_start_address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (byte_count >= 4) {
 | 
				
			||||||
 | 
							/* SMC address space is BE */
 | 
				
			||||||
 | 
							data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = ci_set_smc_sram_address(rdev, addr, limit);
 | 
				
			||||||
 | 
							if (ret)
 | 
				
			||||||
 | 
								return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WREG32(SMC_IND_DATA_0, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							src += 4;
 | 
				
			||||||
 | 
							byte_count -= 4;
 | 
				
			||||||
 | 
							addr += 4;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* RMW for the final bytes */
 | 
				
			||||||
 | 
						if (byte_count > 0) {
 | 
				
			||||||
 | 
							data = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = ci_set_smc_sram_address(rdev, addr, limit);
 | 
				
			||||||
 | 
							if (ret)
 | 
				
			||||||
 | 
								return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							original_data = RREG32(SMC_IND_DATA_0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							extra_shift = 8 * (4 - byte_count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (byte_count > 0) {
 | 
				
			||||||
 | 
								data = (data << 8) + *src++;
 | 
				
			||||||
 | 
								byte_count--;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							data <<= extra_shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							data |= (original_data & ~((~0UL) << extra_shift));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = ci_set_smc_sram_address(rdev, addr, limit);
 | 
				
			||||||
 | 
							if (ret)
 | 
				
			||||||
 | 
								return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WREG32(SMC_IND_DATA_0, data);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ci_start_smc(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tmp &= ~RST_REG;
 | 
				
			||||||
 | 
						WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ci_reset_smc(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tmp |= RST_REG;
 | 
				
			||||||
 | 
						WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_program_jump_on_start(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static u8 data[] = { 0xE0, 0x00, 0x80, 0x40 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ci_copy_bytes_to_smc(rdev, 0x0, data, 4, sizeof(data)+1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ci_stop_smc_clock(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tmp |= CK_DISABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ci_start_smc_clock(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tmp &= ~CK_DISABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool ci_is_smc_running(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 clk = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
 | 
				
			||||||
 | 
						u32 pc_c = RREG32_SMC(SMC_PC_C);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(clk & CK_DISABLE) && (0x20100 <= pc_c))
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PPSMC_Result ci_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 tmp;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!ci_is_smc_running(rdev))
 | 
				
			||||||
 | 
							return PPSMC_Result_Failed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						WREG32(SMC_MESSAGE_0, msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < rdev->usec_timeout; i++) {
 | 
				
			||||||
 | 
							tmp = RREG32(SMC_RESP_0);
 | 
				
			||||||
 | 
							if (tmp != 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							udelay(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						tmp = RREG32(SMC_RESP_0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (PPSMC_Result)tmp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PPSMC_Result ci_wait_for_smc_inactive(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 tmp;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!ci_is_smc_running(rdev))
 | 
				
			||||||
 | 
							return PPSMC_Result_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < rdev->usec_timeout; i++) {
 | 
				
			||||||
 | 
					                tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
 | 
				
			||||||
 | 
					                if ((tmp & CKEN) == 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					                udelay(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return PPSMC_Result_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 ucode_start_address;
 | 
				
			||||||
 | 
						u32 ucode_size;
 | 
				
			||||||
 | 
						const u8 *src;
 | 
				
			||||||
 | 
						u32 data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!rdev->smc_fw)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (rdev->family) {
 | 
				
			||||||
 | 
						case CHIP_BONAIRE:
 | 
				
			||||||
 | 
							ucode_start_address = BONAIRE_SMC_UCODE_START;
 | 
				
			||||||
 | 
							ucode_size = BONAIRE_SMC_UCODE_SIZE;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							DRM_ERROR("unknown asic in smc ucode loader\n");
 | 
				
			||||||
 | 
							BUG();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ucode_size & 3)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						src = (const u8 *)rdev->smc_fw->data;
 | 
				
			||||||
 | 
						WREG32(SMC_IND_INDEX_0, ucode_start_address);
 | 
				
			||||||
 | 
						WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
 | 
				
			||||||
 | 
						while (ucode_size >= 4) {
 | 
				
			||||||
 | 
							/* SMC address space is BE */
 | 
				
			||||||
 | 
							data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WREG32(SMC_IND_DATA_0, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							src += 4;
 | 
				
			||||||
 | 
							ucode_size -= 4;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_read_smc_sram_dword(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								   u32 smc_address, u32 *value, u32 limit)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = ci_set_smc_sram_address(rdev, smc_address, limit);
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*value = RREG32(SMC_IND_DATA_0);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_write_smc_sram_dword(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								    u32 smc_address, u32 value, u32 limit)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = ci_set_smc_sram_address(rdev, smc_address, limit);
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						WREG32(SMC_IND_DATA_0, value);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -40,6 +40,7 @@ MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
 | 
				
			||||||
MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
 | 
					MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
 | 
				
			||||||
MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
 | 
					MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
 | 
				
			||||||
MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
 | 
					MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
 | 
				
			||||||
 | 
					MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
 | 
				
			||||||
MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
 | 
					MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
 | 
				
			||||||
MODULE_FIRMWARE("radeon/KAVERI_me.bin");
 | 
					MODULE_FIRMWARE("radeon/KAVERI_me.bin");
 | 
				
			||||||
MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
 | 
					MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
 | 
				
			||||||
| 
						 | 
					@ -1545,7 +1546,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
 | 
				
			||||||
	const char *chip_name;
 | 
						const char *chip_name;
 | 
				
			||||||
	size_t pfp_req_size, me_req_size, ce_req_size,
 | 
						size_t pfp_req_size, me_req_size, ce_req_size,
 | 
				
			||||||
		mec_req_size, rlc_req_size, mc_req_size,
 | 
							mec_req_size, rlc_req_size, mc_req_size,
 | 
				
			||||||
		sdma_req_size;
 | 
							sdma_req_size, smc_req_size;
 | 
				
			||||||
	char fw_name[30];
 | 
						char fw_name[30];
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1561,6 +1562,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
 | 
				
			||||||
		rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
 | 
							rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
 | 
				
			||||||
		mc_req_size = CIK_MC_UCODE_SIZE * 4;
 | 
							mc_req_size = CIK_MC_UCODE_SIZE * 4;
 | 
				
			||||||
		sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
 | 
							sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
 | 
				
			||||||
 | 
							smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case CHIP_KAVERI:
 | 
						case CHIP_KAVERI:
 | 
				
			||||||
		chip_name = "KAVERI";
 | 
							chip_name = "KAVERI";
 | 
				
			||||||
| 
						 | 
					@ -1652,7 +1654,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
 | 
				
			||||||
		err = -EINVAL;
 | 
							err = -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* No MC ucode on APUs */
 | 
						/* No SMC, MC ucode on APUs */
 | 
				
			||||||
	if (!(rdev->flags & RADEON_IS_IGP)) {
 | 
						if (!(rdev->flags & RADEON_IS_IGP)) {
 | 
				
			||||||
		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
 | 
							snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
 | 
				
			||||||
		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
 | 
							err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
 | 
				
			||||||
| 
						 | 
					@ -1664,6 +1666,21 @@ static int cik_init_microcode(struct radeon_device *rdev)
 | 
				
			||||||
			       rdev->mc_fw->size, fw_name);
 | 
								       rdev->mc_fw->size, fw_name);
 | 
				
			||||||
			err = -EINVAL;
 | 
								err = -EINVAL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
 | 
				
			||||||
 | 
							err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
 | 
				
			||||||
 | 
							if (err) {
 | 
				
			||||||
 | 
								printk(KERN_ERR
 | 
				
			||||||
 | 
								       "smc: error loading firmware \"%s\"\n",
 | 
				
			||||||
 | 
								       fw_name);
 | 
				
			||||||
 | 
								release_firmware(rdev->smc_fw);
 | 
				
			||||||
 | 
								rdev->smc_fw = NULL;
 | 
				
			||||||
 | 
							} else if (rdev->smc_fw->size != smc_req_size) {
 | 
				
			||||||
 | 
								printk(KERN_ERR
 | 
				
			||||||
 | 
								       "cik_smc: Bogus length %zu in firmware \"%s\"\n",
 | 
				
			||||||
 | 
								       rdev->smc_fw->size, fw_name);
 | 
				
			||||||
 | 
								err = -EINVAL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					@ -1682,6 +1699,8 @@ static int cik_init_microcode(struct radeon_device *rdev)
 | 
				
			||||||
		rdev->rlc_fw = NULL;
 | 
							rdev->rlc_fw = NULL;
 | 
				
			||||||
		release_firmware(rdev->mc_fw);
 | 
							release_firmware(rdev->mc_fw);
 | 
				
			||||||
		rdev->mc_fw = NULL;
 | 
							rdev->mc_fw = NULL;
 | 
				
			||||||
 | 
							release_firmware(rdev->smc_fw);
 | 
				
			||||||
 | 
							rdev->smc_fw = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -6626,8 +6645,12 @@ int cik_irq_set(struct radeon_device *rdev)
 | 
				
			||||||
	cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
 | 
						cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
 | 
				
			||||||
	cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
 | 
						cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
 | 
						if (rdev->flags & RADEON_IS_IGP)
 | 
				
			||||||
		~(THERM_INTH_MASK | THERM_INTL_MASK);
 | 
							thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
 | 
				
			||||||
 | 
								~(THERM_INTH_MASK | THERM_INTL_MASK);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							thermal_int = RREG32_SMC(CG_THERMAL_INT) &
 | 
				
			||||||
 | 
								~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* enable CP interrupts on all rings */
 | 
						/* enable CP interrupts on all rings */
 | 
				
			||||||
	if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
 | 
						if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
 | 
				
			||||||
| 
						 | 
					@ -6788,7 +6811,10 @@ int cik_irq_set(struct radeon_device *rdev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rdev->irq.dpm_thermal) {
 | 
						if (rdev->irq.dpm_thermal) {
 | 
				
			||||||
		DRM_DEBUG("dpm thermal\n");
 | 
							DRM_DEBUG("dpm thermal\n");
 | 
				
			||||||
		thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
 | 
							if (rdev->flags & RADEON_IS_IGP)
 | 
				
			||||||
 | 
								thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
 | 
						WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
 | 
				
			||||||
| 
						 | 
					@ -6825,7 +6851,10 @@ int cik_irq_set(struct radeon_device *rdev)
 | 
				
			||||||
	WREG32(DC_HPD5_INT_CONTROL, hpd5);
 | 
						WREG32(DC_HPD5_INT_CONTROL, hpd5);
 | 
				
			||||||
	WREG32(DC_HPD6_INT_CONTROL, hpd6);
 | 
						WREG32(DC_HPD6_INT_CONTROL, hpd6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
 | 
						if (rdev->flags & RADEON_IS_IGP)
 | 
				
			||||||
 | 
							WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							WREG32_SMC(CG_THERMAL_INT, thermal_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,23 @@
 | 
				
			||||||
#define DIDT_TCP_CTRL0                                    0x60
 | 
					#define DIDT_TCP_CTRL0                                    0x60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* SMC IND registers */
 | 
					/* SMC IND registers */
 | 
				
			||||||
 | 
					#define DPM_TABLE_475                                     0x3F768
 | 
				
			||||||
 | 
					#       define SamuBootLevel(x)                           ((x) << 0)
 | 
				
			||||||
 | 
					#       define SamuBootLevel_MASK                         0x000000ff
 | 
				
			||||||
 | 
					#       define SamuBootLevel_SHIFT                        0
 | 
				
			||||||
 | 
					#       define AcpBootLevel(x)                            ((x) << 8)
 | 
				
			||||||
 | 
					#       define AcpBootLevel_MASK                          0x0000ff00
 | 
				
			||||||
 | 
					#       define AcpBootLevel_SHIFT                         8
 | 
				
			||||||
 | 
					#       define VceBootLevel(x)                            ((x) << 16)
 | 
				
			||||||
 | 
					#       define VceBootLevel_MASK                          0x00ff0000
 | 
				
			||||||
 | 
					#       define VceBootLevel_SHIFT                         16
 | 
				
			||||||
 | 
					#       define UvdBootLevel(x)                            ((x) << 24)
 | 
				
			||||||
 | 
					#       define UvdBootLevel_MASK                          0xff000000
 | 
				
			||||||
 | 
					#       define UvdBootLevel_SHIFT                         24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FIRMWARE_FLAGS                                    0x3F800
 | 
				
			||||||
 | 
					#       define INTERRUPTS_ENABLED                         (1 << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NB_DPM_CONFIG_1                                   0x3F9E8
 | 
					#define NB_DPM_CONFIG_1                                   0x3F9E8
 | 
				
			||||||
#       define Dpm0PgNbPsLo(x)                            ((x) << 0)
 | 
					#       define Dpm0PgNbPsLo(x)                            ((x) << 0)
 | 
				
			||||||
#       define Dpm0PgNbPsLo_MASK                          0x000000ff
 | 
					#       define Dpm0PgNbPsLo_MASK                          0x000000ff
 | 
				
			||||||
| 
						 | 
					@ -50,25 +67,85 @@
 | 
				
			||||||
#       define DpmXNbPsHi_MASK                            0xff000000
 | 
					#       define DpmXNbPsHi_MASK                            0xff000000
 | 
				
			||||||
#       define DpmXNbPsHi_SHIFT                           24
 | 
					#       define DpmXNbPsHi_SHIFT                           24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SMC_SYSCON_RESET_CNTL				0x80000000
 | 
				
			||||||
 | 
					#       define RST_REG                                  (1 << 0)
 | 
				
			||||||
 | 
					#define	SMC_SYSCON_CLOCK_CNTL_0				0x80000004
 | 
				
			||||||
 | 
					#       define CK_DISABLE                               (1 << 0)
 | 
				
			||||||
 | 
					#       define CKEN                                     (1 << 24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	SMC_SYSCON_MISC_CNTL				0x80000010
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SMC_SYSCON_MSG_ARG_0                              0x80000068
 | 
					#define SMC_SYSCON_MSG_ARG_0                              0x80000068
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMC_PC_C                                          0x80000370
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMC_SCRATCH9                                      0x80000424
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RCU_UC_EVENTS                                     0xC0000004
 | 
				
			||||||
 | 
					#       define BOOT_SEQ_DONE                              (1 << 7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GENERAL_PWRMGT                                    0xC0200000
 | 
					#define GENERAL_PWRMGT                                    0xC0200000
 | 
				
			||||||
#       define GLOBAL_PWRMGT_EN                           (1 << 0)
 | 
					#       define GLOBAL_PWRMGT_EN                           (1 << 0)
 | 
				
			||||||
 | 
					#       define STATIC_PM_EN                               (1 << 1)
 | 
				
			||||||
 | 
					#       define THERMAL_PROTECTION_DIS                     (1 << 2)
 | 
				
			||||||
 | 
					#       define THERMAL_PROTECTION_TYPE                    (1 << 3)
 | 
				
			||||||
 | 
					#       define SW_SMIO_INDEX(x)                           ((x) << 6)
 | 
				
			||||||
 | 
					#       define SW_SMIO_INDEX_MASK                         (1 << 6)
 | 
				
			||||||
 | 
					#       define SW_SMIO_INDEX_SHIFT                        6
 | 
				
			||||||
 | 
					#       define VOLT_PWRMGT_EN                             (1 << 10)
 | 
				
			||||||
#       define GPU_COUNTER_CLK                            (1 << 15)
 | 
					#       define GPU_COUNTER_CLK                            (1 << 15)
 | 
				
			||||||
 | 
					#       define DYN_SPREAD_SPECTRUM_EN                     (1 << 23)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CNB_PWRMGT_CNTL                                   0xC0200004
 | 
				
			||||||
 | 
					#       define GNB_SLOW_MODE(x)                           ((x) << 0)
 | 
				
			||||||
 | 
					#       define GNB_SLOW_MODE_MASK                         (3 << 0)
 | 
				
			||||||
 | 
					#       define GNB_SLOW_MODE_SHIFT                        0
 | 
				
			||||||
 | 
					#       define GNB_SLOW                                   (1 << 2)
 | 
				
			||||||
 | 
					#       define FORCE_NB_PS1                               (1 << 3)
 | 
				
			||||||
 | 
					#       define DPM_ENABLED                                (1 << 4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SCLK_PWRMGT_CNTL                                  0xC0200008
 | 
					#define SCLK_PWRMGT_CNTL                                  0xC0200008
 | 
				
			||||||
 | 
					#       define SCLK_PWRMGT_OFF                            (1 << 0)
 | 
				
			||||||
#       define RESET_BUSY_CNT                             (1 << 4)
 | 
					#       define RESET_BUSY_CNT                             (1 << 4)
 | 
				
			||||||
#       define RESET_SCLK_CNT                             (1 << 5)
 | 
					#       define RESET_SCLK_CNT                             (1 << 5)
 | 
				
			||||||
#       define DYNAMIC_PM_EN                              (1 << 21)
 | 
					#       define DYNAMIC_PM_EN                              (1 << 21)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CG_SSP                                            0xC0200044
 | 
				
			||||||
 | 
					#       define SST(x)                                     ((x) << 0)
 | 
				
			||||||
 | 
					#       define SST_MASK                                   (0xffff << 0)
 | 
				
			||||||
 | 
					#       define SSTU(x)                                    ((x) << 16)
 | 
				
			||||||
 | 
					#       define SSTU_MASK                                  (0xf << 16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CG_DISPLAY_GAP_CNTL                               0xC0200060
 | 
				
			||||||
 | 
					#       define DISP_GAP(x)                                ((x) << 0)
 | 
				
			||||||
 | 
					#       define DISP_GAP_MASK                              (3 << 0)
 | 
				
			||||||
 | 
					#       define VBI_TIMER_COUNT(x)                         ((x) << 4)
 | 
				
			||||||
 | 
					#       define VBI_TIMER_COUNT_MASK                       (0x3fff << 4)
 | 
				
			||||||
 | 
					#       define VBI_TIMER_UNIT(x)                          ((x) << 20)
 | 
				
			||||||
 | 
					#       define VBI_TIMER_UNIT_MASK                        (7 << 20)
 | 
				
			||||||
 | 
					#       define DISP_GAP_MCHG(x)                           ((x) << 24)
 | 
				
			||||||
 | 
					#       define DISP_GAP_MCHG_MASK                         (3 << 24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CG_ULV_PARAMETER                                  0xC0200158
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CG_FTV_0                                          0xC02001A8
 | 
					#define CG_FTV_0                                          0xC02001A8
 | 
				
			||||||
 | 
					#define CG_FTV_1                                          0xC02001AC
 | 
				
			||||||
 | 
					#define CG_FTV_2                                          0xC02001B0
 | 
				
			||||||
 | 
					#define CG_FTV_3                                          0xC02001B4
 | 
				
			||||||
 | 
					#define CG_FTV_4                                          0xC02001B8
 | 
				
			||||||
 | 
					#define CG_FTV_5                                          0xC02001BC
 | 
				
			||||||
 | 
					#define CG_FTV_6                                          0xC02001C0
 | 
				
			||||||
 | 
					#define CG_FTV_7                                          0xC02001C4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CG_DISPLAY_GAP_CNTL2                              0xC0200230
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LCAC_SX0_OVR_SEL                                  0xC0400D04
 | 
					#define LCAC_SX0_OVR_SEL                                  0xC0400D04
 | 
				
			||||||
#define LCAC_SX0_OVR_VAL                                  0xC0400D08
 | 
					#define LCAC_SX0_OVR_VAL                                  0xC0400D08
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LCAC_MC0_CNTL                                     0xC0400D30
 | 
				
			||||||
#define LCAC_MC0_OVR_SEL                                  0xC0400D34
 | 
					#define LCAC_MC0_OVR_SEL                                  0xC0400D34
 | 
				
			||||||
#define LCAC_MC0_OVR_VAL                                  0xC0400D38
 | 
					#define LCAC_MC0_OVR_VAL                                  0xC0400D38
 | 
				
			||||||
 | 
					#define LCAC_MC1_CNTL                                     0xC0400D3C
 | 
				
			||||||
#define LCAC_MC1_OVR_SEL                                  0xC0400D40
 | 
					#define LCAC_MC1_OVR_SEL                                  0xC0400D40
 | 
				
			||||||
#define LCAC_MC1_OVR_VAL                                  0xC0400D44
 | 
					#define LCAC_MC1_OVR_VAL                                  0xC0400D44
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,9 +155,28 @@
 | 
				
			||||||
#define LCAC_MC3_OVR_SEL                                  0xC0400D58
 | 
					#define LCAC_MC3_OVR_SEL                                  0xC0400D58
 | 
				
			||||||
#define LCAC_MC3_OVR_VAL                                  0xC0400D5C
 | 
					#define LCAC_MC3_OVR_VAL                                  0xC0400D5C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LCAC_CPL_CNTL                                     0xC0400D80
 | 
				
			||||||
#define LCAC_CPL_OVR_SEL                                  0xC0400D84
 | 
					#define LCAC_CPL_OVR_SEL                                  0xC0400D84
 | 
				
			||||||
#define LCAC_CPL_OVR_VAL                                  0xC0400D88
 | 
					#define LCAC_CPL_OVR_VAL                                  0xC0400D88
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* dGPU */
 | 
				
			||||||
 | 
					#define	CG_THERMAL_CTRL					0xC0300004
 | 
				
			||||||
 | 
					#define 	DPM_EVENT_SRC(x)			((x) << 0)
 | 
				
			||||||
 | 
					#define 	DPM_EVENT_SRC_MASK			(7 << 0)
 | 
				
			||||||
 | 
					#define		DIG_THERM_DPM(x)			((x) << 14)
 | 
				
			||||||
 | 
					#define		DIG_THERM_DPM_MASK			0x003FC000
 | 
				
			||||||
 | 
					#define		DIG_THERM_DPM_SHIFT			14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CG_THERMAL_INT					0xC030000C
 | 
				
			||||||
 | 
					#define		CI_DIG_THERM_INTH(x)			((x) << 8)
 | 
				
			||||||
 | 
					#define		CI_DIG_THERM_INTH_MASK			0x0000FF00
 | 
				
			||||||
 | 
					#define		CI_DIG_THERM_INTH_SHIFT			8
 | 
				
			||||||
 | 
					#define		CI_DIG_THERM_INTL(x)			((x) << 16)
 | 
				
			||||||
 | 
					#define		CI_DIG_THERM_INTL_MASK			0x00FF0000
 | 
				
			||||||
 | 
					#define		CI_DIG_THERM_INTL_SHIFT			16
 | 
				
			||||||
 | 
					#define 	THERM_INT_MASK_HIGH			(1 << 24)
 | 
				
			||||||
 | 
					#define 	THERM_INT_MASK_LOW			(1 << 25)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	CG_MULT_THERMAL_STATUS				0xC0300014
 | 
					#define	CG_MULT_THERMAL_STATUS				0xC0300014
 | 
				
			||||||
#define		ASIC_MAX_TEMP(x)			((x) << 0)
 | 
					#define		ASIC_MAX_TEMP(x)			((x) << 0)
 | 
				
			||||||
#define		ASIC_MAX_TEMP_MASK			0x000001ff
 | 
					#define		ASIC_MAX_TEMP_MASK			0x000001ff
 | 
				
			||||||
| 
						 | 
					@ -89,6 +185,35 @@
 | 
				
			||||||
#define		CTF_TEMP_MASK				0x0003fe00
 | 
					#define		CTF_TEMP_MASK				0x0003fe00
 | 
				
			||||||
#define		CTF_TEMP_SHIFT				9
 | 
					#define		CTF_TEMP_SHIFT				9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CG_SPLL_FUNC_CNTL				0xC0500140
 | 
				
			||||||
 | 
					#define		SPLL_RESET				(1 << 0)
 | 
				
			||||||
 | 
					#define		SPLL_PWRON				(1 << 1)
 | 
				
			||||||
 | 
					#define		SPLL_BYPASS_EN				(1 << 3)
 | 
				
			||||||
 | 
					#define		SPLL_REF_DIV(x)				((x) << 5)
 | 
				
			||||||
 | 
					#define		SPLL_REF_DIV_MASK			(0x3f << 5)
 | 
				
			||||||
 | 
					#define		SPLL_PDIV_A(x)				((x) << 20)
 | 
				
			||||||
 | 
					#define		SPLL_PDIV_A_MASK			(0x7f << 20)
 | 
				
			||||||
 | 
					#define		SPLL_PDIV_A_SHIFT			20
 | 
				
			||||||
 | 
					#define	CG_SPLL_FUNC_CNTL_2				0xC0500144
 | 
				
			||||||
 | 
					#define		SCLK_MUX_SEL(x)				((x) << 0)
 | 
				
			||||||
 | 
					#define		SCLK_MUX_SEL_MASK			(0x1ff << 0)
 | 
				
			||||||
 | 
					#define	CG_SPLL_FUNC_CNTL_3				0xC0500148
 | 
				
			||||||
 | 
					#define		SPLL_FB_DIV(x)				((x) << 0)
 | 
				
			||||||
 | 
					#define		SPLL_FB_DIV_MASK			(0x3ffffff << 0)
 | 
				
			||||||
 | 
					#define		SPLL_FB_DIV_SHIFT			0
 | 
				
			||||||
 | 
					#define		SPLL_DITHEN				(1 << 28)
 | 
				
			||||||
 | 
					#define	CG_SPLL_FUNC_CNTL_4				0xC050014C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	CG_SPLL_SPREAD_SPECTRUM				0xC0500164
 | 
				
			||||||
 | 
					#define		SSEN					(1 << 0)
 | 
				
			||||||
 | 
					#define		CLK_S(x)				((x) << 4)
 | 
				
			||||||
 | 
					#define		CLK_S_MASK				(0xfff << 4)
 | 
				
			||||||
 | 
					#define		CLK_S_SHIFT				4
 | 
				
			||||||
 | 
					#define	CG_SPLL_SPREAD_SPECTRUM_2			0xC0500168
 | 
				
			||||||
 | 
					#define		CLK_V(x)				((x) << 0)
 | 
				
			||||||
 | 
					#define		CLK_V_MASK				(0x3ffffff << 0)
 | 
				
			||||||
 | 
					#define		CLK_V_SHIFT				0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	MPLL_BYPASSCLK_SEL				0xC050019C
 | 
					#define	MPLL_BYPASSCLK_SEL				0xC050019C
 | 
				
			||||||
#	define MPLL_CLKOUT_SEL(x)			((x) << 8)
 | 
					#	define MPLL_CLKOUT_SEL(x)			((x) << 8)
 | 
				
			||||||
#	define MPLL_CLKOUT_SEL_MASK			0xFF00
 | 
					#	define MPLL_CLKOUT_SEL_MASK			0xFF00
 | 
				
			||||||
| 
						 | 
					@ -109,6 +234,7 @@
 | 
				
			||||||
#	define ZCLK_SEL(x)				((x) << 8)
 | 
					#	define ZCLK_SEL(x)				((x) << 8)
 | 
				
			||||||
#	define ZCLK_SEL_MASK				0xFF00
 | 
					#	define ZCLK_SEL_MASK				0xFF00
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* KV/KB */
 | 
				
			||||||
#define	CG_THERMAL_INT_CTRL				0xC2100028
 | 
					#define	CG_THERMAL_INT_CTRL				0xC2100028
 | 
				
			||||||
#define		DIG_THERM_INTH(x)			((x) << 0)
 | 
					#define		DIG_THERM_INTH(x)			((x) << 0)
 | 
				
			||||||
#define		DIG_THERM_INTH_MASK			0x000000FF
 | 
					#define		DIG_THERM_INTH_MASK			0x000000FF
 | 
				
			||||||
| 
						 | 
					@ -437,9 +563,37 @@
 | 
				
			||||||
#define		NOOFGROUPS_SHIFT				12
 | 
					#define		NOOFGROUPS_SHIFT				12
 | 
				
			||||||
#define		NOOFGROUPS_MASK					0x00001000
 | 
					#define		NOOFGROUPS_MASK					0x00001000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	MC_ARB_DRAM_TIMING				0x2774
 | 
				
			||||||
 | 
					#define	MC_ARB_DRAM_TIMING2				0x2778
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_ARB_BURST_TIME                               0x2808
 | 
				
			||||||
 | 
					#define		STATE0(x)				((x) << 0)
 | 
				
			||||||
 | 
					#define		STATE0_MASK				(0x1f << 0)
 | 
				
			||||||
 | 
					#define		STATE0_SHIFT				0
 | 
				
			||||||
 | 
					#define		STATE1(x)				((x) << 5)
 | 
				
			||||||
 | 
					#define		STATE1_MASK				(0x1f << 5)
 | 
				
			||||||
 | 
					#define		STATE1_SHIFT				5
 | 
				
			||||||
 | 
					#define		STATE2(x)				((x) << 10)
 | 
				
			||||||
 | 
					#define		STATE2_MASK				(0x1f << 10)
 | 
				
			||||||
 | 
					#define		STATE2_SHIFT				10
 | 
				
			||||||
 | 
					#define		STATE3(x)				((x) << 15)
 | 
				
			||||||
 | 
					#define		STATE3_MASK				(0x1f << 15)
 | 
				
			||||||
 | 
					#define		STATE3_SHIFT				15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_RAS_TIMING                               0x28a0
 | 
				
			||||||
 | 
					#define MC_SEQ_CAS_TIMING                               0x28a4
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC_TIMING                              0x28a8
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC_TIMING2                             0x28ac
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_TIMING                               0x28b0
 | 
				
			||||||
 | 
					#define MC_SEQ_RD_CTL_D0                                0x28b4
 | 
				
			||||||
 | 
					#define MC_SEQ_RD_CTL_D1                                0x28b8
 | 
				
			||||||
 | 
					#define MC_SEQ_WR_CTL_D0                                0x28bc
 | 
				
			||||||
 | 
					#define MC_SEQ_WR_CTL_D1                                0x28c0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MC_SEQ_SUP_CNTL           			0x28c8
 | 
					#define MC_SEQ_SUP_CNTL           			0x28c8
 | 
				
			||||||
#define		RUN_MASK      				(1 << 0)
 | 
					#define		RUN_MASK      				(1 << 0)
 | 
				
			||||||
#define MC_SEQ_SUP_PGM           			0x28cc
 | 
					#define MC_SEQ_SUP_PGM           			0x28cc
 | 
				
			||||||
 | 
					#define MC_PMG_AUTO_CMD           			0x28d0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	MC_SEQ_TRAIN_WAKEUP_CNTL			0x28e8
 | 
					#define	MC_SEQ_TRAIN_WAKEUP_CNTL			0x28e8
 | 
				
			||||||
#define		TRAIN_DONE_D0      			(1 << 30)
 | 
					#define		TRAIN_DONE_D0      			(1 << 30)
 | 
				
			||||||
| 
						 | 
					@ -448,9 +602,90 @@
 | 
				
			||||||
#define MC_IO_PAD_CNTL_D0           			0x29d0
 | 
					#define MC_IO_PAD_CNTL_D0           			0x29d0
 | 
				
			||||||
#define		MEM_FALL_OUT_CMD      			(1 << 8)
 | 
					#define		MEM_FALL_OUT_CMD      			(1 << 8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC0           				0x2a00
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_VEN_ID_SHIFT               8
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_VEN_ID_MASK                0x00000f00
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_VEN_ID_VALUE               3
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_REV_ID_SHIFT               12
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_REV_ID_MASK                0x0000f000
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_REV_ID_VALUE               1
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_GDDR5_SHIFT                28
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_GDDR5_MASK                 0xf0000000
 | 
				
			||||||
 | 
					#define 	MC_SEQ_MISC0_GDDR5_VALUE                5
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC1                                    0x2a04
 | 
				
			||||||
 | 
					#define MC_SEQ_RESERVE_M                                0x2a08
 | 
				
			||||||
 | 
					#define MC_PMG_CMD_EMRS                                 0x2a0c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MC_SEQ_IO_DEBUG_INDEX           		0x2a44
 | 
					#define MC_SEQ_IO_DEBUG_INDEX           		0x2a44
 | 
				
			||||||
#define MC_SEQ_IO_DEBUG_DATA           			0x2a48
 | 
					#define MC_SEQ_IO_DEBUG_DATA           			0x2a48
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC5                                    0x2a54
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC6                                    0x2a58
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC7                                    0x2a64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_RAS_TIMING_LP                            0x2a6c
 | 
				
			||||||
 | 
					#define MC_SEQ_CAS_TIMING_LP                            0x2a70
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC_TIMING_LP                           0x2a74
 | 
				
			||||||
 | 
					#define MC_SEQ_MISC_TIMING2_LP                          0x2a78
 | 
				
			||||||
 | 
					#define MC_SEQ_WR_CTL_D0_LP                             0x2a7c
 | 
				
			||||||
 | 
					#define MC_SEQ_WR_CTL_D1_LP                             0x2a80
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_CMD_EMRS_LP                          0x2a84
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_CMD_MRS_LP                           0x2a88
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_PMG_CMD_MRS                                  0x2aac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_RD_CTL_D0_LP                             0x2b1c
 | 
				
			||||||
 | 
					#define MC_SEQ_RD_CTL_D1_LP                             0x2b20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_PMG_CMD_MRS1                                 0x2b44
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_CMD_MRS1_LP                          0x2b48
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_TIMING_LP                            0x2b4c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_WR_CTL_2                                 0x2b54
 | 
				
			||||||
 | 
					#define MC_SEQ_WR_CTL_2_LP                              0x2b58
 | 
				
			||||||
 | 
					#define MC_PMG_CMD_MRS2                                 0x2b5c
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_CMD_MRS2_LP                          0x2b60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	MCLK_PWRMGT_CNTL				0x2ba0
 | 
				
			||||||
 | 
					#       define DLL_SPEED(x)				((x) << 0)
 | 
				
			||||||
 | 
					#       define DLL_SPEED_MASK				(0x1f << 0)
 | 
				
			||||||
 | 
					#       define DLL_READY                                (1 << 6)
 | 
				
			||||||
 | 
					#       define MC_INT_CNTL                              (1 << 7)
 | 
				
			||||||
 | 
					#       define MRDCK0_PDNB                              (1 << 8)
 | 
				
			||||||
 | 
					#       define MRDCK1_PDNB                              (1 << 9)
 | 
				
			||||||
 | 
					#       define MRDCK0_RESET                             (1 << 16)
 | 
				
			||||||
 | 
					#       define MRDCK1_RESET                             (1 << 17)
 | 
				
			||||||
 | 
					#       define DLL_READY_READ                           (1 << 24)
 | 
				
			||||||
 | 
					#define	DLL_CNTL					0x2ba4
 | 
				
			||||||
 | 
					#       define MRDCK0_BYPASS                            (1 << 24)
 | 
				
			||||||
 | 
					#       define MRDCK1_BYPASS                            (1 << 25)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	MPLL_FUNC_CNTL					0x2bb4
 | 
				
			||||||
 | 
					#define		BWCTRL(x)				((x) << 20)
 | 
				
			||||||
 | 
					#define		BWCTRL_MASK				(0xff << 20)
 | 
				
			||||||
 | 
					#define	MPLL_FUNC_CNTL_1				0x2bb8
 | 
				
			||||||
 | 
					#define		VCO_MODE(x)				((x) << 0)
 | 
				
			||||||
 | 
					#define		VCO_MODE_MASK				(3 << 0)
 | 
				
			||||||
 | 
					#define		CLKFRAC(x)				((x) << 4)
 | 
				
			||||||
 | 
					#define		CLKFRAC_MASK				(0xfff << 4)
 | 
				
			||||||
 | 
					#define		CLKF(x)					((x) << 16)
 | 
				
			||||||
 | 
					#define		CLKF_MASK				(0xfff << 16)
 | 
				
			||||||
 | 
					#define	MPLL_FUNC_CNTL_2				0x2bbc
 | 
				
			||||||
 | 
					#define	MPLL_AD_FUNC_CNTL				0x2bc0
 | 
				
			||||||
 | 
					#define		YCLK_POST_DIV(x)			((x) << 0)
 | 
				
			||||||
 | 
					#define		YCLK_POST_DIV_MASK			(7 << 0)
 | 
				
			||||||
 | 
					#define	MPLL_DQ_FUNC_CNTL				0x2bc4
 | 
				
			||||||
 | 
					#define		YCLK_SEL(x)				((x) << 4)
 | 
				
			||||||
 | 
					#define		YCLK_SEL_MASK				(1 << 4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	MPLL_SS1					0x2bcc
 | 
				
			||||||
 | 
					#define		CLKV(x)					((x) << 0)
 | 
				
			||||||
 | 
					#define		CLKV_MASK				(0x3ffffff << 0)
 | 
				
			||||||
 | 
					#define	MPLL_SS2					0x2bd0
 | 
				
			||||||
 | 
					#define		CLKS(x)					((x) << 0)
 | 
				
			||||||
 | 
					#define		CLKS_MASK				(0xfff << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	HDP_HOST_PATH_CNTL				0x2C00
 | 
					#define	HDP_HOST_PATH_CNTL				0x2C00
 | 
				
			||||||
#define 	CLOCK_GATING_DIS			(1 << 23)
 | 
					#define 	CLOCK_GATING_DIS			(1 << 23)
 | 
				
			||||||
#define	HDP_NONSURFACE_BASE				0x2C04
 | 
					#define	HDP_NONSURFACE_BASE				0x2C04
 | 
				
			||||||
| 
						 | 
					@ -465,6 +700,22 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ATC_MISC_CG           				0x3350
 | 
					#define ATC_MISC_CG           				0x3350
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_CNTL_3                                     0x3600
 | 
				
			||||||
 | 
					#       define CAC_EN                                     (1 << 31)
 | 
				
			||||||
 | 
					#define MC_SEQ_G5PDX_CTRL                                 0x3604
 | 
				
			||||||
 | 
					#define MC_SEQ_G5PDX_CTRL_LP                              0x3608
 | 
				
			||||||
 | 
					#define MC_SEQ_G5PDX_CMD0                                 0x360c
 | 
				
			||||||
 | 
					#define MC_SEQ_G5PDX_CMD0_LP                              0x3610
 | 
				
			||||||
 | 
					#define MC_SEQ_G5PDX_CMD1                                 0x3614
 | 
				
			||||||
 | 
					#define MC_SEQ_G5PDX_CMD1_LP                              0x3618
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_DVS_CTL                                0x3628
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_DVS_CTL_LP                             0x362c
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_DVS_CMD                                0x3630
 | 
				
			||||||
 | 
					#define MC_SEQ_PMG_DVS_CMD_LP                             0x3634
 | 
				
			||||||
 | 
					#define MC_SEQ_DLL_STBY                                   0x3638
 | 
				
			||||||
 | 
					#define MC_SEQ_DLL_STBY_LP                                0x363c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IH_RB_CNTL                                        0x3e00
 | 
					#define IH_RB_CNTL                                        0x3e00
 | 
				
			||||||
#       define IH_RB_ENABLE                               (1 << 0)
 | 
					#       define IH_RB_ENABLE                               (1 << 0)
 | 
				
			||||||
#       define IH_RB_SIZE(x)                              ((x) << 1) /* log2 */
 | 
					#       define IH_RB_SIZE(x)                              ((x) << 1) /* log2 */
 | 
				
			||||||
| 
						 | 
					@ -492,6 +743,9 @@
 | 
				
			||||||
#       define MC_WR_CLEAN_CNT(x)                         ((x) << 20)
 | 
					#       define MC_WR_CLEAN_CNT(x)                         ((x) << 20)
 | 
				
			||||||
#       define MC_VMID(x)                                 ((x) << 25)
 | 
					#       define MC_VMID(x)                                 ((x) << 25)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	BIF_LNCNT_RESET					0x5220
 | 
				
			||||||
 | 
					#       define RESET_LNCNT_EN                           (1 << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	CONFIG_MEMSIZE					0x5428
 | 
					#define	CONFIG_MEMSIZE					0x5428
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define INTERRUPT_CNTL                                    0x5468
 | 
					#define INTERRUPT_CNTL                                    0x5468
 | 
				
			||||||
| 
						 | 
					@ -628,6 +882,9 @@
 | 
				
			||||||
#       define DC_HPDx_RX_INT_TIMER(x)                    ((x) << 16)
 | 
					#       define DC_HPDx_RX_INT_TIMER(x)                    ((x) << 16)
 | 
				
			||||||
#       define DC_HPDx_EN                                 (1 << 28)
 | 
					#       define DC_HPDx_EN                                 (1 << 28)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DPG_PIPE_STUTTER_CONTROL                          0x6cd4
 | 
				
			||||||
 | 
					#       define STUTTER_ENABLE                             (1 << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	GRBM_CNTL					0x8000
 | 
					#define	GRBM_CNTL					0x8000
 | 
				
			||||||
#define		GRBM_READ_TIMEOUT(x)				((x) << 0)
 | 
					#define		GRBM_READ_TIMEOUT(x)				((x) << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,7 +99,7 @@ typedef uint8_t PPSMC_Result;
 | 
				
			||||||
#define PPSMC_MSG_ThrottleOVRDSCLKDS        ((uint8_t)0x96)
 | 
					#define PPSMC_MSG_ThrottleOVRDSCLKDS        ((uint8_t)0x96)
 | 
				
			||||||
#define PPSMC_MSG_CancelThrottleOVRDSCLKDS  ((uint8_t)0x97)
 | 
					#define PPSMC_MSG_CancelThrottleOVRDSCLKDS  ((uint8_t)0x97)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* KV/KB */
 | 
					/* CI/KV/KB */
 | 
				
			||||||
#define PPSMC_MSG_UVDDPM_SetEnabledMask       ((uint16_t) 0x12D)
 | 
					#define PPSMC_MSG_UVDDPM_SetEnabledMask       ((uint16_t) 0x12D)
 | 
				
			||||||
#define PPSMC_MSG_VCEDPM_SetEnabledMask       ((uint16_t) 0x12E)
 | 
					#define PPSMC_MSG_VCEDPM_SetEnabledMask       ((uint16_t) 0x12E)
 | 
				
			||||||
#define PPSMC_MSG_ACPDPM_SetEnabledMask       ((uint16_t) 0x12F)
 | 
					#define PPSMC_MSG_ACPDPM_SetEnabledMask       ((uint16_t) 0x12F)
 | 
				
			||||||
| 
						 | 
					@ -108,6 +108,7 @@ typedef uint8_t PPSMC_Result;
 | 
				
			||||||
#define PPSMC_MSG_MCLKDPM_NoForcedLevel       ((uint16_t) 0x132)
 | 
					#define PPSMC_MSG_MCLKDPM_NoForcedLevel       ((uint16_t) 0x132)
 | 
				
			||||||
#define PPSMC_MSG_Voltage_Cntl_Disable        ((uint16_t) 0x135)
 | 
					#define PPSMC_MSG_Voltage_Cntl_Disable        ((uint16_t) 0x135)
 | 
				
			||||||
#define PPSMC_MSG_PCIeDPM_Enable              ((uint16_t) 0x136)
 | 
					#define PPSMC_MSG_PCIeDPM_Enable              ((uint16_t) 0x136)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_PCIeDPM_Disable             ((uint16_t) 0x13d)
 | 
				
			||||||
#define PPSMC_MSG_ACPPowerOFF                 ((uint16_t) 0x137)
 | 
					#define PPSMC_MSG_ACPPowerOFF                 ((uint16_t) 0x137)
 | 
				
			||||||
#define PPSMC_MSG_ACPPowerON                  ((uint16_t) 0x138)
 | 
					#define PPSMC_MSG_ACPPowerON                  ((uint16_t) 0x138)
 | 
				
			||||||
#define PPSMC_MSG_SAMPowerOFF                 ((uint16_t) 0x139)
 | 
					#define PPSMC_MSG_SAMPowerOFF                 ((uint16_t) 0x139)
 | 
				
			||||||
| 
						 | 
					@ -116,8 +117,13 @@ typedef uint8_t PPSMC_Result;
 | 
				
			||||||
#define PPSMC_MSG_NBDPM_Enable                ((uint16_t) 0x140)
 | 
					#define PPSMC_MSG_NBDPM_Enable                ((uint16_t) 0x140)
 | 
				
			||||||
#define PPSMC_MSG_NBDPM_Disable               ((uint16_t) 0x141)
 | 
					#define PPSMC_MSG_NBDPM_Disable               ((uint16_t) 0x141)
 | 
				
			||||||
#define PPSMC_MSG_SCLKDPM_SetEnabledMask      ((uint16_t) 0x145)
 | 
					#define PPSMC_MSG_SCLKDPM_SetEnabledMask      ((uint16_t) 0x145)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MCLKDPM_SetEnabledMask      ((uint16_t) 0x146)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_PCIeDPM_ForceLevel          ((uint16_t) 0x147)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_EnableVRHotGPIOInterrupt    ((uint16_t) 0x14a)
 | 
				
			||||||
#define PPSMC_MSG_DPM_Enable                  ((uint16_t) 0x14e)
 | 
					#define PPSMC_MSG_DPM_Enable                  ((uint16_t) 0x14e)
 | 
				
			||||||
#define PPSMC_MSG_DPM_Disable                 ((uint16_t) 0x14f)
 | 
					#define PPSMC_MSG_DPM_Disable                 ((uint16_t) 0x14f)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MCLKDPM_Enable              ((uint16_t) 0x150)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MCLKDPM_Disable             ((uint16_t) 0x151)
 | 
				
			||||||
#define PPSMC_MSG_UVDDPM_Enable               ((uint16_t) 0x154)
 | 
					#define PPSMC_MSG_UVDDPM_Enable               ((uint16_t) 0x154)
 | 
				
			||||||
#define PPSMC_MSG_UVDDPM_Disable              ((uint16_t) 0x155)
 | 
					#define PPSMC_MSG_UVDDPM_Disable              ((uint16_t) 0x155)
 | 
				
			||||||
#define PPSMC_MSG_SAMUDPM_Enable              ((uint16_t) 0x156)
 | 
					#define PPSMC_MSG_SAMUDPM_Enable              ((uint16_t) 0x156)
 | 
				
			||||||
| 
						 | 
					@ -126,9 +132,25 @@ typedef uint8_t PPSMC_Result;
 | 
				
			||||||
#define PPSMC_MSG_ACPDPM_Disable              ((uint16_t) 0x159)
 | 
					#define PPSMC_MSG_ACPDPM_Disable              ((uint16_t) 0x159)
 | 
				
			||||||
#define PPSMC_MSG_VCEDPM_Enable               ((uint16_t) 0x15a)
 | 
					#define PPSMC_MSG_VCEDPM_Enable               ((uint16_t) 0x15a)
 | 
				
			||||||
#define PPSMC_MSG_VCEDPM_Disable              ((uint16_t) 0x15b)
 | 
					#define PPSMC_MSG_VCEDPM_Disable              ((uint16_t) 0x15b)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_VddC_Request                ((uint16_t) 0x15f)
 | 
				
			||||||
#define PPSMC_MSG_SCLKDPM_GetEnabledMask      ((uint16_t) 0x162)
 | 
					#define PPSMC_MSG_SCLKDPM_GetEnabledMask      ((uint16_t) 0x162)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_PCIeDPM_SetEnabledMask      ((uint16_t) 0x167)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_TDCLimitEnable              ((uint16_t) 0x169)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_TDCLimitDisable             ((uint16_t) 0x16a)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_PkgPwrLimitEnable           ((uint16_t) 0x185)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_PkgPwrLimitDisable          ((uint16_t) 0x186)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_PkgPwrSetLimit              ((uint16_t) 0x187)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_OverDriveSetTargetTdp       ((uint16_t) 0x188)
 | 
				
			||||||
#define PPSMC_MSG_SCLKDPM_FreezeLevel         ((uint16_t) 0x189)
 | 
					#define PPSMC_MSG_SCLKDPM_FreezeLevel         ((uint16_t) 0x189)
 | 
				
			||||||
#define PPSMC_MSG_SCLKDPM_UnfreezeLevel       ((uint16_t) 0x18A)
 | 
					#define PPSMC_MSG_SCLKDPM_UnfreezeLevel       ((uint16_t) 0x18A)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MCLKDPM_FreezeLevel         ((uint16_t) 0x18B)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MCLKDPM_UnfreezeLevel       ((uint16_t) 0x18C)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MASTER_DeepSleep_ON         ((uint16_t) 0x18F)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_MASTER_DeepSleep_OFF        ((uint16_t) 0x190)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_Remove_DC_Clamp             ((uint16_t) 0x191)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PPSMC_MSG_API_GetSclkFrequency        ((uint16_t) 0x200)
 | 
				
			||||||
 | 
					#define PPSMC_MSG_API_GetMclkFrequency        ((uint16_t) 0x201)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TN */
 | 
					/* TN */
 | 
				
			||||||
#define PPSMC_MSG_DPM_Config                ((uint32_t) 0x102)
 | 
					#define PPSMC_MSG_DPM_Config                ((uint32_t) 0x102)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -246,6 +246,12 @@ int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
 | 
				
			||||||
int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev,
 | 
					int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev,
 | 
				
			||||||
						      u16 *voltage,
 | 
											      u16 *voltage,
 | 
				
			||||||
						      u16 leakage_idx);
 | 
											      u16 leakage_idx);
 | 
				
			||||||
 | 
					int radeon_atom_get_leakage_id_from_vbios(struct radeon_device *rdev,
 | 
				
			||||||
 | 
										  u16 *leakage_id);
 | 
				
			||||||
 | 
					int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *rdev,
 | 
				
			||||||
 | 
												 u16 *vddc, u16 *vddci,
 | 
				
			||||||
 | 
												 u16 virtual_voltage_id,
 | 
				
			||||||
 | 
												 u16 vbios_voltage_id);
 | 
				
			||||||
int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
 | 
					int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
 | 
				
			||||||
				      u8 voltage_type,
 | 
									      u8 voltage_type,
 | 
				
			||||||
				      u16 nominal_voltage,
 | 
									      u16 nominal_voltage,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2454,6 +2454,20 @@ static struct radeon_asic ci_asic = {
 | 
				
			||||||
		.set_uvd_clocks = &cik_set_uvd_clocks,
 | 
							.set_uvd_clocks = &cik_set_uvd_clocks,
 | 
				
			||||||
		.get_temperature = &ci_get_temp,
 | 
							.get_temperature = &ci_get_temp,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						.dpm = {
 | 
				
			||||||
 | 
							.init = &ci_dpm_init,
 | 
				
			||||||
 | 
							.setup_asic = &ci_dpm_setup_asic,
 | 
				
			||||||
 | 
							.enable = &ci_dpm_enable,
 | 
				
			||||||
 | 
							.disable = &ci_dpm_disable,
 | 
				
			||||||
 | 
							.pre_set_power_state = &ci_dpm_pre_set_power_state,
 | 
				
			||||||
 | 
							.set_power_state = &ci_dpm_set_power_state,
 | 
				
			||||||
 | 
							.post_set_power_state = &ci_dpm_post_set_power_state,
 | 
				
			||||||
 | 
							.display_configuration_changed = &ci_dpm_display_configuration_changed,
 | 
				
			||||||
 | 
							.fini = &ci_dpm_fini,
 | 
				
			||||||
 | 
							.get_sclk = &ci_dpm_get_sclk,
 | 
				
			||||||
 | 
							.get_mclk = &ci_dpm_get_mclk,
 | 
				
			||||||
 | 
							.print_power_state = &ci_dpm_print_power_state,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	.pflip = {
 | 
						.pflip = {
 | 
				
			||||||
		.pre_page_flip = &evergreen_pre_page_flip,
 | 
							.pre_page_flip = &evergreen_pre_page_flip,
 | 
				
			||||||
		.page_flip = &evergreen_page_flip,
 | 
							.page_flip = &evergreen_page_flip,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -750,6 +750,20 @@ void cik_compute_ring_set_wptr(struct radeon_device *rdev,
 | 
				
			||||||
int ci_get_temp(struct radeon_device *rdev);
 | 
					int ci_get_temp(struct radeon_device *rdev);
 | 
				
			||||||
int kv_get_temp(struct radeon_device *rdev);
 | 
					int kv_get_temp(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ci_dpm_init(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					int ci_dpm_enable(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_dpm_disable(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					int ci_dpm_pre_set_power_state(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					int ci_dpm_set_power_state(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_dpm_post_set_power_state(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_dpm_setup_asic(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_dpm_display_configuration_changed(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					void ci_dpm_fini(struct radeon_device *rdev);
 | 
				
			||||||
 | 
					u32 ci_dpm_get_sclk(struct radeon_device *rdev, bool low);
 | 
				
			||||||
 | 
					u32 ci_dpm_get_mclk(struct radeon_device *rdev, bool low);
 | 
				
			||||||
 | 
					void ci_dpm_print_power_state(struct radeon_device *rdev,
 | 
				
			||||||
 | 
								      struct radeon_ps *ps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int kv_dpm_init(struct radeon_device *rdev);
 | 
					int kv_dpm_init(struct radeon_device *rdev);
 | 
				
			||||||
int kv_dpm_enable(struct radeon_device *rdev);
 | 
					int kv_dpm_enable(struct radeon_device *rdev);
 | 
				
			||||||
void kv_dpm_disable(struct radeon_device *rdev);
 | 
					void kv_dpm_disable(struct radeon_device *rdev);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
 | 
					static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
 | 
				
			||||||
							u8 id)
 | 
											 u8 id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct atom_context *ctx = rdev->mode_info.atom_context;
 | 
						struct atom_context *ctx = rdev->mode_info.atom_context;
 | 
				
			||||||
	struct radeon_gpio_rec gpio;
 | 
						struct radeon_gpio_rec gpio;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1202,6 +1202,7 @@ int radeon_pm_init(struct radeon_device *rdev)
 | 
				
			||||||
	case CHIP_VERDE:
 | 
						case CHIP_VERDE:
 | 
				
			||||||
	case CHIP_OLAND:
 | 
						case CHIP_OLAND:
 | 
				
			||||||
	case CHIP_HAINAN:
 | 
						case CHIP_HAINAN:
 | 
				
			||||||
 | 
						case CHIP_BONAIRE:
 | 
				
			||||||
	case CHIP_KABINI:
 | 
						case CHIP_KABINI:
 | 
				
			||||||
	case CHIP_KAVERI:
 | 
						case CHIP_KAVERI:
 | 
				
			||||||
		/* DPM requires the RLC, RV770+ dGPU requires SMC */
 | 
							/* DPM requires the RLC, RV770+ dGPU requires SMC */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,4 +140,7 @@
 | 
				
			||||||
#define HAINAN_SMC_UCODE_START       0x10000
 | 
					#define HAINAN_SMC_UCODE_START       0x10000
 | 
				
			||||||
#define HAINAN_SMC_UCODE_SIZE        0xe67C
 | 
					#define HAINAN_SMC_UCODE_SIZE        0xe67C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BONAIRE_SMC_UCODE_START      0x20000
 | 
				
			||||||
 | 
					#define BONAIRE_SMC_UCODE_SIZE       0x1FDEC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3663,7 +3663,7 @@ static void si_clear_vc(struct radeon_device *rdev)
 | 
				
			||||||
	WREG32(CG_FTV, 0);
 | 
						WREG32(CG_FTV, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock)
 | 
					u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u8 mc_para_index;
 | 
						u8 mc_para_index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3676,7 +3676,7 @@ static u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock)
 | 
				
			||||||
	return mc_para_index;
 | 
						return mc_para_index;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode)
 | 
					u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u8 mc_para_index;
 | 
						u8 mc_para_index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3758,9 +3758,9 @@ static bool si_validate_phase_shedding_tables(struct radeon_device *rdev,
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
 | 
					void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
 | 
				
			||||||
						     u32 max_voltage_steps,
 | 
										      u32 max_voltage_steps,
 | 
				
			||||||
						     struct atom_voltage_table *voltage_table)
 | 
										      struct atom_voltage_table *voltage_table)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i, diff;
 | 
						unsigned int i, diff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										486
									
								
								drivers/gpu/drm/radeon/smu7_discrete.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										486
									
								
								drivers/gpu/drm/radeon/smu7_discrete.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,486 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2013 Advanced Micro Devices, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
				
			||||||
 | 
					 * copy of this software and associated documentation files (the "Software"),
 | 
				
			||||||
 | 
					 * to deal in the Software without restriction, including without limitation
 | 
				
			||||||
 | 
					 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
				
			||||||
 | 
					 * and/or sell copies of the Software, and to permit persons to whom the
 | 
				
			||||||
 | 
					 * Software is furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					 * all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
				
			||||||
 | 
					 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
				
			||||||
 | 
					 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
				
			||||||
 | 
					 * OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SMU7_DISCRETE_H
 | 
				
			||||||
 | 
					#define SMU7_DISCRETE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "smu7.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma pack(push, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMU7_DTE_ITERATIONS 5
 | 
				
			||||||
 | 
					#define SMU7_DTE_SOURCES 3
 | 
				
			||||||
 | 
					#define SMU7_DTE_SINKS 1
 | 
				
			||||||
 | 
					#define SMU7_NUM_CPU_TES 0
 | 
				
			||||||
 | 
					#define SMU7_NUM_GPU_TES 1
 | 
				
			||||||
 | 
					#define SMU7_NUM_NON_TES 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_SoftRegisters
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t        RefClockFrequency;
 | 
				
			||||||
 | 
					    uint32_t        PmTimerP;
 | 
				
			||||||
 | 
					    uint32_t        FeatureEnables;
 | 
				
			||||||
 | 
					    uint32_t        PreVBlankGap;
 | 
				
			||||||
 | 
					    uint32_t        VBlankTimeout;
 | 
				
			||||||
 | 
					    uint32_t        TrainTimeGap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t        MvddSwitchTime;
 | 
				
			||||||
 | 
					    uint32_t        LongestAcpiTrainTime;
 | 
				
			||||||
 | 
					    uint32_t        AcpiDelay;
 | 
				
			||||||
 | 
					    uint32_t        G5TrainTime;
 | 
				
			||||||
 | 
					    uint32_t        DelayMpllPwron;
 | 
				
			||||||
 | 
					    uint32_t        VoltageChangeTimeout;
 | 
				
			||||||
 | 
					    uint32_t        HandshakeDisables;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy1Config;
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy2Config;
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy3Config;
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy4Config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy5Config;
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy6Config;
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy7Config;
 | 
				
			||||||
 | 
					    uint8_t         DisplayPhy8Config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t        AverageGraphicsA;
 | 
				
			||||||
 | 
					    uint32_t        AverageMemoryA;
 | 
				
			||||||
 | 
					    uint32_t        AverageGioA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t         SClkDpmEnabledLevels;
 | 
				
			||||||
 | 
					    uint8_t         MClkDpmEnabledLevels;
 | 
				
			||||||
 | 
					    uint8_t         LClkDpmEnabledLevels;
 | 
				
			||||||
 | 
					    uint8_t         PCIeDpmEnabledLevels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t         UVDDpmEnabledLevels;
 | 
				
			||||||
 | 
					    uint8_t         SAMUDpmEnabledLevels;
 | 
				
			||||||
 | 
					    uint8_t         ACPDpmEnabledLevels;
 | 
				
			||||||
 | 
					    uint8_t         VCEDpmEnabledLevels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t        DRAM_LOG_ADDR_H;
 | 
				
			||||||
 | 
					    uint32_t        DRAM_LOG_ADDR_L;
 | 
				
			||||||
 | 
					    uint32_t        DRAM_LOG_PHY_ADDR_H;
 | 
				
			||||||
 | 
					    uint32_t        DRAM_LOG_PHY_ADDR_L;
 | 
				
			||||||
 | 
					    uint32_t        DRAM_LOG_BUFF_SIZE;
 | 
				
			||||||
 | 
					    uint32_t        UlvEnterC;
 | 
				
			||||||
 | 
					    uint32_t        UlvTime;
 | 
				
			||||||
 | 
					    uint32_t        Reserved[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_SoftRegisters SMU7_SoftRegisters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_VoltageLevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t    Voltage;
 | 
				
			||||||
 | 
					    uint16_t    StdVoltageHiSidd;
 | 
				
			||||||
 | 
					    uint16_t    StdVoltageLoSidd;
 | 
				
			||||||
 | 
					    uint8_t     Smio;
 | 
				
			||||||
 | 
					    uint8_t     padding;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_VoltageLevel SMU7_Discrete_VoltageLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_GraphicsLevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t    Flags;
 | 
				
			||||||
 | 
					    uint32_t    MinVddc;
 | 
				
			||||||
 | 
					    uint32_t    MinVddcPhases;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t    SclkFrequency;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t     padding1[2];
 | 
				
			||||||
 | 
					    uint16_t    ActivityLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t    CgSpllFuncCntl3;
 | 
				
			||||||
 | 
					    uint32_t    CgSpllFuncCntl4;
 | 
				
			||||||
 | 
					    uint32_t    SpllSpreadSpectrum;
 | 
				
			||||||
 | 
					    uint32_t    SpllSpreadSpectrum2;
 | 
				
			||||||
 | 
					    uint32_t    CcPwrDynRm;
 | 
				
			||||||
 | 
					    uint32_t    CcPwrDynRm1;
 | 
				
			||||||
 | 
					    uint8_t     SclkDid;
 | 
				
			||||||
 | 
					    uint8_t     DisplayWatermark;
 | 
				
			||||||
 | 
					    uint8_t     EnabledForActivity;
 | 
				
			||||||
 | 
					    uint8_t     EnabledForThrottle;
 | 
				
			||||||
 | 
					    uint8_t     UpH;
 | 
				
			||||||
 | 
					    uint8_t     DownH;
 | 
				
			||||||
 | 
					    uint8_t     VoltageDownH;
 | 
				
			||||||
 | 
					    uint8_t     PowerThrottle;
 | 
				
			||||||
 | 
					    uint8_t     DeepSleepDivId;
 | 
				
			||||||
 | 
					    uint8_t     padding[3];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_GraphicsLevel SMU7_Discrete_GraphicsLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_ACPILevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t    Flags;
 | 
				
			||||||
 | 
					    uint32_t    MinVddc;
 | 
				
			||||||
 | 
					    uint32_t    MinVddcPhases;
 | 
				
			||||||
 | 
					    uint32_t    SclkFrequency;
 | 
				
			||||||
 | 
					    uint8_t     SclkDid;
 | 
				
			||||||
 | 
					    uint8_t     DisplayWatermark;
 | 
				
			||||||
 | 
					    uint8_t     DeepSleepDivId;
 | 
				
			||||||
 | 
					    uint8_t     padding;
 | 
				
			||||||
 | 
					    uint32_t    CgSpllFuncCntl;
 | 
				
			||||||
 | 
					    uint32_t    CgSpllFuncCntl2;
 | 
				
			||||||
 | 
					    uint32_t    CgSpllFuncCntl3;
 | 
				
			||||||
 | 
					    uint32_t    CgSpllFuncCntl4;
 | 
				
			||||||
 | 
					    uint32_t    SpllSpreadSpectrum;
 | 
				
			||||||
 | 
					    uint32_t    SpllSpreadSpectrum2;
 | 
				
			||||||
 | 
					    uint32_t    CcPwrDynRm;
 | 
				
			||||||
 | 
					    uint32_t    CcPwrDynRm1;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_ACPILevel SMU7_Discrete_ACPILevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_Ulv
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t    CcPwrDynRm;
 | 
				
			||||||
 | 
					    uint32_t    CcPwrDynRm1;
 | 
				
			||||||
 | 
					    uint16_t    VddcOffset;
 | 
				
			||||||
 | 
					    uint8_t     VddcOffsetVid;
 | 
				
			||||||
 | 
					    uint8_t     VddcPhase;
 | 
				
			||||||
 | 
					    uint32_t    Reserved;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_Ulv SMU7_Discrete_Ulv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_MemoryLevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t    MinVddc;
 | 
				
			||||||
 | 
					    uint32_t    MinVddcPhases;
 | 
				
			||||||
 | 
					    uint32_t    MinVddci;
 | 
				
			||||||
 | 
					    uint32_t    MinMvdd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t    MclkFrequency;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t     EdcReadEnable;
 | 
				
			||||||
 | 
					    uint8_t     EdcWriteEnable;
 | 
				
			||||||
 | 
					    uint8_t     RttEnable;
 | 
				
			||||||
 | 
					    uint8_t     StutterEnable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t     StrobeEnable;
 | 
				
			||||||
 | 
					    uint8_t     StrobeRatio;
 | 
				
			||||||
 | 
					    uint8_t     EnabledForThrottle;
 | 
				
			||||||
 | 
					    uint8_t     EnabledForActivity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t     UpH;
 | 
				
			||||||
 | 
					    uint8_t     DownH;
 | 
				
			||||||
 | 
					    uint8_t     VoltageDownH;
 | 
				
			||||||
 | 
					    uint8_t     padding;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t    ActivityLevel;
 | 
				
			||||||
 | 
					    uint8_t     DisplayWatermark;
 | 
				
			||||||
 | 
					    uint8_t     padding1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t    MpllFuncCntl;
 | 
				
			||||||
 | 
					    uint32_t    MpllFuncCntl_1;
 | 
				
			||||||
 | 
					    uint32_t    MpllFuncCntl_2;
 | 
				
			||||||
 | 
					    uint32_t    MpllAdFuncCntl;
 | 
				
			||||||
 | 
					    uint32_t    MpllDqFuncCntl;
 | 
				
			||||||
 | 
					    uint32_t    MclkPwrmgtCntl;
 | 
				
			||||||
 | 
					    uint32_t    DllCntl;
 | 
				
			||||||
 | 
					    uint32_t    MpllSs1;
 | 
				
			||||||
 | 
					    uint32_t    MpllSs2;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_MemoryLevel SMU7_Discrete_MemoryLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_LinkLevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t     PcieGenSpeed;
 | 
				
			||||||
 | 
					    uint8_t     PcieLaneCount;
 | 
				
			||||||
 | 
					    uint8_t     EnabledForActivity;
 | 
				
			||||||
 | 
					    uint8_t     Padding;
 | 
				
			||||||
 | 
					    uint32_t    DownT;
 | 
				
			||||||
 | 
					    uint32_t    UpT;
 | 
				
			||||||
 | 
					    uint32_t    Reserved;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_LinkLevel SMU7_Discrete_LinkLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_MCArbDramTimingTableEntry
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t McArbDramTiming;
 | 
				
			||||||
 | 
					    uint32_t McArbDramTiming2;
 | 
				
			||||||
 | 
					    uint8_t  McArbBurstTime;
 | 
				
			||||||
 | 
					    uint8_t  padding[3];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_MCArbDramTimingTableEntry SMU7_Discrete_MCArbDramTimingTableEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_MCArbDramTimingTable
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SMU7_Discrete_MCArbDramTimingTableEntry entries[SMU__NUM_SCLK_DPM_STATE][SMU__NUM_MCLK_DPM_LEVELS];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_MCArbDramTimingTable SMU7_Discrete_MCArbDramTimingTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_UvdLevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t VclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t DclkFrequency;
 | 
				
			||||||
 | 
					    uint16_t MinVddc;
 | 
				
			||||||
 | 
					    uint8_t  MinVddcPhases;
 | 
				
			||||||
 | 
					    uint8_t  VclkDivider;
 | 
				
			||||||
 | 
					    uint8_t  DclkDivider;
 | 
				
			||||||
 | 
					    uint8_t  padding[3];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_UvdLevel SMU7_Discrete_UvdLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_ExtClkLevel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t Frequency;
 | 
				
			||||||
 | 
					    uint16_t MinVoltage;
 | 
				
			||||||
 | 
					    uint8_t  MinPhases;
 | 
				
			||||||
 | 
					    uint8_t  Divider;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_ExtClkLevel SMU7_Discrete_ExtClkLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_StateInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t SclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t MclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t VclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t DclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t SamclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t AclkFrequency;
 | 
				
			||||||
 | 
					    uint32_t EclkFrequency;
 | 
				
			||||||
 | 
					    uint16_t MvddVoltage;
 | 
				
			||||||
 | 
					    uint16_t padding16;
 | 
				
			||||||
 | 
					    uint8_t  DisplayWatermark;
 | 
				
			||||||
 | 
					    uint8_t  McArbIndex;
 | 
				
			||||||
 | 
					    uint8_t  McRegIndex;
 | 
				
			||||||
 | 
					    uint8_t  SeqIndex;
 | 
				
			||||||
 | 
					    uint8_t  SclkDid;
 | 
				
			||||||
 | 
					    int8_t   SclkIndex;
 | 
				
			||||||
 | 
					    int8_t   MclkIndex;
 | 
				
			||||||
 | 
					    uint8_t  PCIeGen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_StateInfo SMU7_Discrete_StateInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_DpmTable
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SMU7_PIDController                  GraphicsPIDController;
 | 
				
			||||||
 | 
					    SMU7_PIDController                  MemoryPIDController;
 | 
				
			||||||
 | 
					    SMU7_PIDController                  LinkPIDController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                            SystemFlags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                            SmioMaskVddcVid;
 | 
				
			||||||
 | 
					    uint32_t                            SmioMaskVddcPhase;
 | 
				
			||||||
 | 
					    uint32_t                            SmioMaskVddciVid;
 | 
				
			||||||
 | 
					    uint32_t                            SmioMaskMvddVid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                            VddcLevelCount;
 | 
				
			||||||
 | 
					    uint32_t                            VddciLevelCount;
 | 
				
			||||||
 | 
					    uint32_t                            MvddLevelCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SMU7_Discrete_VoltageLevel          VddcLevel               [SMU7_MAX_LEVELS_VDDC];
 | 
				
			||||||
 | 
					//    SMU7_Discrete_VoltageLevel          VddcStandardReference   [SMU7_MAX_LEVELS_VDDC];
 | 
				
			||||||
 | 
					    SMU7_Discrete_VoltageLevel          VddciLevel              [SMU7_MAX_LEVELS_VDDCI];
 | 
				
			||||||
 | 
					    SMU7_Discrete_VoltageLevel          MvddLevel               [SMU7_MAX_LEVELS_MVDD];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             GraphicsDpmLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             MemoryDpmLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             LinkLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             UvdLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             VceLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             AcpLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             SamuLevelCount;
 | 
				
			||||||
 | 
					    uint8_t                             MasterDeepSleepControl;
 | 
				
			||||||
 | 
					    uint32_t                            Reserved[5];
 | 
				
			||||||
 | 
					//    uint32_t                            SamuDefaultLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SMU7_Discrete_GraphicsLevel         GraphicsLevel           [SMU7_MAX_LEVELS_GRAPHICS];
 | 
				
			||||||
 | 
					    SMU7_Discrete_MemoryLevel           MemoryACPILevel;
 | 
				
			||||||
 | 
					    SMU7_Discrete_MemoryLevel           MemoryLevel             [SMU7_MAX_LEVELS_MEMORY];
 | 
				
			||||||
 | 
					    SMU7_Discrete_LinkLevel             LinkLevel               [SMU7_MAX_LEVELS_LINK];
 | 
				
			||||||
 | 
					    SMU7_Discrete_ACPILevel             ACPILevel;
 | 
				
			||||||
 | 
					    SMU7_Discrete_UvdLevel              UvdLevel                [SMU7_MAX_LEVELS_UVD];
 | 
				
			||||||
 | 
					    SMU7_Discrete_ExtClkLevel           VceLevel                [SMU7_MAX_LEVELS_VCE];
 | 
				
			||||||
 | 
					    SMU7_Discrete_ExtClkLevel           AcpLevel                [SMU7_MAX_LEVELS_ACP];
 | 
				
			||||||
 | 
					    SMU7_Discrete_ExtClkLevel           SamuLevel               [SMU7_MAX_LEVELS_SAMU];
 | 
				
			||||||
 | 
					    SMU7_Discrete_Ulv                   Ulv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                            SclkStepSize;
 | 
				
			||||||
 | 
					    uint32_t                            Smio                    [SMU7_MAX_ENTRIES_SMIO];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             UvdBootLevel;
 | 
				
			||||||
 | 
					    uint8_t                             VceBootLevel;
 | 
				
			||||||
 | 
					    uint8_t                             AcpBootLevel;
 | 
				
			||||||
 | 
					    uint8_t                             SamuBootLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             UVDInterval;
 | 
				
			||||||
 | 
					    uint8_t                             VCEInterval;
 | 
				
			||||||
 | 
					    uint8_t                             ACPInterval;
 | 
				
			||||||
 | 
					    uint8_t                             SAMUInterval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             GraphicsBootLevel;
 | 
				
			||||||
 | 
					    uint8_t                             GraphicsVoltageChangeEnable;
 | 
				
			||||||
 | 
					    uint8_t                             GraphicsThermThrottleEnable;
 | 
				
			||||||
 | 
					    uint8_t                             GraphicsInterval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             VoltageInterval;
 | 
				
			||||||
 | 
					    uint8_t                             ThermalInterval;
 | 
				
			||||||
 | 
					    uint16_t                            TemperatureLimitHigh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            TemperatureLimitLow;
 | 
				
			||||||
 | 
					    uint8_t                             MemoryBootLevel;
 | 
				
			||||||
 | 
					    uint8_t                             MemoryVoltageChangeEnable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             MemoryInterval;
 | 
				
			||||||
 | 
					    uint8_t                             MemoryThermThrottleEnable;
 | 
				
			||||||
 | 
					    uint16_t                            VddcVddciDelta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            VoltageResponseTime;
 | 
				
			||||||
 | 
					    uint16_t                            PhaseResponseTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             PCIeBootLinkLevel;
 | 
				
			||||||
 | 
					    uint8_t                             PCIeGenInterval;
 | 
				
			||||||
 | 
					    uint8_t                             DTEInterval;
 | 
				
			||||||
 | 
					    uint8_t                             DTEMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             SVI2Enable;
 | 
				
			||||||
 | 
					    uint8_t                             VRHotGpio;
 | 
				
			||||||
 | 
					    uint8_t                             AcDcGpio;
 | 
				
			||||||
 | 
					    uint8_t                             ThermGpio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            PPM_PkgPwrLimit;
 | 
				
			||||||
 | 
					    uint16_t                            PPM_TemperatureLimit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            DefaultTdp;
 | 
				
			||||||
 | 
					    uint16_t                            TargetTdp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            FpsHighT;
 | 
				
			||||||
 | 
					    uint16_t                            FpsLowT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            BAPMTI_R  [SMU7_DTE_ITERATIONS][SMU7_DTE_SOURCES][SMU7_DTE_SINKS];
 | 
				
			||||||
 | 
					    uint16_t                            BAPMTI_RC [SMU7_DTE_ITERATIONS][SMU7_DTE_SOURCES][SMU7_DTE_SINKS];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                             DTEAmbientTempBase;
 | 
				
			||||||
 | 
					    uint8_t                             DTETjOffset;
 | 
				
			||||||
 | 
					    uint8_t                             GpuTjMax;
 | 
				
			||||||
 | 
					    uint8_t                             GpuTjHyst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            BootVddc;
 | 
				
			||||||
 | 
					    uint16_t                            BootVddci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t                            BootMVdd;
 | 
				
			||||||
 | 
					    uint16_t                            padding;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                            BAPM_TEMP_GRADIENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                            LowSclkInterruptT;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_DpmTable SMU7_Discrete_DpmTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE 16
 | 
				
			||||||
 | 
					#define SMU7_DISCRETE_MC_REGISTER_ARRAY_SET_COUNT SMU7_MAX_LEVELS_MEMORY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_MCRegisterAddress
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t s0;
 | 
				
			||||||
 | 
					    uint16_t s1;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_MCRegisterAddress SMU7_Discrete_MCRegisterAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_MCRegisterSet
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32_t value[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_MCRegisterSet SMU7_Discrete_MCRegisterSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_MCRegisters
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t                             last;
 | 
				
			||||||
 | 
					    uint8_t                             reserved[3];
 | 
				
			||||||
 | 
					    SMU7_Discrete_MCRegisterAddress     address[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
 | 
				
			||||||
 | 
					    SMU7_Discrete_MCRegisterSet         data[SMU7_DISCRETE_MC_REGISTER_ARRAY_SET_COUNT];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_MCRegisters SMU7_Discrete_MCRegisters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SMU7_Discrete_PmFuses {
 | 
				
			||||||
 | 
					  // dw0-dw1
 | 
				
			||||||
 | 
					  uint8_t BapmVddCVidHiSidd[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw2-dw3
 | 
				
			||||||
 | 
					  uint8_t BapmVddCVidLoSidd[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw4-dw5
 | 
				
			||||||
 | 
					  uint8_t VddCVid[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw6
 | 
				
			||||||
 | 
					  uint8_t SviLoadLineEn;
 | 
				
			||||||
 | 
					  uint8_t SviLoadLineVddC;
 | 
				
			||||||
 | 
					  uint8_t SviLoadLineTrimVddC;
 | 
				
			||||||
 | 
					  uint8_t SviLoadLineOffsetVddC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw7
 | 
				
			||||||
 | 
					  uint16_t TDC_VDDC_PkgLimit;
 | 
				
			||||||
 | 
					  uint8_t TDC_VDDC_ThrottleReleaseLimitPerc;
 | 
				
			||||||
 | 
					  uint8_t TDC_MAWt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw8
 | 
				
			||||||
 | 
					  uint8_t TdcWaterfallCtl;
 | 
				
			||||||
 | 
					  uint8_t LPMLTemperatureMin;
 | 
				
			||||||
 | 
					  uint8_t LPMLTemperatureMax;
 | 
				
			||||||
 | 
					  uint8_t Reserved;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw9-dw10
 | 
				
			||||||
 | 
					  uint8_t BapmVddCVidHiSidd2[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw11-dw12
 | 
				
			||||||
 | 
					  uint32_t Reserved6[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw13-dw16
 | 
				
			||||||
 | 
					  uint8_t GnbLPML[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw17
 | 
				
			||||||
 | 
					  uint8_t GnbLPMLMaxVid;
 | 
				
			||||||
 | 
					  uint8_t GnbLPMLMinVid;
 | 
				
			||||||
 | 
					  uint8_t Reserved1[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dw18
 | 
				
			||||||
 | 
					  uint16_t BapmVddCBaseLeakageHiSidd;
 | 
				
			||||||
 | 
					  uint16_t BapmVddCBaseLeakageLoSidd;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SMU7_Discrete_PmFuses SMU7_Discrete_PmFuses;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma pack(pop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue