1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef _VEGA10_HWMGR_H_
25#define _VEGA10_HWMGR_H_
26
27#include "hwmgr.h"
28#include "smu9_driver_if.h"
29#include "ppatomctrl.h"
30#include "ppatomfwctrl.h"
31#include "vega10_ppsmc.h"
32#include "vega10_powertune.h"
33
34#define VEGA10_MAX_HARDWARE_POWERLEVELS 2
35
36#define WaterMarksExist 1
37#define WaterMarksLoaded 2
38
39enum {
40 GNLD_DPM_PREFETCHER = 0,
41 GNLD_DPM_GFXCLK,
42 GNLD_DPM_UCLK,
43 GNLD_DPM_SOCCLK,
44 GNLD_DPM_UVD,
45 GNLD_DPM_VCE,
46 GNLD_ULV,
47 GNLD_DPM_MP0CLK,
48 GNLD_DPM_LINK,
49 GNLD_DPM_DCEFCLK,
50 GNLD_AVFS,
51 GNLD_DS_GFXCLK,
52 GNLD_DS_SOCCLK,
53 GNLD_DS_LCLK,
54 GNLD_PPT,
55 GNLD_TDC,
56 GNLD_THERMAL,
57 GNLD_GFX_PER_CU_CG,
58 GNLD_RM,
59 GNLD_DS_DCEFCLK,
60 GNLD_ACDC,
61 GNLD_VR0HOT,
62 GNLD_VR1HOT,
63 GNLD_FW_CTF,
64 GNLD_LED_DISPLAY,
65 GNLD_FAN_CONTROL,
66 GNLD_FEATURE_FAST_PPT_BIT,
67 GNLD_DIDT,
68 GNLD_ACG,
69 GNLD_PCC_LIMIT,
70 GNLD_FEATURES_MAX
71};
72
73#define GNLD_DPM_MAX (GNLD_DPM_DCEFCLK + 1)
74
75#define SMC_DPM_FEATURES 0x30F
76
77struct smu_features {
78 bool supported;
79 bool enabled;
80 uint32_t smu_feature_id;
81 uint32_t smu_feature_bitmap;
82};
83
84struct vega10_performance_level {
85 uint32_t soc_clock;
86 uint32_t gfx_clock;
87 uint32_t mem_clock;
88};
89
90struct vega10_bacos {
91 uint32_t baco_flags;
92
93};
94
95struct vega10_uvd_clocks {
96 uint32_t vclk;
97 uint32_t dclk;
98};
99
100struct vega10_vce_clocks {
101 uint32_t evclk;
102 uint32_t ecclk;
103};
104
105struct vega10_power_state {
106 uint32_t magic;
107 struct vega10_uvd_clocks uvd_clks;
108 struct vega10_vce_clocks vce_clks;
109 uint16_t performance_level_count;
110 bool dc_compatible;
111 uint32_t sclk_threshold;
112 struct vega10_performance_level performance_levels[VEGA10_MAX_HARDWARE_POWERLEVELS];
113};
114
115struct vega10_dpm_level {
116 bool enabled;
117 uint32_t value;
118 uint32_t param1;
119};
120
121#define VEGA10_MAX_DEEPSLEEP_DIVIDER_ID 5
122#define MAX_REGULAR_DPM_NUMBER 8
123#define MAX_PCIE_CONF 2
124#define VEGA10_MINIMUM_ENGINE_CLOCK 2500
125
126struct vega10_dpm_state {
127 uint32_t soft_min_level;
128 uint32_t soft_max_level;
129 uint32_t hard_min_level;
130 uint32_t hard_max_level;
131};
132
133struct vega10_single_dpm_table {
134 uint32_t count;
135 struct vega10_dpm_state dpm_state;
136 struct vega10_dpm_level dpm_levels[MAX_REGULAR_DPM_NUMBER];
137};
138
139struct vega10_pcie_table {
140 uint16_t count;
141 uint8_t pcie_gen[MAX_PCIE_CONF];
142 uint8_t pcie_lane[MAX_PCIE_CONF];
143 uint32_t lclk[MAX_PCIE_CONF];
144};
145
146struct vega10_dpm_table {
147 struct vega10_single_dpm_table soc_table;
148 struct vega10_single_dpm_table gfx_table;
149 struct vega10_single_dpm_table mem_table;
150 struct vega10_single_dpm_table eclk_table;
151 struct vega10_single_dpm_table vclk_table;
152 struct vega10_single_dpm_table dclk_table;
153 struct vega10_single_dpm_table dcef_table;
154 struct vega10_single_dpm_table pixel_table;
155 struct vega10_single_dpm_table display_table;
156 struct vega10_single_dpm_table phy_table;
157 struct vega10_pcie_table pcie_table;
158};
159
160#define VEGA10_MAX_LEAKAGE_COUNT 8
161struct vega10_leakage_voltage {
162 uint16_t count;
163 uint16_t leakage_id[VEGA10_MAX_LEAKAGE_COUNT];
164 uint16_t actual_voltage[VEGA10_MAX_LEAKAGE_COUNT];
165};
166
167struct vega10_display_timing {
168 uint32_t min_clock_in_sr;
169 uint32_t num_existing_displays;
170};
171
172struct vega10_dpmlevel_enable_mask {
173 uint32_t uvd_dpm_enable_mask;
174 uint32_t vce_dpm_enable_mask;
175 uint32_t acp_dpm_enable_mask;
176 uint32_t samu_dpm_enable_mask;
177 uint32_t sclk_dpm_enable_mask;
178 uint32_t mclk_dpm_enable_mask;
179};
180
181struct vega10_vbios_boot_state {
182 bool bsoc_vddc_lock;
183 uint16_t vddc;
184 uint16_t vddci;
185 uint16_t mvddc;
186 uint16_t vdd_gfx;
187 uint32_t gfx_clock;
188 uint32_t mem_clock;
189 uint32_t soc_clock;
190 uint32_t dcef_clock;
191};
192
193struct vega10_smc_state_table {
194 uint32_t soc_boot_level;
195 uint32_t gfx_boot_level;
196 uint32_t dcef_boot_level;
197 uint32_t mem_boot_level;
198 uint32_t uvd_boot_level;
199 uint32_t vce_boot_level;
200 uint32_t gfx_max_level;
201 uint32_t mem_max_level;
202 uint8_t vr_hot_gpio;
203 uint8_t ac_dc_gpio;
204 uint8_t therm_out_gpio;
205 uint8_t therm_out_polarity;
206 uint8_t therm_out_mode;
207 PPTable_t pp_table;
208 Watermarks_t water_marks_table;
209 AvfsTable_t avfs_table;
210 AvfsFuseOverride_t avfs_fuse_override_table;
211};
212
213struct vega10_mclk_latency_entries {
214 uint32_t frequency;
215 uint32_t latency;
216};
217
218struct vega10_mclk_latency_table {
219 uint32_t count;
220 struct vega10_mclk_latency_entries entries[MAX_REGULAR_DPM_NUMBER];
221};
222
223struct vega10_registry_data {
224 uint8_t ac_dc_switch_gpio_support;
225 uint8_t avfs_support;
226 uint8_t cac_support;
227 uint8_t clock_stretcher_support;
228 uint8_t db_ramping_support;
229 uint8_t didt_mode;
230 uint8_t didt_support;
231 uint8_t edc_didt_support;
232 uint8_t dynamic_state_patching_support;
233 uint8_t enable_pkg_pwr_tracking_feature;
234 uint8_t enable_tdc_limit_feature;
235 uint32_t fast_watermark_threshold;
236 uint8_t force_dpm_high;
237 uint8_t fuzzy_fan_control_support;
238 uint8_t long_idle_baco_support;
239 uint8_t mclk_dpm_key_disabled;
240 uint8_t od_state_in_dc_support;
241 uint8_t pcieLaneOverride;
242 uint8_t pcieSpeedOverride;
243 uint32_t pcieClockOverride;
244 uint8_t pcie_dpm_key_disabled;
245 uint8_t dcefclk_dpm_key_disabled;
246 uint8_t power_containment_support;
247 uint8_t ppt_support;
248 uint8_t prefetcher_dpm_key_disabled;
249 uint8_t quick_transition_support;
250 uint8_t regulator_hot_gpio_support;
251 uint8_t sclk_deep_sleep_support;
252 uint8_t sclk_dpm_key_disabled;
253 uint8_t sclk_from_vbios;
254 uint8_t sclk_throttle_low_notification;
255 uint8_t show_baco_dbg_info;
256 uint8_t skip_baco_hardware;
257 uint8_t socclk_dpm_key_disabled;
258 uint8_t spll_shutdown_support;
259 uint8_t sq_ramping_support;
260 uint32_t stable_pstate_sclk_dpm_percentage;
261 uint8_t tcp_ramping_support;
262 uint8_t tdc_support;
263 uint8_t td_ramping_support;
264 uint8_t dbr_ramping_support;
265 uint8_t gc_didt_support;
266 uint8_t psm_didt_support;
267 uint8_t thermal_out_gpio_support;
268 uint8_t thermal_support;
269 uint8_t fw_ctf_enabled;
270 uint8_t fan_control_support;
271 uint8_t ulps_support;
272 uint8_t ulv_support;
273 uint32_t vddc_vddci_delta;
274 uint8_t odn_feature_enable;
275 uint8_t disable_water_mark;
276 uint8_t zrpm_stop_temp;
277 uint8_t zrpm_start_temp;
278 uint8_t led_dpm_enabled;
279 uint8_t vr0hot_enabled;
280 uint8_t vr1hot_enabled;
281};
282
283struct vega10_odn_clock_voltage_dependency_table {
284 uint32_t count;
285 struct phm_ppt_v1_clock_voltage_dependency_record
286 entries[MAX_REGULAR_DPM_NUMBER];
287};
288
289struct vega10_odn_dpm_table {
290 struct phm_odn_clock_levels odn_core_clock_dpm_levels;
291 struct phm_odn_clock_levels odn_memory_clock_dpm_levels;
292 struct vega10_odn_clock_voltage_dependency_table vdd_dependency_on_sclk;
293 struct vega10_odn_clock_voltage_dependency_table vdd_dependency_on_mclk;
294};
295
296struct vega10_odn_fan_table {
297 uint32_t target_fan_speed;
298 uint32_t target_temperature;
299 uint32_t min_performance_clock;
300 uint32_t min_fan_limit;
301};
302
303struct vega10_hwmgr {
304 struct vega10_dpm_table dpm_table;
305 struct vega10_dpm_table golden_dpm_table;
306 struct vega10_registry_data registry_data;
307 struct vega10_vbios_boot_state vbios_boot_state;
308 struct vega10_mclk_latency_table mclk_latency_table;
309
310 struct vega10_leakage_voltage vddc_leakage;
311
312 uint32_t vddc_control;
313 struct pp_atomfwctrl_voltage_table vddc_voltage_table;
314 uint32_t mvdd_control;
315 struct pp_atomfwctrl_voltage_table mvdd_voltage_table;
316 uint32_t vddci_control;
317 struct pp_atomfwctrl_voltage_table vddci_voltage_table;
318
319 uint32_t active_auto_throttle_sources;
320 uint32_t water_marks_bitmap;
321 struct vega10_bacos bacos;
322
323 struct vega10_odn_dpm_table odn_dpm_table;
324 struct vega10_odn_fan_table odn_fan_table;
325
326
327 uint8_t need_update_dpm_table;
328
329 bool cac_enabled;
330 bool battery_state;
331 bool is_tlu_enabled;
332
333 uint32_t low_sclk_interrupt_threshold;
334
335 uint32_t total_active_cus;
336
337 struct vega10_display_timing display_timing;
338
339
340
341 uint32_t debug_settings;
342 uint32_t lowest_uclk_reserved_for_ulv;
343 uint32_t gfxclk_average_alpha;
344 uint32_t socclk_average_alpha;
345 uint32_t uclk_average_alpha;
346 uint32_t gfx_activity_average_alpha;
347 uint32_t display_voltage_mode;
348 uint32_t dcef_clk_quad_eqn_a;
349 uint32_t dcef_clk_quad_eqn_b;
350 uint32_t dcef_clk_quad_eqn_c;
351 uint32_t disp_clk_quad_eqn_a;
352 uint32_t disp_clk_quad_eqn_b;
353 uint32_t disp_clk_quad_eqn_c;
354 uint32_t pixel_clk_quad_eqn_a;
355 uint32_t pixel_clk_quad_eqn_b;
356 uint32_t pixel_clk_quad_eqn_c;
357 uint32_t phy_clk_quad_eqn_a;
358 uint32_t phy_clk_quad_eqn_b;
359 uint32_t phy_clk_quad_eqn_c;
360
361
362 struct vega10_dpmlevel_enable_mask dpm_level_enable_mask;
363
364
365 bool uvd_power_gated;
366 bool vce_power_gated;
367 bool samu_power_gated;
368 bool need_long_memory_training;
369
370
371 bool apply_optimized_settings;
372 uint32_t disable_dpm_mask;
373
374
375 uint32_t apply_overdrive_next_settings_mask;
376
377
378 struct smu_features smu_features[GNLD_FEATURES_MAX];
379 struct vega10_smc_state_table smc_state_table;
380
381 uint32_t config_telemetry;
382 uint32_t acg_loop_state;
383 uint32_t mem_channels;
384 uint8_t custom_profile_mode[4];
385};
386
387#define VEGA10_DPM2_NEAR_TDP_DEC 10
388#define VEGA10_DPM2_ABOVE_SAFE_INC 5
389#define VEGA10_DPM2_BELOW_SAFE_INC 20
390
391#define VEGA10_DPM2_LTA_WINDOW_SIZE 7
392
393#define VEGA10_DPM2_LTS_TRUNCATE 0
394
395#define VEGA10_DPM2_TDP_SAFE_LIMIT_PERCENT 80
396
397#define VEGA10_DPM2_MAXPS_PERCENT_M 90
398#define VEGA10_DPM2_MAXPS_PERCENT_H 90
399
400#define VEGA10_DPM2_PWREFFICIENCYRATIO_MARGIN 50
401
402#define VEGA10_DPM2_SQ_RAMP_MAX_POWER 0x3FFF
403#define VEGA10_DPM2_SQ_RAMP_MIN_POWER 0x12
404#define VEGA10_DPM2_SQ_RAMP_MAX_POWER_DELTA 0x15
405#define VEGA10_DPM2_SQ_RAMP_SHORT_TERM_INTERVAL_SIZE 0x1E
406#define VEGA10_DPM2_SQ_RAMP_LONG_TERM_INTERVAL_RATIO 0xF
407
408#define VEGA10_VOLTAGE_CONTROL_NONE 0x0
409#define VEGA10_VOLTAGE_CONTROL_BY_GPIO 0x1
410#define VEGA10_VOLTAGE_CONTROL_BY_SVID2 0x2
411#define VEGA10_VOLTAGE_CONTROL_MERGED 0x3
412
413#define VEGA10_Q88_FORMAT_CONVERSION_UNIT 256
414
415#define VEGA10_UNUSED_GPIO_PIN 0x7F
416
417#define VEGA10_THERM_OUT_MODE_DISABLE 0x0
418#define VEGA10_THERM_OUT_MODE_THERM_ONLY 0x1
419#define VEGA10_THERM_OUT_MODE_THERM_VRHOT 0x2
420
421#define PPVEGA10_VEGA10DISPLAYVOLTAGEMODE_DFLT 0xffffffff
422#define PPREGKEY_VEGA10QUADRATICEQUATION_DFLT 0xffffffff
423
424#define PPVEGA10_VEGA10GFXCLKAVERAGEALPHA_DFLT 25
425#define PPVEGA10_VEGA10SOCCLKAVERAGEALPHA_DFLT 25
426#define PPVEGA10_VEGA10UCLKCLKAVERAGEALPHA_DFLT 25
427#define PPVEGA10_VEGA10GFXACTIVITYAVERAGEALPHA_DFLT 25
428
429#define VEGA10_UMD_PSTATE_GFXCLK_LEVEL 0x3
430#define VEGA10_UMD_PSTATE_SOCCLK_LEVEL 0x3
431#define VEGA10_UMD_PSTATE_MCLK_LEVEL 0x2
432
433extern int tonga_initializa_dynamic_state_adjustment_rule_settings(struct pp_hwmgr *hwmgr);
434extern int tonga_hwmgr_backend_fini(struct pp_hwmgr *hwmgr);
435extern int tonga_get_mc_microcode_version (struct pp_hwmgr *hwmgr);
436extern int tonga_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr);
437extern int tonga_notify_smc_display_change(struct pp_hwmgr *hwmgr, bool has_display);
438int vega10_update_vce_dpm(struct pp_hwmgr *hwmgr, const void *input);
439int vega10_update_uvd_dpm(struct pp_hwmgr *hwmgr, bool bgate);
440int vega10_update_samu_dpm(struct pp_hwmgr *hwmgr, bool bgate);
441int vega10_update_acp_dpm(struct pp_hwmgr *hwmgr, bool bgate);
442int vega10_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable);
443int vega10_enable_smc_features(struct pp_hwmgr *hwmgr,
444 bool enable, uint32_t feature_mask);
445
446#endif
447