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
40 struct drm_device;
41 struct drm_i915_private;
42 struct intel_atomic_state;
43 struct intel_crtc;
44 struct intel_crtc_state;
45 struct intel_encoder;
46 struct intel_shared_dpll;
47
48
49
50
51
52
53 enum 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 #define I915_NUM_PLLS 9
160
161 enum icl_port_dpll_id {
162 ICL_PORT_DPLL_DEFAULT,
163 ICL_PORT_DPLL_MG_PHY,
164
165 ICL_PORT_DPLL_COUNT,
166 };
167
168 struct intel_dpll_hw_state {
169
170 u32 dpll;
171 u32 dpll_md;
172 u32 fp0;
173 u32 fp1;
174
175
176 u32 wrpll;
177 u32 spll;
178
179
180
181
182
183
184
185
186 u32 ctrl1;
187
188 u32 cfgcr1, cfgcr2;
189
190
191 u32 cfgcr0;
192
193
194
195 u32 ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10, pcsdw12;
196
197
198
199
200
201 u32 mg_refclkin_ctl;
202 u32 mg_clktop2_coreclkctl1;
203 u32 mg_clktop2_hsclkctl;
204 u32 mg_pll_div0;
205 u32 mg_pll_div1;
206 u32 mg_pll_lf;
207 u32 mg_pll_frac_lock;
208 u32 mg_pll_ssc;
209 u32 mg_pll_bias;
210 u32 mg_pll_tdc_coldst_bias;
211 u32 mg_pll_bias_mask;
212 u32 mg_pll_tdc_coldst_bias_mask;
213 };
214
215
216
217
218
219
220
221
222
223
224
225 struct intel_shared_dpll_state {
226
227
228
229 unsigned crtc_mask;
230
231
232
233
234
235 struct intel_dpll_hw_state hw_state;
236 };
237
238
239
240
241 struct intel_shared_dpll_funcs {
242
243
244
245
246
247
248
249 void (*prepare)(struct drm_i915_private *dev_priv,
250 struct intel_shared_dpll *pll);
251
252
253
254
255
256
257
258 void (*enable)(struct drm_i915_private *dev_priv,
259 struct intel_shared_dpll *pll);
260
261
262
263
264
265
266
267
268 void (*disable)(struct drm_i915_private *dev_priv,
269 struct intel_shared_dpll *pll);
270
271
272
273
274
275
276
277
278 bool (*get_hw_state)(struct drm_i915_private *dev_priv,
279 struct intel_shared_dpll *pll,
280 struct intel_dpll_hw_state *hw_state);
281 };
282
283
284
285
286 struct dpll_info {
287
288
289
290 const char *name;
291
292
293
294
295 const struct intel_shared_dpll_funcs *funcs;
296
297
298
299
300
301 enum intel_dpll_id id;
302
303 #define INTEL_DPLL_ALWAYS_ON (1 << 0)
304
305
306
307
308
309
310
311 u32 flags;
312 };
313
314
315
316
317 struct intel_shared_dpll {
318
319
320
321
322
323
324 struct intel_shared_dpll_state state;
325
326
327
328
329 unsigned active_mask;
330
331
332
333
334 bool on;
335
336
337
338
339 const struct dpll_info *info;
340 intel_wakeref_t wakeref;
341 };
342
343 #define SKL_DPLL0 0
344 #define SKL_DPLL1 1
345 #define SKL_DPLL2 2
346 #define SKL_DPLL3 3
347
348
349 struct intel_shared_dpll *
350 intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
351 enum intel_dpll_id id);
352 enum intel_dpll_id
353 intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
354 struct intel_shared_dpll *pll);
355 void assert_shared_dpll(struct drm_i915_private *dev_priv,
356 struct intel_shared_dpll *pll,
357 bool state);
358 #define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
359 #define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
360 bool intel_reserve_shared_dplls(struct intel_atomic_state *state,
361 struct intel_crtc *crtc,
362 struct intel_encoder *encoder);
363 void intel_release_shared_dplls(struct intel_atomic_state *state,
364 struct intel_crtc *crtc);
365 void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state,
366 enum icl_port_dpll_id port_dpll_id);
367 void intel_update_active_dpll(struct intel_atomic_state *state,
368 struct intel_crtc *crtc,
369 struct intel_encoder *encoder);
370 void intel_prepare_shared_dpll(const struct intel_crtc_state *crtc_state);
371 void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state);
372 void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state);
373 void intel_shared_dpll_swap_state(struct intel_atomic_state *state);
374 void intel_shared_dpll_init(struct drm_device *dev);
375
376 void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
377 const struct intel_dpll_hw_state *hw_state);
378 int cnl_hdmi_pll_ref_clock(struct drm_i915_private *dev_priv);
379 enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port);
380 bool intel_dpll_is_combophy(enum intel_dpll_id id);
381
382 #endif