si_dpm.h 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  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 amdgpu_ip_block_version si_smu_ip_block;
  215. struct ni_leakage_coeffients
  216. {
  217. u32 at;
  218. u32 bt;
  219. u32 av;
  220. u32 bv;
  221. s32 t_slope;
  222. s32 t_intercept;
  223. u32 t_ref;
  224. };
  225. struct SMC_Evergreen_MCRegisterAddress
  226. {
  227. uint16_t s0;
  228. uint16_t s1;
  229. };
  230. typedef struct SMC_Evergreen_MCRegisterAddress SMC_Evergreen_MCRegisterAddress;
  231. struct evergreen_mc_reg_entry {
  232. u32 mclk_max;
  233. u32 mc_data[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  234. };
  235. struct evergreen_mc_reg_table {
  236. u8 last;
  237. u8 num_entries;
  238. u16 valid_flag;
  239. struct evergreen_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  240. SMC_Evergreen_MCRegisterAddress mc_reg_address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  241. };
  242. struct SMC_Evergreen_MCRegisterSet
  243. {
  244. uint32_t value[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  245. };
  246. typedef struct SMC_Evergreen_MCRegisterSet SMC_Evergreen_MCRegisterSet;
  247. struct SMC_Evergreen_MCRegisters
  248. {
  249. uint8_t last;
  250. uint8_t reserved[3];
  251. SMC_Evergreen_MCRegisterAddress address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
  252. SMC_Evergreen_MCRegisterSet data[5];
  253. };
  254. typedef struct SMC_Evergreen_MCRegisters SMC_Evergreen_MCRegisters;
  255. struct SMC_NIslands_MCRegisterSet
  256. {
  257. uint32_t value[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  258. };
  259. typedef struct SMC_NIslands_MCRegisterSet SMC_NIslands_MCRegisterSet;
  260. struct ni_mc_reg_entry {
  261. u32 mclk_max;
  262. u32 mc_data[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  263. };
  264. struct SMC_NIslands_MCRegisterAddress
  265. {
  266. uint16_t s0;
  267. uint16_t s1;
  268. };
  269. typedef struct SMC_NIslands_MCRegisterAddress SMC_NIslands_MCRegisterAddress;
  270. struct SMC_NIslands_MCRegisters
  271. {
  272. uint8_t last;
  273. uint8_t reserved[3];
  274. SMC_NIslands_MCRegisterAddress address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  275. SMC_NIslands_MCRegisterSet data[SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT];
  276. };
  277. typedef struct SMC_NIslands_MCRegisters SMC_NIslands_MCRegisters;
  278. struct evergreen_ulv_param {
  279. bool supported;
  280. struct rv7xx_pl *pl;
  281. };
  282. struct evergreen_arb_registers {
  283. u32 mc_arb_dram_timing;
  284. u32 mc_arb_dram_timing2;
  285. u32 mc_arb_rfsh_rate;
  286. u32 mc_arb_burst_time;
  287. };
  288. struct at {
  289. u32 rlp;
  290. u32 rmp;
  291. u32 lhp;
  292. u32 lmp;
  293. };
  294. struct ni_clock_registers {
  295. u32 cg_spll_func_cntl;
  296. u32 cg_spll_func_cntl_2;
  297. u32 cg_spll_func_cntl_3;
  298. u32 cg_spll_func_cntl_4;
  299. u32 cg_spll_spread_spectrum;
  300. u32 cg_spll_spread_spectrum_2;
  301. u32 mclk_pwrmgt_cntl;
  302. u32 dll_cntl;
  303. u32 mpll_ad_func_cntl;
  304. u32 mpll_ad_func_cntl_2;
  305. u32 mpll_dq_func_cntl;
  306. u32 mpll_dq_func_cntl_2;
  307. u32 mpll_ss1;
  308. u32 mpll_ss2;
  309. };
  310. struct RV770_SMC_SCLK_VALUE
  311. {
  312. uint32_t vCG_SPLL_FUNC_CNTL;
  313. uint32_t vCG_SPLL_FUNC_CNTL_2;
  314. uint32_t vCG_SPLL_FUNC_CNTL_3;
  315. uint32_t vCG_SPLL_SPREAD_SPECTRUM;
  316. uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
  317. uint32_t sclk_value;
  318. };
  319. typedef struct RV770_SMC_SCLK_VALUE RV770_SMC_SCLK_VALUE;
  320. struct RV770_SMC_MCLK_VALUE
  321. {
  322. uint32_t vMPLL_AD_FUNC_CNTL;
  323. uint32_t vMPLL_AD_FUNC_CNTL_2;
  324. uint32_t vMPLL_DQ_FUNC_CNTL;
  325. uint32_t vMPLL_DQ_FUNC_CNTL_2;
  326. uint32_t vMCLK_PWRMGT_CNTL;
  327. uint32_t vDLL_CNTL;
  328. uint32_t vMPLL_SS;
  329. uint32_t vMPLL_SS2;
  330. uint32_t mclk_value;
  331. };
  332. typedef struct RV770_SMC_MCLK_VALUE RV770_SMC_MCLK_VALUE;
  333. struct RV730_SMC_MCLK_VALUE
  334. {
  335. uint32_t vMCLK_PWRMGT_CNTL;
  336. uint32_t vDLL_CNTL;
  337. uint32_t vMPLL_FUNC_CNTL;
  338. uint32_t vMPLL_FUNC_CNTL2;
  339. uint32_t vMPLL_FUNC_CNTL3;
  340. uint32_t vMPLL_SS;
  341. uint32_t vMPLL_SS2;
  342. uint32_t mclk_value;
  343. };
  344. typedef struct RV730_SMC_MCLK_VALUE RV730_SMC_MCLK_VALUE;
  345. struct RV770_SMC_VOLTAGE_VALUE
  346. {
  347. uint16_t value;
  348. uint8_t index;
  349. uint8_t padding;
  350. };
  351. typedef struct RV770_SMC_VOLTAGE_VALUE RV770_SMC_VOLTAGE_VALUE;
  352. union RV7XX_SMC_MCLK_VALUE
  353. {
  354. RV770_SMC_MCLK_VALUE mclk770;
  355. RV730_SMC_MCLK_VALUE mclk730;
  356. };
  357. typedef union RV7XX_SMC_MCLK_VALUE RV7XX_SMC_MCLK_VALUE, *LPRV7XX_SMC_MCLK_VALUE;
  358. struct RV770_SMC_HW_PERFORMANCE_LEVEL
  359. {
  360. uint8_t arbValue;
  361. union{
  362. uint8_t seqValue;
  363. uint8_t ACIndex;
  364. };
  365. uint8_t displayWatermark;
  366. uint8_t gen2PCIE;
  367. uint8_t gen2XSP;
  368. uint8_t backbias;
  369. uint8_t strobeMode;
  370. uint8_t mcFlags;
  371. uint32_t aT;
  372. uint32_t bSP;
  373. RV770_SMC_SCLK_VALUE sclk;
  374. RV7XX_SMC_MCLK_VALUE mclk;
  375. RV770_SMC_VOLTAGE_VALUE vddc;
  376. RV770_SMC_VOLTAGE_VALUE mvdd;
  377. RV770_SMC_VOLTAGE_VALUE vddci;
  378. uint8_t reserved1;
  379. uint8_t reserved2;
  380. uint8_t stateFlags;
  381. uint8_t padding;
  382. };
  383. typedef struct RV770_SMC_HW_PERFORMANCE_LEVEL RV770_SMC_HW_PERFORMANCE_LEVEL;
  384. struct RV770_SMC_SWSTATE
  385. {
  386. uint8_t flags;
  387. uint8_t padding1;
  388. uint8_t padding2;
  389. uint8_t padding3;
  390. RV770_SMC_HW_PERFORMANCE_LEVEL levels[RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  391. };
  392. typedef struct RV770_SMC_SWSTATE RV770_SMC_SWSTATE;
  393. struct RV770_SMC_VOLTAGEMASKTABLE
  394. {
  395. uint8_t highMask[RV770_SMC_VOLTAGEMASK_MAX];
  396. uint32_t lowMask[RV770_SMC_VOLTAGEMASK_MAX];
  397. };
  398. typedef struct RV770_SMC_VOLTAGEMASKTABLE RV770_SMC_VOLTAGEMASKTABLE;
  399. struct RV770_SMC_STATETABLE
  400. {
  401. uint8_t thermalProtectType;
  402. uint8_t systemFlags;
  403. uint8_t maxVDDCIndexInPPTable;
  404. uint8_t extraFlags;
  405. uint8_t highSMIO[MAX_NO_VREG_STEPS];
  406. uint32_t lowSMIO[MAX_NO_VREG_STEPS];
  407. RV770_SMC_VOLTAGEMASKTABLE voltageMaskTable;
  408. RV770_SMC_SWSTATE initialState;
  409. RV770_SMC_SWSTATE ACPIState;
  410. RV770_SMC_SWSTATE driverState;
  411. RV770_SMC_SWSTATE ULVState;
  412. };
  413. typedef struct RV770_SMC_STATETABLE RV770_SMC_STATETABLE;
  414. struct vddc_table_entry {
  415. u16 vddc;
  416. u8 vddc_index;
  417. u8 high_smio;
  418. u32 low_smio;
  419. };
  420. struct rv770_clock_registers {
  421. u32 cg_spll_func_cntl;
  422. u32 cg_spll_func_cntl_2;
  423. u32 cg_spll_func_cntl_3;
  424. u32 cg_spll_spread_spectrum;
  425. u32 cg_spll_spread_spectrum_2;
  426. u32 mpll_ad_func_cntl;
  427. u32 mpll_ad_func_cntl_2;
  428. u32 mpll_dq_func_cntl;
  429. u32 mpll_dq_func_cntl_2;
  430. u32 mclk_pwrmgt_cntl;
  431. u32 dll_cntl;
  432. u32 mpll_ss1;
  433. u32 mpll_ss2;
  434. };
  435. struct rv730_clock_registers {
  436. u32 cg_spll_func_cntl;
  437. u32 cg_spll_func_cntl_2;
  438. u32 cg_spll_func_cntl_3;
  439. u32 cg_spll_spread_spectrum;
  440. u32 cg_spll_spread_spectrum_2;
  441. u32 mclk_pwrmgt_cntl;
  442. u32 dll_cntl;
  443. u32 mpll_func_cntl;
  444. u32 mpll_func_cntl2;
  445. u32 mpll_func_cntl3;
  446. u32 mpll_ss;
  447. u32 mpll_ss2;
  448. };
  449. union r7xx_clock_registers {
  450. struct rv770_clock_registers rv770;
  451. struct rv730_clock_registers rv730;
  452. };
  453. struct rv7xx_power_info {
  454. /* flags */
  455. bool mem_gddr5;
  456. bool pcie_gen2;
  457. bool dynamic_pcie_gen2;
  458. bool acpi_pcie_gen2;
  459. bool boot_in_gen2;
  460. bool voltage_control; /* vddc */
  461. bool mvdd_control;
  462. bool sclk_ss;
  463. bool mclk_ss;
  464. bool dynamic_ss;
  465. bool gfx_clock_gating;
  466. bool mg_clock_gating;
  467. bool mgcgtssm;
  468. bool power_gating;
  469. bool thermal_protection;
  470. bool display_gap;
  471. bool dcodt;
  472. bool ulps;
  473. /* registers */
  474. union r7xx_clock_registers clk_regs;
  475. u32 s0_vid_lower_smio_cntl;
  476. /* voltage */
  477. u32 vddc_mask_low;
  478. u32 mvdd_mask_low;
  479. u32 mvdd_split_frequency;
  480. u32 mvdd_low_smio[MAX_NO_OF_MVDD_VALUES];
  481. u16 max_vddc;
  482. u16 max_vddc_in_table;
  483. u16 min_vddc_in_table;
  484. struct vddc_table_entry vddc_table[MAX_NO_VREG_STEPS];
  485. u8 valid_vddc_entries;
  486. /* dc odt */
  487. u32 mclk_odt_threshold;
  488. u8 odt_value_0[2];
  489. u8 odt_value_1[2];
  490. /* stored values */
  491. u32 boot_sclk;
  492. u16 acpi_vddc;
  493. u32 ref_div;
  494. u32 active_auto_throttle_sources;
  495. u32 mclk_stutter_mode_threshold;
  496. u32 mclk_strobe_mode_threshold;
  497. u32 mclk_edc_enable_threshold;
  498. u32 bsp;
  499. u32 bsu;
  500. u32 pbsp;
  501. u32 pbsu;
  502. u32 dsp;
  503. u32 psp;
  504. u32 asi;
  505. u32 pasi;
  506. u32 vrc;
  507. u32 restricted_levels;
  508. u32 rlp;
  509. u32 rmp;
  510. u32 lhp;
  511. u32 lmp;
  512. /* smc offsets */
  513. u16 state_table_start;
  514. u16 soft_regs_start;
  515. u16 sram_end;
  516. /* scratch structs */
  517. RV770_SMC_STATETABLE smc_statetable;
  518. };
  519. enum si_pcie_gen {
  520. SI_PCIE_GEN1 = 0,
  521. SI_PCIE_GEN2 = 1,
  522. SI_PCIE_GEN3 = 2,
  523. SI_PCIE_GEN_INVALID = 0xffff
  524. };
  525. struct rv7xx_pl {
  526. u32 sclk;
  527. u32 mclk;
  528. u16 vddc;
  529. u16 vddci; /* eg+ only */
  530. u32 flags;
  531. enum si_pcie_gen pcie_gen; /* si+ only */
  532. };
  533. struct rv7xx_ps {
  534. struct rv7xx_pl high;
  535. struct rv7xx_pl medium;
  536. struct rv7xx_pl low;
  537. bool dc_compatible;
  538. };
  539. struct si_ps {
  540. u16 performance_level_count;
  541. bool dc_compatible;
  542. struct rv7xx_pl performance_levels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  543. };
  544. struct ni_mc_reg_table {
  545. u8 last;
  546. u8 num_entries;
  547. u16 valid_flag;
  548. struct ni_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  549. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  550. };
  551. struct ni_cac_data
  552. {
  553. struct ni_leakage_coeffients leakage_coefficients;
  554. u32 i_leakage;
  555. s32 leakage_minimum_temperature;
  556. u32 pwr_const;
  557. u32 dc_cac_value;
  558. u32 bif_cac_value;
  559. u32 lkge_pwr;
  560. u8 mc_wr_weight;
  561. u8 mc_rd_weight;
  562. u8 allow_ovrflw;
  563. u8 num_win_tdp;
  564. u8 l2num_win_tdp;
  565. u8 lts_truncate_n;
  566. };
  567. struct evergreen_power_info {
  568. /* must be first! */
  569. struct rv7xx_power_info rv7xx;
  570. /* flags */
  571. bool vddci_control;
  572. bool dynamic_ac_timing;
  573. bool abm;
  574. bool mcls;
  575. bool light_sleep;
  576. bool memory_transition;
  577. bool pcie_performance_request;
  578. bool pcie_performance_request_registered;
  579. bool sclk_deep_sleep;
  580. bool dll_default_on;
  581. bool ls_clock_gating;
  582. bool smu_uvd_hs;
  583. bool uvd_enabled;
  584. /* stored values */
  585. u16 acpi_vddci;
  586. u8 mvdd_high_index;
  587. u8 mvdd_low_index;
  588. u32 mclk_edc_wr_enable_threshold;
  589. struct evergreen_mc_reg_table mc_reg_table;
  590. struct atom_voltage_table vddc_voltage_table;
  591. struct atom_voltage_table vddci_voltage_table;
  592. struct evergreen_arb_registers bootup_arb_registers;
  593. struct evergreen_ulv_param ulv;
  594. struct at ats[2];
  595. /* smc offsets */
  596. u16 mc_reg_table_start;
  597. struct amdgpu_ps current_rps;
  598. struct rv7xx_ps current_ps;
  599. struct amdgpu_ps requested_rps;
  600. struct rv7xx_ps requested_ps;
  601. };
  602. struct PP_NIslands_Dpm2PerfLevel
  603. {
  604. uint8_t MaxPS;
  605. uint8_t TgtAct;
  606. uint8_t MaxPS_StepInc;
  607. uint8_t MaxPS_StepDec;
  608. uint8_t PSST;
  609. uint8_t NearTDPDec;
  610. uint8_t AboveSafeInc;
  611. uint8_t BelowSafeInc;
  612. uint8_t PSDeltaLimit;
  613. uint8_t PSDeltaWin;
  614. uint8_t Reserved[6];
  615. };
  616. typedef struct PP_NIslands_Dpm2PerfLevel PP_NIslands_Dpm2PerfLevel;
  617. struct PP_NIslands_DPM2Parameters
  618. {
  619. uint32_t TDPLimit;
  620. uint32_t NearTDPLimit;
  621. uint32_t SafePowerLimit;
  622. uint32_t PowerBoostLimit;
  623. };
  624. typedef struct PP_NIslands_DPM2Parameters PP_NIslands_DPM2Parameters;
  625. struct NISLANDS_SMC_SCLK_VALUE
  626. {
  627. uint32_t vCG_SPLL_FUNC_CNTL;
  628. uint32_t vCG_SPLL_FUNC_CNTL_2;
  629. uint32_t vCG_SPLL_FUNC_CNTL_3;
  630. uint32_t vCG_SPLL_FUNC_CNTL_4;
  631. uint32_t vCG_SPLL_SPREAD_SPECTRUM;
  632. uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
  633. uint32_t sclk_value;
  634. };
  635. typedef struct NISLANDS_SMC_SCLK_VALUE NISLANDS_SMC_SCLK_VALUE;
  636. struct NISLANDS_SMC_MCLK_VALUE
  637. {
  638. uint32_t vMPLL_FUNC_CNTL;
  639. uint32_t vMPLL_FUNC_CNTL_1;
  640. uint32_t vMPLL_FUNC_CNTL_2;
  641. uint32_t vMPLL_AD_FUNC_CNTL;
  642. uint32_t vMPLL_AD_FUNC_CNTL_2;
  643. uint32_t vMPLL_DQ_FUNC_CNTL;
  644. uint32_t vMPLL_DQ_FUNC_CNTL_2;
  645. uint32_t vMCLK_PWRMGT_CNTL;
  646. uint32_t vDLL_CNTL;
  647. uint32_t vMPLL_SS;
  648. uint32_t vMPLL_SS2;
  649. uint32_t mclk_value;
  650. };
  651. typedef struct NISLANDS_SMC_MCLK_VALUE NISLANDS_SMC_MCLK_VALUE;
  652. struct NISLANDS_SMC_VOLTAGE_VALUE
  653. {
  654. uint16_t value;
  655. uint8_t index;
  656. uint8_t padding;
  657. };
  658. typedef struct NISLANDS_SMC_VOLTAGE_VALUE NISLANDS_SMC_VOLTAGE_VALUE;
  659. struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL
  660. {
  661. uint8_t arbValue;
  662. uint8_t ACIndex;
  663. uint8_t displayWatermark;
  664. uint8_t gen2PCIE;
  665. uint8_t reserved1;
  666. uint8_t reserved2;
  667. uint8_t strobeMode;
  668. uint8_t mcFlags;
  669. uint32_t aT;
  670. uint32_t bSP;
  671. NISLANDS_SMC_SCLK_VALUE sclk;
  672. NISLANDS_SMC_MCLK_VALUE mclk;
  673. NISLANDS_SMC_VOLTAGE_VALUE vddc;
  674. NISLANDS_SMC_VOLTAGE_VALUE mvdd;
  675. NISLANDS_SMC_VOLTAGE_VALUE vddci;
  676. NISLANDS_SMC_VOLTAGE_VALUE std_vddc;
  677. uint32_t powergate_en;
  678. uint8_t hUp;
  679. uint8_t hDown;
  680. uint8_t stateFlags;
  681. uint8_t arbRefreshState;
  682. uint32_t SQPowerThrottle;
  683. uint32_t SQPowerThrottle_2;
  684. uint32_t reserved[2];
  685. PP_NIslands_Dpm2PerfLevel dpm2;
  686. };
  687. typedef struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL NISLANDS_SMC_HW_PERFORMANCE_LEVEL;
  688. struct NISLANDS_SMC_SWSTATE
  689. {
  690. uint8_t flags;
  691. uint8_t levelCount;
  692. uint8_t padding2;
  693. uint8_t padding3;
  694. NISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[];
  695. };
  696. typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
  697. struct NISLANDS_SMC_VOLTAGEMASKTABLE
  698. {
  699. uint8_t highMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
  700. uint32_t lowMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
  701. };
  702. typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
  703. #define NISLANDS_MAX_NO_VREG_STEPS 32
  704. struct NISLANDS_SMC_STATETABLE
  705. {
  706. uint8_t thermalProtectType;
  707. uint8_t systemFlags;
  708. uint8_t maxVDDCIndexInPPTable;
  709. uint8_t extraFlags;
  710. uint8_t highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
  711. uint32_t lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
  712. NISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
  713. PP_NIslands_DPM2Parameters dpm2Params;
  714. NISLANDS_SMC_SWSTATE initialState;
  715. NISLANDS_SMC_SWSTATE ACPIState;
  716. NISLANDS_SMC_SWSTATE ULVState;
  717. NISLANDS_SMC_SWSTATE driverState;
  718. NISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
  719. };
  720. typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
  721. struct ni_power_info {
  722. /* must be first! */
  723. struct evergreen_power_info eg;
  724. struct ni_clock_registers clock_registers;
  725. struct ni_mc_reg_table mc_reg_table;
  726. u32 mclk_rtt_mode_threshold;
  727. /* flags */
  728. bool use_power_boost_limit;
  729. bool support_cac_long_term_average;
  730. bool cac_enabled;
  731. bool cac_configuration_required;
  732. bool driver_calculate_cac_leakage;
  733. bool pc_enabled;
  734. bool enable_power_containment;
  735. bool enable_cac;
  736. bool enable_sq_ramping;
  737. /* smc offsets */
  738. u16 arb_table_start;
  739. u16 fan_table_start;
  740. u16 cac_table_start;
  741. u16 spll_table_start;
  742. /* CAC stuff */
  743. struct ni_cac_data cac_data;
  744. u32 dc_cac_table[NISLANDS_DCCAC_MAX_LEVELS];
  745. const struct ni_cac_weights *cac_weights;
  746. u8 lta_window_size;
  747. u8 lts_truncate;
  748. struct si_ps current_ps;
  749. struct si_ps requested_ps;
  750. /* scratch structs */
  751. SMC_NIslands_MCRegisters smc_mc_reg_table;
  752. NISLANDS_SMC_STATETABLE smc_statetable;
  753. };
  754. struct si_cac_config_reg
  755. {
  756. u32 offset;
  757. u32 mask;
  758. u32 shift;
  759. u32 value;
  760. enum si_cac_config_reg_type type;
  761. };
  762. struct si_powertune_data
  763. {
  764. u32 cac_window;
  765. u32 l2_lta_window_size_default;
  766. u8 lts_truncate_default;
  767. u8 shift_n_default;
  768. u8 operating_temp;
  769. struct ni_leakage_coeffients leakage_coefficients;
  770. u32 fixed_kt;
  771. u32 lkge_lut_v0_percent;
  772. u8 dc_cac[NISLANDS_DCCAC_MAX_LEVELS];
  773. bool enable_powertune_by_default;
  774. };
  775. struct si_dyn_powertune_data
  776. {
  777. u32 cac_leakage;
  778. s32 leakage_minimum_temperature;
  779. u32 wintime;
  780. u32 l2_lta_window_size;
  781. u8 lts_truncate;
  782. u8 shift_n;
  783. u8 dc_pwr_value;
  784. bool disable_uvd_powertune;
  785. };
  786. struct si_dte_data
  787. {
  788. u32 tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  789. u32 r[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  790. u32 k;
  791. u32 t0;
  792. u32 max_t;
  793. u8 window_size;
  794. u8 temp_select;
  795. u8 dte_mode;
  796. u8 tdep_count;
  797. u8 t_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  798. u32 tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  799. u32 tdep_r[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  800. u32 t_threshold;
  801. bool enable_dte_by_default;
  802. };
  803. struct si_clock_registers {
  804. u32 cg_spll_func_cntl;
  805. u32 cg_spll_func_cntl_2;
  806. u32 cg_spll_func_cntl_3;
  807. u32 cg_spll_func_cntl_4;
  808. u32 cg_spll_spread_spectrum;
  809. u32 cg_spll_spread_spectrum_2;
  810. u32 dll_cntl;
  811. u32 mclk_pwrmgt_cntl;
  812. u32 mpll_ad_func_cntl;
  813. u32 mpll_dq_func_cntl;
  814. u32 mpll_func_cntl;
  815. u32 mpll_func_cntl_1;
  816. u32 mpll_func_cntl_2;
  817. u32 mpll_ss1;
  818. u32 mpll_ss2;
  819. };
  820. struct si_mc_reg_entry {
  821. u32 mclk_max;
  822. u32 mc_data[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  823. };
  824. struct si_mc_reg_table {
  825. u8 last;
  826. u8 num_entries;
  827. u16 valid_flag;
  828. struct si_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  829. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  830. };
  831. struct si_leakage_voltage_entry
  832. {
  833. u16 voltage;
  834. u16 leakage_index;
  835. };
  836. struct si_leakage_voltage
  837. {
  838. u16 count;
  839. struct si_leakage_voltage_entry entries[SISLANDS_MAX_LEAKAGE_COUNT];
  840. };
  841. struct si_ulv_param {
  842. bool supported;
  843. u32 cg_ulv_control;
  844. u32 cg_ulv_parameter;
  845. u32 volt_change_delay;
  846. struct rv7xx_pl pl;
  847. bool one_pcie_lane_in_ulv;
  848. };
  849. struct si_power_info {
  850. /* must be first! */
  851. struct ni_power_info ni;
  852. struct si_clock_registers clock_registers;
  853. struct si_mc_reg_table mc_reg_table;
  854. struct atom_voltage_table mvdd_voltage_table;
  855. struct atom_voltage_table vddc_phase_shed_table;
  856. struct si_leakage_voltage leakage_voltage;
  857. u16 mvdd_bootup_value;
  858. struct si_ulv_param ulv;
  859. u32 max_cu;
  860. /* pcie gen */
  861. enum si_pcie_gen force_pcie_gen;
  862. enum si_pcie_gen boot_pcie_gen;
  863. enum si_pcie_gen acpi_pcie_gen;
  864. u32 sys_pcie_mask;
  865. /* flags */
  866. bool enable_dte;
  867. bool enable_ppm;
  868. bool vddc_phase_shed_control;
  869. bool pspp_notify_required;
  870. bool sclk_deep_sleep_above_low;
  871. bool voltage_control_svi2;
  872. bool vddci_control_svi2;
  873. /* smc offsets */
  874. u32 sram_end;
  875. u32 state_table_start;
  876. u32 soft_regs_start;
  877. u32 mc_reg_table_start;
  878. u32 arb_table_start;
  879. u32 cac_table_start;
  880. u32 dte_table_start;
  881. u32 spll_table_start;
  882. u32 papm_cfg_table_start;
  883. u32 fan_table_start;
  884. /* CAC stuff */
  885. const struct si_cac_config_reg *cac_weights;
  886. const struct si_cac_config_reg *lcac_config;
  887. const struct si_cac_config_reg *cac_override;
  888. const struct si_powertune_data *powertune_data;
  889. struct si_dyn_powertune_data dyn_powertune_data;
  890. /* DTE stuff */
  891. struct si_dte_data dte_data;
  892. /* scratch structs */
  893. SMC_SIslands_MCRegisters smc_mc_reg_table;
  894. SISLANDS_SMC_STATETABLE smc_statetable;
  895. PP_SIslands_PAPMParameters papm_parm;
  896. /* SVI2 */
  897. u8 svd_gpio_id;
  898. u8 svc_gpio_id;
  899. /* fan control */
  900. bool fan_ctrl_is_in_default_mode;
  901. u32 t_min;
  902. u32 fan_ctrl_default_mode;
  903. bool fan_is_controlled_by_smc;
  904. };
  905. #endif