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#ifndef _INTEL_DPLL_MGR_H_
26#define _INTEL_DPLL_MGR_H_
27
28#include <linux/types.h>
29
30#include "intel_display.h"
31#include "intel_wakeref.h"
32
33
34#define abs_diff(a, b) ({ \
35 typeof(a) __a = (a); \
36 typeof(b) __b = (b); \
37 (void) (&__a == &__b); \
38 __a > __b ? (__a - __b) : (__b - __a); })
39
40struct drm_device;
41struct drm_i915_private;
42struct intel_atomic_state;
43struct intel_crtc;
44struct intel_crtc_state;
45struct intel_encoder;
46struct intel_shared_dpll;
47
48
49
50
51
52
53enum intel_dpll_id {
54
55
56
57 DPLL_ID_PRIVATE = -1,
58
59
60
61
62 DPLL_ID_PCH_PLL_A = 0,
63
64
65
66 DPLL_ID_PCH_PLL_B = 1,
67
68
69
70
71
72 DPLL_ID_WRPLL1 = 0,
73
74
75
76 DPLL_ID_WRPLL2 = 1,
77
78
79
80 DPLL_ID_SPLL = 2,
81
82
83
84 DPLL_ID_LCPLL_810 = 3,
85
86
87
88 DPLL_ID_LCPLL_1350 = 4,
89
90
91
92 DPLL_ID_LCPLL_2700 = 5,
93
94
95
96
97
98 DPLL_ID_SKL_DPLL0 = 0,
99
100
101
102 DPLL_ID_SKL_DPLL1 = 1,
103
104
105
106 DPLL_ID_SKL_DPLL2 = 2,
107
108
109
110 DPLL_ID_SKL_DPLL3 = 3,
111
112
113
114
115
116 DPLL_ID_ICL_DPLL0 = 0,
117
118
119
120 DPLL_ID_ICL_DPLL1 = 1,
121
122
123
124 DPLL_ID_EHL_DPLL4 = 2,
125
126
127
128 DPLL_ID_ICL_TBTPLL = 2,
129
130
131
132
133 DPLL_ID_ICL_MGPLL1 = 3,
134
135
136
137
138 DPLL_ID_ICL_MGPLL2 = 4,
139
140
141
142
143 DPLL_ID_ICL_MGPLL3 = 5,
144
145
146
147
148 DPLL_ID_ICL_MGPLL4 = 6,
149
150
151
152 DPLL_ID_TGL_MGPLL5 = 7,
153
154
155
156 DPLL_ID_TGL_MGPLL6 = 8,
157
158
159
160
161 DPLL_ID_DG1_DPLL0 = 0,
162
163
164
165 DPLL_ID_DG1_DPLL1 = 1,
166
167
168
169 DPLL_ID_DG1_DPLL2 = 2,
170
171
172
173 DPLL_ID_DG1_DPLL3 = 3,
174};
175
176#define I915_NUM_PLLS 9
177
178enum icl_port_dpll_id {
179 ICL_PORT_DPLL_DEFAULT,
180 ICL_PORT_DPLL_MG_PHY,
181
182 ICL_PORT_DPLL_COUNT,
183};
184
185struct intel_dpll_hw_state {
186
187 u32 dpll;
188 u32 dpll_md;
189 u32 fp0;
190 u32 fp1;
191
192
193 u32 wrpll;
194 u32 spll;
195
196
197
198
199
200
201
202
203 u32 ctrl1;
204
205 u32 cfgcr1, cfgcr2;
206
207
208 u32 cfgcr0;
209
210
211 u32 ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10, pcsdw12;
212
213
214
215
216
217 u32 mg_refclkin_ctl;
218 u32 mg_clktop2_coreclkctl1;
219 u32 mg_clktop2_hsclkctl;
220 u32 mg_pll_div0;
221 u32 mg_pll_div1;
222 u32 mg_pll_lf;
223 u32 mg_pll_frac_lock;
224 u32 mg_pll_ssc;
225 u32 mg_pll_bias;
226 u32 mg_pll_tdc_coldst_bias;
227 u32 mg_pll_bias_mask;
228 u32 mg_pll_tdc_coldst_bias_mask;
229};
230
231
232
233
234
235
236
237
238
239
240
241struct intel_shared_dpll_state {
242
243
244
245 u8 pipe_mask;
246
247
248
249
250
251 struct intel_dpll_hw_state hw_state;
252};
253
254
255
256
257struct intel_shared_dpll_funcs {
258
259
260
261
262
263
264
265 void (*prepare)(struct drm_i915_private *dev_priv,
266 struct intel_shared_dpll *pll);
267
268
269
270
271
272
273
274 void (*enable)(struct drm_i915_private *dev_priv,
275 struct intel_shared_dpll *pll);
276
277
278
279
280
281
282
283
284 void (*disable)(struct drm_i915_private *dev_priv,
285 struct intel_shared_dpll *pll);
286
287
288
289
290
291
292
293
294 bool (*get_hw_state)(struct drm_i915_private *dev_priv,
295 struct intel_shared_dpll *pll,
296 struct intel_dpll_hw_state *hw_state);
297
298
299
300
301
302
303
304 int (*get_freq)(struct drm_i915_private *i915,
305 const struct intel_shared_dpll *pll,
306 const struct intel_dpll_hw_state *pll_state);
307};
308
309
310
311
312struct dpll_info {
313
314
315
316 const char *name;
317
318
319
320
321 const struct intel_shared_dpll_funcs *funcs;
322
323
324
325
326
327 enum intel_dpll_id id;
328
329#define INTEL_DPLL_ALWAYS_ON (1 << 0)
330
331
332
333
334
335
336
337 u32 flags;
338};
339
340
341
342
343struct intel_shared_dpll {
344
345
346
347
348
349
350 struct intel_shared_dpll_state state;
351
352
353
354
355 u8 active_mask;
356
357
358
359
360 bool on;
361
362
363
364
365 const struct dpll_info *info;
366
367
368
369
370
371 intel_wakeref_t wakeref;
372};
373
374#define SKL_DPLL0 0
375#define SKL_DPLL1 1
376#define SKL_DPLL2 2
377#define SKL_DPLL3 3
378
379
380struct intel_shared_dpll *
381intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
382 enum intel_dpll_id id);
383enum intel_dpll_id
384intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
385 struct intel_shared_dpll *pll);
386void assert_shared_dpll(struct drm_i915_private *dev_priv,
387 struct intel_shared_dpll *pll,
388 bool state);
389#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
390#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
391bool intel_reserve_shared_dplls(struct intel_atomic_state *state,
392 struct intel_crtc *crtc,
393 struct intel_encoder *encoder);
394void intel_release_shared_dplls(struct intel_atomic_state *state,
395 struct intel_crtc *crtc);
396void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state,
397 enum icl_port_dpll_id port_dpll_id);
398void intel_update_active_dpll(struct intel_atomic_state *state,
399 struct intel_crtc *crtc,
400 struct intel_encoder *encoder);
401int intel_dpll_get_freq(struct drm_i915_private *i915,
402 const struct intel_shared_dpll *pll,
403 const struct intel_dpll_hw_state *pll_state);
404bool intel_dpll_get_hw_state(struct drm_i915_private *i915,
405 struct intel_shared_dpll *pll,
406 struct intel_dpll_hw_state *hw_state);
407void intel_prepare_shared_dpll(const struct intel_crtc_state *crtc_state);
408void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state);
409void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state);
410void intel_shared_dpll_swap_state(struct intel_atomic_state *state);
411void intel_shared_dpll_init(struct drm_device *dev);
412void intel_dpll_update_ref_clks(struct drm_i915_private *dev_priv);
413void intel_dpll_readout_hw_state(struct drm_i915_private *dev_priv);
414void intel_dpll_sanitize_state(struct drm_i915_private *dev_priv);
415
416void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
417 const struct intel_dpll_hw_state *hw_state);
418enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port);
419bool intel_dpll_is_combophy(enum intel_dpll_id id);
420
421#endif
422