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 void (*enable)(struct drm_i915_private *dev_priv,
265 struct intel_shared_dpll *pll);
266
267
268
269
270
271
272
273
274 void (*disable)(struct drm_i915_private *dev_priv,
275 struct intel_shared_dpll *pll);
276
277
278
279
280
281
282
283
284 bool (*get_hw_state)(struct drm_i915_private *dev_priv,
285 struct intel_shared_dpll *pll,
286 struct intel_dpll_hw_state *hw_state);
287
288
289
290
291
292
293
294 int (*get_freq)(struct drm_i915_private *i915,
295 const struct intel_shared_dpll *pll,
296 const struct intel_dpll_hw_state *pll_state);
297};
298
299
300
301
302struct dpll_info {
303
304
305
306 const char *name;
307
308
309
310
311 const struct intel_shared_dpll_funcs *funcs;
312
313
314
315
316
317 enum intel_dpll_id id;
318
319#define INTEL_DPLL_ALWAYS_ON (1 << 0)
320
321
322
323
324
325
326
327 u32 flags;
328};
329
330
331
332
333struct intel_shared_dpll {
334
335
336
337
338
339
340 struct intel_shared_dpll_state state;
341
342
343
344
345 u8 active_mask;
346
347
348
349
350 bool on;
351
352
353
354
355 const struct dpll_info *info;
356
357
358
359
360
361 intel_wakeref_t wakeref;
362};
363
364#define SKL_DPLL0 0
365#define SKL_DPLL1 1
366#define SKL_DPLL2 2
367#define SKL_DPLL3 3
368
369
370struct intel_shared_dpll *
371intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
372 enum intel_dpll_id id);
373enum intel_dpll_id
374intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
375 struct intel_shared_dpll *pll);
376void assert_shared_dpll(struct drm_i915_private *dev_priv,
377 struct intel_shared_dpll *pll,
378 bool state);
379#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
380#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
381bool intel_reserve_shared_dplls(struct intel_atomic_state *state,
382 struct intel_crtc *crtc,
383 struct intel_encoder *encoder);
384void intel_release_shared_dplls(struct intel_atomic_state *state,
385 struct intel_crtc *crtc);
386void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state,
387 enum icl_port_dpll_id port_dpll_id);
388void intel_update_active_dpll(struct intel_atomic_state *state,
389 struct intel_crtc *crtc,
390 struct intel_encoder *encoder);
391int intel_dpll_get_freq(struct drm_i915_private *i915,
392 const struct intel_shared_dpll *pll,
393 const struct intel_dpll_hw_state *pll_state);
394bool intel_dpll_get_hw_state(struct drm_i915_private *i915,
395 struct intel_shared_dpll *pll,
396 struct intel_dpll_hw_state *hw_state);
397void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state);
398void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state);
399void intel_shared_dpll_swap_state(struct intel_atomic_state *state);
400void intel_shared_dpll_init(struct drm_device *dev);
401void intel_dpll_update_ref_clks(struct drm_i915_private *dev_priv);
402void intel_dpll_readout_hw_state(struct drm_i915_private *dev_priv);
403void intel_dpll_sanitize_state(struct drm_i915_private *dev_priv);
404
405void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
406 const struct intel_dpll_hw_state *hw_state);
407enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port);
408bool intel_dpll_is_combophy(enum intel_dpll_id id);
409
410#endif
411