si_dpm.h 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  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. struct rv7xx_pl {
  520. u32 sclk;
  521. u32 mclk;
  522. u16 vddc;
  523. u16 vddci; /* eg+ only */
  524. u32 flags;
  525. enum amdgpu_pcie_gen pcie_gen; /* si+ only */
  526. };
  527. struct rv7xx_ps {
  528. struct rv7xx_pl high;
  529. struct rv7xx_pl medium;
  530. struct rv7xx_pl low;
  531. bool dc_compatible;
  532. };
  533. struct si_ps {
  534. u16 performance_level_count;
  535. bool dc_compatible;
  536. struct rv7xx_pl performance_levels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  537. };
  538. struct ni_mc_reg_table {
  539. u8 last;
  540. u8 num_entries;
  541. u16 valid_flag;
  542. struct ni_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  543. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
  544. };
  545. struct ni_cac_data
  546. {
  547. struct ni_leakage_coeffients leakage_coefficients;
  548. u32 i_leakage;
  549. s32 leakage_minimum_temperature;
  550. u32 pwr_const;
  551. u32 dc_cac_value;
  552. u32 bif_cac_value;
  553. u32 lkge_pwr;
  554. u8 mc_wr_weight;
  555. u8 mc_rd_weight;
  556. u8 allow_ovrflw;
  557. u8 num_win_tdp;
  558. u8 l2num_win_tdp;
  559. u8 lts_truncate_n;
  560. };
  561. struct evergreen_power_info {
  562. /* must be first! */
  563. struct rv7xx_power_info rv7xx;
  564. /* flags */
  565. bool vddci_control;
  566. bool dynamic_ac_timing;
  567. bool abm;
  568. bool mcls;
  569. bool light_sleep;
  570. bool memory_transition;
  571. bool pcie_performance_request;
  572. bool pcie_performance_request_registered;
  573. bool sclk_deep_sleep;
  574. bool dll_default_on;
  575. bool ls_clock_gating;
  576. bool smu_uvd_hs;
  577. bool uvd_enabled;
  578. /* stored values */
  579. u16 acpi_vddci;
  580. u8 mvdd_high_index;
  581. u8 mvdd_low_index;
  582. u32 mclk_edc_wr_enable_threshold;
  583. struct evergreen_mc_reg_table mc_reg_table;
  584. struct atom_voltage_table vddc_voltage_table;
  585. struct atom_voltage_table vddci_voltage_table;
  586. struct evergreen_arb_registers bootup_arb_registers;
  587. struct evergreen_ulv_param ulv;
  588. struct at ats[2];
  589. /* smc offsets */
  590. u16 mc_reg_table_start;
  591. struct amdgpu_ps current_rps;
  592. struct rv7xx_ps current_ps;
  593. struct amdgpu_ps requested_rps;
  594. struct rv7xx_ps requested_ps;
  595. };
  596. struct PP_NIslands_Dpm2PerfLevel
  597. {
  598. uint8_t MaxPS;
  599. uint8_t TgtAct;
  600. uint8_t MaxPS_StepInc;
  601. uint8_t MaxPS_StepDec;
  602. uint8_t PSST;
  603. uint8_t NearTDPDec;
  604. uint8_t AboveSafeInc;
  605. uint8_t BelowSafeInc;
  606. uint8_t PSDeltaLimit;
  607. uint8_t PSDeltaWin;
  608. uint8_t Reserved[6];
  609. };
  610. typedef struct PP_NIslands_Dpm2PerfLevel PP_NIslands_Dpm2PerfLevel;
  611. struct PP_NIslands_DPM2Parameters
  612. {
  613. uint32_t TDPLimit;
  614. uint32_t NearTDPLimit;
  615. uint32_t SafePowerLimit;
  616. uint32_t PowerBoostLimit;
  617. };
  618. typedef struct PP_NIslands_DPM2Parameters PP_NIslands_DPM2Parameters;
  619. struct NISLANDS_SMC_SCLK_VALUE
  620. {
  621. uint32_t vCG_SPLL_FUNC_CNTL;
  622. uint32_t vCG_SPLL_FUNC_CNTL_2;
  623. uint32_t vCG_SPLL_FUNC_CNTL_3;
  624. uint32_t vCG_SPLL_FUNC_CNTL_4;
  625. uint32_t vCG_SPLL_SPREAD_SPECTRUM;
  626. uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
  627. uint32_t sclk_value;
  628. };
  629. typedef struct NISLANDS_SMC_SCLK_VALUE NISLANDS_SMC_SCLK_VALUE;
  630. struct NISLANDS_SMC_MCLK_VALUE
  631. {
  632. uint32_t vMPLL_FUNC_CNTL;
  633. uint32_t vMPLL_FUNC_CNTL_1;
  634. uint32_t vMPLL_FUNC_CNTL_2;
  635. uint32_t vMPLL_AD_FUNC_CNTL;
  636. uint32_t vMPLL_AD_FUNC_CNTL_2;
  637. uint32_t vMPLL_DQ_FUNC_CNTL;
  638. uint32_t vMPLL_DQ_FUNC_CNTL_2;
  639. uint32_t vMCLK_PWRMGT_CNTL;
  640. uint32_t vDLL_CNTL;
  641. uint32_t vMPLL_SS;
  642. uint32_t vMPLL_SS2;
  643. uint32_t mclk_value;
  644. };
  645. typedef struct NISLANDS_SMC_MCLK_VALUE NISLANDS_SMC_MCLK_VALUE;
  646. struct NISLANDS_SMC_VOLTAGE_VALUE
  647. {
  648. uint16_t value;
  649. uint8_t index;
  650. uint8_t padding;
  651. };
  652. typedef struct NISLANDS_SMC_VOLTAGE_VALUE NISLANDS_SMC_VOLTAGE_VALUE;
  653. struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL
  654. {
  655. uint8_t arbValue;
  656. uint8_t ACIndex;
  657. uint8_t displayWatermark;
  658. uint8_t gen2PCIE;
  659. uint8_t reserved1;
  660. uint8_t reserved2;
  661. uint8_t strobeMode;
  662. uint8_t mcFlags;
  663. uint32_t aT;
  664. uint32_t bSP;
  665. NISLANDS_SMC_SCLK_VALUE sclk;
  666. NISLANDS_SMC_MCLK_VALUE mclk;
  667. NISLANDS_SMC_VOLTAGE_VALUE vddc;
  668. NISLANDS_SMC_VOLTAGE_VALUE mvdd;
  669. NISLANDS_SMC_VOLTAGE_VALUE vddci;
  670. NISLANDS_SMC_VOLTAGE_VALUE std_vddc;
  671. uint32_t powergate_en;
  672. uint8_t hUp;
  673. uint8_t hDown;
  674. uint8_t stateFlags;
  675. uint8_t arbRefreshState;
  676. uint32_t SQPowerThrottle;
  677. uint32_t SQPowerThrottle_2;
  678. uint32_t reserved[2];
  679. PP_NIslands_Dpm2PerfLevel dpm2;
  680. };
  681. typedef struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL NISLANDS_SMC_HW_PERFORMANCE_LEVEL;
  682. struct NISLANDS_SMC_SWSTATE
  683. {
  684. uint8_t flags;
  685. uint8_t levelCount;
  686. uint8_t padding2;
  687. uint8_t padding3;
  688. NISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[1];
  689. };
  690. typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
  691. struct NISLANDS_SMC_VOLTAGEMASKTABLE
  692. {
  693. uint8_t highMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
  694. uint32_t lowMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
  695. };
  696. typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
  697. #define NISLANDS_MAX_NO_VREG_STEPS 32
  698. struct NISLANDS_SMC_STATETABLE
  699. {
  700. uint8_t thermalProtectType;
  701. uint8_t systemFlags;
  702. uint8_t maxVDDCIndexInPPTable;
  703. uint8_t extraFlags;
  704. uint8_t highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
  705. uint32_t lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
  706. NISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
  707. PP_NIslands_DPM2Parameters dpm2Params;
  708. NISLANDS_SMC_SWSTATE initialState;
  709. NISLANDS_SMC_SWSTATE ACPIState;
  710. NISLANDS_SMC_SWSTATE ULVState;
  711. NISLANDS_SMC_SWSTATE driverState;
  712. NISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
  713. };
  714. typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
  715. struct ni_power_info {
  716. /* must be first! */
  717. struct evergreen_power_info eg;
  718. struct ni_clock_registers clock_registers;
  719. struct ni_mc_reg_table mc_reg_table;
  720. u32 mclk_rtt_mode_threshold;
  721. /* flags */
  722. bool use_power_boost_limit;
  723. bool support_cac_long_term_average;
  724. bool cac_enabled;
  725. bool cac_configuration_required;
  726. bool driver_calculate_cac_leakage;
  727. bool pc_enabled;
  728. bool enable_power_containment;
  729. bool enable_cac;
  730. bool enable_sq_ramping;
  731. /* smc offsets */
  732. u16 arb_table_start;
  733. u16 fan_table_start;
  734. u16 cac_table_start;
  735. u16 spll_table_start;
  736. /* CAC stuff */
  737. struct ni_cac_data cac_data;
  738. u32 dc_cac_table[NISLANDS_DCCAC_MAX_LEVELS];
  739. const struct ni_cac_weights *cac_weights;
  740. u8 lta_window_size;
  741. u8 lts_truncate;
  742. struct si_ps current_ps;
  743. struct si_ps requested_ps;
  744. /* scratch structs */
  745. SMC_NIslands_MCRegisters smc_mc_reg_table;
  746. NISLANDS_SMC_STATETABLE smc_statetable;
  747. };
  748. struct si_cac_config_reg
  749. {
  750. u32 offset;
  751. u32 mask;
  752. u32 shift;
  753. u32 value;
  754. enum si_cac_config_reg_type type;
  755. };
  756. struct si_powertune_data
  757. {
  758. u32 cac_window;
  759. u32 l2_lta_window_size_default;
  760. u8 lts_truncate_default;
  761. u8 shift_n_default;
  762. u8 operating_temp;
  763. struct ni_leakage_coeffients leakage_coefficients;
  764. u32 fixed_kt;
  765. u32 lkge_lut_v0_percent;
  766. u8 dc_cac[NISLANDS_DCCAC_MAX_LEVELS];
  767. bool enable_powertune_by_default;
  768. };
  769. struct si_dyn_powertune_data
  770. {
  771. u32 cac_leakage;
  772. s32 leakage_minimum_temperature;
  773. u32 wintime;
  774. u32 l2_lta_window_size;
  775. u8 lts_truncate;
  776. u8 shift_n;
  777. u8 dc_pwr_value;
  778. bool disable_uvd_powertune;
  779. };
  780. struct si_dte_data
  781. {
  782. u32 tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  783. u32 r[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
  784. u32 k;
  785. u32 t0;
  786. u32 max_t;
  787. u8 window_size;
  788. u8 temp_select;
  789. u8 dte_mode;
  790. u8 tdep_count;
  791. u8 t_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  792. u32 tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  793. u32 tdep_r[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
  794. u32 t_threshold;
  795. bool enable_dte_by_default;
  796. };
  797. struct si_clock_registers {
  798. u32 cg_spll_func_cntl;
  799. u32 cg_spll_func_cntl_2;
  800. u32 cg_spll_func_cntl_3;
  801. u32 cg_spll_func_cntl_4;
  802. u32 cg_spll_spread_spectrum;
  803. u32 cg_spll_spread_spectrum_2;
  804. u32 dll_cntl;
  805. u32 mclk_pwrmgt_cntl;
  806. u32 mpll_ad_func_cntl;
  807. u32 mpll_dq_func_cntl;
  808. u32 mpll_func_cntl;
  809. u32 mpll_func_cntl_1;
  810. u32 mpll_func_cntl_2;
  811. u32 mpll_ss1;
  812. u32 mpll_ss2;
  813. };
  814. struct si_mc_reg_entry {
  815. u32 mclk_max;
  816. u32 mc_data[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  817. };
  818. struct si_mc_reg_table {
  819. u8 last;
  820. u8 num_entries;
  821. u16 valid_flag;
  822. struct si_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
  823. SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
  824. };
  825. struct si_leakage_voltage_entry
  826. {
  827. u16 voltage;
  828. u16 leakage_index;
  829. };
  830. struct si_leakage_voltage
  831. {
  832. u16 count;
  833. struct si_leakage_voltage_entry entries[SISLANDS_MAX_LEAKAGE_COUNT];
  834. };
  835. struct si_ulv_param {
  836. bool supported;
  837. u32 cg_ulv_control;
  838. u32 cg_ulv_parameter;
  839. u32 volt_change_delay;
  840. struct rv7xx_pl pl;
  841. bool one_pcie_lane_in_ulv;
  842. };
  843. struct si_power_info {
  844. /* must be first! */
  845. struct ni_power_info ni;
  846. struct si_clock_registers clock_registers;
  847. struct si_mc_reg_table mc_reg_table;
  848. struct atom_voltage_table mvdd_voltage_table;
  849. struct atom_voltage_table vddc_phase_shed_table;
  850. struct si_leakage_voltage leakage_voltage;
  851. u16 mvdd_bootup_value;
  852. struct si_ulv_param ulv;
  853. u32 max_cu;
  854. /* pcie gen */
  855. enum amdgpu_pcie_gen force_pcie_gen;
  856. enum amdgpu_pcie_gen boot_pcie_gen;
  857. enum amdgpu_pcie_gen acpi_pcie_gen;
  858. u32 sys_pcie_mask;
  859. /* flags */
  860. bool enable_dte;
  861. bool enable_ppm;
  862. bool vddc_phase_shed_control;
  863. bool pspp_notify_required;
  864. bool sclk_deep_sleep_above_low;
  865. bool voltage_control_svi2;
  866. bool vddci_control_svi2;
  867. /* smc offsets */
  868. u32 sram_end;
  869. u32 state_table_start;
  870. u32 soft_regs_start;
  871. u32 mc_reg_table_start;
  872. u32 arb_table_start;
  873. u32 cac_table_start;
  874. u32 dte_table_start;
  875. u32 spll_table_start;
  876. u32 papm_cfg_table_start;
  877. u32 fan_table_start;
  878. /* CAC stuff */
  879. const struct si_cac_config_reg *cac_weights;
  880. const struct si_cac_config_reg *lcac_config;
  881. const struct si_cac_config_reg *cac_override;
  882. const struct si_powertune_data *powertune_data;
  883. struct si_dyn_powertune_data dyn_powertune_data;
  884. /* DTE stuff */
  885. struct si_dte_data dte_data;
  886. /* scratch structs */
  887. SMC_SIslands_MCRegisters smc_mc_reg_table;
  888. SISLANDS_SMC_STATETABLE smc_statetable;
  889. PP_SIslands_PAPMParameters papm_parm;
  890. /* SVI2 */
  891. u8 svd_gpio_id;
  892. u8 svc_gpio_id;
  893. /* fan control */
  894. bool fan_ctrl_is_in_default_mode;
  895. u32 t_min;
  896. u32 fan_ctrl_default_mode;
  897. bool fan_is_controlled_by_smc;
  898. };
  899. #endif