smumgr.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*
  2. * Copyright 2015 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 _SMUMGR_H_
  24. #define _SMUMGR_H_
  25. #include <linux/types.h>
  26. #include "pp_instance.h"
  27. #include "amd_powerplay.h"
  28. struct pp_smumgr;
  29. struct pp_instance;
  30. struct pp_hwmgr;
  31. #define smu_lower_32_bits(n) ((uint32_t)(n))
  32. #define smu_upper_32_bits(n) ((uint32_t)(((n)>>16)>>16))
  33. extern const struct pp_smumgr_func cz_smu_funcs;
  34. extern const struct pp_smumgr_func iceland_smu_funcs;
  35. extern const struct pp_smumgr_func tonga_smu_funcs;
  36. extern const struct pp_smumgr_func fiji_smu_funcs;
  37. extern const struct pp_smumgr_func polaris10_smu_funcs;
  38. enum AVFS_BTC_STATUS {
  39. AVFS_BTC_BOOT = 0,
  40. AVFS_BTC_BOOT_STARTEDSMU,
  41. AVFS_LOAD_VIRUS,
  42. AVFS_BTC_VIRUS_LOADED,
  43. AVFS_BTC_VIRUS_FAIL,
  44. AVFS_BTC_COMPLETED_PREVIOUSLY,
  45. AVFS_BTC_ENABLEAVFS,
  46. AVFS_BTC_STARTED,
  47. AVFS_BTC_FAILED,
  48. AVFS_BTC_RESTOREVFT_FAILED,
  49. AVFS_BTC_SAVEVFT_FAILED,
  50. AVFS_BTC_DPMTABLESETUP_FAILED,
  51. AVFS_BTC_COMPLETED_UNSAVED,
  52. AVFS_BTC_COMPLETED_SAVED,
  53. AVFS_BTC_COMPLETED_RESTORED,
  54. AVFS_BTC_DISABLED,
  55. AVFS_BTC_NOTSUPPORTED,
  56. AVFS_BTC_SMUMSG_ERROR
  57. };
  58. enum SMU_TABLE {
  59. SMU_UVD_TABLE = 0,
  60. SMU_VCE_TABLE,
  61. SMU_SAMU_TABLE,
  62. SMU_BIF_TABLE,
  63. };
  64. enum SMU_TYPE {
  65. SMU_SoftRegisters = 0,
  66. SMU_Discrete_DpmTable,
  67. };
  68. enum SMU_MEMBER {
  69. HandshakeDisables = 0,
  70. VoltageChangeTimeout,
  71. AverageGraphicsActivity,
  72. PreVBlankGap,
  73. VBlankTimeout,
  74. UcodeLoadStatus,
  75. UvdBootLevel,
  76. VceBootLevel,
  77. SamuBootLevel,
  78. LowSclkInterruptThreshold,
  79. };
  80. enum SMU_MAC_DEFINITION {
  81. SMU_MAX_LEVELS_GRAPHICS = 0,
  82. SMU_MAX_LEVELS_MEMORY,
  83. SMU_MAX_LEVELS_LINK,
  84. SMU_MAX_ENTRIES_SMIO,
  85. SMU_MAX_LEVELS_VDDC,
  86. SMU_MAX_LEVELS_VDDGFX,
  87. SMU_MAX_LEVELS_VDDCI,
  88. SMU_MAX_LEVELS_MVDD,
  89. SMU_UVD_MCLK_HANDSHAKE_DISABLE,
  90. };
  91. struct pp_smumgr_func {
  92. int (*smu_init)(struct pp_smumgr *smumgr);
  93. int (*smu_fini)(struct pp_smumgr *smumgr);
  94. int (*start_smu)(struct pp_smumgr *smumgr);
  95. int (*check_fw_load_finish)(struct pp_smumgr *smumgr,
  96. uint32_t firmware);
  97. int (*request_smu_load_fw)(struct pp_smumgr *smumgr);
  98. int (*request_smu_load_specific_fw)(struct pp_smumgr *smumgr,
  99. uint32_t firmware);
  100. int (*get_argument)(struct pp_smumgr *smumgr);
  101. int (*send_msg_to_smc)(struct pp_smumgr *smumgr, uint16_t msg);
  102. int (*send_msg_to_smc_with_parameter)(struct pp_smumgr *smumgr,
  103. uint16_t msg, uint32_t parameter);
  104. int (*download_pptable_settings)(struct pp_smumgr *smumgr,
  105. void **table);
  106. int (*upload_pptable_settings)(struct pp_smumgr *smumgr);
  107. int (*update_smc_table)(struct pp_hwmgr *hwmgr, uint32_t type);
  108. int (*process_firmware_header)(struct pp_hwmgr *hwmgr);
  109. int (*update_sclk_threshold)(struct pp_hwmgr *hwmgr);
  110. int (*thermal_setup_fan_table)(struct pp_hwmgr *hwmgr);
  111. int (*thermal_avfs_enable)(struct pp_hwmgr *hwmgr);
  112. int (*init_smc_table)(struct pp_hwmgr *hwmgr);
  113. int (*populate_all_graphic_levels)(struct pp_hwmgr *hwmgr);
  114. int (*populate_all_memory_levels)(struct pp_hwmgr *hwmgr);
  115. int (*initialize_mc_reg_table)(struct pp_hwmgr *hwmgr);
  116. uint32_t (*get_offsetof)(uint32_t type, uint32_t member);
  117. uint32_t (*get_mac_definition)(uint32_t value);
  118. bool (*is_dpm_running)(struct pp_hwmgr *hwmgr);
  119. };
  120. struct pp_smumgr {
  121. uint32_t chip_family;
  122. uint32_t chip_id;
  123. void *device;
  124. void *backend;
  125. uint32_t usec_timeout;
  126. bool reload_fw;
  127. const struct pp_smumgr_func *smumgr_funcs;
  128. };
  129. extern int smum_early_init(struct pp_instance *handle);
  130. extern int smum_get_argument(struct pp_smumgr *smumgr);
  131. extern int smum_download_powerplay_table(struct pp_smumgr *smumgr, void **table);
  132. extern int smum_upload_powerplay_table(struct pp_smumgr *smumgr);
  133. extern int smum_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg);
  134. extern int smum_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
  135. uint16_t msg, uint32_t parameter);
  136. extern int smum_wait_on_register(struct pp_smumgr *smumgr,
  137. uint32_t index, uint32_t value, uint32_t mask);
  138. extern int smum_wait_for_register_unequal(struct pp_smumgr *smumgr,
  139. uint32_t index, uint32_t value, uint32_t mask);
  140. extern int smum_wait_on_indirect_register(struct pp_smumgr *smumgr,
  141. uint32_t indirect_port, uint32_t index,
  142. uint32_t value, uint32_t mask);
  143. extern void smum_wait_for_indirect_register_unequal(
  144. struct pp_smumgr *smumgr,
  145. uint32_t indirect_port, uint32_t index,
  146. uint32_t value, uint32_t mask);
  147. extern int smu_allocate_memory(void *device, uint32_t size,
  148. enum cgs_gpu_mem_type type,
  149. uint32_t byte_align, uint64_t *mc_addr,
  150. void **kptr, void *handle);
  151. extern int smu_free_memory(void *device, void *handle);
  152. extern int smum_update_sclk_threshold(struct pp_hwmgr *hwmgr);
  153. extern int smum_update_smc_table(struct pp_hwmgr *hwmgr, uint32_t type);
  154. extern int smum_process_firmware_header(struct pp_hwmgr *hwmgr);
  155. extern int smum_thermal_avfs_enable(struct pp_hwmgr *hwmgr,
  156. void *input, void *output, void *storage, int result);
  157. extern int smum_thermal_setup_fan_table(struct pp_hwmgr *hwmgr,
  158. void *input, void *output, void *storage, int result);
  159. extern int smum_init_smc_table(struct pp_hwmgr *hwmgr);
  160. extern int smum_populate_all_graphic_levels(struct pp_hwmgr *hwmgr);
  161. extern int smum_populate_all_memory_levels(struct pp_hwmgr *hwmgr);
  162. extern int smum_initialize_mc_reg_table(struct pp_hwmgr *hwmgr);
  163. extern uint32_t smum_get_offsetof(struct pp_smumgr *smumgr,
  164. uint32_t type, uint32_t member);
  165. extern uint32_t smum_get_mac_definition(struct pp_smumgr *smumgr, uint32_t value);
  166. extern bool smum_is_dpm_running(struct pp_hwmgr *hwmgr);
  167. #define SMUM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
  168. #define SMUM_FIELD_MASK(reg, field) reg##__##field##_MASK
  169. #define SMUM_WAIT_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, \
  170. port, index, value, mask) \
  171. smum_wait_on_indirect_register(smumgr, \
  172. mm##port##_INDEX, index, value, mask)
  173. #define SMUM_WAIT_INDIRECT_REGISTER(smumgr, port, reg, value, mask) \
  174. SMUM_WAIT_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
  175. #define SMUM_WAIT_INDIRECT_FIELD(smumgr, port, reg, field, fieldval) \
  176. SMUM_WAIT_INDIRECT_REGISTER(smumgr, port, reg, (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
  177. SMUM_FIELD_MASK(reg, field) )
  178. #define SMUM_WAIT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, \
  179. index, value, mask) \
  180. smum_wait_for_register_unequal(smumgr, \
  181. index, value, mask)
  182. #define SMUM_WAIT_REGISTER_UNEQUAL(smumgr, reg, value, mask) \
  183. SMUM_WAIT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, \
  184. mm##reg, value, mask)
  185. #define SMUM_WAIT_FIELD_UNEQUAL(smumgr, reg, field, fieldval) \
  186. SMUM_WAIT_REGISTER_UNEQUAL(smumgr, reg, \
  187. (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
  188. SMUM_FIELD_MASK(reg, field))
  189. #define SMUM_GET_FIELD(value, reg, field) \
  190. (((value) & SMUM_FIELD_MASK(reg, field)) \
  191. >> SMUM_FIELD_SHIFT(reg, field))
  192. #define SMUM_READ_FIELD(device, reg, field) \
  193. SMUM_GET_FIELD(cgs_read_register(device, mm##reg), reg, field)
  194. #define SMUM_SET_FIELD(value, reg, field, field_val) \
  195. (((value) & ~SMUM_FIELD_MASK(reg, field)) | \
  196. (SMUM_FIELD_MASK(reg, field) & ((field_val) << \
  197. SMUM_FIELD_SHIFT(reg, field))))
  198. #define SMUM_READ_INDIRECT_FIELD(device, port, reg, field) \
  199. SMUM_GET_FIELD(cgs_read_ind_register(device, port, ix##reg), \
  200. reg, field)
  201. #define SMUM_WAIT_VFPF_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, \
  202. port, index, value, mask) \
  203. smum_wait_on_indirect_register(smumgr, \
  204. mm##port##_INDEX_0, index, value, mask)
  205. #define SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, \
  206. port, index, value, mask) \
  207. smum_wait_for_indirect_register_unequal(smumgr, \
  208. mm##port##_INDEX_0, index, value, mask)
  209. #define SMUM_WAIT_VFPF_INDIRECT_REGISTER(smumgr, port, reg, value, mask) \
  210. SMUM_WAIT_VFPF_INDIRECT_REGISTER_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
  211. #define SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, value, mask) \
  212. SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
  213. /*Operations on named fields.*/
  214. #define SMUM_READ_VFPF_INDIRECT_FIELD(device, port, reg, field) \
  215. SMUM_GET_FIELD(cgs_read_ind_register(device, port, ix##reg), \
  216. reg, field)
  217. #define SMUM_WRITE_FIELD(device, reg, field, fieldval) \
  218. cgs_write_register(device, mm##reg, \
  219. SMUM_SET_FIELD(cgs_read_register(device, mm##reg), reg, field, fieldval))
  220. #define SMUM_WRITE_VFPF_INDIRECT_FIELD(device, port, reg, field, fieldval) \
  221. cgs_write_ind_register(device, port, ix##reg, \
  222. SMUM_SET_FIELD(cgs_read_ind_register(device, port, ix##reg), \
  223. reg, field, fieldval))
  224. #define SMUM_WRITE_INDIRECT_FIELD(device, port, reg, field, fieldval) \
  225. cgs_write_ind_register(device, port, ix##reg, \
  226. SMUM_SET_FIELD(cgs_read_ind_register(device, port, ix##reg), \
  227. reg, field, fieldval))
  228. #define SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, port, reg, field, fieldval) \
  229. SMUM_WAIT_VFPF_INDIRECT_REGISTER(smumgr, port, reg, \
  230. (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
  231. SMUM_FIELD_MASK(reg, field))
  232. #define SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, port, reg, field, fieldval) \
  233. SMUM_WAIT_VFPF_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, \
  234. (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
  235. SMUM_FIELD_MASK(reg, field))
  236. #define SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, port, index, value, mask) \
  237. smum_wait_for_indirect_register_unequal(smumgr, \
  238. mm##port##_INDEX, index, value, mask)
  239. #define SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, value, mask) \
  240. SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL_GIVEN_INDEX(smumgr, port, ix##reg, value, mask)
  241. #define SMUM_WAIT_INDIRECT_FIELD_UNEQUAL(smumgr, port, reg, field, fieldval) \
  242. SMUM_WAIT_INDIRECT_REGISTER_UNEQUAL(smumgr, port, reg, (fieldval) << SMUM_FIELD_SHIFT(reg, field), \
  243. SMUM_FIELD_MASK(reg, field) )
  244. #endif