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#include <linux/cpufreq.h>
28#include <linux/module.h>
29#include <linux/input.h>
30#include <linux/i2c.h>
31#include <linux/kernel.h>
32#include <linux/slab.h>
33#include <linux/vgaarb.h>
34#include <drm/drm_edid.h>
35#include "drmP.h"
36#include "intel_drv.h"
37#include "i915_drm.h"
38#include "i915_drv.h"
39#include "i915_trace.h"
40#include "drm_dp_helper.h"
41#include "drm_crtc_helper.h"
42#include <linux/dma_remapping.h>
43
44#define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))
45
46bool intel_pipe_has_type(struct drm_crtc *crtc, int type);
47static void intel_update_watermarks(struct drm_device *dev);
48static void intel_increase_pllclock(struct drm_crtc *crtc);
49static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on);
50
51typedef struct {
52
53 int n;
54 int m1, m2;
55 int p1, p2;
56
57 int dot;
58 int vco;
59 int m;
60 int p;
61} intel_clock_t;
62
63typedef struct {
64 int min, max;
65} intel_range_t;
66
67typedef struct {
68 int dot_limit;
69 int p2_slow, p2_fast;
70} intel_p2_t;
71
72#define INTEL_P2_NUM 2
73typedef struct intel_limit intel_limit_t;
74struct intel_limit {
75 intel_range_t dot, vco, n, m, m1, m2, p, p1;
76 intel_p2_t p2;
77 bool (* find_pll)(const intel_limit_t *, struct drm_crtc *,
78 int, int, intel_clock_t *);
79};
80
81
82#define IRONLAKE_FDI_FREQ 2700000
83
84static bool
85intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
86 int target, int refclk, intel_clock_t *best_clock);
87static bool
88intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
89 int target, int refclk, intel_clock_t *best_clock);
90
91static bool
92intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc,
93 int target, int refclk, intel_clock_t *best_clock);
94static bool
95intel_find_pll_ironlake_dp(const intel_limit_t *, struct drm_crtc *crtc,
96 int target, int refclk, intel_clock_t *best_clock);
97
98static inline u32
99intel_fdi_link_freq(struct drm_device *dev)
100{
101 if (IS_GEN5(dev)) {
102 struct drm_i915_private *dev_priv = dev->dev_private;
103 return (I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2;
104 } else
105 return 27;
106}
107
108static const intel_limit_t intel_limits_i8xx_dvo = {
109 .dot = { .min = 25000, .max = 350000 },
110 .vco = { .min = 930000, .max = 1400000 },
111 .n = { .min = 3, .max = 16 },
112 .m = { .min = 96, .max = 140 },
113 .m1 = { .min = 18, .max = 26 },
114 .m2 = { .min = 6, .max = 16 },
115 .p = { .min = 4, .max = 128 },
116 .p1 = { .min = 2, .max = 33 },
117 .p2 = { .dot_limit = 165000,
118 .p2_slow = 4, .p2_fast = 2 },
119 .find_pll = intel_find_best_PLL,
120};
121
122static const intel_limit_t intel_limits_i8xx_lvds = {
123 .dot = { .min = 25000, .max = 350000 },
124 .vco = { .min = 930000, .max = 1400000 },
125 .n = { .min = 3, .max = 16 },
126 .m = { .min = 96, .max = 140 },
127 .m1 = { .min = 18, .max = 26 },
128 .m2 = { .min = 6, .max = 16 },
129 .p = { .min = 4, .max = 128 },
130 .p1 = { .min = 1, .max = 6 },
131 .p2 = { .dot_limit = 165000,
132 .p2_slow = 14, .p2_fast = 7 },
133 .find_pll = intel_find_best_PLL,
134};
135
136static const intel_limit_t intel_limits_i9xx_sdvo = {
137 .dot = { .min = 20000, .max = 400000 },
138 .vco = { .min = 1400000, .max = 2800000 },
139 .n = { .min = 1, .max = 6 },
140 .m = { .min = 70, .max = 120 },
141 .m1 = { .min = 10, .max = 22 },
142 .m2 = { .min = 5, .max = 9 },
143 .p = { .min = 5, .max = 80 },
144 .p1 = { .min = 1, .max = 8 },
145 .p2 = { .dot_limit = 200000,
146 .p2_slow = 10, .p2_fast = 5 },
147 .find_pll = intel_find_best_PLL,
148};
149
150static const intel_limit_t intel_limits_i9xx_lvds = {
151 .dot = { .min = 20000, .max = 400000 },
152 .vco = { .min = 1400000, .max = 2800000 },
153 .n = { .min = 1, .max = 6 },
154 .m = { .min = 70, .max = 120 },
155 .m1 = { .min = 10, .max = 22 },
156 .m2 = { .min = 5, .max = 9 },
157 .p = { .min = 7, .max = 98 },
158 .p1 = { .min = 1, .max = 8 },
159 .p2 = { .dot_limit = 112000,
160 .p2_slow = 14, .p2_fast = 7 },
161 .find_pll = intel_find_best_PLL,
162};
163
164
165static const intel_limit_t intel_limits_g4x_sdvo = {
166 .dot = { .min = 25000, .max = 270000 },
167 .vco = { .min = 1750000, .max = 3500000},
168 .n = { .min = 1, .max = 4 },
169 .m = { .min = 104, .max = 138 },
170 .m1 = { .min = 17, .max = 23 },
171 .m2 = { .min = 5, .max = 11 },
172 .p = { .min = 10, .max = 30 },
173 .p1 = { .min = 1, .max = 3},
174 .p2 = { .dot_limit = 270000,
175 .p2_slow = 10,
176 .p2_fast = 10
177 },
178 .find_pll = intel_g4x_find_best_PLL,
179};
180
181static const intel_limit_t intel_limits_g4x_hdmi = {
182 .dot = { .min = 22000, .max = 400000 },
183 .vco = { .min = 1750000, .max = 3500000},
184 .n = { .min = 1, .max = 4 },
185 .m = { .min = 104, .max = 138 },
186 .m1 = { .min = 16, .max = 23 },
187 .m2 = { .min = 5, .max = 11 },
188 .p = { .min = 5, .max = 80 },
189 .p1 = { .min = 1, .max = 8},
190 .p2 = { .dot_limit = 165000,
191 .p2_slow = 10, .p2_fast = 5 },
192 .find_pll = intel_g4x_find_best_PLL,
193};
194
195static const intel_limit_t intel_limits_g4x_single_channel_lvds = {
196 .dot = { .min = 20000, .max = 115000 },
197 .vco = { .min = 1750000, .max = 3500000 },
198 .n = { .min = 1, .max = 3 },
199 .m = { .min = 104, .max = 138 },
200 .m1 = { .min = 17, .max = 23 },
201 .m2 = { .min = 5, .max = 11 },
202 .p = { .min = 28, .max = 112 },
203 .p1 = { .min = 2, .max = 8 },
204 .p2 = { .dot_limit = 0,
205 .p2_slow = 14, .p2_fast = 14
206 },
207 .find_pll = intel_g4x_find_best_PLL,
208};
209
210static const intel_limit_t intel_limits_g4x_dual_channel_lvds = {
211 .dot = { .min = 80000, .max = 224000 },
212 .vco = { .min = 1750000, .max = 3500000 },
213 .n = { .min = 1, .max = 3 },
214 .m = { .min = 104, .max = 138 },
215 .m1 = { .min = 17, .max = 23 },
216 .m2 = { .min = 5, .max = 11 },
217 .p = { .min = 14, .max = 42 },
218 .p1 = { .min = 2, .max = 6 },
219 .p2 = { .dot_limit = 0,
220 .p2_slow = 7, .p2_fast = 7
221 },
222 .find_pll = intel_g4x_find_best_PLL,
223};
224
225static const intel_limit_t intel_limits_g4x_display_port = {
226 .dot = { .min = 161670, .max = 227000 },
227 .vco = { .min = 1750000, .max = 3500000},
228 .n = { .min = 1, .max = 2 },
229 .m = { .min = 97, .max = 108 },
230 .m1 = { .min = 0x10, .max = 0x12 },
231 .m2 = { .min = 0x05, .max = 0x06 },
232 .p = { .min = 10, .max = 20 },
233 .p1 = { .min = 1, .max = 2},
234 .p2 = { .dot_limit = 0,
235 .p2_slow = 10, .p2_fast = 10 },
236 .find_pll = intel_find_pll_g4x_dp,
237};
238
239static const intel_limit_t intel_limits_pineview_sdvo = {
240 .dot = { .min = 20000, .max = 400000},
241 .vco = { .min = 1700000, .max = 3500000 },
242
243 .n = { .min = 3, .max = 6 },
244 .m = { .min = 2, .max = 256 },
245
246 .m1 = { .min = 0, .max = 0 },
247 .m2 = { .min = 0, .max = 254 },
248 .p = { .min = 5, .max = 80 },
249 .p1 = { .min = 1, .max = 8 },
250 .p2 = { .dot_limit = 200000,
251 .p2_slow = 10, .p2_fast = 5 },
252 .find_pll = intel_find_best_PLL,
253};
254
255static const intel_limit_t intel_limits_pineview_lvds = {
256 .dot = { .min = 20000, .max = 400000 },
257 .vco = { .min = 1700000, .max = 3500000 },
258 .n = { .min = 3, .max = 6 },
259 .m = { .min = 2, .max = 256 },
260 .m1 = { .min = 0, .max = 0 },
261 .m2 = { .min = 0, .max = 254 },
262 .p = { .min = 7, .max = 112 },
263 .p1 = { .min = 1, .max = 8 },
264 .p2 = { .dot_limit = 112000,
265 .p2_slow = 14, .p2_fast = 14 },
266 .find_pll = intel_find_best_PLL,
267};
268
269
270
271
272
273
274static const intel_limit_t intel_limits_ironlake_dac = {
275 .dot = { .min = 25000, .max = 350000 },
276 .vco = { .min = 1760000, .max = 3510000 },
277 .n = { .min = 1, .max = 5 },
278 .m = { .min = 79, .max = 127 },
279 .m1 = { .min = 12, .max = 22 },
280 .m2 = { .min = 5, .max = 9 },
281 .p = { .min = 5, .max = 80 },
282 .p1 = { .min = 1, .max = 8 },
283 .p2 = { .dot_limit = 225000,
284 .p2_slow = 10, .p2_fast = 5 },
285 .find_pll = intel_g4x_find_best_PLL,
286};
287
288static const intel_limit_t intel_limits_ironlake_single_lvds = {
289 .dot = { .min = 25000, .max = 350000 },
290 .vco = { .min = 1760000, .max = 3510000 },
291 .n = { .min = 1, .max = 3 },
292 .m = { .min = 79, .max = 118 },
293 .m1 = { .min = 12, .max = 22 },
294 .m2 = { .min = 5, .max = 9 },
295 .p = { .min = 28, .max = 112 },
296 .p1 = { .min = 2, .max = 8 },
297 .p2 = { .dot_limit = 225000,
298 .p2_slow = 14, .p2_fast = 14 },
299 .find_pll = intel_g4x_find_best_PLL,
300};
301
302static const intel_limit_t intel_limits_ironlake_dual_lvds = {
303 .dot = { .min = 25000, .max = 350000 },
304 .vco = { .min = 1760000, .max = 3510000 },
305 .n = { .min = 1, .max = 3 },
306 .m = { .min = 79, .max = 127 },
307 .m1 = { .min = 12, .max = 22 },
308 .m2 = { .min = 5, .max = 9 },
309 .p = { .min = 14, .max = 56 },
310 .p1 = { .min = 2, .max = 8 },
311 .p2 = { .dot_limit = 225000,
312 .p2_slow = 7, .p2_fast = 7 },
313 .find_pll = intel_g4x_find_best_PLL,
314};
315
316
317static const intel_limit_t intel_limits_ironlake_single_lvds_100m = {
318 .dot = { .min = 25000, .max = 350000 },
319 .vco = { .min = 1760000, .max = 3510000 },
320 .n = { .min = 1, .max = 2 },
321 .m = { .min = 79, .max = 126 },
322 .m1 = { .min = 12, .max = 22 },
323 .m2 = { .min = 5, .max = 9 },
324 .p = { .min = 28, .max = 112 },
325 .p1 = { .min = 2, .max = 8 },
326 .p2 = { .dot_limit = 225000,
327 .p2_slow = 14, .p2_fast = 14 },
328 .find_pll = intel_g4x_find_best_PLL,
329};
330
331static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = {
332 .dot = { .min = 25000, .max = 350000 },
333 .vco = { .min = 1760000, .max = 3510000 },
334 .n = { .min = 1, .max = 3 },
335 .m = { .min = 79, .max = 126 },
336 .m1 = { .min = 12, .max = 22 },
337 .m2 = { .min = 5, .max = 9 },
338 .p = { .min = 14, .max = 42 },
339 .p1 = { .min = 2, .max = 6 },
340 .p2 = { .dot_limit = 225000,
341 .p2_slow = 7, .p2_fast = 7 },
342 .find_pll = intel_g4x_find_best_PLL,
343};
344
345static const intel_limit_t intel_limits_ironlake_display_port = {
346 .dot = { .min = 25000, .max = 350000 },
347 .vco = { .min = 1760000, .max = 3510000},
348 .n = { .min = 1, .max = 2 },
349 .m = { .min = 81, .max = 90 },
350 .m1 = { .min = 12, .max = 22 },
351 .m2 = { .min = 5, .max = 9 },
352 .p = { .min = 10, .max = 20 },
353 .p1 = { .min = 1, .max = 2},
354 .p2 = { .dot_limit = 0,
355 .p2_slow = 10, .p2_fast = 10 },
356 .find_pll = intel_find_pll_ironlake_dp,
357};
358
359static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc,
360 int refclk)
361{
362 struct drm_device *dev = crtc->dev;
363 struct drm_i915_private *dev_priv = dev->dev_private;
364 const intel_limit_t *limit;
365
366 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
367 if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) ==
368 LVDS_CLKB_POWER_UP) {
369
370 if (refclk == 100000)
371 limit = &intel_limits_ironlake_dual_lvds_100m;
372 else
373 limit = &intel_limits_ironlake_dual_lvds;
374 } else {
375 if (refclk == 100000)
376 limit = &intel_limits_ironlake_single_lvds_100m;
377 else
378 limit = &intel_limits_ironlake_single_lvds;
379 }
380 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) ||
381 HAS_eDP)
382 limit = &intel_limits_ironlake_display_port;
383 else
384 limit = &intel_limits_ironlake_dac;
385
386 return limit;
387}
388
389static const intel_limit_t *intel_g4x_limit(struct drm_crtc *crtc)
390{
391 struct drm_device *dev = crtc->dev;
392 struct drm_i915_private *dev_priv = dev->dev_private;
393 const intel_limit_t *limit;
394
395 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
396 if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) ==
397 LVDS_CLKB_POWER_UP)
398
399 limit = &intel_limits_g4x_dual_channel_lvds;
400 else
401
402 limit = &intel_limits_g4x_single_channel_lvds;
403 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_HDMI) ||
404 intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG)) {
405 limit = &intel_limits_g4x_hdmi;
406 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_SDVO)) {
407 limit = &intel_limits_g4x_sdvo;
408 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
409 limit = &intel_limits_g4x_display_port;
410 } else
411 limit = &intel_limits_i9xx_sdvo;
412
413 return limit;
414}
415
416static const intel_limit_t *intel_limit(struct drm_crtc *crtc, int refclk)
417{
418 struct drm_device *dev = crtc->dev;
419 const intel_limit_t *limit;
420
421 if (HAS_PCH_SPLIT(dev))
422 limit = intel_ironlake_limit(crtc, refclk);
423 else if (IS_G4X(dev)) {
424 limit = intel_g4x_limit(crtc);
425 } else if (IS_PINEVIEW(dev)) {
426 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
427 limit = &intel_limits_pineview_lvds;
428 else
429 limit = &intel_limits_pineview_sdvo;
430 } else if (!IS_GEN2(dev)) {
431 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
432 limit = &intel_limits_i9xx_lvds;
433 else
434 limit = &intel_limits_i9xx_sdvo;
435 } else {
436 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
437 limit = &intel_limits_i8xx_lvds;
438 else
439 limit = &intel_limits_i8xx_dvo;
440 }
441 return limit;
442}
443
444
445static void pineview_clock(int refclk, intel_clock_t *clock)
446{
447 clock->m = clock->m2 + 2;
448 clock->p = clock->p1 * clock->p2;
449 clock->vco = refclk * clock->m / clock->n;
450 clock->dot = clock->vco / clock->p;
451}
452
453static void intel_clock(struct drm_device *dev, int refclk, intel_clock_t *clock)
454{
455 if (IS_PINEVIEW(dev)) {
456 pineview_clock(refclk, clock);
457 return;
458 }
459 clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2);
460 clock->p = clock->p1 * clock->p2;
461 clock->vco = refclk * clock->m / (clock->n + 2);
462 clock->dot = clock->vco / clock->p;
463}
464
465
466
467
468bool intel_pipe_has_type(struct drm_crtc *crtc, int type)
469{
470 struct drm_device *dev = crtc->dev;
471 struct drm_mode_config *mode_config = &dev->mode_config;
472 struct intel_encoder *encoder;
473
474 list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
475 if (encoder->base.crtc == crtc && encoder->type == type)
476 return true;
477
478 return false;
479}
480
481#define INTELPllInvalid(s) do { return false; } while (0)
482
483
484
485
486
487static bool intel_PLL_is_valid(struct drm_device *dev,
488 const intel_limit_t *limit,
489 const intel_clock_t *clock)
490{
491 if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1)
492 INTELPllInvalid("p1 out of range\n");
493 if (clock->p < limit->p.min || limit->p.max < clock->p)
494 INTELPllInvalid("p out of range\n");
495 if (clock->m2 < limit->m2.min || limit->m2.max < clock->m2)
496 INTELPllInvalid("m2 out of range\n");
497 if (clock->m1 < limit->m1.min || limit->m1.max < clock->m1)
498 INTELPllInvalid("m1 out of range\n");
499 if (clock->m1 <= clock->m2 && !IS_PINEVIEW(dev))
500 INTELPllInvalid("m1 <= m2\n");
501 if (clock->m < limit->m.min || limit->m.max < clock->m)
502 INTELPllInvalid("m out of range\n");
503 if (clock->n < limit->n.min || limit->n.max < clock->n)
504 INTELPllInvalid("n out of range\n");
505 if (clock->vco < limit->vco.min || limit->vco.max < clock->vco)
506 INTELPllInvalid("vco out of range\n");
507
508
509
510 if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
511 INTELPllInvalid("dot out of range\n");
512
513 return true;
514}
515
516static bool
517intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
518 int target, int refclk, intel_clock_t *best_clock)
519
520{
521 struct drm_device *dev = crtc->dev;
522 struct drm_i915_private *dev_priv = dev->dev_private;
523 intel_clock_t clock;
524 int err = target;
525
526 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
527 (I915_READ(LVDS)) != 0) {
528
529
530
531
532
533
534 if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) ==
535 LVDS_CLKB_POWER_UP)
536 clock.p2 = limit->p2.p2_fast;
537 else
538 clock.p2 = limit->p2.p2_slow;
539 } else {
540 if (target < limit->p2.dot_limit)
541 clock.p2 = limit->p2.p2_slow;
542 else
543 clock.p2 = limit->p2.p2_fast;
544 }
545
546 memset(best_clock, 0, sizeof(*best_clock));
547
548 for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max;
549 clock.m1++) {
550 for (clock.m2 = limit->m2.min;
551 clock.m2 <= limit->m2.max; clock.m2++) {
552
553 if (clock.m2 >= clock.m1 && !IS_PINEVIEW(dev))
554 break;
555 for (clock.n = limit->n.min;
556 clock.n <= limit->n.max; clock.n++) {
557 for (clock.p1 = limit->p1.min;
558 clock.p1 <= limit->p1.max; clock.p1++) {
559 int this_err;
560
561 intel_clock(dev, refclk, &clock);
562 if (!intel_PLL_is_valid(dev, limit,
563 &clock))
564 continue;
565
566 this_err = abs(clock.dot - target);
567 if (this_err < err) {
568 *best_clock = clock;
569 err = this_err;
570 }
571 }
572 }
573 }
574 }
575
576 return (err != target);
577}
578
579static bool
580intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
581 int target, int refclk, intel_clock_t *best_clock)
582{
583 struct drm_device *dev = crtc->dev;
584 struct drm_i915_private *dev_priv = dev->dev_private;
585 intel_clock_t clock;
586 int max_n;
587 bool found;
588
589 int err_most = (target >> 8) + (target >> 9);
590 found = false;
591
592 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
593 int lvds_reg;
594
595 if (HAS_PCH_SPLIT(dev))
596 lvds_reg = PCH_LVDS;
597 else
598 lvds_reg = LVDS;
599 if ((I915_READ(lvds_reg) & LVDS_CLKB_POWER_MASK) ==
600 LVDS_CLKB_POWER_UP)
601 clock.p2 = limit->p2.p2_fast;
602 else
603 clock.p2 = limit->p2.p2_slow;
604 } else {
605 if (target < limit->p2.dot_limit)
606 clock.p2 = limit->p2.p2_slow;
607 else
608 clock.p2 = limit->p2.p2_fast;
609 }
610
611 memset(best_clock, 0, sizeof(*best_clock));
612 max_n = limit->n.max;
613
614 for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) {
615
616 for (clock.m1 = limit->m1.max;
617 clock.m1 >= limit->m1.min; clock.m1--) {
618 for (clock.m2 = limit->m2.max;
619 clock.m2 >= limit->m2.min; clock.m2--) {
620 for (clock.p1 = limit->p1.max;
621 clock.p1 >= limit->p1.min; clock.p1--) {
622 int this_err;
623
624 intel_clock(dev, refclk, &clock);
625 if (!intel_PLL_is_valid(dev, limit,
626 &clock))
627 continue;
628
629 this_err = abs(clock.dot - target);
630 if (this_err < err_most) {
631 *best_clock = clock;
632 err_most = this_err;
633 max_n = clock.n;
634 found = true;
635 }
636 }
637 }
638 }
639 }
640 return found;
641}
642
643static bool
644intel_find_pll_ironlake_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
645 int target, int refclk, intel_clock_t *best_clock)
646{
647 struct drm_device *dev = crtc->dev;
648 intel_clock_t clock;
649
650 if (target < 200000) {
651 clock.n = 1;
652 clock.p1 = 2;
653 clock.p2 = 10;
654 clock.m1 = 12;
655 clock.m2 = 9;
656 } else {
657 clock.n = 2;
658 clock.p1 = 1;
659 clock.p2 = 10;
660 clock.m1 = 14;
661 clock.m2 = 8;
662 }
663 intel_clock(dev, refclk, &clock);
664 memcpy(best_clock, &clock, sizeof(intel_clock_t));
665 return true;
666}
667
668
669static bool
670intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
671 int target, int refclk, intel_clock_t *best_clock)
672{
673 intel_clock_t clock;
674 if (target < 200000) {
675 clock.p1 = 2;
676 clock.p2 = 10;
677 clock.n = 2;
678 clock.m1 = 23;
679 clock.m2 = 8;
680 } else {
681 clock.p1 = 1;
682 clock.p2 = 10;
683 clock.n = 1;
684 clock.m1 = 14;
685 clock.m2 = 2;
686 }
687 clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2);
688 clock.p = (clock.p1 * clock.p2);
689 clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p;
690 clock.vco = 0;
691 memcpy(best_clock, &clock, sizeof(intel_clock_t));
692 return true;
693}
694
695
696
697
698
699
700
701
702
703void intel_wait_for_vblank(struct drm_device *dev, int pipe)
704{
705 struct drm_i915_private *dev_priv = dev->dev_private;
706 int pipestat_reg = PIPESTAT(pipe);
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721 I915_WRITE(pipestat_reg,
722 I915_READ(pipestat_reg) | PIPE_VBLANK_INTERRUPT_STATUS);
723
724
725 if (wait_for(I915_READ(pipestat_reg) &
726 PIPE_VBLANK_INTERRUPT_STATUS,
727 50))
728 DRM_DEBUG_KMS("vblank wait timed out\n");
729}
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748void intel_wait_for_pipe_off(struct drm_device *dev, int pipe)
749{
750 struct drm_i915_private *dev_priv = dev->dev_private;
751
752 if (INTEL_INFO(dev)->gen >= 4) {
753 int reg = PIPECONF(pipe);
754
755
756 if (wait_for((I915_READ(reg) & I965_PIPECONF_ACTIVE) == 0,
757 100))
758 DRM_DEBUG_KMS("pipe_off wait timed out\n");
759 } else {
760 u32 last_line;
761 int reg = PIPEDSL(pipe);
762 unsigned long timeout = jiffies + msecs_to_jiffies(100);
763
764
765 do {
766 last_line = I915_READ(reg) & DSL_LINEMASK;
767 mdelay(5);
768 } while (((I915_READ(reg) & DSL_LINEMASK) != last_line) &&
769 time_after(timeout, jiffies));
770 if (time_after(jiffies, timeout))
771 DRM_DEBUG_KMS("pipe_off wait timed out\n");
772 }
773}
774
775static const char *state_string(bool enabled)
776{
777 return enabled ? "on" : "off";
778}
779
780
781static void assert_pll(struct drm_i915_private *dev_priv,
782 enum pipe pipe, bool state)
783{
784 int reg;
785 u32 val;
786 bool cur_state;
787
788 reg = DPLL(pipe);
789 val = I915_READ(reg);
790 cur_state = !!(val & DPLL_VCO_ENABLE);
791 WARN(cur_state != state,
792 "PLL state assertion failure (expected %s, current %s)\n",
793 state_string(state), state_string(cur_state));
794}
795#define assert_pll_enabled(d, p) assert_pll(d, p, true)
796#define assert_pll_disabled(d, p) assert_pll(d, p, false)
797
798
799static void assert_pch_pll(struct drm_i915_private *dev_priv,
800 enum pipe pipe, bool state)
801{
802 int reg;
803 u32 val;
804 bool cur_state;
805
806 if (HAS_PCH_CPT(dev_priv->dev)) {
807 u32 pch_dpll;
808
809 pch_dpll = I915_READ(PCH_DPLL_SEL);
810
811
812 WARN(!((pch_dpll >> (4 * pipe)) & 8),
813 "transcoder %d PLL not enabled\n", pipe);
814
815
816 pipe = (pch_dpll >> (4 * pipe)) & 1;
817 }
818
819 reg = PCH_DPLL(pipe);
820 val = I915_READ(reg);
821 cur_state = !!(val & DPLL_VCO_ENABLE);
822 WARN(cur_state != state,
823 "PCH PLL state assertion failure (expected %s, current %s)\n",
824 state_string(state), state_string(cur_state));
825}
826#define assert_pch_pll_enabled(d, p) assert_pch_pll(d, p, true)
827#define assert_pch_pll_disabled(d, p) assert_pch_pll(d, p, false)
828
829static void assert_fdi_tx(struct drm_i915_private *dev_priv,
830 enum pipe pipe, bool state)
831{
832 int reg;
833 u32 val;
834 bool cur_state;
835
836 reg = FDI_TX_CTL(pipe);
837 val = I915_READ(reg);
838 cur_state = !!(val & FDI_TX_ENABLE);
839 WARN(cur_state != state,
840 "FDI TX state assertion failure (expected %s, current %s)\n",
841 state_string(state), state_string(cur_state));
842}
843#define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true)
844#define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false)
845
846static void assert_fdi_rx(struct drm_i915_private *dev_priv,
847 enum pipe pipe, bool state)
848{
849 int reg;
850 u32 val;
851 bool cur_state;
852
853 reg = FDI_RX_CTL(pipe);
854 val = I915_READ(reg);
855 cur_state = !!(val & FDI_RX_ENABLE);
856 WARN(cur_state != state,
857 "FDI RX state assertion failure (expected %s, current %s)\n",
858 state_string(state), state_string(cur_state));
859}
860#define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true)
861#define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false)
862
863static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
864 enum pipe pipe)
865{
866 int reg;
867 u32 val;
868
869
870 if (dev_priv->info->gen == 5)
871 return;
872
873 reg = FDI_TX_CTL(pipe);
874 val = I915_READ(reg);
875 WARN(!(val & FDI_TX_PLL_ENABLE), "FDI TX PLL assertion failure, should be active but is disabled\n");
876}
877
878static void assert_fdi_rx_pll_enabled(struct drm_i915_private *dev_priv,
879 enum pipe pipe)
880{
881 int reg;
882 u32 val;
883
884 reg = FDI_RX_CTL(pipe);
885 val = I915_READ(reg);
886 WARN(!(val & FDI_RX_PLL_ENABLE), "FDI RX PLL assertion failure, should be active but is disabled\n");
887}
888
889static void assert_panel_unlocked(struct drm_i915_private *dev_priv,
890 enum pipe pipe)
891{
892 int pp_reg, lvds_reg;
893 u32 val;
894 enum pipe panel_pipe = PIPE_A;
895 bool locked = true;
896
897 if (HAS_PCH_SPLIT(dev_priv->dev)) {
898 pp_reg = PCH_PP_CONTROL;
899 lvds_reg = PCH_LVDS;
900 } else {
901 pp_reg = PP_CONTROL;
902 lvds_reg = LVDS;
903 }
904
905 val = I915_READ(pp_reg);
906 if (!(val & PANEL_POWER_ON) ||
907 ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS))
908 locked = false;
909
910 if (I915_READ(lvds_reg) & LVDS_PIPEB_SELECT)
911 panel_pipe = PIPE_B;
912
913 WARN(panel_pipe == pipe && locked,
914 "panel assertion failure, pipe %c regs locked\n",
915 pipe_name(pipe));
916}
917
918static void assert_pipe(struct drm_i915_private *dev_priv,
919 enum pipe pipe, bool state)
920{
921 int reg;
922 u32 val;
923 bool cur_state;
924
925 reg = PIPECONF(pipe);
926 val = I915_READ(reg);
927 cur_state = !!(val & PIPECONF_ENABLE);
928 WARN(cur_state != state,
929 "pipe %c assertion failure (expected %s, current %s)\n",
930 pipe_name(pipe), state_string(state), state_string(cur_state));
931}
932#define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
933#define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
934
935static void assert_plane_enabled(struct drm_i915_private *dev_priv,
936 enum plane plane)
937{
938 int reg;
939 u32 val;
940
941 reg = DSPCNTR(plane);
942 val = I915_READ(reg);
943 WARN(!(val & DISPLAY_PLANE_ENABLE),
944 "plane %c assertion failure, should be active but is disabled\n",
945 plane_name(plane));
946}
947
948static void assert_planes_disabled(struct drm_i915_private *dev_priv,
949 enum pipe pipe)
950{
951 int reg, i;
952 u32 val;
953 int cur_pipe;
954
955
956 if (HAS_PCH_SPLIT(dev_priv->dev))
957 return;
958
959
960 for (i = 0; i < 2; i++) {
961 reg = DSPCNTR(i);
962 val = I915_READ(reg);
963 cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
964 DISPPLANE_SEL_PIPE_SHIFT;
965 WARN((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe,
966 "plane %c assertion failure, should be off on pipe %c but is still active\n",
967 plane_name(i), pipe_name(pipe));
968 }
969}
970
971static void assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
972{
973 u32 val;
974 bool enabled;
975
976 val = I915_READ(PCH_DREF_CONTROL);
977 enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
978 DREF_SUPERSPREAD_SOURCE_MASK));
979 WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
980}
981
982static void assert_transcoder_disabled(struct drm_i915_private *dev_priv,
983 enum pipe pipe)
984{
985 int reg;
986 u32 val;
987 bool enabled;
988
989 reg = TRANSCONF(pipe);
990 val = I915_READ(reg);
991 enabled = !!(val & TRANS_ENABLE);
992 WARN(enabled,
993 "transcoder assertion failed, should be off on pipe %c but is still active\n",
994 pipe_name(pipe));
995}
996
997static bool dp_pipe_enabled(struct drm_i915_private *dev_priv,
998 enum pipe pipe, u32 port_sel, u32 val)
999{
1000 if ((val & DP_PORT_EN) == 0)
1001 return false;
1002
1003 if (HAS_PCH_CPT(dev_priv->dev)) {
1004 u32 trans_dp_ctl_reg = TRANS_DP_CTL(pipe);
1005 u32 trans_dp_ctl = I915_READ(trans_dp_ctl_reg);
1006 if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel)
1007 return false;
1008 } else {
1009 if ((val & DP_PIPE_MASK) != (pipe << 30))
1010 return false;
1011 }
1012 return true;
1013}
1014
1015static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv,
1016 enum pipe pipe, u32 val)
1017{
1018 if ((val & PORT_ENABLE) == 0)
1019 return false;
1020
1021 if (HAS_PCH_CPT(dev_priv->dev)) {
1022 if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
1023 return false;
1024 } else {
1025 if ((val & TRANSCODER_MASK) != TRANSCODER(pipe))
1026 return false;
1027 }
1028 return true;
1029}
1030
1031static bool lvds_pipe_enabled(struct drm_i915_private *dev_priv,
1032 enum pipe pipe, u32 val)
1033{
1034 if ((val & LVDS_PORT_EN) == 0)
1035 return false;
1036
1037 if (HAS_PCH_CPT(dev_priv->dev)) {
1038 if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
1039 return false;
1040 } else {
1041 if ((val & LVDS_PIPE_MASK) != LVDS_PIPE(pipe))
1042 return false;
1043 }
1044 return true;
1045}
1046
1047static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv,
1048 enum pipe pipe, u32 val)
1049{
1050 if ((val & ADPA_DAC_ENABLE) == 0)
1051 return false;
1052 if (HAS_PCH_CPT(dev_priv->dev)) {
1053 if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
1054 return false;
1055 } else {
1056 if ((val & ADPA_PIPE_SELECT_MASK) != ADPA_PIPE_SELECT(pipe))
1057 return false;
1058 }
1059 return true;
1060}
1061
1062static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
1063 enum pipe pipe, int reg, u32 port_sel)
1064{
1065 u32 val = I915_READ(reg);
1066 WARN(dp_pipe_enabled(dev_priv, pipe, port_sel, val),
1067 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
1068 reg, pipe_name(pipe));
1069}
1070
1071static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
1072 enum pipe pipe, int reg)
1073{
1074 u32 val = I915_READ(reg);
1075 WARN(hdmi_pipe_enabled(dev_priv, val, pipe),
1076 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
1077 reg, pipe_name(pipe));
1078}
1079
1080static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
1081 enum pipe pipe)
1082{
1083 int reg;
1084 u32 val;
1085
1086 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B);
1087 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C);
1088 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D);
1089
1090 reg = PCH_ADPA;
1091 val = I915_READ(reg);
1092 WARN(adpa_pipe_enabled(dev_priv, val, pipe),
1093 "PCH VGA enabled on transcoder %c, should be disabled\n",
1094 pipe_name(pipe));
1095
1096 reg = PCH_LVDS;
1097 val = I915_READ(reg);
1098 WARN(lvds_pipe_enabled(dev_priv, val, pipe),
1099 "PCH LVDS enabled on transcoder %c, should be disabled\n",
1100 pipe_name(pipe));
1101
1102 assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB);
1103 assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC);
1104 assert_pch_hdmi_disabled(dev_priv, pipe, HDMID);
1105}
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118static void intel_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1119{
1120 int reg;
1121 u32 val;
1122
1123
1124 BUG_ON(dev_priv->info->gen >= 5);
1125
1126
1127 if (IS_MOBILE(dev_priv->dev) && !IS_I830(dev_priv->dev))
1128 assert_panel_unlocked(dev_priv, pipe);
1129
1130 reg = DPLL(pipe);
1131 val = I915_READ(reg);
1132 val |= DPLL_VCO_ENABLE;
1133
1134
1135 I915_WRITE(reg, val);
1136 POSTING_READ(reg);
1137 udelay(150);
1138 I915_WRITE(reg, val);
1139 POSTING_READ(reg);
1140 udelay(150);
1141 I915_WRITE(reg, val);
1142 POSTING_READ(reg);
1143 udelay(150);
1144}
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155static void intel_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1156{
1157 int reg;
1158 u32 val;
1159
1160
1161 if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE))
1162 return;
1163
1164
1165 assert_pipe_disabled(dev_priv, pipe);
1166
1167 reg = DPLL(pipe);
1168 val = I915_READ(reg);
1169 val &= ~DPLL_VCO_ENABLE;
1170 I915_WRITE(reg, val);
1171 POSTING_READ(reg);
1172}
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182static void intel_enable_pch_pll(struct drm_i915_private *dev_priv,
1183 enum pipe pipe)
1184{
1185 int reg;
1186 u32 val;
1187
1188 if (pipe > 1)
1189 return;
1190
1191
1192 BUG_ON(dev_priv->info->gen < 5);
1193
1194
1195 assert_pch_refclk_enabled(dev_priv);
1196
1197 reg = PCH_DPLL(pipe);
1198 val = I915_READ(reg);
1199 val |= DPLL_VCO_ENABLE;
1200 I915_WRITE(reg, val);
1201 POSTING_READ(reg);
1202 udelay(200);
1203}
1204
1205static void intel_disable_pch_pll(struct drm_i915_private *dev_priv,
1206 enum pipe pipe)
1207{
1208 int reg;
1209 u32 val;
1210
1211 if (pipe > 1)
1212 return;
1213
1214
1215 BUG_ON(dev_priv->info->gen < 5);
1216
1217
1218 assert_transcoder_disabled(dev_priv, pipe);
1219
1220 reg = PCH_DPLL(pipe);
1221 val = I915_READ(reg);
1222 val &= ~DPLL_VCO_ENABLE;
1223 I915_WRITE(reg, val);
1224 POSTING_READ(reg);
1225 udelay(200);
1226}
1227
1228static void intel_enable_transcoder(struct drm_i915_private *dev_priv,
1229 enum pipe pipe)
1230{
1231 int reg;
1232 u32 val;
1233
1234
1235 BUG_ON(dev_priv->info->gen < 5);
1236
1237
1238 assert_pch_pll_enabled(dev_priv, pipe);
1239
1240
1241 assert_fdi_tx_enabled(dev_priv, pipe);
1242 assert_fdi_rx_enabled(dev_priv, pipe);
1243
1244 reg = TRANSCONF(pipe);
1245 val = I915_READ(reg);
1246
1247 if (HAS_PCH_IBX(dev_priv->dev)) {
1248
1249
1250
1251
1252 val &= ~PIPE_BPC_MASK;
1253 val |= I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK;
1254 }
1255 I915_WRITE(reg, val | TRANS_ENABLE);
1256 if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100))
1257 DRM_ERROR("failed to enable transcoder %d\n", pipe);
1258}
1259
1260static void intel_disable_transcoder(struct drm_i915_private *dev_priv,
1261 enum pipe pipe)
1262{
1263 int reg;
1264 u32 val;
1265
1266
1267 assert_fdi_tx_disabled(dev_priv, pipe);
1268 assert_fdi_rx_disabled(dev_priv, pipe);
1269
1270
1271 assert_pch_ports_disabled(dev_priv, pipe);
1272
1273 reg = TRANSCONF(pipe);
1274 val = I915_READ(reg);
1275 val &= ~TRANS_ENABLE;
1276 I915_WRITE(reg, val);
1277
1278 if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50))
1279 DRM_ERROR("failed to disable transcoder %d\n", pipe);
1280}
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296static void intel_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe,
1297 bool pch_port)
1298{
1299 int reg;
1300 u32 val;
1301
1302
1303
1304
1305
1306
1307 if (!HAS_PCH_SPLIT(dev_priv->dev))
1308 assert_pll_enabled(dev_priv, pipe);
1309 else {
1310 if (pch_port) {
1311
1312 assert_fdi_rx_pll_enabled(dev_priv, pipe);
1313 assert_fdi_tx_pll_enabled(dev_priv, pipe);
1314 }
1315
1316 }
1317
1318 reg = PIPECONF(pipe);
1319 val = I915_READ(reg);
1320 if (val & PIPECONF_ENABLE)
1321 return;
1322
1323 I915_WRITE(reg, val | PIPECONF_ENABLE);
1324 intel_wait_for_vblank(dev_priv->dev, pipe);
1325}
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339static void intel_disable_pipe(struct drm_i915_private *dev_priv,
1340 enum pipe pipe)
1341{
1342 int reg;
1343 u32 val;
1344
1345
1346
1347
1348
1349 assert_planes_disabled(dev_priv, pipe);
1350
1351
1352 if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE))
1353 return;
1354
1355 reg = PIPECONF(pipe);
1356 val = I915_READ(reg);
1357 if ((val & PIPECONF_ENABLE) == 0)
1358 return;
1359
1360 I915_WRITE(reg, val & ~PIPECONF_ENABLE);
1361 intel_wait_for_pipe_off(dev_priv->dev, pipe);
1362}
1363
1364
1365
1366
1367
1368static void intel_flush_display_plane(struct drm_i915_private *dev_priv,
1369 enum plane plane)
1370{
1371 I915_WRITE(DSPADDR(plane), I915_READ(DSPADDR(plane)));
1372 I915_WRITE(DSPSURF(plane), I915_READ(DSPSURF(plane)));
1373}
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383static void intel_enable_plane(struct drm_i915_private *dev_priv,
1384 enum plane plane, enum pipe pipe)
1385{
1386 int reg;
1387 u32 val;
1388
1389
1390 assert_pipe_enabled(dev_priv, pipe);
1391
1392 reg = DSPCNTR(plane);
1393 val = I915_READ(reg);
1394 if (val & DISPLAY_PLANE_ENABLE)
1395 return;
1396
1397 I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
1398 intel_flush_display_plane(dev_priv, plane);
1399 intel_wait_for_vblank(dev_priv->dev, pipe);
1400}
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410static void intel_disable_plane(struct drm_i915_private *dev_priv,
1411 enum plane plane, enum pipe pipe)
1412{
1413 int reg;
1414 u32 val;
1415
1416 reg = DSPCNTR(plane);
1417 val = I915_READ(reg);
1418 if ((val & DISPLAY_PLANE_ENABLE) == 0)
1419 return;
1420
1421 I915_WRITE(reg, val & ~DISPLAY_PLANE_ENABLE);
1422 intel_flush_display_plane(dev_priv, plane);
1423 intel_wait_for_vblank(dev_priv->dev, pipe);
1424}
1425
1426static void disable_pch_dp(struct drm_i915_private *dev_priv,
1427 enum pipe pipe, int reg, u32 port_sel)
1428{
1429 u32 val = I915_READ(reg);
1430 if (dp_pipe_enabled(dev_priv, pipe, port_sel, val)) {
1431 DRM_DEBUG_KMS("Disabling pch dp %x on pipe %d\n", reg, pipe);
1432 I915_WRITE(reg, val & ~DP_PORT_EN);
1433 }
1434}
1435
1436static void disable_pch_hdmi(struct drm_i915_private *dev_priv,
1437 enum pipe pipe, int reg)
1438{
1439 u32 val = I915_READ(reg);
1440 if (hdmi_pipe_enabled(dev_priv, val, pipe)) {
1441 DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n",
1442 reg, pipe);
1443 I915_WRITE(reg, val & ~PORT_ENABLE);
1444 }
1445}
1446
1447
1448static void intel_disable_pch_ports(struct drm_i915_private *dev_priv,
1449 enum pipe pipe)
1450{
1451 u32 reg, val;
1452
1453 val = I915_READ(PCH_PP_CONTROL);
1454 I915_WRITE(PCH_PP_CONTROL, val | PANEL_UNLOCK_REGS);
1455
1456 disable_pch_dp(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B);
1457 disable_pch_dp(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C);
1458 disable_pch_dp(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D);
1459
1460 reg = PCH_ADPA;
1461 val = I915_READ(reg);
1462 if (adpa_pipe_enabled(dev_priv, val, pipe))
1463 I915_WRITE(reg, val & ~ADPA_DAC_ENABLE);
1464
1465 reg = PCH_LVDS;
1466 val = I915_READ(reg);
1467 if (lvds_pipe_enabled(dev_priv, val, pipe)) {
1468 DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val);
1469 I915_WRITE(reg, val & ~LVDS_PORT_EN);
1470 POSTING_READ(reg);
1471 udelay(100);
1472 }
1473
1474 disable_pch_hdmi(dev_priv, pipe, HDMIB);
1475 disable_pch_hdmi(dev_priv, pipe, HDMIC);
1476 disable_pch_hdmi(dev_priv, pipe, HDMID);
1477}
1478
1479static void i8xx_disable_fbc(struct drm_device *dev)
1480{
1481 struct drm_i915_private *dev_priv = dev->dev_private;
1482 u32 fbc_ctl;
1483
1484
1485 fbc_ctl = I915_READ(FBC_CONTROL);
1486 if ((fbc_ctl & FBC_CTL_EN) == 0)
1487 return;
1488
1489 fbc_ctl &= ~FBC_CTL_EN;
1490 I915_WRITE(FBC_CONTROL, fbc_ctl);
1491
1492
1493 if (wait_for((I915_READ(FBC_STATUS) & FBC_STAT_COMPRESSING) == 0, 10)) {
1494 DRM_DEBUG_KMS("FBC idle timed out\n");
1495 return;
1496 }
1497
1498 DRM_DEBUG_KMS("disabled FBC\n");
1499}
1500
1501static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1502{
1503 struct drm_device *dev = crtc->dev;
1504 struct drm_i915_private *dev_priv = dev->dev_private;
1505 struct drm_framebuffer *fb = crtc->fb;
1506 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1507 struct drm_i915_gem_object *obj = intel_fb->obj;
1508 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1509 int cfb_pitch;
1510 int plane, i;
1511 u32 fbc_ctl, fbc_ctl2;
1512
1513 cfb_pitch = dev_priv->cfb_size / FBC_LL_SIZE;
1514 if (fb->pitch < cfb_pitch)
1515 cfb_pitch = fb->pitch;
1516
1517
1518 cfb_pitch = (cfb_pitch / 64) - 1;
1519 plane = intel_crtc->plane == 0 ? FBC_CTL_PLANEA : FBC_CTL_PLANEB;
1520
1521
1522 for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++)
1523 I915_WRITE(FBC_TAG + (i * 4), 0);
1524
1525
1526 fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | FBC_CTL_CPU_FENCE;
1527 fbc_ctl2 |= plane;
1528 I915_WRITE(FBC_CONTROL2, fbc_ctl2);
1529 I915_WRITE(FBC_FENCE_OFF, crtc->y);
1530
1531
1532 fbc_ctl = FBC_CTL_EN | FBC_CTL_PERIODIC;
1533 if (IS_I945GM(dev))
1534 fbc_ctl |= FBC_CTL_C3_IDLE;
1535 fbc_ctl |= (cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT;
1536 fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT;
1537 fbc_ctl |= obj->fence_reg;
1538 I915_WRITE(FBC_CONTROL, fbc_ctl);
1539
1540 DRM_DEBUG_KMS("enabled FBC, pitch %d, yoff %d, plane %d, ",
1541 cfb_pitch, crtc->y, intel_crtc->plane);
1542}
1543
1544static bool i8xx_fbc_enabled(struct drm_device *dev)
1545{
1546 struct drm_i915_private *dev_priv = dev->dev_private;
1547
1548 return I915_READ(FBC_CONTROL) & FBC_CTL_EN;
1549}
1550
1551static void g4x_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1552{
1553 struct drm_device *dev = crtc->dev;
1554 struct drm_i915_private *dev_priv = dev->dev_private;
1555 struct drm_framebuffer *fb = crtc->fb;
1556 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1557 struct drm_i915_gem_object *obj = intel_fb->obj;
1558 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1559 int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB;
1560 unsigned long stall_watermark = 200;
1561 u32 dpfc_ctl;
1562
1563 dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X;
1564 dpfc_ctl |= DPFC_CTL_FENCE_EN | obj->fence_reg;
1565 I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY);
1566
1567 I915_WRITE(DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN |
1568 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) |
1569 (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT));
1570 I915_WRITE(DPFC_FENCE_YOFF, crtc->y);
1571
1572
1573 I915_WRITE(DPFC_CONTROL, I915_READ(DPFC_CONTROL) | DPFC_CTL_EN);
1574
1575 DRM_DEBUG_KMS("enabled fbc on plane %d\n", intel_crtc->plane);
1576}
1577
1578static void g4x_disable_fbc(struct drm_device *dev)
1579{
1580 struct drm_i915_private *dev_priv = dev->dev_private;
1581 u32 dpfc_ctl;
1582
1583
1584 dpfc_ctl = I915_READ(DPFC_CONTROL);
1585 if (dpfc_ctl & DPFC_CTL_EN) {
1586 dpfc_ctl &= ~DPFC_CTL_EN;
1587 I915_WRITE(DPFC_CONTROL, dpfc_ctl);
1588
1589 DRM_DEBUG_KMS("disabled FBC\n");
1590 }
1591}
1592
1593static bool g4x_fbc_enabled(struct drm_device *dev)
1594{
1595 struct drm_i915_private *dev_priv = dev->dev_private;
1596
1597 return I915_READ(DPFC_CONTROL) & DPFC_CTL_EN;
1598}
1599
1600static void sandybridge_blit_fbc_update(struct drm_device *dev)
1601{
1602 struct drm_i915_private *dev_priv = dev->dev_private;
1603 u32 blt_ecoskpd;
1604
1605
1606 gen6_gt_force_wake_get(dev_priv);
1607 blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD);
1608 blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY <<
1609 GEN6_BLITTER_LOCK_SHIFT;
1610 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1611 blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY;
1612 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1613 blt_ecoskpd &= ~(GEN6_BLITTER_FBC_NOTIFY <<
1614 GEN6_BLITTER_LOCK_SHIFT);
1615 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1616 POSTING_READ(GEN6_BLITTER_ECOSKPD);
1617 gen6_gt_force_wake_put(dev_priv);
1618}
1619
1620static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1621{
1622 struct drm_device *dev = crtc->dev;
1623 struct drm_i915_private *dev_priv = dev->dev_private;
1624 struct drm_framebuffer *fb = crtc->fb;
1625 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1626 struct drm_i915_gem_object *obj = intel_fb->obj;
1627 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1628 int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB;
1629 unsigned long stall_watermark = 200;
1630 u32 dpfc_ctl;
1631
1632 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
1633 dpfc_ctl &= DPFC_RESERVED;
1634 dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X);
1635
1636 dpfc_ctl |= DPFC_CTL_PERSISTENT_MODE;
1637 dpfc_ctl |= (DPFC_CTL_FENCE_EN | obj->fence_reg);
1638 I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY);
1639
1640 I915_WRITE(ILK_DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN |
1641 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) |
1642 (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT));
1643 I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->y);
1644 I915_WRITE(ILK_FBC_RT_BASE, obj->gtt_offset | ILK_FBC_RT_VALID);
1645
1646 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
1647
1648 if (IS_GEN6(dev)) {
1649 I915_WRITE(SNB_DPFC_CTL_SA,
1650 SNB_CPU_FENCE_ENABLE | obj->fence_reg);
1651 I915_WRITE(DPFC_CPU_FENCE_OFFSET, crtc->y);
1652 sandybridge_blit_fbc_update(dev);
1653 }
1654
1655 DRM_DEBUG_KMS("enabled fbc on plane %d\n", intel_crtc->plane);
1656}
1657
1658static void ironlake_disable_fbc(struct drm_device *dev)
1659{
1660 struct drm_i915_private *dev_priv = dev->dev_private;
1661 u32 dpfc_ctl;
1662
1663
1664 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
1665 if (dpfc_ctl & DPFC_CTL_EN) {
1666 dpfc_ctl &= ~DPFC_CTL_EN;
1667 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl);
1668
1669 DRM_DEBUG_KMS("disabled FBC\n");
1670 }
1671}
1672
1673static bool ironlake_fbc_enabled(struct drm_device *dev)
1674{
1675 struct drm_i915_private *dev_priv = dev->dev_private;
1676
1677 return I915_READ(ILK_DPFC_CONTROL) & DPFC_CTL_EN;
1678}
1679
1680bool intel_fbc_enabled(struct drm_device *dev)
1681{
1682 struct drm_i915_private *dev_priv = dev->dev_private;
1683
1684 if (!dev_priv->display.fbc_enabled)
1685 return false;
1686
1687 return dev_priv->display.fbc_enabled(dev);
1688}
1689
1690static void intel_fbc_work_fn(struct work_struct *__work)
1691{
1692 struct intel_fbc_work *work =
1693 container_of(to_delayed_work(__work),
1694 struct intel_fbc_work, work);
1695 struct drm_device *dev = work->crtc->dev;
1696 struct drm_i915_private *dev_priv = dev->dev_private;
1697
1698 mutex_lock(&dev->struct_mutex);
1699 if (work == dev_priv->fbc_work) {
1700
1701
1702
1703 if (work->crtc->fb == work->fb) {
1704 dev_priv->display.enable_fbc(work->crtc,
1705 work->interval);
1706
1707 dev_priv->cfb_plane = to_intel_crtc(work->crtc)->plane;
1708 dev_priv->cfb_fb = work->crtc->fb->base.id;
1709 dev_priv->cfb_y = work->crtc->y;
1710 }
1711
1712 dev_priv->fbc_work = NULL;
1713 }
1714 mutex_unlock(&dev->struct_mutex);
1715
1716 kfree(work);
1717}
1718
1719static void intel_cancel_fbc_work(struct drm_i915_private *dev_priv)
1720{
1721 if (dev_priv->fbc_work == NULL)
1722 return;
1723
1724 DRM_DEBUG_KMS("cancelling pending FBC enable\n");
1725
1726
1727
1728
1729
1730 if (cancel_delayed_work(&dev_priv->fbc_work->work))
1731
1732 kfree(dev_priv->fbc_work);
1733
1734
1735
1736
1737
1738
1739 dev_priv->fbc_work = NULL;
1740}
1741
1742static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1743{
1744 struct intel_fbc_work *work;
1745 struct drm_device *dev = crtc->dev;
1746 struct drm_i915_private *dev_priv = dev->dev_private;
1747
1748 if (!dev_priv->display.enable_fbc)
1749 return;
1750
1751 intel_cancel_fbc_work(dev_priv);
1752
1753 work = kzalloc(sizeof *work, GFP_KERNEL);
1754 if (work == NULL) {
1755 dev_priv->display.enable_fbc(crtc, interval);
1756 return;
1757 }
1758
1759 work->crtc = crtc;
1760 work->fb = crtc->fb;
1761 work->interval = interval;
1762 INIT_DELAYED_WORK(&work->work, intel_fbc_work_fn);
1763
1764 dev_priv->fbc_work = work;
1765
1766 DRM_DEBUG_KMS("scheduling delayed FBC enable\n");
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779 schedule_delayed_work(&work->work, msecs_to_jiffies(50));
1780}
1781
1782void intel_disable_fbc(struct drm_device *dev)
1783{
1784 struct drm_i915_private *dev_priv = dev->dev_private;
1785
1786 intel_cancel_fbc_work(dev_priv);
1787
1788 if (!dev_priv->display.disable_fbc)
1789 return;
1790
1791 dev_priv->display.disable_fbc(dev);
1792 dev_priv->cfb_plane = -1;
1793}
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814static void intel_update_fbc(struct drm_device *dev)
1815{
1816 struct drm_i915_private *dev_priv = dev->dev_private;
1817 struct drm_crtc *crtc = NULL, *tmp_crtc;
1818 struct intel_crtc *intel_crtc;
1819 struct drm_framebuffer *fb;
1820 struct intel_framebuffer *intel_fb;
1821 struct drm_i915_gem_object *obj;
1822 int enable_fbc;
1823
1824 DRM_DEBUG_KMS("\n");
1825
1826 if (!i915_powersave)
1827 return;
1828
1829 if (!I915_HAS_FBC(dev))
1830 return;
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841 list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) {
1842 if (tmp_crtc->enabled && tmp_crtc->fb) {
1843 if (crtc) {
1844 DRM_DEBUG_KMS("more than one pipe active, disabling compression\n");
1845 dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES;
1846 goto out_disable;
1847 }
1848 crtc = tmp_crtc;
1849 }
1850 }
1851
1852 if (!crtc || crtc->fb == NULL) {
1853 DRM_DEBUG_KMS("no output, disabling\n");
1854 dev_priv->no_fbc_reason = FBC_NO_OUTPUT;
1855 goto out_disable;
1856 }
1857
1858 intel_crtc = to_intel_crtc(crtc);
1859 fb = crtc->fb;
1860 intel_fb = to_intel_framebuffer(fb);
1861 obj = intel_fb->obj;
1862
1863 enable_fbc = i915_enable_fbc;
1864 if (enable_fbc < 0) {
1865 DRM_DEBUG_KMS("fbc set to per-chip default\n");
1866 enable_fbc = 1;
1867 if (INTEL_INFO(dev)->gen <= 5)
1868 enable_fbc = 0;
1869 }
1870 if (!enable_fbc) {
1871 DRM_DEBUG_KMS("fbc disabled per module param\n");
1872 dev_priv->no_fbc_reason = FBC_MODULE_PARAM;
1873 goto out_disable;
1874 }
1875 if (intel_fb->obj->base.size > dev_priv->cfb_size) {
1876 DRM_DEBUG_KMS("framebuffer too large, disabling "
1877 "compression\n");
1878 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1879 goto out_disable;
1880 }
1881 if ((crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) ||
1882 (crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)) {
1883 DRM_DEBUG_KMS("mode incompatible with compression, "
1884 "disabling\n");
1885 dev_priv->no_fbc_reason = FBC_UNSUPPORTED_MODE;
1886 goto out_disable;
1887 }
1888 if ((crtc->mode.hdisplay > 2048) ||
1889 (crtc->mode.vdisplay > 1536)) {
1890 DRM_DEBUG_KMS("mode too large for compression, disabling\n");
1891 dev_priv->no_fbc_reason = FBC_MODE_TOO_LARGE;
1892 goto out_disable;
1893 }
1894 if ((IS_I915GM(dev) || IS_I945GM(dev)) && intel_crtc->plane != 0) {
1895 DRM_DEBUG_KMS("plane not 0, disabling compression\n");
1896 dev_priv->no_fbc_reason = FBC_BAD_PLANE;
1897 goto out_disable;
1898 }
1899
1900
1901
1902
1903 if (obj->tiling_mode != I915_TILING_X ||
1904 obj->fence_reg == I915_FENCE_REG_NONE) {
1905 DRM_DEBUG_KMS("framebuffer not tiled or fenced, disabling compression\n");
1906 dev_priv->no_fbc_reason = FBC_NOT_TILED;
1907 goto out_disable;
1908 }
1909
1910
1911 if (in_dbg_master())
1912 goto out_disable;
1913
1914
1915
1916
1917
1918
1919 if (dev_priv->cfb_plane == intel_crtc->plane &&
1920 dev_priv->cfb_fb == fb->base.id &&
1921 dev_priv->cfb_y == crtc->y)
1922 return;
1923
1924 if (intel_fbc_enabled(dev)) {
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948 DRM_DEBUG_KMS("disabling active FBC for update\n");
1949 intel_disable_fbc(dev);
1950 }
1951
1952 intel_enable_fbc(crtc, 500);
1953 return;
1954
1955out_disable:
1956
1957 if (intel_fbc_enabled(dev)) {
1958 DRM_DEBUG_KMS("unsupported config, disabling FBC\n");
1959 intel_disable_fbc(dev);
1960 }
1961}
1962
1963int
1964intel_pin_and_fence_fb_obj(struct drm_device *dev,
1965 struct drm_i915_gem_object *obj,
1966 struct intel_ring_buffer *pipelined)
1967{
1968 struct drm_i915_private *dev_priv = dev->dev_private;
1969 u32 alignment;
1970 int ret;
1971
1972 switch (obj->tiling_mode) {
1973 case I915_TILING_NONE:
1974 if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
1975 alignment = 128 * 1024;
1976 else if (INTEL_INFO(dev)->gen >= 4)
1977 alignment = 4 * 1024;
1978 else
1979 alignment = 64 * 1024;
1980 break;
1981 case I915_TILING_X:
1982
1983 alignment = 0;
1984 break;
1985 case I915_TILING_Y:
1986
1987 DRM_ERROR("Y tiled not allowed for scan out buffers\n");
1988 return -EINVAL;
1989 default:
1990 BUG();
1991 }
1992
1993 dev_priv->mm.interruptible = false;
1994 ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined);
1995 if (ret)
1996 goto err_interruptible;
1997
1998
1999
2000
2001
2002
2003 if (obj->tiling_mode != I915_TILING_NONE) {
2004 ret = i915_gem_object_get_fence(obj, pipelined);
2005 if (ret)
2006 goto err_unpin;
2007 }
2008
2009 dev_priv->mm.interruptible = true;
2010 return 0;
2011
2012err_unpin:
2013 i915_gem_object_unpin(obj);
2014err_interruptible:
2015 dev_priv->mm.interruptible = true;
2016 return ret;
2017}
2018
2019static int i9xx_update_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb,
2020 int x, int y)
2021{
2022 struct drm_device *dev = crtc->dev;
2023 struct drm_i915_private *dev_priv = dev->dev_private;
2024 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2025 struct intel_framebuffer *intel_fb;
2026 struct drm_i915_gem_object *obj;
2027 int plane = intel_crtc->plane;
2028 unsigned long Start, Offset;
2029 u32 dspcntr;
2030 u32 reg;
2031
2032 switch (plane) {
2033 case 0:
2034 case 1:
2035 break;
2036 default:
2037 DRM_ERROR("Can't update plane %d in SAREA\n", plane);
2038 return -EINVAL;
2039 }
2040
2041 intel_fb = to_intel_framebuffer(fb);
2042 obj = intel_fb->obj;
2043
2044 reg = DSPCNTR(plane);
2045 dspcntr = I915_READ(reg);
2046
2047 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
2048 switch (fb->bits_per_pixel) {
2049 case 8:
2050 dspcntr |= DISPPLANE_8BPP;
2051 break;
2052 case 16:
2053 if (fb->depth == 15)
2054 dspcntr |= DISPPLANE_15_16BPP;
2055 else
2056 dspcntr |= DISPPLANE_16BPP;
2057 break;
2058 case 24:
2059 case 32:
2060 dspcntr |= DISPPLANE_32BPP_NO_ALPHA;
2061 break;
2062 default:
2063 DRM_ERROR("Unknown color depth %d\n", fb->bits_per_pixel);
2064 return -EINVAL;
2065 }
2066 if (INTEL_INFO(dev)->gen >= 4) {
2067 if (obj->tiling_mode != I915_TILING_NONE)
2068 dspcntr |= DISPPLANE_TILED;
2069 else
2070 dspcntr &= ~DISPPLANE_TILED;
2071 }
2072
2073 I915_WRITE(reg, dspcntr);
2074
2075 Start = obj->gtt_offset;
2076 Offset = y * fb->pitch + x * (fb->bits_per_pixel / 8);
2077
2078 DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n",
2079 Start, Offset, x, y, fb->pitch);
2080 I915_WRITE(DSPSTRIDE(plane), fb->pitch);
2081 if (INTEL_INFO(dev)->gen >= 4) {
2082 I915_WRITE(DSPSURF(plane), Start);
2083 I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
2084 I915_WRITE(DSPADDR(plane), Offset);
2085 } else
2086 I915_WRITE(DSPADDR(plane), Start + Offset);
2087 POSTING_READ(reg);
2088
2089 return 0;
2090}
2091
2092static int ironlake_update_plane(struct drm_crtc *crtc,
2093 struct drm_framebuffer *fb, int x, int y)
2094{
2095 struct drm_device *dev = crtc->dev;
2096 struct drm_i915_private *dev_priv = dev->dev_private;
2097 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2098 struct intel_framebuffer *intel_fb;
2099 struct drm_i915_gem_object *obj;
2100 int plane = intel_crtc->plane;
2101 unsigned long Start, Offset;
2102 u32 dspcntr;
2103 u32 reg;
2104
2105 switch (plane) {
2106 case 0:
2107 case 1:
2108 case 2:
2109 break;
2110 default:
2111 DRM_ERROR("Can't update plane %d in SAREA\n", plane);
2112 return -EINVAL;
2113 }
2114
2115 intel_fb = to_intel_framebuffer(fb);
2116 obj = intel_fb->obj;
2117
2118 reg = DSPCNTR(plane);
2119 dspcntr = I915_READ(reg);
2120
2121 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
2122 switch (fb->bits_per_pixel) {
2123 case 8:
2124 dspcntr |= DISPPLANE_8BPP;
2125 break;
2126 case 16:
2127 if (fb->depth != 16)
2128 return -EINVAL;
2129
2130 dspcntr |= DISPPLANE_16BPP;
2131 break;
2132 case 24:
2133 case 32:
2134 if (fb->depth == 24)
2135 dspcntr |= DISPPLANE_32BPP_NO_ALPHA;
2136 else if (fb->depth == 30)
2137 dspcntr |= DISPPLANE_32BPP_30BIT_NO_ALPHA;
2138 else
2139 return -EINVAL;
2140 break;
2141 default:
2142 DRM_ERROR("Unknown color depth %d\n", fb->bits_per_pixel);
2143 return -EINVAL;
2144 }
2145
2146 if (obj->tiling_mode != I915_TILING_NONE)
2147 dspcntr |= DISPPLANE_TILED;
2148 else
2149 dspcntr &= ~DISPPLANE_TILED;
2150
2151
2152 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
2153
2154 I915_WRITE(reg, dspcntr);
2155
2156 Start = obj->gtt_offset;
2157 Offset = y * fb->pitch + x * (fb->bits_per_pixel / 8);
2158
2159 DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n",
2160 Start, Offset, x, y, fb->pitch);
2161 I915_WRITE(DSPSTRIDE(plane), fb->pitch);
2162 I915_WRITE(DSPSURF(plane), Start);
2163 I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
2164 I915_WRITE(DSPADDR(plane), Offset);
2165 POSTING_READ(reg);
2166
2167 return 0;
2168}
2169
2170
2171static int
2172intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
2173 int x, int y, enum mode_set_atomic state)
2174{
2175 struct drm_device *dev = crtc->dev;
2176 struct drm_i915_private *dev_priv = dev->dev_private;
2177 int ret;
2178
2179 ret = dev_priv->display.update_plane(crtc, fb, x, y);
2180 if (ret)
2181 return ret;
2182
2183 intel_update_fbc(dev);
2184 intel_increase_pllclock(crtc);
2185
2186 return 0;
2187}
2188
2189static int
2190intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
2191 struct drm_framebuffer *old_fb)
2192{
2193 struct drm_device *dev = crtc->dev;
2194 struct drm_i915_master_private *master_priv;
2195 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2196 int ret;
2197
2198
2199 if (!crtc->fb) {
2200 DRM_ERROR("No FB bound\n");
2201 return 0;
2202 }
2203
2204 switch (intel_crtc->plane) {
2205 case 0:
2206 case 1:
2207 break;
2208 case 2:
2209 if (IS_IVYBRIDGE(dev))
2210 break;
2211
2212 default:
2213 DRM_ERROR("no plane for crtc\n");
2214 return -EINVAL;
2215 }
2216
2217 mutex_lock(&dev->struct_mutex);
2218 ret = intel_pin_and_fence_fb_obj(dev,
2219 to_intel_framebuffer(crtc->fb)->obj,
2220 NULL);
2221 if (ret != 0) {
2222 mutex_unlock(&dev->struct_mutex);
2223 DRM_ERROR("pin & fence failed\n");
2224 return ret;
2225 }
2226
2227 if (old_fb) {
2228 struct drm_i915_private *dev_priv = dev->dev_private;
2229 struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
2230
2231 wait_event(dev_priv->pending_flip_queue,
2232 atomic_read(&dev_priv->mm.wedged) ||
2233 atomic_read(&obj->pending_flip) == 0);
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243 ret = i915_gem_object_finish_gpu(obj);
2244 (void) ret;
2245 }
2246
2247 ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y,
2248 LEAVE_ATOMIC_MODE_SET);
2249 if (ret) {
2250 i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
2251 mutex_unlock(&dev->struct_mutex);
2252 DRM_ERROR("failed to update base address\n");
2253 return ret;
2254 }
2255
2256 if (old_fb) {
2257 intel_wait_for_vblank(dev, intel_crtc->pipe);
2258 i915_gem_object_unpin(to_intel_framebuffer(old_fb)->obj);
2259 }
2260
2261 mutex_unlock(&dev->struct_mutex);
2262
2263 if (!dev->primary->master)
2264 return 0;
2265
2266 master_priv = dev->primary->master->driver_priv;
2267 if (!master_priv->sarea_priv)
2268 return 0;
2269
2270 if (intel_crtc->pipe) {
2271 master_priv->sarea_priv->pipeB_x = x;
2272 master_priv->sarea_priv->pipeB_y = y;
2273 } else {
2274 master_priv->sarea_priv->pipeA_x = x;
2275 master_priv->sarea_priv->pipeA_y = y;
2276 }
2277
2278 return 0;
2279}
2280
2281static void ironlake_set_pll_edp(struct drm_crtc *crtc, int clock)
2282{
2283 struct drm_device *dev = crtc->dev;
2284 struct drm_i915_private *dev_priv = dev->dev_private;
2285 u32 dpa_ctl;
2286
2287 DRM_DEBUG_KMS("eDP PLL enable for clock %d\n", clock);
2288 dpa_ctl = I915_READ(DP_A);
2289 dpa_ctl &= ~DP_PLL_FREQ_MASK;
2290
2291 if (clock < 200000) {
2292 u32 temp;
2293 dpa_ctl |= DP_PLL_FREQ_160MHZ;
2294
2295
2296
2297
2298
2299
2300 temp = I915_READ(0x4600c);
2301 temp &= 0xffff0000;
2302 I915_WRITE(0x4600c, temp | 0x8124);
2303
2304 temp = I915_READ(0x46010);
2305 I915_WRITE(0x46010, temp | 1);
2306
2307 temp = I915_READ(0x46034);
2308 I915_WRITE(0x46034, temp | (1 << 24));
2309 } else {
2310 dpa_ctl |= DP_PLL_FREQ_270MHZ;
2311 }
2312 I915_WRITE(DP_A, dpa_ctl);
2313
2314 POSTING_READ(DP_A);
2315 udelay(500);
2316}
2317
2318static void intel_fdi_normal_train(struct drm_crtc *crtc)
2319{
2320 struct drm_device *dev = crtc->dev;
2321 struct drm_i915_private *dev_priv = dev->dev_private;
2322 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2323 int pipe = intel_crtc->pipe;
2324 u32 reg, temp;
2325
2326
2327 reg = FDI_TX_CTL(pipe);
2328 temp = I915_READ(reg);
2329 if (IS_IVYBRIDGE(dev)) {
2330 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
2331 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
2332 } else {
2333 temp &= ~FDI_LINK_TRAIN_NONE;
2334 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
2335 }
2336 I915_WRITE(reg, temp);
2337
2338 reg = FDI_RX_CTL(pipe);
2339 temp = I915_READ(reg);
2340 if (HAS_PCH_CPT(dev)) {
2341 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2342 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
2343 } else {
2344 temp &= ~FDI_LINK_TRAIN_NONE;
2345 temp |= FDI_LINK_TRAIN_NONE;
2346 }
2347 I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
2348
2349
2350 POSTING_READ(reg);
2351 udelay(1000);
2352
2353
2354 if (IS_IVYBRIDGE(dev))
2355 I915_WRITE(reg, I915_READ(reg) | FDI_FS_ERRC_ENABLE |
2356 FDI_FE_ERRC_ENABLE);
2357}
2358
2359static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe)
2360{
2361 struct drm_i915_private *dev_priv = dev->dev_private;
2362 u32 flags = I915_READ(SOUTH_CHICKEN1);
2363
2364 flags |= FDI_PHASE_SYNC_OVR(pipe);
2365 I915_WRITE(SOUTH_CHICKEN1, flags);
2366 flags |= FDI_PHASE_SYNC_EN(pipe);
2367 I915_WRITE(SOUTH_CHICKEN1, flags);
2368 POSTING_READ(SOUTH_CHICKEN1);
2369}
2370
2371
2372static void ironlake_fdi_link_train(struct drm_crtc *crtc)
2373{
2374 struct drm_device *dev = crtc->dev;
2375 struct drm_i915_private *dev_priv = dev->dev_private;
2376 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2377 int pipe = intel_crtc->pipe;
2378 int plane = intel_crtc->plane;
2379 u32 reg, temp, tries;
2380
2381
2382 assert_pipe_enabled(dev_priv, pipe);
2383 assert_plane_enabled(dev_priv, plane);
2384
2385
2386
2387 reg = FDI_RX_IMR(pipe);
2388 temp = I915_READ(reg);
2389 temp &= ~FDI_RX_SYMBOL_LOCK;
2390 temp &= ~FDI_RX_BIT_LOCK;
2391 I915_WRITE(reg, temp);
2392 I915_READ(reg);
2393 udelay(150);
2394
2395
2396 reg = FDI_TX_CTL(pipe);
2397 temp = I915_READ(reg);
2398 temp &= ~(7 << 19);
2399 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2400 temp &= ~FDI_LINK_TRAIN_NONE;
2401 temp |= FDI_LINK_TRAIN_PATTERN_1;
2402 I915_WRITE(reg, temp | FDI_TX_ENABLE);
2403
2404 reg = FDI_RX_CTL(pipe);
2405 temp = I915_READ(reg);
2406 temp &= ~FDI_LINK_TRAIN_NONE;
2407 temp |= FDI_LINK_TRAIN_PATTERN_1;
2408 I915_WRITE(reg, temp | FDI_RX_ENABLE);
2409
2410 POSTING_READ(reg);
2411 udelay(150);
2412
2413
2414 if (HAS_PCH_IBX(dev)) {
2415 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
2416 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR |
2417 FDI_RX_PHASE_SYNC_POINTER_EN);
2418 }
2419
2420 reg = FDI_RX_IIR(pipe);
2421 for (tries = 0; tries < 5; tries++) {
2422 temp = I915_READ(reg);
2423 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2424
2425 if ((temp & FDI_RX_BIT_LOCK)) {
2426 DRM_DEBUG_KMS("FDI train 1 done.\n");
2427 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
2428 break;
2429 }
2430 }
2431 if (tries == 5)
2432 DRM_ERROR("FDI train 1 fail!\n");
2433
2434
2435 reg = FDI_TX_CTL(pipe);
2436 temp = I915_READ(reg);
2437 temp &= ~FDI_LINK_TRAIN_NONE;
2438 temp |= FDI_LINK_TRAIN_PATTERN_2;
2439 I915_WRITE(reg, temp);
2440
2441 reg = FDI_RX_CTL(pipe);
2442 temp = I915_READ(reg);
2443 temp &= ~FDI_LINK_TRAIN_NONE;
2444 temp |= FDI_LINK_TRAIN_PATTERN_2;
2445 I915_WRITE(reg, temp);
2446
2447 POSTING_READ(reg);
2448 udelay(150);
2449
2450 reg = FDI_RX_IIR(pipe);
2451 for (tries = 0; tries < 5; tries++) {
2452 temp = I915_READ(reg);
2453 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2454
2455 if (temp & FDI_RX_SYMBOL_LOCK) {
2456 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
2457 DRM_DEBUG_KMS("FDI train 2 done.\n");
2458 break;
2459 }
2460 }
2461 if (tries == 5)
2462 DRM_ERROR("FDI train 2 fail!\n");
2463
2464 DRM_DEBUG_KMS("FDI train done\n");
2465
2466}
2467
2468static const int snb_b_fdi_train_param[] = {
2469 FDI_LINK_TRAIN_400MV_0DB_SNB_B,
2470 FDI_LINK_TRAIN_400MV_6DB_SNB_B,
2471 FDI_LINK_TRAIN_600MV_3_5DB_SNB_B,
2472 FDI_LINK_TRAIN_800MV_0DB_SNB_B,
2473};
2474
2475
2476static void gen6_fdi_link_train(struct drm_crtc *crtc)
2477{
2478 struct drm_device *dev = crtc->dev;
2479 struct drm_i915_private *dev_priv = dev->dev_private;
2480 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2481 int pipe = intel_crtc->pipe;
2482 u32 reg, temp, i;
2483
2484
2485
2486 reg = FDI_RX_IMR(pipe);
2487 temp = I915_READ(reg);
2488 temp &= ~FDI_RX_SYMBOL_LOCK;
2489 temp &= ~FDI_RX_BIT_LOCK;
2490 I915_WRITE(reg, temp);
2491
2492 POSTING_READ(reg);
2493 udelay(150);
2494
2495
2496 reg = FDI_TX_CTL(pipe);
2497 temp = I915_READ(reg);
2498 temp &= ~(7 << 19);
2499 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2500 temp &= ~FDI_LINK_TRAIN_NONE;
2501 temp |= FDI_LINK_TRAIN_PATTERN_1;
2502 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2503
2504 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2505 I915_WRITE(reg, temp | FDI_TX_ENABLE);
2506
2507 reg = FDI_RX_CTL(pipe);
2508 temp = I915_READ(reg);
2509 if (HAS_PCH_CPT(dev)) {
2510 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2511 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2512 } else {
2513 temp &= ~FDI_LINK_TRAIN_NONE;
2514 temp |= FDI_LINK_TRAIN_PATTERN_1;
2515 }
2516 I915_WRITE(reg, temp | FDI_RX_ENABLE);
2517
2518 POSTING_READ(reg);
2519 udelay(150);
2520
2521 if (HAS_PCH_CPT(dev))
2522 cpt_phase_pointer_enable(dev, pipe);
2523
2524 for (i = 0; i < 4; i++) {
2525 reg = FDI_TX_CTL(pipe);
2526 temp = I915_READ(reg);
2527 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2528 temp |= snb_b_fdi_train_param[i];
2529 I915_WRITE(reg, temp);
2530
2531 POSTING_READ(reg);
2532 udelay(500);
2533
2534 reg = FDI_RX_IIR(pipe);
2535 temp = I915_READ(reg);
2536 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2537
2538 if (temp & FDI_RX_BIT_LOCK) {
2539 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
2540 DRM_DEBUG_KMS("FDI train 1 done.\n");
2541 break;
2542 }
2543 }
2544 if (i == 4)
2545 DRM_ERROR("FDI train 1 fail!\n");
2546
2547
2548 reg = FDI_TX_CTL(pipe);
2549 temp = I915_READ(reg);
2550 temp &= ~FDI_LINK_TRAIN_NONE;
2551 temp |= FDI_LINK_TRAIN_PATTERN_2;
2552 if (IS_GEN6(dev)) {
2553 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2554
2555 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2556 }
2557 I915_WRITE(reg, temp);
2558
2559 reg = FDI_RX_CTL(pipe);
2560 temp = I915_READ(reg);
2561 if (HAS_PCH_CPT(dev)) {
2562 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2563 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
2564 } else {
2565 temp &= ~FDI_LINK_TRAIN_NONE;
2566 temp |= FDI_LINK_TRAIN_PATTERN_2;
2567 }
2568 I915_WRITE(reg, temp);
2569
2570 POSTING_READ(reg);
2571 udelay(150);
2572
2573 for (i = 0; i < 4; i++) {
2574 reg = FDI_TX_CTL(pipe);
2575 temp = I915_READ(reg);
2576 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2577 temp |= snb_b_fdi_train_param[i];
2578 I915_WRITE(reg, temp);
2579
2580 POSTING_READ(reg);
2581 udelay(500);
2582
2583 reg = FDI_RX_IIR(pipe);
2584 temp = I915_READ(reg);
2585 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2586
2587 if (temp & FDI_RX_SYMBOL_LOCK) {
2588 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
2589 DRM_DEBUG_KMS("FDI train 2 done.\n");
2590 break;
2591 }
2592 }
2593 if (i == 4)
2594 DRM_ERROR("FDI train 2 fail!\n");
2595
2596 DRM_DEBUG_KMS("FDI train done.\n");
2597}
2598
2599
2600static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
2601{
2602 struct drm_device *dev = crtc->dev;
2603 struct drm_i915_private *dev_priv = dev->dev_private;
2604 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2605 int pipe = intel_crtc->pipe;
2606 u32 reg, temp, i;
2607
2608
2609
2610 reg = FDI_RX_IMR(pipe);
2611 temp = I915_READ(reg);
2612 temp &= ~FDI_RX_SYMBOL_LOCK;
2613 temp &= ~FDI_RX_BIT_LOCK;
2614 I915_WRITE(reg, temp);
2615
2616 POSTING_READ(reg);
2617 udelay(150);
2618
2619
2620 reg = FDI_TX_CTL(pipe);
2621 temp = I915_READ(reg);
2622 temp &= ~(7 << 19);
2623 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2624 temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB);
2625 temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
2626 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2627 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2628 temp |= FDI_COMPOSITE_SYNC;
2629 I915_WRITE(reg, temp | FDI_TX_ENABLE);
2630
2631 reg = FDI_RX_CTL(pipe);
2632 temp = I915_READ(reg);
2633 temp &= ~FDI_LINK_TRAIN_AUTO;
2634 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2635 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2636 temp |= FDI_COMPOSITE_SYNC;
2637 I915_WRITE(reg, temp | FDI_RX_ENABLE);
2638
2639 POSTING_READ(reg);
2640 udelay(150);
2641
2642 if (HAS_PCH_CPT(dev))
2643 cpt_phase_pointer_enable(dev, pipe);
2644
2645 for (i = 0; i < 4; i++) {
2646 reg = FDI_TX_CTL(pipe);
2647 temp = I915_READ(reg);
2648 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2649 temp |= snb_b_fdi_train_param[i];
2650 I915_WRITE(reg, temp);
2651
2652 POSTING_READ(reg);
2653 udelay(500);
2654
2655 reg = FDI_RX_IIR(pipe);
2656 temp = I915_READ(reg);
2657 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2658
2659 if (temp & FDI_RX_BIT_LOCK ||
2660 (I915_READ(reg) & FDI_RX_BIT_LOCK)) {
2661 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
2662 DRM_DEBUG_KMS("FDI train 1 done.\n");
2663 break;
2664 }
2665 }
2666 if (i == 4)
2667 DRM_ERROR("FDI train 1 fail!\n");
2668
2669
2670 reg = FDI_TX_CTL(pipe);
2671 temp = I915_READ(reg);
2672 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
2673 temp |= FDI_LINK_TRAIN_PATTERN_2_IVB;
2674 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2675 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2676 I915_WRITE(reg, temp);
2677
2678 reg = FDI_RX_CTL(pipe);
2679 temp = I915_READ(reg);
2680 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2681 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
2682 I915_WRITE(reg, temp);
2683
2684 POSTING_READ(reg);
2685 udelay(150);
2686
2687 for (i = 0; i < 4; i++) {
2688 reg = FDI_TX_CTL(pipe);
2689 temp = I915_READ(reg);
2690 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2691 temp |= snb_b_fdi_train_param[i];
2692 I915_WRITE(reg, temp);
2693
2694 POSTING_READ(reg);
2695 udelay(500);
2696
2697 reg = FDI_RX_IIR(pipe);
2698 temp = I915_READ(reg);
2699 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2700
2701 if (temp & FDI_RX_SYMBOL_LOCK) {
2702 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
2703 DRM_DEBUG_KMS("FDI train 2 done.\n");
2704 break;
2705 }
2706 }
2707 if (i == 4)
2708 DRM_ERROR("FDI train 2 fail!\n");
2709
2710 DRM_DEBUG_KMS("FDI train done.\n");
2711}
2712
2713static void ironlake_fdi_pll_enable(struct drm_crtc *crtc)
2714{
2715 struct drm_device *dev = crtc->dev;
2716 struct drm_i915_private *dev_priv = dev->dev_private;
2717 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2718 int pipe = intel_crtc->pipe;
2719 u32 reg, temp;
2720
2721
2722 I915_WRITE(FDI_RX_TUSIZE1(pipe),
2723 I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
2724
2725
2726 reg = FDI_RX_CTL(pipe);
2727 temp = I915_READ(reg);
2728 temp &= ~((0x7 << 19) | (0x7 << 16));
2729 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2730 temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
2731 I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
2732
2733 POSTING_READ(reg);
2734 udelay(200);
2735
2736
2737 temp = I915_READ(reg);
2738 I915_WRITE(reg, temp | FDI_PCDCLK);
2739
2740 POSTING_READ(reg);
2741 udelay(200);
2742
2743
2744 reg = FDI_TX_CTL(pipe);
2745 temp = I915_READ(reg);
2746 if ((temp & FDI_TX_PLL_ENABLE) == 0) {
2747 I915_WRITE(reg, temp | FDI_TX_PLL_ENABLE);
2748
2749 POSTING_READ(reg);
2750 udelay(100);
2751 }
2752}
2753
2754static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe)
2755{
2756 struct drm_i915_private *dev_priv = dev->dev_private;
2757 u32 flags = I915_READ(SOUTH_CHICKEN1);
2758
2759 flags &= ~(FDI_PHASE_SYNC_EN(pipe));
2760 I915_WRITE(SOUTH_CHICKEN1, flags);
2761 flags &= ~(FDI_PHASE_SYNC_OVR(pipe));
2762 I915_WRITE(SOUTH_CHICKEN1, flags);
2763 POSTING_READ(SOUTH_CHICKEN1);
2764}
2765static void ironlake_fdi_disable(struct drm_crtc *crtc)
2766{
2767 struct drm_device *dev = crtc->dev;
2768 struct drm_i915_private *dev_priv = dev->dev_private;
2769 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2770 int pipe = intel_crtc->pipe;
2771 u32 reg, temp;
2772
2773
2774 reg = FDI_TX_CTL(pipe);
2775 temp = I915_READ(reg);
2776 I915_WRITE(reg, temp & ~FDI_TX_ENABLE);
2777 POSTING_READ(reg);
2778
2779 reg = FDI_RX_CTL(pipe);
2780 temp = I915_READ(reg);
2781 temp &= ~(0x7 << 16);
2782 temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
2783 I915_WRITE(reg, temp & ~FDI_RX_ENABLE);
2784
2785 POSTING_READ(reg);
2786 udelay(100);
2787
2788
2789 if (HAS_PCH_IBX(dev)) {
2790 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
2791 I915_WRITE(FDI_RX_CHICKEN(pipe),
2792 I915_READ(FDI_RX_CHICKEN(pipe) &
2793 ~FDI_RX_PHASE_SYNC_POINTER_EN));
2794 } else if (HAS_PCH_CPT(dev)) {
2795 cpt_phase_pointer_disable(dev, pipe);
2796 }
2797
2798
2799 reg = FDI_TX_CTL(pipe);
2800 temp = I915_READ(reg);
2801 temp &= ~FDI_LINK_TRAIN_NONE;
2802 temp |= FDI_LINK_TRAIN_PATTERN_1;
2803 I915_WRITE(reg, temp);
2804
2805 reg = FDI_RX_CTL(pipe);
2806 temp = I915_READ(reg);
2807 if (HAS_PCH_CPT(dev)) {
2808 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2809 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2810 } else {
2811 temp &= ~FDI_LINK_TRAIN_NONE;
2812 temp |= FDI_LINK_TRAIN_PATTERN_1;
2813 }
2814
2815 temp &= ~(0x07 << 16);
2816 temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
2817 I915_WRITE(reg, temp);
2818
2819 POSTING_READ(reg);
2820 udelay(100);
2821}
2822
2823
2824
2825
2826
2827static void intel_clear_scanline_wait(struct drm_device *dev)
2828{
2829 struct drm_i915_private *dev_priv = dev->dev_private;
2830 struct intel_ring_buffer *ring;
2831 u32 tmp;
2832
2833 if (IS_GEN2(dev))
2834
2835 return;
2836
2837 ring = LP_RING(dev_priv);
2838 tmp = I915_READ_CTL(ring);
2839 if (tmp & RING_WAIT)
2840 I915_WRITE_CTL(ring, tmp);
2841}
2842
2843static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
2844{
2845 struct drm_i915_gem_object *obj;
2846 struct drm_i915_private *dev_priv;
2847
2848 if (crtc->fb == NULL)
2849 return;
2850
2851 obj = to_intel_framebuffer(crtc->fb)->obj;
2852 dev_priv = crtc->dev->dev_private;
2853 wait_event(dev_priv->pending_flip_queue,
2854 atomic_read(&obj->pending_flip) == 0);
2855}
2856
2857static bool intel_crtc_driving_pch(struct drm_crtc *crtc)
2858{
2859 struct drm_device *dev = crtc->dev;
2860 struct drm_mode_config *mode_config = &dev->mode_config;
2861 struct intel_encoder *encoder;
2862
2863
2864
2865
2866
2867 list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
2868 if (encoder->base.crtc != crtc)
2869 continue;
2870
2871 switch (encoder->type) {
2872 case INTEL_OUTPUT_EDP:
2873 if (!intel_encoder_is_pch_edp(&encoder->base))
2874 return false;
2875 continue;
2876 }
2877 }
2878
2879 return true;
2880}
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890static void ironlake_pch_enable(struct drm_crtc *crtc)
2891{
2892 struct drm_device *dev = crtc->dev;
2893 struct drm_i915_private *dev_priv = dev->dev_private;
2894 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2895 int pipe = intel_crtc->pipe;
2896 u32 reg, temp, transc_sel;
2897
2898
2899 dev_priv->display.fdi_link_train(crtc);
2900
2901 intel_enable_pch_pll(dev_priv, pipe);
2902
2903 if (HAS_PCH_CPT(dev)) {
2904 transc_sel = intel_crtc->use_pll_a ? TRANSC_DPLLA_SEL :
2905 TRANSC_DPLLB_SEL;
2906
2907
2908 temp = I915_READ(PCH_DPLL_SEL);
2909 if (pipe == 0) {
2910 temp &= ~(TRANSA_DPLLB_SEL);
2911 temp |= (TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL);
2912 } else if (pipe == 1) {
2913 temp &= ~(TRANSB_DPLLB_SEL);
2914 temp |= (TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
2915 } else if (pipe == 2) {
2916 temp &= ~(TRANSC_DPLLB_SEL);
2917 temp |= (TRANSC_DPLL_ENABLE | transc_sel);
2918 }
2919 I915_WRITE(PCH_DPLL_SEL, temp);
2920 }
2921
2922
2923 assert_panel_unlocked(dev_priv, pipe);
2924 I915_WRITE(TRANS_HTOTAL(pipe), I915_READ(HTOTAL(pipe)));
2925 I915_WRITE(TRANS_HBLANK(pipe), I915_READ(HBLANK(pipe)));
2926 I915_WRITE(TRANS_HSYNC(pipe), I915_READ(HSYNC(pipe)));
2927
2928 I915_WRITE(TRANS_VTOTAL(pipe), I915_READ(VTOTAL(pipe)));
2929 I915_WRITE(TRANS_VBLANK(pipe), I915_READ(VBLANK(pipe)));
2930 I915_WRITE(TRANS_VSYNC(pipe), I915_READ(VSYNC(pipe)));
2931
2932 intel_fdi_normal_train(crtc);
2933
2934
2935 if (HAS_PCH_CPT(dev) &&
2936 (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) ||
2937 intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))) {
2938 u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) >> 5;
2939 reg = TRANS_DP_CTL(pipe);
2940 temp = I915_READ(reg);
2941 temp &= ~(TRANS_DP_PORT_SEL_MASK |
2942 TRANS_DP_SYNC_MASK |
2943 TRANS_DP_BPC_MASK);
2944 temp |= (TRANS_DP_OUTPUT_ENABLE |
2945 TRANS_DP_ENH_FRAMING);
2946 temp |= bpc << 9;
2947
2948 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC)
2949 temp |= TRANS_DP_HSYNC_ACTIVE_HIGH;
2950 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC)
2951 temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
2952
2953 switch (intel_trans_dp_port_sel(crtc)) {
2954 case PCH_DP_B:
2955 temp |= TRANS_DP_PORT_SEL_B;
2956 break;
2957 case PCH_DP_C:
2958 temp |= TRANS_DP_PORT_SEL_C;
2959 break;
2960 case PCH_DP_D:
2961 temp |= TRANS_DP_PORT_SEL_D;
2962 break;
2963 default:
2964 DRM_DEBUG_KMS("Wrong PCH DP port return. Guess port B\n");
2965 temp |= TRANS_DP_PORT_SEL_B;
2966 break;
2967 }
2968
2969 I915_WRITE(reg, temp);
2970 }
2971
2972 intel_enable_transcoder(dev_priv, pipe);
2973}
2974
2975void intel_cpt_verify_modeset(struct drm_device *dev, int pipe)
2976{
2977 struct drm_i915_private *dev_priv = dev->dev_private;
2978 int dslreg = PIPEDSL(pipe), tc2reg = TRANS_CHICKEN2(pipe);
2979 u32 temp;
2980
2981 temp = I915_READ(dslreg);
2982 udelay(500);
2983 if (wait_for(I915_READ(dslreg) != temp, 5)) {
2984
2985 I915_WRITE(tc2reg, TRANS_AUTOTRAIN_GEN_STALL_DIS);
2986 udelay(250);
2987 I915_WRITE(tc2reg, 0);
2988 if (wait_for(I915_READ(dslreg) != temp, 5))
2989 DRM_ERROR("mode set failed: pipe %d stuck\n", pipe);
2990 }
2991}
2992
2993static void ironlake_crtc_enable(struct drm_crtc *crtc)
2994{
2995 struct drm_device *dev = crtc->dev;
2996 struct drm_i915_private *dev_priv = dev->dev_private;
2997 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2998 int pipe = intel_crtc->pipe;
2999 int plane = intel_crtc->plane;
3000 u32 temp;
3001 bool is_pch_port;
3002
3003 if (intel_crtc->active)
3004 return;
3005
3006 intel_crtc->active = true;
3007 intel_update_watermarks(dev);
3008
3009 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
3010 temp = I915_READ(PCH_LVDS);
3011 if ((temp & LVDS_PORT_EN) == 0)
3012 I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
3013 }
3014
3015 is_pch_port = intel_crtc_driving_pch(crtc);
3016
3017 if (is_pch_port)
3018 ironlake_fdi_pll_enable(crtc);
3019 else
3020 ironlake_fdi_disable(crtc);
3021
3022
3023 if (dev_priv->pch_pf_size &&
3024 (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || HAS_eDP)) {
3025
3026
3027
3028
3029 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
3030 I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos);
3031 I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size);
3032 }
3033
3034
3035
3036
3037
3038 intel_crtc_load_lut(crtc);
3039
3040 intel_enable_pipe(dev_priv, pipe, is_pch_port);
3041 intel_enable_plane(dev_priv, plane, pipe);
3042
3043 if (is_pch_port)
3044 ironlake_pch_enable(crtc);
3045
3046 mutex_lock(&dev->struct_mutex);
3047 intel_update_fbc(dev);
3048 mutex_unlock(&dev->struct_mutex);
3049
3050 intel_crtc_update_cursor(crtc, true);
3051}
3052
3053static void ironlake_crtc_disable(struct drm_crtc *crtc)
3054{
3055 struct drm_device *dev = crtc->dev;
3056 struct drm_i915_private *dev_priv = dev->dev_private;
3057 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3058 int pipe = intel_crtc->pipe;
3059 int plane = intel_crtc->plane;
3060 u32 reg, temp;
3061
3062 if (!intel_crtc->active)
3063 return;
3064
3065 intel_crtc_wait_for_pending_flips(crtc);
3066 drm_vblank_off(dev, pipe);
3067 intel_crtc_update_cursor(crtc, false);
3068
3069 intel_disable_plane(dev_priv, plane, pipe);
3070
3071 if (dev_priv->cfb_plane == plane)
3072 intel_disable_fbc(dev);
3073
3074 intel_disable_pipe(dev_priv, pipe);
3075
3076
3077 I915_WRITE(PF_CTL(pipe), 0);
3078 I915_WRITE(PF_WIN_SZ(pipe), 0);
3079
3080 ironlake_fdi_disable(crtc);
3081
3082
3083
3084
3085
3086
3087 intel_disable_pch_ports(dev_priv, pipe);
3088
3089 intel_disable_transcoder(dev_priv, pipe);
3090
3091 if (HAS_PCH_CPT(dev)) {
3092
3093 reg = TRANS_DP_CTL(pipe);
3094 temp = I915_READ(reg);
3095 temp &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK);
3096 temp |= TRANS_DP_PORT_SEL_NONE;
3097 I915_WRITE(reg, temp);
3098
3099
3100 temp = I915_READ(PCH_DPLL_SEL);
3101 switch (pipe) {
3102 case 0:
3103 temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLB_SEL);
3104 break;
3105 case 1:
3106 temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
3107 break;
3108 case 2:
3109
3110 temp &= ~(TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL);
3111 break;
3112 default:
3113 BUG();
3114 }
3115 I915_WRITE(PCH_DPLL_SEL, temp);
3116 }
3117
3118
3119 if (!intel_crtc->no_pll)
3120 intel_disable_pch_pll(dev_priv, pipe);
3121
3122
3123 reg = FDI_RX_CTL(pipe);
3124 temp = I915_READ(reg);
3125 I915_WRITE(reg, temp & ~FDI_PCDCLK);
3126
3127
3128 reg = FDI_TX_CTL(pipe);
3129 temp = I915_READ(reg);
3130 I915_WRITE(reg, temp & ~FDI_TX_PLL_ENABLE);
3131
3132 POSTING_READ(reg);
3133 udelay(100);
3134
3135 reg = FDI_RX_CTL(pipe);
3136 temp = I915_READ(reg);
3137 I915_WRITE(reg, temp & ~FDI_RX_PLL_ENABLE);
3138
3139
3140 POSTING_READ(reg);
3141 udelay(100);
3142
3143 intel_crtc->active = false;
3144 intel_update_watermarks(dev);
3145
3146 mutex_lock(&dev->struct_mutex);
3147 intel_update_fbc(dev);
3148 intel_clear_scanline_wait(dev);
3149 mutex_unlock(&dev->struct_mutex);
3150}
3151
3152static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode)
3153{
3154 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3155 int pipe = intel_crtc->pipe;
3156 int plane = intel_crtc->plane;
3157
3158
3159
3160
3161 switch (mode) {
3162 case DRM_MODE_DPMS_ON:
3163 case DRM_MODE_DPMS_STANDBY:
3164 case DRM_MODE_DPMS_SUSPEND:
3165 DRM_DEBUG_KMS("crtc %d/%d dpms on\n", pipe, plane);
3166 ironlake_crtc_enable(crtc);
3167 break;
3168
3169 case DRM_MODE_DPMS_OFF:
3170 DRM_DEBUG_KMS("crtc %d/%d dpms off\n", pipe, plane);
3171 ironlake_crtc_disable(crtc);
3172 break;
3173 }
3174}
3175
3176static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable)
3177{
3178 if (!enable && intel_crtc->overlay) {
3179 struct drm_device *dev = intel_crtc->base.dev;
3180 struct drm_i915_private *dev_priv = dev->dev_private;
3181
3182 mutex_lock(&dev->struct_mutex);
3183 dev_priv->mm.interruptible = false;
3184 (void) intel_overlay_switch_off(intel_crtc->overlay);
3185 dev_priv->mm.interruptible = true;
3186 mutex_unlock(&dev->struct_mutex);
3187 }
3188
3189
3190
3191
3192}
3193
3194static void i9xx_crtc_enable(struct drm_crtc *crtc)
3195{
3196 struct drm_device *dev = crtc->dev;
3197 struct drm_i915_private *dev_priv = dev->dev_private;
3198 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3199 int pipe = intel_crtc->pipe;
3200 int plane = intel_crtc->plane;
3201
3202 if (intel_crtc->active)
3203 return;
3204
3205 intel_crtc->active = true;
3206 intel_update_watermarks(dev);
3207
3208 intel_enable_pll(dev_priv, pipe);
3209 intel_enable_pipe(dev_priv, pipe, false);
3210 intel_enable_plane(dev_priv, plane, pipe);
3211
3212 intel_crtc_load_lut(crtc);
3213 intel_update_fbc(dev);
3214
3215
3216 intel_crtc_dpms_overlay(intel_crtc, true);
3217 intel_crtc_update_cursor(crtc, true);
3218}
3219
3220static void i9xx_crtc_disable(struct drm_crtc *crtc)
3221{
3222 struct drm_device *dev = crtc->dev;
3223 struct drm_i915_private *dev_priv = dev->dev_private;
3224 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3225 int pipe = intel_crtc->pipe;
3226 int plane = intel_crtc->plane;
3227
3228 if (!intel_crtc->active)
3229 return;
3230
3231
3232 intel_crtc_wait_for_pending_flips(crtc);
3233 drm_vblank_off(dev, pipe);
3234 intel_crtc_dpms_overlay(intel_crtc, false);
3235 intel_crtc_update_cursor(crtc, false);
3236
3237 if (dev_priv->cfb_plane == plane)
3238 intel_disable_fbc(dev);
3239
3240 intel_disable_plane(dev_priv, plane, pipe);
3241 intel_disable_pipe(dev_priv, pipe);
3242 intel_disable_pll(dev_priv, pipe);
3243
3244 intel_crtc->active = false;
3245 intel_update_fbc(dev);
3246 intel_update_watermarks(dev);
3247 intel_clear_scanline_wait(dev);
3248}
3249
3250static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
3251{
3252
3253
3254
3255 switch (mode) {
3256 case DRM_MODE_DPMS_ON:
3257 case DRM_MODE_DPMS_STANDBY:
3258 case DRM_MODE_DPMS_SUSPEND:
3259 i9xx_crtc_enable(crtc);
3260 break;
3261 case DRM_MODE_DPMS_OFF:
3262 i9xx_crtc_disable(crtc);
3263 break;
3264 }
3265}
3266
3267
3268
3269
3270static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
3271{
3272 struct drm_device *dev = crtc->dev;
3273 struct drm_i915_private *dev_priv = dev->dev_private;
3274 struct drm_i915_master_private *master_priv;
3275 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3276 int pipe = intel_crtc->pipe;
3277 bool enabled;
3278
3279 if (intel_crtc->dpms_mode == mode)
3280 return;
3281
3282 intel_crtc->dpms_mode = mode;
3283
3284 dev_priv->display.dpms(crtc, mode);
3285
3286 if (!dev->primary->master)
3287 return;
3288
3289 master_priv = dev->primary->master->driver_priv;
3290 if (!master_priv->sarea_priv)
3291 return;
3292
3293 enabled = crtc->enabled && mode != DRM_MODE_DPMS_OFF;
3294
3295 switch (pipe) {
3296 case 0:
3297 master_priv->sarea_priv->pipeA_w = enabled ? crtc->mode.hdisplay : 0;
3298 master_priv->sarea_priv->pipeA_h = enabled ? crtc->mode.vdisplay : 0;
3299 break;
3300 case 1:
3301 master_priv->sarea_priv->pipeB_w = enabled ? crtc->mode.hdisplay : 0;
3302 master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0;
3303 break;
3304 default:
3305 DRM_ERROR("Can't update pipe %c in SAREA\n", pipe_name(pipe));
3306 break;
3307 }
3308}
3309
3310static void intel_crtc_disable(struct drm_crtc *crtc)
3311{
3312 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
3313 struct drm_device *dev = crtc->dev;
3314
3315 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
3316
3317 if (crtc->fb) {
3318 mutex_lock(&dev->struct_mutex);
3319 i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
3320 mutex_unlock(&dev->struct_mutex);
3321 }
3322}
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332static void i9xx_crtc_prepare(struct drm_crtc *crtc)
3333{
3334 i9xx_crtc_disable(crtc);
3335}
3336
3337static void i9xx_crtc_commit(struct drm_crtc *crtc)
3338{
3339 i9xx_crtc_enable(crtc);
3340}
3341
3342static void ironlake_crtc_prepare(struct drm_crtc *crtc)
3343{
3344 ironlake_crtc_disable(crtc);
3345}
3346
3347static void ironlake_crtc_commit(struct drm_crtc *crtc)
3348{
3349 ironlake_crtc_enable(crtc);
3350}
3351
3352void intel_encoder_prepare(struct drm_encoder *encoder)
3353{
3354 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
3355
3356 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
3357}
3358
3359void intel_encoder_commit(struct drm_encoder *encoder)
3360{
3361 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
3362 struct drm_device *dev = encoder->dev;
3363 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
3364 struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
3365
3366
3367 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
3368
3369 if (HAS_PCH_CPT(dev))
3370 intel_cpt_verify_modeset(dev, intel_crtc->pipe);
3371}
3372
3373void intel_encoder_destroy(struct drm_encoder *encoder)
3374{
3375 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
3376
3377 drm_encoder_cleanup(encoder);
3378 kfree(intel_encoder);
3379}
3380
3381static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
3382 struct drm_display_mode *mode,
3383 struct drm_display_mode *adjusted_mode)
3384{
3385 struct drm_device *dev = crtc->dev;
3386
3387 if (HAS_PCH_SPLIT(dev)) {
3388
3389 if (mode->clock * 3 > IRONLAKE_FDI_FREQ * 4)
3390 return false;
3391 }
3392
3393
3394
3395
3396 if (adjusted_mode->crtc_htotal == 0)
3397 drm_mode_set_crtcinfo(adjusted_mode, 0);
3398
3399 return true;
3400}
3401
3402static int i945_get_display_clock_speed(struct drm_device *dev)
3403{
3404 return 400000;
3405}
3406
3407static int i915_get_display_clock_speed(struct drm_device *dev)
3408{
3409 return 333000;
3410}
3411
3412static int i9xx_misc_get_display_clock_speed(struct drm_device *dev)
3413{
3414 return 200000;
3415}
3416
3417static int i915gm_get_display_clock_speed(struct drm_device *dev)
3418{
3419 u16 gcfgc = 0;
3420
3421 pci_read_config_word(dev->pdev, GCFGC, &gcfgc);
3422
3423 if (gcfgc & GC_LOW_FREQUENCY_ENABLE)
3424 return 133000;
3425 else {
3426 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
3427 case GC_DISPLAY_CLOCK_333_MHZ:
3428 return 333000;
3429 default:
3430 case GC_DISPLAY_CLOCK_190_200_MHZ:
3431 return 190000;
3432 }
3433 }
3434}
3435
3436static int i865_get_display_clock_speed(struct drm_device *dev)
3437{
3438 return 266000;
3439}
3440
3441static int i855_get_display_clock_speed(struct drm_device *dev)
3442{
3443 u16 hpllcc = 0;
3444
3445
3446
3447 switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
3448 case GC_CLOCK_133_200:
3449 case GC_CLOCK_100_200:
3450 return 200000;
3451 case GC_CLOCK_166_250:
3452 return 250000;
3453 case GC_CLOCK_100_133:
3454 return 133000;
3455 }
3456
3457
3458 return 0;
3459}
3460
3461static int i830_get_display_clock_speed(struct drm_device *dev)
3462{
3463 return 133000;
3464}
3465
3466struct fdi_m_n {
3467 u32 tu;
3468 u32 gmch_m;
3469 u32 gmch_n;
3470 u32 link_m;
3471 u32 link_n;
3472};
3473
3474static void
3475fdi_reduce_ratio(u32 *num, u32 *den)
3476{
3477 while (*num > 0xffffff || *den > 0xffffff) {
3478 *num >>= 1;
3479 *den >>= 1;
3480 }
3481}
3482
3483static void
3484ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock,
3485 int link_clock, struct fdi_m_n *m_n)
3486{
3487 m_n->tu = 64;
3488
3489
3490 m_n->gmch_m = bits_per_pixel * pixel_clock;
3491 m_n->gmch_n = link_clock * nlanes * 8;
3492 fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n);
3493
3494 m_n->link_m = pixel_clock;
3495 m_n->link_n = link_clock;
3496 fdi_reduce_ratio(&m_n->link_m, &m_n->link_n);
3497}
3498
3499
3500struct intel_watermark_params {
3501 unsigned long fifo_size;
3502 unsigned long max_wm;
3503 unsigned long default_wm;
3504 unsigned long guard_size;
3505 unsigned long cacheline_size;
3506};
3507
3508
3509static const struct intel_watermark_params pineview_display_wm = {
3510 PINEVIEW_DISPLAY_FIFO,
3511 PINEVIEW_MAX_WM,
3512 PINEVIEW_DFT_WM,
3513 PINEVIEW_GUARD_WM,
3514 PINEVIEW_FIFO_LINE_SIZE
3515};
3516static const struct intel_watermark_params pineview_display_hplloff_wm = {
3517 PINEVIEW_DISPLAY_FIFO,
3518 PINEVIEW_MAX_WM,
3519 PINEVIEW_DFT_HPLLOFF_WM,
3520 PINEVIEW_GUARD_WM,
3521 PINEVIEW_FIFO_LINE_SIZE
3522};
3523static const struct intel_watermark_params pineview_cursor_wm = {
3524 PINEVIEW_CURSOR_FIFO,
3525 PINEVIEW_CURSOR_MAX_WM,
3526 PINEVIEW_CURSOR_DFT_WM,
3527 PINEVIEW_CURSOR_GUARD_WM,
3528 PINEVIEW_FIFO_LINE_SIZE,
3529};
3530static const struct intel_watermark_params pineview_cursor_hplloff_wm = {
3531 PINEVIEW_CURSOR_FIFO,
3532 PINEVIEW_CURSOR_MAX_WM,
3533 PINEVIEW_CURSOR_DFT_WM,
3534 PINEVIEW_CURSOR_GUARD_WM,
3535 PINEVIEW_FIFO_LINE_SIZE
3536};
3537static const struct intel_watermark_params g4x_wm_info = {
3538 G4X_FIFO_SIZE,
3539 G4X_MAX_WM,
3540 G4X_MAX_WM,
3541 2,
3542 G4X_FIFO_LINE_SIZE,
3543};
3544static const struct intel_watermark_params g4x_cursor_wm_info = {
3545 I965_CURSOR_FIFO,
3546 I965_CURSOR_MAX_WM,
3547 I965_CURSOR_DFT_WM,
3548 2,
3549 G4X_FIFO_LINE_SIZE,
3550};
3551static const struct intel_watermark_params i965_cursor_wm_info = {
3552 I965_CURSOR_FIFO,
3553 I965_CURSOR_MAX_WM,
3554 I965_CURSOR_DFT_WM,
3555 2,
3556 I915_FIFO_LINE_SIZE,
3557};
3558static const struct intel_watermark_params i945_wm_info = {
3559 I945_FIFO_SIZE,
3560 I915_MAX_WM,
3561 1,
3562 2,
3563 I915_FIFO_LINE_SIZE
3564};
3565static const struct intel_watermark_params i915_wm_info = {
3566 I915_FIFO_SIZE,
3567 I915_MAX_WM,
3568 1,
3569 2,
3570 I915_FIFO_LINE_SIZE
3571};
3572static const struct intel_watermark_params i855_wm_info = {
3573 I855GM_FIFO_SIZE,
3574 I915_MAX_WM,
3575 1,
3576 2,
3577 I830_FIFO_LINE_SIZE
3578};
3579static const struct intel_watermark_params i830_wm_info = {
3580 I830_FIFO_SIZE,
3581 I915_MAX_WM,
3582 1,
3583 2,
3584 I830_FIFO_LINE_SIZE
3585};
3586
3587static const struct intel_watermark_params ironlake_display_wm_info = {
3588 ILK_DISPLAY_FIFO,
3589 ILK_DISPLAY_MAXWM,
3590 ILK_DISPLAY_DFTWM,
3591 2,
3592 ILK_FIFO_LINE_SIZE
3593};
3594static const struct intel_watermark_params ironlake_cursor_wm_info = {
3595 ILK_CURSOR_FIFO,
3596 ILK_CURSOR_MAXWM,
3597 ILK_CURSOR_DFTWM,
3598 2,
3599 ILK_FIFO_LINE_SIZE
3600};
3601static const struct intel_watermark_params ironlake_display_srwm_info = {
3602 ILK_DISPLAY_SR_FIFO,
3603 ILK_DISPLAY_MAX_SRWM,
3604 ILK_DISPLAY_DFT_SRWM,
3605 2,
3606 ILK_FIFO_LINE_SIZE
3607};
3608static const struct intel_watermark_params ironlake_cursor_srwm_info = {
3609 ILK_CURSOR_SR_FIFO,
3610 ILK_CURSOR_MAX_SRWM,
3611 ILK_CURSOR_DFT_SRWM,
3612 2,
3613 ILK_FIFO_LINE_SIZE
3614};
3615
3616static const struct intel_watermark_params sandybridge_display_wm_info = {
3617 SNB_DISPLAY_FIFO,
3618 SNB_DISPLAY_MAXWM,
3619 SNB_DISPLAY_DFTWM,
3620 2,
3621 SNB_FIFO_LINE_SIZE
3622};
3623static const struct intel_watermark_params sandybridge_cursor_wm_info = {
3624 SNB_CURSOR_FIFO,
3625 SNB_CURSOR_MAXWM,
3626 SNB_CURSOR_DFTWM,
3627 2,
3628 SNB_FIFO_LINE_SIZE
3629};
3630static const struct intel_watermark_params sandybridge_display_srwm_info = {
3631 SNB_DISPLAY_SR_FIFO,
3632 SNB_DISPLAY_MAX_SRWM,
3633 SNB_DISPLAY_DFT_SRWM,
3634 2,
3635 SNB_FIFO_LINE_SIZE
3636};
3637static const struct intel_watermark_params sandybridge_cursor_srwm_info = {
3638 SNB_CURSOR_SR_FIFO,
3639 SNB_CURSOR_MAX_SRWM,
3640 SNB_CURSOR_DFT_SRWM,
3641 2,
3642 SNB_FIFO_LINE_SIZE
3643};
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
3665 const struct intel_watermark_params *wm,
3666 int fifo_size,
3667 int pixel_size,
3668 unsigned long latency_ns)
3669{
3670 long entries_required, wm_size;
3671
3672
3673
3674
3675
3676
3677
3678 entries_required = ((clock_in_khz / 1000) * pixel_size * latency_ns) /
3679 1000;
3680 entries_required = DIV_ROUND_UP(entries_required, wm->cacheline_size);
3681
3682 DRM_DEBUG_KMS("FIFO entries required for mode: %ld\n", entries_required);
3683
3684 wm_size = fifo_size - (entries_required + wm->guard_size);
3685
3686 DRM_DEBUG_KMS("FIFO watermark level: %ld\n", wm_size);
3687
3688
3689 if (wm_size > (long)wm->max_wm)
3690 wm_size = wm->max_wm;
3691 if (wm_size <= 0)
3692 wm_size = wm->default_wm;
3693 return wm_size;
3694}
3695
3696struct cxsr_latency {
3697 int is_desktop;
3698 int is_ddr3;
3699 unsigned long fsb_freq;
3700 unsigned long mem_freq;
3701 unsigned long display_sr;
3702 unsigned long display_hpll_disable;
3703 unsigned long cursor_sr;
3704 unsigned long cursor_hpll_disable;
3705};
3706
3707static const struct cxsr_latency cxsr_latency_table[] = {
3708 {1, 0, 800, 400, 3382, 33382, 3983, 33983},
3709 {1, 0, 800, 667, 3354, 33354, 3807, 33807},
3710 {1, 0, 800, 800, 3347, 33347, 3763, 33763},
3711 {1, 1, 800, 667, 6420, 36420, 6873, 36873},
3712 {1, 1, 800, 800, 5902, 35902, 6318, 36318},
3713
3714 {1, 0, 667, 400, 3400, 33400, 4021, 34021},
3715 {1, 0, 667, 667, 3372, 33372, 3845, 33845},
3716 {1, 0, 667, 800, 3386, 33386, 3822, 33822},
3717 {1, 1, 667, 667, 6438, 36438, 6911, 36911},
3718 {1, 1, 667, 800, 5941, 35941, 6377, 36377},
3719
3720 {1, 0, 400, 400, 3472, 33472, 4173, 34173},
3721 {1, 0, 400, 667, 3443, 33443, 3996, 33996},
3722 {1, 0, 400, 800, 3430, 33430, 3946, 33946},
3723 {1, 1, 400, 667, 6509, 36509, 7062, 37062},
3724 {1, 1, 400, 800, 5985, 35985, 6501, 36501},
3725
3726 {0, 0, 800, 400, 3438, 33438, 4065, 34065},
3727 {0, 0, 800, 667, 3410, 33410, 3889, 33889},
3728 {0, 0, 800, 800, 3403, 33403, 3845, 33845},
3729 {0, 1, 800, 667, 6476, 36476, 6955, 36955},
3730 {0, 1, 800, 800, 5958, 35958, 6400, 36400},
3731
3732 {0, 0, 667, 400, 3456, 33456, 4103, 34106},
3733 {0, 0, 667, 667, 3428, 33428, 3927, 33927},
3734 {0, 0, 667, 800, 3443, 33443, 3905, 33905},
3735 {0, 1, 667, 667, 6494, 36494, 6993, 36993},
3736 {0, 1, 667, 800, 5998, 35998, 6460, 36460},
3737
3738 {0, 0, 400, 400, 3528, 33528, 4255, 34255},
3739 {0, 0, 400, 667, 3500, 33500, 4079, 34079},
3740 {0, 0, 400, 800, 3487, 33487, 4029, 34029},
3741 {0, 1, 400, 667, 6566, 36566, 7145, 37145},
3742 {0, 1, 400, 800, 6042, 36042, 6584, 36584},
3743};
3744
3745static const struct cxsr_latency *intel_get_cxsr_latency(int is_desktop,
3746 int is_ddr3,
3747 int fsb,
3748 int mem)
3749{
3750 const struct cxsr_latency *latency;
3751 int i;
3752
3753 if (fsb == 0 || mem == 0)
3754 return NULL;
3755
3756 for (i = 0; i < ARRAY_SIZE(cxsr_latency_table); i++) {
3757 latency = &cxsr_latency_table[i];
3758 if (is_desktop == latency->is_desktop &&
3759 is_ddr3 == latency->is_ddr3 &&
3760 fsb == latency->fsb_freq && mem == latency->mem_freq)
3761 return latency;
3762 }
3763
3764 DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n");
3765
3766 return NULL;
3767}
3768
3769static void pineview_disable_cxsr(struct drm_device *dev)
3770{
3771 struct drm_i915_private *dev_priv = dev->dev_private;
3772
3773
3774 I915_WRITE(DSPFW3, I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN);
3775}
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791static const int latency_ns = 5000;
3792
3793static int i9xx_get_fifo_size(struct drm_device *dev, int plane)
3794{
3795 struct drm_i915_private *dev_priv = dev->dev_private;
3796 uint32_t dsparb = I915_READ(DSPARB);
3797 int size;
3798
3799 size = dsparb & 0x7f;
3800 if (plane)
3801 size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - size;
3802
3803 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
3804 plane ? "B" : "A", size);
3805
3806 return size;
3807}
3808
3809static int i85x_get_fifo_size(struct drm_device *dev, int plane)
3810{
3811 struct drm_i915_private *dev_priv = dev->dev_private;
3812 uint32_t dsparb = I915_READ(DSPARB);
3813 int size;
3814
3815 size = dsparb & 0x1ff;
3816 if (plane)
3817 size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) - size;
3818 size >>= 1;
3819
3820 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
3821 plane ? "B" : "A", size);
3822
3823 return size;
3824}
3825
3826static int i845_get_fifo_size(struct drm_device *dev, int plane)
3827{
3828 struct drm_i915_private *dev_priv = dev->dev_private;
3829 uint32_t dsparb = I915_READ(DSPARB);
3830 int size;
3831
3832 size = dsparb & 0x7f;
3833 size >>= 2;
3834
3835 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
3836 plane ? "B" : "A",
3837 size);
3838
3839 return size;
3840}
3841
3842static int i830_get_fifo_size(struct drm_device *dev, int plane)
3843{
3844 struct drm_i915_private *dev_priv = dev->dev_private;
3845 uint32_t dsparb = I915_READ(DSPARB);
3846 int size;
3847
3848 size = dsparb & 0x7f;
3849 size >>= 1;
3850
3851 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
3852 plane ? "B" : "A", size);
3853
3854 return size;
3855}
3856
3857static struct drm_crtc *single_enabled_crtc(struct drm_device *dev)
3858{
3859 struct drm_crtc *crtc, *enabled = NULL;
3860
3861 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
3862 if (crtc->enabled && crtc->fb) {
3863 if (enabled)
3864 return NULL;
3865 enabled = crtc;
3866 }
3867 }
3868
3869 return enabled;
3870}
3871
3872static void pineview_update_wm(struct drm_device *dev)
3873{
3874 struct drm_i915_private *dev_priv = dev->dev_private;
3875 struct drm_crtc *crtc;
3876 const struct cxsr_latency *latency;
3877 u32 reg;
3878 unsigned long wm;
3879
3880 latency = intel_get_cxsr_latency(IS_PINEVIEW_G(dev), dev_priv->is_ddr3,
3881 dev_priv->fsb_freq, dev_priv->mem_freq);
3882 if (!latency) {
3883 DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n");
3884 pineview_disable_cxsr(dev);
3885 return;
3886 }
3887
3888 crtc = single_enabled_crtc(dev);
3889 if (crtc) {
3890 int clock = crtc->mode.clock;
3891 int pixel_size = crtc->fb->bits_per_pixel / 8;
3892
3893
3894 wm = intel_calculate_wm(clock, &pineview_display_wm,
3895 pineview_display_wm.fifo_size,
3896 pixel_size, latency->display_sr);
3897 reg = I915_READ(DSPFW1);
3898 reg &= ~DSPFW_SR_MASK;
3899 reg |= wm << DSPFW_SR_SHIFT;
3900 I915_WRITE(DSPFW1, reg);
3901 DRM_DEBUG_KMS("DSPFW1 register is %x\n", reg);
3902
3903
3904 wm = intel_calculate_wm(clock, &pineview_cursor_wm,
3905 pineview_display_wm.fifo_size,
3906 pixel_size, latency->cursor_sr);
3907 reg = I915_READ(DSPFW3);
3908 reg &= ~DSPFW_CURSOR_SR_MASK;
3909 reg |= (wm & 0x3f) << DSPFW_CURSOR_SR_SHIFT;
3910 I915_WRITE(DSPFW3, reg);
3911
3912
3913 wm = intel_calculate_wm(clock, &pineview_display_hplloff_wm,
3914 pineview_display_hplloff_wm.fifo_size,
3915 pixel_size, latency->display_hpll_disable);
3916 reg = I915_READ(DSPFW3);
3917 reg &= ~DSPFW_HPLL_SR_MASK;
3918 reg |= wm & DSPFW_HPLL_SR_MASK;
3919 I915_WRITE(DSPFW3, reg);
3920
3921
3922 wm = intel_calculate_wm(clock, &pineview_cursor_hplloff_wm,
3923 pineview_display_hplloff_wm.fifo_size,
3924 pixel_size, latency->cursor_hpll_disable);
3925 reg = I915_READ(DSPFW3);
3926 reg &= ~DSPFW_HPLL_CURSOR_MASK;
3927 reg |= (wm & 0x3f) << DSPFW_HPLL_CURSOR_SHIFT;
3928 I915_WRITE(DSPFW3, reg);
3929 DRM_DEBUG_KMS("DSPFW3 register is %x\n", reg);
3930
3931
3932 I915_WRITE(DSPFW3,
3933 I915_READ(DSPFW3) | PINEVIEW_SELF_REFRESH_EN);
3934 DRM_DEBUG_KMS("Self-refresh is enabled\n");
3935 } else {
3936 pineview_disable_cxsr(dev);
3937 DRM_DEBUG_KMS("Self-refresh is disabled\n");
3938 }
3939}
3940
3941static bool g4x_compute_wm0(struct drm_device *dev,
3942 int plane,
3943 const struct intel_watermark_params *display,
3944 int display_latency_ns,
3945 const struct intel_watermark_params *cursor,
3946 int cursor_latency_ns,
3947 int *plane_wm,
3948 int *cursor_wm)
3949{
3950 struct drm_crtc *crtc;
3951 int htotal, hdisplay, clock, pixel_size;
3952 int line_time_us, line_count;
3953 int entries, tlb_miss;
3954
3955 crtc = intel_get_crtc_for_plane(dev, plane);
3956 if (crtc->fb == NULL || !crtc->enabled) {
3957 *cursor_wm = cursor->guard_size;
3958 *plane_wm = display->guard_size;
3959 return false;
3960 }
3961
3962 htotal = crtc->mode.htotal;
3963 hdisplay = crtc->mode.hdisplay;
3964 clock = crtc->mode.clock;
3965 pixel_size = crtc->fb->bits_per_pixel / 8;
3966
3967
3968 entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000;
3969 tlb_miss = display->fifo_size*display->cacheline_size - hdisplay * 8;
3970 if (tlb_miss > 0)
3971 entries += tlb_miss;
3972 entries = DIV_ROUND_UP(entries, display->cacheline_size);
3973 *plane_wm = entries + display->guard_size;
3974 if (*plane_wm > (int)display->max_wm)
3975 *plane_wm = display->max_wm;
3976
3977
3978 line_time_us = ((htotal * 1000) / clock);
3979 line_count = (cursor_latency_ns / line_time_us + 1000) / 1000;
3980 entries = line_count * 64 * pixel_size;
3981 tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8;
3982 if (tlb_miss > 0)
3983 entries += tlb_miss;
3984 entries = DIV_ROUND_UP(entries, cursor->cacheline_size);
3985 *cursor_wm = entries + cursor->guard_size;
3986 if (*cursor_wm > (int)cursor->max_wm)
3987 *cursor_wm = (int)cursor->max_wm;
3988
3989 return true;
3990}
3991
3992
3993
3994
3995
3996
3997
3998
3999static bool g4x_check_srwm(struct drm_device *dev,
4000 int display_wm, int cursor_wm,
4001 const struct intel_watermark_params *display,
4002 const struct intel_watermark_params *cursor)
4003{
4004 DRM_DEBUG_KMS("SR watermark: display plane %d, cursor %d\n",
4005 display_wm, cursor_wm);
4006
4007 if (display_wm > display->max_wm) {
4008 DRM_DEBUG_KMS("display watermark is too large(%d/%ld), disabling\n",
4009 display_wm, display->max_wm);
4010 return false;
4011 }
4012
4013 if (cursor_wm > cursor->max_wm) {
4014 DRM_DEBUG_KMS("cursor watermark is too large(%d/%ld), disabling\n",
4015 cursor_wm, cursor->max_wm);
4016 return false;
4017 }
4018
4019 if (!(display_wm || cursor_wm)) {
4020 DRM_DEBUG_KMS("SR latency is 0, disabling\n");
4021 return false;
4022 }
4023
4024 return true;
4025}
4026
4027static bool g4x_compute_srwm(struct drm_device *dev,
4028 int plane,
4029 int latency_ns,
4030 const struct intel_watermark_params *display,
4031 const struct intel_watermark_params *cursor,
4032 int *display_wm, int *cursor_wm)
4033{
4034 struct drm_crtc *crtc;
4035 int hdisplay, htotal, pixel_size, clock;
4036 unsigned long line_time_us;
4037 int line_count, line_size;
4038 int small, large;
4039 int entries;
4040
4041 if (!latency_ns) {
4042 *display_wm = *cursor_wm = 0;
4043 return false;
4044 }
4045
4046 crtc = intel_get_crtc_for_plane(dev, plane);
4047 hdisplay = crtc->mode.hdisplay;
4048 htotal = crtc->mode.htotal;
4049 clock = crtc->mode.clock;
4050 pixel_size = crtc->fb->bits_per_pixel / 8;
4051
4052 line_time_us = (htotal * 1000) / clock;
4053 line_count = (latency_ns / line_time_us + 1000) / 1000;
4054 line_size = hdisplay * pixel_size;
4055
4056
4057 small = ((clock * pixel_size / 1000) * latency_ns) / 1000;
4058 large = line_count * line_size;
4059
4060 entries = DIV_ROUND_UP(min(small, large), display->cacheline_size);
4061 *display_wm = entries + display->guard_size;
4062
4063
4064 entries = line_count * pixel_size * 64;
4065 entries = DIV_ROUND_UP(entries, cursor->cacheline_size);
4066 *cursor_wm = entries + cursor->guard_size;
4067
4068 return g4x_check_srwm(dev,
4069 *display_wm, *cursor_wm,
4070 display, cursor);
4071}
4072
4073#define single_plane_enabled(mask) is_power_of_2(mask)
4074
4075static void g4x_update_wm(struct drm_device *dev)
4076{
4077 static const int sr_latency_ns = 12000;
4078 struct drm_i915_private *dev_priv = dev->dev_private;
4079 int planea_wm, planeb_wm, cursora_wm, cursorb_wm;
4080 int plane_sr, cursor_sr;
4081 unsigned int enabled = 0;
4082
4083 if (g4x_compute_wm0(dev, 0,
4084 &g4x_wm_info, latency_ns,
4085 &g4x_cursor_wm_info, latency_ns,
4086 &planea_wm, &cursora_wm))
4087 enabled |= 1;
4088
4089 if (g4x_compute_wm0(dev, 1,
4090 &g4x_wm_info, latency_ns,
4091 &g4x_cursor_wm_info, latency_ns,
4092 &planeb_wm, &cursorb_wm))
4093 enabled |= 2;
4094
4095 plane_sr = cursor_sr = 0;
4096 if (single_plane_enabled(enabled) &&
4097 g4x_compute_srwm(dev, ffs(enabled) - 1,
4098 sr_latency_ns,
4099 &g4x_wm_info,
4100 &g4x_cursor_wm_info,
4101 &plane_sr, &cursor_sr))
4102 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
4103 else
4104 I915_WRITE(FW_BLC_SELF,
4105 I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN);
4106
4107 DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n",
4108 planea_wm, cursora_wm,
4109 planeb_wm, cursorb_wm,
4110 plane_sr, cursor_sr);
4111
4112 I915_WRITE(DSPFW1,
4113 (plane_sr << DSPFW_SR_SHIFT) |
4114 (cursorb_wm << DSPFW_CURSORB_SHIFT) |
4115 (planeb_wm << DSPFW_PLANEB_SHIFT) |
4116 planea_wm);
4117 I915_WRITE(DSPFW2,
4118 (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) |
4119 (cursora_wm << DSPFW_CURSORA_SHIFT));
4120
4121 I915_WRITE(DSPFW3,
4122 (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) |
4123 (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
4124}
4125
4126static void i965_update_wm(struct drm_device *dev)
4127{
4128 struct drm_i915_private *dev_priv = dev->dev_private;
4129 struct drm_crtc *crtc;
4130 int srwm = 1;
4131 int cursor_sr = 16;
4132
4133
4134 crtc = single_enabled_crtc(dev);
4135 if (crtc) {
4136
4137 static const int sr_latency_ns = 12000;
4138 int clock = crtc->mode.clock;
4139 int htotal = crtc->mode.htotal;
4140 int hdisplay = crtc->mode.hdisplay;
4141 int pixel_size = crtc->fb->bits_per_pixel / 8;
4142 unsigned long line_time_us;
4143 int entries;
4144
4145 line_time_us = ((htotal * 1000) / clock);
4146
4147
4148 entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) *
4149 pixel_size * hdisplay;
4150 entries = DIV_ROUND_UP(entries, I915_FIFO_LINE_SIZE);
4151 srwm = I965_FIFO_SIZE - entries;
4152 if (srwm < 0)
4153 srwm = 1;
4154 srwm &= 0x1ff;
4155 DRM_DEBUG_KMS("self-refresh entries: %d, wm: %d\n",
4156 entries, srwm);
4157
4158 entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) *
4159 pixel_size * 64;
4160 entries = DIV_ROUND_UP(entries,
4161 i965_cursor_wm_info.cacheline_size);
4162 cursor_sr = i965_cursor_wm_info.fifo_size -
4163 (entries + i965_cursor_wm_info.guard_size);
4164
4165 if (cursor_sr > i965_cursor_wm_info.max_wm)
4166 cursor_sr = i965_cursor_wm_info.max_wm;
4167
4168 DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
4169 "cursor %d\n", srwm, cursor_sr);
4170
4171 if (IS_CRESTLINE(dev))
4172 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
4173 } else {
4174
4175 if (IS_CRESTLINE(dev))
4176 I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF)
4177 & ~FW_BLC_SELF_EN);
4178 }
4179
4180 DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n",
4181 srwm);
4182
4183
4184 I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) |
4185 (8 << 16) | (8 << 8) | (8 << 0));
4186 I915_WRITE(DSPFW2, (8 << 8) | (8 << 0));
4187
4188 I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
4189}
4190
4191static void i9xx_update_wm(struct drm_device *dev)
4192{
4193 struct drm_i915_private *dev_priv = dev->dev_private;
4194 const struct intel_watermark_params *wm_info;
4195 uint32_t fwater_lo;
4196 uint32_t fwater_hi;
4197 int cwm, srwm = 1;
4198 int fifo_size;
4199 int planea_wm, planeb_wm;
4200 struct drm_crtc *crtc, *enabled = NULL;
4201
4202 if (IS_I945GM(dev))
4203 wm_info = &i945_wm_info;
4204 else if (!IS_GEN2(dev))
4205 wm_info = &i915_wm_info;
4206 else
4207 wm_info = &i855_wm_info;
4208
4209 fifo_size = dev_priv->display.get_fifo_size(dev, 0);
4210 crtc = intel_get_crtc_for_plane(dev, 0);
4211 if (crtc->enabled && crtc->fb) {
4212 planea_wm = intel_calculate_wm(crtc->mode.clock,
4213 wm_info, fifo_size,
4214 crtc->fb->bits_per_pixel / 8,
4215 latency_ns);
4216 enabled = crtc;
4217 } else
4218 planea_wm = fifo_size - wm_info->guard_size;
4219
4220 fifo_size = dev_priv->display.get_fifo_size(dev, 1);
4221 crtc = intel_get_crtc_for_plane(dev, 1);
4222 if (crtc->enabled && crtc->fb) {
4223 planeb_wm = intel_calculate_wm(crtc->mode.clock,
4224 wm_info, fifo_size,
4225 crtc->fb->bits_per_pixel / 8,
4226 latency_ns);
4227 if (enabled == NULL)
4228 enabled = crtc;
4229 else
4230 enabled = NULL;
4231 } else
4232 planeb_wm = fifo_size - wm_info->guard_size;
4233
4234 DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm);
4235
4236
4237
4238
4239 cwm = 2;
4240
4241
4242 if (IS_I945G(dev) || IS_I945GM(dev))
4243 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | 0);
4244 else if (IS_I915GM(dev))
4245 I915_WRITE(INSTPM, I915_READ(INSTPM) & ~INSTPM_SELF_EN);
4246
4247
4248 if (HAS_FW_BLC(dev) && enabled) {
4249
4250 static const int sr_latency_ns = 6000;
4251 int clock = enabled->mode.clock;
4252 int htotal = enabled->mode.htotal;
4253 int hdisplay = enabled->mode.hdisplay;
4254 int pixel_size = enabled->fb->bits_per_pixel / 8;
4255 unsigned long line_time_us;
4256 int entries;
4257
4258 line_time_us = (htotal * 1000) / clock;
4259
4260
4261 entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) *
4262 pixel_size * hdisplay;
4263 entries = DIV_ROUND_UP(entries, wm_info->cacheline_size);
4264 DRM_DEBUG_KMS("self-refresh entries: %d\n", entries);
4265 srwm = wm_info->fifo_size - entries;
4266 if (srwm < 0)
4267 srwm = 1;
4268
4269 if (IS_I945G(dev) || IS_I945GM(dev))
4270 I915_WRITE(FW_BLC_SELF,
4271 FW_BLC_SELF_FIFO_MASK | (srwm & 0xff));
4272 else if (IS_I915GM(dev))
4273 I915_WRITE(FW_BLC_SELF, srwm & 0x3f);
4274 }
4275
4276 DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n",
4277 planea_wm, planeb_wm, cwm, srwm);
4278
4279 fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f);
4280 fwater_hi = (cwm & 0x1f);
4281
4282
4283 fwater_lo = fwater_lo | (1 << 24) | (1 << 8);
4284 fwater_hi = fwater_hi | (1 << 8);
4285
4286 I915_WRITE(FW_BLC, fwater_lo);
4287 I915_WRITE(FW_BLC2, fwater_hi);
4288
4289 if (HAS_FW_BLC(dev)) {
4290 if (enabled) {
4291 if (IS_I945G(dev) || IS_I945GM(dev))
4292 I915_WRITE(FW_BLC_SELF,
4293 FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN);
4294 else if (IS_I915GM(dev))
4295 I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN);
4296 DRM_DEBUG_KMS("memory self refresh enabled\n");
4297 } else
4298 DRM_DEBUG_KMS("memory self refresh disabled\n");
4299 }
4300}
4301
4302static void i830_update_wm(struct drm_device *dev)
4303{
4304 struct drm_i915_private *dev_priv = dev->dev_private;
4305 struct drm_crtc *crtc;
4306 uint32_t fwater_lo;
4307 int planea_wm;
4308
4309 crtc = single_enabled_crtc(dev);
4310 if (crtc == NULL)
4311 return;
4312
4313 planea_wm = intel_calculate_wm(crtc->mode.clock, &i830_wm_info,
4314 dev_priv->display.get_fifo_size(dev, 0),
4315 crtc->fb->bits_per_pixel / 8,
4316 latency_ns);
4317 fwater_lo = I915_READ(FW_BLC) & ~0xfff;
4318 fwater_lo |= (3<<8) | planea_wm;
4319
4320 DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d\n", planea_wm);
4321
4322 I915_WRITE(FW_BLC, fwater_lo);
4323}
4324
4325#define ILK_LP0_PLANE_LATENCY 700
4326#define ILK_LP0_CURSOR_LATENCY 1300
4327
4328
4329
4330
4331
4332
4333
4334
4335static bool ironlake_check_srwm(struct drm_device *dev, int level,
4336 int fbc_wm, int display_wm, int cursor_wm,
4337 const struct intel_watermark_params *display,
4338 const struct intel_watermark_params *cursor)
4339{
4340 struct drm_i915_private *dev_priv = dev->dev_private;
4341
4342 DRM_DEBUG_KMS("watermark %d: display plane %d, fbc lines %d,"
4343 " cursor %d\n", level, display_wm, fbc_wm, cursor_wm);
4344
4345 if (fbc_wm > SNB_FBC_MAX_SRWM) {
4346 DRM_DEBUG_KMS("fbc watermark(%d) is too large(%d), disabling wm%d+\n",
4347 fbc_wm, SNB_FBC_MAX_SRWM, level);
4348
4349
4350 I915_WRITE(DISP_ARB_CTL,
4351 I915_READ(DISP_ARB_CTL) | DISP_FBC_WM_DIS);
4352 return false;
4353 }
4354
4355 if (display_wm > display->max_wm) {
4356 DRM_DEBUG_KMS("display watermark(%d) is too large(%d), disabling wm%d+\n",
4357 display_wm, SNB_DISPLAY_MAX_SRWM, level);
4358 return false;
4359 }
4360
4361 if (cursor_wm > cursor->max_wm) {
4362 DRM_DEBUG_KMS("cursor watermark(%d) is too large(%d), disabling wm%d+\n",
4363 cursor_wm, SNB_CURSOR_MAX_SRWM, level);
4364 return false;
4365 }
4366
4367 if (!(fbc_wm || display_wm || cursor_wm)) {
4368 DRM_DEBUG_KMS("latency %d is 0, disabling wm%d+\n", level, level);
4369 return false;
4370 }
4371
4372 return true;
4373}
4374
4375
4376
4377
4378static bool ironlake_compute_srwm(struct drm_device *dev, int level, int plane,
4379 int latency_ns,
4380 const struct intel_watermark_params *display,
4381 const struct intel_watermark_params *cursor,
4382 int *fbc_wm, int *display_wm, int *cursor_wm)
4383{
4384 struct drm_crtc *crtc;
4385 unsigned long line_time_us;
4386 int hdisplay, htotal, pixel_size, clock;
4387 int line_count, line_size;
4388 int small, large;
4389 int entries;
4390
4391 if (!latency_ns) {
4392 *fbc_wm = *display_wm = *cursor_wm = 0;
4393 return false;
4394 }
4395
4396 crtc = intel_get_crtc_for_plane(dev, plane);
4397 hdisplay = crtc->mode.hdisplay;
4398 htotal = crtc->mode.htotal;
4399 clock = crtc->mode.clock;
4400 pixel_size = crtc->fb->bits_per_pixel / 8;
4401
4402 line_time_us = (htotal * 1000) / clock;
4403 line_count = (latency_ns / line_time_us + 1000) / 1000;
4404 line_size = hdisplay * pixel_size;
4405
4406
4407 small = ((clock * pixel_size / 1000) * latency_ns) / 1000;
4408 large = line_count * line_size;
4409
4410 entries = DIV_ROUND_UP(min(small, large), display->cacheline_size);
4411 *display_wm = entries + display->guard_size;
4412
4413
4414
4415
4416
4417 *fbc_wm = DIV_ROUND_UP(*display_wm * 64, line_size) + 2;
4418
4419
4420 entries = line_count * pixel_size * 64;
4421 entries = DIV_ROUND_UP(entries, cursor->cacheline_size);
4422 *cursor_wm = entries + cursor->guard_size;
4423
4424 return ironlake_check_srwm(dev, level,
4425 *fbc_wm, *display_wm, *cursor_wm,
4426 display, cursor);
4427}
4428
4429static void ironlake_update_wm(struct drm_device *dev)
4430{
4431 struct drm_i915_private *dev_priv = dev->dev_private;
4432 int fbc_wm, plane_wm, cursor_wm;
4433 unsigned int enabled;
4434
4435 enabled = 0;
4436 if (g4x_compute_wm0(dev, 0,
4437 &ironlake_display_wm_info,
4438 ILK_LP0_PLANE_LATENCY,
4439 &ironlake_cursor_wm_info,
4440 ILK_LP0_CURSOR_LATENCY,
4441 &plane_wm, &cursor_wm)) {
4442 I915_WRITE(WM0_PIPEA_ILK,
4443 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4444 DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
4445 " plane %d, " "cursor: %d\n",
4446 plane_wm, cursor_wm);
4447 enabled |= 1;
4448 }
4449
4450 if (g4x_compute_wm0(dev, 1,
4451 &ironlake_display_wm_info,
4452 ILK_LP0_PLANE_LATENCY,
4453 &ironlake_cursor_wm_info,
4454 ILK_LP0_CURSOR_LATENCY,
4455 &plane_wm, &cursor_wm)) {
4456 I915_WRITE(WM0_PIPEB_ILK,
4457 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4458 DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
4459 " plane %d, cursor: %d\n",
4460 plane_wm, cursor_wm);
4461 enabled |= 2;
4462 }
4463
4464
4465
4466
4467
4468 I915_WRITE(WM3_LP_ILK, 0);
4469 I915_WRITE(WM2_LP_ILK, 0);
4470 I915_WRITE(WM1_LP_ILK, 0);
4471
4472 if (!single_plane_enabled(enabled))
4473 return;
4474 enabled = ffs(enabled) - 1;
4475
4476
4477 if (!ironlake_compute_srwm(dev, 1, enabled,
4478 ILK_READ_WM1_LATENCY() * 500,
4479 &ironlake_display_srwm_info,
4480 &ironlake_cursor_srwm_info,
4481 &fbc_wm, &plane_wm, &cursor_wm))
4482 return;
4483
4484 I915_WRITE(WM1_LP_ILK,
4485 WM1_LP_SR_EN |
4486 (ILK_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4487 (fbc_wm << WM1_LP_FBC_SHIFT) |
4488 (plane_wm << WM1_LP_SR_SHIFT) |
4489 cursor_wm);
4490
4491
4492 if (!ironlake_compute_srwm(dev, 2, enabled,
4493 ILK_READ_WM2_LATENCY() * 500,
4494 &ironlake_display_srwm_info,
4495 &ironlake_cursor_srwm_info,
4496 &fbc_wm, &plane_wm, &cursor_wm))
4497 return;
4498
4499 I915_WRITE(WM2_LP_ILK,
4500 WM2_LP_EN |
4501 (ILK_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4502 (fbc_wm << WM1_LP_FBC_SHIFT) |
4503 (plane_wm << WM1_LP_SR_SHIFT) |
4504 cursor_wm);
4505
4506
4507
4508
4509
4510}
4511
4512static void sandybridge_update_wm(struct drm_device *dev)
4513{
4514 struct drm_i915_private *dev_priv = dev->dev_private;
4515 int latency = SNB_READ_WM0_LATENCY() * 100;
4516 int fbc_wm, plane_wm, cursor_wm;
4517 unsigned int enabled;
4518
4519 enabled = 0;
4520 if (g4x_compute_wm0(dev, 0,
4521 &sandybridge_display_wm_info, latency,
4522 &sandybridge_cursor_wm_info, latency,
4523 &plane_wm, &cursor_wm)) {
4524 I915_WRITE(WM0_PIPEA_ILK,
4525 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4526 DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
4527 " plane %d, " "cursor: %d\n",
4528 plane_wm, cursor_wm);
4529 enabled |= 1;
4530 }
4531
4532 if (g4x_compute_wm0(dev, 1,
4533 &sandybridge_display_wm_info, latency,
4534 &sandybridge_cursor_wm_info, latency,
4535 &plane_wm, &cursor_wm)) {
4536 I915_WRITE(WM0_PIPEB_ILK,
4537 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4538 DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
4539 " plane %d, cursor: %d\n",
4540 plane_wm, cursor_wm);
4541 enabled |= 2;
4542 }
4543
4544
4545 if (IS_IVYBRIDGE(dev) &&
4546 g4x_compute_wm0(dev, 2,
4547 &sandybridge_display_wm_info, latency,
4548 &sandybridge_cursor_wm_info, latency,
4549 &plane_wm, &cursor_wm)) {
4550 I915_WRITE(WM0_PIPEC_IVB,
4551 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4552 DRM_DEBUG_KMS("FIFO watermarks For pipe C -"
4553 " plane %d, cursor: %d\n",
4554 plane_wm, cursor_wm);
4555 enabled |= 3;
4556 }
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568 I915_WRITE(WM3_LP_ILK, 0);
4569 I915_WRITE(WM2_LP_ILK, 0);
4570 I915_WRITE(WM1_LP_ILK, 0);
4571
4572 if (!single_plane_enabled(enabled))
4573 return;
4574 enabled = ffs(enabled) - 1;
4575
4576
4577 if (!ironlake_compute_srwm(dev, 1, enabled,
4578 SNB_READ_WM1_LATENCY() * 500,
4579 &sandybridge_display_srwm_info,
4580 &sandybridge_cursor_srwm_info,
4581 &fbc_wm, &plane_wm, &cursor_wm))
4582 return;
4583
4584 I915_WRITE(WM1_LP_ILK,
4585 WM1_LP_SR_EN |
4586 (SNB_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4587 (fbc_wm << WM1_LP_FBC_SHIFT) |
4588 (plane_wm << WM1_LP_SR_SHIFT) |
4589 cursor_wm);
4590
4591
4592 if (!ironlake_compute_srwm(dev, 2, enabled,
4593 SNB_READ_WM2_LATENCY() * 500,
4594 &sandybridge_display_srwm_info,
4595 &sandybridge_cursor_srwm_info,
4596 &fbc_wm, &plane_wm, &cursor_wm))
4597 return;
4598
4599 I915_WRITE(WM2_LP_ILK,
4600 WM2_LP_EN |
4601 (SNB_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4602 (fbc_wm << WM1_LP_FBC_SHIFT) |
4603 (plane_wm << WM1_LP_SR_SHIFT) |
4604 cursor_wm);
4605
4606
4607 if (!ironlake_compute_srwm(dev, 3, enabled,
4608 SNB_READ_WM3_LATENCY() * 500,
4609 &sandybridge_display_srwm_info,
4610 &sandybridge_cursor_srwm_info,
4611 &fbc_wm, &plane_wm, &cursor_wm))
4612 return;
4613
4614 I915_WRITE(WM3_LP_ILK,
4615 WM3_LP_EN |
4616 (SNB_READ_WM3_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4617 (fbc_wm << WM1_LP_FBC_SHIFT) |
4618 (plane_wm << WM1_LP_SR_SHIFT) |
4619 cursor_wm);
4620}
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654static void intel_update_watermarks(struct drm_device *dev)
4655{
4656 struct drm_i915_private *dev_priv = dev->dev_private;
4657
4658 if (dev_priv->display.update_wm)
4659 dev_priv->display.update_wm(dev);
4660}
4661
4662static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
4663{
4664 if (i915_panel_use_ssc >= 0)
4665 return i915_panel_use_ssc != 0;
4666 return dev_priv->lvds_use_ssc
4667 && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
4668}
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
4692 unsigned int *pipe_bpp,
4693 struct drm_display_mode *mode)
4694{
4695 struct drm_device *dev = crtc->dev;
4696 struct drm_i915_private *dev_priv = dev->dev_private;
4697 struct drm_encoder *encoder;
4698 struct drm_connector *connector;
4699 unsigned int display_bpc = UINT_MAX, bpc;
4700
4701
4702 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
4703 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
4704
4705 if (encoder->crtc != crtc)
4706 continue;
4707
4708 if (intel_encoder->type == INTEL_OUTPUT_LVDS) {
4709 unsigned int lvds_bpc;
4710
4711 if ((I915_READ(PCH_LVDS) & LVDS_A3_POWER_MASK) ==
4712 LVDS_A3_POWER_UP)
4713 lvds_bpc = 8;
4714 else
4715 lvds_bpc = 6;
4716
4717 if (lvds_bpc < display_bpc) {
4718 DRM_DEBUG_KMS("clamping display bpc (was %d) to LVDS (%d)\n", display_bpc, lvds_bpc);
4719 display_bpc = lvds_bpc;
4720 }
4721 continue;
4722 }
4723
4724 if (intel_encoder->type == INTEL_OUTPUT_EDP) {
4725
4726 unsigned int edp_bpc = dev_priv->edp.bpp / 3;
4727
4728 if (edp_bpc < display_bpc) {
4729 DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc);
4730 display_bpc = edp_bpc;
4731 }
4732 continue;
4733 }
4734
4735
4736 list_for_each_entry(connector, &dev->mode_config.connector_list,
4737 head) {
4738 if (connector->encoder != encoder)
4739 continue;
4740
4741
4742 if (connector->display_info.bpc &&
4743 connector->display_info.bpc < display_bpc) {
4744 DRM_DEBUG_KMS("clamping display bpc (was %d) to EDID reported max of %d\n", display_bpc, connector->display_info.bpc);
4745 display_bpc = connector->display_info.bpc;
4746 }
4747 }
4748
4749
4750
4751
4752
4753 if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
4754 if (display_bpc > 8 && display_bpc < 12) {
4755 DRM_DEBUG_KMS("forcing bpc to 12 for HDMI\n");
4756 display_bpc = 12;
4757 } else {
4758 DRM_DEBUG_KMS("forcing bpc to 8 for HDMI\n");
4759 display_bpc = 8;
4760 }
4761 }
4762 }
4763
4764 if (mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) {
4765 DRM_DEBUG_KMS("Dithering DP to 6bpc\n");
4766 display_bpc = 6;
4767 }
4768
4769
4770
4771
4772
4773
4774
4775
4776 switch (crtc->fb->depth) {
4777 case 8:
4778 bpc = 8;
4779 break;
4780 case 15:
4781 case 16:
4782 bpc = 6;
4783 break;
4784 case 24:
4785 bpc = 8;
4786 break;
4787 case 30:
4788 bpc = 10;
4789 break;
4790 case 48:
4791 bpc = 12;
4792 break;
4793 default:
4794 DRM_DEBUG("unsupported depth, assuming 24 bits\n");
4795 bpc = min((unsigned int)8, display_bpc);
4796 break;
4797 }
4798
4799 display_bpc = min(display_bpc, bpc);
4800
4801 DRM_DEBUG_KMS("setting pipe bpc to %d (max display bpc %d)\n",
4802 bpc, display_bpc);
4803
4804 *pipe_bpp = display_bpc * 3;
4805
4806 return display_bpc != bpc;
4807}
4808
4809static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
4810 struct drm_display_mode *mode,
4811 struct drm_display_mode *adjusted_mode,
4812 int x, int y,
4813 struct drm_framebuffer *old_fb)
4814{
4815 struct drm_device *dev = crtc->dev;
4816 struct drm_i915_private *dev_priv = dev->dev_private;
4817 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4818 int pipe = intel_crtc->pipe;
4819 int plane = intel_crtc->plane;
4820 int refclk, num_connectors = 0;
4821 intel_clock_t clock, reduced_clock;
4822 u32 dpll, fp = 0, fp2 = 0, dspcntr, pipeconf;
4823 bool ok, has_reduced_clock = false, is_sdvo = false, is_dvo = false;
4824 bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false;
4825 struct drm_mode_config *mode_config = &dev->mode_config;
4826 struct intel_encoder *encoder;
4827 const intel_limit_t *limit;
4828 int ret;
4829 u32 temp;
4830 u32 lvds_sync = 0;
4831
4832 list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
4833 if (encoder->base.crtc != crtc)
4834 continue;
4835
4836 switch (encoder->type) {
4837 case INTEL_OUTPUT_LVDS:
4838 is_lvds = true;
4839 break;
4840 case INTEL_OUTPUT_SDVO:
4841 case INTEL_OUTPUT_HDMI:
4842 is_sdvo = true;
4843 if (encoder->needs_tv_clock)
4844 is_tv = true;
4845 break;
4846 case INTEL_OUTPUT_DVO:
4847 is_dvo = true;
4848 break;
4849 case INTEL_OUTPUT_TVOUT:
4850 is_tv = true;
4851 break;
4852 case INTEL_OUTPUT_ANALOG:
4853 is_crt = true;
4854 break;
4855 case INTEL_OUTPUT_DISPLAYPORT:
4856 is_dp = true;
4857 break;
4858 }
4859
4860 num_connectors++;
4861 }
4862
4863 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
4864 refclk = dev_priv->lvds_ssc_freq * 1000;
4865 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
4866 refclk / 1000);
4867 } else if (!IS_GEN2(dev)) {
4868 refclk = 96000;
4869 } else {
4870 refclk = 48000;
4871 }
4872
4873
4874
4875
4876
4877
4878 limit = intel_limit(crtc, refclk);
4879 ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, &clock);
4880 if (!ok) {
4881 DRM_ERROR("Couldn't find PLL settings for mode!\n");
4882 return -EINVAL;
4883 }
4884
4885
4886 intel_crtc_update_cursor(crtc, true);
4887
4888 if (is_lvds && dev_priv->lvds_downclock_avail) {
4889 has_reduced_clock = limit->find_pll(limit, crtc,
4890 dev_priv->lvds_downclock,
4891 refclk,
4892 &reduced_clock);
4893 if (has_reduced_clock && (clock.p !=