xref: /linux/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h (revision d4a292c5f8e65d2784b703c67179f4f7d0c7846c)
1 /*
2  * Copyright 2021 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 __SMU_13_0_6_PPT_H__
24 #define __SMU_13_0_6_PPT_H__
25 
26 #define SMU_13_0_6_UMD_PSTATE_GFXCLK_LEVEL 0x2
27 #define SMU_13_0_6_UMD_PSTATE_SOCCLK_LEVEL 0x4
28 #define SMU_13_0_6_UMD_PSTATE_MCLK_LEVEL 0x2
29 #define SMU_CAP(x) SMU_13_0_6_CAPS_##x
30 
31 typedef enum {
32 /*0*/   METRICS_VERSION_V0                  = 0,
33 /*1*/   METRICS_VERSION_V1                  = 1,
34 /*2*/   METRICS_VERSION_V2                  = 2,
35 
36 /*3*/   NUM_METRICS                         = 3
37 } METRICS_LIST_e;
38 
39 struct PPTable_t {
40 	uint32_t MaxSocketPowerLimit;
41 	uint32_t MaxGfxclkFrequency;
42 	uint32_t MinGfxclkFrequency;
43 	uint32_t FclkFrequencyTable[4];
44 	uint32_t UclkFrequencyTable[4];
45 	uint32_t SocclkFrequencyTable[4];
46 	uint32_t VclkFrequencyTable[4];
47 	uint32_t DclkFrequencyTable[4];
48 	uint32_t LclkFrequencyTable[4];
49 	uint32_t MaxLclkDpmRange;
50 	uint32_t MinLclkDpmRange;
51 	uint64_t PublicSerialNumber_AID;
52 	uint32_t MaxNodePowerLimit;
53 	uint32_t PPT1Max;
54 	uint32_t PPT1Min;
55 	uint32_t PPT1Default;
56 	bool Init;
57 };
58 
59 enum smu_v13_0_6_caps {
60 	SMU_CAP(DPM),
61 	SMU_CAP(DPM_POLICY),
62 	SMU_CAP(OTHER_END_METRICS),
63 	SMU_CAP(SET_UCLK_MAX),
64 	SMU_CAP(PCIE_METRICS),
65 	SMU_CAP(MCA_DEBUG_MODE),
66 	SMU_CAP(PER_INST_METRICS),
67 	SMU_CAP(CTF_LIMIT),
68 	SMU_CAP(RMA_MSG),
69 	SMU_CAP(ACA_SYND),
70 	SMU_CAP(SDMA_RESET),
71 	SMU_CAP(VCN_RESET),
72 	SMU_CAP(STATIC_METRICS),
73 	SMU_CAP(HST_LIMIT_METRICS),
74 	SMU_CAP(BOARD_VOLTAGE),
75 	SMU_CAP(PLDM_VERSION),
76 	SMU_CAP(TEMP_METRICS),
77 	SMU_CAP(NPM_METRICS),
78 	SMU_CAP(RAS_EEPROM),
79 	SMU_CAP(FAST_PPT),
80 	SMU_CAP(SYSTEM_POWER_METRICS),
81 	SMU_CAP(ALL),
82 };
83 
84 #define SMU_13_0_6_NUM_XGMI_LINKS 8
85 #define SMU_13_0_6_MAX_GFX_CLKS 8
86 #define SMU_13_0_6_MAX_CLKS 4
87 #define SMU_13_0_6_MAX_XCC 8
88 #define SMU_13_0_6_MAX_VCN 4
89 #define SMU_13_0_6_MAX_JPEG 40
90 
91 extern void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu);
92 bool smu_v13_0_6_cap_supported(struct smu_context *smu, enum smu_v13_0_6_caps cap);
93 int smu_v13_0_6_get_static_metrics_table(struct smu_context *smu);
94 int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table,
95 				  bool bypass_cache);
96 
97 bool smu_v13_0_12_is_dpm_running(struct smu_context *smu);
98 int smu_v13_0_12_get_max_metrics_size(void);
99 size_t smu_v13_0_12_get_system_metrics_size(void);
100 int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu);
101 int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
102 				      MetricsMember_t member, uint32_t *value);
103 ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
104 				     struct amdgpu_xcp *xcp, void *table,
105 				     void *smu_metrics);
106 int smu_v13_0_12_tables_init(struct smu_context *smu);
107 void smu_v13_0_12_tables_fini(struct smu_context *smu);
108 int smu_v13_0_12_get_npm_data(struct smu_context *smu,
109 			      enum amd_pp_sensors sensor,
110 			      uint32_t *value);
111 int smu_v13_0_12_get_system_power(struct smu_context *smu,
112 				  enum amd_pp_sensors sensor,
113 				  uint32_t *value);
114 extern const struct cmn2asic_mapping smu_v13_0_12_feature_mask_map[];
115 extern const struct cmn2asic_msg_mapping smu_v13_0_12_message_map[];
116 extern const struct smu_temp_funcs smu_v13_0_12_temp_funcs;
117 extern const struct ras_smu_drv smu_v13_0_12_ras_smu_drv;
118 
119 #if defined(SWSMU_CODE_LAYER_L2)
120 #include "smu_cmn.h"
121 
122 /* SMUv 13.0.6 GPU metrics*/
123 #define SMU_13_0_6_METRICS_FIELDS(SMU_SCALAR, SMU_ARRAY)                       \
124 	SMU_SCALAR(SMU_MATTR(TEMPERATURE_HOTSPOT), SMU_MUNIT(TEMP_1),          \
125 		   SMU_MTYPE(U16), temperature_hotspot);                       \
126 	SMU_SCALAR(SMU_MATTR(TEMPERATURE_MEM), SMU_MUNIT(TEMP_1),              \
127 		   SMU_MTYPE(U16), temperature_mem);                           \
128 	SMU_SCALAR(SMU_MATTR(TEMPERATURE_VRSOC), SMU_MUNIT(TEMP_1),            \
129 		   SMU_MTYPE(U16), temperature_vrsoc);                         \
130 	SMU_SCALAR(SMU_MATTR(CURR_SOCKET_POWER), SMU_MUNIT(POWER_1),           \
131 		   SMU_MTYPE(U16), curr_socket_power);                         \
132 	SMU_SCALAR(SMU_MATTR(AVERAGE_GFX_ACTIVITY), SMU_MUNIT(PERCENT),        \
133 		   SMU_MTYPE(U16), average_gfx_activity);                      \
134 	SMU_SCALAR(SMU_MATTR(AVERAGE_UMC_ACTIVITY), SMU_MUNIT(PERCENT),        \
135 		   SMU_MTYPE(U16), average_umc_activity);                      \
136 	SMU_SCALAR(SMU_MATTR(MEM_MAX_BANDWIDTH), SMU_MUNIT(BW_1),              \
137 		   SMU_MTYPE(U64), mem_max_bandwidth);                         \
138 	SMU_SCALAR(SMU_MATTR(ENERGY_ACCUMULATOR), SMU_MUNIT(NONE),             \
139 		   SMU_MTYPE(U64), energy_accumulator);                        \
140 	SMU_SCALAR(SMU_MATTR(SYSTEM_CLOCK_COUNTER), SMU_MUNIT(TIME_1),         \
141 		   SMU_MTYPE(U64), system_clock_counter);                      \
142 	SMU_SCALAR(SMU_MATTR(ACCUMULATION_COUNTER), SMU_MUNIT(NONE),           \
143 		   SMU_MTYPE(U64), accumulation_counter);                      \
144 	SMU_SCALAR(SMU_MATTR(PROCHOT_RESIDENCY_ACC), SMU_MUNIT(NONE),          \
145 		   SMU_MTYPE(U32), prochot_residency_acc);                     \
146 	SMU_SCALAR(SMU_MATTR(PPT_RESIDENCY_ACC), SMU_MUNIT(NONE),              \
147 		   SMU_MTYPE(U32), ppt_residency_acc);                         \
148 	SMU_SCALAR(SMU_MATTR(SOCKET_THM_RESIDENCY_ACC), SMU_MUNIT(NONE),       \
149 		   SMU_MTYPE(U32), socket_thm_residency_acc);                  \
150 	SMU_SCALAR(SMU_MATTR(VR_THM_RESIDENCY_ACC), SMU_MUNIT(NONE),           \
151 		   SMU_MTYPE(U32), vr_thm_residency_acc);                      \
152 	SMU_SCALAR(SMU_MATTR(HBM_THM_RESIDENCY_ACC), SMU_MUNIT(NONE),          \
153 		   SMU_MTYPE(U32), hbm_thm_residency_acc);                     \
154 	SMU_SCALAR(SMU_MATTR(GFXCLK_LOCK_STATUS), SMU_MUNIT(NONE),             \
155 		   SMU_MTYPE(U32), gfxclk_lock_status);                        \
156 	SMU_SCALAR(SMU_MATTR(PCIE_LINK_WIDTH), SMU_MUNIT(NONE),                \
157 		   SMU_MTYPE(U16), pcie_link_width);                           \
158 	SMU_SCALAR(SMU_MATTR(PCIE_LINK_SPEED), SMU_MUNIT(SPEED_2),             \
159 		   SMU_MTYPE(U16), pcie_link_speed);                           \
160 	SMU_SCALAR(SMU_MATTR(XGMI_LINK_WIDTH), SMU_MUNIT(NONE),                \
161 		   SMU_MTYPE(U16), xgmi_link_width);                           \
162 	SMU_SCALAR(SMU_MATTR(XGMI_LINK_SPEED), SMU_MUNIT(SPEED_1),             \
163 		   SMU_MTYPE(U16), xgmi_link_speed);                           \
164 	SMU_SCALAR(SMU_MATTR(GFX_ACTIVITY_ACC), SMU_MUNIT(PERCENT),            \
165 		   SMU_MTYPE(U32), gfx_activity_acc);                          \
166 	SMU_SCALAR(SMU_MATTR(MEM_ACTIVITY_ACC), SMU_MUNIT(PERCENT),            \
167 		   SMU_MTYPE(U32), mem_activity_acc);                          \
168 	SMU_SCALAR(SMU_MATTR(PCIE_BANDWIDTH_ACC), SMU_MUNIT(PERCENT),          \
169 		   SMU_MTYPE(U64), pcie_bandwidth_acc);                        \
170 	SMU_SCALAR(SMU_MATTR(PCIE_BANDWIDTH_INST), SMU_MUNIT(BW_1),            \
171 		   SMU_MTYPE(U64), pcie_bandwidth_inst);                       \
172 	SMU_SCALAR(SMU_MATTR(PCIE_L0_TO_RECOV_COUNT_ACC), SMU_MUNIT(NONE),     \
173 		   SMU_MTYPE(U64), pcie_l0_to_recov_count_acc);                \
174 	SMU_SCALAR(SMU_MATTR(PCIE_REPLAY_COUNT_ACC), SMU_MUNIT(NONE),          \
175 		   SMU_MTYPE(U64), pcie_replay_count_acc);                     \
176 	SMU_SCALAR(SMU_MATTR(PCIE_REPLAY_ROVER_COUNT_ACC), SMU_MUNIT(NONE),    \
177 		   SMU_MTYPE(U64), pcie_replay_rover_count_acc);               \
178 	SMU_SCALAR(SMU_MATTR(PCIE_NAK_SENT_COUNT_ACC), SMU_MUNIT(NONE),        \
179 		   SMU_MTYPE(U32), pcie_nak_sent_count_acc);                   \
180 	SMU_SCALAR(SMU_MATTR(PCIE_NAK_RCVD_COUNT_ACC), SMU_MUNIT(NONE),        \
181 		   SMU_MTYPE(U32), pcie_nak_rcvd_count_acc);                   \
182 	SMU_ARRAY(SMU_MATTR(XGMI_READ_DATA_ACC), SMU_MUNIT(DATA_1),            \
183 		  SMU_MTYPE(U64), xgmi_read_data_acc,                          \
184 		  SMU_13_0_6_NUM_XGMI_LINKS);                                  \
185 	SMU_ARRAY(SMU_MATTR(XGMI_WRITE_DATA_ACC), SMU_MUNIT(DATA_1),           \
186 		  SMU_MTYPE(U64), xgmi_write_data_acc,                         \
187 		  SMU_13_0_6_NUM_XGMI_LINKS);                                  \
188 	SMU_ARRAY(SMU_MATTR(XGMI_LINK_STATUS), SMU_MUNIT(NONE),                \
189 		  SMU_MTYPE(U16), xgmi_link_status,                            \
190 		  SMU_13_0_6_NUM_XGMI_LINKS);                                  \
191 	SMU_SCALAR(SMU_MATTR(FIRMWARE_TIMESTAMP), SMU_MUNIT(TIME_2),           \
192 		   SMU_MTYPE(U64), firmware_timestamp);                        \
193 	SMU_ARRAY(SMU_MATTR(CURRENT_GFXCLK), SMU_MUNIT(CLOCK_1),               \
194 		  SMU_MTYPE(U16), current_gfxclk, SMU_13_0_6_MAX_GFX_CLKS);    \
195 	SMU_ARRAY(SMU_MATTR(CURRENT_SOCCLK), SMU_MUNIT(CLOCK_1),               \
196 		  SMU_MTYPE(U16), current_socclk, SMU_13_0_6_MAX_CLKS);        \
197 	SMU_ARRAY(SMU_MATTR(CURRENT_VCLK0), SMU_MUNIT(CLOCK_1),                \
198 		  SMU_MTYPE(U16), current_vclk0, SMU_13_0_6_MAX_CLKS);         \
199 	SMU_ARRAY(SMU_MATTR(CURRENT_DCLK0), SMU_MUNIT(CLOCK_1),                \
200 		  SMU_MTYPE(U16), current_dclk0, SMU_13_0_6_MAX_CLKS);         \
201 	SMU_SCALAR(SMU_MATTR(CURRENT_UCLK), SMU_MUNIT(CLOCK_1),                \
202 		   SMU_MTYPE(U16), current_uclk);                              \
203 	SMU_SCALAR(SMU_MATTR(PCIE_LC_PERF_OTHER_END_RECOVERY),                 \
204 		   SMU_MUNIT(NONE), SMU_MTYPE(U32),                            \
205 		   pcie_lc_perf_other_end_recovery);                           \
206 	SMU_ARRAY(SMU_MATTR(GFX_BUSY_INST), SMU_MUNIT(PERCENT),                \
207 		  SMU_MTYPE(U32), gfx_busy_inst, SMU_13_0_6_MAX_XCC);          \
208 	SMU_ARRAY(SMU_MATTR(JPEG_BUSY), SMU_MUNIT(PERCENT), SMU_MTYPE(U16),    \
209 		  jpeg_busy, SMU_13_0_6_MAX_JPEG);                             \
210 	SMU_ARRAY(SMU_MATTR(VCN_BUSY), SMU_MUNIT(PERCENT), SMU_MTYPE(U16),     \
211 		  vcn_busy, SMU_13_0_6_MAX_VCN);                               \
212 	SMU_ARRAY(SMU_MATTR(GFX_BUSY_ACC), SMU_MUNIT(PERCENT), SMU_MTYPE(U64), \
213 		  gfx_busy_acc, SMU_13_0_6_MAX_XCC);                           \
214 	SMU_ARRAY(SMU_MATTR(GFX_BELOW_HOST_LIMIT_PPT_ACC), SMU_MUNIT(NONE),    \
215 		  SMU_MTYPE(U64), gfx_below_host_limit_ppt_acc,                \
216 		  SMU_13_0_6_MAX_XCC);                                         \
217 	SMU_ARRAY(SMU_MATTR(GFX_BELOW_HOST_LIMIT_THM_ACC), SMU_MUNIT(NONE),    \
218 		  SMU_MTYPE(U64), gfx_below_host_limit_thm_acc,                \
219 		  SMU_13_0_6_MAX_XCC);                                         \
220 	SMU_ARRAY(SMU_MATTR(GFX_LOW_UTILIZATION_ACC), SMU_MUNIT(NONE),         \
221 		  SMU_MTYPE(U64), gfx_low_utilization_acc,                     \
222 		  SMU_13_0_6_MAX_XCC);                                         \
223 	SMU_ARRAY(SMU_MATTR(GFX_BELOW_HOST_LIMIT_TOTAL_ACC), SMU_MUNIT(NONE),  \
224 		  SMU_MTYPE(U64), gfx_below_host_limit_total_acc,              \
225 		  SMU_13_0_6_MAX_XCC);
226 
227 DECLARE_SMU_METRICS_CLASS(smu_v13_0_6_gpu_metrics, SMU_13_0_6_METRICS_FIELDS);
228 void smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table,
229 				  void *smu_metrics,
230 				  struct smu_v13_0_6_gpu_metrics *gpu_metrics);
231 
232 #define SMU_13_0_6_PARTITION_METRICS_FIELDS(SMU_SCALAR, SMU_ARRAY)             \
233 	SMU_ARRAY(SMU_MATTR(CURRENT_GFXCLK), SMU_MUNIT(CLOCK_1),               \
234 		  SMU_MTYPE(U16), current_gfxclk, SMU_13_0_6_MAX_XCC);         \
235 	SMU_ARRAY(SMU_MATTR(CURRENT_SOCCLK), SMU_MUNIT(CLOCK_1),               \
236 		  SMU_MTYPE(U16), current_socclk, SMU_13_0_6_MAX_CLKS);        \
237 	SMU_ARRAY(SMU_MATTR(CURRENT_VCLK0), SMU_MUNIT(CLOCK_1),                \
238 		  SMU_MTYPE(U16), current_vclk0, SMU_13_0_6_MAX_CLKS);         \
239 	SMU_ARRAY(SMU_MATTR(CURRENT_DCLK0), SMU_MUNIT(CLOCK_1),                \
240 		  SMU_MTYPE(U16), current_dclk0, SMU_13_0_6_MAX_CLKS);         \
241 	SMU_SCALAR(SMU_MATTR(CURRENT_UCLK), SMU_MUNIT(CLOCK_1),                \
242 		   SMU_MTYPE(U16), current_uclk);                              \
243 	SMU_ARRAY(SMU_MATTR(GFX_BUSY_INST), SMU_MUNIT(PERCENT),                \
244 		  SMU_MTYPE(U32), gfx_busy_inst, SMU_13_0_6_MAX_XCC);          \
245 	SMU_ARRAY(SMU_MATTR(JPEG_BUSY), SMU_MUNIT(PERCENT), SMU_MTYPE(U16),    \
246 		  jpeg_busy, SMU_13_0_6_MAX_JPEG);                             \
247 	SMU_ARRAY(SMU_MATTR(VCN_BUSY), SMU_MUNIT(PERCENT), SMU_MTYPE(U16),     \
248 		  vcn_busy, SMU_13_0_6_MAX_VCN);                               \
249 	SMU_ARRAY(SMU_MATTR(GFX_BUSY_ACC), SMU_MUNIT(PERCENT), SMU_MTYPE(U64), \
250 		  gfx_busy_acc, SMU_13_0_6_MAX_XCC);                           \
251 	SMU_ARRAY(SMU_MATTR(GFX_BELOW_HOST_LIMIT_PPT_ACC), SMU_MUNIT(NONE),    \
252 		  SMU_MTYPE(U64), gfx_below_host_limit_ppt_acc,                \
253 		  SMU_13_0_6_MAX_XCC);                                         \
254 	SMU_ARRAY(SMU_MATTR(GFX_BELOW_HOST_LIMIT_THM_ACC), SMU_MUNIT(NONE),    \
255 		  SMU_MTYPE(U64), gfx_below_host_limit_thm_acc,                \
256 		  SMU_13_0_6_MAX_XCC);                                         \
257 	SMU_ARRAY(SMU_MATTR(GFX_LOW_UTILIZATION_ACC), SMU_MUNIT(NONE),         \
258 		  SMU_MTYPE(U64), gfx_low_utilization_acc,                     \
259 		  SMU_13_0_6_MAX_XCC);                                         \
260 	SMU_ARRAY(SMU_MATTR(GFX_BELOW_HOST_LIMIT_TOTAL_ACC), SMU_MUNIT(NONE),  \
261 		  SMU_MTYPE(U64), gfx_below_host_limit_total_acc,              \
262 		  SMU_13_0_6_MAX_XCC);					       \
263 	SMU_SCALAR(SMU_MATTR(ACCUMULATION_COUNTER), SMU_MUNIT(NONE),           \
264 		   SMU_MTYPE(U64), accumulation_counter);                      \
265 	SMU_SCALAR(SMU_MATTR(FIRMWARE_TIMESTAMP), SMU_MUNIT(TIME_2),           \
266 		   SMU_MTYPE(U64), firmware_timestamp);
267 
268 DECLARE_SMU_METRICS_CLASS(smu_v13_0_6_partition_metrics,
269 			  SMU_13_0_6_PARTITION_METRICS_FIELDS);
270 
271 #endif /* SWSMU_CODE_LAYER_L2 */
272 
273 #endif
274