1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef DM_PP_SMU_IF__H
27#define DM_PP_SMU_IF__H
28
29
30
31
32
33typedef bool BOOLEAN;
34
35enum pp_smu_ver {
36
37
38
39
40
41
42 PP_SMU_UNSUPPORTED,
43 PP_SMU_VER_RV,
44 PP_SMU_VER_NV,
45 PP_SMU_VER_RN,
46
47 PP_SMU_VER_MAX
48};
49
50struct pp_smu {
51 enum pp_smu_ver ver;
52 const void *pp;
53
54
55
56
57
58
59 const void *dm;
60};
61
62enum pp_smu_status {
63 PP_SMU_RESULT_UNDEFINED = 0,
64 PP_SMU_RESULT_OK = 1,
65 PP_SMU_RESULT_FAIL,
66 PP_SMU_RESULT_UNSUPPORTED
67};
68
69#define PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN 0x0
70#define PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX 0xFFFF
71
72enum wm_type {
73 WM_TYPE_PSTATE_CHG = 0,
74 WM_TYPE_RETRAINING = 1,
75};
76
77
78struct pp_smu_wm_set_range {
79 uint16_t min_fill_clk_mhz;
80 uint16_t max_fill_clk_mhz;
81 uint16_t min_drain_clk_mhz;
82 uint16_t max_drain_clk_mhz;
83
84 uint8_t wm_inst;
85 uint8_t wm_type;
86};
87
88#define MAX_WATERMARK_SETS 4
89
90struct pp_smu_wm_range_sets {
91 unsigned int num_reader_wm_sets;
92 struct pp_smu_wm_set_range reader_wm_sets[MAX_WATERMARK_SETS];
93
94 unsigned int num_writer_wm_sets;
95 struct pp_smu_wm_set_range writer_wm_sets[MAX_WATERMARK_SETS];
96};
97
98struct pp_smu_funcs_rv {
99 struct pp_smu pp_smu;
100
101
102
103
104
105 void (*set_display_count)(struct pp_smu *pp, int count);
106
107
108
109
110
111
112
113
114 void (*set_wm_ranges)(struct pp_smu *pp,
115 struct pp_smu_wm_range_sets *ranges);
116
117
118
119
120 void (*set_hard_min_dcfclk_by_freq)(struct pp_smu *pp, int mhz);
121
122
123
124
125
126 void (*set_min_deep_sleep_dcfclk)(struct pp_smu *pp, int mhz);
127
128
129
130
131 void (*set_hard_min_fclk_by_freq)(struct pp_smu *pp, int mhz);
132
133
134
135
136 void (*set_hard_min_socclk_by_freq)(struct pp_smu *pp, int mhz);
137
138
139 void (*set_pme_wa_enable)(struct pp_smu *pp);
140};
141
142
143
144
145enum pp_smu_nv_clock_id {
146 PP_SMU_NV_DISPCLK,
147 PP_SMU_NV_PHYCLK,
148 PP_SMU_NV_PIXELCLK
149};
150
151
152
153
154struct pp_smu_nv_clock_table {
155
156 unsigned int displayClockInKhz;
157 unsigned int dppClockInKhz;
158 unsigned int phyClockInKhz;
159 unsigned int pixelClockInKhz;
160 unsigned int dscClockInKhz;
161
162
163 unsigned int fabricClockInKhz;
164 unsigned int socClockInKhz;
165 unsigned int dcfClockInKhz;
166 unsigned int uClockInKhz;
167};
168
169struct pp_smu_funcs_nv {
170 struct pp_smu pp_smu;
171
172
173
174
175 enum pp_smu_status (*set_display_count)(struct pp_smu *pp, int count);
176
177
178
179
180 enum pp_smu_status (*set_hard_min_dcfclk_by_freq)(struct pp_smu *pp, int Mhz);
181
182
183
184
185
186 enum pp_smu_status (*set_min_deep_sleep_dcfclk)(struct pp_smu *pp, int Mhz);
187
188
189
190
191 enum pp_smu_status (*set_hard_min_uclk_by_freq)(struct pp_smu *pp, int Mhz);
192
193
194
195
196 enum pp_smu_status (*set_hard_min_socclk_by_freq)(struct pp_smu *pp, int Mhz);
197
198
199 enum pp_smu_status (*set_pme_wa_enable)(struct pp_smu *pp);
200
201
202
203
204 enum pp_smu_status (*set_voltage_by_freq)(struct pp_smu *pp,
205 enum pp_smu_nv_clock_id clock_id, int Mhz);
206
207
208
209
210
211
212
213
214
215
216
217
218
219 enum pp_smu_status (*set_wm_ranges)(struct pp_smu *pp,
220 struct pp_smu_wm_range_sets *ranges);
221
222
223
224
225 enum pp_smu_status (*get_maximum_sustainable_clocks)(struct pp_smu *pp,
226 struct pp_smu_nv_clock_table *max_clocks);
227
228
229
230 enum pp_smu_status (*get_uclk_dpm_states)(struct pp_smu *pp,
231 unsigned int *clock_values_in_khz, unsigned int *num_states);
232
233
234
235
236
237
238
239
240
241
242 enum pp_smu_status (*set_pstate_handshake_support)(struct pp_smu *pp,
243 BOOLEAN pstate_handshake_supported);
244};
245
246#define PP_SMU_NUM_SOCCLK_DPM_LEVELS 8
247#define PP_SMU_NUM_DCFCLK_DPM_LEVELS 8
248#define PP_SMU_NUM_FCLK_DPM_LEVELS 4
249#define PP_SMU_NUM_MEMCLK_DPM_LEVELS 4
250
251struct dpm_clock {
252 uint32_t Freq;
253 uint32_t Vol;
254};
255
256
257
258struct dpm_clocks {
259 struct dpm_clock DcfClocks[PP_SMU_NUM_DCFCLK_DPM_LEVELS];
260 struct dpm_clock SocClocks[PP_SMU_NUM_SOCCLK_DPM_LEVELS];
261 struct dpm_clock FClocks[PP_SMU_NUM_FCLK_DPM_LEVELS];
262 struct dpm_clock MemClocks[PP_SMU_NUM_MEMCLK_DPM_LEVELS];
263};
264
265
266struct pp_smu_funcs_rn {
267 struct pp_smu pp_smu;
268
269
270
271
272
273
274
275
276
277 enum pp_smu_status (*set_wm_ranges)(struct pp_smu *pp,
278 struct pp_smu_wm_range_sets *ranges);
279
280 enum pp_smu_status (*get_dpm_clock_table) (struct pp_smu *pp,
281 struct dpm_clocks *clock_table);
282};
283
284struct pp_smu_funcs {
285 struct pp_smu ctx;
286 union {
287 struct pp_smu_funcs_rv rv_funcs;
288 struct pp_smu_funcs_nv nv_funcs;
289 struct pp_smu_funcs_rn rn_funcs;
290
291 };
292};
293
294#endif
295