rv770_smc.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. * Copyright 2011 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 __RV770_SMC_H__
  24. #define __RV770_SMC_H__
  25. #include "ppsmc.h"
  26. #pragma pack(push, 1)
  27. #define RV770_SMC_TABLE_ADDRESS 0xB000
  28. #define RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 3
  29. struct RV770_SMC_SCLK_VALUE {
  30. uint32_t vCG_SPLL_FUNC_CNTL;
  31. uint32_t vCG_SPLL_FUNC_CNTL_2;
  32. uint32_t vCG_SPLL_FUNC_CNTL_3;
  33. uint32_t vCG_SPLL_SPREAD_SPECTRUM;
  34. uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
  35. uint32_t sclk_value;
  36. };
  37. typedef struct RV770_SMC_SCLK_VALUE RV770_SMC_SCLK_VALUE;
  38. struct RV770_SMC_MCLK_VALUE {
  39. uint32_t vMPLL_AD_FUNC_CNTL;
  40. uint32_t vMPLL_AD_FUNC_CNTL_2;
  41. uint32_t vMPLL_DQ_FUNC_CNTL;
  42. uint32_t vMPLL_DQ_FUNC_CNTL_2;
  43. uint32_t vMCLK_PWRMGT_CNTL;
  44. uint32_t vDLL_CNTL;
  45. uint32_t vMPLL_SS;
  46. uint32_t vMPLL_SS2;
  47. uint32_t mclk_value;
  48. };
  49. typedef struct RV770_SMC_MCLK_VALUE RV770_SMC_MCLK_VALUE;
  50. struct RV730_SMC_MCLK_VALUE {
  51. uint32_t vMCLK_PWRMGT_CNTL;
  52. uint32_t vDLL_CNTL;
  53. uint32_t vMPLL_FUNC_CNTL;
  54. uint32_t vMPLL_FUNC_CNTL2;
  55. uint32_t vMPLL_FUNC_CNTL3;
  56. uint32_t vMPLL_SS;
  57. uint32_t vMPLL_SS2;
  58. uint32_t mclk_value;
  59. };
  60. typedef struct RV730_SMC_MCLK_VALUE RV730_SMC_MCLK_VALUE;
  61. struct RV770_SMC_VOLTAGE_VALUE {
  62. uint16_t value;
  63. uint8_t index;
  64. uint8_t padding;
  65. };
  66. typedef struct RV770_SMC_VOLTAGE_VALUE RV770_SMC_VOLTAGE_VALUE;
  67. union RV7XX_SMC_MCLK_VALUE {
  68. RV770_SMC_MCLK_VALUE mclk770;
  69. RV730_SMC_MCLK_VALUE mclk730;
  70. };
  71. typedef union RV7XX_SMC_MCLK_VALUE RV7XX_SMC_MCLK_VALUE, *LPRV7XX_SMC_MCLK_VALUE;
  72. struct RV770_SMC_HW_PERFORMANCE_LEVEL {
  73. uint8_t arbValue;
  74. union{
  75. uint8_t seqValue;
  76. uint8_t ACIndex;
  77. };
  78. uint8_t displayWatermark;
  79. uint8_t gen2PCIE;
  80. uint8_t gen2XSP;
  81. uint8_t backbias;
  82. uint8_t strobeMode;
  83. uint8_t mcFlags;
  84. uint32_t aT;
  85. uint32_t bSP;
  86. RV770_SMC_SCLK_VALUE sclk;
  87. RV7XX_SMC_MCLK_VALUE mclk;
  88. RV770_SMC_VOLTAGE_VALUE vddc;
  89. RV770_SMC_VOLTAGE_VALUE mvdd;
  90. RV770_SMC_VOLTAGE_VALUE vddci;
  91. uint8_t reserved1;
  92. uint8_t reserved2;
  93. uint8_t stateFlags;
  94. uint8_t padding;
  95. };
  96. #define SMC_STROBE_RATIO 0x0F
  97. #define SMC_STROBE_ENABLE 0x10
  98. #define SMC_MC_EDC_RD_FLAG 0x01
  99. #define SMC_MC_EDC_WR_FLAG 0x02
  100. #define SMC_MC_RTT_ENABLE 0x04
  101. #define SMC_MC_STUTTER_EN 0x08
  102. typedef struct RV770_SMC_HW_PERFORMANCE_LEVEL RV770_SMC_HW_PERFORMANCE_LEVEL;
  103. struct RV770_SMC_SWSTATE {
  104. uint8_t flags;
  105. uint8_t padding1;
  106. uint8_t padding2;
  107. uint8_t padding3;
  108. RV770_SMC_HW_PERFORMANCE_LEVEL levels[RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
  109. };
  110. typedef struct RV770_SMC_SWSTATE RV770_SMC_SWSTATE;
  111. #define RV770_SMC_VOLTAGEMASK_VDDC 0
  112. #define RV770_SMC_VOLTAGEMASK_MVDD 1
  113. #define RV770_SMC_VOLTAGEMASK_VDDCI 2
  114. #define RV770_SMC_VOLTAGEMASK_MAX 4
  115. struct RV770_SMC_VOLTAGEMASKTABLE {
  116. uint8_t highMask[RV770_SMC_VOLTAGEMASK_MAX];
  117. uint32_t lowMask[RV770_SMC_VOLTAGEMASK_MAX];
  118. };
  119. typedef struct RV770_SMC_VOLTAGEMASKTABLE RV770_SMC_VOLTAGEMASKTABLE;
  120. #define MAX_NO_VREG_STEPS 32
  121. struct RV770_SMC_STATETABLE {
  122. uint8_t thermalProtectType;
  123. uint8_t systemFlags;
  124. uint8_t maxVDDCIndexInPPTable;
  125. uint8_t extraFlags;
  126. uint8_t highSMIO[MAX_NO_VREG_STEPS];
  127. uint32_t lowSMIO[MAX_NO_VREG_STEPS];
  128. RV770_SMC_VOLTAGEMASKTABLE voltageMaskTable;
  129. RV770_SMC_SWSTATE initialState;
  130. RV770_SMC_SWSTATE ACPIState;
  131. RV770_SMC_SWSTATE driverState;
  132. RV770_SMC_SWSTATE ULVState;
  133. };
  134. typedef struct RV770_SMC_STATETABLE RV770_SMC_STATETABLE;
  135. #define PPSMC_STATEFLAG_AUTO_PULSE_SKIP 0x01
  136. #pragma pack(pop)
  137. #define RV770_SMC_SOFT_REGISTERS_START 0x104
  138. #define RV770_SMC_SOFT_REGISTER_mclk_chg_timeout 0x0
  139. #define RV770_SMC_SOFT_REGISTER_baby_step_timer 0x8
  140. #define RV770_SMC_SOFT_REGISTER_delay_bbias 0xC
  141. #define RV770_SMC_SOFT_REGISTER_delay_vreg 0x10
  142. #define RV770_SMC_SOFT_REGISTER_delay_acpi 0x2C
  143. #define RV770_SMC_SOFT_REGISTER_seq_index 0x64
  144. #define RV770_SMC_SOFT_REGISTER_mvdd_chg_time 0x68
  145. #define RV770_SMC_SOFT_REGISTER_mclk_switch_lim 0x78
  146. #define RV770_SMC_SOFT_REGISTER_mc_block_delay 0x90
  147. #define RV770_SMC_SOFT_REGISTER_uvd_enabled 0x9C
  148. #define RV770_SMC_SOFT_REGISTER_is_asic_lombok 0xA0
  149. int rv770_copy_bytes_to_smc(struct radeon_device *rdev,
  150. u16 smc_start_address, const u8 *src,
  151. u16 byte_count, u16 limit);
  152. void rv770_start_smc(struct radeon_device *rdev);
  153. void rv770_reset_smc(struct radeon_device *rdev);
  154. void rv770_stop_smc_clock(struct radeon_device *rdev);
  155. void rv770_start_smc_clock(struct radeon_device *rdev);
  156. bool rv770_is_smc_running(struct radeon_device *rdev);
  157. PPSMC_Result rv770_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg);
  158. PPSMC_Result rv770_wait_for_smc_inactive(struct radeon_device *rdev);
  159. int rv770_read_smc_sram_dword(struct radeon_device *rdev,
  160. u16 smc_address, u32 *value, u16 limit);
  161. int rv770_write_smc_sram_dword(struct radeon_device *rdev,
  162. u16 smc_address, u32 value, u16 limit);
  163. int rv770_load_smc_ucode(struct radeon_device *rdev,
  164. u16 limit);
  165. #endif