si_dpm.h 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  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 MAX_NO_OF_MVDD_VALUES 2
  38. #define MAX_NO_VREG_STEPS 32
  39. #define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
  40. #define SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE 32
  41. #define SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT 20
  42. #define RV770_ASI_DFLT 1000
  43. #define CYPRESS_HASI_DFLT 400000
  44. #define PCIE_PERF_REQ_PECI_GEN1 2
  45. #define PCIE_PERF_REQ_PECI_GEN2 3
  46. #define PCIE_PERF_REQ_PECI_GEN3 4
  47. #define RV770_DEFAULT_VCLK_FREQ 53300 /* 10 khz */
  48. #define RV770_DEFAULT_DCLK_FREQ 40000 /* 10 khz */
  49. #define SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE 16
  50. #define RV770_SMC_TABLE_ADDRESS 0xB000
  51. #define RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 3
  52. #define SMC_STROBE_RATIO 0x0F
  53. #define SMC_STROBE_ENABLE 0x10
  54. #define SMC_MC_EDC_RD_FLAG 0x01
  55. #define SMC_MC_EDC_WR_FLAG 0x02
  56. #define SMC_MC_RTT_ENABLE 0x04
  57. #define SMC_MC_STUTTER_EN 0x08
  58. #define RV770_SMC_VOLTAGEMASK_VDDC 0
  59. #define RV770_SMC_VOLTAGEMASK_MVDD 1
  60. #define RV770_SMC_VOLTAGEMASK_VDDCI 2
  61. #define RV770_SMC_VOLTAGEMASK_MAX 4
  62. #define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
  63. #define NISLANDS_SMC_STROBE_RATIO 0x0F
  64. #define NISLANDS_SMC_STROBE_ENABLE 0x10
  65. #define NISLANDS_SMC_MC_EDC_RD_FLAG 0x01
  66. #define NISLANDS_SMC_MC_EDC_WR_FLAG 0x02
  67. #define NISLANDS_SMC_MC_RTT_ENABLE 0x04
  68. #define NISLANDS_SMC_MC_STUTTER_EN 0x08
  69. #define MAX_NO_VREG_STEPS 32
  70. #define NISLANDS_SMC_VOLTAGEMASK_VDDC 0
  71. #define NISLANDS_SMC_VOLTAGEMASK_MVDD 1
  72. #define NISLANDS_SMC_VOLTAGEMASK_VDDCI 2
  73. #define NISLANDS_SMC_VOLTAGEMASK_MAX 4
  74. #define SISLANDS_MCREGISTERTABLE_INITIAL_SLOT 0
  75. #define SISLANDS_MCREGISTERTABLE_ACPI_SLOT 1
  76. #define SISLANDS_MCREGISTERTABLE_ULV_SLOT 2
  77. #define SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT 3
  78. #define SISLANDS_LEAKAGE_INDEX0 0xff01
  79. #define SISLANDS_MAX_LEAKAGE_COUNT 4
  80. #define SISLANDS_MAX_HARDWARE_POWERLEVELS 5
  81. #define SISLANDS_INITIAL_STATE_ARB_INDEX 0
  82. #define SISLANDS_ACPI_STATE_ARB_INDEX 1
  83. #define SISLANDS_ULV_STATE_ARB_INDEX 2
  84. #define SISLANDS_DRIVER_STATE_ARB_INDEX 3
  85. #define SISLANDS_DPM2_MAX_PULSE_SKIP 256
  86. #define SISLANDS_DPM2_NEAR_TDP_DEC 10
  87. #define SISLANDS_DPM2_ABOVE_SAFE_INC 5
  88. #define SISLANDS_DPM2_BELOW_SAFE_INC 20
  89. #define SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT 80
  90. #define SISLANDS_DPM2_MAXPS_PERCENT_H 99
  91. #define SISLANDS_DPM2_MAXPS_PERCENT_M 99
  92. #define SISLANDS_DPM2_SQ_RAMP_MAX_POWER 0x3FFF
  93. #define SISLANDS_DPM2_SQ_RAMP_MIN_POWER 0x12
  94. #define SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA 0x15
  95. #define SISLANDS_DPM2_SQ_RAMP_STI_SIZE 0x1E
  96. #define SISLANDS_DPM2_SQ_RAMP_LTI_RATIO 0xF
  97. #define SISLANDS_DPM2_PWREFFICIENCYRATIO_MARGIN 10
  98. #define SISLANDS_VRC_DFLT 0xC000B3
  99. #define SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT 1687
  100. #define SISLANDS_CGULVPARAMETER_DFLT 0x00040035
  101. #define SISLANDS_CGULVCONTROL_DFLT 0x1f007550
  102. #define SI_ASI_DFLT 10000
  103. #define SI_BSP_DFLT 0x41EB
  104. #define SI_BSU_DFLT 0x2
  105. #define SI_AH_DFLT 5
  106. #define SI_RLP_DFLT 25
  107. #define SI_RMP_DFLT 65
  108. #define SI_LHP_DFLT 40
  109. #define SI_LMP_DFLT 15
  110. #define SI_TD_DFLT 0
  111. #define SI_UTC_DFLT_00 0x24
  112. #define SI_UTC_DFLT_01 0x22
  113. #define SI_UTC_DFLT_02 0x22
  114. #define SI_UTC_DFLT_03 0x22
  115. #define SI_UTC_DFLT_04 0x22
  116. #define SI_UTC_DFLT_05 0x22
  117. #define SI_UTC_DFLT_06 0x22
  118. #define SI_UTC_DFLT_07 0x22
  119. #define SI_UTC_DFLT_08 0x22
  120. #define SI_UTC_DFLT_09 0x22
  121. #define SI_UTC_DFLT_10 0x22
  122. #define SI_UTC_DFLT_11 0x22
  123. #define SI_UTC_DFLT_12 0x22
  124. #define SI_UTC_DFLT_13 0x22
  125. #define SI_UTC_DFLT_14 0x22
  126. #define SI_DTC_DFLT_00 0x24
  127. #define SI_DTC_DFLT_01 0x22
  128. #define SI_DTC_DFLT_02 0x22
  129. #define SI_DTC_DFLT_03 0x22
  130. #define SI_DTC_DFLT_04 0x22
  131. #define SI_DTC_DFLT_05 0x22
  132. #define SI_DTC_DFLT_06 0x22
  133. #define SI_DTC_DFLT_07 0x22
  134. #define SI_DTC_DFLT_08 0x22
  135. #define SI_DTC_DFLT_09 0x22
  136. #define SI_DTC_DFLT_10 0x22
  137. #define SI_DTC_DFLT_11 0x22
  138. #define SI_DTC_DFLT_12 0x22
  139. #define SI_DTC_DFLT_13 0x22
  140. #define SI_DTC_DFLT_14 0x22
  141. #define SI_VRC_DFLT 0x0000C003
  142. #define SI_VOLTAGERESPONSETIME_DFLT 1000
  143. #define SI_BACKBIASRESPONSETIME_DFLT 1000
  144. #define SI_VRU_DFLT 0x3
  145. #define SI_SPLLSTEPTIME_DFLT 0x1000
  146. #define SI_SPLLSTEPUNIT_DFLT 0x3
  147. #define SI_TPU_DFLT 0
  148. #define SI_TPC_DFLT 0x200
  149. #define SI_SSTU_DFLT 0
  150. #define SI_SST_DFLT 0x00C8
  151. #define SI_GICST_DFLT 0x200
  152. #define SI_FCT_DFLT 0x0400
  153. #define SI_FCTU_DFLT 0
  154. #define SI_CTXCGTT3DRPHC_DFLT 0x20
  155. #define SI_CTXCGTT3DRSDC_DFLT 0x40
  156. #define SI_VDDC3DOORPHC_DFLT 0x100
  157. #define SI_VDDC3DOORSDC_DFLT 0x7
  158. #define SI_VDDC3DOORSU_DFLT 0
  159. #define SI_MPLLLOCKTIME_DFLT 100
  160. #define SI_MPLLRESETTIME_DFLT 150
  161. #define SI_VCOSTEPPCT_DFLT 20
  162. #define SI_ENDINGVCOSTEPPCT_DFLT 5
  163. #define SI_REFERENCEDIVIDER_DFLT 4
  164. #define SI_PM_NUMBER_OF_TC 15
  165. #define SI_PM_NUMBER_OF_SCLKS 20
  166. #define SI_PM_NUMBER_OF_MCLKS 4
  167. #define SI_PM_NUMBER_OF_VOLTAGE_LEVELS 4
  168. #define SI_PM_NUMBER_OF_ACTIVITY_LEVELS 3
  169. /* XXX are these ok? */
  170. #define SI_TEMP_RANGE_MIN (90 * 1000)
  171. #define SI_TEMP_RANGE_MAX (120 * 1000)
  172. #define FDO_PWM_MODE_STATIC 1
  173. #define FDO_PWM_MODE_STATIC_RPM 5
  174. enum ni_dc_cac_level
  175. {
  176. NISLANDS_DCCAC_LEVEL_0 = 0,
  177. NISLANDS_DCCAC_LEVEL_1,
  178. NISLANDS_DCCAC_LEVEL_2,
  179. NISLANDS_DCCAC_LEVEL_3,
  180. NISLANDS_DCCAC_LEVEL_4,
  181. NISLANDS_DCCAC_LEVEL_5,
  182. NISLANDS_DCCAC_LEVEL_6,
  183. NISLANDS_DCCAC_LEVEL_7,
  184. NISLANDS_DCCAC_MAX_LEVELS
  185. };
  186. enum si_cac_config_reg_type
  187. {
  188. SISLANDS_CACCONFIG_MMR = 0,
  189. SISLANDS_CACCONFIG_CGIND,
  190. SISLANDS_CACCONFIG_MAX
  191. };
  192. enum si_power_level {
  193. SI_POWER_LEVEL_LOW = 0,
  194. SI_POWER_LEVEL_MEDIUM = 1,
  195. SI_POWER_LEVEL_HIGH = 2,
  196. SI_POWER_LEVEL_CTXSW = 3,
  197. };
  198. enum si_td {
  199. SI_TD_AUTO,
  200. SI_TD_UP,
  201. SI_TD_DOWN,
  202. };
  203. enum si_display_watermark {
  204. SI_DISPLAY_WATERMARK_LOW = 0,
  205. SI_DISPLAY_WATERMARK_HIGH = 1,
  206. };
  207. enum si_display_gap
  208. {
  209. SI_PM_DISPLAY_GAP_VBLANK_OR_WM = 0,
  210. SI_PM_DISPLAY_GAP_VBLANK = 1,
  211. SI_PM_DISPLAY_GAP_WATERMARK = 2,
  212. SI_PM_DISPLAY_GAP_IGNORE = 3,
  213. };
  214. extern const struct amd_ip_funcs si_dpm_ip_funcs;
  215. extern const struct amd_pm_funcs si_dpm_funcs;
  216. struct ni_leakage_coeffients
  217. {
  218. u32 at;
  219. u32 bt;
  220. u32 av;
  221. u32 bv;
  222. s32 t_slope;
  223. s32 t_intercept;
  224. u32 t_ref;
  225. };
  226. struct SMC_Evergreen_MCRegisterAddress
  227. {
  228. uint16_t s0;
  229. uint16_t s1;
  230. };
  231. typedef struct SMC_Evergreen_MCRegisterAddress SMC_Evergreen_MCRegisterAddress;
  232. struct evergreen_mc_reg_entry {
  233. u32 mclk_max;
  234. u32 mc_data[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  235. };
  236. struct evergreen_mc_reg_table {
  237. u8 last;
  238. u8 num_entries;
  239. u16 valid_flag;
  240. struct evergreen_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  241. SMC_Evergreen_MCRegisterAddress mc_reg_address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  242. };
  243. struct SMC_Evergreen_MCRegisterSet
  244. {
  245. uint32_t value[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  246. };
  247. typedef struct SMC_Evergreen_MCRegisterSet SMC_Evergreen_MCRegisterSet;
  248. struct SMC_Evergreen_MCRegisters
  249. {
  250. uint8_t last;
  251. uint8_t reserved[3];
  252. SMC_Evergreen_MCRegisterAddress address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  253. SMC_Evergreen_MCRegisterSet data[5];
  254. };
  255. typedef struct SMC_Evergreen_MCRegisters SMC_Evergreen_MCRegisters;
  256. struct SMC_NIslands_MCRegisterSet
  257. {
  258. uint32_t value[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  259. };
  260. typedef struct SMC_NIslands_MCRegisterSet SMC_NIslands_MCRegisterSet;
  261. struct ni_mc_reg_entry {
  262. u32 mclk_max;
  263. u32 mc_data[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  264. };
  265. struct SMC_NIslands_MCRegisterAddress
  266. {
  267. uint16_t s0;
  268. uint16_t s1;
  269. };
  270. typedef struct SMC_NIslands_MCRegisterAddress SMC_NIslands_MCRegisterAddress;
  271. struct SMC_NIslands_MCRegisters
  272. {
  273. uint8_t last;
  274. uint8_t reserved[3];
  275. SMC_NIslands_MCRegisterAddress address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  276. SMC_NIslands_MCRegisterSet data[SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT];
  277. };
  278. typedef struct SMC_NIslands_MCRegisters SMC_NIslands_MCRegisters;
  279. struct evergreen_ulv_param {
  280. bool supported;
  281. struct rv7xx_pl *pl;
  282. };
  283. struct evergreen_arb_registers {
  284. u32 mc_arb_dram_timing;
  285. u32 mc_arb_dram_timing2;
  286. u32 mc_arb_rfsh_rate;
  287. u32 mc_arb_burst_time;
  288. };
  289. struct at {
  290. u32 rlp;
  291. u32 rmp;
  292. u32 lhp;
  293. u32 lmp;
  294. };
  295. struct ni_clock_registers {
  296. u32 cg_spll_func_cntl;
  297. u32 cg_spll_func_cntl_2;
  298. u32 cg_spll_func_cntl_3;
  299. u32 cg_spll_func_cntl_4;
  300. u32 cg_spll_spread_spectrum;
  301. u32 cg_spll_spread_spectrum_2;
  302. u32 mclk_pwrmgt_cntl;
  303. u32 dll_cntl;
  304. u32 mpll_ad_func_cntl;
  305. u32 mpll_ad_func_cntl_2;
  306. u32 mpll_dq_func_cntl;
  307. u32 mpll_dq_func_cntl_2;
  308. u32 mpll_ss1;
  309. u32 mpll_ss2;
  310. };
  311. struct RV770_SMC_SCLK_VALUE
  312. {
  313. uint32_t vCG_SPLL_FUNC_CNTL;
  314. uint32_t vCG_SPLL_FUNC_CNTL_2;
  315. uint32_t vCG_SPLL_FUNC_CNTL_3;
  316. uint32_t vCG_SPLL_SPREAD_SPECTRUM;
  317. uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
  318. uint32_t sclk_value;
  319. };
  320. typedef struct RV770_SMC_SCLK_VALUE RV770_SMC_SCLK_VALUE;
  321. struct RV770_SMC_MCLK_VALUE
  322. {
  323. uint32_t vMPLL_AD_FUNC_CNTL;
  324. uint32_t vMPLL_AD_FUNC_CNTL_2;
  325. uint32_t vMPLL_DQ_FUNC_CNTL;
  326. uint32_t vMPLL_DQ_FUNC_CNTL_2;
  327. uint32_t vMCLK_PWRMGT_CNTL;
  328. uint32_t vDLL_CNTL;
  329. uint32_t vMPLL_SS;
  330. uint32_t vMPLL_SS2;
  331. uint32_t mclk_value;
  332. };
  333. typedef struct RV770_SMC_MCLK_VALUE RV770_SMC_MCLK_VALUE;
  334. struct RV730_SMC_MCLK_VALUE
  335. {
  336. uint32_t vMCLK_PWRMGT_CNTL;
  337. uint32_t vDLL_CNTL;
  338. uint32_t vMPLL_FUNC_CNTL;
  339. uint32_t vMPLL_FUNC_CNTL2;
  340. uint32_t vMPLL_FUNC_CNTL3;
  341. uint32_t vMPLL_SS;
  342. uint32_t vMPLL_SS2;
  343. uint32_t mclk_value;
  344. };
  345. typedef struct RV730_SMC_MCLK_VALUE RV730_SMC_MCLK_VALUE;
  346. struct RV770_SMC_VOLTAGE_VALUE
  347. {
  348. uint16_t value;
  349. uint8_t index;
  350. uint8_t padding;
  351. };
  352. typedef struct RV770_SMC_VOLTAGE_VALUE RV770_SMC_VOLTAGE_VALUE;
  353. union RV7XX_SMC_MCLK_VALUE
  354. {
  355. RV770_SMC_MCLK_VALUE mclk770;
  356. RV730_SMC_MCLK_VALUE mclk730;
  357. };
  358. typedef union RV7XX_SMC_MCLK_VALUE RV7XX_SMC_MCLK_VALUE, *LPRV7XX_SMC_MCLK_VALUE;
  359. struct RV770_SMC_HW_PERFORMANCE_LEVEL
  360. {
  361. uint8_t arbValue;
  362. union{
  363. uint8_t seqValue;
  364. uint8_t ACIndex;
  365. };
  366. uint8_t displayWatermark;
  367. uint8_t gen2PCIE;
  368. uint8_t gen2XSP;
  369. uint8_t backbias;
  370. uint8_t strobeMode;
  371. uint8_t mcFlags;
  372. uint32_t aT;
  373. uint32_t bSP;
  374. RV770_SMC_SCLK_VALUE sclk;
  375. RV7XX_SMC_MCLK_VALUE mclk;
  376. RV770_SMC_VOLTAGE_VALUE vddc;
  377. RV770_SMC_VOLTAGE_VALUE mvdd;
  378. RV770_SMC_VOLTAGE_VALUE vddci;
  379. uint8_t reserved1;
  380. uint8_t reserved2;
  381. uint8_t stateFlags;
  382. uint8_t padding;
  383. };
  384. typedef struct RV770_SMC_HW_PERFORMANCE_LEVEL RV770_SMC_HW_PERFORMANCE_LEVEL;
  385. struct RV770_SMC_SWSTATE
  386. {
  387. uint8_t flags;
  388. uint8_t padding1;
  389. uint8_t padding2;
  390. uint8_t padding3;
  391. RV770_SMC_HW_PERFORMANCE_LEVEL levels[RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  392. };
  393. typedef struct RV770_SMC_SWSTATE RV770_SMC_SWSTATE;
  394. struct RV770_SMC_VOLTAGEMASKTABLE
  395. {
  396. uint8_t highMask[RV770_SMC_VOLTAGEMASK_MAX];
  397. uint32_t lowMask[RV770_SMC_VOLTAGEMASK_MAX];
  398. };
  399. typedef struct RV770_SMC_VOLTAGEMASKTABLE RV770_SMC_VOLTAGEMASKTABLE;
  400. struct RV770_SMC_STATETABLE
  401. {
  402. uint8_t thermalProtectType;
  403. uint8_t systemFlags;
  404. uint8_t maxVDDCIndexInPPTable;
  405. uint8_t extraFlags;
  406. uint8_t highSMIO[MAX_NO_VREG_STEPS];
  407. uint32_t lowSMIO[MAX_NO_VREG_STEPS];
  408. RV770_SMC_VOLTAGEMASKTABLE voltageMaskTable;
  409. RV770_SMC_SWSTATE initialState;
  410. RV770_SMC_SWSTATE ACPIState;
  411. RV770_SMC_SWSTATE driverState;
  412. RV770_SMC_SWSTATE ULVState;
  413. };
  414. typedef struct RV770_SMC_STATETABLE RV770_SMC_STATETABLE;
  415. struct vddc_table_entry {
  416. u16 vddc;
  417. u8 vddc_index;
  418. u8 high_smio;
  419. u32 low_smio;
  420. };
  421. struct rv770_clock_registers {
  422. u32 cg_spll_func_cntl;
  423. u32 cg_spll_func_cntl_2;
  424. u32 cg_spll_func_cntl_3;
  425. u32 cg_spll_spread_spectrum;
  426. u32 cg_spll_spread_spectrum_2;
  427. u32 mpll_ad_func_cntl;
  428. u32 mpll_ad_func_cntl_2;
  429. u32 mpll_dq_func_cntl;
  430. u32 mpll_dq_func_cntl_2;
  431. u32 mclk_pwrmgt_cntl;
  432. u32 dll_cntl;
  433. u32 mpll_ss1;
  434. u32 mpll_ss2;
  435. };
  436. struct rv730_clock_registers {
  437. u32 cg_spll_func_cntl;
  438. u32 cg_spll_func_cntl_2;
  439. u32 cg_spll_func_cntl_3;
  440. u32 cg_spll_spread_spectrum;
  441. u32 cg_spll_spread_spectrum_2;
  442. u32 mclk_pwrmgt_cntl;
  443. u32 dll_cntl;
  444. u32 mpll_func_cntl;
  445. u32 mpll_func_cntl2;
  446. u32 mpll_func_cntl3;
  447. u32 mpll_ss;
  448. u32 mpll_ss2;
  449. };
  450. union r7xx_clock_registers {
  451. struct rv770_clock_registers rv770;
  452. struct rv730_clock_registers rv730;
  453. };
  454. struct rv7xx_power_info {
  455. /* flags */
  456. bool mem_gddr5;
  457. bool pcie_gen2;
  458. bool dynamic_pcie_gen2;
  459. bool acpi_pcie_gen2;
  460. bool boot_in_gen2;
  461. bool voltage_control; /* vddc */
  462. bool mvdd_control;
  463. bool sclk_ss;
  464. bool mclk_ss;
  465. bool dynamic_ss;
  466. bool gfx_clock_gating;
  467. bool mg_clock_gating;
  468. bool mgcgtssm;
  469. bool power_gating;
  470. bool thermal_protection;
  471. bool display_gap;
  472. bool dcodt;
  473. bool ulps;
  474. /* registers */
  475. union r7xx_clock_registers clk_regs;
  476. u32 s0_vid_lower_smio_cntl;
  477. /* voltage */
  478. u32 vddc_mask_low;
  479. u32 mvdd_mask_low;
  480. u32 mvdd_split_frequency;
  481. u32 mvdd_low_smio[MAX_NO_OF_MVDD_VALUES];
  482. u16 max_vddc;
  483. u16 max_vddc_in_table;
  484. u16 min_vddc_in_table;
  485. struct vddc_table_entry vddc_table[MAX_NO_VREG_STEPS];
  486. u8 valid_vddc_entries;
  487. /* dc odt */
  488. u32 mclk_odt_threshold;
  489. u8 odt_value_0[2];
  490. u8 odt_value_1[2];
  491. /* stored values */
  492. u32 boot_sclk;
  493. u16 acpi_vddc;
  494. u32 ref_div;
  495. u32 active_auto_throttle_sources;
  496. u32 mclk_stutter_mode_threshold;
  497. u32 mclk_strobe_mode_threshold;
  498. u32 mclk_edc_enable_threshold;
  499. u32 bsp;
  500. u32 bsu;
  501. u32 pbsp;
  502. u32 pbsu;
  503. u32 dsp;
  504. u32 psp;
  505. u32 asi;
  506. u32 pasi;
  507. u32 vrc;
  508. u32 restricted_levels;
  509. u32 rlp;
  510. u32 rmp;
  511. u32 lhp;
  512. u32 lmp;
  513. /* smc offsets */
  514. u16 state_table_start;
  515. u16 soft_regs_start;
  516. u16 sram_end;
  517. /* scratch structs */
  518. RV770_SMC_STATETABLE smc_statetable;
  519. };
  520. struct rv7xx_pl {
  521. u32 sclk;
  522. u32 mclk;
  523. u16 vddc;
  524. u16 vddci; /* eg+ only */
  525. u32 flags;
  526. enum amdgpu_pcie_gen pcie_gen; /* si+ only */
  527. };
  528. struct rv7xx_ps {
  529. struct rv7xx_pl high;
  530. struct rv7xx_pl medium;
  531. struct rv7xx_pl low;
  532. bool dc_compatible;
  533. };
  534. struct si_ps {
  535. u16 performance_level_count;
  536. bool dc_compatible;
  537. struct rv7xx_pl performance_levels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  538. };
  539. struct ni_mc_reg_table {
  540. u8 last;
  541. u8 num_entries;
  542. u16 valid_flag;
  543. struct ni_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  544. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  545. };
  546. struct ni_cac_data
  547. {
  548. struct ni_leakage_coeffients leakage_coefficients;
  549. u32 i_leakage;
  550. s32 leakage_minimum_temperature;
  551. u32 pwr_const;
  552. u32 dc_cac_value;
  553. u32 bif_cac_value;
  554. u32 lkge_pwr;
  555. u8 mc_wr_weight;
  556. u8 mc_rd_weight;
  557. u8 allow_ovrflw;
  558. u8 num_win_tdp;
  559. u8 l2num_win_tdp;
  560. u8 lts_truncate_n;
  561. };
  562. struct evergreen_power_info {
  563. /* must be first! */
  564. struct rv7xx_power_info rv7xx;
  565. /* flags */
  566. bool vddci_control;
  567. bool dynamic_ac_timing;
  568. bool abm;
  569. bool mcls;
  570. bool light_sleep;
  571. bool memory_transition;
  572. bool pcie_performance_request;
  573. bool pcie_performance_request_registered;
  574. bool sclk_deep_sleep;
  575. bool dll_default_on;
  576. bool ls_clock_gating;
  577. bool smu_uvd_hs;
  578. bool uvd_enabled;
  579. /* stored values */
  580. u16 acpi_vddci;
  581. u8 mvdd_high_index;
  582. u8 mvdd_low_index;
  583. u32 mclk_edc_wr_enable_threshold;
  584. struct evergreen_mc_reg_table mc_reg_table;
  585. struct atom_voltage_table vddc_voltage_table;
  586. struct atom_voltage_table vddci_voltage_table;
  587. struct evergreen_arb_registers bootup_arb_registers;
  588. struct evergreen_ulv_param ulv;
  589. struct at ats[2];
  590. /* smc offsets */
  591. u16 mc_reg_table_start;
  592. struct amdgpu_ps current_rps;
  593. struct rv7xx_ps current_ps;
  594. struct amdgpu_ps requested_rps;
  595. struct rv7xx_ps requested_ps;
  596. };
  597. struct PP_NIslands_Dpm2PerfLevel
  598. {
  599. uint8_t MaxPS;
  600. uint8_t TgtAct;
  601. uint8_t MaxPS_StepInc;
  602. uint8_t MaxPS_StepDec;
  603. uint8_t PSST;
  604. uint8_t NearTDPDec;
  605. uint8_t AboveSafeInc;
  606. uint8_t BelowSafeInc;
  607. uint8_t PSDeltaLimit;
  608. uint8_t PSDeltaWin;
  609. uint8_t Reserved[6];
  610. };
  611. typedef struct PP_NIslands_Dpm2PerfLevel PP_NIslands_Dpm2PerfLevel;
  612. struct PP_NIslands_DPM2Parameters
  613. {
  614. uint32_t TDPLimit;
  615. uint32_t NearTDPLimit;
  616. uint32_t SafePowerLimit;
  617. uint32_t PowerBoostLimit;
  618. };
  619. typedef struct PP_NIslands_DPM2Parameters PP_NIslands_DPM2Parameters;
  620. struct NISLANDS_SMC_SCLK_VALUE
  621. {
  622. uint32_t vCG_SPLL_FUNC_CNTL;
  623. uint32_t vCG_SPLL_FUNC_CNTL_2;
  624. uint32_t vCG_SPLL_FUNC_CNTL_3;
  625. uint32_t vCG_SPLL_FUNC_CNTL_4;
  626. uint32_t vCG_SPLL_SPREAD_SPECTRUM;
  627. uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
  628. uint32_t sclk_value;
  629. };
  630. typedef struct NISLANDS_SMC_SCLK_VALUE NISLANDS_SMC_SCLK_VALUE;
  631. struct NISLANDS_SMC_MCLK_VALUE
  632. {
  633. uint32_t vMPLL_FUNC_CNTL;
  634. uint32_t vMPLL_FUNC_CNTL_1;
  635. uint32_t vMPLL_FUNC_CNTL_2;
  636. uint32_t vMPLL_AD_FUNC_CNTL;
  637. uint32_t vMPLL_AD_FUNC_CNTL_2;
  638. uint32_t vMPLL_DQ_FUNC_CNTL;
  639. uint32_t vMPLL_DQ_FUNC_CNTL_2;
  640. uint32_t vMCLK_PWRMGT_CNTL;
  641. uint32_t vDLL_CNTL;
  642. uint32_t vMPLL_SS;
  643. uint32_t vMPLL_SS2;
  644. uint32_t mclk_value;
  645. };
  646. typedef struct NISLANDS_SMC_MCLK_VALUE NISLANDS_SMC_MCLK_VALUE;
  647. struct NISLANDS_SMC_VOLTAGE_VALUE
  648. {
  649. uint16_t value;
  650. uint8_t index;
  651. uint8_t padding;
  652. };
  653. typedef struct NISLANDS_SMC_VOLTAGE_VALUE NISLANDS_SMC_VOLTAGE_VALUE;
  654. struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL
  655. {
  656. uint8_t arbValue;
  657. uint8_t ACIndex;
  658. uint8_t displayWatermark;
  659. uint8_t gen2PCIE;
  660. uint8_t reserved1;
  661. uint8_t reserved2;
  662. uint8_t strobeMode;
  663. uint8_t mcFlags;
  664. uint32_t aT;
  665. uint32_t bSP;
  666. NISLANDS_SMC_SCLK_VALUE sclk;
  667. NISLANDS_SMC_MCLK_VALUE mclk;
  668. NISLANDS_SMC_VOLTAGE_VALUE vddc;
  669. NISLANDS_SMC_VOLTAGE_VALUE mvdd;
  670. NISLANDS_SMC_VOLTAGE_VALUE vddci;
  671. NISLANDS_SMC_VOLTAGE_VALUE std_vddc;
  672. uint32_t powergate_en;
  673. uint8_t hUp;
  674. uint8_t hDown;
  675. uint8_t stateFlags;
  676. uint8_t arbRefreshState;
  677. uint32_t SQPowerThrottle;
  678. uint32_t SQPowerThrottle_2;
  679. uint32_t reserved[2];
  680. PP_NIslands_Dpm2PerfLevel dpm2;
  681. };
  682. typedef struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL NISLANDS_SMC_HW_PERFORMANCE_LEVEL;
  683. struct NISLANDS_SMC_SWSTATE
  684. {
  685. uint8_t flags;
  686. uint8_t levelCount;
  687. uint8_t padding2;
  688. uint8_t padding3;
  689. NISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[1];
  690. };
  691. typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
  692. struct NISLANDS_SMC_VOLTAGEMASKTABLE
  693. {
  694. uint8_t highMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
  695. uint32_t lowMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
  696. };
  697. typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
  698. #define NISLANDS_MAX_NO_VREG_STEPS 32
  699. struct NISLANDS_SMC_STATETABLE
  700. {
  701. uint8_t thermalProtectType;
  702. uint8_t systemFlags;
  703. uint8_t maxVDDCIndexInPPTable;
  704. uint8_t extraFlags;
  705. uint8_t highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
  706. uint32_t lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
  707. NISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
  708. PP_NIslands_DPM2Parameters dpm2Params;
  709. NISLANDS_SMC_SWSTATE initialState;
  710. NISLANDS_SMC_SWSTATE ACPIState;
  711. NISLANDS_SMC_SWSTATE ULVState;
  712. NISLANDS_SMC_SWSTATE driverState;
  713. NISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
  714. };
  715. typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
  716. struct ni_power_info {
  717. /* must be first! */
  718. struct evergreen_power_info eg;
  719. struct ni_clock_registers clock_registers;
  720. struct ni_mc_reg_table mc_reg_table;
  721. u32 mclk_rtt_mode_threshold;
  722. /* flags */
  723. bool use_power_boost_limit;
  724. bool support_cac_long_term_average;
  725. bool cac_enabled;
  726. bool cac_configuration_required;
  727. bool driver_calculate_cac_leakage;
  728. bool pc_enabled;
  729. bool enable_power_containment;
  730. bool enable_cac;
  731. bool enable_sq_ramping;
  732. /* smc offsets */
  733. u16 arb_table_start;
  734. u16 fan_table_start;
  735. u16 cac_table_start;
  736. u16 spll_table_start;
  737. /* CAC stuff */
  738. struct ni_cac_data cac_data;
  739. u32 dc_cac_table[NISLANDS_DCCAC_MAX_LEVELS];
  740. const struct ni_cac_weights *cac_weights;
  741. u8 lta_window_size;
  742. u8 lts_truncate;
  743. struct si_ps current_ps;
  744. struct si_ps requested_ps;
  745. /* scratch structs */
  746. SMC_NIslands_MCRegisters smc_mc_reg_table;
  747. NISLANDS_SMC_STATETABLE smc_statetable;
  748. };
  749. struct si_cac_config_reg
  750. {
  751. u32 offset;
  752. u32 mask;
  753. u32 shift;
  754. u32 value;
  755. enum si_cac_config_reg_type type;
  756. };
  757. struct si_powertune_data
  758. {
  759. u32 cac_window;
  760. u32 l2_lta_window_size_default;
  761. u8 lts_truncate_default;
  762. u8 shift_n_default;
  763. u8 operating_temp;
  764. struct ni_leakage_coeffients leakage_coefficients;
  765. u32 fixed_kt;
  766. u32 lkge_lut_v0_percent;
  767. u8 dc_cac[NISLANDS_DCCAC_MAX_LEVELS];
  768. bool enable_powertune_by_default;
  769. };
  770. struct si_dyn_powertune_data
  771. {
  772. u32 cac_leakage;
  773. s32 leakage_minimum_temperature;
  774. u32 wintime;
  775. u32 l2_lta_window_size;
  776. u8 lts_truncate;
  777. u8 shift_n;
  778. u8 dc_pwr_value;
  779. bool disable_uvd_powertune;
  780. };
  781. struct si_dte_data
  782. {
  783. u32 tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  784. u32 r[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  785. u32 k;
  786. u32 t0;
  787. u32 max_t;
  788. u8 window_size;
  789. u8 temp_select;
  790. u8 dte_mode;
  791. u8 tdep_count;
  792. u8 t_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  793. u32 tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  794. u32 tdep_r[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  795. u32 t_threshold;
  796. bool enable_dte_by_default;
  797. };
  798. struct si_clock_registers {
  799. u32 cg_spll_func_cntl;
  800. u32 cg_spll_func_cntl_2;
  801. u32 cg_spll_func_cntl_3;
  802. u32 cg_spll_func_cntl_4;
  803. u32 cg_spll_spread_spectrum;
  804. u32 cg_spll_spread_spectrum_2;
  805. u32 dll_cntl;
  806. u32 mclk_pwrmgt_cntl;
  807. u32 mpll_ad_func_cntl;
  808. u32 mpll_dq_func_cntl;
  809. u32 mpll_func_cntl;
  810. u32 mpll_func_cntl_1;
  811. u32 mpll_func_cntl_2;
  812. u32 mpll_ss1;
  813. u32 mpll_ss2;
  814. };
  815. struct si_mc_reg_entry {
  816. u32 mclk_max;
  817. u32 mc_data[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  818. };
  819. struct si_mc_reg_table {
  820. u8 last;
  821. u8 num_entries;
  822. u16 valid_flag;
  823. struct si_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  824. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  825. };
  826. struct si_leakage_voltage_entry
  827. {
  828. u16 voltage;
  829. u16 leakage_index;
  830. };
  831. struct si_leakage_voltage
  832. {
  833. u16 count;
  834. struct si_leakage_voltage_entry entries[SISLANDS_MAX_LEAKAGE_COUNT];
  835. };
  836. struct si_ulv_param {
  837. bool supported;
  838. u32 cg_ulv_control;
  839. u32 cg_ulv_parameter;
  840. u32 volt_change_delay;
  841. struct rv7xx_pl pl;
  842. bool one_pcie_lane_in_ulv;
  843. };
  844. struct si_power_info {
  845. /* must be first! */
  846. struct ni_power_info ni;
  847. struct si_clock_registers clock_registers;
  848. struct si_mc_reg_table mc_reg_table;
  849. struct atom_voltage_table mvdd_voltage_table;
  850. struct atom_voltage_table vddc_phase_shed_table;
  851. struct si_leakage_voltage leakage_voltage;
  852. u16 mvdd_bootup_value;
  853. struct si_ulv_param ulv;
  854. u32 max_cu;
  855. /* pcie gen */
  856. enum amdgpu_pcie_gen force_pcie_gen;
  857. enum amdgpu_pcie_gen boot_pcie_gen;
  858. enum amdgpu_pcie_gen acpi_pcie_gen;
  859. u32 sys_pcie_mask;
  860. /* flags */
  861. bool enable_dte;
  862. bool enable_ppm;
  863. bool vddc_phase_shed_control;
  864. bool pspp_notify_required;
  865. bool sclk_deep_sleep_above_low;
  866. bool voltage_control_svi2;
  867. bool vddci_control_svi2;
  868. /* smc offsets */
  869. u32 sram_end;
  870. u32 state_table_start;
  871. u32 soft_regs_start;
  872. u32 mc_reg_table_start;
  873. u32 arb_table_start;
  874. u32 cac_table_start;
  875. u32 dte_table_start;
  876. u32 spll_table_start;
  877. u32 papm_cfg_table_start;
  878. u32 fan_table_start;
  879. /* CAC stuff */
  880. const struct si_cac_config_reg *cac_weights;
  881. const struct si_cac_config_reg *lcac_config;
  882. const struct si_cac_config_reg *cac_override;
  883. const struct si_powertune_data *powertune_data;
  884. struct si_dyn_powertune_data dyn_powertune_data;
  885. /* DTE stuff */
  886. struct si_dte_data dte_data;
  887. /* scratch structs */
  888. SMC_SIslands_MCRegisters smc_mc_reg_table;
  889. SISLANDS_SMC_STATETABLE smc_statetable;
  890. PP_SIslands_PAPMParameters papm_parm;
  891. /* SVI2 */
  892. u8 svd_gpio_id;
  893. u8 svc_gpio_id;
  894. /* fan control */
  895. bool fan_ctrl_is_in_default_mode;
  896. u32 t_min;
  897. u32 fan_ctrl_default_mode;
  898. bool fan_is_controlled_by_smc;
  899. };
  900. #endif