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
212 u32 ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10, pcsdw12;
213
214
215
216
217
218 u32 mg_refclkin_ctl;
219 u32 mg_clktop2_coreclkctl1;
220 u32 mg_clktop2_hsclkctl;
221 u32 mg_pll_div0;
222 u32 mg_pll_div1;
223 u32 mg_pll_lf;
224 u32 mg_pll_frac_lock;
225 u32 mg_pll_ssc;
226 u32 mg_pll_bias;
227 u32 mg_pll_tdc_coldst_bias;
228 u32 mg_pll_bias_mask;
229 u32 mg_pll_tdc_coldst_bias_mask;
230};
231
232
233
234
235
236
237
238
239
240
241
242struct intel_shared_dpll_state {
243
244
245
246 u8 pipe_mask;
247
248
249
250
251
252 struct intel_dpll_hw_state hw_state;
253};
254
255
256
257
258struct intel_shared_dpll_funcs {
259
260
261
262
263
264
265
266 void (*prepare)(struct drm_i915_private *dev_priv,
267 struct intel_shared_dpll *pll);
268
269
270
271
272
273
274
275 void (*enable)(struct drm_i915_private *dev_priv,
276 struct intel_shared_dpll *pll);
277
278
279
280
281
282
283
284
285 void (*disable)(struct drm_i915_private *dev_priv,
286 struct intel_shared_dpll *pll);
287
288
289
290
291
292
293
294
295 bool (*get_hw_state)(struct drm_i915_private *dev_priv,
296 struct intel_shared_dpll *pll,
297 struct intel_dpll_hw_state *hw_state);
298
299
300
301
302
303
304
305 int (*get_freq)(struct drm_i915_private *i915,
306 const struct intel_shared_dpll *pll,
307 const struct intel_dpll_hw_state *pll_state);
308};
309
310
311
312
313struct dpll_info {
314
315
316
317 const char *name;
318
319
320
321
322 const struct intel_shared_dpll_funcs *funcs;
323
324
325
326
327
328 enum intel_dpll_id id;
329
330#define INTEL_DPLL_ALWAYS_ON (1 << 0)
331
332
333
334
335
336
337
338 u32 flags;
339};
340
341
342
343
344struct intel_shared_dpll {
345
346
347
348
349
350
351 struct intel_shared_dpll_state state;
352
353
354
355
356 u8 active_mask;
357
358
359
360
361 bool on;
362
363
364
365
366 const struct dpll_info *info;
367
368
369
370
371
372 intel_wakeref_t wakeref;
373};
374
375#define SKL_DPLL0 0
376#define SKL_DPLL1 1
377#define SKL_DPLL2 2
378#define SKL_DPLL3 3
379
380
381struct intel_shared_dpll *
382intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
383 enum intel_dpll_id id);
384enum intel_dpll_id
385intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
386 struct intel_shared_dpll *pll);
387void assert_shared_dpll(struct drm_i915_private *dev_priv,
388 struct intel_shared_dpll *pll,
389 bool state);
390#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
391#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
392bool intel_reserve_shared_dplls(struct intel_atomic_state *state,
393 struct intel_crtc *crtc,
394 struct intel_encoder *encoder);
395void intel_release_shared_dplls(struct intel_atomic_state *state,
396 struct intel_crtc *crtc);
397void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state,
398 enum icl_port_dpll_id port_dpll_id);
399void intel_update_active_dpll(struct intel_atomic_state *state,
400 struct intel_crtc *crtc,
401 struct intel_encoder *encoder);
402int intel_dpll_get_freq(struct drm_i915_private *i915,
403 const struct intel_shared_dpll *pll,
404 const struct intel_dpll_hw_state *pll_state);
405bool intel_dpll_get_hw_state(struct drm_i915_private *i915,
406 struct intel_shared_dpll *pll,
407 struct intel_dpll_hw_state *hw_state);
408void intel_prepare_shared_dpll(const struct intel_crtc_state *crtc_state);
409void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state);
410void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state);
411void intel_shared_dpll_swap_state(struct intel_atomic_state *state);
412void intel_shared_dpll_init(struct drm_device *dev);
413void intel_dpll_update_ref_clks(struct drm_i915_private *dev_priv);
414void intel_dpll_readout_hw_state(struct drm_i915_private *dev_priv);
415void intel_dpll_sanitize_state(struct drm_i915_private *dev_priv);
416
417void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
418 const struct intel_dpll_hw_state *hw_state);
419enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port);
420bool intel_dpll_is_combophy(enum intel_dpll_id id);
421
422#endif
423