This source file includes following definitions.
- dm_write_reg_func
- dm_read_index_reg
- dm_write_index_reg
- get_reg_field_value_ex
- set_reg_field_value_ex
- dm_get_timestamp
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
27
28
29
30 #ifndef __DM_SERVICES_H__
31
32 #define __DM_SERVICES_H__
33
34 #include "amdgpu_dm_trace.h"
35
36
37 #include "dm_services_types.h"
38 #include "logger_interface.h"
39 #include "link_service_types.h"
40
41 #undef DEPRECATED
42
43 irq_handler_idx dm_register_interrupt(
44 struct dc_context *ctx,
45 struct dc_interrupt_params *int_params,
46 interrupt_handler ih,
47 void *handler_args);
48
49
50
51
52
53
54
55 uint32_t dm_read_reg_func(
56 const struct dc_context *ctx,
57 uint32_t address,
58 const char *func_name);
59
60
61
62 #define dm_read_reg(ctx, address) \
63 dm_read_reg_func(ctx, address, __func__)
64
65
66
67 #define dm_write_reg(ctx, address, value) \
68 dm_write_reg_func(ctx, address, value, __func__)
69
70 static inline void dm_write_reg_func(
71 const struct dc_context *ctx,
72 uint32_t address,
73 uint32_t value,
74 const char *func_name)
75 {
76 #ifdef DM_CHECK_ADDR_0
77 if (address == 0) {
78 DC_ERR("invalid register write. address = 0");
79 return;
80 }
81 #endif
82 cgs_write_register(ctx->cgs_device, address, value);
83 trace_amdgpu_dc_wreg(&ctx->perf_trace->write_count, address, value);
84 }
85
86 static inline uint32_t dm_read_index_reg(
87 const struct dc_context *ctx,
88 enum cgs_ind_reg addr_space,
89 uint32_t index)
90 {
91 return cgs_read_ind_register(ctx->cgs_device, addr_space, index);
92 }
93
94 static inline void dm_write_index_reg(
95 const struct dc_context *ctx,
96 enum cgs_ind_reg addr_space,
97 uint32_t index,
98 uint32_t value)
99 {
100 cgs_write_ind_register(ctx->cgs_device, addr_space, index, value);
101 }
102
103 static inline uint32_t get_reg_field_value_ex(
104 uint32_t reg_value,
105 uint32_t mask,
106 uint8_t shift)
107 {
108 return (mask & reg_value) >> shift;
109 }
110
111 #define get_reg_field_value(reg_value, reg_name, reg_field)\
112 get_reg_field_value_ex(\
113 (reg_value),\
114 reg_name ## __ ## reg_field ## _MASK,\
115 reg_name ## __ ## reg_field ## __SHIFT)
116
117 static inline uint32_t set_reg_field_value_ex(
118 uint32_t reg_value,
119 uint32_t value,
120 uint32_t mask,
121 uint8_t shift)
122 {
123 ASSERT(mask != 0);
124 return (reg_value & ~mask) | (mask & (value << shift));
125 }
126
127 #define set_reg_field_value(reg_value, value, reg_name, reg_field)\
128 (reg_value) = set_reg_field_value_ex(\
129 (reg_value),\
130 (value),\
131 reg_name ## __ ## reg_field ## _MASK,\
132 reg_name ## __ ## reg_field ## __SHIFT)
133
134 uint32_t generic_reg_set_ex(const struct dc_context *ctx,
135 uint32_t addr, uint32_t reg_val, int n,
136 uint8_t shift1, uint32_t mask1, uint32_t field_value1, ...);
137
138 uint32_t generic_reg_update_ex(const struct dc_context *ctx,
139 uint32_t addr, int n,
140 uint8_t shift1, uint32_t mask1, uint32_t field_value1, ...);
141
142 #define FD(reg_field) reg_field ## __SHIFT, \
143 reg_field ## _MASK
144
145
146
147
148
149 void generic_reg_wait(const struct dc_context *ctx,
150 uint32_t addr, uint32_t mask, uint32_t shift, uint32_t condition_value,
151 unsigned int delay_between_poll_us, unsigned int time_out_num_tries,
152 const char *func_name, int line);
153
154 unsigned int snprintf_count(char *pBuf, unsigned int bufSize, char *fmt, ...);
155
156
157
158
159 #define dm_write_reg_soc15(ctx, reg, inst_offset, value) \
160 dm_write_reg_func(ctx, reg + DCE_BASE.instance[0].segment[reg##_BASE_IDX] + inst_offset, value, __func__)
161
162 #define dm_read_reg_soc15(ctx, reg, inst_offset) \
163 dm_read_reg_func(ctx, reg + DCE_BASE.instance[0].segment[reg##_BASE_IDX] + inst_offset, __func__)
164
165 #define generic_reg_update_soc15(ctx, inst_offset, reg_name, n, ...)\
166 generic_reg_update_ex(ctx, DCE_BASE.instance[0].segment[mm##reg_name##_BASE_IDX] + mm##reg_name + inst_offset, \
167 n, __VA_ARGS__)
168
169 #define generic_reg_set_soc15(ctx, inst_offset, reg_name, n, ...)\
170 generic_reg_set_ex(ctx, DCE_BASE.instance[0].segment[mm##reg_name##_BASE_IDX] + mm##reg_name + inst_offset, 0, \
171 n, __VA_ARGS__)
172
173 #define get_reg_field_value_soc15(reg_value, block, reg_num, reg_name, reg_field)\
174 get_reg_field_value_ex(\
175 (reg_value),\
176 block ## reg_num ## _ ## reg_name ## __ ## reg_field ## _MASK,\
177 block ## reg_num ## _ ## reg_name ## __ ## reg_field ## __SHIFT)
178
179 #define set_reg_field_value_soc15(reg_value, value, block, reg_num, reg_name, reg_field)\
180 (reg_value) = set_reg_field_value_ex(\
181 (reg_value),\
182 (value),\
183 block ## reg_num ## _ ## reg_name ## __ ## reg_field ## _MASK,\
184 block ## reg_num ## _ ## reg_name ## __ ## reg_field ## __SHIFT)
185
186
187
188
189
190
191
192
193
194
195
196
197
198 bool dm_pp_get_clock_levels_by_type(
199 const struct dc_context *ctx,
200 enum dm_pp_clock_type clk_type,
201 struct dm_pp_clock_levels *clk_level_info);
202
203 bool dm_pp_get_clock_levels_by_type_with_latency(
204 const struct dc_context *ctx,
205 enum dm_pp_clock_type clk_type,
206 struct dm_pp_clock_levels_with_latency *clk_level_info);
207
208 bool dm_pp_get_clock_levels_by_type_with_voltage(
209 const struct dc_context *ctx,
210 enum dm_pp_clock_type clk_type,
211 struct dm_pp_clock_levels_with_voltage *clk_level_info);
212
213 bool dm_pp_notify_wm_clock_changes(
214 const struct dc_context *ctx,
215 struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges);
216
217 void dm_pp_get_funcs(struct dc_context *ctx,
218 struct pp_smu_funcs *funcs);
219
220
221
222
223
224
225
226
227
228
229
230
231 bool dm_pp_apply_display_requirements(
232 const struct dc_context *ctx,
233 const struct dm_pp_display_configuration *pp_display_cfg);
234
235 bool dm_pp_apply_power_level_change_request(
236 const struct dc_context *ctx,
237 struct dm_pp_power_level_change_request *level_change_req);
238
239 bool dm_pp_apply_clock_for_voltage_request(
240 const struct dc_context *ctx,
241 struct dm_pp_clock_for_voltage_req *clock_for_voltage_req);
242
243 bool dm_pp_get_static_clocks(
244 const struct dc_context *ctx,
245 struct dm_pp_static_clock_info *static_clk_info);
246
247
248
249 struct persistent_data_flag {
250 bool save_per_link;
251 bool save_per_edid;
252 };
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281 bool dm_write_persistent_data(struct dc_context *ctx,
282 const struct dc_sink *sink,
283 const char *module_name,
284 const char *key_name,
285 void *params,
286 unsigned int size,
287 struct persistent_data_flag *flag);
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315 bool dm_read_persistent_data(struct dc_context *ctx,
316 const struct dc_sink *sink,
317 const char *module_name,
318 const char *key_name,
319 void *params,
320 unsigned int size,
321 struct persistent_data_flag *flag);
322
323 bool dm_query_extended_brightness_caps
324 (struct dc_context *ctx, enum dm_acpi_display_type display,
325 struct dm_acpi_atif_backlight_caps *pCaps);
326
327 bool dm_dmcu_set_pipe(struct dc_context *ctx, unsigned int controller_id);
328
329
330
331
332
333
334 #define dm_log_to_buffer(buffer, size, fmt, args)\
335 vsnprintf(buffer, size, fmt, args)
336
337 static inline unsigned long long dm_get_timestamp(struct dc_context *ctx)
338 {
339 return ktime_get_raw_ns();
340 }
341
342 unsigned long long dm_get_elapse_time_in_ns(struct dc_context *ctx,
343 unsigned long long current_time_stamp,
344 unsigned long long last_time_stamp);
345
346
347
348
349 #define PERF_TRACE() trace_amdgpu_dc_performance(CTX->perf_trace->read_count,\
350 CTX->perf_trace->write_count, &CTX->perf_trace->last_entry_read,\
351 &CTX->perf_trace->last_entry_write, __func__, __LINE__)
352 #define PERF_TRACE_CTX(__CTX) trace_amdgpu_dc_performance(__CTX->perf_trace->read_count,\
353 __CTX->perf_trace->write_count, &__CTX->perf_trace->last_entry_read,\
354 &__CTX->perf_trace->last_entry_write, __func__, __LINE__)
355
356
357
358
359
360
361 void dm_dtn_log_begin(struct dc_context *ctx,
362 struct dc_log_buffer_ctx *log_ctx);
363 void dm_dtn_log_append_v(struct dc_context *ctx,
364 struct dc_log_buffer_ctx *log_ctx,
365 const char *msg, ...);
366 void dm_dtn_log_end(struct dc_context *ctx,
367 struct dc_log_buffer_ctx *log_ctx);
368
369 #endif