xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/radeon/r600_dpm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2011 Advanced Micro Devices, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun #ifndef __R600_DPM_H__
24*4882a593Smuzhiyun #define __R600_DPM_H__
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #include "radeon.h"
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define R600_ASI_DFLT                                10000
29*4882a593Smuzhiyun #define R600_BSP_DFLT                                0x41EB
30*4882a593Smuzhiyun #define R600_BSU_DFLT                                0x2
31*4882a593Smuzhiyun #define R600_AH_DFLT                                 5
32*4882a593Smuzhiyun #define R600_RLP_DFLT                                25
33*4882a593Smuzhiyun #define R600_RMP_DFLT                                65
34*4882a593Smuzhiyun #define R600_LHP_DFLT                                40
35*4882a593Smuzhiyun #define R600_LMP_DFLT                                15
36*4882a593Smuzhiyun #define R600_TD_DFLT                                 0
37*4882a593Smuzhiyun #define R600_UTC_DFLT_00                             0x24
38*4882a593Smuzhiyun #define R600_UTC_DFLT_01                             0x22
39*4882a593Smuzhiyun #define R600_UTC_DFLT_02                             0x22
40*4882a593Smuzhiyun #define R600_UTC_DFLT_03                             0x22
41*4882a593Smuzhiyun #define R600_UTC_DFLT_04                             0x22
42*4882a593Smuzhiyun #define R600_UTC_DFLT_05                             0x22
43*4882a593Smuzhiyun #define R600_UTC_DFLT_06                             0x22
44*4882a593Smuzhiyun #define R600_UTC_DFLT_07                             0x22
45*4882a593Smuzhiyun #define R600_UTC_DFLT_08                             0x22
46*4882a593Smuzhiyun #define R600_UTC_DFLT_09                             0x22
47*4882a593Smuzhiyun #define R600_UTC_DFLT_10                             0x22
48*4882a593Smuzhiyun #define R600_UTC_DFLT_11                             0x22
49*4882a593Smuzhiyun #define R600_UTC_DFLT_12                             0x22
50*4882a593Smuzhiyun #define R600_UTC_DFLT_13                             0x22
51*4882a593Smuzhiyun #define R600_UTC_DFLT_14                             0x22
52*4882a593Smuzhiyun #define R600_DTC_DFLT_00                             0x24
53*4882a593Smuzhiyun #define R600_DTC_DFLT_01                             0x22
54*4882a593Smuzhiyun #define R600_DTC_DFLT_02                             0x22
55*4882a593Smuzhiyun #define R600_DTC_DFLT_03                             0x22
56*4882a593Smuzhiyun #define R600_DTC_DFLT_04                             0x22
57*4882a593Smuzhiyun #define R600_DTC_DFLT_05                             0x22
58*4882a593Smuzhiyun #define R600_DTC_DFLT_06                             0x22
59*4882a593Smuzhiyun #define R600_DTC_DFLT_07                             0x22
60*4882a593Smuzhiyun #define R600_DTC_DFLT_08                             0x22
61*4882a593Smuzhiyun #define R600_DTC_DFLT_09                             0x22
62*4882a593Smuzhiyun #define R600_DTC_DFLT_10                             0x22
63*4882a593Smuzhiyun #define R600_DTC_DFLT_11                             0x22
64*4882a593Smuzhiyun #define R600_DTC_DFLT_12                             0x22
65*4882a593Smuzhiyun #define R600_DTC_DFLT_13                             0x22
66*4882a593Smuzhiyun #define R600_DTC_DFLT_14                             0x22
67*4882a593Smuzhiyun #define R600_VRC_DFLT                                0x0000C003
68*4882a593Smuzhiyun #define R600_VOLTAGERESPONSETIME_DFLT                1000
69*4882a593Smuzhiyun #define R600_BACKBIASRESPONSETIME_DFLT               1000
70*4882a593Smuzhiyun #define R600_VRU_DFLT                                0x3
71*4882a593Smuzhiyun #define R600_SPLLSTEPTIME_DFLT                       0x1000
72*4882a593Smuzhiyun #define R600_SPLLSTEPUNIT_DFLT                       0x3
73*4882a593Smuzhiyun #define R600_TPU_DFLT                                0
74*4882a593Smuzhiyun #define R600_TPC_DFLT                                0x200
75*4882a593Smuzhiyun #define R600_SSTU_DFLT                               0
76*4882a593Smuzhiyun #define R600_SST_DFLT                                0x00C8
77*4882a593Smuzhiyun #define R600_GICST_DFLT                              0x200
78*4882a593Smuzhiyun #define R600_FCT_DFLT                                0x0400
79*4882a593Smuzhiyun #define R600_FCTU_DFLT                               0
80*4882a593Smuzhiyun #define R600_CTXCGTT3DRPHC_DFLT                      0x20
81*4882a593Smuzhiyun #define R600_CTXCGTT3DRSDC_DFLT                      0x40
82*4882a593Smuzhiyun #define R600_VDDC3DOORPHC_DFLT                       0x100
83*4882a593Smuzhiyun #define R600_VDDC3DOORSDC_DFLT                       0x7
84*4882a593Smuzhiyun #define R600_VDDC3DOORSU_DFLT                        0
85*4882a593Smuzhiyun #define R600_MPLLLOCKTIME_DFLT                       100
86*4882a593Smuzhiyun #define R600_MPLLRESETTIME_DFLT                      150
87*4882a593Smuzhiyun #define R600_VCOSTEPPCT_DFLT                          20
88*4882a593Smuzhiyun #define R600_ENDINGVCOSTEPPCT_DFLT                    5
89*4882a593Smuzhiyun #define R600_REFERENCEDIVIDER_DFLT                    4
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define R600_PM_NUMBER_OF_TC 15
92*4882a593Smuzhiyun #define R600_PM_NUMBER_OF_SCLKS 20
93*4882a593Smuzhiyun #define R600_PM_NUMBER_OF_MCLKS 4
94*4882a593Smuzhiyun #define R600_PM_NUMBER_OF_VOLTAGE_LEVELS 4
95*4882a593Smuzhiyun #define R600_PM_NUMBER_OF_ACTIVITY_LEVELS 3
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* XXX are these ok? */
98*4882a593Smuzhiyun #define R600_TEMP_RANGE_MIN (90 * 1000)
99*4882a593Smuzhiyun #define R600_TEMP_RANGE_MAX (120 * 1000)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define FDO_PWM_MODE_STATIC  1
102*4882a593Smuzhiyun #define FDO_PWM_MODE_STATIC_RPM 5
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun enum r600_power_level {
105*4882a593Smuzhiyun 	R600_POWER_LEVEL_LOW = 0,
106*4882a593Smuzhiyun 	R600_POWER_LEVEL_MEDIUM = 1,
107*4882a593Smuzhiyun 	R600_POWER_LEVEL_HIGH = 2,
108*4882a593Smuzhiyun 	R600_POWER_LEVEL_CTXSW = 3,
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun enum r600_td {
112*4882a593Smuzhiyun 	R600_TD_AUTO,
113*4882a593Smuzhiyun 	R600_TD_UP,
114*4882a593Smuzhiyun 	R600_TD_DOWN,
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun enum r600_display_watermark {
118*4882a593Smuzhiyun 	R600_DISPLAY_WATERMARK_LOW = 0,
119*4882a593Smuzhiyun 	R600_DISPLAY_WATERMARK_HIGH = 1,
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun enum r600_display_gap
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun     R600_PM_DISPLAY_GAP_VBLANK_OR_WM = 0,
125*4882a593Smuzhiyun     R600_PM_DISPLAY_GAP_VBLANK       = 1,
126*4882a593Smuzhiyun     R600_PM_DISPLAY_GAP_WATERMARK    = 2,
127*4882a593Smuzhiyun     R600_PM_DISPLAY_GAP_IGNORE       = 3,
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun extern const u32 r600_utc[R600_PM_NUMBER_OF_TC];
131*4882a593Smuzhiyun extern const u32 r600_dtc[R600_PM_NUMBER_OF_TC];
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun void r600_dpm_print_class_info(u32 class, u32 class2);
134*4882a593Smuzhiyun void r600_dpm_print_cap_info(u32 caps);
135*4882a593Smuzhiyun void r600_dpm_print_ps_status(struct radeon_device *rdev,
136*4882a593Smuzhiyun 			      struct radeon_ps *rps);
137*4882a593Smuzhiyun u32 r600_dpm_get_vblank_time(struct radeon_device *rdev);
138*4882a593Smuzhiyun u32 r600_dpm_get_vrefresh(struct radeon_device *rdev);
139*4882a593Smuzhiyun bool r600_is_uvd_state(u32 class, u32 class2);
140*4882a593Smuzhiyun void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b,
141*4882a593Smuzhiyun 			    u32 *p, u32 *u);
142*4882a593Smuzhiyun int r600_calculate_at(u32 t, u32 h, u32 fh, u32 fl, u32 *tl, u32 *th);
143*4882a593Smuzhiyun void r600_gfx_clockgating_enable(struct radeon_device *rdev, bool enable);
144*4882a593Smuzhiyun void r600_dynamicpm_enable(struct radeon_device *rdev, bool enable);
145*4882a593Smuzhiyun void r600_enable_thermal_protection(struct radeon_device *rdev, bool enable);
146*4882a593Smuzhiyun void r600_enable_acpi_pm(struct radeon_device *rdev);
147*4882a593Smuzhiyun void r600_enable_dynamic_pcie_gen2(struct radeon_device *rdev, bool enable);
148*4882a593Smuzhiyun bool r600_dynamicpm_enabled(struct radeon_device *rdev);
149*4882a593Smuzhiyun void r600_enable_sclk_control(struct radeon_device *rdev, bool enable);
150*4882a593Smuzhiyun void r600_enable_mclk_control(struct radeon_device *rdev, bool enable);
151*4882a593Smuzhiyun void r600_enable_spll_bypass(struct radeon_device *rdev, bool enable);
152*4882a593Smuzhiyun void r600_wait_for_spll_change(struct radeon_device *rdev);
153*4882a593Smuzhiyun void r600_set_bsp(struct radeon_device *rdev, u32 u, u32 p);
154*4882a593Smuzhiyun void r600_set_at(struct radeon_device *rdev,
155*4882a593Smuzhiyun 		 u32 l_to_m, u32 m_to_h,
156*4882a593Smuzhiyun 		 u32 h_to_m, u32 m_to_l);
157*4882a593Smuzhiyun void r600_set_tc(struct radeon_device *rdev, u32 index, u32 u_t, u32 d_t);
158*4882a593Smuzhiyun void r600_select_td(struct radeon_device *rdev, enum r600_td td);
159*4882a593Smuzhiyun void r600_set_vrc(struct radeon_device *rdev, u32 vrv);
160*4882a593Smuzhiyun void r600_set_tpu(struct radeon_device *rdev, u32 u);
161*4882a593Smuzhiyun void r600_set_tpc(struct radeon_device *rdev, u32 c);
162*4882a593Smuzhiyun void r600_set_sstu(struct radeon_device *rdev, u32 u);
163*4882a593Smuzhiyun void r600_set_sst(struct radeon_device *rdev, u32 t);
164*4882a593Smuzhiyun void r600_set_git(struct radeon_device *rdev, u32 t);
165*4882a593Smuzhiyun void r600_set_fctu(struct radeon_device *rdev, u32 u);
166*4882a593Smuzhiyun void r600_set_fct(struct radeon_device *rdev, u32 t);
167*4882a593Smuzhiyun void r600_set_ctxcgtt3d_rphc(struct radeon_device *rdev, u32 p);
168*4882a593Smuzhiyun void r600_set_ctxcgtt3d_rsdc(struct radeon_device *rdev, u32 s);
169*4882a593Smuzhiyun void r600_set_vddc3d_oorsu(struct radeon_device *rdev, u32 u);
170*4882a593Smuzhiyun void r600_set_vddc3d_oorphc(struct radeon_device *rdev, u32 p);
171*4882a593Smuzhiyun void r600_set_vddc3d_oorsdc(struct radeon_device *rdev, u32 s);
172*4882a593Smuzhiyun void r600_set_mpll_lock_time(struct radeon_device *rdev, u32 lock_time);
173*4882a593Smuzhiyun void r600_set_mpll_reset_time(struct radeon_device *rdev, u32 reset_time);
174*4882a593Smuzhiyun void r600_engine_clock_entry_enable(struct radeon_device *rdev,
175*4882a593Smuzhiyun 				    u32 index, bool enable);
176*4882a593Smuzhiyun void r600_engine_clock_entry_enable_pulse_skipping(struct radeon_device *rdev,
177*4882a593Smuzhiyun 						   u32 index, bool enable);
178*4882a593Smuzhiyun void r600_engine_clock_entry_enable_post_divider(struct radeon_device *rdev,
179*4882a593Smuzhiyun 						 u32 index, bool enable);
180*4882a593Smuzhiyun void r600_engine_clock_entry_set_post_divider(struct radeon_device *rdev,
181*4882a593Smuzhiyun 					      u32 index, u32 divider);
182*4882a593Smuzhiyun void r600_engine_clock_entry_set_reference_divider(struct radeon_device *rdev,
183*4882a593Smuzhiyun 						   u32 index, u32 divider);
184*4882a593Smuzhiyun void r600_engine_clock_entry_set_feedback_divider(struct radeon_device *rdev,
185*4882a593Smuzhiyun 						  u32 index, u32 divider);
186*4882a593Smuzhiyun void r600_engine_clock_entry_set_step_time(struct radeon_device *rdev,
187*4882a593Smuzhiyun 					   u32 index, u32 step_time);
188*4882a593Smuzhiyun void r600_vid_rt_set_ssu(struct radeon_device *rdev, u32 u);
189*4882a593Smuzhiyun void r600_vid_rt_set_vru(struct radeon_device *rdev, u32 u);
190*4882a593Smuzhiyun void r600_vid_rt_set_vrt(struct radeon_device *rdev, u32 rt);
191*4882a593Smuzhiyun void r600_voltage_control_enable_pins(struct radeon_device *rdev,
192*4882a593Smuzhiyun 				      u64 mask);
193*4882a593Smuzhiyun void r600_voltage_control_program_voltages(struct radeon_device *rdev,
194*4882a593Smuzhiyun 					   enum r600_power_level index, u64 pins);
195*4882a593Smuzhiyun void r600_voltage_control_deactivate_static_control(struct radeon_device *rdev,
196*4882a593Smuzhiyun 						    u64 mask);
197*4882a593Smuzhiyun void r600_power_level_enable(struct radeon_device *rdev,
198*4882a593Smuzhiyun 			     enum r600_power_level index, bool enable);
199*4882a593Smuzhiyun void r600_power_level_set_voltage_index(struct radeon_device *rdev,
200*4882a593Smuzhiyun 					enum r600_power_level index, u32 voltage_index);
201*4882a593Smuzhiyun void r600_power_level_set_mem_clock_index(struct radeon_device *rdev,
202*4882a593Smuzhiyun 					  enum r600_power_level index, u32 mem_clock_index);
203*4882a593Smuzhiyun void r600_power_level_set_eng_clock_index(struct radeon_device *rdev,
204*4882a593Smuzhiyun 					  enum r600_power_level index, u32 eng_clock_index);
205*4882a593Smuzhiyun void r600_power_level_set_watermark_id(struct radeon_device *rdev,
206*4882a593Smuzhiyun 				       enum r600_power_level index,
207*4882a593Smuzhiyun 				       enum r600_display_watermark watermark_id);
208*4882a593Smuzhiyun void r600_power_level_set_pcie_gen2(struct radeon_device *rdev,
209*4882a593Smuzhiyun 				    enum r600_power_level index, bool compatible);
210*4882a593Smuzhiyun enum r600_power_level r600_power_level_get_current_index(struct radeon_device *rdev);
211*4882a593Smuzhiyun enum r600_power_level r600_power_level_get_target_index(struct radeon_device *rdev);
212*4882a593Smuzhiyun void r600_power_level_set_enter_index(struct radeon_device *rdev,
213*4882a593Smuzhiyun 				      enum r600_power_level index);
214*4882a593Smuzhiyun void r600_wait_for_power_level_unequal(struct radeon_device *rdev,
215*4882a593Smuzhiyun 				       enum r600_power_level index);
216*4882a593Smuzhiyun void r600_wait_for_power_level(struct radeon_device *rdev,
217*4882a593Smuzhiyun 			       enum r600_power_level index);
218*4882a593Smuzhiyun void r600_start_dpm(struct radeon_device *rdev);
219*4882a593Smuzhiyun void r600_stop_dpm(struct radeon_device *rdev);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun bool r600_is_internal_thermal_sensor(enum radeon_int_thermal_type sensor);
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun int r600_get_platform_caps(struct radeon_device *rdev);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun int r600_parse_extended_power_table(struct radeon_device *rdev);
226*4882a593Smuzhiyun void r600_free_extended_power_table(struct radeon_device *rdev);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev,
229*4882a593Smuzhiyun 					       u32 sys_mask,
230*4882a593Smuzhiyun 					       enum radeon_pcie_gen asic_gen,
231*4882a593Smuzhiyun 					       enum radeon_pcie_gen default_gen);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun u16 r600_get_pcie_lane_support(struct radeon_device *rdev,
234*4882a593Smuzhiyun 			       u16 asic_lanes,
235*4882a593Smuzhiyun 			       u16 default_lanes);
236*4882a593Smuzhiyun u8 r600_encode_pci_lane_width(u32 lanes);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun #endif
239