si_dpm.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. /*
  2. * Copyright 2012 Advanced Micro Devices, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. */
  23. #ifndef __SI_DPM_H__
  24. #define __SI_DPM_H__
  25. #include "amdgpu_atombios.h"
  26. #include "sislands_smc.h"
  27. #define MC_CG_CONFIG 0x96f
  28. #define MC_ARB_CG 0x9fa
  29. #define CG_ARB_REQ(x) ((x) << 0)
  30. #define CG_ARB_REQ_MASK (0xff << 0)
  31. #define MC_ARB_DRAM_TIMING_1 0x9fc
  32. #define MC_ARB_DRAM_TIMING_2 0x9fd
  33. #define MC_ARB_DRAM_TIMING_3 0x9fe
  34. #define MC_ARB_DRAM_TIMING2_1 0x9ff
  35. #define MC_ARB_DRAM_TIMING2_2 0xa00
  36. #define MC_ARB_DRAM_TIMING2_3 0xa01
  37. #define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
  38. #define RV770_ASI_DFLT 1000
  39. #define CYPRESS_HASI_DFLT 400000
  40. #define PCIE_PERF_REQ_PECI_GEN1 2
  41. #define PCIE_PERF_REQ_PECI_GEN2 3
  42. #define PCIE_PERF_REQ_PECI_GEN3 4
  43. #define RV770_DEFAULT_VCLK_FREQ 53300 /* 10 khz */
  44. #define RV770_DEFAULT_DCLK_FREQ 40000 /* 10 khz */
  45. #define SMC_STROBE_RATIO 0x0F
  46. #define SMC_STROBE_ENABLE 0x10
  47. #define SMC_MC_EDC_RD_FLAG 0x01
  48. #define SMC_MC_EDC_WR_FLAG 0x02
  49. #define SMC_MC_RTT_ENABLE 0x04
  50. #define SMC_MC_STUTTER_EN 0x08
  51. #define SISLANDS_MCREGISTERTABLE_INITIAL_SLOT 0
  52. #define SISLANDS_MCREGISTERTABLE_ACPI_SLOT 1
  53. #define SISLANDS_MCREGISTERTABLE_ULV_SLOT 2
  54. #define SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT 3
  55. #define SISLANDS_LEAKAGE_INDEX0 0xff01
  56. #define SISLANDS_MAX_LEAKAGE_COUNT 4
  57. #define SISLANDS_MAX_HARDWARE_POWERLEVELS 5
  58. #define SISLANDS_INITIAL_STATE_ARB_INDEX 0
  59. #define SISLANDS_ACPI_STATE_ARB_INDEX 1
  60. #define SISLANDS_ULV_STATE_ARB_INDEX 2
  61. #define SISLANDS_DRIVER_STATE_ARB_INDEX 3
  62. #define SISLANDS_DPM2_MAX_PULSE_SKIP 256
  63. #define SISLANDS_DPM2_NEAR_TDP_DEC 10
  64. #define SISLANDS_DPM2_ABOVE_SAFE_INC 5
  65. #define SISLANDS_DPM2_BELOW_SAFE_INC 20
  66. #define SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT 80
  67. #define SISLANDS_DPM2_MAXPS_PERCENT_H 99
  68. #define SISLANDS_DPM2_MAXPS_PERCENT_M 99
  69. #define SISLANDS_DPM2_SQ_RAMP_MAX_POWER 0x3FFF
  70. #define SISLANDS_DPM2_SQ_RAMP_MIN_POWER 0x12
  71. #define SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA 0x15
  72. #define SISLANDS_DPM2_SQ_RAMP_STI_SIZE 0x1E
  73. #define SISLANDS_DPM2_SQ_RAMP_LTI_RATIO 0xF
  74. #define SISLANDS_DPM2_PWREFFICIENCYRATIO_MARGIN 10
  75. #define SISLANDS_VRC_DFLT 0xC000B3
  76. #define SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT 1687
  77. #define SISLANDS_CGULVPARAMETER_DFLT 0x00040035
  78. #define SISLANDS_CGULVCONTROL_DFLT 0x1f007550
  79. #define SI_ASI_DFLT 10000
  80. #define SI_BSP_DFLT 0x41EB
  81. #define SI_BSU_DFLT 0x2
  82. #define SI_AH_DFLT 5
  83. #define SI_RLP_DFLT 25
  84. #define SI_RMP_DFLT 65
  85. #define SI_LHP_DFLT 40
  86. #define SI_LMP_DFLT 15
  87. #define SI_TD_DFLT 0
  88. #define SI_UTC_DFLT_00 0x24
  89. #define SI_UTC_DFLT_01 0x22
  90. #define SI_UTC_DFLT_02 0x22
  91. #define SI_UTC_DFLT_03 0x22
  92. #define SI_UTC_DFLT_04 0x22
  93. #define SI_UTC_DFLT_05 0x22
  94. #define SI_UTC_DFLT_06 0x22
  95. #define SI_UTC_DFLT_07 0x22
  96. #define SI_UTC_DFLT_08 0x22
  97. #define SI_UTC_DFLT_09 0x22
  98. #define SI_UTC_DFLT_10 0x22
  99. #define SI_UTC_DFLT_11 0x22
  100. #define SI_UTC_DFLT_12 0x22
  101. #define SI_UTC_DFLT_13 0x22
  102. #define SI_UTC_DFLT_14 0x22
  103. #define SI_DTC_DFLT_00 0x24
  104. #define SI_DTC_DFLT_01 0x22
  105. #define SI_DTC_DFLT_02 0x22
  106. #define SI_DTC_DFLT_03 0x22
  107. #define SI_DTC_DFLT_04 0x22
  108. #define SI_DTC_DFLT_05 0x22
  109. #define SI_DTC_DFLT_06 0x22
  110. #define SI_DTC_DFLT_07 0x22
  111. #define SI_DTC_DFLT_08 0x22
  112. #define SI_DTC_DFLT_09 0x22
  113. #define SI_DTC_DFLT_10 0x22
  114. #define SI_DTC_DFLT_11 0x22
  115. #define SI_DTC_DFLT_12 0x22
  116. #define SI_DTC_DFLT_13 0x22
  117. #define SI_DTC_DFLT_14 0x22
  118. #define SI_VRC_DFLT 0x0000C003
  119. #define SI_VOLTAGERESPONSETIME_DFLT 1000
  120. #define SI_BACKBIASRESPONSETIME_DFLT 1000
  121. #define SI_VRU_DFLT 0x3
  122. #define SI_SPLLSTEPTIME_DFLT 0x1000
  123. #define SI_SPLLSTEPUNIT_DFLT 0x3
  124. #define SI_TPU_DFLT 0
  125. #define SI_TPC_DFLT 0x200
  126. #define SI_SSTU_DFLT 0
  127. #define SI_SST_DFLT 0x00C8
  128. #define SI_GICST_DFLT 0x200
  129. #define SI_FCT_DFLT 0x0400
  130. #define SI_FCTU_DFLT 0
  131. #define SI_CTXCGTT3DRPHC_DFLT 0x20
  132. #define SI_CTXCGTT3DRSDC_DFLT 0x40
  133. #define SI_VDDC3DOORPHC_DFLT 0x100
  134. #define SI_VDDC3DOORSDC_DFLT 0x7
  135. #define SI_VDDC3DOORSU_DFLT 0
  136. #define SI_MPLLLOCKTIME_DFLT 100
  137. #define SI_MPLLRESETTIME_DFLT 150
  138. #define SI_VCOSTEPPCT_DFLT 20
  139. #define SI_ENDINGVCOSTEPPCT_DFLT 5
  140. #define SI_REFERENCEDIVIDER_DFLT 4
  141. #define SI_PM_NUMBER_OF_TC 15
  142. #define SI_PM_NUMBER_OF_SCLKS 20
  143. #define SI_PM_NUMBER_OF_MCLKS 4
  144. #define SI_PM_NUMBER_OF_VOLTAGE_LEVELS 4
  145. #define SI_PM_NUMBER_OF_ACTIVITY_LEVELS 3
  146. /* XXX are these ok? */
  147. #define SI_TEMP_RANGE_MIN (90 * 1000)
  148. #define SI_TEMP_RANGE_MAX (120 * 1000)
  149. #define FDO_PWM_MODE_STATIC 1
  150. #define FDO_PWM_MODE_STATIC_RPM 5
  151. enum ni_dc_cac_level
  152. {
  153. NISLANDS_DCCAC_LEVEL_0 = 0,
  154. NISLANDS_DCCAC_LEVEL_1,
  155. NISLANDS_DCCAC_LEVEL_2,
  156. NISLANDS_DCCAC_LEVEL_3,
  157. NISLANDS_DCCAC_LEVEL_4,
  158. NISLANDS_DCCAC_LEVEL_5,
  159. NISLANDS_DCCAC_LEVEL_6,
  160. NISLANDS_DCCAC_LEVEL_7,
  161. NISLANDS_DCCAC_MAX_LEVELS
  162. };
  163. enum si_cac_config_reg_type
  164. {
  165. SISLANDS_CACCONFIG_MMR = 0,
  166. SISLANDS_CACCONFIG_CGIND,
  167. SISLANDS_CACCONFIG_MAX
  168. };
  169. extern const struct amdgpu_ip_block_version si_smu_ip_block;
  170. struct ni_leakage_coeffients
  171. {
  172. u32 at;
  173. u32 bt;
  174. u32 av;
  175. u32 bv;
  176. s32 t_slope;
  177. s32 t_intercept;
  178. u32 t_ref;
  179. };
  180. struct SMC_NIslands_MCRegisterAddress
  181. {
  182. uint16_t s0;
  183. uint16_t s1;
  184. };
  185. typedef struct SMC_NIslands_MCRegisterAddress SMC_NIslands_MCRegisterAddress;
  186. struct rv7xx_power_info {
  187. /* flags */
  188. bool voltage_control; /* vddc */
  189. bool mvdd_control;
  190. bool sclk_ss;
  191. bool mclk_ss;
  192. bool dynamic_ss;
  193. bool thermal_protection;
  194. /* voltage */
  195. u32 mvdd_split_frequency;
  196. u16 max_vddc;
  197. u16 max_vddc_in_table;
  198. u16 min_vddc_in_table;
  199. /* stored values */
  200. u16 acpi_vddc;
  201. u32 ref_div;
  202. u32 active_auto_throttle_sources;
  203. u32 mclk_stutter_mode_threshold;
  204. u32 mclk_strobe_mode_threshold;
  205. u32 mclk_edc_enable_threshold;
  206. u32 bsp;
  207. u32 bsu;
  208. u32 pbsp;
  209. u32 pbsu;
  210. u32 dsp;
  211. u32 psp;
  212. u32 asi;
  213. u32 pasi;
  214. u32 vrc;
  215. };
  216. enum si_pcie_gen {
  217. SI_PCIE_GEN1 = 0,
  218. SI_PCIE_GEN2 = 1,
  219. SI_PCIE_GEN3 = 2,
  220. SI_PCIE_GEN_INVALID = 0xffff
  221. };
  222. struct rv7xx_pl {
  223. u32 sclk;
  224. u32 mclk;
  225. u16 vddc;
  226. u16 vddci; /* eg+ only */
  227. u32 flags;
  228. enum si_pcie_gen pcie_gen; /* si+ only */
  229. };
  230. struct si_ps {
  231. u16 performance_level_count;
  232. bool dc_compatible;
  233. struct rv7xx_pl performance_levels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  234. };
  235. struct evergreen_power_info {
  236. /* must be first! */
  237. struct rv7xx_power_info rv7xx;
  238. /* flags */
  239. bool vddci_control;
  240. bool dynamic_ac_timing;
  241. bool abm;
  242. bool mcls;
  243. bool pcie_performance_request;
  244. bool sclk_deep_sleep;
  245. bool smu_uvd_hs;
  246. bool uvd_enabled;
  247. /* stored values */
  248. u16 acpi_vddci;
  249. u32 mclk_edc_wr_enable_threshold;
  250. struct atom_voltage_table vddc_voltage_table;
  251. struct atom_voltage_table vddci_voltage_table;
  252. struct amdgpu_ps current_rps;
  253. struct amdgpu_ps requested_rps;
  254. };
  255. struct ni_power_info {
  256. /* must be first! */
  257. struct evergreen_power_info eg;
  258. u32 mclk_rtt_mode_threshold;
  259. /* flags */
  260. bool support_cac_long_term_average;
  261. bool cac_enabled;
  262. bool cac_configuration_required;
  263. bool driver_calculate_cac_leakage;
  264. bool enable_power_containment;
  265. bool enable_cac;
  266. bool enable_sq_ramping;
  267. struct si_ps current_ps;
  268. struct si_ps requested_ps;
  269. };
  270. struct si_cac_config_reg
  271. {
  272. u32 offset;
  273. u32 mask;
  274. u32 shift;
  275. u32 value;
  276. enum si_cac_config_reg_type type;
  277. };
  278. struct si_powertune_data
  279. {
  280. u32 cac_window;
  281. u32 l2_lta_window_size_default;
  282. u8 lts_truncate_default;
  283. u8 shift_n_default;
  284. u8 operating_temp;
  285. struct ni_leakage_coeffients leakage_coefficients;
  286. u32 fixed_kt;
  287. u32 lkge_lut_v0_percent;
  288. u8 dc_cac[NISLANDS_DCCAC_MAX_LEVELS];
  289. bool enable_powertune_by_default;
  290. };
  291. struct si_dyn_powertune_data
  292. {
  293. u32 cac_leakage;
  294. s32 leakage_minimum_temperature;
  295. u32 wintime;
  296. u32 l2_lta_window_size;
  297. u8 lts_truncate;
  298. u8 shift_n;
  299. u8 dc_pwr_value;
  300. bool disable_uvd_powertune;
  301. };
  302. struct si_dte_data
  303. {
  304. u32 tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  305. u32 r[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  306. u32 k;
  307. u32 t0;
  308. u32 max_t;
  309. u8 window_size;
  310. u8 temp_select;
  311. u8 dte_mode;
  312. u8 tdep_count;
  313. u8 t_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  314. u32 tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  315. u32 tdep_r[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  316. u32 t_threshold;
  317. bool enable_dte_by_default;
  318. };
  319. struct si_clock_registers {
  320. u32 cg_spll_func_cntl;
  321. u32 cg_spll_func_cntl_2;
  322. u32 cg_spll_func_cntl_3;
  323. u32 cg_spll_func_cntl_4;
  324. u32 cg_spll_spread_spectrum;
  325. u32 cg_spll_spread_spectrum_2;
  326. u32 dll_cntl;
  327. u32 mclk_pwrmgt_cntl;
  328. u32 mpll_ad_func_cntl;
  329. u32 mpll_dq_func_cntl;
  330. u32 mpll_func_cntl;
  331. u32 mpll_func_cntl_1;
  332. u32 mpll_func_cntl_2;
  333. u32 mpll_ss1;
  334. u32 mpll_ss2;
  335. };
  336. struct si_mc_reg_entry {
  337. u32 mclk_max;
  338. u32 mc_data[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  339. };
  340. struct si_mc_reg_table {
  341. u8 last;
  342. u8 num_entries;
  343. u16 valid_flag;
  344. struct si_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  345. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  346. };
  347. struct si_leakage_voltage_entry
  348. {
  349. u16 voltage;
  350. u16 leakage_index;
  351. };
  352. struct si_leakage_voltage
  353. {
  354. u16 count;
  355. struct si_leakage_voltage_entry entries[SISLANDS_MAX_LEAKAGE_COUNT];
  356. };
  357. struct si_ulv_param {
  358. bool supported;
  359. u32 cg_ulv_control;
  360. u32 cg_ulv_parameter;
  361. u32 volt_change_delay;
  362. struct rv7xx_pl pl;
  363. bool one_pcie_lane_in_ulv;
  364. };
  365. struct si_power_info {
  366. /* must be first! */
  367. struct ni_power_info ni;
  368. struct si_clock_registers clock_registers;
  369. struct si_mc_reg_table mc_reg_table;
  370. struct atom_voltage_table mvdd_voltage_table;
  371. struct atom_voltage_table vddc_phase_shed_table;
  372. struct si_leakage_voltage leakage_voltage;
  373. u16 mvdd_bootup_value;
  374. struct si_ulv_param ulv;
  375. u32 max_cu;
  376. /* pcie gen */
  377. enum si_pcie_gen force_pcie_gen;
  378. enum si_pcie_gen boot_pcie_gen;
  379. enum si_pcie_gen acpi_pcie_gen;
  380. u32 sys_pcie_mask;
  381. /* flags */
  382. bool enable_dte;
  383. bool enable_ppm;
  384. bool vddc_phase_shed_control;
  385. bool pspp_notify_required;
  386. bool sclk_deep_sleep_above_low;
  387. bool voltage_control_svi2;
  388. bool vddci_control_svi2;
  389. /* smc offsets */
  390. u32 sram_end;
  391. u32 state_table_start;
  392. u32 soft_regs_start;
  393. u32 mc_reg_table_start;
  394. u32 arb_table_start;
  395. u32 cac_table_start;
  396. u32 dte_table_start;
  397. u32 spll_table_start;
  398. u32 papm_cfg_table_start;
  399. u32 fan_table_start;
  400. /* CAC stuff */
  401. const struct si_cac_config_reg *cac_weights;
  402. const struct si_cac_config_reg *lcac_config;
  403. const struct si_cac_config_reg *cac_override;
  404. const struct si_powertune_data *powertune_data;
  405. struct si_dyn_powertune_data dyn_powertune_data;
  406. /* DTE stuff */
  407. struct si_dte_data dte_data;
  408. /* scratch structs */
  409. SMC_SIslands_MCRegisters smc_mc_reg_table;
  410. SISLANDS_SMC_STATETABLE smc_statetable;
  411. PP_SIslands_PAPMParameters papm_parm;
  412. /* SVI2 */
  413. u8 svd_gpio_id;
  414. u8 svc_gpio_id;
  415. /* fan control */
  416. bool fan_ctrl_is_in_default_mode;
  417. u32 t_min;
  418. u32 fan_ctrl_default_mode;
  419. bool fan_is_controlled_by_smc;
  420. };
  421. #endif