blob: 6f7e4cc35d99add55151e470117b424df336d27c [file] [log] [blame]
Jesse Barnes79e53942008-11-07 14:24:08 -08001/*
2 * Copyright © 2006-2007 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 * Authors:
24 * Eric Anholt <eric@anholt.net>
25 */
26
Daniel Vetter618563e2012-04-01 13:38:50 +020027#include <linux/dmi.h>
Jesse Barnesc1c7af62009-09-10 15:28:03 -070028#include <linux/module.h>
29#include <linux/input.h>
Jesse Barnes79e53942008-11-07 14:24:08 -080030#include <linux/i2c.h>
Shaohua Li7662c8b2009-06-26 11:23:55 +080031#include <linux/kernel.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090032#include <linux/slab.h>
Jesse Barnes9cce37f2010-08-13 15:11:26 -070033#include <linux/vgaarb.h>
Wu Fengguange0dac652011-09-05 14:25:34 +080034#include <drm/drm_edid.h>
David Howells760285e2012-10-02 18:01:07 +010035#include <drm/drmP.h>
Jesse Barnes79e53942008-11-07 14:24:08 -080036#include "intel_drv.h"
David Howells760285e2012-10-02 18:01:07 +010037#include <drm/i915_drm.h>
Jesse Barnes79e53942008-11-07 14:24:08 -080038#include "i915_drv.h"
Jesse Barnese5510fa2010-07-01 16:48:37 -070039#include "i915_trace.h"
David Howells760285e2012-10-02 18:01:07 +010040#include <drm/drm_dp_helper.h>
41#include <drm/drm_crtc_helper.h>
Keith Packardc0f372b32011-11-16 22:24:52 -080042#include <linux/dma_remapping.h>
Jesse Barnes79e53942008-11-07 14:24:08 -080043
Akshay Joshi0206e352011-08-16 15:34:10 -040044bool intel_pipe_has_type(struct drm_crtc *crtc, int type);
Daniel Vetter3dec0092010-08-20 21:40:52 +020045static void intel_increase_pllclock(struct drm_crtc *crtc);
Chris Wilson6b383a72010-09-13 13:54:26 +010046static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on);
Jesse Barnes79e53942008-11-07 14:24:08 -080047
48typedef struct {
Akshay Joshi0206e352011-08-16 15:34:10 -040049 /* given values */
50 int n;
51 int m1, m2;
52 int p1, p2;
53 /* derived values */
54 int dot;
55 int vco;
56 int m;
57 int p;
Jesse Barnes79e53942008-11-07 14:24:08 -080058} intel_clock_t;
59
60typedef struct {
Akshay Joshi0206e352011-08-16 15:34:10 -040061 int min, max;
Jesse Barnes79e53942008-11-07 14:24:08 -080062} intel_range_t;
63
64typedef struct {
Akshay Joshi0206e352011-08-16 15:34:10 -040065 int dot_limit;
66 int p2_slow, p2_fast;
Jesse Barnes79e53942008-11-07 14:24:08 -080067} intel_p2_t;
68
69#define INTEL_P2_NUM 2
Ma Lingd4906092009-03-18 20:13:27 +080070typedef struct intel_limit intel_limit_t;
71struct intel_limit {
Akshay Joshi0206e352011-08-16 15:34:10 -040072 intel_range_t dot, vco, n, m, m1, m2, p, p1;
73 intel_p2_t p2;
Ville Syrjäläf4808ab2013-02-28 19:19:44 +020074 /**
75 * find_pll() - Find the best values for the PLL
76 * @limit: limits for the PLL
77 * @crtc: current CRTC
78 * @target: target frequency in kHz
79 * @refclk: reference clock frequency in kHz
80 * @match_clock: if provided, @best_clock P divider must
81 * match the P divider from @match_clock
82 * used for LVDS downclocking
83 * @best_clock: best PLL values found
84 *
85 * Returns true on success, false on failure.
86 */
87 bool (*find_pll)(const intel_limit_t *limit,
88 struct drm_crtc *crtc,
89 int target, int refclk,
90 intel_clock_t *match_clock,
91 intel_clock_t *best_clock);
Ma Lingd4906092009-03-18 20:13:27 +080092};
Jesse Barnes79e53942008-11-07 14:24:08 -080093
Jesse Barnes2377b742010-07-07 14:06:43 -070094/* FDI */
95#define IRONLAKE_FDI_FREQ 2700000 /* in kHz for mode->clock */
96
Daniel Vetterd2acd212012-10-20 20:57:43 +020097int
98intel_pch_rawclk(struct drm_device *dev)
99{
100 struct drm_i915_private *dev_priv = dev->dev_private;
101
102 WARN_ON(!HAS_PCH_SPLIT(dev));
103
104 return I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK;
105}
106
Ma Lingd4906092009-03-18 20:13:27 +0800107static bool
108intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800109 int target, int refclk, intel_clock_t *match_clock,
110 intel_clock_t *best_clock);
Ma Lingd4906092009-03-18 20:13:27 +0800111static bool
112intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800113 int target, int refclk, intel_clock_t *match_clock,
114 intel_clock_t *best_clock);
Jesse Barnes79e53942008-11-07 14:24:08 -0800115
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700116static bool
117intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800118 int target, int refclk, intel_clock_t *match_clock,
119 intel_clock_t *best_clock);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +0800120static bool
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500121intel_find_pll_ironlake_dp(const intel_limit_t *, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800122 int target, int refclk, intel_clock_t *match_clock,
123 intel_clock_t *best_clock);
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700124
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700125static bool
126intel_vlv_find_best_pll(const intel_limit_t *limit, struct drm_crtc *crtc,
127 int target, int refclk, intel_clock_t *match_clock,
128 intel_clock_t *best_clock);
129
Chris Wilson021357a2010-09-07 20:54:59 +0100130static inline u32 /* units of 100MHz */
131intel_fdi_link_freq(struct drm_device *dev)
132{
Chris Wilson8b99e682010-10-13 09:59:17 +0100133 if (IS_GEN5(dev)) {
134 struct drm_i915_private *dev_priv = dev->dev_private;
135 return (I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2;
136 } else
137 return 27;
Chris Wilson021357a2010-09-07 20:54:59 +0100138}
139
Keith Packarde4b36692009-06-05 19:22:17 -0700140static const intel_limit_t intel_limits_i8xx_dvo = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400141 .dot = { .min = 25000, .max = 350000 },
142 .vco = { .min = 930000, .max = 1400000 },
143 .n = { .min = 3, .max = 16 },
144 .m = { .min = 96, .max = 140 },
145 .m1 = { .min = 18, .max = 26 },
146 .m2 = { .min = 6, .max = 16 },
147 .p = { .min = 4, .max = 128 },
148 .p1 = { .min = 2, .max = 33 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700149 .p2 = { .dot_limit = 165000,
150 .p2_slow = 4, .p2_fast = 2 },
Ma Lingd4906092009-03-18 20:13:27 +0800151 .find_pll = intel_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700152};
153
154static const intel_limit_t intel_limits_i8xx_lvds = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400155 .dot = { .min = 25000, .max = 350000 },
156 .vco = { .min = 930000, .max = 1400000 },
157 .n = { .min = 3, .max = 16 },
158 .m = { .min = 96, .max = 140 },
159 .m1 = { .min = 18, .max = 26 },
160 .m2 = { .min = 6, .max = 16 },
161 .p = { .min = 4, .max = 128 },
162 .p1 = { .min = 1, .max = 6 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700163 .p2 = { .dot_limit = 165000,
164 .p2_slow = 14, .p2_fast = 7 },
Ma Lingd4906092009-03-18 20:13:27 +0800165 .find_pll = intel_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700166};
Eric Anholt273e27c2011-03-30 13:01:10 -0700167
Keith Packarde4b36692009-06-05 19:22:17 -0700168static const intel_limit_t intel_limits_i9xx_sdvo = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400169 .dot = { .min = 20000, .max = 400000 },
170 .vco = { .min = 1400000, .max = 2800000 },
171 .n = { .min = 1, .max = 6 },
172 .m = { .min = 70, .max = 120 },
Patrik Jakobsson4f7dfb62013-02-13 22:20:22 +0100173 .m1 = { .min = 8, .max = 18 },
174 .m2 = { .min = 3, .max = 7 },
Akshay Joshi0206e352011-08-16 15:34:10 -0400175 .p = { .min = 5, .max = 80 },
176 .p1 = { .min = 1, .max = 8 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700177 .p2 = { .dot_limit = 200000,
178 .p2_slow = 10, .p2_fast = 5 },
Ma Lingd4906092009-03-18 20:13:27 +0800179 .find_pll = intel_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700180};
181
182static const intel_limit_t intel_limits_i9xx_lvds = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400183 .dot = { .min = 20000, .max = 400000 },
184 .vco = { .min = 1400000, .max = 2800000 },
185 .n = { .min = 1, .max = 6 },
186 .m = { .min = 70, .max = 120 },
Patrik Jakobsson53a7d2d2013-02-13 22:20:21 +0100187 .m1 = { .min = 8, .max = 18 },
188 .m2 = { .min = 3, .max = 7 },
Akshay Joshi0206e352011-08-16 15:34:10 -0400189 .p = { .min = 7, .max = 98 },
190 .p1 = { .min = 1, .max = 8 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700191 .p2 = { .dot_limit = 112000,
192 .p2_slow = 14, .p2_fast = 7 },
Ma Lingd4906092009-03-18 20:13:27 +0800193 .find_pll = intel_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700194};
195
Eric Anholt273e27c2011-03-30 13:01:10 -0700196
Keith Packarde4b36692009-06-05 19:22:17 -0700197static const intel_limit_t intel_limits_g4x_sdvo = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700198 .dot = { .min = 25000, .max = 270000 },
199 .vco = { .min = 1750000, .max = 3500000},
200 .n = { .min = 1, .max = 4 },
201 .m = { .min = 104, .max = 138 },
202 .m1 = { .min = 17, .max = 23 },
203 .m2 = { .min = 5, .max = 11 },
204 .p = { .min = 10, .max = 30 },
205 .p1 = { .min = 1, .max = 3},
206 .p2 = { .dot_limit = 270000,
207 .p2_slow = 10,
208 .p2_fast = 10
Ma Ling044c7c42009-03-18 20:13:23 +0800209 },
Ma Lingd4906092009-03-18 20:13:27 +0800210 .find_pll = intel_g4x_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700211};
212
213static const intel_limit_t intel_limits_g4x_hdmi = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700214 .dot = { .min = 22000, .max = 400000 },
215 .vco = { .min = 1750000, .max = 3500000},
216 .n = { .min = 1, .max = 4 },
217 .m = { .min = 104, .max = 138 },
218 .m1 = { .min = 16, .max = 23 },
219 .m2 = { .min = 5, .max = 11 },
220 .p = { .min = 5, .max = 80 },
221 .p1 = { .min = 1, .max = 8},
222 .p2 = { .dot_limit = 165000,
223 .p2_slow = 10, .p2_fast = 5 },
Ma Lingd4906092009-03-18 20:13:27 +0800224 .find_pll = intel_g4x_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700225};
226
227static const intel_limit_t intel_limits_g4x_single_channel_lvds = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700228 .dot = { .min = 20000, .max = 115000 },
229 .vco = { .min = 1750000, .max = 3500000 },
230 .n = { .min = 1, .max = 3 },
231 .m = { .min = 104, .max = 138 },
232 .m1 = { .min = 17, .max = 23 },
233 .m2 = { .min = 5, .max = 11 },
234 .p = { .min = 28, .max = 112 },
235 .p1 = { .min = 2, .max = 8 },
236 .p2 = { .dot_limit = 0,
237 .p2_slow = 14, .p2_fast = 14
Ma Ling044c7c42009-03-18 20:13:23 +0800238 },
Ma Lingd4906092009-03-18 20:13:27 +0800239 .find_pll = intel_g4x_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700240};
241
242static const intel_limit_t intel_limits_g4x_dual_channel_lvds = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700243 .dot = { .min = 80000, .max = 224000 },
244 .vco = { .min = 1750000, .max = 3500000 },
245 .n = { .min = 1, .max = 3 },
246 .m = { .min = 104, .max = 138 },
247 .m1 = { .min = 17, .max = 23 },
248 .m2 = { .min = 5, .max = 11 },
249 .p = { .min = 14, .max = 42 },
250 .p1 = { .min = 2, .max = 6 },
251 .p2 = { .dot_limit = 0,
252 .p2_slow = 7, .p2_fast = 7
Ma Ling044c7c42009-03-18 20:13:23 +0800253 },
Ma Lingd4906092009-03-18 20:13:27 +0800254 .find_pll = intel_g4x_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700255};
256
257static const intel_limit_t intel_limits_g4x_display_port = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400258 .dot = { .min = 161670, .max = 227000 },
259 .vco = { .min = 1750000, .max = 3500000},
260 .n = { .min = 1, .max = 2 },
261 .m = { .min = 97, .max = 108 },
262 .m1 = { .min = 0x10, .max = 0x12 },
263 .m2 = { .min = 0x05, .max = 0x06 },
264 .p = { .min = 10, .max = 20 },
265 .p1 = { .min = 1, .max = 2},
266 .p2 = { .dot_limit = 0,
Eric Anholt273e27c2011-03-30 13:01:10 -0700267 .p2_slow = 10, .p2_fast = 10 },
Akshay Joshi0206e352011-08-16 15:34:10 -0400268 .find_pll = intel_find_pll_g4x_dp,
Keith Packarde4b36692009-06-05 19:22:17 -0700269};
270
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500271static const intel_limit_t intel_limits_pineview_sdvo = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400272 .dot = { .min = 20000, .max = 400000},
273 .vco = { .min = 1700000, .max = 3500000 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700274 /* Pineview's Ncounter is a ring counter */
Akshay Joshi0206e352011-08-16 15:34:10 -0400275 .n = { .min = 3, .max = 6 },
276 .m = { .min = 2, .max = 256 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700277 /* Pineview only has one combined m divider, which we treat as m2. */
Akshay Joshi0206e352011-08-16 15:34:10 -0400278 .m1 = { .min = 0, .max = 0 },
279 .m2 = { .min = 0, .max = 254 },
280 .p = { .min = 5, .max = 80 },
281 .p1 = { .min = 1, .max = 8 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700282 .p2 = { .dot_limit = 200000,
283 .p2_slow = 10, .p2_fast = 5 },
Shaohua Li61157072009-04-03 15:24:43 +0800284 .find_pll = intel_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700285};
286
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500287static const intel_limit_t intel_limits_pineview_lvds = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400288 .dot = { .min = 20000, .max = 400000 },
289 .vco = { .min = 1700000, .max = 3500000 },
290 .n = { .min = 3, .max = 6 },
291 .m = { .min = 2, .max = 256 },
292 .m1 = { .min = 0, .max = 0 },
293 .m2 = { .min = 0, .max = 254 },
294 .p = { .min = 7, .max = 112 },
295 .p1 = { .min = 1, .max = 8 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700296 .p2 = { .dot_limit = 112000,
297 .p2_slow = 14, .p2_fast = 14 },
Shaohua Li61157072009-04-03 15:24:43 +0800298 .find_pll = intel_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700299};
300
Eric Anholt273e27c2011-03-30 13:01:10 -0700301/* Ironlake / Sandybridge
302 *
303 * We calculate clock using (register_value + 2) for N/M1/M2, so here
304 * the range value for them is (actual_value - 2).
305 */
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800306static const intel_limit_t intel_limits_ironlake_dac = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700307 .dot = { .min = 25000, .max = 350000 },
308 .vco = { .min = 1760000, .max = 3510000 },
309 .n = { .min = 1, .max = 5 },
310 .m = { .min = 79, .max = 127 },
311 .m1 = { .min = 12, .max = 22 },
312 .m2 = { .min = 5, .max = 9 },
313 .p = { .min = 5, .max = 80 },
314 .p1 = { .min = 1, .max = 8 },
315 .p2 = { .dot_limit = 225000,
316 .p2_slow = 10, .p2_fast = 5 },
Zhao Yakui45476682009-12-31 16:06:04 +0800317 .find_pll = intel_g4x_find_best_PLL,
Keith Packarde4b36692009-06-05 19:22:17 -0700318};
319
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800320static const intel_limit_t intel_limits_ironlake_single_lvds = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700321 .dot = { .min = 25000, .max = 350000 },
322 .vco = { .min = 1760000, .max = 3510000 },
323 .n = { .min = 1, .max = 3 },
324 .m = { .min = 79, .max = 118 },
325 .m1 = { .min = 12, .max = 22 },
326 .m2 = { .min = 5, .max = 9 },
327 .p = { .min = 28, .max = 112 },
328 .p1 = { .min = 2, .max = 8 },
329 .p2 = { .dot_limit = 225000,
330 .p2_slow = 14, .p2_fast = 14 },
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800331 .find_pll = intel_g4x_find_best_PLL,
332};
333
334static const intel_limit_t intel_limits_ironlake_dual_lvds = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700335 .dot = { .min = 25000, .max = 350000 },
336 .vco = { .min = 1760000, .max = 3510000 },
337 .n = { .min = 1, .max = 3 },
338 .m = { .min = 79, .max = 127 },
339 .m1 = { .min = 12, .max = 22 },
340 .m2 = { .min = 5, .max = 9 },
341 .p = { .min = 14, .max = 56 },
342 .p1 = { .min = 2, .max = 8 },
343 .p2 = { .dot_limit = 225000,
344 .p2_slow = 7, .p2_fast = 7 },
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800345 .find_pll = intel_g4x_find_best_PLL,
346};
347
Eric Anholt273e27c2011-03-30 13:01:10 -0700348/* LVDS 100mhz refclk limits. */
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800349static const intel_limit_t intel_limits_ironlake_single_lvds_100m = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700350 .dot = { .min = 25000, .max = 350000 },
351 .vco = { .min = 1760000, .max = 3510000 },
352 .n = { .min = 1, .max = 2 },
353 .m = { .min = 79, .max = 126 },
354 .m1 = { .min = 12, .max = 22 },
355 .m2 = { .min = 5, .max = 9 },
356 .p = { .min = 28, .max = 112 },
Akshay Joshi0206e352011-08-16 15:34:10 -0400357 .p1 = { .min = 2, .max = 8 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700358 .p2 = { .dot_limit = 225000,
359 .p2_slow = 14, .p2_fast = 14 },
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800360 .find_pll = intel_g4x_find_best_PLL,
361};
362
363static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = {
Eric Anholt273e27c2011-03-30 13:01:10 -0700364 .dot = { .min = 25000, .max = 350000 },
365 .vco = { .min = 1760000, .max = 3510000 },
366 .n = { .min = 1, .max = 3 },
367 .m = { .min = 79, .max = 126 },
368 .m1 = { .min = 12, .max = 22 },
369 .m2 = { .min = 5, .max = 9 },
370 .p = { .min = 14, .max = 42 },
Akshay Joshi0206e352011-08-16 15:34:10 -0400371 .p1 = { .min = 2, .max = 6 },
Eric Anholt273e27c2011-03-30 13:01:10 -0700372 .p2 = { .dot_limit = 225000,
373 .p2_slow = 7, .p2_fast = 7 },
Zhao Yakui45476682009-12-31 16:06:04 +0800374 .find_pll = intel_g4x_find_best_PLL,
375};
376
377static const intel_limit_t intel_limits_ironlake_display_port = {
Akshay Joshi0206e352011-08-16 15:34:10 -0400378 .dot = { .min = 25000, .max = 350000 },
379 .vco = { .min = 1760000, .max = 3510000},
380 .n = { .min = 1, .max = 2 },
381 .m = { .min = 81, .max = 90 },
382 .m1 = { .min = 12, .max = 22 },
383 .m2 = { .min = 5, .max = 9 },
384 .p = { .min = 10, .max = 20 },
385 .p1 = { .min = 1, .max = 2},
386 .p2 = { .dot_limit = 0,
Eric Anholt273e27c2011-03-30 13:01:10 -0700387 .p2_slow = 10, .p2_fast = 10 },
Akshay Joshi0206e352011-08-16 15:34:10 -0400388 .find_pll = intel_find_pll_ironlake_dp,
Jesse Barnes79e53942008-11-07 14:24:08 -0800389};
390
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700391static const intel_limit_t intel_limits_vlv_dac = {
392 .dot = { .min = 25000, .max = 270000 },
393 .vco = { .min = 4000000, .max = 6000000 },
394 .n = { .min = 1, .max = 7 },
395 .m = { .min = 22, .max = 450 }, /* guess */
396 .m1 = { .min = 2, .max = 3 },
397 .m2 = { .min = 11, .max = 156 },
398 .p = { .min = 10, .max = 30 },
Daniel Vetter75e53982013-04-18 21:10:43 +0200399 .p1 = { .min = 1, .max = 3 },
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700400 .p2 = { .dot_limit = 270000,
401 .p2_slow = 2, .p2_fast = 20 },
402 .find_pll = intel_vlv_find_best_pll,
403};
404
405static const intel_limit_t intel_limits_vlv_hdmi = {
Daniel Vetter75e53982013-04-18 21:10:43 +0200406 .dot = { .min = 25000, .max = 270000 },
407 .vco = { .min = 4000000, .max = 6000000 },
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700408 .n = { .min = 1, .max = 7 },
409 .m = { .min = 60, .max = 300 }, /* guess */
410 .m1 = { .min = 2, .max = 3 },
411 .m2 = { .min = 11, .max = 156 },
412 .p = { .min = 10, .max = 30 },
413 .p1 = { .min = 2, .max = 3 },
414 .p2 = { .dot_limit = 270000,
415 .p2_slow = 2, .p2_fast = 20 },
416 .find_pll = intel_vlv_find_best_pll,
417};
418
419static const intel_limit_t intel_limits_vlv_dp = {
Vijay Purushothaman74a4dd22012-09-27 19:13:04 +0530420 .dot = { .min = 25000, .max = 270000 },
421 .vco = { .min = 4000000, .max = 6000000 },
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700422 .n = { .min = 1, .max = 7 },
Vijay Purushothaman74a4dd22012-09-27 19:13:04 +0530423 .m = { .min = 22, .max = 450 },
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700424 .m1 = { .min = 2, .max = 3 },
425 .m2 = { .min = 11, .max = 156 },
426 .p = { .min = 10, .max = 30 },
Daniel Vetter75e53982013-04-18 21:10:43 +0200427 .p1 = { .min = 1, .max = 3 },
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700428 .p2 = { .dot_limit = 270000,
429 .p2_slow = 2, .p2_fast = 20 },
430 .find_pll = intel_vlv_find_best_pll,
431};
432
Jesse Barnes57f350b2012-03-28 13:39:25 -0700433u32 intel_dpio_read(struct drm_i915_private *dev_priv, int reg)
434{
Daniel Vetter09153002012-12-12 14:06:44 +0100435 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
Jesse Barnes57f350b2012-03-28 13:39:25 -0700436
Jesse Barnes57f350b2012-03-28 13:39:25 -0700437 if (wait_for_atomic_us((I915_READ(DPIO_PKT) & DPIO_BUSY) == 0, 100)) {
438 DRM_ERROR("DPIO idle wait timed out\n");
Daniel Vetter09153002012-12-12 14:06:44 +0100439 return 0;
Jesse Barnes57f350b2012-03-28 13:39:25 -0700440 }
441
442 I915_WRITE(DPIO_REG, reg);
443 I915_WRITE(DPIO_PKT, DPIO_RID | DPIO_OP_READ | DPIO_PORTID |
444 DPIO_BYTE);
445 if (wait_for_atomic_us((I915_READ(DPIO_PKT) & DPIO_BUSY) == 0, 100)) {
446 DRM_ERROR("DPIO read wait timed out\n");
Daniel Vetter09153002012-12-12 14:06:44 +0100447 return 0;
Jesse Barnes57f350b2012-03-28 13:39:25 -0700448 }
Jesse Barnes57f350b2012-03-28 13:39:25 -0700449
Daniel Vetter09153002012-12-12 14:06:44 +0100450 return I915_READ(DPIO_DATA);
Jesse Barnes57f350b2012-03-28 13:39:25 -0700451}
452
Pallavi Ge2fa6fb2013-04-18 14:44:28 -0700453void intel_dpio_write(struct drm_i915_private *dev_priv, int reg, u32 val)
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700454{
Daniel Vetter09153002012-12-12 14:06:44 +0100455 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700456
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700457 if (wait_for_atomic_us((I915_READ(DPIO_PKT) & DPIO_BUSY) == 0, 100)) {
458 DRM_ERROR("DPIO idle wait timed out\n");
Daniel Vetter09153002012-12-12 14:06:44 +0100459 return;
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700460 }
461
462 I915_WRITE(DPIO_DATA, val);
463 I915_WRITE(DPIO_REG, reg);
464 I915_WRITE(DPIO_PKT, DPIO_RID | DPIO_OP_WRITE | DPIO_PORTID |
465 DPIO_BYTE);
466 if (wait_for_atomic_us((I915_READ(DPIO_PKT) & DPIO_BUSY) == 0, 100))
467 DRM_ERROR("DPIO write wait timed out\n");
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700468}
469
Chris Wilson1b894b52010-12-14 20:04:54 +0000470static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc,
471 int refclk)
Zhenyu Wang2c072452009-06-05 15:38:42 +0800472{
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800473 struct drm_device *dev = crtc->dev;
Zhenyu Wang2c072452009-06-05 15:38:42 +0800474 const intel_limit_t *limit;
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800475
476 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
Daniel Vetter1974cad2012-11-26 17:22:09 +0100477 if (intel_is_dual_link_lvds(dev)) {
Chris Wilson1b894b52010-12-14 20:04:54 +0000478 if (refclk == 100000)
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800479 limit = &intel_limits_ironlake_dual_lvds_100m;
480 else
481 limit = &intel_limits_ironlake_dual_lvds;
482 } else {
Chris Wilson1b894b52010-12-14 20:04:54 +0000483 if (refclk == 100000)
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800484 limit = &intel_limits_ironlake_single_lvds_100m;
485 else
486 limit = &intel_limits_ironlake_single_lvds;
487 }
488 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) ||
Jani Nikula547dc042012-11-02 11:24:03 +0200489 intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))
Zhao Yakui45476682009-12-31 16:06:04 +0800490 limit = &intel_limits_ironlake_display_port;
Zhenyu Wang2c072452009-06-05 15:38:42 +0800491 else
Zhenyu Wangb91ad0e2010-02-05 09:14:17 +0800492 limit = &intel_limits_ironlake_dac;
Zhenyu Wang2c072452009-06-05 15:38:42 +0800493
494 return limit;
495}
496
Ma Ling044c7c42009-03-18 20:13:23 +0800497static const intel_limit_t *intel_g4x_limit(struct drm_crtc *crtc)
498{
499 struct drm_device *dev = crtc->dev;
Ma Ling044c7c42009-03-18 20:13:23 +0800500 const intel_limit_t *limit;
501
502 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
Daniel Vetter1974cad2012-11-26 17:22:09 +0100503 if (intel_is_dual_link_lvds(dev))
Keith Packarde4b36692009-06-05 19:22:17 -0700504 limit = &intel_limits_g4x_dual_channel_lvds;
Ma Ling044c7c42009-03-18 20:13:23 +0800505 else
Keith Packarde4b36692009-06-05 19:22:17 -0700506 limit = &intel_limits_g4x_single_channel_lvds;
Ma Ling044c7c42009-03-18 20:13:23 +0800507 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_HDMI) ||
508 intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG)) {
Keith Packarde4b36692009-06-05 19:22:17 -0700509 limit = &intel_limits_g4x_hdmi;
Ma Ling044c7c42009-03-18 20:13:23 +0800510 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_SDVO)) {
Keith Packarde4b36692009-06-05 19:22:17 -0700511 limit = &intel_limits_g4x_sdvo;
Akshay Joshi0206e352011-08-16 15:34:10 -0400512 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
Keith Packarde4b36692009-06-05 19:22:17 -0700513 limit = &intel_limits_g4x_display_port;
Ma Ling044c7c42009-03-18 20:13:23 +0800514 } else /* The option is for other outputs */
Keith Packarde4b36692009-06-05 19:22:17 -0700515 limit = &intel_limits_i9xx_sdvo;
Ma Ling044c7c42009-03-18 20:13:23 +0800516
517 return limit;
518}
519
Chris Wilson1b894b52010-12-14 20:04:54 +0000520static const intel_limit_t *intel_limit(struct drm_crtc *crtc, int refclk)
Jesse Barnes79e53942008-11-07 14:24:08 -0800521{
522 struct drm_device *dev = crtc->dev;
523 const intel_limit_t *limit;
524
Eric Anholtbad720f2009-10-22 16:11:14 -0700525 if (HAS_PCH_SPLIT(dev))
Chris Wilson1b894b52010-12-14 20:04:54 +0000526 limit = intel_ironlake_limit(crtc, refclk);
Zhenyu Wang2c072452009-06-05 15:38:42 +0800527 else if (IS_G4X(dev)) {
Ma Ling044c7c42009-03-18 20:13:23 +0800528 limit = intel_g4x_limit(crtc);
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500529 } else if (IS_PINEVIEW(dev)) {
Shaohua Li21778322009-02-23 15:19:16 +0800530 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500531 limit = &intel_limits_pineview_lvds;
Shaohua Li21778322009-02-23 15:19:16 +0800532 else
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500533 limit = &intel_limits_pineview_sdvo;
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700534 } else if (IS_VALLEYVIEW(dev)) {
535 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG))
536 limit = &intel_limits_vlv_dac;
537 else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_HDMI))
538 limit = &intel_limits_vlv_hdmi;
539 else
540 limit = &intel_limits_vlv_dp;
Chris Wilsona6c45cf2010-09-17 00:32:17 +0100541 } else if (!IS_GEN2(dev)) {
542 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
543 limit = &intel_limits_i9xx_lvds;
544 else
545 limit = &intel_limits_i9xx_sdvo;
Jesse Barnes79e53942008-11-07 14:24:08 -0800546 } else {
547 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
Keith Packarde4b36692009-06-05 19:22:17 -0700548 limit = &intel_limits_i8xx_lvds;
Jesse Barnes79e53942008-11-07 14:24:08 -0800549 else
Keith Packarde4b36692009-06-05 19:22:17 -0700550 limit = &intel_limits_i8xx_dvo;
Jesse Barnes79e53942008-11-07 14:24:08 -0800551 }
552 return limit;
553}
554
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500555/* m1 is reserved as 0 in Pineview, n is a ring counter */
556static void pineview_clock(int refclk, intel_clock_t *clock)
Jesse Barnes79e53942008-11-07 14:24:08 -0800557{
Shaohua Li21778322009-02-23 15:19:16 +0800558 clock->m = clock->m2 + 2;
559 clock->p = clock->p1 * clock->p2;
560 clock->vco = refclk * clock->m / clock->n;
561 clock->dot = clock->vco / clock->p;
562}
563
564static void intel_clock(struct drm_device *dev, int refclk, intel_clock_t *clock)
565{
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500566 if (IS_PINEVIEW(dev)) {
567 pineview_clock(refclk, clock);
Shaohua Li21778322009-02-23 15:19:16 +0800568 return;
569 }
Jesse Barnes79e53942008-11-07 14:24:08 -0800570 clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2);
571 clock->p = clock->p1 * clock->p2;
572 clock->vco = refclk * clock->m / (clock->n + 2);
573 clock->dot = clock->vco / clock->p;
574}
575
Jesse Barnes79e53942008-11-07 14:24:08 -0800576/**
577 * Returns whether any output on the specified pipe is of the specified type
578 */
Chris Wilson4ef69c72010-09-09 15:14:28 +0100579bool intel_pipe_has_type(struct drm_crtc *crtc, int type)
Jesse Barnes79e53942008-11-07 14:24:08 -0800580{
Chris Wilson4ef69c72010-09-09 15:14:28 +0100581 struct drm_device *dev = crtc->dev;
Chris Wilson4ef69c72010-09-09 15:14:28 +0100582 struct intel_encoder *encoder;
Jesse Barnes79e53942008-11-07 14:24:08 -0800583
Daniel Vetter6c2b7c122012-07-05 09:50:24 +0200584 for_each_encoder_on_crtc(dev, crtc, encoder)
585 if (encoder->type == type)
Chris Wilson4ef69c72010-09-09 15:14:28 +0100586 return true;
587
588 return false;
Jesse Barnes79e53942008-11-07 14:24:08 -0800589}
590
Jesse Barnes7c04d1d2009-02-23 15:36:40 -0800591#define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0)
Jesse Barnes79e53942008-11-07 14:24:08 -0800592/**
593 * Returns whether the given set of divisors are valid for a given refclk with
594 * the given connectors.
595 */
596
Chris Wilson1b894b52010-12-14 20:04:54 +0000597static bool intel_PLL_is_valid(struct drm_device *dev,
598 const intel_limit_t *limit,
599 const intel_clock_t *clock)
Jesse Barnes79e53942008-11-07 14:24:08 -0800600{
Jesse Barnes79e53942008-11-07 14:24:08 -0800601 if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1)
Akshay Joshi0206e352011-08-16 15:34:10 -0400602 INTELPllInvalid("p1 out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800603 if (clock->p < limit->p.min || limit->p.max < clock->p)
Akshay Joshi0206e352011-08-16 15:34:10 -0400604 INTELPllInvalid("p out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800605 if (clock->m2 < limit->m2.min || limit->m2.max < clock->m2)
Akshay Joshi0206e352011-08-16 15:34:10 -0400606 INTELPllInvalid("m2 out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800607 if (clock->m1 < limit->m1.min || limit->m1.max < clock->m1)
Akshay Joshi0206e352011-08-16 15:34:10 -0400608 INTELPllInvalid("m1 out of range\n");
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500609 if (clock->m1 <= clock->m2 && !IS_PINEVIEW(dev))
Akshay Joshi0206e352011-08-16 15:34:10 -0400610 INTELPllInvalid("m1 <= m2\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800611 if (clock->m < limit->m.min || limit->m.max < clock->m)
Akshay Joshi0206e352011-08-16 15:34:10 -0400612 INTELPllInvalid("m out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800613 if (clock->n < limit->n.min || limit->n.max < clock->n)
Akshay Joshi0206e352011-08-16 15:34:10 -0400614 INTELPllInvalid("n out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800615 if (clock->vco < limit->vco.min || limit->vco.max < clock->vco)
Akshay Joshi0206e352011-08-16 15:34:10 -0400616 INTELPllInvalid("vco out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800617 /* XXX: We may need to be checking "Dot clock" depending on the multiplier,
618 * connector, etc., rather than just a single range.
619 */
620 if (clock->dot < limit->dot.min || limit->dot.max < clock->dot)
Akshay Joshi0206e352011-08-16 15:34:10 -0400621 INTELPllInvalid("dot out of range\n");
Jesse Barnes79e53942008-11-07 14:24:08 -0800622
623 return true;
624}
625
Ma Lingd4906092009-03-18 20:13:27 +0800626static bool
627intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800628 int target, int refclk, intel_clock_t *match_clock,
629 intel_clock_t *best_clock)
Ma Lingd4906092009-03-18 20:13:27 +0800630
Jesse Barnes79e53942008-11-07 14:24:08 -0800631{
632 struct drm_device *dev = crtc->dev;
Jesse Barnes79e53942008-11-07 14:24:08 -0800633 intel_clock_t clock;
Jesse Barnes79e53942008-11-07 14:24:08 -0800634 int err = target;
635
Daniel Vettera210b022012-11-26 17:22:08 +0100636 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
Jesse Barnes79e53942008-11-07 14:24:08 -0800637 /*
Daniel Vettera210b022012-11-26 17:22:08 +0100638 * For LVDS just rely on its current settings for dual-channel.
639 * We haven't figured out how to reliably set up different
640 * single/dual channel state, if we even can.
Jesse Barnes79e53942008-11-07 14:24:08 -0800641 */
Daniel Vetter1974cad2012-11-26 17:22:09 +0100642 if (intel_is_dual_link_lvds(dev))
Jesse Barnes79e53942008-11-07 14:24:08 -0800643 clock.p2 = limit->p2.p2_fast;
644 else
645 clock.p2 = limit->p2.p2_slow;
646 } else {
647 if (target < limit->p2.dot_limit)
648 clock.p2 = limit->p2.p2_slow;
649 else
650 clock.p2 = limit->p2.p2_fast;
651 }
652
Akshay Joshi0206e352011-08-16 15:34:10 -0400653 memset(best_clock, 0, sizeof(*best_clock));
Jesse Barnes79e53942008-11-07 14:24:08 -0800654
Zhao Yakui42158662009-11-20 11:24:18 +0800655 for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max;
656 clock.m1++) {
657 for (clock.m2 = limit->m2.min;
658 clock.m2 <= limit->m2.max; clock.m2++) {
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500659 /* m1 is always 0 in Pineview */
660 if (clock.m2 >= clock.m1 && !IS_PINEVIEW(dev))
Zhao Yakui42158662009-11-20 11:24:18 +0800661 break;
662 for (clock.n = limit->n.min;
663 clock.n <= limit->n.max; clock.n++) {
664 for (clock.p1 = limit->p1.min;
665 clock.p1 <= limit->p1.max; clock.p1++) {
Jesse Barnes79e53942008-11-07 14:24:08 -0800666 int this_err;
667
Shaohua Li21778322009-02-23 15:19:16 +0800668 intel_clock(dev, refclk, &clock);
Chris Wilson1b894b52010-12-14 20:04:54 +0000669 if (!intel_PLL_is_valid(dev, limit,
670 &clock))
Jesse Barnes79e53942008-11-07 14:24:08 -0800671 continue;
Sean Paulcec2f352012-01-10 15:09:36 -0800672 if (match_clock &&
673 clock.p != match_clock->p)
674 continue;
Jesse Barnes79e53942008-11-07 14:24:08 -0800675
676 this_err = abs(clock.dot - target);
677 if (this_err < err) {
678 *best_clock = clock;
679 err = this_err;
680 }
681 }
682 }
683 }
684 }
685
686 return (err != target);
687}
688
Ma Lingd4906092009-03-18 20:13:27 +0800689static bool
690intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800691 int target, int refclk, intel_clock_t *match_clock,
692 intel_clock_t *best_clock)
Ma Lingd4906092009-03-18 20:13:27 +0800693{
694 struct drm_device *dev = crtc->dev;
Ma Lingd4906092009-03-18 20:13:27 +0800695 intel_clock_t clock;
696 int max_n;
697 bool found;
Adam Jackson6ba770d2010-07-02 16:43:30 -0400698 /* approximately equals target * 0.00585 */
699 int err_most = (target >> 8) + (target >> 9);
Ma Lingd4906092009-03-18 20:13:27 +0800700 found = false;
701
702 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
Zhao Yakui45476682009-12-31 16:06:04 +0800703 int lvds_reg;
704
Eric Anholtc619eed2010-01-28 16:45:52 -0800705 if (HAS_PCH_SPLIT(dev))
Zhao Yakui45476682009-12-31 16:06:04 +0800706 lvds_reg = PCH_LVDS;
707 else
708 lvds_reg = LVDS;
Daniel Vetter1974cad2012-11-26 17:22:09 +0100709 if (intel_is_dual_link_lvds(dev))
Ma Lingd4906092009-03-18 20:13:27 +0800710 clock.p2 = limit->p2.p2_fast;
711 else
712 clock.p2 = limit->p2.p2_slow;
713 } else {
714 if (target < limit->p2.dot_limit)
715 clock.p2 = limit->p2.p2_slow;
716 else
717 clock.p2 = limit->p2.p2_fast;
718 }
719
720 memset(best_clock, 0, sizeof(*best_clock));
721 max_n = limit->n.max;
Gilles Espinassef77f13e2010-03-29 15:41:47 +0200722 /* based on hardware requirement, prefer smaller n to precision */
Ma Lingd4906092009-03-18 20:13:27 +0800723 for (clock.n = limit->n.min; clock.n <= max_n; clock.n++) {
Gilles Espinassef77f13e2010-03-29 15:41:47 +0200724 /* based on hardware requirement, prefere larger m1,m2 */
Ma Lingd4906092009-03-18 20:13:27 +0800725 for (clock.m1 = limit->m1.max;
726 clock.m1 >= limit->m1.min; clock.m1--) {
727 for (clock.m2 = limit->m2.max;
728 clock.m2 >= limit->m2.min; clock.m2--) {
729 for (clock.p1 = limit->p1.max;
730 clock.p1 >= limit->p1.min; clock.p1--) {
731 int this_err;
732
Shaohua Li21778322009-02-23 15:19:16 +0800733 intel_clock(dev, refclk, &clock);
Chris Wilson1b894b52010-12-14 20:04:54 +0000734 if (!intel_PLL_is_valid(dev, limit,
735 &clock))
Ma Lingd4906092009-03-18 20:13:27 +0800736 continue;
Sean Paulcec2f352012-01-10 15:09:36 -0800737 if (match_clock &&
738 clock.p != match_clock->p)
739 continue;
Chris Wilson1b894b52010-12-14 20:04:54 +0000740
741 this_err = abs(clock.dot - target);
Ma Lingd4906092009-03-18 20:13:27 +0800742 if (this_err < err_most) {
743 *best_clock = clock;
744 err_most = this_err;
745 max_n = clock.n;
746 found = true;
747 }
748 }
749 }
750 }
751 }
Zhenyu Wang2c072452009-06-05 15:38:42 +0800752 return found;
753}
Ma Lingd4906092009-03-18 20:13:27 +0800754
Zhenyu Wang2c072452009-06-05 15:38:42 +0800755static bool
Adam Jacksonf2b115e2009-12-03 17:14:42 -0500756intel_find_pll_ironlake_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800757 int target, int refclk, intel_clock_t *match_clock,
758 intel_clock_t *best_clock)
Zhenyu Wang5eb08b62009-07-24 01:00:31 +0800759{
760 struct drm_device *dev = crtc->dev;
761 intel_clock_t clock;
Zhao Yakui45476682009-12-31 16:06:04 +0800762
Zhenyu Wang5eb08b62009-07-24 01:00:31 +0800763 if (target < 200000) {
764 clock.n = 1;
765 clock.p1 = 2;
766 clock.p2 = 10;
767 clock.m1 = 12;
768 clock.m2 = 9;
769 } else {
770 clock.n = 2;
771 clock.p1 = 1;
772 clock.p2 = 10;
773 clock.m1 = 14;
774 clock.m2 = 8;
775 }
776 intel_clock(dev, refclk, &clock);
777 memcpy(best_clock, &clock, sizeof(intel_clock_t));
778 return true;
779}
780
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700781/* DisplayPort has only two frequencies, 162MHz and 270MHz */
782static bool
783intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
Sean Paulcec2f352012-01-10 15:09:36 -0800784 int target, int refclk, intel_clock_t *match_clock,
785 intel_clock_t *best_clock)
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700786{
Chris Wilson5eddb702010-09-11 13:48:45 +0100787 intel_clock_t clock;
788 if (target < 200000) {
789 clock.p1 = 2;
790 clock.p2 = 10;
791 clock.n = 2;
792 clock.m1 = 23;
793 clock.m2 = 8;
794 } else {
795 clock.p1 = 1;
796 clock.p2 = 10;
797 clock.n = 1;
798 clock.m1 = 14;
799 clock.m2 = 2;
800 }
801 clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2);
802 clock.p = (clock.p1 * clock.p2);
803 clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p;
804 clock.vco = 0;
805 memcpy(best_clock, &clock, sizeof(intel_clock_t));
806 return true;
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700807}
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700808static bool
809intel_vlv_find_best_pll(const intel_limit_t *limit, struct drm_crtc *crtc,
810 int target, int refclk, intel_clock_t *match_clock,
811 intel_clock_t *best_clock)
812{
813 u32 p1, p2, m1, m2, vco, bestn, bestm1, bestm2, bestp1, bestp2;
814 u32 m, n, fastclk;
815 u32 updrate, minupdate, fracbits, p;
816 unsigned long bestppm, ppm, absppm;
817 int dotclk, flag;
818
Alan Coxaf447bd2012-07-25 13:49:18 +0100819 flag = 0;
Jesse Barnesa0c4da22012-06-15 11:55:13 -0700820 dotclk = target * 1000;
821 bestppm = 1000000;
822 ppm = absppm = 0;
823 fastclk = dotclk / (2*100);
824 updrate = 0;
825 minupdate = 19200;
826 fracbits = 1;
827 n = p = p1 = p2 = m = m1 = m2 = vco = bestn = 0;
828 bestm1 = bestm2 = bestp1 = bestp2 = 0;
829
830 /* based on hardware requirement, prefer smaller n to precision */
831 for (n = limit->n.min; n <= ((refclk) / minupdate); n++) {
832 updrate = refclk / n;
833 for (p1 = limit->p1.max; p1 > limit->p1.min; p1--) {
834 for (p2 = limit->p2.p2_fast+1; p2 > 0; p2--) {
835 if (p2 > 10)
836 p2 = p2 - 1;
837 p = p1 * p2;
838 /* based on hardware requirement, prefer bigger m1,m2 values */
839 for (m1 = limit->m1.min; m1 <= limit->m1.max; m1++) {
840 m2 = (((2*(fastclk * p * n / m1 )) +
841 refclk) / (2*refclk));
842 m = m1 * m2;
843 vco = updrate * m;
844 if (vco >= limit->vco.min && vco < limit->vco.max) {
845 ppm = 1000000 * ((vco / p) - fastclk) / fastclk;
846 absppm = (ppm > 0) ? ppm : (-ppm);
847 if (absppm < 100 && ((p1 * p2) > (bestp1 * bestp2))) {
848 bestppm = 0;
849 flag = 1;
850 }
851 if (absppm < bestppm - 10) {
852 bestppm = absppm;
853 flag = 1;
854 }
855 if (flag) {
856 bestn = n;
857 bestm1 = m1;
858 bestm2 = m2;
859 bestp1 = p1;
860 bestp2 = p2;
861 flag = 0;
862 }
863 }
864 }
865 }
866 }
867 }
868 best_clock->n = bestn;
869 best_clock->m1 = bestm1;
870 best_clock->m2 = bestm2;
871 best_clock->p1 = bestp1;
872 best_clock->p2 = bestp2;
873
874 return true;
875}
Keith Packarda4fc5ed2009-04-07 16:16:42 -0700876
Paulo Zanonia5c961d2012-10-24 15:59:34 -0200877enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv,
878 enum pipe pipe)
879{
880 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
881 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
882
Daniel Vetter3b117c82013-04-17 20:15:07 +0200883 return intel_crtc->config.cpu_transcoder;
Paulo Zanonia5c961d2012-10-24 15:59:34 -0200884}
885
Paulo Zanonia928d532012-05-04 17:18:15 -0300886static void ironlake_wait_for_vblank(struct drm_device *dev, int pipe)
887{
888 struct drm_i915_private *dev_priv = dev->dev_private;
889 u32 frame, frame_reg = PIPEFRAME(pipe);
890
891 frame = I915_READ(frame_reg);
892
893 if (wait_for(I915_READ_NOTRACE(frame_reg) != frame, 50))
894 DRM_DEBUG_KMS("vblank wait timed out\n");
895}
896
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700897/**
898 * intel_wait_for_vblank - wait for vblank on a given pipe
899 * @dev: drm device
900 * @pipe: pipe to wait for
901 *
902 * Wait for vblank to occur on a given pipe. Needed for various bits of
903 * mode setting code.
904 */
905void intel_wait_for_vblank(struct drm_device *dev, int pipe)
Jesse Barnes79e53942008-11-07 14:24:08 -0800906{
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700907 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes9db4a9c2011-02-07 12:26:52 -0800908 int pipestat_reg = PIPESTAT(pipe);
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700909
Paulo Zanonia928d532012-05-04 17:18:15 -0300910 if (INTEL_INFO(dev)->gen >= 5) {
911 ironlake_wait_for_vblank(dev, pipe);
912 return;
913 }
914
Chris Wilson300387c2010-09-05 20:25:43 +0100915 /* Clear existing vblank status. Note this will clear any other
916 * sticky status fields as well.
917 *
918 * This races with i915_driver_irq_handler() with the result
919 * that either function could miss a vblank event. Here it is not
920 * fatal, as we will either wait upon the next vblank interrupt or
921 * timeout. Generally speaking intel_wait_for_vblank() is only
922 * called during modeset at which time the GPU should be idle and
923 * should *not* be performing page flips and thus not waiting on
924 * vblanks...
925 * Currently, the result of us stealing a vblank from the irq
926 * handler is that a single frame will be skipped during swapbuffers.
927 */
928 I915_WRITE(pipestat_reg,
929 I915_READ(pipestat_reg) | PIPE_VBLANK_INTERRUPT_STATUS);
930
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700931 /* Wait for vblank interrupt bit to set */
Chris Wilson481b6af2010-08-23 17:43:35 +0100932 if (wait_for(I915_READ(pipestat_reg) &
933 PIPE_VBLANK_INTERRUPT_STATUS,
934 50))
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700935 DRM_DEBUG_KMS("vblank wait timed out\n");
936}
937
Keith Packardab7ad7f2010-10-03 00:33:06 -0700938/*
939 * intel_wait_for_pipe_off - wait for pipe to turn off
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700940 * @dev: drm device
941 * @pipe: pipe to wait for
942 *
943 * After disabling a pipe, we can't wait for vblank in the usual way,
944 * spinning on the vblank interrupt status bit, since we won't actually
945 * see an interrupt when the pipe is disabled.
946 *
Keith Packardab7ad7f2010-10-03 00:33:06 -0700947 * On Gen4 and above:
948 * wait for the pipe register state bit to turn off
949 *
950 * Otherwise:
951 * wait for the display line value to settle (it usually
952 * ends up stopping at the start of the next frame).
Chris Wilson58e10eb2010-10-03 10:56:11 +0100953 *
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700954 */
Chris Wilson58e10eb2010-10-03 10:56:11 +0100955void intel_wait_for_pipe_off(struct drm_device *dev, int pipe)
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700956{
957 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni702e7a52012-10-23 18:29:59 -0200958 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
959 pipe);
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700960
Keith Packardab7ad7f2010-10-03 00:33:06 -0700961 if (INTEL_INFO(dev)->gen >= 4) {
Paulo Zanoni702e7a52012-10-23 18:29:59 -0200962 int reg = PIPECONF(cpu_transcoder);
Jesse Barnes9d0498a2010-08-18 13:20:54 -0700963
Keith Packardab7ad7f2010-10-03 00:33:06 -0700964 /* Wait for the Pipe State to go off */
Chris Wilson58e10eb2010-10-03 10:56:11 +0100965 if (wait_for((I915_READ(reg) & I965_PIPECONF_ACTIVE) == 0,
966 100))
Daniel Vetter284637d2012-07-09 09:51:57 +0200967 WARN(1, "pipe_off wait timed out\n");
Keith Packardab7ad7f2010-10-03 00:33:06 -0700968 } else {
Paulo Zanoni837ba002012-05-04 17:18:14 -0300969 u32 last_line, line_mask;
Chris Wilson58e10eb2010-10-03 10:56:11 +0100970 int reg = PIPEDSL(pipe);
Keith Packardab7ad7f2010-10-03 00:33:06 -0700971 unsigned long timeout = jiffies + msecs_to_jiffies(100);
972
Paulo Zanoni837ba002012-05-04 17:18:14 -0300973 if (IS_GEN2(dev))
974 line_mask = DSL_LINEMASK_GEN2;
975 else
976 line_mask = DSL_LINEMASK_GEN3;
977
Keith Packardab7ad7f2010-10-03 00:33:06 -0700978 /* Wait for the display line to settle */
979 do {
Paulo Zanoni837ba002012-05-04 17:18:14 -0300980 last_line = I915_READ(reg) & line_mask;
Keith Packardab7ad7f2010-10-03 00:33:06 -0700981 mdelay(5);
Paulo Zanoni837ba002012-05-04 17:18:14 -0300982 } while (((I915_READ(reg) & line_mask) != last_line) &&
Keith Packardab7ad7f2010-10-03 00:33:06 -0700983 time_after(timeout, jiffies));
984 if (time_after(jiffies, timeout))
Daniel Vetter284637d2012-07-09 09:51:57 +0200985 WARN(1, "pipe_off wait timed out\n");
Keith Packardab7ad7f2010-10-03 00:33:06 -0700986 }
Jesse Barnes79e53942008-11-07 14:24:08 -0800987}
988
Damien Lespiaub0ea7d32012-12-13 16:09:00 +0000989/*
990 * ibx_digital_port_connected - is the specified port connected?
991 * @dev_priv: i915 private structure
992 * @port: the port to test
993 *
994 * Returns true if @port is connected, false otherwise.
995 */
996bool ibx_digital_port_connected(struct drm_i915_private *dev_priv,
997 struct intel_digital_port *port)
998{
999 u32 bit;
1000
Damien Lespiauc36346e2012-12-13 16:09:03 +00001001 if (HAS_PCH_IBX(dev_priv->dev)) {
1002 switch(port->port) {
1003 case PORT_B:
1004 bit = SDE_PORTB_HOTPLUG;
1005 break;
1006 case PORT_C:
1007 bit = SDE_PORTC_HOTPLUG;
1008 break;
1009 case PORT_D:
1010 bit = SDE_PORTD_HOTPLUG;
1011 break;
1012 default:
1013 return true;
1014 }
1015 } else {
1016 switch(port->port) {
1017 case PORT_B:
1018 bit = SDE_PORTB_HOTPLUG_CPT;
1019 break;
1020 case PORT_C:
1021 bit = SDE_PORTC_HOTPLUG_CPT;
1022 break;
1023 case PORT_D:
1024 bit = SDE_PORTD_HOTPLUG_CPT;
1025 break;
1026 default:
1027 return true;
1028 }
Damien Lespiaub0ea7d32012-12-13 16:09:00 +00001029 }
1030
1031 return I915_READ(SDEISR) & bit;
1032}
1033
Jesse Barnesb24e7172011-01-04 15:09:30 -08001034static const char *state_string(bool enabled)
1035{
1036 return enabled ? "on" : "off";
1037}
1038
1039/* Only for pre-ILK configs */
1040static void assert_pll(struct drm_i915_private *dev_priv,
1041 enum pipe pipe, bool state)
1042{
1043 int reg;
1044 u32 val;
1045 bool cur_state;
1046
1047 reg = DPLL(pipe);
1048 val = I915_READ(reg);
1049 cur_state = !!(val & DPLL_VCO_ENABLE);
1050 WARN(cur_state != state,
1051 "PLL state assertion failure (expected %s, current %s)\n",
1052 state_string(state), state_string(cur_state));
1053}
1054#define assert_pll_enabled(d, p) assert_pll(d, p, true)
1055#define assert_pll_disabled(d, p) assert_pll(d, p, false)
1056
Jesse Barnes040484a2011-01-03 12:14:26 -08001057/* For ILK+ */
1058static void assert_pch_pll(struct drm_i915_private *dev_priv,
Chris Wilson92b27b02012-05-20 18:10:50 +01001059 struct intel_pch_pll *pll,
1060 struct intel_crtc *crtc,
1061 bool state)
Jesse Barnes040484a2011-01-03 12:14:26 -08001062{
Jesse Barnes040484a2011-01-03 12:14:26 -08001063 u32 val;
1064 bool cur_state;
1065
Eugeni Dodonov9d82aa12012-05-09 15:37:17 -03001066 if (HAS_PCH_LPT(dev_priv->dev)) {
1067 DRM_DEBUG_DRIVER("LPT detected: skipping PCH PLL test\n");
1068 return;
1069 }
1070
Chris Wilson92b27b02012-05-20 18:10:50 +01001071 if (WARN (!pll,
1072 "asserting PCH PLL %s with no PLL\n", state_string(state)))
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001073 return;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001074
Chris Wilson92b27b02012-05-20 18:10:50 +01001075 val = I915_READ(pll->pll_reg);
1076 cur_state = !!(val & DPLL_VCO_ENABLE);
1077 WARN(cur_state != state,
1078 "PCH PLL state for reg %x assertion failure (expected %s, current %s), val=%08x\n",
1079 pll->pll_reg, state_string(state), state_string(cur_state), val);
1080
1081 /* Make sure the selected PLL is correctly attached to the transcoder */
1082 if (crtc && HAS_PCH_CPT(dev_priv->dev)) {
Jesse Barnesd3ccbe82011-10-12 09:27:42 -07001083 u32 pch_dpll;
1084
1085 pch_dpll = I915_READ(PCH_DPLL_SEL);
Chris Wilson92b27b02012-05-20 18:10:50 +01001086 cur_state = pll->pll_reg == _PCH_DPLL_B;
1087 if (!WARN(((pch_dpll >> (4 * crtc->pipe)) & 1) != cur_state,
Ville Syrjälä4bb6f1f2013-04-17 17:48:50 +03001088 "PLL[%d] not attached to this transcoder %c: %08x\n",
1089 cur_state, pipe_name(crtc->pipe), pch_dpll)) {
Chris Wilson92b27b02012-05-20 18:10:50 +01001090 cur_state = !!(val >> (4*crtc->pipe + 3));
1091 WARN(cur_state != state,
Ville Syrjälä4bb6f1f2013-04-17 17:48:50 +03001092 "PLL[%d] not %s on this transcoder %c: %08x\n",
Chris Wilson92b27b02012-05-20 18:10:50 +01001093 pll->pll_reg == _PCH_DPLL_B,
1094 state_string(state),
Ville Syrjälä4bb6f1f2013-04-17 17:48:50 +03001095 pipe_name(crtc->pipe),
Chris Wilson92b27b02012-05-20 18:10:50 +01001096 val);
1097 }
Jesse Barnesd3ccbe82011-10-12 09:27:42 -07001098 }
Jesse Barnes040484a2011-01-03 12:14:26 -08001099}
Chris Wilson92b27b02012-05-20 18:10:50 +01001100#define assert_pch_pll_enabled(d, p, c) assert_pch_pll(d, p, c, true)
1101#define assert_pch_pll_disabled(d, p, c) assert_pch_pll(d, p, c, false)
Jesse Barnes040484a2011-01-03 12:14:26 -08001102
1103static void assert_fdi_tx(struct drm_i915_private *dev_priv,
1104 enum pipe pipe, bool state)
1105{
1106 int reg;
1107 u32 val;
1108 bool cur_state;
Paulo Zanoniad80a812012-10-24 16:06:19 -02001109 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
1110 pipe);
Jesse Barnes040484a2011-01-03 12:14:26 -08001111
Paulo Zanoniaffa9352012-11-23 15:30:39 -02001112 if (HAS_DDI(dev_priv->dev)) {
1113 /* DDI does not have a specific FDI_TX register */
Paulo Zanoniad80a812012-10-24 16:06:19 -02001114 reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
Eugeni Dodonovbf507ef2012-05-09 15:37:18 -03001115 val = I915_READ(reg);
Paulo Zanoniad80a812012-10-24 16:06:19 -02001116 cur_state = !!(val & TRANS_DDI_FUNC_ENABLE);
Eugeni Dodonovbf507ef2012-05-09 15:37:18 -03001117 } else {
1118 reg = FDI_TX_CTL(pipe);
1119 val = I915_READ(reg);
1120 cur_state = !!(val & FDI_TX_ENABLE);
1121 }
Jesse Barnes040484a2011-01-03 12:14:26 -08001122 WARN(cur_state != state,
1123 "FDI TX state assertion failure (expected %s, current %s)\n",
1124 state_string(state), state_string(cur_state));
1125}
1126#define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true)
1127#define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false)
1128
1129static void assert_fdi_rx(struct drm_i915_private *dev_priv,
1130 enum pipe pipe, bool state)
1131{
1132 int reg;
1133 u32 val;
1134 bool cur_state;
1135
Paulo Zanonid63fa0d2012-11-20 13:27:35 -02001136 reg = FDI_RX_CTL(pipe);
1137 val = I915_READ(reg);
1138 cur_state = !!(val & FDI_RX_ENABLE);
Jesse Barnes040484a2011-01-03 12:14:26 -08001139 WARN(cur_state != state,
1140 "FDI RX state assertion failure (expected %s, current %s)\n",
1141 state_string(state), state_string(cur_state));
1142}
1143#define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true)
1144#define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false)
1145
1146static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
1147 enum pipe pipe)
1148{
1149 int reg;
1150 u32 val;
1151
1152 /* ILK FDI PLL is always enabled */
1153 if (dev_priv->info->gen == 5)
1154 return;
1155
Eugeni Dodonovbf507ef2012-05-09 15:37:18 -03001156 /* On Haswell, DDI ports are responsible for the FDI PLL setup */
Paulo Zanoniaffa9352012-11-23 15:30:39 -02001157 if (HAS_DDI(dev_priv->dev))
Eugeni Dodonovbf507ef2012-05-09 15:37:18 -03001158 return;
1159
Jesse Barnes040484a2011-01-03 12:14:26 -08001160 reg = FDI_TX_CTL(pipe);
1161 val = I915_READ(reg);
1162 WARN(!(val & FDI_TX_PLL_ENABLE), "FDI TX PLL assertion failure, should be active but is disabled\n");
1163}
1164
1165static void assert_fdi_rx_pll_enabled(struct drm_i915_private *dev_priv,
1166 enum pipe pipe)
1167{
1168 int reg;
1169 u32 val;
1170
1171 reg = FDI_RX_CTL(pipe);
1172 val = I915_READ(reg);
1173 WARN(!(val & FDI_RX_PLL_ENABLE), "FDI RX PLL assertion failure, should be active but is disabled\n");
1174}
1175
Jesse Barnesea0760c2011-01-04 15:09:32 -08001176static void assert_panel_unlocked(struct drm_i915_private *dev_priv,
1177 enum pipe pipe)
1178{
1179 int pp_reg, lvds_reg;
1180 u32 val;
1181 enum pipe panel_pipe = PIPE_A;
Thomas Jarosch0de3b482011-08-25 15:37:45 +02001182 bool locked = true;
Jesse Barnesea0760c2011-01-04 15:09:32 -08001183
1184 if (HAS_PCH_SPLIT(dev_priv->dev)) {
1185 pp_reg = PCH_PP_CONTROL;
1186 lvds_reg = PCH_LVDS;
1187 } else {
1188 pp_reg = PP_CONTROL;
1189 lvds_reg = LVDS;
1190 }
1191
1192 val = I915_READ(pp_reg);
1193 if (!(val & PANEL_POWER_ON) ||
1194 ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS))
1195 locked = false;
1196
1197 if (I915_READ(lvds_reg) & LVDS_PIPEB_SELECT)
1198 panel_pipe = PIPE_B;
1199
1200 WARN(panel_pipe == pipe && locked,
1201 "panel assertion failure, pipe %c regs locked\n",
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001202 pipe_name(pipe));
Jesse Barnesea0760c2011-01-04 15:09:32 -08001203}
1204
Jesse Barnesb840d907f2011-12-13 13:19:38 -08001205void assert_pipe(struct drm_i915_private *dev_priv,
1206 enum pipe pipe, bool state)
Jesse Barnesb24e7172011-01-04 15:09:30 -08001207{
1208 int reg;
1209 u32 val;
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001210 bool cur_state;
Paulo Zanoni702e7a52012-10-23 18:29:59 -02001211 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
1212 pipe);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001213
Daniel Vetter8e636782012-01-22 01:36:48 +01001214 /* if we need the pipe A quirk it must be always on */
1215 if (pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE)
1216 state = true;
1217
Paulo Zanoni15d199e2013-03-22 14:14:13 -03001218 if (!intel_using_power_well(dev_priv->dev) &&
1219 cpu_transcoder != TRANSCODER_EDP) {
Paulo Zanoni69310162013-01-29 16:35:19 -02001220 cur_state = false;
1221 } else {
1222 reg = PIPECONF(cpu_transcoder);
1223 val = I915_READ(reg);
1224 cur_state = !!(val & PIPECONF_ENABLE);
1225 }
1226
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001227 WARN(cur_state != state,
1228 "pipe %c assertion failure (expected %s, current %s)\n",
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001229 pipe_name(pipe), state_string(state), state_string(cur_state));
Jesse Barnesb24e7172011-01-04 15:09:30 -08001230}
1231
Chris Wilson931872f2012-01-16 23:01:13 +00001232static void assert_plane(struct drm_i915_private *dev_priv,
1233 enum plane plane, bool state)
Jesse Barnesb24e7172011-01-04 15:09:30 -08001234{
1235 int reg;
1236 u32 val;
Chris Wilson931872f2012-01-16 23:01:13 +00001237 bool cur_state;
Jesse Barnesb24e7172011-01-04 15:09:30 -08001238
1239 reg = DSPCNTR(plane);
1240 val = I915_READ(reg);
Chris Wilson931872f2012-01-16 23:01:13 +00001241 cur_state = !!(val & DISPLAY_PLANE_ENABLE);
1242 WARN(cur_state != state,
1243 "plane %c assertion failure (expected %s, current %s)\n",
1244 plane_name(plane), state_string(state), state_string(cur_state));
Jesse Barnesb24e7172011-01-04 15:09:30 -08001245}
1246
Chris Wilson931872f2012-01-16 23:01:13 +00001247#define assert_plane_enabled(d, p) assert_plane(d, p, true)
1248#define assert_plane_disabled(d, p) assert_plane(d, p, false)
1249
Jesse Barnesb24e7172011-01-04 15:09:30 -08001250static void assert_planes_disabled(struct drm_i915_private *dev_priv,
1251 enum pipe pipe)
1252{
1253 int reg, i;
1254 u32 val;
1255 int cur_pipe;
1256
Jesse Barnes19ec1352011-02-02 12:28:02 -08001257 /* Planes are fixed to pipes on ILK+ */
Jesse Barnesda6ecc52013-03-08 10:46:00 -08001258 if (HAS_PCH_SPLIT(dev_priv->dev) || IS_VALLEYVIEW(dev_priv->dev)) {
Adam Jackson28c057942011-10-07 14:38:42 -04001259 reg = DSPCNTR(pipe);
1260 val = I915_READ(reg);
1261 WARN((val & DISPLAY_PLANE_ENABLE),
1262 "plane %c assertion failure, should be disabled but not\n",
1263 plane_name(pipe));
Jesse Barnes19ec1352011-02-02 12:28:02 -08001264 return;
Adam Jackson28c057942011-10-07 14:38:42 -04001265 }
Jesse Barnes19ec1352011-02-02 12:28:02 -08001266
Jesse Barnesb24e7172011-01-04 15:09:30 -08001267 /* Need to check both planes against the pipe */
1268 for (i = 0; i < 2; i++) {
1269 reg = DSPCNTR(i);
1270 val = I915_READ(reg);
1271 cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
1272 DISPPLANE_SEL_PIPE_SHIFT;
1273 WARN((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe,
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001274 "plane %c assertion failure, should be off on pipe %c but is still active\n",
1275 plane_name(i), pipe_name(pipe));
Jesse Barnesb24e7172011-01-04 15:09:30 -08001276 }
1277}
1278
Jesse Barnes19332d72013-03-28 09:55:38 -07001279static void assert_sprites_disabled(struct drm_i915_private *dev_priv,
1280 enum pipe pipe)
1281{
1282 int reg, i;
1283 u32 val;
1284
1285 if (!IS_VALLEYVIEW(dev_priv->dev))
1286 return;
1287
1288 /* Need to check both planes against the pipe */
1289 for (i = 0; i < dev_priv->num_plane; i++) {
1290 reg = SPCNTR(pipe, i);
1291 val = I915_READ(reg);
1292 WARN((val & SP_ENABLE),
Ville Syrjälä06da8da2013-04-17 17:48:51 +03001293 "sprite %c assertion failure, should be off on pipe %c but is still active\n",
1294 sprite_name(pipe, i), pipe_name(pipe));
Jesse Barnes19332d72013-03-28 09:55:38 -07001295 }
1296}
1297
Jesse Barnes92f25842011-01-04 15:09:34 -08001298static void assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
1299{
1300 u32 val;
1301 bool enabled;
1302
Eugeni Dodonov9d82aa12012-05-09 15:37:17 -03001303 if (HAS_PCH_LPT(dev_priv->dev)) {
1304 DRM_DEBUG_DRIVER("LPT does not has PCH refclk, skipping check\n");
1305 return;
1306 }
1307
Jesse Barnes92f25842011-01-04 15:09:34 -08001308 val = I915_READ(PCH_DREF_CONTROL);
1309 enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
1310 DREF_SUPERSPREAD_SOURCE_MASK));
1311 WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
1312}
1313
1314static void assert_transcoder_disabled(struct drm_i915_private *dev_priv,
1315 enum pipe pipe)
1316{
1317 int reg;
1318 u32 val;
1319 bool enabled;
1320
1321 reg = TRANSCONF(pipe);
1322 val = I915_READ(reg);
1323 enabled = !!(val & TRANS_ENABLE);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001324 WARN(enabled,
1325 "transcoder assertion failed, should be off on pipe %c but is still active\n",
1326 pipe_name(pipe));
Jesse Barnes92f25842011-01-04 15:09:34 -08001327}
1328
Keith Packard4e634382011-08-06 10:39:45 -07001329static bool dp_pipe_enabled(struct drm_i915_private *dev_priv,
1330 enum pipe pipe, u32 port_sel, u32 val)
Keith Packardf0575e92011-07-25 22:12:43 -07001331{
1332 if ((val & DP_PORT_EN) == 0)
1333 return false;
1334
1335 if (HAS_PCH_CPT(dev_priv->dev)) {
1336 u32 trans_dp_ctl_reg = TRANS_DP_CTL(pipe);
1337 u32 trans_dp_ctl = I915_READ(trans_dp_ctl_reg);
1338 if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel)
1339 return false;
1340 } else {
1341 if ((val & DP_PIPE_MASK) != (pipe << 30))
1342 return false;
1343 }
1344 return true;
1345}
1346
Keith Packard1519b992011-08-06 10:35:34 -07001347static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv,
1348 enum pipe pipe, u32 val)
1349{
Paulo Zanonidc0fa712013-02-19 16:21:46 -03001350 if ((val & SDVO_ENABLE) == 0)
Keith Packard1519b992011-08-06 10:35:34 -07001351 return false;
1352
1353 if (HAS_PCH_CPT(dev_priv->dev)) {
Paulo Zanonidc0fa712013-02-19 16:21:46 -03001354 if ((val & SDVO_PIPE_SEL_MASK_CPT) != SDVO_PIPE_SEL_CPT(pipe))
Keith Packard1519b992011-08-06 10:35:34 -07001355 return false;
1356 } else {
Paulo Zanonidc0fa712013-02-19 16:21:46 -03001357 if ((val & SDVO_PIPE_SEL_MASK) != SDVO_PIPE_SEL(pipe))
Keith Packard1519b992011-08-06 10:35:34 -07001358 return false;
1359 }
1360 return true;
1361}
1362
1363static bool lvds_pipe_enabled(struct drm_i915_private *dev_priv,
1364 enum pipe pipe, u32 val)
1365{
1366 if ((val & LVDS_PORT_EN) == 0)
1367 return false;
1368
1369 if (HAS_PCH_CPT(dev_priv->dev)) {
1370 if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
1371 return false;
1372 } else {
1373 if ((val & LVDS_PIPE_MASK) != LVDS_PIPE(pipe))
1374 return false;
1375 }
1376 return true;
1377}
1378
1379static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv,
1380 enum pipe pipe, u32 val)
1381{
1382 if ((val & ADPA_DAC_ENABLE) == 0)
1383 return false;
1384 if (HAS_PCH_CPT(dev_priv->dev)) {
1385 if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
1386 return false;
1387 } else {
1388 if ((val & ADPA_PIPE_SELECT_MASK) != ADPA_PIPE_SELECT(pipe))
1389 return false;
1390 }
1391 return true;
1392}
1393
Jesse Barnes291906f2011-02-02 12:28:03 -08001394static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
Keith Packardf0575e92011-07-25 22:12:43 -07001395 enum pipe pipe, int reg, u32 port_sel)
Jesse Barnes291906f2011-02-02 12:28:03 -08001396{
Jesse Barnes47a05ec2011-02-07 13:46:40 -08001397 u32 val = I915_READ(reg);
Keith Packard4e634382011-08-06 10:39:45 -07001398 WARN(dp_pipe_enabled(dev_priv, pipe, port_sel, val),
Jesse Barnes291906f2011-02-02 12:28:03 -08001399 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001400 reg, pipe_name(pipe));
Daniel Vetterde9a35a2012-06-05 11:03:40 +02001401
Daniel Vetter75c5da22012-09-10 21:58:29 +02001402 WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0
1403 && (val & DP_PIPEB_SELECT),
Daniel Vetterde9a35a2012-06-05 11:03:40 +02001404 "IBX PCH dp port still using transcoder B\n");
Jesse Barnes291906f2011-02-02 12:28:03 -08001405}
1406
1407static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
1408 enum pipe pipe, int reg)
1409{
Jesse Barnes47a05ec2011-02-07 13:46:40 -08001410 u32 val = I915_READ(reg);
Xu, Anhuab70ad582012-08-13 03:08:33 +00001411 WARN(hdmi_pipe_enabled(dev_priv, pipe, val),
Adam Jackson23c99e72011-10-07 14:38:43 -04001412 "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n",
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001413 reg, pipe_name(pipe));
Daniel Vetterde9a35a2012-06-05 11:03:40 +02001414
Paulo Zanonidc0fa712013-02-19 16:21:46 -03001415 WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_ENABLE) == 0
Daniel Vetter75c5da22012-09-10 21:58:29 +02001416 && (val & SDVO_PIPE_B_SELECT),
Daniel Vetterde9a35a2012-06-05 11:03:40 +02001417 "IBX PCH hdmi port still using transcoder B\n");
Jesse Barnes291906f2011-02-02 12:28:03 -08001418}
1419
1420static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
1421 enum pipe pipe)
1422{
1423 int reg;
1424 u32 val;
Jesse Barnes291906f2011-02-02 12:28:03 -08001425
Keith Packardf0575e92011-07-25 22:12:43 -07001426 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B);
1427 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C);
1428 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D);
Jesse Barnes291906f2011-02-02 12:28:03 -08001429
1430 reg = PCH_ADPA;
1431 val = I915_READ(reg);
Xu, Anhuab70ad582012-08-13 03:08:33 +00001432 WARN(adpa_pipe_enabled(dev_priv, pipe, val),
Jesse Barnes291906f2011-02-02 12:28:03 -08001433 "PCH VGA enabled on transcoder %c, should be disabled\n",
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001434 pipe_name(pipe));
Jesse Barnes291906f2011-02-02 12:28:03 -08001435
1436 reg = PCH_LVDS;
1437 val = I915_READ(reg);
Xu, Anhuab70ad582012-08-13 03:08:33 +00001438 WARN(lvds_pipe_enabled(dev_priv, pipe, val),
Jesse Barnes291906f2011-02-02 12:28:03 -08001439 "PCH LVDS enabled on transcoder %c, should be disabled\n",
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08001440 pipe_name(pipe));
Jesse Barnes291906f2011-02-02 12:28:03 -08001441
Paulo Zanonie2debe92013-02-18 19:00:27 -03001442 assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMIB);
1443 assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMIC);
1444 assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMID);
Jesse Barnes291906f2011-02-02 12:28:03 -08001445}
1446
Jesse Barnesb24e7172011-01-04 15:09:30 -08001447/**
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001448 * intel_enable_pll - enable a PLL
1449 * @dev_priv: i915 private structure
1450 * @pipe: pipe PLL to enable
1451 *
1452 * Enable @pipe's PLL so we can start pumping pixels from a plane. Check to
1453 * make sure the PLL reg is writable first though, since the panel write
1454 * protect mechanism may be enabled.
1455 *
1456 * Note! This is for pre-ILK only.
Thomas Richter7434a252012-07-18 19:22:30 +02001457 *
1458 * Unfortunately needed by dvo_ns2501 since the dvo depends on it running.
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001459 */
1460static void intel_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1461{
1462 int reg;
1463 u32 val;
1464
Daniel Vetter58c6eaa2013-04-11 16:29:09 +02001465 assert_pipe_disabled(dev_priv, pipe);
1466
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001467 /* No really, not for ILK+ */
Jesse Barnesa0c4da22012-06-15 11:55:13 -07001468 BUG_ON(!IS_VALLEYVIEW(dev_priv->dev) && dev_priv->info->gen >= 5);
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001469
1470 /* PLL is protected by panel, make sure we can write it */
1471 if (IS_MOBILE(dev_priv->dev) && !IS_I830(dev_priv->dev))
1472 assert_panel_unlocked(dev_priv, pipe);
1473
1474 reg = DPLL(pipe);
1475 val = I915_READ(reg);
1476 val |= DPLL_VCO_ENABLE;
1477
1478 /* We do this three times for luck */
1479 I915_WRITE(reg, val);
1480 POSTING_READ(reg);
1481 udelay(150); /* wait for warmup */
1482 I915_WRITE(reg, val);
1483 POSTING_READ(reg);
1484 udelay(150); /* wait for warmup */
1485 I915_WRITE(reg, val);
1486 POSTING_READ(reg);
1487 udelay(150); /* wait for warmup */
1488}
1489
1490/**
1491 * intel_disable_pll - disable a PLL
1492 * @dev_priv: i915 private structure
1493 * @pipe: pipe PLL to disable
1494 *
1495 * Disable the PLL for @pipe, making sure the pipe is off first.
1496 *
1497 * Note! This is for pre-ILK only.
1498 */
1499static void intel_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1500{
1501 int reg;
1502 u32 val;
1503
1504 /* Don't disable pipe A or pipe A PLLs if needed */
1505 if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE))
1506 return;
1507
1508 /* Make sure the pipe isn't still relying on us */
1509 assert_pipe_disabled(dev_priv, pipe);
1510
1511 reg = DPLL(pipe);
1512 val = I915_READ(reg);
1513 val &= ~DPLL_VCO_ENABLE;
1514 I915_WRITE(reg, val);
1515 POSTING_READ(reg);
1516}
1517
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001518/* SBI access */
1519static void
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02001520intel_sbi_write(struct drm_i915_private *dev_priv, u16 reg, u32 value,
1521 enum intel_sbi_destination destination)
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001522{
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02001523 u32 tmp;
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001524
Daniel Vetter09153002012-12-12 14:06:44 +01001525 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001526
Eugeni Dodonov39fb50f2012-06-08 16:43:19 -03001527 if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_BUSY) == 0,
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001528 100)) {
1529 DRM_ERROR("timeout waiting for SBI to become ready\n");
Daniel Vetter09153002012-12-12 14:06:44 +01001530 return;
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001531 }
1532
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02001533 I915_WRITE(SBI_ADDR, (reg << 16));
1534 I915_WRITE(SBI_DATA, value);
1535
1536 if (destination == SBI_ICLK)
1537 tmp = SBI_CTL_DEST_ICLK | SBI_CTL_OP_CRWR;
1538 else
1539 tmp = SBI_CTL_DEST_MPHY | SBI_CTL_OP_IOWR;
1540 I915_WRITE(SBI_CTL_STAT, SBI_BUSY | tmp);
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001541
Eugeni Dodonov39fb50f2012-06-08 16:43:19 -03001542 if (wait_for((I915_READ(SBI_CTL_STAT) & (SBI_BUSY | SBI_RESPONSE_FAIL)) == 0,
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001543 100)) {
1544 DRM_ERROR("timeout waiting for SBI to complete write transaction\n");
Daniel Vetter09153002012-12-12 14:06:44 +01001545 return;
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001546 }
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001547}
1548
1549static u32
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02001550intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg,
1551 enum intel_sbi_destination destination)
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001552{
Eugeni Dodonov39fb50f2012-06-08 16:43:19 -03001553 u32 value = 0;
Daniel Vetter09153002012-12-12 14:06:44 +01001554 WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001555
Eugeni Dodonov39fb50f2012-06-08 16:43:19 -03001556 if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_BUSY) == 0,
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001557 100)) {
1558 DRM_ERROR("timeout waiting for SBI to become ready\n");
Daniel Vetter09153002012-12-12 14:06:44 +01001559 return 0;
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001560 }
1561
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02001562 I915_WRITE(SBI_ADDR, (reg << 16));
1563
1564 if (destination == SBI_ICLK)
1565 value = SBI_CTL_DEST_ICLK | SBI_CTL_OP_CRRD;
1566 else
1567 value = SBI_CTL_DEST_MPHY | SBI_CTL_OP_IORD;
1568 I915_WRITE(SBI_CTL_STAT, value | SBI_BUSY);
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001569
Eugeni Dodonov39fb50f2012-06-08 16:43:19 -03001570 if (wait_for((I915_READ(SBI_CTL_STAT) & (SBI_BUSY | SBI_RESPONSE_FAIL)) == 0,
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001571 100)) {
1572 DRM_ERROR("timeout waiting for SBI to complete read transaction\n");
Daniel Vetter09153002012-12-12 14:06:44 +01001573 return 0;
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001574 }
1575
Daniel Vetter09153002012-12-12 14:06:44 +01001576 return I915_READ(SBI_DATA);
Eugeni Dodonova416ede2012-05-09 15:37:10 -03001577}
1578
Jesse Barnes89b667f2013-04-18 14:51:36 -07001579void vlv_wait_port_ready(struct drm_i915_private *dev_priv, int port)
1580{
1581 u32 port_mask;
1582
1583 if (!port)
1584 port_mask = DPLL_PORTB_READY_MASK;
1585 else
1586 port_mask = DPLL_PORTC_READY_MASK;
1587
1588 if (wait_for((I915_READ(DPLL(0)) & port_mask) == 0, 1000))
1589 WARN(1, "timed out waiting for port %c ready: 0x%08x\n",
1590 'B' + port, I915_READ(DPLL(0)));
1591}
1592
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08001593/**
Paulo Zanonib6b4e182012-10-31 18:12:38 -02001594 * ironlake_enable_pch_pll - enable PCH PLL
Jesse Barnes92f25842011-01-04 15:09:34 -08001595 * @dev_priv: i915 private structure
1596 * @pipe: pipe PLL to enable
1597 *
1598 * The PCH PLL needs to be enabled before the PCH transcoder, since it
1599 * drives the transcoder clock.
1600 */
Paulo Zanonib6b4e182012-10-31 18:12:38 -02001601static void ironlake_enable_pch_pll(struct intel_crtc *intel_crtc)
Jesse Barnes92f25842011-01-04 15:09:34 -08001602{
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001603 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
Chris Wilson48da64a2012-05-13 20:16:12 +01001604 struct intel_pch_pll *pll;
Jesse Barnes92f25842011-01-04 15:09:34 -08001605 int reg;
1606 u32 val;
1607
Chris Wilson48da64a2012-05-13 20:16:12 +01001608 /* PCH PLLs only available on ILK, SNB and IVB */
Jesse Barnes92f25842011-01-04 15:09:34 -08001609 BUG_ON(dev_priv->info->gen < 5);
Chris Wilson48da64a2012-05-13 20:16:12 +01001610 pll = intel_crtc->pch_pll;
1611 if (pll == NULL)
1612 return;
1613
1614 if (WARN_ON(pll->refcount == 0))
1615 return;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001616
1617 DRM_DEBUG_KMS("enable PCH PLL %x (active %d, on? %d)for crtc %d\n",
1618 pll->pll_reg, pll->active, pll->on,
1619 intel_crtc->base.base.id);
Jesse Barnes92f25842011-01-04 15:09:34 -08001620
1621 /* PCH refclock must be enabled first */
1622 assert_pch_refclk_enabled(dev_priv);
1623
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001624 if (pll->active++ && pll->on) {
Chris Wilson92b27b02012-05-20 18:10:50 +01001625 assert_pch_pll_enabled(dev_priv, pll, NULL);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001626 return;
1627 }
1628
1629 DRM_DEBUG_KMS("enabling PCH PLL %x\n", pll->pll_reg);
1630
1631 reg = pll->pll_reg;
Jesse Barnes92f25842011-01-04 15:09:34 -08001632 val = I915_READ(reg);
1633 val |= DPLL_VCO_ENABLE;
1634 I915_WRITE(reg, val);
1635 POSTING_READ(reg);
1636 udelay(200);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001637
1638 pll->on = true;
Jesse Barnes92f25842011-01-04 15:09:34 -08001639}
1640
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001641static void intel_disable_pch_pll(struct intel_crtc *intel_crtc)
Jesse Barnes92f25842011-01-04 15:09:34 -08001642{
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001643 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
1644 struct intel_pch_pll *pll = intel_crtc->pch_pll;
Jesse Barnes92f25842011-01-04 15:09:34 -08001645 int reg;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001646 u32 val;
Jesse Barnes4c609cb2011-09-02 12:52:11 -07001647
Jesse Barnes92f25842011-01-04 15:09:34 -08001648 /* PCH only available on ILK+ */
1649 BUG_ON(dev_priv->info->gen < 5);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001650 if (pll == NULL)
1651 return;
1652
Chris Wilson48da64a2012-05-13 20:16:12 +01001653 if (WARN_ON(pll->refcount == 0))
1654 return;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001655
1656 DRM_DEBUG_KMS("disable PCH PLL %x (active %d, on? %d) for crtc %d\n",
1657 pll->pll_reg, pll->active, pll->on,
1658 intel_crtc->base.base.id);
1659
Chris Wilson48da64a2012-05-13 20:16:12 +01001660 if (WARN_ON(pll->active == 0)) {
Chris Wilson92b27b02012-05-20 18:10:50 +01001661 assert_pch_pll_disabled(dev_priv, pll, NULL);
Chris Wilson48da64a2012-05-13 20:16:12 +01001662 return;
1663 }
1664
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001665 if (--pll->active) {
Chris Wilson92b27b02012-05-20 18:10:50 +01001666 assert_pch_pll_enabled(dev_priv, pll, NULL);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001667 return;
1668 }
1669
1670 DRM_DEBUG_KMS("disabling PCH PLL %x\n", pll->pll_reg);
Jesse Barnes92f25842011-01-04 15:09:34 -08001671
1672 /* Make sure transcoder isn't still depending on us */
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001673 assert_transcoder_disabled(dev_priv, intel_crtc->pipe);
Jesse Barnes92f25842011-01-04 15:09:34 -08001674
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001675 reg = pll->pll_reg;
Jesse Barnes92f25842011-01-04 15:09:34 -08001676 val = I915_READ(reg);
1677 val &= ~DPLL_VCO_ENABLE;
1678 I915_WRITE(reg, val);
1679 POSTING_READ(reg);
1680 udelay(200);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01001681
1682 pll->on = false;
Jesse Barnes92f25842011-01-04 15:09:34 -08001683}
1684
Paulo Zanonib8a4f402012-10-31 18:12:42 -02001685static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
1686 enum pipe pipe)
Jesse Barnes040484a2011-01-03 12:14:26 -08001687{
Daniel Vetter23670b322012-11-01 09:15:30 +01001688 struct drm_device *dev = dev_priv->dev;
Paulo Zanoni7c26e5c2012-02-14 17:07:09 -02001689 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
Daniel Vetter23670b322012-11-01 09:15:30 +01001690 uint32_t reg, val, pipeconf_val;
Jesse Barnes040484a2011-01-03 12:14:26 -08001691
1692 /* PCH only available on ILK+ */
1693 BUG_ON(dev_priv->info->gen < 5);
1694
1695 /* Make sure PCH DPLL is enabled */
Chris Wilson92b27b02012-05-20 18:10:50 +01001696 assert_pch_pll_enabled(dev_priv,
1697 to_intel_crtc(crtc)->pch_pll,
1698 to_intel_crtc(crtc));
Jesse Barnes040484a2011-01-03 12:14:26 -08001699
1700 /* FDI must be feeding us bits for PCH ports */
1701 assert_fdi_tx_enabled(dev_priv, pipe);
1702 assert_fdi_rx_enabled(dev_priv, pipe);
1703
Daniel Vetter23670b322012-11-01 09:15:30 +01001704 if (HAS_PCH_CPT(dev)) {
1705 /* Workaround: Set the timing override bit before enabling the
1706 * pch transcoder. */
1707 reg = TRANS_CHICKEN2(pipe);
1708 val = I915_READ(reg);
1709 val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
1710 I915_WRITE(reg, val);
Eugeni Dodonov59c859d2012-05-09 15:37:19 -03001711 }
Daniel Vetter23670b322012-11-01 09:15:30 +01001712
Jesse Barnes040484a2011-01-03 12:14:26 -08001713 reg = TRANSCONF(pipe);
1714 val = I915_READ(reg);
Paulo Zanoni5f7f7262012-02-03 17:47:15 -02001715 pipeconf_val = I915_READ(PIPECONF(pipe));
Jesse Barnese9bcff52011-06-24 12:19:20 -07001716
1717 if (HAS_PCH_IBX(dev_priv->dev)) {
1718 /*
1719 * make the BPC in transcoder be consistent with
1720 * that in pipeconf reg.
1721 */
Daniel Vetterdfd07d72012-12-17 11:21:38 +01001722 val &= ~PIPECONF_BPC_MASK;
1723 val |= pipeconf_val & PIPECONF_BPC_MASK;
Jesse Barnese9bcff52011-06-24 12:19:20 -07001724 }
Paulo Zanoni5f7f7262012-02-03 17:47:15 -02001725
1726 val &= ~TRANS_INTERLACE_MASK;
1727 if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK)
Paulo Zanoni7c26e5c2012-02-14 17:07:09 -02001728 if (HAS_PCH_IBX(dev_priv->dev) &&
1729 intel_pipe_has_type(crtc, INTEL_OUTPUT_SDVO))
1730 val |= TRANS_LEGACY_INTERLACED_ILK;
1731 else
1732 val |= TRANS_INTERLACED;
Paulo Zanoni5f7f7262012-02-03 17:47:15 -02001733 else
1734 val |= TRANS_PROGRESSIVE;
1735
Jesse Barnes040484a2011-01-03 12:14:26 -08001736 I915_WRITE(reg, val | TRANS_ENABLE);
1737 if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100))
Ville Syrjälä4bb6f1f2013-04-17 17:48:50 +03001738 DRM_ERROR("failed to enable transcoder %c\n", pipe_name(pipe));
Jesse Barnes040484a2011-01-03 12:14:26 -08001739}
1740
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001741static void lpt_enable_pch_transcoder(struct drm_i915_private *dev_priv,
Paulo Zanoni937bb612012-10-31 18:12:47 -02001742 enum transcoder cpu_transcoder)
Jesse Barnes040484a2011-01-03 12:14:26 -08001743{
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001744 u32 val, pipeconf_val;
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001745
1746 /* PCH only available on ILK+ */
1747 BUG_ON(dev_priv->info->gen < 5);
1748
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001749 /* FDI must be feeding us bits for PCH ports */
Daniel Vetter1a240d42012-11-29 22:18:51 +01001750 assert_fdi_tx_enabled(dev_priv, (enum pipe) cpu_transcoder);
Paulo Zanoni937bb612012-10-31 18:12:47 -02001751 assert_fdi_rx_enabled(dev_priv, TRANSCODER_A);
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001752
Paulo Zanoni223a6fd2012-10-31 18:12:52 -02001753 /* Workaround: set timing override bit. */
1754 val = I915_READ(_TRANSA_CHICKEN2);
Daniel Vetter23670b322012-11-01 09:15:30 +01001755 val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
Paulo Zanoni223a6fd2012-10-31 18:12:52 -02001756 I915_WRITE(_TRANSA_CHICKEN2, val);
1757
Paulo Zanoni25f3ef12012-10-31 18:12:49 -02001758 val = TRANS_ENABLE;
Paulo Zanoni937bb612012-10-31 18:12:47 -02001759 pipeconf_val = I915_READ(PIPECONF(cpu_transcoder));
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001760
Paulo Zanoni9a76b1c2012-10-31 18:12:48 -02001761 if ((pipeconf_val & PIPECONF_INTERLACE_MASK_HSW) ==
1762 PIPECONF_INTERLACED_ILK)
Paulo Zanonia35f2672012-10-31 18:12:45 -02001763 val |= TRANS_INTERLACED;
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001764 else
1765 val |= TRANS_PROGRESSIVE;
1766
Paulo Zanoni25f3ef12012-10-31 18:12:49 -02001767 I915_WRITE(TRANSCONF(TRANSCODER_A), val);
Paulo Zanoni937bb612012-10-31 18:12:47 -02001768 if (wait_for(I915_READ(_TRANSACONF) & TRANS_STATE_ENABLE, 100))
1769 DRM_ERROR("Failed to enable PCH transcoder\n");
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001770}
1771
Paulo Zanonib8a4f402012-10-31 18:12:42 -02001772static void ironlake_disable_pch_transcoder(struct drm_i915_private *dev_priv,
1773 enum pipe pipe)
Jesse Barnes040484a2011-01-03 12:14:26 -08001774{
Daniel Vetter23670b322012-11-01 09:15:30 +01001775 struct drm_device *dev = dev_priv->dev;
1776 uint32_t reg, val;
Jesse Barnes040484a2011-01-03 12:14:26 -08001777
1778 /* FDI relies on the transcoder */
1779 assert_fdi_tx_disabled(dev_priv, pipe);
1780 assert_fdi_rx_disabled(dev_priv, pipe);
1781
Jesse Barnes291906f2011-02-02 12:28:03 -08001782 /* Ports must be off as well */
1783 assert_pch_ports_disabled(dev_priv, pipe);
1784
Jesse Barnes040484a2011-01-03 12:14:26 -08001785 reg = TRANSCONF(pipe);
1786 val = I915_READ(reg);
1787 val &= ~TRANS_ENABLE;
1788 I915_WRITE(reg, val);
1789 /* wait for PCH transcoder off, transcoder state */
1790 if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50))
Ville Syrjälä4bb6f1f2013-04-17 17:48:50 +03001791 DRM_ERROR("failed to disable transcoder %c\n", pipe_name(pipe));
Daniel Vetter23670b322012-11-01 09:15:30 +01001792
1793 if (!HAS_PCH_IBX(dev)) {
1794 /* Workaround: Clear the timing override chicken bit again. */
1795 reg = TRANS_CHICKEN2(pipe);
1796 val = I915_READ(reg);
1797 val &= ~TRANS_CHICKEN2_TIMING_OVERRIDE;
1798 I915_WRITE(reg, val);
1799 }
Jesse Barnes040484a2011-01-03 12:14:26 -08001800}
1801
Paulo Zanoniab4d9662012-10-31 18:12:55 -02001802static void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv)
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001803{
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001804 u32 val;
1805
Paulo Zanoni8a52fd92012-10-31 18:12:51 -02001806 val = I915_READ(_TRANSACONF);
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001807 val &= ~TRANS_ENABLE;
Paulo Zanoni8a52fd92012-10-31 18:12:51 -02001808 I915_WRITE(_TRANSACONF, val);
Paulo Zanoni8fb033d2012-10-31 18:12:43 -02001809 /* wait for PCH transcoder off, transcoder state */
Paulo Zanoni8a52fd92012-10-31 18:12:51 -02001810 if (wait_for((I915_READ(_TRANSACONF) & TRANS_STATE_ENABLE) == 0, 50))
1811 DRM_ERROR("Failed to disable PCH transcoder\n");
Paulo Zanoni223a6fd2012-10-31 18:12:52 -02001812
1813 /* Workaround: clear timing override bit. */
1814 val = I915_READ(_TRANSA_CHICKEN2);
Daniel Vetter23670b322012-11-01 09:15:30 +01001815 val &= ~TRANS_CHICKEN2_TIMING_OVERRIDE;
Paulo Zanoni223a6fd2012-10-31 18:12:52 -02001816 I915_WRITE(_TRANSA_CHICKEN2, val);
Jesse Barnes92f25842011-01-04 15:09:34 -08001817}
1818
1819/**
Chris Wilson309cfea2011-01-28 13:54:53 +00001820 * intel_enable_pipe - enable a pipe, asserting requirements
Jesse Barnesb24e7172011-01-04 15:09:30 -08001821 * @dev_priv: i915 private structure
1822 * @pipe: pipe to enable
Jesse Barnes040484a2011-01-03 12:14:26 -08001823 * @pch_port: on ILK+, is this pipe driving a PCH port or not
Jesse Barnesb24e7172011-01-04 15:09:30 -08001824 *
1825 * Enable @pipe, making sure that various hardware specific requirements
1826 * are met, if applicable, e.g. PLL enabled, LVDS pairs enabled, etc.
1827 *
1828 * @pipe should be %PIPE_A or %PIPE_B.
1829 *
1830 * Will wait until the pipe is actually running (i.e. first vblank) before
1831 * returning.
1832 */
Jesse Barnes040484a2011-01-03 12:14:26 -08001833static void intel_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe,
1834 bool pch_port)
Jesse Barnesb24e7172011-01-04 15:09:30 -08001835{
Paulo Zanoni702e7a52012-10-23 18:29:59 -02001836 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
1837 pipe);
Daniel Vetter1a240d42012-11-29 22:18:51 +01001838 enum pipe pch_transcoder;
Jesse Barnesb24e7172011-01-04 15:09:30 -08001839 int reg;
1840 u32 val;
1841
Daniel Vetter58c6eaa2013-04-11 16:29:09 +02001842 assert_planes_disabled(dev_priv, pipe);
1843 assert_sprites_disabled(dev_priv, pipe);
1844
Paulo Zanoni681e5812012-12-06 11:12:38 -02001845 if (HAS_PCH_LPT(dev_priv->dev))
Paulo Zanonicc391bb2012-11-20 13:27:37 -02001846 pch_transcoder = TRANSCODER_A;
1847 else
1848 pch_transcoder = pipe;
1849
Jesse Barnesb24e7172011-01-04 15:09:30 -08001850 /*
1851 * A pipe without a PLL won't actually be able to drive bits from
1852 * a plane. On ILK+ the pipe PLLs are integrated, so we don't
1853 * need the check.
1854 */
1855 if (!HAS_PCH_SPLIT(dev_priv->dev))
1856 assert_pll_enabled(dev_priv, pipe);
Jesse Barnes040484a2011-01-03 12:14:26 -08001857 else {
1858 if (pch_port) {
1859 /* if driving the PCH, we need FDI enabled */
Paulo Zanonicc391bb2012-11-20 13:27:37 -02001860 assert_fdi_rx_pll_enabled(dev_priv, pch_transcoder);
Daniel Vetter1a240d42012-11-29 22:18:51 +01001861 assert_fdi_tx_pll_enabled(dev_priv,
1862 (enum pipe) cpu_transcoder);
Jesse Barnes040484a2011-01-03 12:14:26 -08001863 }
1864 /* FIXME: assert CPU port conditions for SNB+ */
1865 }
Jesse Barnesb24e7172011-01-04 15:09:30 -08001866
Paulo Zanoni702e7a52012-10-23 18:29:59 -02001867 reg = PIPECONF(cpu_transcoder);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001868 val = I915_READ(reg);
Chris Wilson00d70b12011-03-17 07:18:29 +00001869 if (val & PIPECONF_ENABLE)
1870 return;
1871
1872 I915_WRITE(reg, val | PIPECONF_ENABLE);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001873 intel_wait_for_vblank(dev_priv->dev, pipe);
1874}
1875
1876/**
Chris Wilson309cfea2011-01-28 13:54:53 +00001877 * intel_disable_pipe - disable a pipe, asserting requirements
Jesse Barnesb24e7172011-01-04 15:09:30 -08001878 * @dev_priv: i915 private structure
1879 * @pipe: pipe to disable
1880 *
1881 * Disable @pipe, making sure that various hardware specific requirements
1882 * are met, if applicable, e.g. plane disabled, panel fitter off, etc.
1883 *
1884 * @pipe should be %PIPE_A or %PIPE_B.
1885 *
1886 * Will wait until the pipe has shut down before returning.
1887 */
1888static void intel_disable_pipe(struct drm_i915_private *dev_priv,
1889 enum pipe pipe)
1890{
Paulo Zanoni702e7a52012-10-23 18:29:59 -02001891 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
1892 pipe);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001893 int reg;
1894 u32 val;
1895
1896 /*
1897 * Make sure planes won't keep trying to pump pixels to us,
1898 * or we might hang the display.
1899 */
1900 assert_planes_disabled(dev_priv, pipe);
Jesse Barnes19332d72013-03-28 09:55:38 -07001901 assert_sprites_disabled(dev_priv, pipe);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001902
1903 /* Don't disable pipe A or pipe A PLLs if needed */
1904 if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE))
1905 return;
1906
Paulo Zanoni702e7a52012-10-23 18:29:59 -02001907 reg = PIPECONF(cpu_transcoder);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001908 val = I915_READ(reg);
Chris Wilson00d70b12011-03-17 07:18:29 +00001909 if ((val & PIPECONF_ENABLE) == 0)
1910 return;
1911
1912 I915_WRITE(reg, val & ~PIPECONF_ENABLE);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001913 intel_wait_for_pipe_off(dev_priv->dev, pipe);
1914}
1915
Keith Packardd74362c2011-07-28 14:47:14 -07001916/*
1917 * Plane regs are double buffered, going from enabled->disabled needs a
1918 * trigger in order to latch. The display address reg provides this.
1919 */
Eugeni Dodonov6f1d69b2012-04-18 15:29:25 -03001920void intel_flush_display_plane(struct drm_i915_private *dev_priv,
Keith Packardd74362c2011-07-28 14:47:14 -07001921 enum plane plane)
1922{
Damien Lespiau14f86142012-10-29 15:24:49 +00001923 if (dev_priv->info->gen >= 4)
1924 I915_WRITE(DSPSURF(plane), I915_READ(DSPSURF(plane)));
1925 else
1926 I915_WRITE(DSPADDR(plane), I915_READ(DSPADDR(plane)));
Keith Packardd74362c2011-07-28 14:47:14 -07001927}
1928
Jesse Barnesb24e7172011-01-04 15:09:30 -08001929/**
1930 * intel_enable_plane - enable a display plane on a given pipe
1931 * @dev_priv: i915 private structure
1932 * @plane: plane to enable
1933 * @pipe: pipe being fed
1934 *
1935 * Enable @plane on @pipe, making sure that @pipe is running first.
1936 */
1937static void intel_enable_plane(struct drm_i915_private *dev_priv,
1938 enum plane plane, enum pipe pipe)
1939{
1940 int reg;
1941 u32 val;
1942
1943 /* If the pipe isn't enabled, we can't pump pixels and may hang */
1944 assert_pipe_enabled(dev_priv, pipe);
1945
1946 reg = DSPCNTR(plane);
1947 val = I915_READ(reg);
Chris Wilson00d70b12011-03-17 07:18:29 +00001948 if (val & DISPLAY_PLANE_ENABLE)
1949 return;
1950
1951 I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
Keith Packardd74362c2011-07-28 14:47:14 -07001952 intel_flush_display_plane(dev_priv, plane);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001953 intel_wait_for_vblank(dev_priv->dev, pipe);
1954}
1955
Jesse Barnesb24e7172011-01-04 15:09:30 -08001956/**
1957 * intel_disable_plane - disable a display plane
1958 * @dev_priv: i915 private structure
1959 * @plane: plane to disable
1960 * @pipe: pipe consuming the data
1961 *
1962 * Disable @plane; should be an independent operation.
1963 */
1964static void intel_disable_plane(struct drm_i915_private *dev_priv,
1965 enum plane plane, enum pipe pipe)
1966{
1967 int reg;
1968 u32 val;
1969
1970 reg = DSPCNTR(plane);
1971 val = I915_READ(reg);
Chris Wilson00d70b12011-03-17 07:18:29 +00001972 if ((val & DISPLAY_PLANE_ENABLE) == 0)
1973 return;
1974
1975 I915_WRITE(reg, val & ~DISPLAY_PLANE_ENABLE);
Jesse Barnesb24e7172011-01-04 15:09:30 -08001976 intel_flush_display_plane(dev_priv, plane);
1977 intel_wait_for_vblank(dev_priv->dev, pipe);
1978}
1979
Chris Wilson693db182013-03-05 14:52:39 +00001980static bool need_vtd_wa(struct drm_device *dev)
1981{
1982#ifdef CONFIG_INTEL_IOMMU
1983 if (INTEL_INFO(dev)->gen >= 6 && intel_iommu_gfx_mapped)
1984 return true;
1985#endif
1986 return false;
1987}
1988
Chris Wilson127bd2a2010-07-23 23:32:05 +01001989int
Chris Wilson48b956c2010-09-14 12:50:34 +01001990intel_pin_and_fence_fb_obj(struct drm_device *dev,
Chris Wilson05394f32010-11-08 19:18:58 +00001991 struct drm_i915_gem_object *obj,
Chris Wilson919926a2010-11-12 13:42:53 +00001992 struct intel_ring_buffer *pipelined)
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05001993{
Chris Wilsonce453d82011-02-21 14:43:56 +00001994 struct drm_i915_private *dev_priv = dev->dev_private;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05001995 u32 alignment;
1996 int ret;
1997
Chris Wilson05394f32010-11-08 19:18:58 +00001998 switch (obj->tiling_mode) {
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05001999 case I915_TILING_NONE:
Chris Wilson534843d2010-07-05 18:01:46 +01002000 if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
2001 alignment = 128 * 1024;
Chris Wilsona6c45cf2010-09-17 00:32:17 +01002002 else if (INTEL_INFO(dev)->gen >= 4)
Chris Wilson534843d2010-07-05 18:01:46 +01002003 alignment = 4 * 1024;
2004 else
2005 alignment = 64 * 1024;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002006 break;
2007 case I915_TILING_X:
2008 /* pin() will align the object as required by fence */
2009 alignment = 0;
2010 break;
2011 case I915_TILING_Y:
Daniel Vetter8bb6e952013-04-06 23:54:56 +02002012 /* Despite that we check this in framebuffer_init userspace can
2013 * screw us over and change the tiling after the fact. Only
2014 * pinned buffers can't change their tiling. */
2015 DRM_DEBUG_DRIVER("Y tiled not allowed for scan out buffers\n");
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002016 return -EINVAL;
2017 default:
2018 BUG();
2019 }
2020
Chris Wilson693db182013-03-05 14:52:39 +00002021 /* Note that the w/a also requires 64 PTE of padding following the
2022 * bo. We currently fill all unused PTE with the shadow page and so
2023 * we should always have valid PTE following the scanout preventing
2024 * the VT-d warning.
2025 */
2026 if (need_vtd_wa(dev) && alignment < 256 * 1024)
2027 alignment = 256 * 1024;
2028
Chris Wilsonce453d82011-02-21 14:43:56 +00002029 dev_priv->mm.interruptible = false;
Chris Wilson2da3b9b2011-04-14 09:41:17 +01002030 ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined);
Chris Wilson48b956c2010-09-14 12:50:34 +01002031 if (ret)
Chris Wilsonce453d82011-02-21 14:43:56 +00002032 goto err_interruptible;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002033
2034 /* Install a fence for tiled scan-out. Pre-i965 always needs a
2035 * fence, whereas 965+ only requires a fence if using
2036 * framebuffer compression. For simplicity, we always install
2037 * a fence as the cost is not that onerous.
2038 */
Chris Wilson06d98132012-04-17 15:31:24 +01002039 ret = i915_gem_object_get_fence(obj);
Chris Wilson9a5a53b2012-03-22 15:10:00 +00002040 if (ret)
2041 goto err_unpin;
Chris Wilson1690e1e2011-12-14 13:57:08 +01002042
Chris Wilson9a5a53b2012-03-22 15:10:00 +00002043 i915_gem_object_pin_fence(obj);
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002044
Chris Wilsonce453d82011-02-21 14:43:56 +00002045 dev_priv->mm.interruptible = true;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002046 return 0;
Chris Wilson48b956c2010-09-14 12:50:34 +01002047
2048err_unpin:
2049 i915_gem_object_unpin(obj);
Chris Wilsonce453d82011-02-21 14:43:56 +00002050err_interruptible:
2051 dev_priv->mm.interruptible = true;
Chris Wilson48b956c2010-09-14 12:50:34 +01002052 return ret;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002053}
2054
Chris Wilson1690e1e2011-12-14 13:57:08 +01002055void intel_unpin_fb_obj(struct drm_i915_gem_object *obj)
2056{
2057 i915_gem_object_unpin_fence(obj);
2058 i915_gem_object_unpin(obj);
2059}
2060
Daniel Vetterc2c75132012-07-05 12:17:30 +02002061/* Computes the linear offset to the base tile and adjusts x, y. bytes per pixel
2062 * is assumed to be a power-of-two. */
Chris Wilsonbc752862013-02-21 20:04:31 +00002063unsigned long intel_gen4_compute_page_offset(int *x, int *y,
2064 unsigned int tiling_mode,
2065 unsigned int cpp,
2066 unsigned int pitch)
Daniel Vetterc2c75132012-07-05 12:17:30 +02002067{
Chris Wilsonbc752862013-02-21 20:04:31 +00002068 if (tiling_mode != I915_TILING_NONE) {
2069 unsigned int tile_rows, tiles;
Daniel Vetterc2c75132012-07-05 12:17:30 +02002070
Chris Wilsonbc752862013-02-21 20:04:31 +00002071 tile_rows = *y / 8;
2072 *y %= 8;
Daniel Vetterc2c75132012-07-05 12:17:30 +02002073
Chris Wilsonbc752862013-02-21 20:04:31 +00002074 tiles = *x / (512/cpp);
2075 *x %= 512/cpp;
2076
2077 return tile_rows * pitch * 8 + tiles * 4096;
2078 } else {
2079 unsigned int offset;
2080
2081 offset = *y * pitch + *x * cpp;
2082 *y = 0;
2083 *x = (offset & 4095) / cpp;
2084 return offset & -4096;
2085 }
Daniel Vetterc2c75132012-07-05 12:17:30 +02002086}
2087
Jesse Barnes17638cd2011-06-24 12:19:23 -07002088static int i9xx_update_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb,
2089 int x, int y)
Jesse Barnes81255562010-08-02 12:07:50 -07002090{
2091 struct drm_device *dev = crtc->dev;
2092 struct drm_i915_private *dev_priv = dev->dev_private;
2093 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2094 struct intel_framebuffer *intel_fb;
Chris Wilson05394f32010-11-08 19:18:58 +00002095 struct drm_i915_gem_object *obj;
Jesse Barnes81255562010-08-02 12:07:50 -07002096 int plane = intel_crtc->plane;
Daniel Vettere506a0c2012-07-05 12:17:29 +02002097 unsigned long linear_offset;
Jesse Barnes81255562010-08-02 12:07:50 -07002098 u32 dspcntr;
Chris Wilson5eddb702010-09-11 13:48:45 +01002099 u32 reg;
Jesse Barnes81255562010-08-02 12:07:50 -07002100
2101 switch (plane) {
2102 case 0:
2103 case 1:
2104 break;
2105 default:
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03002106 DRM_ERROR("Can't update plane %c in SAREA\n", plane_name(plane));
Jesse Barnes81255562010-08-02 12:07:50 -07002107 return -EINVAL;
2108 }
2109
2110 intel_fb = to_intel_framebuffer(fb);
2111 obj = intel_fb->obj;
Jesse Barnes81255562010-08-02 12:07:50 -07002112
Chris Wilson5eddb702010-09-11 13:48:45 +01002113 reg = DSPCNTR(plane);
2114 dspcntr = I915_READ(reg);
Jesse Barnes81255562010-08-02 12:07:50 -07002115 /* Mask out pixel format bits in case we change it */
2116 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
Ville Syrjälä57779d02012-10-31 17:50:14 +02002117 switch (fb->pixel_format) {
2118 case DRM_FORMAT_C8:
Jesse Barnes81255562010-08-02 12:07:50 -07002119 dspcntr |= DISPPLANE_8BPP;
2120 break;
Ville Syrjälä57779d02012-10-31 17:50:14 +02002121 case DRM_FORMAT_XRGB1555:
2122 case DRM_FORMAT_ARGB1555:
2123 dspcntr |= DISPPLANE_BGRX555;
Jesse Barnes81255562010-08-02 12:07:50 -07002124 break;
Ville Syrjälä57779d02012-10-31 17:50:14 +02002125 case DRM_FORMAT_RGB565:
2126 dspcntr |= DISPPLANE_BGRX565;
2127 break;
2128 case DRM_FORMAT_XRGB8888:
2129 case DRM_FORMAT_ARGB8888:
2130 dspcntr |= DISPPLANE_BGRX888;
2131 break;
2132 case DRM_FORMAT_XBGR8888:
2133 case DRM_FORMAT_ABGR8888:
2134 dspcntr |= DISPPLANE_RGBX888;
2135 break;
2136 case DRM_FORMAT_XRGB2101010:
2137 case DRM_FORMAT_ARGB2101010:
2138 dspcntr |= DISPPLANE_BGRX101010;
2139 break;
2140 case DRM_FORMAT_XBGR2101010:
2141 case DRM_FORMAT_ABGR2101010:
2142 dspcntr |= DISPPLANE_RGBX101010;
Jesse Barnes81255562010-08-02 12:07:50 -07002143 break;
2144 default:
Daniel Vetterbaba1332013-03-27 00:45:00 +01002145 BUG();
Jesse Barnes81255562010-08-02 12:07:50 -07002146 }
Ville Syrjälä57779d02012-10-31 17:50:14 +02002147
Chris Wilsona6c45cf2010-09-17 00:32:17 +01002148 if (INTEL_INFO(dev)->gen >= 4) {
Chris Wilson05394f32010-11-08 19:18:58 +00002149 if (obj->tiling_mode != I915_TILING_NONE)
Jesse Barnes81255562010-08-02 12:07:50 -07002150 dspcntr |= DISPPLANE_TILED;
2151 else
2152 dspcntr &= ~DISPPLANE_TILED;
2153 }
2154
Chris Wilson5eddb702010-09-11 13:48:45 +01002155 I915_WRITE(reg, dspcntr);
Jesse Barnes81255562010-08-02 12:07:50 -07002156
Daniel Vettere506a0c2012-07-05 12:17:29 +02002157 linear_offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8);
Jesse Barnes81255562010-08-02 12:07:50 -07002158
Daniel Vetterc2c75132012-07-05 12:17:30 +02002159 if (INTEL_INFO(dev)->gen >= 4) {
2160 intel_crtc->dspaddr_offset =
Chris Wilsonbc752862013-02-21 20:04:31 +00002161 intel_gen4_compute_page_offset(&x, &y, obj->tiling_mode,
2162 fb->bits_per_pixel / 8,
2163 fb->pitches[0]);
Daniel Vetterc2c75132012-07-05 12:17:30 +02002164 linear_offset -= intel_crtc->dspaddr_offset;
2165 } else {
Daniel Vettere506a0c2012-07-05 12:17:29 +02002166 intel_crtc->dspaddr_offset = linear_offset;
Daniel Vetterc2c75132012-07-05 12:17:30 +02002167 }
Daniel Vettere506a0c2012-07-05 12:17:29 +02002168
2169 DRM_DEBUG_KMS("Writing base %08X %08lX %d %d %d\n",
2170 obj->gtt_offset, linear_offset, x, y, fb->pitches[0]);
Ville Syrjälä01f2c772011-12-20 00:06:49 +02002171 I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
Chris Wilsona6c45cf2010-09-17 00:32:17 +01002172 if (INTEL_INFO(dev)->gen >= 4) {
Daniel Vetterc2c75132012-07-05 12:17:30 +02002173 I915_MODIFY_DISPBASE(DSPSURF(plane),
2174 obj->gtt_offset + intel_crtc->dspaddr_offset);
Chris Wilson5eddb702010-09-11 13:48:45 +01002175 I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
Daniel Vettere506a0c2012-07-05 12:17:29 +02002176 I915_WRITE(DSPLINOFF(plane), linear_offset);
Chris Wilson5eddb702010-09-11 13:48:45 +01002177 } else
Daniel Vettere506a0c2012-07-05 12:17:29 +02002178 I915_WRITE(DSPADDR(plane), obj->gtt_offset + linear_offset);
Chris Wilson5eddb702010-09-11 13:48:45 +01002179 POSTING_READ(reg);
Jesse Barnes81255562010-08-02 12:07:50 -07002180
Jesse Barnes17638cd2011-06-24 12:19:23 -07002181 return 0;
2182}
2183
2184static int ironlake_update_plane(struct drm_crtc *crtc,
2185 struct drm_framebuffer *fb, int x, int y)
2186{
2187 struct drm_device *dev = crtc->dev;
2188 struct drm_i915_private *dev_priv = dev->dev_private;
2189 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2190 struct intel_framebuffer *intel_fb;
2191 struct drm_i915_gem_object *obj;
2192 int plane = intel_crtc->plane;
Daniel Vettere506a0c2012-07-05 12:17:29 +02002193 unsigned long linear_offset;
Jesse Barnes17638cd2011-06-24 12:19:23 -07002194 u32 dspcntr;
2195 u32 reg;
2196
2197 switch (plane) {
2198 case 0:
2199 case 1:
Jesse Barnes27f82272011-09-02 12:54:37 -07002200 case 2:
Jesse Barnes17638cd2011-06-24 12:19:23 -07002201 break;
2202 default:
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03002203 DRM_ERROR("Can't update plane %c in SAREA\n", plane_name(plane));
Jesse Barnes17638cd2011-06-24 12:19:23 -07002204 return -EINVAL;
2205 }
2206
2207 intel_fb = to_intel_framebuffer(fb);
2208 obj = intel_fb->obj;
2209
2210 reg = DSPCNTR(plane);
2211 dspcntr = I915_READ(reg);
2212 /* Mask out pixel format bits in case we change it */
2213 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
Ville Syrjälä57779d02012-10-31 17:50:14 +02002214 switch (fb->pixel_format) {
2215 case DRM_FORMAT_C8:
Jesse Barnes17638cd2011-06-24 12:19:23 -07002216 dspcntr |= DISPPLANE_8BPP;
2217 break;
Ville Syrjälä57779d02012-10-31 17:50:14 +02002218 case DRM_FORMAT_RGB565:
2219 dspcntr |= DISPPLANE_BGRX565;
Jesse Barnes17638cd2011-06-24 12:19:23 -07002220 break;
Ville Syrjälä57779d02012-10-31 17:50:14 +02002221 case DRM_FORMAT_XRGB8888:
2222 case DRM_FORMAT_ARGB8888:
2223 dspcntr |= DISPPLANE_BGRX888;
2224 break;
2225 case DRM_FORMAT_XBGR8888:
2226 case DRM_FORMAT_ABGR8888:
2227 dspcntr |= DISPPLANE_RGBX888;
2228 break;
2229 case DRM_FORMAT_XRGB2101010:
2230 case DRM_FORMAT_ARGB2101010:
2231 dspcntr |= DISPPLANE_BGRX101010;
2232 break;
2233 case DRM_FORMAT_XBGR2101010:
2234 case DRM_FORMAT_ABGR2101010:
2235 dspcntr |= DISPPLANE_RGBX101010;
Jesse Barnes17638cd2011-06-24 12:19:23 -07002236 break;
2237 default:
Daniel Vetterbaba1332013-03-27 00:45:00 +01002238 BUG();
Jesse Barnes17638cd2011-06-24 12:19:23 -07002239 }
2240
2241 if (obj->tiling_mode != I915_TILING_NONE)
2242 dspcntr |= DISPPLANE_TILED;
2243 else
2244 dspcntr &= ~DISPPLANE_TILED;
2245
2246 /* must disable */
2247 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
2248
2249 I915_WRITE(reg, dspcntr);
2250
Daniel Vettere506a0c2012-07-05 12:17:29 +02002251 linear_offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8);
Daniel Vetterc2c75132012-07-05 12:17:30 +02002252 intel_crtc->dspaddr_offset =
Chris Wilsonbc752862013-02-21 20:04:31 +00002253 intel_gen4_compute_page_offset(&x, &y, obj->tiling_mode,
2254 fb->bits_per_pixel / 8,
2255 fb->pitches[0]);
Daniel Vetterc2c75132012-07-05 12:17:30 +02002256 linear_offset -= intel_crtc->dspaddr_offset;
Jesse Barnes17638cd2011-06-24 12:19:23 -07002257
Daniel Vettere506a0c2012-07-05 12:17:29 +02002258 DRM_DEBUG_KMS("Writing base %08X %08lX %d %d %d\n",
2259 obj->gtt_offset, linear_offset, x, y, fb->pitches[0]);
Ville Syrjälä01f2c772011-12-20 00:06:49 +02002260 I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
Daniel Vetterc2c75132012-07-05 12:17:30 +02002261 I915_MODIFY_DISPBASE(DSPSURF(plane),
2262 obj->gtt_offset + intel_crtc->dspaddr_offset);
Damien Lespiaubc1c91e2012-10-29 12:14:21 +00002263 if (IS_HASWELL(dev)) {
2264 I915_WRITE(DSPOFFSET(plane), (y << 16) | x);
2265 } else {
2266 I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
2267 I915_WRITE(DSPLINOFF(plane), linear_offset);
2268 }
Jesse Barnes17638cd2011-06-24 12:19:23 -07002269 POSTING_READ(reg);
2270
2271 return 0;
2272}
2273
2274/* Assume fb object is pinned & idle & fenced and just update base pointers */
2275static int
2276intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
2277 int x, int y, enum mode_set_atomic state)
2278{
2279 struct drm_device *dev = crtc->dev;
2280 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes17638cd2011-06-24 12:19:23 -07002281
Chris Wilson6b8e6ed2012-04-17 15:08:19 +01002282 if (dev_priv->display.disable_fbc)
2283 dev_priv->display.disable_fbc(dev);
Daniel Vetter3dec0092010-08-20 21:40:52 +02002284 intel_increase_pllclock(crtc);
Jesse Barnes81255562010-08-02 12:07:50 -07002285
Chris Wilson6b8e6ed2012-04-17 15:08:19 +01002286 return dev_priv->display.update_plane(crtc, fb, x, y);
Jesse Barnes81255562010-08-02 12:07:50 -07002287}
2288
Ville Syrjälä96a02912013-02-18 19:08:49 +02002289void intel_display_handle_reset(struct drm_device *dev)
2290{
2291 struct drm_i915_private *dev_priv = dev->dev_private;
2292 struct drm_crtc *crtc;
2293
2294 /*
2295 * Flips in the rings have been nuked by the reset,
2296 * so complete all pending flips so that user space
2297 * will get its events and not get stuck.
2298 *
2299 * Also update the base address of all primary
2300 * planes to the the last fb to make sure we're
2301 * showing the correct fb after a reset.
2302 *
2303 * Need to make two loops over the crtcs so that we
2304 * don't try to grab a crtc mutex before the
2305 * pending_flip_queue really got woken up.
2306 */
2307
2308 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2309 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2310 enum plane plane = intel_crtc->plane;
2311
2312 intel_prepare_page_flip(dev, plane);
2313 intel_finish_page_flip_plane(dev, plane);
2314 }
2315
2316 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
2317 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2318
2319 mutex_lock(&crtc->mutex);
2320 if (intel_crtc->active)
2321 dev_priv->display.update_plane(crtc, crtc->fb,
2322 crtc->x, crtc->y);
2323 mutex_unlock(&crtc->mutex);
2324 }
2325}
2326
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05002327static int
Chris Wilson14667a42012-04-03 17:58:35 +01002328intel_finish_fb(struct drm_framebuffer *old_fb)
2329{
2330 struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
2331 struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
2332 bool was_interruptible = dev_priv->mm.interruptible;
2333 int ret;
2334
Chris Wilson14667a42012-04-03 17:58:35 +01002335 /* Big Hammer, we also need to ensure that any pending
2336 * MI_WAIT_FOR_EVENT inside a user batch buffer on the
2337 * current scanout is retired before unpinning the old
2338 * framebuffer.
2339 *
2340 * This should only fail upon a hung GPU, in which case we
2341 * can safely continue.
2342 */
2343 dev_priv->mm.interruptible = false;
2344 ret = i915_gem_object_finish_gpu(obj);
2345 dev_priv->mm.interruptible = was_interruptible;
2346
2347 return ret;
2348}
2349
Ville Syrjälä198598d2012-10-31 17:50:24 +02002350static void intel_crtc_update_sarea_pos(struct drm_crtc *crtc, int x, int y)
2351{
2352 struct drm_device *dev = crtc->dev;
2353 struct drm_i915_master_private *master_priv;
2354 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2355
2356 if (!dev->primary->master)
2357 return;
2358
2359 master_priv = dev->primary->master->driver_priv;
2360 if (!master_priv->sarea_priv)
2361 return;
2362
2363 switch (intel_crtc->pipe) {
2364 case 0:
2365 master_priv->sarea_priv->pipeA_x = x;
2366 master_priv->sarea_priv->pipeA_y = y;
2367 break;
2368 case 1:
2369 master_priv->sarea_priv->pipeB_x = x;
2370 master_priv->sarea_priv->pipeB_y = y;
2371 break;
2372 default:
2373 break;
2374 }
2375}
2376
Chris Wilson14667a42012-04-03 17:58:35 +01002377static int
Kristian Høgsberg3c4fdcf2008-12-17 22:14:46 -05002378intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
Daniel Vetter94352cf2012-07-05 22:51:56 +02002379 struct drm_framebuffer *fb)
Jesse Barnes79e53942008-11-07 14:24:08 -08002380{
2381 struct drm_device *dev = crtc->dev;
Chris Wilson6b8e6ed2012-04-17 15:08:19 +01002382 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes79e53942008-11-07 14:24:08 -08002383 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter94352cf2012-07-05 22:51:56 +02002384 struct drm_framebuffer *old_fb;
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002385 int ret;
Jesse Barnes79e53942008-11-07 14:24:08 -08002386
2387 /* no fb bound */
Daniel Vetter94352cf2012-07-05 22:51:56 +02002388 if (!fb) {
Jesse Barnesa5071c22011-07-19 15:38:56 -07002389 DRM_ERROR("No FB bound\n");
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002390 return 0;
2391 }
2392
Ben Widawsky7eb552a2013-03-13 14:05:41 -07002393 if (intel_crtc->plane > INTEL_INFO(dev)->num_pipes) {
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03002394 DRM_ERROR("no plane for crtc: plane %c, num_pipes %d\n",
2395 plane_name(intel_crtc->plane),
2396 INTEL_INFO(dev)->num_pipes);
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002397 return -EINVAL;
Jesse Barnes79e53942008-11-07 14:24:08 -08002398 }
2399
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002400 mutex_lock(&dev->struct_mutex);
Chris Wilson265db952010-09-20 15:41:01 +01002401 ret = intel_pin_and_fence_fb_obj(dev,
Daniel Vetter94352cf2012-07-05 22:51:56 +02002402 to_intel_framebuffer(fb)->obj,
Chris Wilson919926a2010-11-12 13:42:53 +00002403 NULL);
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002404 if (ret != 0) {
2405 mutex_unlock(&dev->struct_mutex);
Jesse Barnesa5071c22011-07-19 15:38:56 -07002406 DRM_ERROR("pin & fence failed\n");
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002407 return ret;
2408 }
Kristian Høgsberg3c4fdcf2008-12-17 22:14:46 -05002409
Daniel Vetter94352cf2012-07-05 22:51:56 +02002410 ret = dev_priv->display.update_plane(crtc, fb, x, y);
Chris Wilson4e6cfef2010-08-08 13:20:19 +01002411 if (ret) {
Daniel Vetter94352cf2012-07-05 22:51:56 +02002412 intel_unpin_fb_obj(to_intel_framebuffer(fb)->obj);
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002413 mutex_unlock(&dev->struct_mutex);
Jesse Barnesa5071c22011-07-19 15:38:56 -07002414 DRM_ERROR("failed to update base address\n");
Chris Wilson4e6cfef2010-08-08 13:20:19 +01002415 return ret;
Jesse Barnes79e53942008-11-07 14:24:08 -08002416 }
Kristian Høgsberg3c4fdcf2008-12-17 22:14:46 -05002417
Daniel Vetter94352cf2012-07-05 22:51:56 +02002418 old_fb = crtc->fb;
2419 crtc->fb = fb;
Daniel Vetter6c4c86f2012-09-10 21:58:30 +02002420 crtc->x = x;
2421 crtc->y = y;
Daniel Vetter94352cf2012-07-05 22:51:56 +02002422
Chris Wilsonb7f1de22010-12-14 16:09:31 +00002423 if (old_fb) {
2424 intel_wait_for_vblank(dev, intel_crtc->pipe);
Chris Wilson1690e1e2011-12-14 13:57:08 +01002425 intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj);
Chris Wilsonb7f1de22010-12-14 16:09:31 +00002426 }
Jesse Barnes652c3932009-08-17 13:31:43 -07002427
Chris Wilson6b8e6ed2012-04-17 15:08:19 +01002428 intel_update_fbc(dev);
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002429 mutex_unlock(&dev->struct_mutex);
Jesse Barnes79e53942008-11-07 14:24:08 -08002430
Ville Syrjälä198598d2012-10-31 17:50:24 +02002431 intel_crtc_update_sarea_pos(crtc, x, y);
Chris Wilson5c3b82e2009-02-11 13:25:09 +00002432
2433 return 0;
Jesse Barnes79e53942008-11-07 14:24:08 -08002434}
2435
Zhenyu Wang5e84e1a2010-10-28 16:38:08 +08002436static void intel_fdi_normal_train(struct drm_crtc *crtc)
2437{
2438 struct drm_device *dev = crtc->dev;
2439 struct drm_i915_private *dev_priv = dev->dev_private;
2440 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2441 int pipe = intel_crtc->pipe;
2442 u32 reg, temp;
2443
2444 /* enable normal train */
2445 reg = FDI_TX_CTL(pipe);
2446 temp = I915_READ(reg);
Keith Packard61e499b2011-05-17 16:13:52 -07002447 if (IS_IVYBRIDGE(dev)) {
Jesse Barnes357555c2011-04-28 15:09:55 -07002448 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
2449 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
Keith Packard61e499b2011-05-17 16:13:52 -07002450 } else {
2451 temp &= ~FDI_LINK_TRAIN_NONE;
2452 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
Jesse Barnes357555c2011-04-28 15:09:55 -07002453 }
Zhenyu Wang5e84e1a2010-10-28 16:38:08 +08002454 I915_WRITE(reg, temp);
2455
2456 reg = FDI_RX_CTL(pipe);
2457 temp = I915_READ(reg);
2458 if (HAS_PCH_CPT(dev)) {
2459 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2460 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
2461 } else {
2462 temp &= ~FDI_LINK_TRAIN_NONE;
2463 temp |= FDI_LINK_TRAIN_NONE;
2464 }
2465 I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
2466
2467 /* wait one idle pattern time */
2468 POSTING_READ(reg);
2469 udelay(1000);
Jesse Barnes357555c2011-04-28 15:09:55 -07002470
2471 /* IVB wants error correction enabled */
2472 if (IS_IVYBRIDGE(dev))
2473 I915_WRITE(reg, I915_READ(reg) | FDI_FS_ERRC_ENABLE |
2474 FDI_FE_ERRC_ENABLE);
Zhenyu Wang5e84e1a2010-10-28 16:38:08 +08002475}
2476
Daniel Vetter01a415f2012-10-27 15:58:40 +02002477static void ivb_modeset_global_resources(struct drm_device *dev)
2478{
2479 struct drm_i915_private *dev_priv = dev->dev_private;
2480 struct intel_crtc *pipe_B_crtc =
2481 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_B]);
2482 struct intel_crtc *pipe_C_crtc =
2483 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_C]);
2484 uint32_t temp;
2485
2486 /* When everything is off disable fdi C so that we could enable fdi B
2487 * with all lanes. XXX: This misses the case where a pipe is not using
2488 * any pch resources and so doesn't need any fdi lanes. */
2489 if (!pipe_B_crtc->base.enabled && !pipe_C_crtc->base.enabled) {
2490 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
2491 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
2492
2493 temp = I915_READ(SOUTH_CHICKEN1);
2494 temp &= ~FDI_BC_BIFURCATION_SELECT;
2495 DRM_DEBUG_KMS("disabling fdi C rx\n");
2496 I915_WRITE(SOUTH_CHICKEN1, temp);
2497 }
2498}
2499
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002500/* The FDI link training functions for ILK/Ibexpeak. */
2501static void ironlake_fdi_link_train(struct drm_crtc *crtc)
2502{
2503 struct drm_device *dev = crtc->dev;
2504 struct drm_i915_private *dev_priv = dev->dev_private;
2505 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2506 int pipe = intel_crtc->pipe;
Jesse Barnes0fc932b2011-01-04 15:09:37 -08002507 int plane = intel_crtc->plane;
Chris Wilson5eddb702010-09-11 13:48:45 +01002508 u32 reg, temp, tries;
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002509
Jesse Barnes0fc932b2011-01-04 15:09:37 -08002510 /* FDI needs bits from pipe & plane first */
2511 assert_pipe_enabled(dev_priv, pipe);
2512 assert_plane_enabled(dev_priv, plane);
2513
Adam Jacksone1a44742010-06-25 15:32:14 -04002514 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
2515 for train result */
Chris Wilson5eddb702010-09-11 13:48:45 +01002516 reg = FDI_RX_IMR(pipe);
2517 temp = I915_READ(reg);
Adam Jacksone1a44742010-06-25 15:32:14 -04002518 temp &= ~FDI_RX_SYMBOL_LOCK;
2519 temp &= ~FDI_RX_BIT_LOCK;
Chris Wilson5eddb702010-09-11 13:48:45 +01002520 I915_WRITE(reg, temp);
2521 I915_READ(reg);
Adam Jacksone1a44742010-06-25 15:32:14 -04002522 udelay(150);
2523
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002524 /* enable CPU FDI TX and PCH FDI RX */
Chris Wilson5eddb702010-09-11 13:48:45 +01002525 reg = FDI_TX_CTL(pipe);
2526 temp = I915_READ(reg);
Adam Jackson77ffb592010-04-12 11:38:44 -04002527 temp &= ~(7 << 19);
2528 temp |= (intel_crtc->fdi_lanes - 1) << 19;
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002529 temp &= ~FDI_LINK_TRAIN_NONE;
2530 temp |= FDI_LINK_TRAIN_PATTERN_1;
Chris Wilson5eddb702010-09-11 13:48:45 +01002531 I915_WRITE(reg, temp | FDI_TX_ENABLE);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002532
Chris Wilson5eddb702010-09-11 13:48:45 +01002533 reg = FDI_RX_CTL(pipe);
2534 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002535 temp &= ~FDI_LINK_TRAIN_NONE;
2536 temp |= FDI_LINK_TRAIN_PATTERN_1;
Chris Wilson5eddb702010-09-11 13:48:45 +01002537 I915_WRITE(reg, temp | FDI_RX_ENABLE);
2538
2539 POSTING_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002540 udelay(150);
2541
Jesse Barnes5b2adf82010-10-07 16:01:15 -07002542 /* Ironlake workaround, enable clock pointer after FDI enable*/
Daniel Vetter8f5718a2012-10-31 22:52:28 +01002543 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
2544 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR |
2545 FDI_RX_PHASE_SYNC_POINTER_EN);
Jesse Barnes5b2adf82010-10-07 16:01:15 -07002546
Chris Wilson5eddb702010-09-11 13:48:45 +01002547 reg = FDI_RX_IIR(pipe);
Adam Jacksone1a44742010-06-25 15:32:14 -04002548 for (tries = 0; tries < 5; tries++) {
Chris Wilson5eddb702010-09-11 13:48:45 +01002549 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002550 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2551
2552 if ((temp & FDI_RX_BIT_LOCK)) {
2553 DRM_DEBUG_KMS("FDI train 1 done.\n");
Chris Wilson5eddb702010-09-11 13:48:45 +01002554 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002555 break;
2556 }
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002557 }
Adam Jacksone1a44742010-06-25 15:32:14 -04002558 if (tries == 5)
Chris Wilson5eddb702010-09-11 13:48:45 +01002559 DRM_ERROR("FDI train 1 fail!\n");
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002560
2561 /* Train 2 */
Chris Wilson5eddb702010-09-11 13:48:45 +01002562 reg = FDI_TX_CTL(pipe);
2563 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002564 temp &= ~FDI_LINK_TRAIN_NONE;
2565 temp |= FDI_LINK_TRAIN_PATTERN_2;
Chris Wilson5eddb702010-09-11 13:48:45 +01002566 I915_WRITE(reg, temp);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002567
Chris Wilson5eddb702010-09-11 13:48:45 +01002568 reg = FDI_RX_CTL(pipe);
2569 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002570 temp &= ~FDI_LINK_TRAIN_NONE;
2571 temp |= FDI_LINK_TRAIN_PATTERN_2;
Chris Wilson5eddb702010-09-11 13:48:45 +01002572 I915_WRITE(reg, temp);
2573
2574 POSTING_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002575 udelay(150);
2576
Chris Wilson5eddb702010-09-11 13:48:45 +01002577 reg = FDI_RX_IIR(pipe);
Adam Jacksone1a44742010-06-25 15:32:14 -04002578 for (tries = 0; tries < 5; tries++) {
Chris Wilson5eddb702010-09-11 13:48:45 +01002579 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002580 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2581
2582 if (temp & FDI_RX_SYMBOL_LOCK) {
Chris Wilson5eddb702010-09-11 13:48:45 +01002583 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002584 DRM_DEBUG_KMS("FDI train 2 done.\n");
2585 break;
2586 }
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002587 }
Adam Jacksone1a44742010-06-25 15:32:14 -04002588 if (tries == 5)
Chris Wilson5eddb702010-09-11 13:48:45 +01002589 DRM_ERROR("FDI train 2 fail!\n");
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002590
2591 DRM_DEBUG_KMS("FDI train done\n");
Jesse Barnes5c5313c2010-10-07 16:01:11 -07002592
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002593}
2594
Akshay Joshi0206e352011-08-16 15:34:10 -04002595static const int snb_b_fdi_train_param[] = {
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002596 FDI_LINK_TRAIN_400MV_0DB_SNB_B,
2597 FDI_LINK_TRAIN_400MV_6DB_SNB_B,
2598 FDI_LINK_TRAIN_600MV_3_5DB_SNB_B,
2599 FDI_LINK_TRAIN_800MV_0DB_SNB_B,
2600};
2601
2602/* The FDI link training functions for SNB/Cougarpoint. */
2603static void gen6_fdi_link_train(struct drm_crtc *crtc)
2604{
2605 struct drm_device *dev = crtc->dev;
2606 struct drm_i915_private *dev_priv = dev->dev_private;
2607 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2608 int pipe = intel_crtc->pipe;
Sean Paulfa37d392012-03-02 12:53:39 -05002609 u32 reg, temp, i, retry;
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002610
Adam Jacksone1a44742010-06-25 15:32:14 -04002611 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
2612 for train result */
Chris Wilson5eddb702010-09-11 13:48:45 +01002613 reg = FDI_RX_IMR(pipe);
2614 temp = I915_READ(reg);
Adam Jacksone1a44742010-06-25 15:32:14 -04002615 temp &= ~FDI_RX_SYMBOL_LOCK;
2616 temp &= ~FDI_RX_BIT_LOCK;
Chris Wilson5eddb702010-09-11 13:48:45 +01002617 I915_WRITE(reg, temp);
2618
2619 POSTING_READ(reg);
Adam Jacksone1a44742010-06-25 15:32:14 -04002620 udelay(150);
2621
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002622 /* enable CPU FDI TX and PCH FDI RX */
Chris Wilson5eddb702010-09-11 13:48:45 +01002623 reg = FDI_TX_CTL(pipe);
2624 temp = I915_READ(reg);
Adam Jackson77ffb592010-04-12 11:38:44 -04002625 temp &= ~(7 << 19);
2626 temp |= (intel_crtc->fdi_lanes - 1) << 19;
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002627 temp &= ~FDI_LINK_TRAIN_NONE;
2628 temp |= FDI_LINK_TRAIN_PATTERN_1;
2629 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2630 /* SNB-B */
2631 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
Chris Wilson5eddb702010-09-11 13:48:45 +01002632 I915_WRITE(reg, temp | FDI_TX_ENABLE);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002633
Daniel Vetterd74cf322012-10-26 10:58:13 +02002634 I915_WRITE(FDI_RX_MISC(pipe),
2635 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
2636
Chris Wilson5eddb702010-09-11 13:48:45 +01002637 reg = FDI_RX_CTL(pipe);
2638 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002639 if (HAS_PCH_CPT(dev)) {
2640 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2641 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2642 } else {
2643 temp &= ~FDI_LINK_TRAIN_NONE;
2644 temp |= FDI_LINK_TRAIN_PATTERN_1;
2645 }
Chris Wilson5eddb702010-09-11 13:48:45 +01002646 I915_WRITE(reg, temp | FDI_RX_ENABLE);
2647
2648 POSTING_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002649 udelay(150);
2650
Akshay Joshi0206e352011-08-16 15:34:10 -04002651 for (i = 0; i < 4; i++) {
Chris Wilson5eddb702010-09-11 13:48:45 +01002652 reg = FDI_TX_CTL(pipe);
2653 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002654 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2655 temp |= snb_b_fdi_train_param[i];
Chris Wilson5eddb702010-09-11 13:48:45 +01002656 I915_WRITE(reg, temp);
2657
2658 POSTING_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002659 udelay(500);
2660
Sean Paulfa37d392012-03-02 12:53:39 -05002661 for (retry = 0; retry < 5; retry++) {
2662 reg = FDI_RX_IIR(pipe);
2663 temp = I915_READ(reg);
2664 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2665 if (temp & FDI_RX_BIT_LOCK) {
2666 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
2667 DRM_DEBUG_KMS("FDI train 1 done.\n");
2668 break;
2669 }
2670 udelay(50);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002671 }
Sean Paulfa37d392012-03-02 12:53:39 -05002672 if (retry < 5)
2673 break;
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002674 }
2675 if (i == 4)
Chris Wilson5eddb702010-09-11 13:48:45 +01002676 DRM_ERROR("FDI train 1 fail!\n");
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002677
2678 /* Train 2 */
Chris Wilson5eddb702010-09-11 13:48:45 +01002679 reg = FDI_TX_CTL(pipe);
2680 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002681 temp &= ~FDI_LINK_TRAIN_NONE;
2682 temp |= FDI_LINK_TRAIN_PATTERN_2;
2683 if (IS_GEN6(dev)) {
2684 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2685 /* SNB-B */
2686 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2687 }
Chris Wilson5eddb702010-09-11 13:48:45 +01002688 I915_WRITE(reg, temp);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002689
Chris Wilson5eddb702010-09-11 13:48:45 +01002690 reg = FDI_RX_CTL(pipe);
2691 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002692 if (HAS_PCH_CPT(dev)) {
2693 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2694 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
2695 } else {
2696 temp &= ~FDI_LINK_TRAIN_NONE;
2697 temp |= FDI_LINK_TRAIN_PATTERN_2;
2698 }
Chris Wilson5eddb702010-09-11 13:48:45 +01002699 I915_WRITE(reg, temp);
2700
2701 POSTING_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002702 udelay(150);
2703
Akshay Joshi0206e352011-08-16 15:34:10 -04002704 for (i = 0; i < 4; i++) {
Chris Wilson5eddb702010-09-11 13:48:45 +01002705 reg = FDI_TX_CTL(pipe);
2706 temp = I915_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002707 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2708 temp |= snb_b_fdi_train_param[i];
Chris Wilson5eddb702010-09-11 13:48:45 +01002709 I915_WRITE(reg, temp);
2710
2711 POSTING_READ(reg);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002712 udelay(500);
2713
Sean Paulfa37d392012-03-02 12:53:39 -05002714 for (retry = 0; retry < 5; retry++) {
2715 reg = FDI_RX_IIR(pipe);
2716 temp = I915_READ(reg);
2717 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2718 if (temp & FDI_RX_SYMBOL_LOCK) {
2719 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
2720 DRM_DEBUG_KMS("FDI train 2 done.\n");
2721 break;
2722 }
2723 udelay(50);
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002724 }
Sean Paulfa37d392012-03-02 12:53:39 -05002725 if (retry < 5)
2726 break;
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002727 }
2728 if (i == 4)
Chris Wilson5eddb702010-09-11 13:48:45 +01002729 DRM_ERROR("FDI train 2 fail!\n");
Zhenyu Wang8db9d772010-04-07 16:15:54 +08002730
2731 DRM_DEBUG_KMS("FDI train done.\n");
2732}
2733
Jesse Barnes357555c2011-04-28 15:09:55 -07002734/* Manual link training for Ivy Bridge A0 parts */
2735static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
2736{
2737 struct drm_device *dev = crtc->dev;
2738 struct drm_i915_private *dev_priv = dev->dev_private;
2739 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2740 int pipe = intel_crtc->pipe;
2741 u32 reg, temp, i;
2742
2743 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
2744 for train result */
2745 reg = FDI_RX_IMR(pipe);
2746 temp = I915_READ(reg);
2747 temp &= ~FDI_RX_SYMBOL_LOCK;
2748 temp &= ~FDI_RX_BIT_LOCK;
2749 I915_WRITE(reg, temp);
2750
2751 POSTING_READ(reg);
2752 udelay(150);
2753
Daniel Vetter01a415f2012-10-27 15:58:40 +02002754 DRM_DEBUG_KMS("FDI_RX_IIR before link train 0x%x\n",
2755 I915_READ(FDI_RX_IIR(pipe)));
2756
Jesse Barnes357555c2011-04-28 15:09:55 -07002757 /* enable CPU FDI TX and PCH FDI RX */
2758 reg = FDI_TX_CTL(pipe);
2759 temp = I915_READ(reg);
2760 temp &= ~(7 << 19);
2761 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2762 temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB);
2763 temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
2764 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2765 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
Jesse Barnesc4f9c4c2011-10-10 14:28:52 -07002766 temp |= FDI_COMPOSITE_SYNC;
Jesse Barnes357555c2011-04-28 15:09:55 -07002767 I915_WRITE(reg, temp | FDI_TX_ENABLE);
2768
Daniel Vetterd74cf322012-10-26 10:58:13 +02002769 I915_WRITE(FDI_RX_MISC(pipe),
2770 FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
2771
Jesse Barnes357555c2011-04-28 15:09:55 -07002772 reg = FDI_RX_CTL(pipe);
2773 temp = I915_READ(reg);
2774 temp &= ~FDI_LINK_TRAIN_AUTO;
2775 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2776 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
Jesse Barnesc4f9c4c2011-10-10 14:28:52 -07002777 temp |= FDI_COMPOSITE_SYNC;
Jesse Barnes357555c2011-04-28 15:09:55 -07002778 I915_WRITE(reg, temp | FDI_RX_ENABLE);
2779
2780 POSTING_READ(reg);
2781 udelay(150);
2782
Akshay Joshi0206e352011-08-16 15:34:10 -04002783 for (i = 0; i < 4; i++) {
Jesse Barnes357555c2011-04-28 15:09:55 -07002784 reg = FDI_TX_CTL(pipe);
2785 temp = I915_READ(reg);
2786 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2787 temp |= snb_b_fdi_train_param[i];
2788 I915_WRITE(reg, temp);
2789
2790 POSTING_READ(reg);
2791 udelay(500);
2792
2793 reg = FDI_RX_IIR(pipe);
2794 temp = I915_READ(reg);
2795 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2796
2797 if (temp & FDI_RX_BIT_LOCK ||
2798 (I915_READ(reg) & FDI_RX_BIT_LOCK)) {
2799 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
Daniel Vetter01a415f2012-10-27 15:58:40 +02002800 DRM_DEBUG_KMS("FDI train 1 done, level %i.\n", i);
Jesse Barnes357555c2011-04-28 15:09:55 -07002801 break;
2802 }
2803 }
2804 if (i == 4)
2805 DRM_ERROR("FDI train 1 fail!\n");
2806
2807 /* Train 2 */
2808 reg = FDI_TX_CTL(pipe);
2809 temp = I915_READ(reg);
2810 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
2811 temp |= FDI_LINK_TRAIN_PATTERN_2_IVB;
2812 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2813 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2814 I915_WRITE(reg, temp);
2815
2816 reg = FDI_RX_CTL(pipe);
2817 temp = I915_READ(reg);
2818 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2819 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
2820 I915_WRITE(reg, temp);
2821
2822 POSTING_READ(reg);
2823 udelay(150);
2824
Akshay Joshi0206e352011-08-16 15:34:10 -04002825 for (i = 0; i < 4; i++) {
Jesse Barnes357555c2011-04-28 15:09:55 -07002826 reg = FDI_TX_CTL(pipe);
2827 temp = I915_READ(reg);
2828 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2829 temp |= snb_b_fdi_train_param[i];
2830 I915_WRITE(reg, temp);
2831
2832 POSTING_READ(reg);
2833 udelay(500);
2834
2835 reg = FDI_RX_IIR(pipe);
2836 temp = I915_READ(reg);
2837 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2838
2839 if (temp & FDI_RX_SYMBOL_LOCK) {
2840 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
Daniel Vetter01a415f2012-10-27 15:58:40 +02002841 DRM_DEBUG_KMS("FDI train 2 done, level %i.\n", i);
Jesse Barnes357555c2011-04-28 15:09:55 -07002842 break;
2843 }
2844 }
2845 if (i == 4)
2846 DRM_ERROR("FDI train 2 fail!\n");
2847
2848 DRM_DEBUG_KMS("FDI train done.\n");
2849}
2850
Daniel Vetter88cefb62012-08-12 19:27:14 +02002851static void ironlake_fdi_pll_enable(struct intel_crtc *intel_crtc)
Jesse Barnes0e23b992010-09-10 11:10:00 -07002852{
Daniel Vetter88cefb62012-08-12 19:27:14 +02002853 struct drm_device *dev = intel_crtc->base.dev;
Jesse Barnes0e23b992010-09-10 11:10:00 -07002854 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes0e23b992010-09-10 11:10:00 -07002855 int pipe = intel_crtc->pipe;
Chris Wilson5eddb702010-09-11 13:48:45 +01002856 u32 reg, temp;
Jesse Barnes0e23b992010-09-10 11:10:00 -07002857
Jesse Barnesc64e3112010-09-10 11:27:03 -07002858
Jesse Barnes0e23b992010-09-10 11:10:00 -07002859 /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
Chris Wilson5eddb702010-09-11 13:48:45 +01002860 reg = FDI_RX_CTL(pipe);
2861 temp = I915_READ(reg);
2862 temp &= ~((0x7 << 19) | (0x7 << 16));
Jesse Barnes0e23b992010-09-10 11:10:00 -07002863 temp |= (intel_crtc->fdi_lanes - 1) << 19;
Daniel Vetterdfd07d72012-12-17 11:21:38 +01002864 temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
Chris Wilson5eddb702010-09-11 13:48:45 +01002865 I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
2866
2867 POSTING_READ(reg);
Jesse Barnes0e23b992010-09-10 11:10:00 -07002868 udelay(200);
2869
2870 /* Switch from Rawclk to PCDclk */
Chris Wilson5eddb702010-09-11 13:48:45 +01002871 temp = I915_READ(reg);
2872 I915_WRITE(reg, temp | FDI_PCDCLK);
2873
2874 POSTING_READ(reg);
Jesse Barnes0e23b992010-09-10 11:10:00 -07002875 udelay(200);
2876
Paulo Zanoni20749732012-11-23 15:30:38 -02002877 /* Enable CPU FDI TX PLL, always on for Ironlake */
2878 reg = FDI_TX_CTL(pipe);
2879 temp = I915_READ(reg);
2880 if ((temp & FDI_TX_PLL_ENABLE) == 0) {
2881 I915_WRITE(reg, temp | FDI_TX_PLL_ENABLE);
Chris Wilson5eddb702010-09-11 13:48:45 +01002882
Paulo Zanoni20749732012-11-23 15:30:38 -02002883 POSTING_READ(reg);
2884 udelay(100);
Jesse Barnes0e23b992010-09-10 11:10:00 -07002885 }
2886}
2887
Daniel Vetter88cefb62012-08-12 19:27:14 +02002888static void ironlake_fdi_pll_disable(struct intel_crtc *intel_crtc)
2889{
2890 struct drm_device *dev = intel_crtc->base.dev;
2891 struct drm_i915_private *dev_priv = dev->dev_private;
2892 int pipe = intel_crtc->pipe;
2893 u32 reg, temp;
2894
2895 /* Switch from PCDclk to Rawclk */
2896 reg = FDI_RX_CTL(pipe);
2897 temp = I915_READ(reg);
2898 I915_WRITE(reg, temp & ~FDI_PCDCLK);
2899
2900 /* Disable CPU FDI TX PLL */
2901 reg = FDI_TX_CTL(pipe);
2902 temp = I915_READ(reg);
2903 I915_WRITE(reg, temp & ~FDI_TX_PLL_ENABLE);
2904
2905 POSTING_READ(reg);
2906 udelay(100);
2907
2908 reg = FDI_RX_CTL(pipe);
2909 temp = I915_READ(reg);
2910 I915_WRITE(reg, temp & ~FDI_RX_PLL_ENABLE);
2911
2912 /* Wait for the clocks to turn off. */
2913 POSTING_READ(reg);
2914 udelay(100);
2915}
2916
Jesse Barnes0fc932b2011-01-04 15:09:37 -08002917static void ironlake_fdi_disable(struct drm_crtc *crtc)
2918{
2919 struct drm_device *dev = crtc->dev;
2920 struct drm_i915_private *dev_priv = dev->dev_private;
2921 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2922 int pipe = intel_crtc->pipe;
2923 u32 reg, temp;
2924
2925 /* disable CPU FDI tx and PCH FDI rx */
2926 reg = FDI_TX_CTL(pipe);
2927 temp = I915_READ(reg);
2928 I915_WRITE(reg, temp & ~FDI_TX_ENABLE);
2929 POSTING_READ(reg);
2930
2931 reg = FDI_RX_CTL(pipe);
2932 temp = I915_READ(reg);
2933 temp &= ~(0x7 << 16);
Daniel Vetterdfd07d72012-12-17 11:21:38 +01002934 temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
Jesse Barnes0fc932b2011-01-04 15:09:37 -08002935 I915_WRITE(reg, temp & ~FDI_RX_ENABLE);
2936
2937 POSTING_READ(reg);
2938 udelay(100);
2939
2940 /* Ironlake workaround, disable clock pointer after downing FDI */
Jesse Barnes6f06ce12011-01-04 15:09:38 -08002941 if (HAS_PCH_IBX(dev)) {
2942 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
Jesse Barnes6f06ce12011-01-04 15:09:38 -08002943 }
Jesse Barnes0fc932b2011-01-04 15:09:37 -08002944
2945 /* still set train pattern 1 */
2946 reg = FDI_TX_CTL(pipe);
2947 temp = I915_READ(reg);
2948 temp &= ~FDI_LINK_TRAIN_NONE;
2949 temp |= FDI_LINK_TRAIN_PATTERN_1;
2950 I915_WRITE(reg, temp);
2951
2952 reg = FDI_RX_CTL(pipe);
2953 temp = I915_READ(reg);
2954 if (HAS_PCH_CPT(dev)) {
2955 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2956 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2957 } else {
2958 temp &= ~FDI_LINK_TRAIN_NONE;
2959 temp |= FDI_LINK_TRAIN_PATTERN_1;
2960 }
2961 /* BPC in FDI rx is consistent with that in PIPECONF */
2962 temp &= ~(0x07 << 16);
Daniel Vetterdfd07d72012-12-17 11:21:38 +01002963 temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
Jesse Barnes0fc932b2011-01-04 15:09:37 -08002964 I915_WRITE(reg, temp);
2965
2966 POSTING_READ(reg);
2967 udelay(100);
2968}
2969
Chris Wilson5bb61642012-09-27 21:25:58 +01002970static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc)
2971{
2972 struct drm_device *dev = crtc->dev;
2973 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjälä10d83732013-01-29 18:13:34 +02002974 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Chris Wilson5bb61642012-09-27 21:25:58 +01002975 unsigned long flags;
2976 bool pending;
2977
Ville Syrjälä10d83732013-01-29 18:13:34 +02002978 if (i915_reset_in_progress(&dev_priv->gpu_error) ||
2979 intel_crtc->reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
Chris Wilson5bb61642012-09-27 21:25:58 +01002980 return false;
2981
2982 spin_lock_irqsave(&dev->event_lock, flags);
2983 pending = to_intel_crtc(crtc)->unpin_work != NULL;
2984 spin_unlock_irqrestore(&dev->event_lock, flags);
2985
2986 return pending;
2987}
2988
Chris Wilsone6c3a2a2010-09-23 23:04:43 +01002989static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
2990{
Chris Wilson0f911282012-04-17 10:05:38 +01002991 struct drm_device *dev = crtc->dev;
Chris Wilson5bb61642012-09-27 21:25:58 +01002992 struct drm_i915_private *dev_priv = dev->dev_private;
Chris Wilsone6c3a2a2010-09-23 23:04:43 +01002993
2994 if (crtc->fb == NULL)
2995 return;
2996
Daniel Vetter2c10d572012-12-20 21:24:07 +01002997 WARN_ON(waitqueue_active(&dev_priv->pending_flip_queue));
2998
Chris Wilson5bb61642012-09-27 21:25:58 +01002999 wait_event(dev_priv->pending_flip_queue,
3000 !intel_crtc_has_pending_flip(crtc));
3001
Chris Wilson0f911282012-04-17 10:05:38 +01003002 mutex_lock(&dev->struct_mutex);
3003 intel_finish_fb(crtc->fb);
3004 mutex_unlock(&dev->struct_mutex);
Chris Wilsone6c3a2a2010-09-23 23:04:43 +01003005}
3006
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003007/* Program iCLKIP clock to the desired frequency */
3008static void lpt_program_iclkip(struct drm_crtc *crtc)
3009{
3010 struct drm_device *dev = crtc->dev;
3011 struct drm_i915_private *dev_priv = dev->dev_private;
3012 u32 divsel, phaseinc, auxdiv, phasedir = 0;
3013 u32 temp;
3014
Daniel Vetter09153002012-12-12 14:06:44 +01003015 mutex_lock(&dev_priv->dpio_lock);
3016
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003017 /* It is necessary to ungate the pixclk gate prior to programming
3018 * the divisors, and gate it back when it is done.
3019 */
3020 I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_GATE);
3021
3022 /* Disable SSCCTL */
3023 intel_sbi_write(dev_priv, SBI_SSCCTL6,
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003024 intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK) |
3025 SBI_SSCCTL_DISABLE,
3026 SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003027
3028 /* 20MHz is a corner case which is out of range for the 7-bit divisor */
3029 if (crtc->mode.clock == 20000) {
3030 auxdiv = 1;
3031 divsel = 0x41;
3032 phaseinc = 0x20;
3033 } else {
3034 /* The iCLK virtual clock root frequency is in MHz,
3035 * but the crtc->mode.clock in in KHz. To get the divisors,
3036 * it is necessary to divide one by another, so we
3037 * convert the virtual clock precision to KHz here for higher
3038 * precision.
3039 */
3040 u32 iclk_virtual_root_freq = 172800 * 1000;
3041 u32 iclk_pi_range = 64;
3042 u32 desired_divisor, msb_divisor_value, pi_value;
3043
3044 desired_divisor = (iclk_virtual_root_freq / crtc->mode.clock);
3045 msb_divisor_value = desired_divisor / iclk_pi_range;
3046 pi_value = desired_divisor % iclk_pi_range;
3047
3048 auxdiv = 0;
3049 divsel = msb_divisor_value - 2;
3050 phaseinc = pi_value;
3051 }
3052
3053 /* This should not happen with any sane values */
3054 WARN_ON(SBI_SSCDIVINTPHASE_DIVSEL(divsel) &
3055 ~SBI_SSCDIVINTPHASE_DIVSEL_MASK);
3056 WARN_ON(SBI_SSCDIVINTPHASE_DIR(phasedir) &
3057 ~SBI_SSCDIVINTPHASE_INCVAL_MASK);
3058
3059 DRM_DEBUG_KMS("iCLKIP clock: found settings for %dKHz refresh rate: auxdiv=%x, divsel=%x, phasedir=%x, phaseinc=%x\n",
3060 crtc->mode.clock,
3061 auxdiv,
3062 divsel,
3063 phasedir,
3064 phaseinc);
3065
3066 /* Program SSCDIVINTPHASE6 */
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003067 temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003068 temp &= ~SBI_SSCDIVINTPHASE_DIVSEL_MASK;
3069 temp |= SBI_SSCDIVINTPHASE_DIVSEL(divsel);
3070 temp &= ~SBI_SSCDIVINTPHASE_INCVAL_MASK;
3071 temp |= SBI_SSCDIVINTPHASE_INCVAL(phaseinc);
3072 temp |= SBI_SSCDIVINTPHASE_DIR(phasedir);
3073 temp |= SBI_SSCDIVINTPHASE_PROPAGATE;
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003074 intel_sbi_write(dev_priv, SBI_SSCDIVINTPHASE6, temp, SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003075
3076 /* Program SSCAUXDIV */
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003077 temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003078 temp &= ~SBI_SSCAUXDIV_FINALDIV2SEL(1);
3079 temp |= SBI_SSCAUXDIV_FINALDIV2SEL(auxdiv);
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003080 intel_sbi_write(dev_priv, SBI_SSCAUXDIV6, temp, SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003081
3082 /* Enable modulator and associated divider */
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003083 temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003084 temp &= ~SBI_SSCCTL_DISABLE;
Paulo Zanoni988d6ee2012-12-01 12:04:24 -02003085 intel_sbi_write(dev_priv, SBI_SSCCTL6, temp, SBI_ICLK);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003086
3087 /* Wait for initialization time */
3088 udelay(24);
3089
3090 I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE);
Daniel Vetter09153002012-12-12 14:06:44 +01003091
3092 mutex_unlock(&dev_priv->dpio_lock);
Eugeni Dodonove615efe2012-05-09 15:37:26 -03003093}
3094
Jesse Barnesf67a5592011-01-05 10:31:48 -08003095/*
3096 * Enable PCH resources required for PCH ports:
3097 * - PCH PLLs
3098 * - FDI training & RX/TX
3099 * - update transcoder timings
3100 * - DP transcoding bits
3101 * - transcoder
3102 */
3103static void ironlake_pch_enable(struct drm_crtc *crtc)
Jesse Barnes79e53942008-11-07 14:24:08 -08003104{
3105 struct drm_device *dev = crtc->dev;
Zhenyu Wang2c072452009-06-05 15:38:42 +08003106 struct drm_i915_private *dev_priv = dev->dev_private;
3107 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3108 int pipe = intel_crtc->pipe;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003109 u32 reg, temp;
Jesse Barnes6be4a602010-09-10 10:26:01 -07003110
Chris Wilsone7e164d2012-05-11 09:21:25 +01003111 assert_transcoder_disabled(dev_priv, pipe);
3112
Daniel Vettercd986ab2012-10-26 10:58:12 +02003113 /* Write the TU size bits before fdi link training, so that error
3114 * detection works. */
3115 I915_WRITE(FDI_RX_TUSIZE1(pipe),
3116 I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
3117
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003118 /* For PCH output, training FDI link */
Jesse Barnes674cf962011-04-28 14:27:04 -07003119 dev_priv->display.fdi_link_train(crtc);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003120
Daniel Vetter572deb32012-10-27 18:46:14 +02003121 /* XXX: pch pll's can be enabled any time before we enable the PCH
3122 * transcoder, and we actually should do this to not upset any PCH
3123 * transcoder that already use the clock when we share it.
3124 *
3125 * Note that enable_pch_pll tries to do the right thing, but get_pch_pll
3126 * unconditionally resets the pll - we need that to have the right LVDS
3127 * enable sequence. */
Paulo Zanonib6b4e182012-10-31 18:12:38 -02003128 ironlake_enable_pch_pll(intel_crtc);
Chris Wilson6f13b7b2012-05-13 09:54:09 +01003129
Paulo Zanoni303b81e2012-10-31 18:12:23 -02003130 if (HAS_PCH_CPT(dev)) {
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003131 u32 sel;
Jesse Barnes4b645f12011-10-12 09:51:31 -07003132
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003133 temp = I915_READ(PCH_DPLL_SEL);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003134 switch (pipe) {
3135 default:
3136 case 0:
3137 temp |= TRANSA_DPLL_ENABLE;
3138 sel = TRANSA_DPLLB_SEL;
3139 break;
3140 case 1:
3141 temp |= TRANSB_DPLL_ENABLE;
3142 sel = TRANSB_DPLLB_SEL;
3143 break;
3144 case 2:
3145 temp |= TRANSC_DPLL_ENABLE;
3146 sel = TRANSC_DPLLB_SEL;
3147 break;
Jesse Barnesd64311a2011-10-12 15:01:33 -07003148 }
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003149 if (intel_crtc->pch_pll->pll_reg == _PCH_DPLL_B)
3150 temp |= sel;
3151 else
3152 temp &= ~sel;
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003153 I915_WRITE(PCH_DPLL_SEL, temp);
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003154 }
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003155
Jesse Barnesd9b6cb52011-01-04 15:09:35 -08003156 /* set transcoder timing, panel must allow it */
3157 assert_panel_unlocked(dev_priv, pipe);
Chris Wilson5eddb702010-09-11 13:48:45 +01003158 I915_WRITE(TRANS_HTOTAL(pipe), I915_READ(HTOTAL(pipe)));
3159 I915_WRITE(TRANS_HBLANK(pipe), I915_READ(HBLANK(pipe)));
3160 I915_WRITE(TRANS_HSYNC(pipe), I915_READ(HSYNC(pipe)));
3161
3162 I915_WRITE(TRANS_VTOTAL(pipe), I915_READ(VTOTAL(pipe)));
3163 I915_WRITE(TRANS_VBLANK(pipe), I915_READ(VBLANK(pipe)));
3164 I915_WRITE(TRANS_VSYNC(pipe), I915_READ(VSYNC(pipe)));
Daniel Vetter0529a0d2012-01-28 14:49:24 +01003165 I915_WRITE(TRANS_VSYNCSHIFT(pipe), I915_READ(VSYNCSHIFT(pipe)));
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003166
Paulo Zanoni303b81e2012-10-31 18:12:23 -02003167 intel_fdi_normal_train(crtc);
Zhenyu Wang5e84e1a2010-10-28 16:38:08 +08003168
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003169 /* For PCH DP, enable TRANS_DP_CTL */
3170 if (HAS_PCH_CPT(dev) &&
Keith Packard417e8222011-11-01 19:54:11 -07003171 (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) ||
3172 intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))) {
Daniel Vetterdfd07d72012-12-17 11:21:38 +01003173 u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5;
Chris Wilson5eddb702010-09-11 13:48:45 +01003174 reg = TRANS_DP_CTL(pipe);
3175 temp = I915_READ(reg);
3176 temp &= ~(TRANS_DP_PORT_SEL_MASK |
Eric Anholt220cad32010-11-18 09:32:58 +08003177 TRANS_DP_SYNC_MASK |
3178 TRANS_DP_BPC_MASK);
Chris Wilson5eddb702010-09-11 13:48:45 +01003179 temp |= (TRANS_DP_OUTPUT_ENABLE |
3180 TRANS_DP_ENH_FRAMING);
Jesse Barnes9325c9f2011-06-24 12:19:21 -07003181 temp |= bpc << 9; /* same format but at 11:9 */
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003182
3183 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC)
Chris Wilson5eddb702010-09-11 13:48:45 +01003184 temp |= TRANS_DP_HSYNC_ACTIVE_HIGH;
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003185 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC)
Chris Wilson5eddb702010-09-11 13:48:45 +01003186 temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003187
3188 switch (intel_trans_dp_port_sel(crtc)) {
3189 case PCH_DP_B:
Chris Wilson5eddb702010-09-11 13:48:45 +01003190 temp |= TRANS_DP_PORT_SEL_B;
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003191 break;
3192 case PCH_DP_C:
Chris Wilson5eddb702010-09-11 13:48:45 +01003193 temp |= TRANS_DP_PORT_SEL_C;
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003194 break;
3195 case PCH_DP_D:
Chris Wilson5eddb702010-09-11 13:48:45 +01003196 temp |= TRANS_DP_PORT_SEL_D;
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003197 break;
3198 default:
Daniel Vettere95d41e2012-10-26 10:58:16 +02003199 BUG();
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003200 }
3201
Chris Wilson5eddb702010-09-11 13:48:45 +01003202 I915_WRITE(reg, temp);
Jesse Barnesc98e9dc2010-09-10 10:57:18 -07003203 }
3204
Paulo Zanonib8a4f402012-10-31 18:12:42 -02003205 ironlake_enable_pch_transcoder(dev_priv, pipe);
Jesse Barnesf67a5592011-01-05 10:31:48 -08003206}
3207
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003208static void lpt_pch_enable(struct drm_crtc *crtc)
3209{
3210 struct drm_device *dev = crtc->dev;
3211 struct drm_i915_private *dev_priv = dev->dev_private;
3212 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter3b117c82013-04-17 20:15:07 +02003213 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003214
Paulo Zanonidaed2db2012-10-31 18:12:41 -02003215 assert_transcoder_disabled(dev_priv, TRANSCODER_A);
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003216
Paulo Zanoni8c52b5e2012-10-31 18:12:24 -02003217 lpt_program_iclkip(crtc);
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003218
Paulo Zanoni0540e482012-10-31 18:12:40 -02003219 /* Set transcoder timing. */
Paulo Zanonidaed2db2012-10-31 18:12:41 -02003220 I915_WRITE(_TRANS_HTOTAL_A, I915_READ(HTOTAL(cpu_transcoder)));
3221 I915_WRITE(_TRANS_HBLANK_A, I915_READ(HBLANK(cpu_transcoder)));
3222 I915_WRITE(_TRANS_HSYNC_A, I915_READ(HSYNC(cpu_transcoder)));
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003223
Paulo Zanonidaed2db2012-10-31 18:12:41 -02003224 I915_WRITE(_TRANS_VTOTAL_A, I915_READ(VTOTAL(cpu_transcoder)));
3225 I915_WRITE(_TRANS_VBLANK_A, I915_READ(VBLANK(cpu_transcoder)));
3226 I915_WRITE(_TRANS_VSYNC_A, I915_READ(VSYNC(cpu_transcoder)));
3227 I915_WRITE(_TRANS_VSYNCSHIFT_A, I915_READ(VSYNCSHIFT(cpu_transcoder)));
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003228
Paulo Zanoni937bb612012-10-31 18:12:47 -02003229 lpt_enable_pch_transcoder(dev_priv, cpu_transcoder);
Jesse Barnesf67a5592011-01-05 10:31:48 -08003230}
3231
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003232static void intel_put_pch_pll(struct intel_crtc *intel_crtc)
3233{
3234 struct intel_pch_pll *pll = intel_crtc->pch_pll;
3235
3236 if (pll == NULL)
3237 return;
3238
3239 if (pll->refcount == 0) {
3240 WARN(1, "bad PCH PLL refcount\n");
3241 return;
3242 }
3243
3244 --pll->refcount;
3245 intel_crtc->pch_pll = NULL;
3246}
3247
3248static struct intel_pch_pll *intel_get_pch_pll(struct intel_crtc *intel_crtc, u32 dpll, u32 fp)
3249{
3250 struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
3251 struct intel_pch_pll *pll;
3252 int i;
3253
3254 pll = intel_crtc->pch_pll;
3255 if (pll) {
3256 DRM_DEBUG_KMS("CRTC:%d reusing existing PCH PLL %x\n",
3257 intel_crtc->base.base.id, pll->pll_reg);
3258 goto prepare;
3259 }
3260
Daniel Vetter98b6bd92012-05-20 20:00:25 +02003261 if (HAS_PCH_IBX(dev_priv->dev)) {
3262 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
3263 i = intel_crtc->pipe;
3264 pll = &dev_priv->pch_plls[i];
3265
3266 DRM_DEBUG_KMS("CRTC:%d using pre-allocated PCH PLL %x\n",
3267 intel_crtc->base.base.id, pll->pll_reg);
3268
3269 goto found;
3270 }
3271
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003272 for (i = 0; i < dev_priv->num_pch_pll; i++) {
3273 pll = &dev_priv->pch_plls[i];
3274
3275 /* Only want to check enabled timings first */
3276 if (pll->refcount == 0)
3277 continue;
3278
3279 if (dpll == (I915_READ(pll->pll_reg) & 0x7fffffff) &&
3280 fp == I915_READ(pll->fp0_reg)) {
3281 DRM_DEBUG_KMS("CRTC:%d sharing existing PCH PLL %x (refcount %d, ative %d)\n",
3282 intel_crtc->base.base.id,
3283 pll->pll_reg, pll->refcount, pll->active);
3284
3285 goto found;
3286 }
3287 }
3288
3289 /* Ok no matching timings, maybe there's a free one? */
3290 for (i = 0; i < dev_priv->num_pch_pll; i++) {
3291 pll = &dev_priv->pch_plls[i];
3292 if (pll->refcount == 0) {
3293 DRM_DEBUG_KMS("CRTC:%d allocated PCH PLL %x\n",
3294 intel_crtc->base.base.id, pll->pll_reg);
3295 goto found;
3296 }
3297 }
3298
3299 return NULL;
3300
3301found:
3302 intel_crtc->pch_pll = pll;
3303 pll->refcount++;
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03003304 DRM_DEBUG_DRIVER("using pll %d for pipe %c\n", i, pipe_name(intel_crtc->pipe));
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003305prepare: /* separate function? */
3306 DRM_DEBUG_DRIVER("switching PLL %x off\n", pll->pll_reg);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003307
Chris Wilsone04c7352012-05-02 20:43:56 +01003308 /* Wait for the clocks to stabilize before rewriting the regs */
3309 I915_WRITE(pll->pll_reg, dpll & ~DPLL_VCO_ENABLE);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003310 POSTING_READ(pll->pll_reg);
3311 udelay(150);
Chris Wilsone04c7352012-05-02 20:43:56 +01003312
3313 I915_WRITE(pll->fp0_reg, fp);
3314 I915_WRITE(pll->pll_reg, dpll & ~DPLL_VCO_ENABLE);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003315 pll->on = false;
3316 return pll;
3317}
3318
Jesse Barnesd4270e52011-10-11 10:43:02 -07003319void intel_cpt_verify_modeset(struct drm_device *dev, int pipe)
3320{
3321 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetter23670b322012-11-01 09:15:30 +01003322 int dslreg = PIPEDSL(pipe);
Jesse Barnesd4270e52011-10-11 10:43:02 -07003323 u32 temp;
3324
3325 temp = I915_READ(dslreg);
3326 udelay(500);
3327 if (wait_for(I915_READ(dslreg) != temp, 5)) {
Jesse Barnesd4270e52011-10-11 10:43:02 -07003328 if (wait_for(I915_READ(dslreg) != temp, 5))
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03003329 DRM_ERROR("mode set failed: pipe %c stuck\n", pipe_name(pipe));
Jesse Barnesd4270e52011-10-11 10:43:02 -07003330 }
3331}
3332
Jesse Barnesf67a5592011-01-05 10:31:48 -08003333static void ironlake_crtc_enable(struct drm_crtc *crtc)
3334{
3335 struct drm_device *dev = crtc->dev;
3336 struct drm_i915_private *dev_priv = dev->dev_private;
3337 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003338 struct intel_encoder *encoder;
Jesse Barnesf67a5592011-01-05 10:31:48 -08003339 int pipe = intel_crtc->pipe;
3340 int plane = intel_crtc->plane;
3341 u32 temp;
Jesse Barnesf67a5592011-01-05 10:31:48 -08003342
Daniel Vetter08a48462012-07-02 11:43:47 +02003343 WARN_ON(!crtc->enabled);
3344
Jesse Barnesf67a5592011-01-05 10:31:48 -08003345 if (intel_crtc->active)
3346 return;
3347
3348 intel_crtc->active = true;
Paulo Zanoni86642812013-04-12 17:57:57 -03003349
3350 intel_set_cpu_fifo_underrun_reporting(dev, pipe, true);
3351 intel_set_pch_fifo_underrun_reporting(dev, pipe, true);
3352
Jesse Barnesf67a5592011-01-05 10:31:48 -08003353 intel_update_watermarks(dev);
3354
3355 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
3356 temp = I915_READ(PCH_LVDS);
3357 if ((temp & LVDS_PORT_EN) == 0)
3358 I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
3359 }
3360
Jesse Barnesf67a5592011-01-05 10:31:48 -08003361
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01003362 if (intel_crtc->config.has_pch_encoder) {
Daniel Vetterfff367c2012-10-27 15:50:28 +02003363 /* Note: FDI PLL enabling _must_ be done before we enable the
3364 * cpu pipes, hence this is separate from all the other fdi/pch
3365 * enabling. */
Daniel Vetter88cefb62012-08-12 19:27:14 +02003366 ironlake_fdi_pll_enable(intel_crtc);
Daniel Vetter46b6f812012-09-06 22:08:33 +02003367 } else {
3368 assert_fdi_tx_disabled(dev_priv, pipe);
3369 assert_fdi_rx_disabled(dev_priv, pipe);
3370 }
Jesse Barnesf67a5592011-01-05 10:31:48 -08003371
Daniel Vetterbf49ec82012-09-06 22:15:40 +02003372 for_each_encoder_on_crtc(dev, crtc, encoder)
3373 if (encoder->pre_enable)
3374 encoder->pre_enable(encoder);
Jesse Barnesf67a5592011-01-05 10:31:48 -08003375
3376 /* Enable panel fitting for LVDS */
3377 if (dev_priv->pch_pf_size &&
Jani Nikula547dc042012-11-02 11:24:03 +02003378 (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) ||
3379 intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))) {
Jesse Barnesf67a5592011-01-05 10:31:48 -08003380 /* Force use of hard-coded filter coefficients
3381 * as some pre-programmed values are broken,
3382 * e.g. x201.
3383 */
Paulo Zanoni13888d72012-11-20 13:27:41 -02003384 if (IS_IVYBRIDGE(dev))
3385 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3 |
3386 PF_PIPE_SEL_IVB(pipe));
3387 else
3388 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003389 I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos);
3390 I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size);
Jesse Barnesf67a5592011-01-05 10:31:48 -08003391 }
3392
Jesse Barnes9c54c0d2011-06-15 23:32:33 +02003393 /*
3394 * On ILK+ LUT must be loaded before the pipe is running but with
3395 * clocks enabled
3396 */
3397 intel_crtc_load_lut(crtc);
3398
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01003399 intel_enable_pipe(dev_priv, pipe,
3400 intel_crtc->config.has_pch_encoder);
Jesse Barnesf67a5592011-01-05 10:31:48 -08003401 intel_enable_plane(dev_priv, plane, pipe);
3402
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01003403 if (intel_crtc->config.has_pch_encoder)
Jesse Barnesf67a5592011-01-05 10:31:48 -08003404 ironlake_pch_enable(crtc);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003405
Ben Widawskyd1ebd8162011-04-25 20:11:50 +01003406 mutex_lock(&dev->struct_mutex);
Chris Wilsonbed4a672010-09-11 10:47:47 +01003407 intel_update_fbc(dev);
Ben Widawskyd1ebd8162011-04-25 20:11:50 +01003408 mutex_unlock(&dev->struct_mutex);
3409
Chris Wilson6b383a72010-09-13 13:54:26 +01003410 intel_crtc_update_cursor(crtc, true);
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003411
Daniel Vetterfa5c73b2012-07-01 23:24:36 +02003412 for_each_encoder_on_crtc(dev, crtc, encoder)
3413 encoder->enable(encoder);
Daniel Vetter61b77dd2012-07-02 00:16:19 +02003414
3415 if (HAS_PCH_CPT(dev))
3416 intel_cpt_verify_modeset(dev, intel_crtc->pipe);
Daniel Vetter6ce94102012-10-04 19:20:03 +02003417
3418 /*
3419 * There seems to be a race in PCH platform hw (at least on some
3420 * outputs) where an enabled pipe still completes any pageflip right
3421 * away (as if the pipe is off) instead of waiting for vblank. As soon
3422 * as the first vblank happend, everything works as expected. Hence just
3423 * wait for one vblank before returning to avoid strange things
3424 * happening.
3425 */
3426 intel_wait_for_vblank(dev, intel_crtc->pipe);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003427}
3428
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003429static void haswell_crtc_enable(struct drm_crtc *crtc)
3430{
3431 struct drm_device *dev = crtc->dev;
3432 struct drm_i915_private *dev_priv = dev->dev_private;
3433 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3434 struct intel_encoder *encoder;
3435 int pipe = intel_crtc->pipe;
3436 int plane = intel_crtc->plane;
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003437
3438 WARN_ON(!crtc->enabled);
3439
3440 if (intel_crtc->active)
3441 return;
3442
3443 intel_crtc->active = true;
Paulo Zanoni86642812013-04-12 17:57:57 -03003444
3445 intel_set_cpu_fifo_underrun_reporting(dev, pipe, true);
3446 if (intel_crtc->config.has_pch_encoder)
3447 intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
3448
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003449 intel_update_watermarks(dev);
3450
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01003451 if (intel_crtc->config.has_pch_encoder)
Paulo Zanoni04945642012-11-01 21:00:59 -02003452 dev_priv->display.fdi_link_train(crtc);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003453
3454 for_each_encoder_on_crtc(dev, crtc, encoder)
3455 if (encoder->pre_enable)
3456 encoder->pre_enable(encoder);
3457
Paulo Zanoni1f544382012-10-24 11:32:00 -02003458 intel_ddi_enable_pipe_clock(intel_crtc);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003459
Paulo Zanoni1f544382012-10-24 11:32:00 -02003460 /* Enable panel fitting for eDP */
Jani Nikula547dc042012-11-02 11:24:03 +02003461 if (dev_priv->pch_pf_size &&
3462 intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) {
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003463 /* Force use of hard-coded filter coefficients
3464 * as some pre-programmed values are broken,
3465 * e.g. x201.
3466 */
Paulo Zanoni54075a72012-11-20 13:27:42 -02003467 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3 |
3468 PF_PIPE_SEL_IVB(pipe));
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003469 I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos);
3470 I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size);
3471 }
3472
3473 /*
3474 * On ILK+ LUT must be loaded before the pipe is running but with
3475 * clocks enabled
3476 */
3477 intel_crtc_load_lut(crtc);
3478
Paulo Zanoni1f544382012-10-24 11:32:00 -02003479 intel_ddi_set_pipe_settings(crtc);
Damien Lespiau8228c252013-03-07 15:30:27 +00003480 intel_ddi_enable_transcoder_func(crtc);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003481
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01003482 intel_enable_pipe(dev_priv, pipe,
3483 intel_crtc->config.has_pch_encoder);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003484 intel_enable_plane(dev_priv, plane, pipe);
3485
Daniel Vetter5bfe2ac2013-03-27 00:44:55 +01003486 if (intel_crtc->config.has_pch_encoder)
Paulo Zanoni1507e5b2012-10-31 18:12:22 -02003487 lpt_pch_enable(crtc);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003488
3489 mutex_lock(&dev->struct_mutex);
3490 intel_update_fbc(dev);
3491 mutex_unlock(&dev->struct_mutex);
3492
3493 intel_crtc_update_cursor(crtc, true);
3494
3495 for_each_encoder_on_crtc(dev, crtc, encoder)
3496 encoder->enable(encoder);
3497
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003498 /*
3499 * There seems to be a race in PCH platform hw (at least on some
3500 * outputs) where an enabled pipe still completes any pageflip right
3501 * away (as if the pipe is off) instead of waiting for vblank. As soon
3502 * as the first vblank happend, everything works as expected. Hence just
3503 * wait for one vblank before returning to avoid strange things
3504 * happening.
3505 */
3506 intel_wait_for_vblank(dev, intel_crtc->pipe);
3507}
3508
Jesse Barnes6be4a602010-09-10 10:26:01 -07003509static void ironlake_crtc_disable(struct drm_crtc *crtc)
3510{
3511 struct drm_device *dev = crtc->dev;
3512 struct drm_i915_private *dev_priv = dev->dev_private;
3513 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003514 struct intel_encoder *encoder;
Jesse Barnes6be4a602010-09-10 10:26:01 -07003515 int pipe = intel_crtc->pipe;
3516 int plane = intel_crtc->plane;
Chris Wilson5eddb702010-09-11 13:48:45 +01003517 u32 reg, temp;
Jesse Barnes6be4a602010-09-10 10:26:01 -07003518
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003519
Chris Wilsonf7abfe82010-09-13 14:19:16 +01003520 if (!intel_crtc->active)
3521 return;
3522
Daniel Vetterea9d7582012-07-10 10:42:52 +02003523 for_each_encoder_on_crtc(dev, crtc, encoder)
3524 encoder->disable(encoder);
3525
Chris Wilsone6c3a2a2010-09-23 23:04:43 +01003526 intel_crtc_wait_for_pending_flips(crtc);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003527 drm_vblank_off(dev, pipe);
Chris Wilson6b383a72010-09-13 13:54:26 +01003528 intel_crtc_update_cursor(crtc, false);
Chris Wilson5eddb702010-09-11 13:48:45 +01003529
Jesse Barnesb24e7172011-01-04 15:09:30 -08003530 intel_disable_plane(dev_priv, plane, pipe);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003531
Chris Wilson973d04f2011-07-08 12:22:37 +01003532 if (dev_priv->cfb_plane == plane)
3533 intel_disable_fbc(dev);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003534
Paulo Zanoni86642812013-04-12 17:57:57 -03003535 intel_set_pch_fifo_underrun_reporting(dev, pipe, false);
Jesse Barnesb24e7172011-01-04 15:09:30 -08003536 intel_disable_pipe(dev_priv, pipe);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003537
Jesse Barnes6be4a602010-09-10 10:26:01 -07003538 /* Disable PF */
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003539 I915_WRITE(PF_CTL(pipe), 0);
3540 I915_WRITE(PF_WIN_SZ(pipe), 0);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003541
Daniel Vetterbf49ec82012-09-06 22:15:40 +02003542 for_each_encoder_on_crtc(dev, crtc, encoder)
3543 if (encoder->post_disable)
3544 encoder->post_disable(encoder);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003545
Chris Wilson5eddb702010-09-11 13:48:45 +01003546 ironlake_fdi_disable(crtc);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003547
Paulo Zanonib8a4f402012-10-31 18:12:42 -02003548 ironlake_disable_pch_transcoder(dev_priv, pipe);
Paulo Zanoni86642812013-04-12 17:57:57 -03003549 intel_set_pch_fifo_underrun_reporting(dev, pipe, true);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003550
3551 if (HAS_PCH_CPT(dev)) {
3552 /* disable TRANS_DP_CTL */
Chris Wilson5eddb702010-09-11 13:48:45 +01003553 reg = TRANS_DP_CTL(pipe);
3554 temp = I915_READ(reg);
3555 temp &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK);
Eric Anholtcb3543c2011-02-02 12:08:07 -08003556 temp |= TRANS_DP_PORT_SEL_NONE;
Chris Wilson5eddb702010-09-11 13:48:45 +01003557 I915_WRITE(reg, temp);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003558
3559 /* disable DPLL_SEL */
3560 temp = I915_READ(PCH_DPLL_SEL);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003561 switch (pipe) {
3562 case 0:
Jesse Barnesd64311a2011-10-12 15:01:33 -07003563 temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLB_SEL);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003564 break;
3565 case 1:
Jesse Barnes6be4a602010-09-10 10:26:01 -07003566 temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003567 break;
3568 case 2:
Jesse Barnes4b645f12011-10-12 09:51:31 -07003569 /* C shares PLL A or B */
Jesse Barnesd64311a2011-10-12 15:01:33 -07003570 temp &= ~(TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003571 break;
3572 default:
3573 BUG(); /* wtf */
3574 }
Jesse Barnes6be4a602010-09-10 10:26:01 -07003575 I915_WRITE(PCH_DPLL_SEL, temp);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003576 }
3577
3578 /* disable PCH DPLL */
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003579 intel_disable_pch_pll(intel_crtc);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003580
Daniel Vetter88cefb62012-08-12 19:27:14 +02003581 ironlake_fdi_pll_disable(intel_crtc);
Chris Wilson6b383a72010-09-13 13:54:26 +01003582
Chris Wilsonf7abfe82010-09-13 14:19:16 +01003583 intel_crtc->active = false;
Chris Wilson6b383a72010-09-13 13:54:26 +01003584 intel_update_watermarks(dev);
Ben Widawskyd1ebd8162011-04-25 20:11:50 +01003585
3586 mutex_lock(&dev->struct_mutex);
Chris Wilson6b383a72010-09-13 13:54:26 +01003587 intel_update_fbc(dev);
Ben Widawskyd1ebd8162011-04-25 20:11:50 +01003588 mutex_unlock(&dev->struct_mutex);
Jesse Barnes6be4a602010-09-10 10:26:01 -07003589}
3590
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003591static void haswell_crtc_disable(struct drm_crtc *crtc)
3592{
3593 struct drm_device *dev = crtc->dev;
3594 struct drm_i915_private *dev_priv = dev->dev_private;
3595 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3596 struct intel_encoder *encoder;
3597 int pipe = intel_crtc->pipe;
3598 int plane = intel_crtc->plane;
Daniel Vetter3b117c82013-04-17 20:15:07 +02003599 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003600
3601 if (!intel_crtc->active)
3602 return;
3603
3604 for_each_encoder_on_crtc(dev, crtc, encoder)
3605 encoder->disable(encoder);
3606
3607 intel_crtc_wait_for_pending_flips(crtc);
3608 drm_vblank_off(dev, pipe);
3609 intel_crtc_update_cursor(crtc, false);
3610
3611 intel_disable_plane(dev_priv, plane, pipe);
3612
3613 if (dev_priv->cfb_plane == plane)
3614 intel_disable_fbc(dev);
3615
Paulo Zanoni86642812013-04-12 17:57:57 -03003616 if (intel_crtc->config.has_pch_encoder)
3617 intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, false);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003618 intel_disable_pipe(dev_priv, pipe);
3619
Paulo Zanoniad80a812012-10-24 16:06:19 -02003620 intel_ddi_disable_transcoder_func(dev_priv, cpu_transcoder);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003621
Paulo Zanonif7708f72013-03-22 14:16:38 -03003622 /* XXX: Once we have proper panel fitter state tracking implemented with
3623 * hardware state read/check support we should switch to only disable
3624 * the panel fitter when we know it's used. */
3625 if (intel_using_power_well(dev)) {
3626 I915_WRITE(PF_CTL(pipe), 0);
3627 I915_WRITE(PF_WIN_SZ(pipe), 0);
3628 }
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003629
Paulo Zanoni1f544382012-10-24 11:32:00 -02003630 intel_ddi_disable_pipe_clock(intel_crtc);
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003631
3632 for_each_encoder_on_crtc(dev, crtc, encoder)
3633 if (encoder->post_disable)
3634 encoder->post_disable(encoder);
3635
Daniel Vetter88adfff2013-03-28 10:42:01 +01003636 if (intel_crtc->config.has_pch_encoder) {
Paulo Zanoniab4d9662012-10-31 18:12:55 -02003637 lpt_disable_pch_transcoder(dev_priv);
Paulo Zanoni86642812013-04-12 17:57:57 -03003638 intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
Paulo Zanoni1ad960f2012-11-01 21:05:05 -02003639 intel_ddi_fdi_disable(crtc);
Paulo Zanoni83616632012-10-23 18:29:54 -02003640 }
Paulo Zanoni4f771f12012-10-23 18:29:51 -02003641
3642 intel_crtc->active = false;
3643 intel_update_watermarks(dev);
3644
3645 mutex_lock(&dev->struct_mutex);
3646 intel_update_fbc(dev);
3647 mutex_unlock(&dev->struct_mutex);
3648}
3649
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003650static void ironlake_crtc_off(struct drm_crtc *crtc)
3651{
3652 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3653 intel_put_pch_pll(intel_crtc);
3654}
3655
Paulo Zanoni6441ab52012-10-05 12:05:58 -03003656static void haswell_crtc_off(struct drm_crtc *crtc)
3657{
Paulo Zanonia5c961d2012-10-24 15:59:34 -02003658 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3659
3660 /* Stop saying we're using TRANSCODER_EDP because some other CRTC might
3661 * start using it. */
Daniel Vetter3b117c82013-04-17 20:15:07 +02003662 intel_crtc->config.cpu_transcoder = (enum transcoder) intel_crtc->pipe;
Paulo Zanonia5c961d2012-10-24 15:59:34 -02003663
Paulo Zanoni6441ab52012-10-05 12:05:58 -03003664 intel_ddi_put_crtc_pll(crtc);
3665}
3666
Daniel Vetter02e792f2009-09-15 22:57:34 +02003667static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable)
3668{
Daniel Vetter02e792f2009-09-15 22:57:34 +02003669 if (!enable && intel_crtc->overlay) {
Chris Wilson23f09ce2010-08-12 13:53:37 +01003670 struct drm_device *dev = intel_crtc->base.dev;
Chris Wilsonce453d82011-02-21 14:43:56 +00003671 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetter03f77ea2009-09-15 22:57:37 +02003672
Chris Wilson23f09ce2010-08-12 13:53:37 +01003673 mutex_lock(&dev->struct_mutex);
Chris Wilsonce453d82011-02-21 14:43:56 +00003674 dev_priv->mm.interruptible = false;
3675 (void) intel_overlay_switch_off(intel_crtc->overlay);
3676 dev_priv->mm.interruptible = true;
Chris Wilson23f09ce2010-08-12 13:53:37 +01003677 mutex_unlock(&dev->struct_mutex);
Daniel Vetter02e792f2009-09-15 22:57:34 +02003678 }
Daniel Vetter02e792f2009-09-15 22:57:34 +02003679
Chris Wilson5dcdbcb2010-08-12 13:50:28 +01003680 /* Let userspace switch the overlay on again. In most cases userspace
3681 * has to recompute where to put it anyway.
3682 */
Daniel Vetter02e792f2009-09-15 22:57:34 +02003683}
3684
Egbert Eich61bc95c2013-03-04 09:24:38 -05003685/**
3686 * i9xx_fixup_plane - ugly workaround for G45 to fire up the hardware
3687 * cursor plane briefly if not already running after enabling the display
3688 * plane.
3689 * This workaround avoids occasional blank screens when self refresh is
3690 * enabled.
3691 */
3692static void
3693g4x_fixup_plane(struct drm_i915_private *dev_priv, enum pipe pipe)
3694{
3695 u32 cntl = I915_READ(CURCNTR(pipe));
3696
3697 if ((cntl & CURSOR_MODE) == 0) {
3698 u32 fw_bcl_self = I915_READ(FW_BLC_SELF);
3699
3700 I915_WRITE(FW_BLC_SELF, fw_bcl_self & ~FW_BLC_SELF_EN);
3701 I915_WRITE(CURCNTR(pipe), CURSOR_MODE_64_ARGB_AX);
3702 intel_wait_for_vblank(dev_priv->dev, pipe);
3703 I915_WRITE(CURCNTR(pipe), cntl);
3704 I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe)));
3705 I915_WRITE(FW_BLC_SELF, fw_bcl_self);
3706 }
3707}
3708
Jesse Barnes89b667f2013-04-18 14:51:36 -07003709static void valleyview_crtc_enable(struct drm_crtc *crtc)
3710{
3711 struct drm_device *dev = crtc->dev;
3712 struct drm_i915_private *dev_priv = dev->dev_private;
3713 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3714 struct intel_encoder *encoder;
3715 int pipe = intel_crtc->pipe;
3716 int plane = intel_crtc->plane;
3717
3718 WARN_ON(!crtc->enabled);
3719
3720 if (intel_crtc->active)
3721 return;
3722
3723 intel_crtc->active = true;
3724 intel_update_watermarks(dev);
3725
3726 mutex_lock(&dev_priv->dpio_lock);
3727
3728 for_each_encoder_on_crtc(dev, crtc, encoder)
3729 if (encoder->pre_pll_enable)
3730 encoder->pre_pll_enable(encoder);
3731
3732 intel_enable_pll(dev_priv, pipe);
3733
3734 for_each_encoder_on_crtc(dev, crtc, encoder)
3735 if (encoder->pre_enable)
3736 encoder->pre_enable(encoder);
3737
3738 /* VLV wants encoder enabling _before_ the pipe is up. */
3739 for_each_encoder_on_crtc(dev, crtc, encoder)
3740 encoder->enable(encoder);
3741
3742 intel_enable_pipe(dev_priv, pipe, false);
3743 intel_enable_plane(dev_priv, plane, pipe);
3744
3745 intel_crtc_load_lut(crtc);
3746 intel_update_fbc(dev);
3747
3748 /* Give the overlay scaler a chance to enable if it's on this pipe */
3749 intel_crtc_dpms_overlay(intel_crtc, true);
3750 intel_crtc_update_cursor(crtc, true);
3751
3752 mutex_unlock(&dev_priv->dpio_lock);
3753}
3754
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003755static void i9xx_crtc_enable(struct drm_crtc *crtc)
Zhenyu Wang2c072452009-06-05 15:38:42 +08003756{
3757 struct drm_device *dev = crtc->dev;
Jesse Barnes79e53942008-11-07 14:24:08 -08003758 struct drm_i915_private *dev_priv = dev->dev_private;
3759 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003760 struct intel_encoder *encoder;
Jesse Barnes79e53942008-11-07 14:24:08 -08003761 int pipe = intel_crtc->pipe;
Jesse Barnes80824002009-09-10 15:28:06 -07003762 int plane = intel_crtc->plane;
Jesse Barnes79e53942008-11-07 14:24:08 -08003763
Daniel Vetter08a48462012-07-02 11:43:47 +02003764 WARN_ON(!crtc->enabled);
3765
Chris Wilsonf7abfe82010-09-13 14:19:16 +01003766 if (intel_crtc->active)
3767 return;
3768
3769 intel_crtc->active = true;
Chris Wilson6b383a72010-09-13 13:54:26 +01003770 intel_update_watermarks(dev);
3771
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08003772 intel_enable_pll(dev_priv, pipe);
Mika Kuoppala9d6d9f12013-02-08 16:35:38 +02003773
3774 for_each_encoder_on_crtc(dev, crtc, encoder)
3775 if (encoder->pre_enable)
3776 encoder->pre_enable(encoder);
3777
Jesse Barnes040484a2011-01-03 12:14:26 -08003778 intel_enable_pipe(dev_priv, pipe, false);
Jesse Barnesb24e7172011-01-04 15:09:30 -08003779 intel_enable_plane(dev_priv, plane, pipe);
Egbert Eich61bc95c2013-03-04 09:24:38 -05003780 if (IS_G4X(dev))
3781 g4x_fixup_plane(dev_priv, pipe);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003782
3783 intel_crtc_load_lut(crtc);
Chris Wilsonbed4a672010-09-11 10:47:47 +01003784 intel_update_fbc(dev);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003785
3786 /* Give the overlay scaler a chance to enable if it's on this pipe */
3787 intel_crtc_dpms_overlay(intel_crtc, true);
Chris Wilson6b383a72010-09-13 13:54:26 +01003788 intel_crtc_update_cursor(crtc, true);
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003789
Daniel Vetterfa5c73b2012-07-01 23:24:36 +02003790 for_each_encoder_on_crtc(dev, crtc, encoder)
3791 encoder->enable(encoder);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003792}
3793
Daniel Vetter87476d62013-04-11 16:29:06 +02003794static void i9xx_pfit_disable(struct intel_crtc *crtc)
3795{
3796 struct drm_device *dev = crtc->base.dev;
3797 struct drm_i915_private *dev_priv = dev->dev_private;
3798 enum pipe pipe;
3799 uint32_t pctl = I915_READ(PFIT_CONTROL);
3800
3801 assert_pipe_disabled(dev_priv, crtc->pipe);
3802
3803 if (INTEL_INFO(dev)->gen >= 4)
3804 pipe = (pctl & PFIT_PIPE_MASK) >> PFIT_PIPE_SHIFT;
3805 else
3806 pipe = PIPE_B;
3807
3808 if (pipe == crtc->pipe) {
3809 DRM_DEBUG_DRIVER("disabling pfit, current: 0x%08x\n", pctl);
3810 I915_WRITE(PFIT_CONTROL, 0);
3811 }
3812}
3813
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003814static void i9xx_crtc_disable(struct drm_crtc *crtc)
3815{
3816 struct drm_device *dev = crtc->dev;
3817 struct drm_i915_private *dev_priv = dev->dev_private;
3818 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003819 struct intel_encoder *encoder;
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003820 int pipe = intel_crtc->pipe;
3821 int plane = intel_crtc->plane;
Daniel Vetteref9c3ae2012-06-29 22:40:09 +02003822
Chris Wilsonf7abfe82010-09-13 14:19:16 +01003823 if (!intel_crtc->active)
3824 return;
3825
Daniel Vetterea9d7582012-07-10 10:42:52 +02003826 for_each_encoder_on_crtc(dev, crtc, encoder)
3827 encoder->disable(encoder);
3828
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003829 /* Give the overlay scaler a chance to disable if it's on this pipe */
Chris Wilsone6c3a2a2010-09-23 23:04:43 +01003830 intel_crtc_wait_for_pending_flips(crtc);
3831 drm_vblank_off(dev, pipe);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003832 intel_crtc_dpms_overlay(intel_crtc, false);
Chris Wilson6b383a72010-09-13 13:54:26 +01003833 intel_crtc_update_cursor(crtc, false);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003834
Chris Wilson973d04f2011-07-08 12:22:37 +01003835 if (dev_priv->cfb_plane == plane)
3836 intel_disable_fbc(dev);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003837
Jesse Barnesb24e7172011-01-04 15:09:30 -08003838 intel_disable_plane(dev_priv, plane, pipe);
Jesse Barnesb24e7172011-01-04 15:09:30 -08003839 intel_disable_pipe(dev_priv, pipe);
Mika Kuoppala24a1f162013-02-08 16:35:37 +02003840
Daniel Vetter87476d62013-04-11 16:29:06 +02003841 i9xx_pfit_disable(intel_crtc);
Mika Kuoppala24a1f162013-02-08 16:35:37 +02003842
Jesse Barnes89b667f2013-04-18 14:51:36 -07003843 for_each_encoder_on_crtc(dev, crtc, encoder)
3844 if (encoder->post_disable)
3845 encoder->post_disable(encoder);
3846
Jesse Barnes63d7bbe2011-01-04 15:09:33 -08003847 intel_disable_pll(dev_priv, pipe);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003848
Chris Wilsonf7abfe82010-09-13 14:19:16 +01003849 intel_crtc->active = false;
Chris Wilson6b383a72010-09-13 13:54:26 +01003850 intel_update_fbc(dev);
3851 intel_update_watermarks(dev);
Jesse Barnes0b8765c62010-09-10 10:31:34 -07003852}
3853
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003854static void i9xx_crtc_off(struct drm_crtc *crtc)
3855{
3856}
3857
Daniel Vetter976f8a22012-07-08 22:34:21 +02003858static void intel_crtc_update_sarea(struct drm_crtc *crtc,
3859 bool enabled)
Zhenyu Wang2c072452009-06-05 15:38:42 +08003860{
3861 struct drm_device *dev = crtc->dev;
3862 struct drm_i915_master_private *master_priv;
3863 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3864 int pipe = intel_crtc->pipe;
Jesse Barnes79e53942008-11-07 14:24:08 -08003865
3866 if (!dev->primary->master)
3867 return;
3868
3869 master_priv = dev->primary->master->driver_priv;
3870 if (!master_priv->sarea_priv)
3871 return;
3872
Jesse Barnes79e53942008-11-07 14:24:08 -08003873 switch (pipe) {
3874 case 0:
3875 master_priv->sarea_priv->pipeA_w = enabled ? crtc->mode.hdisplay : 0;
3876 master_priv->sarea_priv->pipeA_h = enabled ? crtc->mode.vdisplay : 0;
3877 break;
3878 case 1:
3879 master_priv->sarea_priv->pipeB_w = enabled ? crtc->mode.hdisplay : 0;
3880 master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0;
3881 break;
3882 default:
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08003883 DRM_ERROR("Can't update pipe %c in SAREA\n", pipe_name(pipe));
Jesse Barnes79e53942008-11-07 14:24:08 -08003884 break;
3885 }
Jesse Barnes79e53942008-11-07 14:24:08 -08003886}
3887
Daniel Vetter976f8a22012-07-08 22:34:21 +02003888/**
3889 * Sets the power management mode of the pipe and plane.
3890 */
3891void intel_crtc_update_dpms(struct drm_crtc *crtc)
Chris Wilsoncdd59982010-09-08 16:30:16 +01003892{
Chris Wilsoncdd59982010-09-08 16:30:16 +01003893 struct drm_device *dev = crtc->dev;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003894 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetter976f8a22012-07-08 22:34:21 +02003895 struct intel_encoder *intel_encoder;
3896 bool enable = false;
Chris Wilsoncdd59982010-09-08 16:30:16 +01003897
Daniel Vetter976f8a22012-07-08 22:34:21 +02003898 for_each_encoder_on_crtc(dev, crtc, intel_encoder)
3899 enable |= intel_encoder->connectors_active;
3900
3901 if (enable)
3902 dev_priv->display.crtc_enable(crtc);
3903 else
3904 dev_priv->display.crtc_disable(crtc);
3905
3906 intel_crtc_update_sarea(crtc, enable);
3907}
3908
Daniel Vetter976f8a22012-07-08 22:34:21 +02003909static void intel_crtc_disable(struct drm_crtc *crtc)
3910{
3911 struct drm_device *dev = crtc->dev;
3912 struct drm_connector *connector;
3913 struct drm_i915_private *dev_priv = dev->dev_private;
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08003914 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter976f8a22012-07-08 22:34:21 +02003915
3916 /* crtc should still be enabled when we disable it. */
3917 WARN_ON(!crtc->enabled);
3918
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08003919 intel_crtc->eld_vld = false;
Daniel Vetter976f8a22012-07-08 22:34:21 +02003920 dev_priv->display.crtc_disable(crtc);
3921 intel_crtc_update_sarea(crtc, false);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01003922 dev_priv->display.off(crtc);
3923
Chris Wilson931872f2012-01-16 23:01:13 +00003924 assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane);
3925 assert_pipe_disabled(dev->dev_private, to_intel_crtc(crtc)->pipe);
Chris Wilsoncdd59982010-09-08 16:30:16 +01003926
3927 if (crtc->fb) {
3928 mutex_lock(&dev->struct_mutex);
Chris Wilson1690e1e2011-12-14 13:57:08 +01003929 intel_unpin_fb_obj(to_intel_framebuffer(crtc->fb)->obj);
Chris Wilsoncdd59982010-09-08 16:30:16 +01003930 mutex_unlock(&dev->struct_mutex);
Daniel Vetter976f8a22012-07-08 22:34:21 +02003931 crtc->fb = NULL;
3932 }
3933
3934 /* Update computed state. */
3935 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
3936 if (!connector->encoder || !connector->encoder->crtc)
3937 continue;
3938
3939 if (connector->encoder->crtc != crtc)
3940 continue;
3941
3942 connector->dpms = DRM_MODE_DPMS_OFF;
3943 to_intel_encoder(connector->encoder)->connectors_active = false;
Chris Wilsoncdd59982010-09-08 16:30:16 +01003944 }
3945}
3946
Daniel Vettera261b242012-07-26 19:21:47 +02003947void intel_modeset_disable(struct drm_device *dev)
Jesse Barnes79e53942008-11-07 14:24:08 -08003948{
Daniel Vettera261b242012-07-26 19:21:47 +02003949 struct drm_crtc *crtc;
3950
3951 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
3952 if (crtc->enabled)
3953 intel_crtc_disable(crtc);
3954 }
Jesse Barnes79e53942008-11-07 14:24:08 -08003955}
3956
Chris Wilsonea5b2132010-08-04 13:50:23 +01003957void intel_encoder_destroy(struct drm_encoder *encoder)
3958{
Chris Wilson4ef69c72010-09-09 15:14:28 +01003959 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
Chris Wilsonea5b2132010-08-04 13:50:23 +01003960
Chris Wilsonea5b2132010-08-04 13:50:23 +01003961 drm_encoder_cleanup(encoder);
3962 kfree(intel_encoder);
3963}
3964
Daniel Vetter5ab432e2012-06-30 08:59:56 +02003965/* Simple dpms helper for encodres with just one connector, no cloning and only
3966 * one kind of off state. It clamps all !ON modes to fully OFF and changes the
3967 * state of the entire output pipe. */
3968void intel_encoder_dpms(struct intel_encoder *encoder, int mode)
3969{
3970 if (mode == DRM_MODE_DPMS_ON) {
3971 encoder->connectors_active = true;
3972
Daniel Vetterb2cabb02012-07-01 22:42:24 +02003973 intel_crtc_update_dpms(encoder->base.crtc);
Daniel Vetter5ab432e2012-06-30 08:59:56 +02003974 } else {
3975 encoder->connectors_active = false;
3976
Daniel Vetterb2cabb02012-07-01 22:42:24 +02003977 intel_crtc_update_dpms(encoder->base.crtc);
Daniel Vetter5ab432e2012-06-30 08:59:56 +02003978 }
3979}
3980
Daniel Vetter0a91ca22012-07-02 21:54:27 +02003981/* Cross check the actual hw state with our own modeset state tracking (and it's
3982 * internal consistency). */
Daniel Vetterb9805142012-08-31 17:37:33 +02003983static void intel_connector_check_state(struct intel_connector *connector)
Daniel Vetter0a91ca22012-07-02 21:54:27 +02003984{
3985 if (connector->get_hw_state(connector)) {
3986 struct intel_encoder *encoder = connector->encoder;
3987 struct drm_crtc *crtc;
3988 bool encoder_enabled;
3989 enum pipe pipe;
3990
3991 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
3992 connector->base.base.id,
3993 drm_get_connector_name(&connector->base));
3994
3995 WARN(connector->base.dpms == DRM_MODE_DPMS_OFF,
3996 "wrong connector dpms state\n");
3997 WARN(connector->base.encoder != &encoder->base,
3998 "active connector not linked to encoder\n");
3999 WARN(!encoder->connectors_active,
4000 "encoder->connectors_active not set\n");
4001
4002 encoder_enabled = encoder->get_hw_state(encoder, &pipe);
4003 WARN(!encoder_enabled, "encoder not enabled\n");
4004 if (WARN_ON(!encoder->base.crtc))
4005 return;
4006
4007 crtc = encoder->base.crtc;
4008
4009 WARN(!crtc->enabled, "crtc not enabled\n");
4010 WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
4011 WARN(pipe != to_intel_crtc(crtc)->pipe,
4012 "encoder active on the wrong pipe\n");
4013 }
4014}
4015
Daniel Vetter5ab432e2012-06-30 08:59:56 +02004016/* Even simpler default implementation, if there's really no special case to
4017 * consider. */
4018void intel_connector_dpms(struct drm_connector *connector, int mode)
4019{
4020 struct intel_encoder *encoder = intel_attached_encoder(connector);
4021
4022 /* All the simple cases only support two dpms states. */
4023 if (mode != DRM_MODE_DPMS_ON)
4024 mode = DRM_MODE_DPMS_OFF;
4025
4026 if (mode == connector->dpms)
4027 return;
4028
4029 connector->dpms = mode;
4030
4031 /* Only need to change hw state when actually enabled */
4032 if (encoder->base.crtc)
4033 intel_encoder_dpms(encoder, mode);
4034 else
Daniel Vetter8af6cf82012-07-10 09:50:11 +02004035 WARN_ON(encoder->connectors_active != false);
Daniel Vetter0a91ca22012-07-02 21:54:27 +02004036
Daniel Vetterb9805142012-08-31 17:37:33 +02004037 intel_modeset_check_state(connector->dev);
Daniel Vetter5ab432e2012-06-30 08:59:56 +02004038}
4039
Daniel Vetterf0947c32012-07-02 13:10:34 +02004040/* Simple connector->get_hw_state implementation for encoders that support only
4041 * one connector and no cloning and hence the encoder state determines the state
4042 * of the connector. */
4043bool intel_connector_get_hw_state(struct intel_connector *connector)
4044{
Daniel Vetter24929352012-07-02 20:28:59 +02004045 enum pipe pipe = 0;
Daniel Vetterf0947c32012-07-02 13:10:34 +02004046 struct intel_encoder *encoder = connector->encoder;
4047
4048 return encoder->get_hw_state(encoder, &pipe);
4049}
4050
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01004051static bool intel_crtc_compute_config(struct drm_crtc *crtc,
4052 struct intel_crtc_config *pipe_config)
Jesse Barnes79e53942008-11-07 14:24:08 -08004053{
Zhenyu Wang2c072452009-06-05 15:38:42 +08004054 struct drm_device *dev = crtc->dev;
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01004055 struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
Chris Wilson89749352010-09-12 18:25:19 +01004056
Eric Anholtbad720f2009-10-22 16:11:14 -07004057 if (HAS_PCH_SPLIT(dev)) {
Zhenyu Wang2c072452009-06-05 15:38:42 +08004058 /* FDI link clock is fixed at 2.7G */
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01004059 if (pipe_config->requested_mode.clock * 3
4060 > IRONLAKE_FDI_FREQ * 4)
Jesse Barnes2377b742010-07-07 14:06:43 -07004061 return false;
Zhenyu Wang2c072452009-06-05 15:38:42 +08004062 }
Chris Wilson89749352010-09-12 18:25:19 +01004063
Daniel Vetterf9bef082012-04-15 19:53:19 +02004064 /* All interlaced capable intel hw wants timings in frames. Note though
4065 * that intel_lvds_mode_fixup does some funny tricks with the crtc
4066 * timings, so we need to be careful not to clobber these.*/
Daniel Vetter7ae89232013-03-27 00:44:52 +01004067 if (!pipe_config->timings_set)
Daniel Vetterf9bef082012-04-15 19:53:19 +02004068 drm_mode_set_crtcinfo(adjusted_mode, 0);
Chris Wilson89749352010-09-12 18:25:19 +01004069
Chris Wilson44f46b422012-06-21 13:19:59 +03004070 /* WaPruneModeWithIncorrectHsyncOffset: Cantiga+ cannot handle modes
4071 * with a hsync front porch of 0.
4072 */
4073 if ((INTEL_INFO(dev)->gen > 4 || IS_G4X(dev)) &&
4074 adjusted_mode->hsync_start == adjusted_mode->hdisplay)
4075 return false;
4076
Daniel Vetterbd080ee2013-04-17 20:01:39 +02004077 if ((IS_G4X(dev) || IS_VALLEYVIEW(dev)) && pipe_config->pipe_bpp > 10*3) {
Daniel Vetter5d2d38d2013-03-27 00:45:01 +01004078 pipe_config->pipe_bpp = 10*3; /* 12bpc is gen5+ */
Daniel Vetterbd080ee2013-04-17 20:01:39 +02004079 } else if (INTEL_INFO(dev)->gen <= 4 && pipe_config->pipe_bpp > 8*3) {
Daniel Vetter5d2d38d2013-03-27 00:45:01 +01004080 /* only a 8bpc pipe, with 6bpc dither through the panel fitter
4081 * for lvds. */
4082 pipe_config->pipe_bpp = 8*3;
4083 }
4084
Jesse Barnes79e53942008-11-07 14:24:08 -08004085 return true;
4086}
4087
Jesse Barnes25eb05fc2012-03-28 13:39:23 -07004088static int valleyview_get_display_clock_speed(struct drm_device *dev)
4089{
4090 return 400000; /* FIXME */
4091}
4092
Jesse Barnese70236a2009-09-21 10:42:27 -07004093static int i945_get_display_clock_speed(struct drm_device *dev)
Jesse Barnes79e53942008-11-07 14:24:08 -08004094{
Jesse Barnese70236a2009-09-21 10:42:27 -07004095 return 400000;
4096}
Jesse Barnes79e53942008-11-07 14:24:08 -08004097
Jesse Barnese70236a2009-09-21 10:42:27 -07004098static int i915_get_display_clock_speed(struct drm_device *dev)
4099{
4100 return 333000;
4101}
Jesse Barnes79e53942008-11-07 14:24:08 -08004102
Jesse Barnese70236a2009-09-21 10:42:27 -07004103static int i9xx_misc_get_display_clock_speed(struct drm_device *dev)
4104{
4105 return 200000;
4106}
Jesse Barnes79e53942008-11-07 14:24:08 -08004107
Jesse Barnese70236a2009-09-21 10:42:27 -07004108static int i915gm_get_display_clock_speed(struct drm_device *dev)
4109{
4110 u16 gcfgc = 0;
4111
4112 pci_read_config_word(dev->pdev, GCFGC, &gcfgc);
4113
4114 if (gcfgc & GC_LOW_FREQUENCY_ENABLE)
Jesse Barnes79e53942008-11-07 14:24:08 -08004115 return 133000;
Jesse Barnese70236a2009-09-21 10:42:27 -07004116 else {
4117 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
4118 case GC_DISPLAY_CLOCK_333_MHZ:
4119 return 333000;
4120 default:
4121 case GC_DISPLAY_CLOCK_190_200_MHZ:
4122 return 190000;
4123 }
4124 }
4125}
Jesse Barnes79e53942008-11-07 14:24:08 -08004126
Jesse Barnese70236a2009-09-21 10:42:27 -07004127static int i865_get_display_clock_speed(struct drm_device *dev)
4128{
4129 return 266000;
4130}
4131
4132static int i855_get_display_clock_speed(struct drm_device *dev)
4133{
4134 u16 hpllcc = 0;
4135 /* Assume that the hardware is in the high speed state. This
4136 * should be the default.
4137 */
4138 switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
4139 case GC_CLOCK_133_200:
4140 case GC_CLOCK_100_200:
4141 return 200000;
4142 case GC_CLOCK_166_250:
4143 return 250000;
4144 case GC_CLOCK_100_133:
4145 return 133000;
4146 }
4147
4148 /* Shouldn't happen */
4149 return 0;
4150}
4151
4152static int i830_get_display_clock_speed(struct drm_device *dev)
4153{
4154 return 133000;
Jesse Barnes79e53942008-11-07 14:24:08 -08004155}
4156
Zhenyu Wang2c072452009-06-05 15:38:42 +08004157static void
Daniel Vettere69d0bc2012-11-29 15:59:36 +01004158intel_reduce_ratio(uint32_t *num, uint32_t *den)
Zhenyu Wang2c072452009-06-05 15:38:42 +08004159{
4160 while (*num > 0xffffff || *den > 0xffffff) {
4161 *num >>= 1;
4162 *den >>= 1;
4163 }
4164}
4165
Daniel Vettere69d0bc2012-11-29 15:59:36 +01004166void
4167intel_link_compute_m_n(int bits_per_pixel, int nlanes,
4168 int pixel_clock, int link_clock,
4169 struct intel_link_m_n *m_n)
Zhenyu Wang2c072452009-06-05 15:38:42 +08004170{
Daniel Vettere69d0bc2012-11-29 15:59:36 +01004171 m_n->tu = 64;
Chris Wilson22ed1112010-12-04 01:01:29 +00004172 m_n->gmch_m = bits_per_pixel * pixel_clock;
4173 m_n->gmch_n = link_clock * nlanes * 8;
Daniel Vettere69d0bc2012-11-29 15:59:36 +01004174 intel_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n);
Chris Wilson22ed1112010-12-04 01:01:29 +00004175 m_n->link_m = pixel_clock;
4176 m_n->link_n = link_clock;
Daniel Vettere69d0bc2012-11-29 15:59:36 +01004177 intel_reduce_ratio(&m_n->link_m, &m_n->link_n);
Zhenyu Wang2c072452009-06-05 15:38:42 +08004178}
4179
Chris Wilsona7615032011-01-12 17:04:08 +00004180static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
4181{
Keith Packard72bbe582011-09-26 16:09:45 -07004182 if (i915_panel_use_ssc >= 0)
4183 return i915_panel_use_ssc != 0;
4184 return dev_priv->lvds_use_ssc
Keith Packard435793d2011-07-12 14:56:22 -07004185 && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
Chris Wilsona7615032011-01-12 17:04:08 +00004186}
4187
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004188static int vlv_get_refclk(struct drm_crtc *crtc)
4189{
4190 struct drm_device *dev = crtc->dev;
4191 struct drm_i915_private *dev_priv = dev->dev_private;
4192 int refclk = 27000; /* for DP & HDMI */
4193
4194 return 100000; /* only one validated so far */
4195
4196 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG)) {
4197 refclk = 96000;
4198 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
4199 if (intel_panel_use_ssc(dev_priv))
4200 refclk = 100000;
4201 else
4202 refclk = 96000;
4203 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) {
4204 refclk = 100000;
4205 }
4206
4207 return refclk;
4208}
4209
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004210static int i9xx_get_refclk(struct drm_crtc *crtc, int num_connectors)
4211{
4212 struct drm_device *dev = crtc->dev;
4213 struct drm_i915_private *dev_priv = dev->dev_private;
4214 int refclk;
4215
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004216 if (IS_VALLEYVIEW(dev)) {
4217 refclk = vlv_get_refclk(crtc);
4218 } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004219 intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
4220 refclk = dev_priv->lvds_ssc_freq * 1000;
4221 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
4222 refclk / 1000);
4223 } else if (!IS_GEN2(dev)) {
4224 refclk = 96000;
4225 } else {
4226 refclk = 48000;
4227 }
4228
4229 return refclk;
4230}
4231
Daniel Vetterf47709a2013-03-28 10:42:02 +01004232static void i9xx_adjust_sdvo_tv_clock(struct intel_crtc *crtc)
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004233{
Daniel Vetterf47709a2013-03-28 10:42:02 +01004234 unsigned dotclock = crtc->config.adjusted_mode.clock;
4235 struct dpll *clock = &crtc->config.dpll;
4236
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004237 /* SDVO TV has fixed PLL values depend on its clock range,
4238 this mirrors vbios setting. */
Daniel Vetterf47709a2013-03-28 10:42:02 +01004239 if (dotclock >= 100000 && dotclock < 140500) {
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004240 clock->p1 = 2;
4241 clock->p2 = 10;
4242 clock->n = 3;
4243 clock->m1 = 16;
4244 clock->m2 = 8;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004245 } else if (dotclock >= 140500 && dotclock <= 200000) {
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004246 clock->p1 = 1;
4247 clock->p2 = 10;
4248 clock->n = 6;
4249 clock->m1 = 12;
4250 clock->m2 = 8;
4251 }
Daniel Vetterf47709a2013-03-28 10:42:02 +01004252
4253 crtc->config.clock_set = true;
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004254}
4255
Daniel Vetterf47709a2013-03-28 10:42:02 +01004256static void i9xx_update_pll_dividers(struct intel_crtc *crtc,
Jesse Barnesa7516a02011-12-15 12:30:37 -08004257 intel_clock_t *reduced_clock)
4258{
Daniel Vetterf47709a2013-03-28 10:42:02 +01004259 struct drm_device *dev = crtc->base.dev;
Jesse Barnesa7516a02011-12-15 12:30:37 -08004260 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004261 int pipe = crtc->pipe;
Jesse Barnesa7516a02011-12-15 12:30:37 -08004262 u32 fp, fp2 = 0;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004263 struct dpll *clock = &crtc->config.dpll;
Jesse Barnesa7516a02011-12-15 12:30:37 -08004264
4265 if (IS_PINEVIEW(dev)) {
4266 fp = (1 << clock->n) << 16 | clock->m1 << 8 | clock->m2;
4267 if (reduced_clock)
4268 fp2 = (1 << reduced_clock->n) << 16 |
4269 reduced_clock->m1 << 8 | reduced_clock->m2;
4270 } else {
4271 fp = clock->n << 16 | clock->m1 << 8 | clock->m2;
4272 if (reduced_clock)
4273 fp2 = reduced_clock->n << 16 | reduced_clock->m1 << 8 |
4274 reduced_clock->m2;
4275 }
4276
4277 I915_WRITE(FP0(pipe), fp);
4278
Daniel Vetterf47709a2013-03-28 10:42:02 +01004279 crtc->lowfreq_avail = false;
4280 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_LVDS) &&
Jesse Barnesa7516a02011-12-15 12:30:37 -08004281 reduced_clock && i915_powersave) {
4282 I915_WRITE(FP1(pipe), fp2);
Daniel Vetterf47709a2013-03-28 10:42:02 +01004283 crtc->lowfreq_avail = true;
Jesse Barnesa7516a02011-12-15 12:30:37 -08004284 } else {
4285 I915_WRITE(FP1(pipe), fp);
4286 }
4287}
4288
Jesse Barnes89b667f2013-04-18 14:51:36 -07004289static void vlv_pllb_recal_opamp(struct drm_i915_private *dev_priv)
4290{
4291 u32 reg_val;
4292
4293 /*
4294 * PLLB opamp always calibrates to max value of 0x3f, force enable it
4295 * and set it to a reasonable value instead.
4296 */
4297 reg_val = intel_dpio_read(dev_priv, DPIO_IREF(1));
4298 reg_val &= 0xffffff00;
4299 reg_val |= 0x00000030;
4300 intel_dpio_write(dev_priv, DPIO_IREF(1), reg_val);
4301
4302 reg_val = intel_dpio_read(dev_priv, DPIO_CALIBRATION);
4303 reg_val &= 0x8cffffff;
4304 reg_val = 0x8c000000;
4305 intel_dpio_write(dev_priv, DPIO_CALIBRATION, reg_val);
4306
4307 reg_val = intel_dpio_read(dev_priv, DPIO_IREF(1));
4308 reg_val &= 0xffffff00;
4309 intel_dpio_write(dev_priv, DPIO_IREF(1), reg_val);
4310
4311 reg_val = intel_dpio_read(dev_priv, DPIO_CALIBRATION);
4312 reg_val &= 0x00ffffff;
4313 reg_val |= 0xb0000000;
4314 intel_dpio_write(dev_priv, DPIO_CALIBRATION, reg_val);
4315}
4316
Daniel Vetter03afc4a2013-04-02 23:42:31 +02004317static void intel_dp_set_m_n(struct intel_crtc *crtc)
4318{
4319 if (crtc->config.has_pch_encoder)
4320 intel_pch_transcoder_set_m_n(crtc, &crtc->config.dp_m_n);
4321 else
4322 intel_cpu_transcoder_set_m_n(crtc, &crtc->config.dp_m_n);
4323}
4324
Daniel Vetterf47709a2013-03-28 10:42:02 +01004325static void vlv_update_pll(struct intel_crtc *crtc)
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004326{
Daniel Vetterf47709a2013-03-28 10:42:02 +01004327 struct drm_device *dev = crtc->base.dev;
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004328 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes89b667f2013-04-18 14:51:36 -07004329 struct drm_display_mode *adjusted_mode =
4330 &crtc->config.adjusted_mode;
4331 struct intel_encoder *encoder;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004332 int pipe = crtc->pipe;
Jesse Barnes89b667f2013-04-18 14:51:36 -07004333 u32 dpll, mdiv;
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004334 u32 bestn, bestm1, bestm2, bestp1, bestp2;
Jesse Barnes89b667f2013-04-18 14:51:36 -07004335 bool is_hdmi;
4336 u32 coreclk, reg_val, temp;
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004337
Daniel Vetter09153002012-12-12 14:06:44 +01004338 mutex_lock(&dev_priv->dpio_lock);
4339
Jesse Barnes89b667f2013-04-18 14:51:36 -07004340 is_hdmi = intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_HDMI);
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004341
Daniel Vetterf47709a2013-03-28 10:42:02 +01004342 bestn = crtc->config.dpll.n;
4343 bestm1 = crtc->config.dpll.m1;
4344 bestm2 = crtc->config.dpll.m2;
4345 bestp1 = crtc->config.dpll.p1;
4346 bestp2 = crtc->config.dpll.p2;
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004347
Jesse Barnes89b667f2013-04-18 14:51:36 -07004348 /* See eDP HDMI DPIO driver vbios notes doc */
4349
4350 /* PLL B needs special handling */
4351 if (pipe)
4352 vlv_pllb_recal_opamp(dev_priv);
4353
4354 /* Set up Tx target for periodic Rcomp update */
4355 intel_dpio_write(dev_priv, DPIO_IREF_BCAST, 0x0100000f);
4356
4357 /* Disable target IRef on PLL */
4358 reg_val = intel_dpio_read(dev_priv, DPIO_IREF_CTL(pipe));
4359 reg_val &= 0x00ffffff;
4360 intel_dpio_write(dev_priv, DPIO_IREF_CTL(pipe), reg_val);
4361
4362 /* Disable fast lock */
4363 intel_dpio_write(dev_priv, DPIO_FASTCLK_DISABLE, 0x610);
4364
4365 /* Set idtafcrecal before PLL is enabled */
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004366 mdiv = ((bestm1 << DPIO_M1DIV_SHIFT) | (bestm2 & DPIO_M2DIV_MASK));
4367 mdiv |= ((bestp1 << DPIO_P1_SHIFT) | (bestp2 << DPIO_P2_SHIFT));
4368 mdiv |= ((bestn << DPIO_N_SHIFT));
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004369 mdiv |= (1 << DPIO_K_SHIFT);
Jesse Barnes89b667f2013-04-18 14:51:36 -07004370 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_HDMI) ||
4371 intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_EDP) ||
4372 intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_DISPLAYPORT))
4373 mdiv |= (DPIO_POST_DIV_HDMIDP << DPIO_POST_DIV_SHIFT);
4374 intel_dpio_write(dev_priv, DPIO_DIV(pipe), mdiv);
4375
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004376 mdiv |= DPIO_ENABLE_CALIBRATION;
4377 intel_dpio_write(dev_priv, DPIO_DIV(pipe), mdiv);
4378
Jesse Barnes89b667f2013-04-18 14:51:36 -07004379 /* Set HBR and RBR LPF coefficients */
4380 if (adjusted_mode->clock == 162000 ||
4381 intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_HDMI))
4382 intel_dpio_write(dev_priv, DPIO_LFP_COEFF(pipe),
4383 0x005f0021);
4384 else
4385 intel_dpio_write(dev_priv, DPIO_LFP_COEFF(pipe),
4386 0x00d0000f);
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004387
Jesse Barnes89b667f2013-04-18 14:51:36 -07004388 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_EDP) ||
4389 intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_DISPLAYPORT)) {
4390 /* Use SSC source */
4391 if (!pipe)
4392 intel_dpio_write(dev_priv, DPIO_REFSFR(pipe),
4393 0x0df40000);
4394 else
4395 intel_dpio_write(dev_priv, DPIO_REFSFR(pipe),
4396 0x0df70000);
4397 } else { /* HDMI or VGA */
4398 /* Use bend source */
4399 if (!pipe)
4400 intel_dpio_write(dev_priv, DPIO_REFSFR(pipe),
4401 0x0df70000);
4402 else
4403 intel_dpio_write(dev_priv, DPIO_REFSFR(pipe),
4404 0x0df40000);
4405 }
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004406
Jesse Barnes89b667f2013-04-18 14:51:36 -07004407 coreclk = intel_dpio_read(dev_priv, DPIO_CORE_CLK(pipe));
4408 coreclk = (coreclk & 0x0000ff00) | 0x01c00000;
4409 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_DISPLAYPORT) ||
4410 intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_EDP))
4411 coreclk |= 0x01000000;
4412 intel_dpio_write(dev_priv, DPIO_CORE_CLK(pipe), coreclk);
4413
4414 intel_dpio_write(dev_priv, DPIO_PLL_CML(pipe), 0x87871000);
4415
4416 for_each_encoder_on_crtc(dev, &crtc->base, encoder)
4417 if (encoder->pre_pll_enable)
4418 encoder->pre_pll_enable(encoder);
4419
4420 /* Enable DPIO clock input */
4421 dpll = DPLL_EXT_BUFFER_ENABLE_VLV | DPLL_REFA_CLK_ENABLE_VLV |
4422 DPLL_VGA_MODE_DIS | DPLL_INTEGRATED_CLOCK_VLV;
4423 if (pipe)
4424 dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004425
4426 dpll |= DPLL_VCO_ENABLE;
4427 I915_WRITE(DPLL(pipe), dpll);
4428 POSTING_READ(DPLL(pipe));
Jesse Barnes89b667f2013-04-18 14:51:36 -07004429 udelay(150);
4430
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004431 if (wait_for(((I915_READ(DPLL(pipe)) & DPLL_LOCK_VLV) == DPLL_LOCK_VLV), 1))
4432 DRM_ERROR("DPLL %d failed to lock\n", pipe);
4433
Jesse Barnes89b667f2013-04-18 14:51:36 -07004434 if (is_hdmi) {
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004435 temp = 0;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004436 if (crtc->config.pixel_multiplier > 1) {
4437 temp = (crtc->config.pixel_multiplier - 1)
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004438 << DPLL_MD_UDI_MULTIPLIER_SHIFT;
4439 }
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004440
Jesse Barnes89b667f2013-04-18 14:51:36 -07004441 I915_WRITE(DPLL_MD(pipe), temp);
4442 POSTING_READ(DPLL_MD(pipe));
Vijay Purushothaman2a8f64c2012-09-27 19:13:06 +05304443 }
Daniel Vetterf47709a2013-03-28 10:42:02 +01004444
Jesse Barnes89b667f2013-04-18 14:51:36 -07004445 if (crtc->config.has_dp_encoder)
4446 intel_dp_set_m_n(crtc);
Daniel Vetter09153002012-12-12 14:06:44 +01004447
4448 mutex_unlock(&dev_priv->dpio_lock);
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004449}
4450
Daniel Vetterf47709a2013-03-28 10:42:02 +01004451static void i9xx_update_pll(struct intel_crtc *crtc,
4452 intel_clock_t *reduced_clock,
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004453 int num_connectors)
4454{
Daniel Vetterf47709a2013-03-28 10:42:02 +01004455 struct drm_device *dev = crtc->base.dev;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004456 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterdafd2262012-11-26 17:22:07 +01004457 struct intel_encoder *encoder;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004458 int pipe = crtc->pipe;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004459 u32 dpll;
4460 bool is_sdvo;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004461 struct dpll *clock = &crtc->config.dpll;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004462
Daniel Vetterf47709a2013-03-28 10:42:02 +01004463 i9xx_update_pll_dividers(crtc, reduced_clock);
Vijay Purushothaman2a8f64c2012-09-27 19:13:06 +05304464
Daniel Vetterf47709a2013-03-28 10:42:02 +01004465 is_sdvo = intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_SDVO) ||
4466 intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_HDMI);
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004467
4468 dpll = DPLL_VGA_MODE_DIS;
4469
Daniel Vetterf47709a2013-03-28 10:42:02 +01004470 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_LVDS))
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004471 dpll |= DPLLB_MODE_LVDS;
4472 else
4473 dpll |= DPLLB_MODE_DAC_SERIAL;
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004474
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004475 if (is_sdvo) {
Daniel Vetterf47709a2013-03-28 10:42:02 +01004476 if ((crtc->config.pixel_multiplier > 1) &&
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004477 (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))) {
Daniel Vetterf47709a2013-03-28 10:42:02 +01004478 dpll |= (crtc->config.pixel_multiplier - 1)
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004479 << SDVO_MULTIPLIER_SHIFT_HIRES;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004480 }
4481 dpll |= DPLL_DVO_HIGH_SPEED;
4482 }
Daniel Vetterf47709a2013-03-28 10:42:02 +01004483 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_DISPLAYPORT))
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004484 dpll |= DPLL_DVO_HIGH_SPEED;
4485
4486 /* compute bitmask from p1 value */
4487 if (IS_PINEVIEW(dev))
4488 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW;
4489 else {
4490 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
4491 if (IS_G4X(dev) && reduced_clock)
4492 dpll |= (1 << (reduced_clock->p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
4493 }
4494 switch (clock->p2) {
4495 case 5:
4496 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
4497 break;
4498 case 7:
4499 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
4500 break;
4501 case 10:
4502 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
4503 break;
4504 case 14:
4505 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
4506 break;
4507 }
4508 if (INTEL_INFO(dev)->gen >= 4)
4509 dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT);
4510
Daniel Vetterf47709a2013-03-28 10:42:02 +01004511 if (is_sdvo && intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_TVOUT))
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004512 dpll |= PLL_REF_INPUT_TVCLKINBC;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004513 else if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_TVOUT))
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004514 /* XXX: just matching BIOS for now */
4515 /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
4516 dpll |= 3;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004517 else if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_LVDS) &&
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004518 intel_panel_use_ssc(dev_priv) && num_connectors < 2)
4519 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
4520 else
4521 dpll |= PLL_REF_INPUT_DREFCLK;
4522
4523 dpll |= DPLL_VCO_ENABLE;
4524 I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE);
4525 POSTING_READ(DPLL(pipe));
4526 udelay(150);
4527
Daniel Vetterf47709a2013-03-28 10:42:02 +01004528 for_each_encoder_on_crtc(dev, &crtc->base, encoder)
Daniel Vetterdafd2262012-11-26 17:22:07 +01004529 if (encoder->pre_pll_enable)
4530 encoder->pre_pll_enable(encoder);
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004531
Daniel Vetterf47709a2013-03-28 10:42:02 +01004532 if (crtc->config.has_dp_encoder)
4533 intel_dp_set_m_n(crtc);
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004534
4535 I915_WRITE(DPLL(pipe), dpll);
4536
4537 /* Wait for the clocks to stabilize. */
4538 POSTING_READ(DPLL(pipe));
4539 udelay(150);
4540
4541 if (INTEL_INFO(dev)->gen >= 4) {
4542 u32 temp = 0;
4543 if (is_sdvo) {
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004544 temp = 0;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004545 if (crtc->config.pixel_multiplier > 1) {
4546 temp = (crtc->config.pixel_multiplier - 1)
Daniel Vetter6cc5f342013-03-27 00:44:53 +01004547 << DPLL_MD_UDI_MULTIPLIER_SHIFT;
4548 }
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004549 }
4550 I915_WRITE(DPLL_MD(pipe), temp);
4551 } else {
4552 /* The pixel multiplier can only be updated once the
4553 * DPLL is enabled and the clocks are stable.
4554 *
4555 * So write it again.
4556 */
4557 I915_WRITE(DPLL(pipe), dpll);
4558 }
4559}
4560
Daniel Vetterf47709a2013-03-28 10:42:02 +01004561static void i8xx_update_pll(struct intel_crtc *crtc,
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004562 struct drm_display_mode *adjusted_mode,
Daniel Vetterf47709a2013-03-28 10:42:02 +01004563 intel_clock_t *reduced_clock,
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004564 int num_connectors)
4565{
Daniel Vetterf47709a2013-03-28 10:42:02 +01004566 struct drm_device *dev = crtc->base.dev;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004567 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterdafd2262012-11-26 17:22:07 +01004568 struct intel_encoder *encoder;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004569 int pipe = crtc->pipe;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004570 u32 dpll;
Daniel Vetterf47709a2013-03-28 10:42:02 +01004571 struct dpll *clock = &crtc->config.dpll;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004572
Daniel Vetterf47709a2013-03-28 10:42:02 +01004573 i9xx_update_pll_dividers(crtc, reduced_clock);
Vijay Purushothaman2a8f64c2012-09-27 19:13:06 +05304574
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004575 dpll = DPLL_VGA_MODE_DIS;
4576
Daniel Vetterf47709a2013-03-28 10:42:02 +01004577 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_LVDS)) {
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004578 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
4579 } else {
4580 if (clock->p1 == 2)
4581 dpll |= PLL_P1_DIVIDE_BY_TWO;
4582 else
4583 dpll |= (clock->p1 - 2) << DPLL_FPA01_P1_POST_DIV_SHIFT;
4584 if (clock->p2 == 4)
4585 dpll |= PLL_P2_DIVIDE_BY_4;
4586 }
4587
Daniel Vetterf47709a2013-03-28 10:42:02 +01004588 if (intel_pipe_has_type(&crtc->base, INTEL_OUTPUT_LVDS) &&
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004589 intel_panel_use_ssc(dev_priv) && num_connectors < 2)
4590 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
4591 else
4592 dpll |= PLL_REF_INPUT_DREFCLK;
4593
4594 dpll |= DPLL_VCO_ENABLE;
4595 I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE);
4596 POSTING_READ(DPLL(pipe));
4597 udelay(150);
4598
Daniel Vetterf47709a2013-03-28 10:42:02 +01004599 for_each_encoder_on_crtc(dev, &crtc->base, encoder)
Daniel Vetterdafd2262012-11-26 17:22:07 +01004600 if (encoder->pre_pll_enable)
4601 encoder->pre_pll_enable(encoder);
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004602
Daniel Vetter5b5896e2012-09-11 12:37:55 +02004603 I915_WRITE(DPLL(pipe), dpll);
4604
4605 /* Wait for the clocks to stabilize. */
4606 POSTING_READ(DPLL(pipe));
4607 udelay(150);
4608
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004609 /* The pixel multiplier can only be updated once the
4610 * DPLL is enabled and the clocks are stable.
4611 *
4612 * So write it again.
4613 */
4614 I915_WRITE(DPLL(pipe), dpll);
4615}
4616
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004617static void intel_set_pipe_timings(struct intel_crtc *intel_crtc,
4618 struct drm_display_mode *mode,
4619 struct drm_display_mode *adjusted_mode)
4620{
4621 struct drm_device *dev = intel_crtc->base.dev;
4622 struct drm_i915_private *dev_priv = dev->dev_private;
4623 enum pipe pipe = intel_crtc->pipe;
Daniel Vetter3b117c82013-04-17 20:15:07 +02004624 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004625 uint32_t vsyncshift;
4626
4627 if (!IS_GEN2(dev) && adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
4628 /* the chip adds 2 halflines automatically */
4629 adjusted_mode->crtc_vtotal -= 1;
4630 adjusted_mode->crtc_vblank_end -= 1;
4631 vsyncshift = adjusted_mode->crtc_hsync_start
4632 - adjusted_mode->crtc_htotal / 2;
4633 } else {
4634 vsyncshift = 0;
4635 }
4636
4637 if (INTEL_INFO(dev)->gen > 3)
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004638 I915_WRITE(VSYNCSHIFT(cpu_transcoder), vsyncshift);
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004639
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004640 I915_WRITE(HTOTAL(cpu_transcoder),
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004641 (adjusted_mode->crtc_hdisplay - 1) |
4642 ((adjusted_mode->crtc_htotal - 1) << 16));
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004643 I915_WRITE(HBLANK(cpu_transcoder),
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004644 (adjusted_mode->crtc_hblank_start - 1) |
4645 ((adjusted_mode->crtc_hblank_end - 1) << 16));
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004646 I915_WRITE(HSYNC(cpu_transcoder),
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004647 (adjusted_mode->crtc_hsync_start - 1) |
4648 ((adjusted_mode->crtc_hsync_end - 1) << 16));
4649
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004650 I915_WRITE(VTOTAL(cpu_transcoder),
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004651 (adjusted_mode->crtc_vdisplay - 1) |
4652 ((adjusted_mode->crtc_vtotal - 1) << 16));
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004653 I915_WRITE(VBLANK(cpu_transcoder),
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004654 (adjusted_mode->crtc_vblank_start - 1) |
4655 ((adjusted_mode->crtc_vblank_end - 1) << 16));
Paulo Zanonife2b8f92012-10-23 18:30:02 -02004656 I915_WRITE(VSYNC(cpu_transcoder),
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004657 (adjusted_mode->crtc_vsync_start - 1) |
4658 ((adjusted_mode->crtc_vsync_end - 1) << 16));
4659
Paulo Zanonib5e508d2012-10-24 11:34:43 -02004660 /* Workaround: when the EDP input selection is B, the VTOTAL_B must be
4661 * programmed with the VTOTAL_EDP value. Same for VTOTAL_C. This is
4662 * documented on the DDI_FUNC_CTL register description, EDP Input Select
4663 * bits. */
4664 if (IS_HASWELL(dev) && cpu_transcoder == TRANSCODER_EDP &&
4665 (pipe == PIPE_B || pipe == PIPE_C))
4666 I915_WRITE(VTOTAL(pipe), I915_READ(VTOTAL(cpu_transcoder)));
4667
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004668 /* pipesrc controls the size that is scaled from, which should
4669 * always be the user's requested size.
4670 */
4671 I915_WRITE(PIPESRC(pipe),
4672 ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
4673}
4674
Daniel Vetter84b046f2013-02-19 18:48:54 +01004675static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
4676{
4677 struct drm_device *dev = intel_crtc->base.dev;
4678 struct drm_i915_private *dev_priv = dev->dev_private;
4679 uint32_t pipeconf;
4680
4681 pipeconf = I915_READ(PIPECONF(intel_crtc->pipe));
4682
4683 if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) {
4684 /* Enable pixel doubling when the dot clock is > 90% of the (display)
4685 * core speed.
4686 *
4687 * XXX: No double-wide on 915GM pipe B. Is that the only reason for the
4688 * pipe == 0 check?
4689 */
4690 if (intel_crtc->config.requested_mode.clock >
4691 dev_priv->display.get_display_clock_speed(dev) * 9 / 10)
4692 pipeconf |= PIPECONF_DOUBLE_WIDE;
4693 else
4694 pipeconf &= ~PIPECONF_DOUBLE_WIDE;
4695 }
4696
4697 /* default to 8bpc */
4698 pipeconf &= ~(PIPECONF_BPC_MASK | PIPECONF_DITHER_EN);
4699 if (intel_crtc->config.has_dp_encoder) {
4700 if (intel_crtc->config.dither) {
4701 pipeconf |= PIPECONF_6BPC |
4702 PIPECONF_DITHER_EN |
4703 PIPECONF_DITHER_TYPE_SP;
4704 }
4705 }
4706
4707 if (IS_VALLEYVIEW(dev) && intel_pipe_has_type(&intel_crtc->base,
4708 INTEL_OUTPUT_EDP)) {
4709 if (intel_crtc->config.dither) {
4710 pipeconf |= PIPECONF_6BPC |
4711 PIPECONF_ENABLE |
4712 I965_PIPECONF_ACTIVE;
4713 }
4714 }
4715
4716 if (HAS_PIPE_CXSR(dev)) {
4717 if (intel_crtc->lowfreq_avail) {
4718 DRM_DEBUG_KMS("enabling CxSR downclocking\n");
4719 pipeconf |= PIPECONF_CXSR_DOWNCLOCK;
4720 } else {
4721 DRM_DEBUG_KMS("disabling CxSR downclocking\n");
4722 pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK;
4723 }
4724 }
4725
4726 pipeconf &= ~PIPECONF_INTERLACE_MASK;
4727 if (!IS_GEN2(dev) &&
4728 intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
4729 pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
4730 else
4731 pipeconf |= PIPECONF_PROGRESSIVE;
4732
Ville Syrjälä9c8e09b2013-04-02 16:10:09 +03004733 if (IS_VALLEYVIEW(dev)) {
4734 if (intel_crtc->config.limited_color_range)
4735 pipeconf |= PIPECONF_COLOR_RANGE_SELECT;
4736 else
4737 pipeconf &= ~PIPECONF_COLOR_RANGE_SELECT;
4738 }
4739
Daniel Vetter84b046f2013-02-19 18:48:54 +01004740 I915_WRITE(PIPECONF(intel_crtc->pipe), pipeconf);
4741 POSTING_READ(PIPECONF(intel_crtc->pipe));
4742}
4743
Eric Anholtf564048e2011-03-30 13:01:02 -07004744static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
Eric Anholtf564048e2011-03-30 13:01:02 -07004745 int x, int y,
Daniel Vetter94352cf2012-07-05 22:51:56 +02004746 struct drm_framebuffer *fb)
Jesse Barnes79e53942008-11-07 14:24:08 -08004747{
4748 struct drm_device *dev = crtc->dev;
4749 struct drm_i915_private *dev_priv = dev->dev_private;
4750 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01004751 struct drm_display_mode *adjusted_mode =
4752 &intel_crtc->config.adjusted_mode;
4753 struct drm_display_mode *mode = &intel_crtc->config.requested_mode;
Jesse Barnes79e53942008-11-07 14:24:08 -08004754 int pipe = intel_crtc->pipe;
Jesse Barnes80824002009-09-10 15:28:06 -07004755 int plane = intel_crtc->plane;
Eric Anholtc751ce42010-03-25 11:48:48 -07004756 int refclk, num_connectors = 0;
Jesse Barnes652c3932009-08-17 13:31:43 -07004757 intel_clock_t clock, reduced_clock;
Daniel Vetter84b046f2013-02-19 18:48:54 +01004758 u32 dspcntr;
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004759 bool ok, has_reduced_clock = false, is_sdvo = false;
Daniel Vetter8b470472013-03-28 10:41:59 +01004760 bool is_lvds = false, is_tv = false;
Chris Wilson5eddb702010-09-11 13:48:45 +01004761 struct intel_encoder *encoder;
Ma Lingd4906092009-03-18 20:13:27 +08004762 const intel_limit_t *limit;
Chris Wilson5c3b82e2009-02-11 13:25:09 +00004763 int ret;
Jesse Barnes79e53942008-11-07 14:24:08 -08004764
Daniel Vetter6c2b7c122012-07-05 09:50:24 +02004765 for_each_encoder_on_crtc(dev, crtc, encoder) {
Chris Wilson5eddb702010-09-11 13:48:45 +01004766 switch (encoder->type) {
Jesse Barnes79e53942008-11-07 14:24:08 -08004767 case INTEL_OUTPUT_LVDS:
4768 is_lvds = true;
4769 break;
4770 case INTEL_OUTPUT_SDVO:
Eric Anholt7d573822009-01-02 13:33:00 -08004771 case INTEL_OUTPUT_HDMI:
Jesse Barnes79e53942008-11-07 14:24:08 -08004772 is_sdvo = true;
Chris Wilson5eddb702010-09-11 13:48:45 +01004773 if (encoder->needs_tv_clock)
Jesse Barnese2f0ba92009-02-02 15:11:52 -08004774 is_tv = true;
Jesse Barnes79e53942008-11-07 14:24:08 -08004775 break;
Jesse Barnes79e53942008-11-07 14:24:08 -08004776 case INTEL_OUTPUT_TVOUT:
4777 is_tv = true;
4778 break;
Jesse Barnes79e53942008-11-07 14:24:08 -08004779 }
Kristian Høgsberg43565a02009-02-13 20:56:52 -05004780
Eric Anholtc751ce42010-03-25 11:48:48 -07004781 num_connectors++;
Jesse Barnes79e53942008-11-07 14:24:08 -08004782 }
4783
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004784 refclk = i9xx_get_refclk(crtc, num_connectors);
Jesse Barnes79e53942008-11-07 14:24:08 -08004785
Ma Lingd4906092009-03-18 20:13:27 +08004786 /*
4787 * Returns a set of divisors for the desired target clock with the given
4788 * refclk, or FALSE. The returned values represent the clock equation:
4789 * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
4790 */
Chris Wilson1b894b52010-12-14 20:04:54 +00004791 limit = intel_limit(crtc, refclk);
Sean Paulcec2f352012-01-10 15:09:36 -08004792 ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, NULL,
4793 &clock);
Jesse Barnes79e53942008-11-07 14:24:08 -08004794 if (!ok) {
4795 DRM_ERROR("Couldn't find PLL settings for mode!\n");
Eric Anholtf564048e2011-03-30 13:01:02 -07004796 return -EINVAL;
4797 }
4798
4799 /* Ensure that the cursor is valid for the new mode before changing... */
4800 intel_crtc_update_cursor(crtc, true);
4801
4802 if (is_lvds && dev_priv->lvds_downclock_avail) {
Sean Paulcec2f352012-01-10 15:09:36 -08004803 /*
4804 * Ensure we match the reduced clock's P to the target clock.
4805 * If the clocks don't match, we can't switch the display clock
4806 * by using the FP0/FP1. In such case we will disable the LVDS
4807 * downclock feature.
4808 */
Eric Anholtf564048e2011-03-30 13:01:02 -07004809 has_reduced_clock = limit->find_pll(limit, crtc,
4810 dev_priv->lvds_downclock,
4811 refclk,
Sean Paulcec2f352012-01-10 15:09:36 -08004812 &clock,
Eric Anholtf564048e2011-03-30 13:01:02 -07004813 &reduced_clock);
Eric Anholtf564048e2011-03-30 13:01:02 -07004814 }
Daniel Vetterf47709a2013-03-28 10:42:02 +01004815 /* Compat-code for transition, will disappear. */
4816 if (!intel_crtc->config.clock_set) {
4817 intel_crtc->config.dpll.n = clock.n;
4818 intel_crtc->config.dpll.m1 = clock.m1;
4819 intel_crtc->config.dpll.m2 = clock.m2;
4820 intel_crtc->config.dpll.p1 = clock.p1;
4821 intel_crtc->config.dpll.p2 = clock.p2;
4822 }
Eric Anholtf564048e2011-03-30 13:01:02 -07004823
Jesse Barnesc65d77d2011-12-15 12:30:36 -08004824 if (is_sdvo && is_tv)
Daniel Vetterf47709a2013-03-28 10:42:02 +01004825 i9xx_adjust_sdvo_tv_clock(intel_crtc);
Eric Anholtf564048e2011-03-30 13:01:02 -07004826
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004827 if (IS_GEN2(dev))
Daniel Vetterf47709a2013-03-28 10:42:02 +01004828 i8xx_update_pll(intel_crtc, adjusted_mode,
Vijay Purushothaman2a8f64c2012-09-27 19:13:06 +05304829 has_reduced_clock ? &reduced_clock : NULL,
4830 num_connectors);
Jesse Barnesa0c4da22012-06-15 11:55:13 -07004831 else if (IS_VALLEYVIEW(dev))
Daniel Vetterf47709a2013-03-28 10:42:02 +01004832 vlv_update_pll(intel_crtc);
Eric Anholtf564048e2011-03-30 13:01:02 -07004833 else
Daniel Vetterf47709a2013-03-28 10:42:02 +01004834 i9xx_update_pll(intel_crtc,
Daniel Vettereb1cbe42012-03-28 23:12:16 +02004835 has_reduced_clock ? &reduced_clock : NULL,
Jesse Barnes89b667f2013-04-18 14:51:36 -07004836 num_connectors);
Eric Anholtf564048e2011-03-30 13:01:02 -07004837
Eric Anholtf564048e2011-03-30 13:01:02 -07004838 /* Set up the display plane register */
4839 dspcntr = DISPPLANE_GAMMA_ENABLE;
4840
Jesse Barnesda6ecc52013-03-08 10:46:00 -08004841 if (!IS_VALLEYVIEW(dev)) {
4842 if (pipe == 0)
4843 dspcntr &= ~DISPPLANE_SEL_PIPE_MASK;
4844 else
4845 dspcntr |= DISPPLANE_SEL_PIPE_B;
4846 }
Eric Anholtf564048e2011-03-30 13:01:02 -07004847
Ville Syrjälä2582a852013-04-17 17:48:47 +03004848 DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe_name(pipe));
Eric Anholtf564048e2011-03-30 13:01:02 -07004849 drm_mode_debug_printmodeline(mode);
4850
Paulo Zanonib0e77b92012-10-01 18:10:53 -03004851 intel_set_pipe_timings(intel_crtc, mode, adjusted_mode);
Eric Anholtf564048e2011-03-30 13:01:02 -07004852
4853 /* pipesrc and dspsize control the size that is scaled from,
4854 * which should always be the user's requested size.
4855 */
Eric Anholt929c77f2011-03-30 13:01:04 -07004856 I915_WRITE(DSPSIZE(plane),
4857 ((mode->vdisplay - 1) << 16) |
4858 (mode->hdisplay - 1));
4859 I915_WRITE(DSPPOS(plane), 0);
Eric Anholtf564048e2011-03-30 13:01:02 -07004860
Daniel Vetter84b046f2013-02-19 18:48:54 +01004861 i9xx_set_pipeconf(intel_crtc);
4862
Eric Anholtf564048e2011-03-30 13:01:02 -07004863 I915_WRITE(DSPCNTR(plane), dspcntr);
4864 POSTING_READ(DSPCNTR(plane));
4865
Daniel Vetter94352cf2012-07-05 22:51:56 +02004866 ret = intel_pipe_set_base(crtc, x, y, fb);
Eric Anholtf564048e2011-03-30 13:01:02 -07004867
4868 intel_update_watermarks(dev);
4869
Eric Anholtf564048e2011-03-30 13:01:02 -07004870 return ret;
4871}
4872
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01004873static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
4874 struct intel_crtc_config *pipe_config)
4875{
4876 struct drm_device *dev = crtc->base.dev;
4877 struct drm_i915_private *dev_priv = dev->dev_private;
4878 uint32_t tmp;
4879
4880 tmp = I915_READ(PIPECONF(crtc->pipe));
4881 if (!(tmp & PIPECONF_ENABLE))
4882 return false;
4883
4884 return true;
4885}
4886
Paulo Zanonidde86e22012-12-01 12:04:25 -02004887static void ironlake_init_pch_refclk(struct drm_device *dev)
Jesse Barnes13d83a62011-08-03 12:59:20 -07004888{
4889 struct drm_i915_private *dev_priv = dev->dev_private;
4890 struct drm_mode_config *mode_config = &dev->mode_config;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004891 struct intel_encoder *encoder;
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004892 u32 val, final;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004893 bool has_lvds = false;
Keith Packard199e5d72011-09-22 12:01:57 -07004894 bool has_cpu_edp = false;
4895 bool has_pch_edp = false;
4896 bool has_panel = false;
Keith Packard99eb6a02011-09-26 14:29:12 -07004897 bool has_ck505 = false;
4898 bool can_ssc = false;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004899
4900 /* We need to take the global config into account */
Keith Packard199e5d72011-09-22 12:01:57 -07004901 list_for_each_entry(encoder, &mode_config->encoder_list,
4902 base.head) {
4903 switch (encoder->type) {
4904 case INTEL_OUTPUT_LVDS:
4905 has_panel = true;
4906 has_lvds = true;
4907 break;
4908 case INTEL_OUTPUT_EDP:
4909 has_panel = true;
4910 if (intel_encoder_is_pch_edp(&encoder->base))
4911 has_pch_edp = true;
4912 else
4913 has_cpu_edp = true;
4914 break;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004915 }
4916 }
4917
Keith Packard99eb6a02011-09-26 14:29:12 -07004918 if (HAS_PCH_IBX(dev)) {
4919 has_ck505 = dev_priv->display_clock_mode;
4920 can_ssc = has_ck505;
4921 } else {
4922 has_ck505 = false;
4923 can_ssc = true;
4924 }
4925
4926 DRM_DEBUG_KMS("has_panel %d has_lvds %d has_pch_edp %d has_cpu_edp %d has_ck505 %d\n",
4927 has_panel, has_lvds, has_pch_edp, has_cpu_edp,
4928 has_ck505);
Jesse Barnes13d83a62011-08-03 12:59:20 -07004929
4930 /* Ironlake: try to setup display ref clock before DPLL
4931 * enabling. This is only under driver's control after
4932 * PCH B stepping, previous chipset stepping should be
4933 * ignoring this setting.
4934 */
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004935 val = I915_READ(PCH_DREF_CONTROL);
Jesse Barnes13d83a62011-08-03 12:59:20 -07004936
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004937 /* As we must carefully and slowly disable/enable each source in turn,
4938 * compute the final state we want first and check if we need to
4939 * make any changes at all.
4940 */
4941 final = val;
4942 final &= ~DREF_NONSPREAD_SOURCE_MASK;
Keith Packard99eb6a02011-09-26 14:29:12 -07004943 if (has_ck505)
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004944 final |= DREF_NONSPREAD_CK505_ENABLE;
Keith Packard99eb6a02011-09-26 14:29:12 -07004945 else
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004946 final |= DREF_NONSPREAD_SOURCE_ENABLE;
4947
4948 final &= ~DREF_SSC_SOURCE_MASK;
4949 final &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
4950 final &= ~DREF_SSC1_ENABLE;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004951
Keith Packard199e5d72011-09-22 12:01:57 -07004952 if (has_panel) {
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004953 final |= DREF_SSC_SOURCE_ENABLE;
4954
4955 if (intel_panel_use_ssc(dev_priv) && can_ssc)
4956 final |= DREF_SSC1_ENABLE;
4957
4958 if (has_cpu_edp) {
4959 if (intel_panel_use_ssc(dev_priv) && can_ssc)
4960 final |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
4961 else
4962 final |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
4963 } else
4964 final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
4965 } else {
4966 final |= DREF_SSC_SOURCE_DISABLE;
4967 final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
4968 }
4969
4970 if (final == val)
4971 return;
4972
4973 /* Always enable nonspread source */
4974 val &= ~DREF_NONSPREAD_SOURCE_MASK;
4975
4976 if (has_ck505)
4977 val |= DREF_NONSPREAD_CK505_ENABLE;
4978 else
4979 val |= DREF_NONSPREAD_SOURCE_ENABLE;
4980
4981 if (has_panel) {
4982 val &= ~DREF_SSC_SOURCE_MASK;
4983 val |= DREF_SSC_SOURCE_ENABLE;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004984
Keith Packard199e5d72011-09-22 12:01:57 -07004985 /* SSC must be turned on before enabling the CPU output */
Keith Packard99eb6a02011-09-26 14:29:12 -07004986 if (intel_panel_use_ssc(dev_priv) && can_ssc) {
Keith Packard199e5d72011-09-22 12:01:57 -07004987 DRM_DEBUG_KMS("Using SSC on panel\n");
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004988 val |= DREF_SSC1_ENABLE;
Daniel Vettere77166b2012-03-30 22:14:05 +02004989 } else
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004990 val &= ~DREF_SSC1_ENABLE;
Keith Packard199e5d72011-09-22 12:01:57 -07004991
4992 /* Get SSC going before enabling the outputs */
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004993 I915_WRITE(PCH_DREF_CONTROL, val);
Keith Packard199e5d72011-09-22 12:01:57 -07004994 POSTING_READ(PCH_DREF_CONTROL);
4995 udelay(200);
4996
Chris Wilson74cfd7a2013-03-26 16:33:04 -07004997 val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
Jesse Barnes13d83a62011-08-03 12:59:20 -07004998
4999 /* Enable CPU source on CPU attached eDP */
Keith Packard199e5d72011-09-22 12:01:57 -07005000 if (has_cpu_edp) {
Keith Packard99eb6a02011-09-26 14:29:12 -07005001 if (intel_panel_use_ssc(dev_priv) && can_ssc) {
Keith Packard199e5d72011-09-22 12:01:57 -07005002 DRM_DEBUG_KMS("Using SSC on eDP\n");
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005003 val |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
Keith Packard199e5d72011-09-22 12:01:57 -07005004 }
Jesse Barnes13d83a62011-08-03 12:59:20 -07005005 else
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005006 val |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
Keith Packard199e5d72011-09-22 12:01:57 -07005007 } else
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005008 val |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
Keith Packard199e5d72011-09-22 12:01:57 -07005009
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005010 I915_WRITE(PCH_DREF_CONTROL, val);
Keith Packard199e5d72011-09-22 12:01:57 -07005011 POSTING_READ(PCH_DREF_CONTROL);
5012 udelay(200);
5013 } else {
5014 DRM_DEBUG_KMS("Disabling SSC entirely\n");
5015
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005016 val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
Keith Packard199e5d72011-09-22 12:01:57 -07005017
5018 /* Turn off CPU output */
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005019 val |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
Keith Packard199e5d72011-09-22 12:01:57 -07005020
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005021 I915_WRITE(PCH_DREF_CONTROL, val);
Keith Packard199e5d72011-09-22 12:01:57 -07005022 POSTING_READ(PCH_DREF_CONTROL);
5023 udelay(200);
5024
5025 /* Turn off the SSC source */
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005026 val &= ~DREF_SSC_SOURCE_MASK;
5027 val |= DREF_SSC_SOURCE_DISABLE;
Keith Packard199e5d72011-09-22 12:01:57 -07005028
5029 /* Turn off SSC1 */
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005030 val &= ~DREF_SSC1_ENABLE;
Keith Packard199e5d72011-09-22 12:01:57 -07005031
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005032 I915_WRITE(PCH_DREF_CONTROL, val);
Jesse Barnes13d83a62011-08-03 12:59:20 -07005033 POSTING_READ(PCH_DREF_CONTROL);
5034 udelay(200);
5035 }
Chris Wilson74cfd7a2013-03-26 16:33:04 -07005036
5037 BUG_ON(val != final);
Jesse Barnes13d83a62011-08-03 12:59:20 -07005038}
5039
Paulo Zanonidde86e22012-12-01 12:04:25 -02005040/* Sequence to enable CLKOUT_DP for FDI usage and configure PCH FDI I/O. */
5041static void lpt_init_pch_refclk(struct drm_device *dev)
5042{
5043 struct drm_i915_private *dev_priv = dev->dev_private;
5044 struct drm_mode_config *mode_config = &dev->mode_config;
5045 struct intel_encoder *encoder;
5046 bool has_vga = false;
5047 bool is_sdv = false;
5048 u32 tmp;
5049
5050 list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
5051 switch (encoder->type) {
5052 case INTEL_OUTPUT_ANALOG:
5053 has_vga = true;
5054 break;
5055 }
5056 }
5057
5058 if (!has_vga)
5059 return;
5060
Daniel Vetterc00db242013-01-22 15:33:27 +01005061 mutex_lock(&dev_priv->dpio_lock);
5062
Paulo Zanonidde86e22012-12-01 12:04:25 -02005063 /* XXX: Rip out SDV support once Haswell ships for real. */
5064 if (IS_HASWELL(dev) && (dev->pci_device & 0xFF00) == 0x0C00)
5065 is_sdv = true;
5066
5067 tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
5068 tmp &= ~SBI_SSCCTL_DISABLE;
5069 tmp |= SBI_SSCCTL_PATHALT;
5070 intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
5071
5072 udelay(24);
5073
5074 tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK);
5075 tmp &= ~SBI_SSCCTL_PATHALT;
5076 intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK);
5077
5078 if (!is_sdv) {
5079 tmp = I915_READ(SOUTH_CHICKEN2);
5080 tmp |= FDI_MPHY_IOSFSB_RESET_CTL;
5081 I915_WRITE(SOUTH_CHICKEN2, tmp);
5082
5083 if (wait_for_atomic_us(I915_READ(SOUTH_CHICKEN2) &
5084 FDI_MPHY_IOSFSB_RESET_STATUS, 100))
5085 DRM_ERROR("FDI mPHY reset assert timeout\n");
5086
5087 tmp = I915_READ(SOUTH_CHICKEN2);
5088 tmp &= ~FDI_MPHY_IOSFSB_RESET_CTL;
5089 I915_WRITE(SOUTH_CHICKEN2, tmp);
5090
5091 if (wait_for_atomic_us((I915_READ(SOUTH_CHICKEN2) &
5092 FDI_MPHY_IOSFSB_RESET_STATUS) == 0,
5093 100))
5094 DRM_ERROR("FDI mPHY reset de-assert timeout\n");
5095 }
5096
5097 tmp = intel_sbi_read(dev_priv, 0x8008, SBI_MPHY);
5098 tmp &= ~(0xFF << 24);
5099 tmp |= (0x12 << 24);
5100 intel_sbi_write(dev_priv, 0x8008, tmp, SBI_MPHY);
5101
Paulo Zanonidde86e22012-12-01 12:04:25 -02005102 if (is_sdv) {
5103 tmp = intel_sbi_read(dev_priv, 0x800C, SBI_MPHY);
5104 tmp |= 0x7FFF;
5105 intel_sbi_write(dev_priv, 0x800C, tmp, SBI_MPHY);
5106 }
5107
5108 tmp = intel_sbi_read(dev_priv, 0x2008, SBI_MPHY);
5109 tmp |= (1 << 11);
5110 intel_sbi_write(dev_priv, 0x2008, tmp, SBI_MPHY);
5111
5112 tmp = intel_sbi_read(dev_priv, 0x2108, SBI_MPHY);
5113 tmp |= (1 << 11);
5114 intel_sbi_write(dev_priv, 0x2108, tmp, SBI_MPHY);
5115
5116 if (is_sdv) {
5117 tmp = intel_sbi_read(dev_priv, 0x2038, SBI_MPHY);
5118 tmp |= (0x3F << 24) | (0xF << 20) | (0xF << 16);
5119 intel_sbi_write(dev_priv, 0x2038, tmp, SBI_MPHY);
5120
5121 tmp = intel_sbi_read(dev_priv, 0x2138, SBI_MPHY);
5122 tmp |= (0x3F << 24) | (0xF << 20) | (0xF << 16);
5123 intel_sbi_write(dev_priv, 0x2138, tmp, SBI_MPHY);
5124
5125 tmp = intel_sbi_read(dev_priv, 0x203C, SBI_MPHY);
5126 tmp |= (0x3F << 8);
5127 intel_sbi_write(dev_priv, 0x203C, tmp, SBI_MPHY);
5128
5129 tmp = intel_sbi_read(dev_priv, 0x213C, SBI_MPHY);
5130 tmp |= (0x3F << 8);
5131 intel_sbi_write(dev_priv, 0x213C, tmp, SBI_MPHY);
5132 }
5133
5134 tmp = intel_sbi_read(dev_priv, 0x206C, SBI_MPHY);
5135 tmp |= (1 << 24) | (1 << 21) | (1 << 18);
5136 intel_sbi_write(dev_priv, 0x206C, tmp, SBI_MPHY);
5137
5138 tmp = intel_sbi_read(dev_priv, 0x216C, SBI_MPHY);
5139 tmp |= (1 << 24) | (1 << 21) | (1 << 18);
5140 intel_sbi_write(dev_priv, 0x216C, tmp, SBI_MPHY);
5141
5142 if (!is_sdv) {
5143 tmp = intel_sbi_read(dev_priv, 0x2080, SBI_MPHY);
5144 tmp &= ~(7 << 13);
5145 tmp |= (5 << 13);
5146 intel_sbi_write(dev_priv, 0x2080, tmp, SBI_MPHY);
5147
5148 tmp = intel_sbi_read(dev_priv, 0x2180, SBI_MPHY);
5149 tmp &= ~(7 << 13);
5150 tmp |= (5 << 13);
5151 intel_sbi_write(dev_priv, 0x2180, tmp, SBI_MPHY);
5152 }
5153
5154 tmp = intel_sbi_read(dev_priv, 0x208C, SBI_MPHY);
5155 tmp &= ~0xFF;
5156 tmp |= 0x1C;
5157 intel_sbi_write(dev_priv, 0x208C, tmp, SBI_MPHY);
5158
5159 tmp = intel_sbi_read(dev_priv, 0x218C, SBI_MPHY);
5160 tmp &= ~0xFF;
5161 tmp |= 0x1C;
5162 intel_sbi_write(dev_priv, 0x218C, tmp, SBI_MPHY);
5163
5164 tmp = intel_sbi_read(dev_priv, 0x2098, SBI_MPHY);
5165 tmp &= ~(0xFF << 16);
5166 tmp |= (0x1C << 16);
5167 intel_sbi_write(dev_priv, 0x2098, tmp, SBI_MPHY);
5168
5169 tmp = intel_sbi_read(dev_priv, 0x2198, SBI_MPHY);
5170 tmp &= ~(0xFF << 16);
5171 tmp |= (0x1C << 16);
5172 intel_sbi_write(dev_priv, 0x2198, tmp, SBI_MPHY);
5173
5174 if (!is_sdv) {
5175 tmp = intel_sbi_read(dev_priv, 0x20C4, SBI_MPHY);
5176 tmp |= (1 << 27);
5177 intel_sbi_write(dev_priv, 0x20C4, tmp, SBI_MPHY);
5178
5179 tmp = intel_sbi_read(dev_priv, 0x21C4, SBI_MPHY);
5180 tmp |= (1 << 27);
5181 intel_sbi_write(dev_priv, 0x21C4, tmp, SBI_MPHY);
5182
5183 tmp = intel_sbi_read(dev_priv, 0x20EC, SBI_MPHY);
5184 tmp &= ~(0xF << 28);
5185 tmp |= (4 << 28);
5186 intel_sbi_write(dev_priv, 0x20EC, tmp, SBI_MPHY);
5187
5188 tmp = intel_sbi_read(dev_priv, 0x21EC, SBI_MPHY);
5189 tmp &= ~(0xF << 28);
5190 tmp |= (4 << 28);
5191 intel_sbi_write(dev_priv, 0x21EC, tmp, SBI_MPHY);
5192 }
5193
5194 /* ULT uses SBI_GEN0, but ULT doesn't have VGA, so we don't care. */
5195 tmp = intel_sbi_read(dev_priv, SBI_DBUFF0, SBI_ICLK);
5196 tmp |= SBI_DBUFF0_ENABLE;
5197 intel_sbi_write(dev_priv, SBI_DBUFF0, tmp, SBI_ICLK);
Daniel Vetterc00db242013-01-22 15:33:27 +01005198
5199 mutex_unlock(&dev_priv->dpio_lock);
Paulo Zanonidde86e22012-12-01 12:04:25 -02005200}
5201
5202/*
5203 * Initialize reference clocks when the driver loads
5204 */
5205void intel_init_pch_refclk(struct drm_device *dev)
5206{
5207 if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
5208 ironlake_init_pch_refclk(dev);
5209 else if (HAS_PCH_LPT(dev))
5210 lpt_init_pch_refclk(dev);
5211}
5212
Jesse Barnesd9d444c2011-09-02 13:03:05 -07005213static int ironlake_get_refclk(struct drm_crtc *crtc)
5214{
5215 struct drm_device *dev = crtc->dev;
5216 struct drm_i915_private *dev_priv = dev->dev_private;
5217 struct intel_encoder *encoder;
Jesse Barnesd9d444c2011-09-02 13:03:05 -07005218 struct intel_encoder *edp_encoder = NULL;
5219 int num_connectors = 0;
5220 bool is_lvds = false;
5221
Daniel Vetter6c2b7c122012-07-05 09:50:24 +02005222 for_each_encoder_on_crtc(dev, crtc, encoder) {
Jesse Barnesd9d444c2011-09-02 13:03:05 -07005223 switch (encoder->type) {
5224 case INTEL_OUTPUT_LVDS:
5225 is_lvds = true;
5226 break;
5227 case INTEL_OUTPUT_EDP:
5228 edp_encoder = encoder;
5229 break;
5230 }
5231 num_connectors++;
5232 }
5233
5234 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
5235 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
5236 dev_priv->lvds_ssc_freq);
5237 return dev_priv->lvds_ssc_freq * 1000;
5238 }
5239
5240 return 120000;
5241}
5242
Paulo Zanonic8203562012-09-12 10:06:29 -03005243static void ironlake_set_pipeconf(struct drm_crtc *crtc,
5244 struct drm_display_mode *adjusted_mode,
5245 bool dither)
5246{
5247 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
5248 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5249 int pipe = intel_crtc->pipe;
5250 uint32_t val;
5251
5252 val = I915_READ(PIPECONF(pipe));
5253
Daniel Vetterdfd07d72012-12-17 11:21:38 +01005254 val &= ~PIPECONF_BPC_MASK;
Daniel Vetter965e0c42013-03-27 00:44:57 +01005255 switch (intel_crtc->config.pipe_bpp) {
Paulo Zanonic8203562012-09-12 10:06:29 -03005256 case 18:
Daniel Vetterdfd07d72012-12-17 11:21:38 +01005257 val |= PIPECONF_6BPC;
Paulo Zanonic8203562012-09-12 10:06:29 -03005258 break;
5259 case 24:
Daniel Vetterdfd07d72012-12-17 11:21:38 +01005260 val |= PIPECONF_8BPC;
Paulo Zanonic8203562012-09-12 10:06:29 -03005261 break;
5262 case 30:
Daniel Vetterdfd07d72012-12-17 11:21:38 +01005263 val |= PIPECONF_10BPC;
Paulo Zanonic8203562012-09-12 10:06:29 -03005264 break;
5265 case 36:
Daniel Vetterdfd07d72012-12-17 11:21:38 +01005266 val |= PIPECONF_12BPC;
Paulo Zanonic8203562012-09-12 10:06:29 -03005267 break;
5268 default:
Paulo Zanonicc769b62012-09-20 18:36:03 -03005269 /* Case prevented by intel_choose_pipe_bpp_dither. */
5270 BUG();
Paulo Zanonic8203562012-09-12 10:06:29 -03005271 }
5272
5273 val &= ~(PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_MASK);
5274 if (dither)
5275 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
5276
5277 val &= ~PIPECONF_INTERLACE_MASK;
5278 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
5279 val |= PIPECONF_INTERLACED_ILK;
5280 else
5281 val |= PIPECONF_PROGRESSIVE;
5282
Daniel Vetter50f3b012013-03-27 00:44:56 +01005283 if (intel_crtc->config.limited_color_range)
Ville Syrjälä3685a8f2013-01-17 16:31:28 +02005284 val |= PIPECONF_COLOR_RANGE_SELECT;
5285 else
5286 val &= ~PIPECONF_COLOR_RANGE_SELECT;
5287
Paulo Zanonic8203562012-09-12 10:06:29 -03005288 I915_WRITE(PIPECONF(pipe), val);
5289 POSTING_READ(PIPECONF(pipe));
5290}
5291
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005292/*
5293 * Set up the pipe CSC unit.
5294 *
5295 * Currently only full range RGB to limited range RGB conversion
5296 * is supported, but eventually this should handle various
5297 * RGB<->YCbCr scenarios as well.
5298 */
Daniel Vetter50f3b012013-03-27 00:44:56 +01005299static void intel_set_pipe_csc(struct drm_crtc *crtc)
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005300{
5301 struct drm_device *dev = crtc->dev;
5302 struct drm_i915_private *dev_priv = dev->dev_private;
5303 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5304 int pipe = intel_crtc->pipe;
5305 uint16_t coeff = 0x7800; /* 1.0 */
5306
5307 /*
5308 * TODO: Check what kind of values actually come out of the pipe
5309 * with these coeff/postoff values and adjust to get the best
5310 * accuracy. Perhaps we even need to take the bpc value into
5311 * consideration.
5312 */
5313
Daniel Vetter50f3b012013-03-27 00:44:56 +01005314 if (intel_crtc->config.limited_color_range)
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005315 coeff = ((235 - 16) * (1 << 12) / 255) & 0xff8; /* 0.xxx... */
5316
5317 /*
5318 * GY/GU and RY/RU should be the other way around according
5319 * to BSpec, but reality doesn't agree. Just set them up in
5320 * a way that results in the correct picture.
5321 */
5322 I915_WRITE(PIPE_CSC_COEFF_RY_GY(pipe), coeff << 16);
5323 I915_WRITE(PIPE_CSC_COEFF_BY(pipe), 0);
5324
5325 I915_WRITE(PIPE_CSC_COEFF_RU_GU(pipe), coeff);
5326 I915_WRITE(PIPE_CSC_COEFF_BU(pipe), 0);
5327
5328 I915_WRITE(PIPE_CSC_COEFF_RV_GV(pipe), 0);
5329 I915_WRITE(PIPE_CSC_COEFF_BV(pipe), coeff << 16);
5330
5331 I915_WRITE(PIPE_CSC_PREOFF_HI(pipe), 0);
5332 I915_WRITE(PIPE_CSC_PREOFF_ME(pipe), 0);
5333 I915_WRITE(PIPE_CSC_PREOFF_LO(pipe), 0);
5334
5335 if (INTEL_INFO(dev)->gen > 6) {
5336 uint16_t postoff = 0;
5337
Daniel Vetter50f3b012013-03-27 00:44:56 +01005338 if (intel_crtc->config.limited_color_range)
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005339 postoff = (16 * (1 << 13) / 255) & 0x1fff;
5340
5341 I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff);
5342 I915_WRITE(PIPE_CSC_POSTOFF_ME(pipe), postoff);
5343 I915_WRITE(PIPE_CSC_POSTOFF_LO(pipe), postoff);
5344
5345 I915_WRITE(PIPE_CSC_MODE(pipe), 0);
5346 } else {
5347 uint32_t mode = CSC_MODE_YUV_TO_RGB;
5348
Daniel Vetter50f3b012013-03-27 00:44:56 +01005349 if (intel_crtc->config.limited_color_range)
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005350 mode |= CSC_BLACK_SCREEN_OFFSET;
5351
5352 I915_WRITE(PIPE_CSC_MODE(pipe), mode);
5353 }
5354}
5355
Paulo Zanoniee2b0b32012-10-05 12:05:57 -03005356static void haswell_set_pipeconf(struct drm_crtc *crtc,
5357 struct drm_display_mode *adjusted_mode,
5358 bool dither)
5359{
5360 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
5361 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter3b117c82013-04-17 20:15:07 +02005362 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
Paulo Zanoniee2b0b32012-10-05 12:05:57 -03005363 uint32_t val;
5364
Paulo Zanoni702e7a52012-10-23 18:29:59 -02005365 val = I915_READ(PIPECONF(cpu_transcoder));
Paulo Zanoniee2b0b32012-10-05 12:05:57 -03005366
5367 val &= ~(PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_MASK);
5368 if (dither)
5369 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
5370
5371 val &= ~PIPECONF_INTERLACE_MASK_HSW;
5372 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
5373 val |= PIPECONF_INTERLACED_ILK;
5374 else
5375 val |= PIPECONF_PROGRESSIVE;
5376
Paulo Zanoni702e7a52012-10-23 18:29:59 -02005377 I915_WRITE(PIPECONF(cpu_transcoder), val);
5378 POSTING_READ(PIPECONF(cpu_transcoder));
Paulo Zanoniee2b0b32012-10-05 12:05:57 -03005379}
5380
Paulo Zanoni6591c6e2012-09-12 10:06:34 -03005381static bool ironlake_compute_clocks(struct drm_crtc *crtc,
5382 struct drm_display_mode *adjusted_mode,
5383 intel_clock_t *clock,
5384 bool *has_reduced_clock,
5385 intel_clock_t *reduced_clock)
5386{
5387 struct drm_device *dev = crtc->dev;
5388 struct drm_i915_private *dev_priv = dev->dev_private;
5389 struct intel_encoder *intel_encoder;
5390 int refclk;
5391 const intel_limit_t *limit;
5392 bool ret, is_sdvo = false, is_tv = false, is_lvds = false;
5393
5394 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
5395 switch (intel_encoder->type) {
5396 case INTEL_OUTPUT_LVDS:
5397 is_lvds = true;
5398 break;
5399 case INTEL_OUTPUT_SDVO:
5400 case INTEL_OUTPUT_HDMI:
5401 is_sdvo = true;
5402 if (intel_encoder->needs_tv_clock)
5403 is_tv = true;
5404 break;
5405 case INTEL_OUTPUT_TVOUT:
5406 is_tv = true;
5407 break;
5408 }
5409 }
5410
5411 refclk = ironlake_get_refclk(crtc);
5412
5413 /*
5414 * Returns a set of divisors for the desired target clock with the given
5415 * refclk, or FALSE. The returned values represent the clock equation:
5416 * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
5417 */
5418 limit = intel_limit(crtc, refclk);
5419 ret = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, NULL,
5420 clock);
5421 if (!ret)
5422 return false;
5423
5424 if (is_lvds && dev_priv->lvds_downclock_avail) {
5425 /*
5426 * Ensure we match the reduced clock's P to the target clock.
5427 * If the clocks don't match, we can't switch the display clock
5428 * by using the FP0/FP1. In such case we will disable the LVDS
5429 * downclock feature.
5430 */
5431 *has_reduced_clock = limit->find_pll(limit, crtc,
5432 dev_priv->lvds_downclock,
5433 refclk,
5434 clock,
5435 reduced_clock);
5436 }
5437
5438 if (is_sdvo && is_tv)
Daniel Vetterf47709a2013-03-28 10:42:02 +01005439 i9xx_adjust_sdvo_tv_clock(to_intel_crtc(crtc));
Paulo Zanoni6591c6e2012-09-12 10:06:34 -03005440
5441 return true;
5442}
5443
Daniel Vetter01a415f2012-10-27 15:58:40 +02005444static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev)
5445{
5446 struct drm_i915_private *dev_priv = dev->dev_private;
5447 uint32_t temp;
5448
5449 temp = I915_READ(SOUTH_CHICKEN1);
5450 if (temp & FDI_BC_BIFURCATION_SELECT)
5451 return;
5452
5453 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
5454 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
5455
5456 temp |= FDI_BC_BIFURCATION_SELECT;
5457 DRM_DEBUG_KMS("enabling fdi C rx\n");
5458 I915_WRITE(SOUTH_CHICKEN1, temp);
5459 POSTING_READ(SOUTH_CHICKEN1);
5460}
5461
5462static bool ironlake_check_fdi_lanes(struct intel_crtc *intel_crtc)
5463{
5464 struct drm_device *dev = intel_crtc->base.dev;
5465 struct drm_i915_private *dev_priv = dev->dev_private;
5466 struct intel_crtc *pipe_B_crtc =
5467 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_B]);
5468
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005469 DRM_DEBUG_KMS("checking fdi config on pipe %c, lanes %i\n",
5470 pipe_name(intel_crtc->pipe), intel_crtc->fdi_lanes);
Daniel Vetter01a415f2012-10-27 15:58:40 +02005471 if (intel_crtc->fdi_lanes > 4) {
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005472 DRM_DEBUG_KMS("invalid fdi lane config on pipe %c: %i lanes\n",
5473 pipe_name(intel_crtc->pipe), intel_crtc->fdi_lanes);
Daniel Vetter01a415f2012-10-27 15:58:40 +02005474 /* Clamp lanes to avoid programming the hw with bogus values. */
5475 intel_crtc->fdi_lanes = 4;
5476
5477 return false;
5478 }
5479
Ben Widawsky7eb552a2013-03-13 14:05:41 -07005480 if (INTEL_INFO(dev)->num_pipes == 2)
Daniel Vetter01a415f2012-10-27 15:58:40 +02005481 return true;
5482
5483 switch (intel_crtc->pipe) {
5484 case PIPE_A:
5485 return true;
5486 case PIPE_B:
5487 if (dev_priv->pipe_to_crtc_mapping[PIPE_C]->enabled &&
5488 intel_crtc->fdi_lanes > 2) {
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005489 DRM_DEBUG_KMS("invalid shared fdi lane config on pipe %c: %i lanes\n",
5490 pipe_name(intel_crtc->pipe), intel_crtc->fdi_lanes);
Daniel Vetter01a415f2012-10-27 15:58:40 +02005491 /* Clamp lanes to avoid programming the hw with bogus values. */
5492 intel_crtc->fdi_lanes = 2;
5493
5494 return false;
5495 }
5496
5497 if (intel_crtc->fdi_lanes > 2)
5498 WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT);
5499 else
5500 cpt_enable_fdi_bc_bifurcation(dev);
5501
5502 return true;
5503 case PIPE_C:
5504 if (!pipe_B_crtc->base.enabled || pipe_B_crtc->fdi_lanes <= 2) {
5505 if (intel_crtc->fdi_lanes > 2) {
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005506 DRM_DEBUG_KMS("invalid shared fdi lane config on pipe %c: %i lanes\n",
5507 pipe_name(intel_crtc->pipe), intel_crtc->fdi_lanes);
Daniel Vetter01a415f2012-10-27 15:58:40 +02005508 /* Clamp lanes to avoid programming the hw with bogus values. */
5509 intel_crtc->fdi_lanes = 2;
5510
5511 return false;
5512 }
5513 } else {
5514 DRM_DEBUG_KMS("fdi link B uses too many lanes to enable link C\n");
5515 return false;
5516 }
5517
5518 cpt_enable_fdi_bc_bifurcation(dev);
5519
5520 return true;
5521 default:
5522 BUG();
5523 }
5524}
5525
Paulo Zanonid4b19312012-11-29 11:29:32 -02005526int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp)
5527{
5528 /*
5529 * Account for spread spectrum to avoid
5530 * oversubscribing the link. Max center spread
5531 * is 2.5%; use 5% for safety's sake.
5532 */
5533 u32 bps = target_clock * bpp * 21 / 20;
5534 return bps / (link_bw * 8) + 1;
5535}
5536
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005537void intel_pch_transcoder_set_m_n(struct intel_crtc *crtc,
5538 struct intel_link_m_n *m_n)
5539{
5540 struct drm_device *dev = crtc->base.dev;
5541 struct drm_i915_private *dev_priv = dev->dev_private;
5542 int pipe = crtc->pipe;
5543
5544 I915_WRITE(TRANSDATA_M1(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
5545 I915_WRITE(TRANSDATA_N1(pipe), m_n->gmch_n);
5546 I915_WRITE(TRANSDPLINK_M1(pipe), m_n->link_m);
5547 I915_WRITE(TRANSDPLINK_N1(pipe), m_n->link_n);
5548}
5549
5550void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
5551 struct intel_link_m_n *m_n)
5552{
5553 struct drm_device *dev = crtc->base.dev;
5554 struct drm_i915_private *dev_priv = dev->dev_private;
5555 int pipe = crtc->pipe;
Daniel Vetter3b117c82013-04-17 20:15:07 +02005556 enum transcoder transcoder = crtc->config.cpu_transcoder;
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005557
5558 if (INTEL_INFO(dev)->gen >= 5) {
5559 I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m);
5560 I915_WRITE(PIPE_DATA_N1(transcoder), m_n->gmch_n);
5561 I915_WRITE(PIPE_LINK_M1(transcoder), m_n->link_m);
5562 I915_WRITE(PIPE_LINK_N1(transcoder), m_n->link_n);
5563 } else {
5564 I915_WRITE(PIPE_GMCH_DATA_M(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
5565 I915_WRITE(PIPE_GMCH_DATA_N(pipe), m_n->gmch_n);
5566 I915_WRITE(PIPE_DP_LINK_M(pipe), m_n->link_m);
5567 I915_WRITE(PIPE_DP_LINK_N(pipe), m_n->link_n);
5568 }
5569}
5570
5571static void ironlake_fdi_set_m_n(struct drm_crtc *crtc)
Jesse Barnes79e53942008-11-07 14:24:08 -08005572{
5573 struct drm_device *dev = crtc->dev;
Jesse Barnes79e53942008-11-07 14:24:08 -08005574 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter6cc5f342013-03-27 00:44:53 +01005575 struct drm_display_mode *adjusted_mode =
5576 &intel_crtc->config.adjusted_mode;
Daniel Vettere69d0bc2012-11-29 15:59:36 +01005577 struct intel_link_m_n m_n = {0};
Daniel Vetter6cc5f342013-03-27 00:44:53 +01005578 int target_clock, lane, link_bw;
Kristian Høgsberg43565a02009-02-13 20:56:52 -05005579
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005580 /* FDI is a binary signal running at ~2.7GHz, encoding
5581 * each output octet as 10 bits. The actual frequency
5582 * is stored as a divider into a 100MHz clock, and the
5583 * mode pixel clock is stored in units of 1KHz.
5584 * Hence the bw of each lane in terms of the mode signal
5585 * is:
5586 */
5587 link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10;
Zhenyu Wang2c072452009-06-05 15:38:42 +08005588
Daniel Vetterdf92b1e2013-03-28 10:41:58 +01005589 if (intel_crtc->config.pixel_target_clock)
5590 target_clock = intel_crtc->config.pixel_target_clock;
Daniel Vetter94bf2ce2012-06-04 18:39:19 +02005591 else
5592 target_clock = adjusted_mode->clock;
5593
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005594 lane = ironlake_get_lanes_required(target_clock, link_bw,
5595 intel_crtc->config.pipe_bpp);
Eric Anholt8febb292011-03-30 13:01:07 -07005596
5597 intel_crtc->fdi_lanes = lane;
5598
Daniel Vetter6cc5f342013-03-27 00:44:53 +01005599 if (intel_crtc->config.pixel_multiplier > 1)
5600 link_bw *= intel_crtc->config.pixel_multiplier;
Daniel Vetter965e0c42013-03-27 00:44:57 +01005601 intel_link_compute_m_n(intel_crtc->config.pipe_bpp, lane, target_clock,
5602 link_bw, &m_n);
Eric Anholt8febb292011-03-30 13:01:07 -07005603
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005604 intel_cpu_transcoder_set_m_n(intel_crtc, &m_n);
Paulo Zanonif48d8f22012-09-20 18:36:04 -03005605}
5606
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005607static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
Daniel Vetter9a7c7892013-04-04 22:20:34 +02005608 intel_clock_t *clock, u32 *fp,
5609 intel_clock_t *reduced_clock, u32 *fp2)
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005610{
5611 struct drm_crtc *crtc = &intel_crtc->base;
5612 struct drm_device *dev = crtc->dev;
5613 struct drm_i915_private *dev_priv = dev->dev_private;
5614 struct intel_encoder *intel_encoder;
5615 uint32_t dpll;
Daniel Vetter6cc5f342013-03-27 00:44:53 +01005616 int factor, num_connectors = 0;
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005617 bool is_lvds = false, is_sdvo = false, is_tv = false;
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005618
5619 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
5620 switch (intel_encoder->type) {
5621 case INTEL_OUTPUT_LVDS:
5622 is_lvds = true;
5623 break;
5624 case INTEL_OUTPUT_SDVO:
5625 case INTEL_OUTPUT_HDMI:
5626 is_sdvo = true;
5627 if (intel_encoder->needs_tv_clock)
5628 is_tv = true;
5629 break;
5630 case INTEL_OUTPUT_TVOUT:
5631 is_tv = true;
5632 break;
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005633 }
5634
5635 num_connectors++;
5636 }
Jesse Barnes79e53942008-11-07 14:24:08 -08005637
Chris Wilsonc1858122010-12-03 21:35:48 +00005638 /* Enable autotuning of the PLL clock (if permissible) */
Eric Anholt8febb292011-03-30 13:01:07 -07005639 factor = 21;
5640 if (is_lvds) {
5641 if ((intel_panel_use_ssc(dev_priv) &&
5642 dev_priv->lvds_ssc_freq == 100) ||
Daniel Vetterf0b44052013-04-04 22:20:33 +02005643 (HAS_PCH_IBX(dev) && intel_is_dual_link_lvds(dev)))
Eric Anholt8febb292011-03-30 13:01:07 -07005644 factor = 25;
5645 } else if (is_sdvo && is_tv)
5646 factor = 20;
Chris Wilsonc1858122010-12-03 21:35:48 +00005647
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005648 if (clock->m < factor * clock->n)
Daniel Vetter7d0ac5b2013-04-04 22:20:32 +02005649 *fp |= FP_CB_TUNE;
Chris Wilsonc1858122010-12-03 21:35:48 +00005650
Daniel Vetter9a7c7892013-04-04 22:20:34 +02005651 if (fp2 && (reduced_clock->m < factor * reduced_clock->n))
5652 *fp2 |= FP_CB_TUNE;
5653
Chris Wilson5eddb702010-09-11 13:48:45 +01005654 dpll = 0;
Zhenyu Wang2c072452009-06-05 15:38:42 +08005655
Eric Anholta07d6782011-03-30 13:01:08 -07005656 if (is_lvds)
5657 dpll |= DPLLB_MODE_LVDS;
5658 else
5659 dpll |= DPLLB_MODE_DAC_SERIAL;
5660 if (is_sdvo) {
Daniel Vetter6cc5f342013-03-27 00:44:53 +01005661 if (intel_crtc->config.pixel_multiplier > 1) {
5662 dpll |= (intel_crtc->config.pixel_multiplier - 1)
5663 << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT;
Jesse Barnes79e53942008-11-07 14:24:08 -08005664 }
Eric Anholta07d6782011-03-30 13:01:08 -07005665 dpll |= DPLL_DVO_HIGH_SPEED;
5666 }
Daniel Vetter8b470472013-03-28 10:41:59 +01005667 if (intel_crtc->config.has_dp_encoder &&
5668 intel_crtc->config.has_pch_encoder)
Eric Anholta07d6782011-03-30 13:01:08 -07005669 dpll |= DPLL_DVO_HIGH_SPEED;
Jesse Barnes79e53942008-11-07 14:24:08 -08005670
Eric Anholta07d6782011-03-30 13:01:08 -07005671 /* compute bitmask from p1 value */
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005672 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
Eric Anholta07d6782011-03-30 13:01:08 -07005673 /* also FPA1 */
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005674 dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
Eric Anholta07d6782011-03-30 13:01:08 -07005675
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005676 switch (clock->p2) {
Eric Anholta07d6782011-03-30 13:01:08 -07005677 case 5:
5678 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
5679 break;
5680 case 7:
5681 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
5682 break;
5683 case 10:
5684 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
5685 break;
5686 case 14:
5687 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
5688 break;
Jesse Barnes79e53942008-11-07 14:24:08 -08005689 }
5690
5691 if (is_sdvo && is_tv)
5692 dpll |= PLL_REF_INPUT_TVCLKINBC;
5693 else if (is_tv)
5694 /* XXX: just matching BIOS for now */
Kristian Høgsberg43565a02009-02-13 20:56:52 -05005695 /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
Jesse Barnes79e53942008-11-07 14:24:08 -08005696 dpll |= 3;
Chris Wilsona7615032011-01-12 17:04:08 +00005697 else if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2)
Kristian Høgsberg43565a02009-02-13 20:56:52 -05005698 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
Jesse Barnes79e53942008-11-07 14:24:08 -08005699 else
5700 dpll |= PLL_REF_INPUT_DREFCLK;
5701
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005702 return dpll;
5703}
5704
Jesse Barnes79e53942008-11-07 14:24:08 -08005705static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
Jesse Barnes79e53942008-11-07 14:24:08 -08005706 int x, int y,
Daniel Vetter94352cf2012-07-05 22:51:56 +02005707 struct drm_framebuffer *fb)
Jesse Barnes79e53942008-11-07 14:24:08 -08005708{
5709 struct drm_device *dev = crtc->dev;
5710 struct drm_i915_private *dev_priv = dev->dev_private;
5711 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01005712 struct drm_display_mode *adjusted_mode =
5713 &intel_crtc->config.adjusted_mode;
5714 struct drm_display_mode *mode = &intel_crtc->config.requested_mode;
Jesse Barnes79e53942008-11-07 14:24:08 -08005715 int pipe = intel_crtc->pipe;
5716 int plane = intel_crtc->plane;
Paulo Zanoni6591c6e2012-09-12 10:06:34 -03005717 int num_connectors = 0;
Jesse Barnes79e53942008-11-07 14:24:08 -08005718 intel_clock_t clock, reduced_clock;
Paulo Zanonia1f9e772012-09-12 10:06:32 -03005719 u32 dpll, fp = 0, fp2 = 0;
Paulo Zanonie2f12b02012-09-20 18:36:06 -03005720 bool ok, has_reduced_clock = false;
Daniel Vetter8b470472013-03-28 10:41:59 +01005721 bool is_lvds = false;
Paulo Zanonif48d8f22012-09-20 18:36:04 -03005722 struct intel_encoder *encoder;
Paulo Zanonide13a2e2012-09-20 18:36:05 -03005723 int ret;
Daniel Vetter01a415f2012-10-27 15:58:40 +02005724 bool dither, fdi_config_ok;
Jesse Barnes79e53942008-11-07 14:24:08 -08005725
5726 for_each_encoder_on_crtc(dev, crtc, encoder) {
5727 switch (encoder->type) {
5728 case INTEL_OUTPUT_LVDS:
5729 is_lvds = true;
5730 break;
Jesse Barnes79e53942008-11-07 14:24:08 -08005731 }
5732
5733 num_connectors++;
5734 }
5735
Paulo Zanoni5dc52982012-10-05 12:05:56 -03005736 WARN(!(HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)),
5737 "Unexpected PCH type %d\n", INTEL_PCH_TYPE(dev));
5738
Daniel Vetter3b117c82013-04-17 20:15:07 +02005739 intel_crtc->config.cpu_transcoder = pipe;
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005740
Paulo Zanoni6591c6e2012-09-12 10:06:34 -03005741 ok = ironlake_compute_clocks(crtc, adjusted_mode, &clock,
5742 &has_reduced_clock, &reduced_clock);
Jesse Barnes79e53942008-11-07 14:24:08 -08005743 if (!ok) {
5744 DRM_ERROR("Couldn't find PLL settings for mode!\n");
5745 return -EINVAL;
5746 }
Daniel Vetterf47709a2013-03-28 10:42:02 +01005747 /* Compat-code for transition, will disappear. */
5748 if (!intel_crtc->config.clock_set) {
5749 intel_crtc->config.dpll.n = clock.n;
5750 intel_crtc->config.dpll.m1 = clock.m1;
5751 intel_crtc->config.dpll.m2 = clock.m2;
5752 intel_crtc->config.dpll.p1 = clock.p1;
5753 intel_crtc->config.dpll.p2 = clock.p2;
5754 }
Jesse Barnes79e53942008-11-07 14:24:08 -08005755
5756 /* Ensure that the cursor is valid for the new mode before changing... */
5757 intel_crtc_update_cursor(crtc, true);
5758
Jesse Barnes79e53942008-11-07 14:24:08 -08005759 /* determine panel color depth */
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01005760 dither = intel_crtc->config.dither;
Paulo Zanonic8203562012-09-12 10:06:29 -03005761 if (is_lvds && dev_priv->lvds_dither)
5762 dither = true;
Jesse Barnes79e53942008-11-07 14:24:08 -08005763
Jesse Barnes79e53942008-11-07 14:24:08 -08005764 fp = clock.n << 16 | clock.m1 << 8 | clock.m2;
5765 if (has_reduced_clock)
5766 fp2 = reduced_clock.n << 16 | reduced_clock.m1 << 8 |
5767 reduced_clock.m2;
5768
Daniel Vetter9a7c7892013-04-04 22:20:34 +02005769 dpll = ironlake_compute_dpll(intel_crtc, &clock, &fp, &reduced_clock,
5770 has_reduced_clock ? &fp2 : NULL);
Jesse Barnes79e53942008-11-07 14:24:08 -08005771
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005772 DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe_name(pipe));
Jesse Barnes79e53942008-11-07 14:24:08 -08005773 drm_mode_debug_printmodeline(mode);
5774
Paulo Zanoni5dc52982012-10-05 12:05:56 -03005775 /* CPU eDP is the only output that doesn't need a PCH PLL of its own. */
Daniel Vetter8b470472013-03-28 10:41:59 +01005776 if (intel_crtc->config.has_pch_encoder) {
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005777 struct intel_pch_pll *pll;
Chris Wilson5eddb702010-09-11 13:48:45 +01005778
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005779 pll = intel_get_pch_pll(intel_crtc, dpll, fp);
5780 if (pll == NULL) {
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005781 DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
5782 pipe_name(pipe));
Jesse Barnes4b645f12011-10-12 09:51:31 -07005783 return -EINVAL;
5784 }
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005785 } else
5786 intel_put_pch_pll(intel_crtc);
Jesse Barnes79e53942008-11-07 14:24:08 -08005787
Daniel Vetter03afc4a2013-04-02 23:42:31 +02005788 if (intel_crtc->config.has_dp_encoder)
5789 intel_dp_set_m_n(intel_crtc);
Jesse Barnes79e53942008-11-07 14:24:08 -08005790
Daniel Vetterdafd2262012-11-26 17:22:07 +01005791 for_each_encoder_on_crtc(dev, crtc, encoder)
5792 if (encoder->pre_pll_enable)
5793 encoder->pre_pll_enable(encoder);
Jesse Barnes79e53942008-11-07 14:24:08 -08005794
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005795 if (intel_crtc->pch_pll) {
5796 I915_WRITE(intel_crtc->pch_pll->pll_reg, dpll);
Chris Wilson5eddb702010-09-11 13:48:45 +01005797
Zhenyu Wang32f9d652009-07-24 01:00:32 +08005798 /* Wait for the clocks to stabilize. */
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005799 POSTING_READ(intel_crtc->pch_pll->pll_reg);
Zhenyu Wang32f9d652009-07-24 01:00:32 +08005800 udelay(150);
5801
Eric Anholt8febb292011-03-30 13:01:07 -07005802 /* The pixel multiplier can only be updated once the
5803 * DPLL is enabled and the clocks are stable.
5804 *
5805 * So write it again.
5806 */
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005807 I915_WRITE(intel_crtc->pch_pll->pll_reg, dpll);
Jesse Barnes79e53942008-11-07 14:24:08 -08005808 }
Jesse Barnes79e53942008-11-07 14:24:08 -08005809
Chris Wilson5eddb702010-09-11 13:48:45 +01005810 intel_crtc->lowfreq_avail = false;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005811 if (intel_crtc->pch_pll) {
Jesse Barnes4b645f12011-10-12 09:51:31 -07005812 if (is_lvds && has_reduced_clock && i915_powersave) {
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005813 I915_WRITE(intel_crtc->pch_pll->fp1_reg, fp2);
Jesse Barnes4b645f12011-10-12 09:51:31 -07005814 intel_crtc->lowfreq_avail = true;
Jesse Barnes4b645f12011-10-12 09:51:31 -07005815 } else {
Jesse Barnesee7b9f92012-04-20 17:11:53 +01005816 I915_WRITE(intel_crtc->pch_pll->fp1_reg, fp);
Jesse Barnes652c3932009-08-17 13:31:43 -07005817 }
5818 }
5819
Paulo Zanonib0e77b92012-10-01 18:10:53 -03005820 intel_set_pipe_timings(intel_crtc, mode, adjusted_mode);
Krzysztof Halasa734b4152010-05-25 18:41:46 +02005821
Daniel Vetter01a415f2012-10-27 15:58:40 +02005822 /* Note, this also computes intel_crtc->fdi_lanes which is used below in
5823 * ironlake_check_fdi_lanes. */
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005824 intel_crtc->fdi_lanes = 0;
5825 if (intel_crtc->config.has_pch_encoder)
5826 ironlake_fdi_set_m_n(crtc);
Chris Wilson5eddb702010-09-11 13:48:45 +01005827
Daniel Vetter01a415f2012-10-27 15:58:40 +02005828 fdi_config_ok = ironlake_check_fdi_lanes(intel_crtc);
Zhenyu Wang2c072452009-06-05 15:38:42 +08005829
Paulo Zanonic8203562012-09-12 10:06:29 -03005830 ironlake_set_pipeconf(crtc, adjusted_mode, dither);
Jesse Barnes79e53942008-11-07 14:24:08 -08005831
Paulo Zanonia1f9e772012-09-12 10:06:32 -03005832 /* Set up the display plane register */
5833 I915_WRITE(DSPCNTR(plane), DISPPLANE_GAMMA_ENABLE);
Jesse Barnesb24e7172011-01-04 15:09:30 -08005834 POSTING_READ(DSPCNTR(plane));
Jesse Barnes79e53942008-11-07 14:24:08 -08005835
Daniel Vetter94352cf2012-07-05 22:51:56 +02005836 ret = intel_pipe_set_base(crtc, x, y, fb);
Shaohua Li7662c8b2009-06-26 11:23:55 +08005837
5838 intel_update_watermarks(dev);
5839
Eugeni Dodonov1f8eeab2012-05-09 15:37:24 -03005840 intel_update_linetime_watermarks(dev, pipe, adjusted_mode);
5841
Daniel Vetter01a415f2012-10-27 15:58:40 +02005842 return fdi_config_ok ? ret : -EINVAL;
Jesse Barnes79e53942008-11-07 14:24:08 -08005843}
5844
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01005845static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
5846 struct intel_crtc_config *pipe_config)
5847{
5848 struct drm_device *dev = crtc->base.dev;
5849 struct drm_i915_private *dev_priv = dev->dev_private;
5850 uint32_t tmp;
5851
5852 tmp = I915_READ(PIPECONF(crtc->pipe));
5853 if (!(tmp & PIPECONF_ENABLE))
5854 return false;
5855
Daniel Vetter88adfff2013-03-28 10:42:01 +01005856 if (I915_READ(TRANSCONF(crtc->pipe)) & TRANS_ENABLE)
5857 pipe_config->has_pch_encoder = true;
5858
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01005859 return true;
5860}
5861
Daniel Vetterd6dd9eb2013-01-29 16:35:20 -02005862static void haswell_modeset_global_resources(struct drm_device *dev)
5863{
5864 struct drm_i915_private *dev_priv = dev->dev_private;
5865 bool enable = false;
5866 struct intel_crtc *crtc;
5867 struct intel_encoder *encoder;
5868
5869 list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) {
5870 if (crtc->pipe != PIPE_A && crtc->base.enabled)
5871 enable = true;
5872 /* XXX: Should check for edp transcoder here, but thanks to init
5873 * sequence that's not yet available. Just in case desktop eDP
5874 * on PORT D is possible on haswell, too. */
5875 }
5876
5877 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
5878 base.head) {
5879 if (encoder->type != INTEL_OUTPUT_EDP &&
5880 encoder->connectors_active)
5881 enable = true;
5882 }
5883
5884 /* Even the eDP panel fitter is outside the always-on well. */
5885 if (dev_priv->pch_pf_size)
5886 enable = true;
5887
5888 intel_set_power_well(dev, enable);
5889}
5890
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005891static int haswell_crtc_mode_set(struct drm_crtc *crtc,
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005892 int x, int y,
5893 struct drm_framebuffer *fb)
5894{
5895 struct drm_device *dev = crtc->dev;
5896 struct drm_i915_private *dev_priv = dev->dev_private;
5897 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01005898 struct drm_display_mode *adjusted_mode =
5899 &intel_crtc->config.adjusted_mode;
5900 struct drm_display_mode *mode = &intel_crtc->config.requested_mode;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005901 int pipe = intel_crtc->pipe;
5902 int plane = intel_crtc->plane;
5903 int num_connectors = 0;
Daniel Vetter8b470472013-03-28 10:41:59 +01005904 bool is_cpu_edp = false;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005905 struct intel_encoder *encoder;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005906 int ret;
5907 bool dither;
5908
5909 for_each_encoder_on_crtc(dev, crtc, encoder) {
5910 switch (encoder->type) {
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005911 case INTEL_OUTPUT_EDP:
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005912 if (!intel_encoder_is_pch_edp(&encoder->base))
5913 is_cpu_edp = true;
5914 break;
5915 }
5916
5917 num_connectors++;
5918 }
5919
Daniel Vetterbba21812013-03-22 10:53:40 +01005920 if (is_cpu_edp)
Daniel Vetter3b117c82013-04-17 20:15:07 +02005921 intel_crtc->config.cpu_transcoder = TRANSCODER_EDP;
Daniel Vetterbba21812013-03-22 10:53:40 +01005922 else
Daniel Vetter3b117c82013-04-17 20:15:07 +02005923 intel_crtc->config.cpu_transcoder = pipe;
Daniel Vetterbba21812013-03-22 10:53:40 +01005924
Paulo Zanoni5dc52982012-10-05 12:05:56 -03005925 /* We are not sure yet this won't happen. */
5926 WARN(!HAS_PCH_LPT(dev), "Unexpected PCH type %d\n",
5927 INTEL_PCH_TYPE(dev));
5928
5929 WARN(num_connectors != 1, "%d connectors attached to pipe %c\n",
5930 num_connectors, pipe_name(pipe));
5931
Daniel Vetter3b117c82013-04-17 20:15:07 +02005932 WARN_ON(I915_READ(PIPECONF(intel_crtc->config.cpu_transcoder)) &
Paulo Zanoni1ce42922012-10-05 12:06:01 -03005933 (PIPECONF_ENABLE | I965_PIPECONF_ACTIVE));
5934
5935 WARN_ON(I915_READ(DSPCNTR(plane)) & DISPLAY_PLANE_ENABLE);
5936
Paulo Zanoni6441ab52012-10-05 12:05:58 -03005937 if (!intel_ddi_pll_mode_set(crtc, adjusted_mode->clock))
5938 return -EINVAL;
5939
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005940 /* Ensure that the cursor is valid for the new mode before changing... */
5941 intel_crtc_update_cursor(crtc, true);
5942
5943 /* determine panel color depth */
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01005944 dither = intel_crtc->config.dither;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005945
Ville Syrjälä84f44ce2013-04-17 17:48:49 +03005946 DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe_name(pipe));
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005947 drm_mode_debug_printmodeline(mode);
5948
Daniel Vetter03afc4a2013-04-02 23:42:31 +02005949 if (intel_crtc->config.has_dp_encoder)
5950 intel_dp_set_m_n(intel_crtc);
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005951
5952 intel_crtc->lowfreq_avail = false;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005953
5954 intel_set_pipe_timings(intel_crtc, mode, adjusted_mode);
5955
Daniel Vetter6cf86a52013-04-02 23:38:10 +02005956 if (intel_crtc->config.has_pch_encoder)
5957 ironlake_fdi_set_m_n(crtc);
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005958
Paulo Zanoniee2b0b32012-10-05 12:05:57 -03005959 haswell_set_pipeconf(crtc, adjusted_mode, dither);
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005960
Daniel Vetter50f3b012013-03-27 00:44:56 +01005961 intel_set_pipe_csc(crtc);
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005962
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005963 /* Set up the display plane register */
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02005964 I915_WRITE(DSPCNTR(plane), DISPPLANE_GAMMA_ENABLE | DISPPLANE_PIPE_CSC_ENABLE);
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03005965 POSTING_READ(DSPCNTR(plane));
5966
5967 ret = intel_pipe_set_base(crtc, x, y, fb);
5968
5969 intel_update_watermarks(dev);
5970
5971 intel_update_linetime_watermarks(dev, pipe, adjusted_mode);
5972
Jesse Barnes79e53942008-11-07 14:24:08 -08005973 return ret;
5974}
5975
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01005976static bool haswell_get_pipe_config(struct intel_crtc *crtc,
5977 struct intel_crtc_config *pipe_config)
5978{
5979 struct drm_device *dev = crtc->base.dev;
5980 struct drm_i915_private *dev_priv = dev->dev_private;
Paulo Zanoni2bfce952013-04-18 16:35:40 -03005981 enum transcoder cpu_transcoder = crtc->config.cpu_transcoder;
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01005982 uint32_t tmp;
5983
Paulo Zanoni2bfce952013-04-18 16:35:40 -03005984 if (!intel_using_power_well(dev_priv->dev) &&
5985 cpu_transcoder != TRANSCODER_EDP)
5986 return false;
5987
5988 tmp = I915_READ(PIPECONF(cpu_transcoder));
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01005989 if (!(tmp & PIPECONF_ENABLE))
5990 return false;
5991
Daniel Vetter88adfff2013-03-28 10:42:01 +01005992 /*
5993 * aswell has only FDI/PCH transcoder A. It is which is connected to
5994 * DDI E. So just check whether this pipe is wired to DDI E and whether
5995 * the PCH transcoder is on.
5996 */
5997 tmp = I915_READ(TRANS_DDI_FUNC_CTL(crtc->pipe));
5998 if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(PORT_E) &&
5999 I915_READ(TRANSCONF(PIPE_A)) & TRANS_ENABLE)
6000 pipe_config->has_pch_encoder = true;
6001
6002
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01006003 return true;
6004}
6005
Eric Anholtf564048e2011-03-30 13:01:02 -07006006static int intel_crtc_mode_set(struct drm_crtc *crtc,
Eric Anholtf564048e2011-03-30 13:01:02 -07006007 int x, int y,
Daniel Vetter94352cf2012-07-05 22:51:56 +02006008 struct drm_framebuffer *fb)
Eric Anholtf564048e2011-03-30 13:01:02 -07006009{
6010 struct drm_device *dev = crtc->dev;
6011 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetter9256aa12012-10-31 19:26:13 +01006012 struct drm_encoder_helper_funcs *encoder_funcs;
6013 struct intel_encoder *encoder;
Eric Anholt0b701d22011-03-30 13:01:03 -07006014 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01006015 struct drm_display_mode *adjusted_mode =
6016 &intel_crtc->config.adjusted_mode;
6017 struct drm_display_mode *mode = &intel_crtc->config.requested_mode;
Eric Anholt0b701d22011-03-30 13:01:03 -07006018 int pipe = intel_crtc->pipe;
Eric Anholtf564048e2011-03-30 13:01:02 -07006019 int ret;
6020
Eric Anholt0b701d22011-03-30 13:01:03 -07006021 drm_vblank_pre_modeset(dev, pipe);
6022
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01006023 ret = dev_priv->display.crtc_mode_set(crtc, x, y, fb);
6024
Jesse Barnes79e53942008-11-07 14:24:08 -08006025 drm_vblank_post_modeset(dev, pipe);
6026
Daniel Vetter9256aa12012-10-31 19:26:13 +01006027 if (ret != 0)
6028 return ret;
6029
6030 for_each_encoder_on_crtc(dev, crtc, encoder) {
6031 DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n",
6032 encoder->base.base.id,
6033 drm_get_encoder_name(&encoder->base),
6034 mode->base.id, mode->name);
Daniel Vetter6cc5f342013-03-27 00:44:53 +01006035 if (encoder->mode_set) {
6036 encoder->mode_set(encoder);
6037 } else {
6038 encoder_funcs = encoder->base.helper_private;
6039 encoder_funcs->mode_set(&encoder->base, mode, adjusted_mode);
6040 }
Daniel Vetter9256aa12012-10-31 19:26:13 +01006041 }
6042
6043 return 0;
Jesse Barnes79e53942008-11-07 14:24:08 -08006044}
6045
Wu Fengguang3a9627f2011-12-09 20:42:19 +08006046static bool intel_eld_uptodate(struct drm_connector *connector,
6047 int reg_eldv, uint32_t bits_eldv,
6048 int reg_elda, uint32_t bits_elda,
6049 int reg_edid)
6050{
6051 struct drm_i915_private *dev_priv = connector->dev->dev_private;
6052 uint8_t *eld = connector->eld;
6053 uint32_t i;
6054
6055 i = I915_READ(reg_eldv);
6056 i &= bits_eldv;
6057
6058 if (!eld[0])
6059 return !i;
6060
6061 if (!i)
6062 return false;
6063
6064 i = I915_READ(reg_elda);
6065 i &= ~bits_elda;
6066 I915_WRITE(reg_elda, i);
6067
6068 for (i = 0; i < eld[2]; i++)
6069 if (I915_READ(reg_edid) != *((uint32_t *)eld + i))
6070 return false;
6071
6072 return true;
6073}
6074
Wu Fengguange0dac652011-09-05 14:25:34 +08006075static void g4x_write_eld(struct drm_connector *connector,
6076 struct drm_crtc *crtc)
6077{
6078 struct drm_i915_private *dev_priv = connector->dev->dev_private;
6079 uint8_t *eld = connector->eld;
6080 uint32_t eldv;
6081 uint32_t len;
6082 uint32_t i;
6083
6084 i = I915_READ(G4X_AUD_VID_DID);
6085
6086 if (i == INTEL_AUDIO_DEVBLC || i == INTEL_AUDIO_DEVCL)
6087 eldv = G4X_ELDV_DEVCL_DEVBLC;
6088 else
6089 eldv = G4X_ELDV_DEVCTG;
6090
Wu Fengguang3a9627f2011-12-09 20:42:19 +08006091 if (intel_eld_uptodate(connector,
6092 G4X_AUD_CNTL_ST, eldv,
6093 G4X_AUD_CNTL_ST, G4X_ELD_ADDR,
6094 G4X_HDMIW_HDMIEDID))
6095 return;
6096
Wu Fengguange0dac652011-09-05 14:25:34 +08006097 i = I915_READ(G4X_AUD_CNTL_ST);
6098 i &= ~(eldv | G4X_ELD_ADDR);
6099 len = (i >> 9) & 0x1f; /* ELD buffer size */
6100 I915_WRITE(G4X_AUD_CNTL_ST, i);
6101
6102 if (!eld[0])
6103 return;
6104
6105 len = min_t(uint8_t, eld[2], len);
6106 DRM_DEBUG_DRIVER("ELD size %d\n", len);
6107 for (i = 0; i < len; i++)
6108 I915_WRITE(G4X_HDMIW_HDMIEDID, *((uint32_t *)eld + i));
6109
6110 i = I915_READ(G4X_AUD_CNTL_ST);
6111 i |= eldv;
6112 I915_WRITE(G4X_AUD_CNTL_ST, i);
6113}
6114
Wang Xingchao83358c852012-08-16 22:43:37 +08006115static void haswell_write_eld(struct drm_connector *connector,
6116 struct drm_crtc *crtc)
6117{
6118 struct drm_i915_private *dev_priv = connector->dev->dev_private;
6119 uint8_t *eld = connector->eld;
6120 struct drm_device *dev = crtc->dev;
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08006121 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Wang Xingchao83358c852012-08-16 22:43:37 +08006122 uint32_t eldv;
6123 uint32_t i;
6124 int len;
6125 int pipe = to_intel_crtc(crtc)->pipe;
6126 int tmp;
6127
6128 int hdmiw_hdmiedid = HSW_AUD_EDID_DATA(pipe);
6129 int aud_cntl_st = HSW_AUD_DIP_ELD_CTRL(pipe);
6130 int aud_config = HSW_AUD_CFG(pipe);
6131 int aud_cntrl_st2 = HSW_AUD_PIN_ELD_CP_VLD;
6132
6133
6134 DRM_DEBUG_DRIVER("HDMI: Haswell Audio initialize....\n");
6135
6136 /* Audio output enable */
6137 DRM_DEBUG_DRIVER("HDMI audio: enable codec\n");
6138 tmp = I915_READ(aud_cntrl_st2);
6139 tmp |= (AUDIO_OUTPUT_ENABLE_A << (pipe * 4));
6140 I915_WRITE(aud_cntrl_st2, tmp);
6141
6142 /* Wait for 1 vertical blank */
6143 intel_wait_for_vblank(dev, pipe);
6144
6145 /* Set ELD valid state */
6146 tmp = I915_READ(aud_cntrl_st2);
6147 DRM_DEBUG_DRIVER("HDMI audio: pin eld vld status=0x%8x\n", tmp);
6148 tmp |= (AUDIO_ELD_VALID_A << (pipe * 4));
6149 I915_WRITE(aud_cntrl_st2, tmp);
6150 tmp = I915_READ(aud_cntrl_st2);
6151 DRM_DEBUG_DRIVER("HDMI audio: eld vld status=0x%8x\n", tmp);
6152
6153 /* Enable HDMI mode */
6154 tmp = I915_READ(aud_config);
6155 DRM_DEBUG_DRIVER("HDMI audio: audio conf: 0x%8x\n", tmp);
6156 /* clear N_programing_enable and N_value_index */
6157 tmp &= ~(AUD_CONFIG_N_VALUE_INDEX | AUD_CONFIG_N_PROG_ENABLE);
6158 I915_WRITE(aud_config, tmp);
6159
6160 DRM_DEBUG_DRIVER("ELD on pipe %c\n", pipe_name(pipe));
6161
6162 eldv = AUDIO_ELD_VALID_A << (pipe * 4);
Wang Xingchao7b9f35a2013-01-22 23:25:25 +08006163 intel_crtc->eld_vld = true;
Wang Xingchao83358c852012-08-16 22:43:37 +08006164
6165 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
6166 DRM_DEBUG_DRIVER("ELD: DisplayPort detected\n");
6167 eld[5] |= (1 << 2); /* Conn_Type, 0x1 = DisplayPort */
6168 I915_WRITE(aud_config, AUD_CONFIG_N_VALUE_INDEX); /* 0x1 = DP */
6169 } else
6170 I915_WRITE(aud_config, 0);
6171
6172 if (intel_eld_uptodate(connector,
6173 aud_cntrl_st2, eldv,
6174 aud_cntl_st, IBX_ELD_ADDRESS,
6175 hdmiw_hdmiedid))
6176 return;
6177
6178 i = I915_READ(aud_cntrl_st2);
6179 i &= ~eldv;
6180 I915_WRITE(aud_cntrl_st2, i);
6181
6182 if (!eld[0])
6183 return;
6184
6185 i = I915_READ(aud_cntl_st);
6186 i &= ~IBX_ELD_ADDRESS;
6187 I915_WRITE(aud_cntl_st, i);
6188 i = (i >> 29) & DIP_PORT_SEL_MASK; /* DIP_Port_Select, 0x1 = PortB */
6189 DRM_DEBUG_DRIVER("port num:%d\n", i);
6190
6191 len = min_t(uint8_t, eld[2], 21); /* 84 bytes of hw ELD buffer */
6192 DRM_DEBUG_DRIVER("ELD size %d\n", len);
6193 for (i = 0; i < len; i++)
6194 I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i));
6195
6196 i = I915_READ(aud_cntrl_st2);
6197 i |= eldv;
6198 I915_WRITE(aud_cntrl_st2, i);
6199
6200}
6201
Wu Fengguange0dac652011-09-05 14:25:34 +08006202static void ironlake_write_eld(struct drm_connector *connector,
6203 struct drm_crtc *crtc)
6204{
6205 struct drm_i915_private *dev_priv = connector->dev->dev_private;
6206 uint8_t *eld = connector->eld;
6207 uint32_t eldv;
6208 uint32_t i;
6209 int len;
6210 int hdmiw_hdmiedid;
Wu Fengguangb6daa022012-01-06 14:41:31 -06006211 int aud_config;
Wu Fengguange0dac652011-09-05 14:25:34 +08006212 int aud_cntl_st;
6213 int aud_cntrl_st2;
Wang Xingchao9b138a82012-08-09 16:52:18 +08006214 int pipe = to_intel_crtc(crtc)->pipe;
Wu Fengguange0dac652011-09-05 14:25:34 +08006215
Wu Fengguangb3f33cb2011-12-09 20:42:17 +08006216 if (HAS_PCH_IBX(connector->dev)) {
Wang Xingchao9b138a82012-08-09 16:52:18 +08006217 hdmiw_hdmiedid = IBX_HDMIW_HDMIEDID(pipe);
6218 aud_config = IBX_AUD_CFG(pipe);
6219 aud_cntl_st = IBX_AUD_CNTL_ST(pipe);
Wu Fengguang1202b4c62011-12-09 20:42:18 +08006220 aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
Wu Fengguange0dac652011-09-05 14:25:34 +08006221 } else {
Wang Xingchao9b138a82012-08-09 16:52:18 +08006222 hdmiw_hdmiedid = CPT_HDMIW_HDMIEDID(pipe);
6223 aud_config = CPT_AUD_CFG(pipe);
6224 aud_cntl_st = CPT_AUD_CNTL_ST(pipe);
Wu Fengguang1202b4c62011-12-09 20:42:18 +08006225 aud_cntrl_st2 = CPT_AUD_CNTRL_ST2;
Wu Fengguange0dac652011-09-05 14:25:34 +08006226 }
6227
Wang Xingchao9b138a82012-08-09 16:52:18 +08006228 DRM_DEBUG_DRIVER("ELD on pipe %c\n", pipe_name(pipe));
Wu Fengguange0dac652011-09-05 14:25:34 +08006229
6230 i = I915_READ(aud_cntl_st);
Wang Xingchao9b138a82012-08-09 16:52:18 +08006231 i = (i >> 29) & DIP_PORT_SEL_MASK; /* DIP_Port_Select, 0x1 = PortB */
Wu Fengguange0dac652011-09-05 14:25:34 +08006232 if (!i) {
6233 DRM_DEBUG_DRIVER("Audio directed to unknown port\n");
6234 /* operate blindly on all ports */
Wu Fengguang1202b4c62011-12-09 20:42:18 +08006235 eldv = IBX_ELD_VALIDB;
6236 eldv |= IBX_ELD_VALIDB << 4;
6237 eldv |= IBX_ELD_VALIDB << 8;
Wu Fengguange0dac652011-09-05 14:25:34 +08006238 } else {
Ville Syrjälä2582a852013-04-17 17:48:47 +03006239 DRM_DEBUG_DRIVER("ELD on port %c\n", port_name(i));
Wu Fengguang1202b4c62011-12-09 20:42:18 +08006240 eldv = IBX_ELD_VALIDB << ((i - 1) * 4);
Wu Fengguange0dac652011-09-05 14:25:34 +08006241 }
6242
Wu Fengguang3a9627f2011-12-09 20:42:19 +08006243 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
6244 DRM_DEBUG_DRIVER("ELD: DisplayPort detected\n");
6245 eld[5] |= (1 << 2); /* Conn_Type, 0x1 = DisplayPort */
Wu Fengguangb6daa022012-01-06 14:41:31 -06006246 I915_WRITE(aud_config, AUD_CONFIG_N_VALUE_INDEX); /* 0x1 = DP */
6247 } else
6248 I915_WRITE(aud_config, 0);
Wu Fengguang3a9627f2011-12-09 20:42:19 +08006249
6250 if (intel_eld_uptodate(connector,
6251 aud_cntrl_st2, eldv,
6252 aud_cntl_st, IBX_ELD_ADDRESS,
6253 hdmiw_hdmiedid))
6254 return;
6255
Wu Fengguange0dac652011-09-05 14:25:34 +08006256 i = I915_READ(aud_cntrl_st2);
6257 i &= ~eldv;
6258 I915_WRITE(aud_cntrl_st2, i);
6259
6260 if (!eld[0])
6261 return;
6262
Wu Fengguange0dac652011-09-05 14:25:34 +08006263 i = I915_READ(aud_cntl_st);
Wu Fengguang1202b4c62011-12-09 20:42:18 +08006264 i &= ~IBX_ELD_ADDRESS;
Wu Fengguange0dac652011-09-05 14:25:34 +08006265 I915_WRITE(aud_cntl_st, i);
6266
6267 len = min_t(uint8_t, eld[2], 21); /* 84 bytes of hw ELD buffer */
6268 DRM_DEBUG_DRIVER("ELD size %d\n", len);
6269 for (i = 0; i < len; i++)
6270 I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i));
6271
6272 i = I915_READ(aud_cntrl_st2);
6273 i |= eldv;
6274 I915_WRITE(aud_cntrl_st2, i);
6275}
6276
6277void intel_write_eld(struct drm_encoder *encoder,
6278 struct drm_display_mode *mode)
6279{
6280 struct drm_crtc *crtc = encoder->crtc;
6281 struct drm_connector *connector;
6282 struct drm_device *dev = encoder->dev;
6283 struct drm_i915_private *dev_priv = dev->dev_private;
6284
6285 connector = drm_select_eld(encoder, mode);
6286 if (!connector)
6287 return;
6288
6289 DRM_DEBUG_DRIVER("ELD on [CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
6290 connector->base.id,
6291 drm_get_connector_name(connector),
6292 connector->encoder->base.id,
6293 drm_get_encoder_name(connector->encoder));
6294
6295 connector->eld[6] = drm_av_sync_delay(connector, mode) / 2;
6296
6297 if (dev_priv->display.write_eld)
6298 dev_priv->display.write_eld(connector, crtc);
6299}
6300
Jesse Barnes79e53942008-11-07 14:24:08 -08006301/** Loads the palette/gamma unit for the CRTC with the prepared values */
6302void intel_crtc_load_lut(struct drm_crtc *crtc)
6303{
6304 struct drm_device *dev = crtc->dev;
6305 struct drm_i915_private *dev_priv = dev->dev_private;
6306 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006307 int palreg = PALETTE(intel_crtc->pipe);
Jesse Barnes79e53942008-11-07 14:24:08 -08006308 int i;
6309
6310 /* The clocks have to be on to load the palette. */
Alban Browaeysaed3f092012-02-24 17:12:45 +00006311 if (!crtc->enabled || !intel_crtc->active)
Jesse Barnes79e53942008-11-07 14:24:08 -08006312 return;
6313
Adam Jacksonf2b115e2009-12-03 17:14:42 -05006314 /* use legacy palette for Ironlake */
Eric Anholtbad720f2009-10-22 16:11:14 -07006315 if (HAS_PCH_SPLIT(dev))
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006316 palreg = LGC_PALETTE(intel_crtc->pipe);
Zhenyu Wang2c072452009-06-05 15:38:42 +08006317
Jesse Barnes79e53942008-11-07 14:24:08 -08006318 for (i = 0; i < 256; i++) {
6319 I915_WRITE(palreg + 4 * i,
6320 (intel_crtc->lut_r[i] << 16) |
6321 (intel_crtc->lut_g[i] << 8) |
6322 intel_crtc->lut_b[i]);
6323 }
6324}
6325
Chris Wilson560b85b2010-08-07 11:01:38 +01006326static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
6327{
6328 struct drm_device *dev = crtc->dev;
6329 struct drm_i915_private *dev_priv = dev->dev_private;
6330 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6331 bool visible = base != 0;
6332 u32 cntl;
6333
6334 if (intel_crtc->cursor_visible == visible)
6335 return;
6336
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006337 cntl = I915_READ(_CURACNTR);
Chris Wilson560b85b2010-08-07 11:01:38 +01006338 if (visible) {
6339 /* On these chipsets we can only modify the base whilst
6340 * the cursor is disabled.
6341 */
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006342 I915_WRITE(_CURABASE, base);
Chris Wilson560b85b2010-08-07 11:01:38 +01006343
6344 cntl &= ~(CURSOR_FORMAT_MASK);
6345 /* XXX width must be 64, stride 256 => 0x00 << 28 */
6346 cntl |= CURSOR_ENABLE |
6347 CURSOR_GAMMA_ENABLE |
6348 CURSOR_FORMAT_ARGB;
6349 } else
6350 cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE);
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006351 I915_WRITE(_CURACNTR, cntl);
Chris Wilson560b85b2010-08-07 11:01:38 +01006352
6353 intel_crtc->cursor_visible = visible;
6354}
6355
6356static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base)
6357{
6358 struct drm_device *dev = crtc->dev;
6359 struct drm_i915_private *dev_priv = dev->dev_private;
6360 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6361 int pipe = intel_crtc->pipe;
6362 bool visible = base != 0;
6363
6364 if (intel_crtc->cursor_visible != visible) {
Jesse Barnes548f2452011-02-17 10:40:53 -08006365 uint32_t cntl = I915_READ(CURCNTR(pipe));
Chris Wilson560b85b2010-08-07 11:01:38 +01006366 if (base) {
6367 cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
6368 cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
6369 cntl |= pipe << 28; /* Connect to correct pipe */
6370 } else {
6371 cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
6372 cntl |= CURSOR_MODE_DISABLE;
6373 }
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006374 I915_WRITE(CURCNTR(pipe), cntl);
Chris Wilson560b85b2010-08-07 11:01:38 +01006375
6376 intel_crtc->cursor_visible = visible;
6377 }
6378 /* and commit changes on next vblank */
Jesse Barnes9db4a9c2011-02-07 12:26:52 -08006379 I915_WRITE(CURBASE(pipe), base);
Chris Wilson560b85b2010-08-07 11:01:38 +01006380}
6381
Jesse Barnes65a21cd2011-10-12 11:10:21 -07006382static void ivb_update_cursor(struct drm_crtc *crtc, u32 base)
6383{
6384 struct drm_device *dev = crtc->dev;
6385 struct drm_i915_private *dev_priv = dev->dev_private;
6386 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6387 int pipe = intel_crtc->pipe;
6388 bool visible = base != 0;
6389
6390 if (intel_crtc->cursor_visible != visible) {
6391 uint32_t cntl = I915_READ(CURCNTR_IVB(pipe));
6392 if (base) {
6393 cntl &= ~CURSOR_MODE;
6394 cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
6395 } else {
6396 cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
6397 cntl |= CURSOR_MODE_DISABLE;
6398 }
Ville Syrjälä86d3efc2013-01-18 19:11:38 +02006399 if (IS_HASWELL(dev))
6400 cntl |= CURSOR_PIPE_CSC_ENABLE;
Jesse Barnes65a21cd2011-10-12 11:10:21 -07006401 I915_WRITE(CURCNTR_IVB(pipe), cntl);
6402
6403 intel_crtc->cursor_visible = visible;
6404 }
6405 /* and commit changes on next vblank */
6406 I915_WRITE(CURBASE_IVB(pipe), base);
6407}
6408
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006409/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
Chris Wilson6b383a72010-09-13 13:54:26 +01006410static void intel_crtc_update_cursor(struct drm_crtc *crtc,
6411 bool on)
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006412{
6413 struct drm_device *dev = crtc->dev;
6414 struct drm_i915_private *dev_priv = dev->dev_private;
6415 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6416 int pipe = intel_crtc->pipe;
6417 int x = intel_crtc->cursor_x;
6418 int y = intel_crtc->cursor_y;
Chris Wilson560b85b2010-08-07 11:01:38 +01006419 u32 base, pos;
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006420 bool visible;
6421
6422 pos = 0;
6423
Chris Wilson6b383a72010-09-13 13:54:26 +01006424 if (on && crtc->enabled && crtc->fb) {
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006425 base = intel_crtc->cursor_addr;
6426 if (x > (int) crtc->fb->width)
6427 base = 0;
6428
6429 if (y > (int) crtc->fb->height)
6430 base = 0;
6431 } else
6432 base = 0;
6433
6434 if (x < 0) {
6435 if (x + intel_crtc->cursor_width < 0)
6436 base = 0;
6437
6438 pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
6439 x = -x;
6440 }
6441 pos |= x << CURSOR_X_SHIFT;
6442
6443 if (y < 0) {
6444 if (y + intel_crtc->cursor_height < 0)
6445 base = 0;
6446
6447 pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
6448 y = -y;
6449 }
6450 pos |= y << CURSOR_Y_SHIFT;
6451
6452 visible = base != 0;
Chris Wilson560b85b2010-08-07 11:01:38 +01006453 if (!visible && !intel_crtc->cursor_visible)
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006454 return;
6455
Eugeni Dodonov0cd83aa2012-04-13 17:08:48 -03006456 if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) {
Jesse Barnes65a21cd2011-10-12 11:10:21 -07006457 I915_WRITE(CURPOS_IVB(pipe), pos);
6458 ivb_update_cursor(crtc, base);
6459 } else {
6460 I915_WRITE(CURPOS(pipe), pos);
6461 if (IS_845G(dev) || IS_I865G(dev))
6462 i845_update_cursor(crtc, base);
6463 else
6464 i9xx_update_cursor(crtc, base);
6465 }
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006466}
6467
Jesse Barnes79e53942008-11-07 14:24:08 -08006468static int intel_crtc_cursor_set(struct drm_crtc *crtc,
Chris Wilson05394f32010-11-08 19:18:58 +00006469 struct drm_file *file,
Jesse Barnes79e53942008-11-07 14:24:08 -08006470 uint32_t handle,
6471 uint32_t width, uint32_t height)
6472{
6473 struct drm_device *dev = crtc->dev;
6474 struct drm_i915_private *dev_priv = dev->dev_private;
6475 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Chris Wilson05394f32010-11-08 19:18:58 +00006476 struct drm_i915_gem_object *obj;
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006477 uint32_t addr;
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006478 int ret;
Jesse Barnes79e53942008-11-07 14:24:08 -08006479
Jesse Barnes79e53942008-11-07 14:24:08 -08006480 /* if we want to turn off the cursor ignore width and height */
6481 if (!handle) {
Zhao Yakui28c97732009-10-09 11:39:41 +08006482 DRM_DEBUG_KMS("cursor off\n");
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006483 addr = 0;
Chris Wilson05394f32010-11-08 19:18:58 +00006484 obj = NULL;
Pierre Willenbrock50044172009-02-23 10:12:15 +10006485 mutex_lock(&dev->struct_mutex);
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006486 goto finish;
Jesse Barnes79e53942008-11-07 14:24:08 -08006487 }
6488
6489 /* Currently we only support 64x64 cursors */
6490 if (width != 64 || height != 64) {
6491 DRM_ERROR("we currently only support 64x64 cursors\n");
6492 return -EINVAL;
6493 }
6494
Chris Wilson05394f32010-11-08 19:18:58 +00006495 obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
Chris Wilsonc8725222011-02-19 11:31:06 +00006496 if (&obj->base == NULL)
Jesse Barnes79e53942008-11-07 14:24:08 -08006497 return -ENOENT;
6498
Chris Wilson05394f32010-11-08 19:18:58 +00006499 if (obj->base.size < width * height * 4) {
Jesse Barnes79e53942008-11-07 14:24:08 -08006500 DRM_ERROR("buffer is to small\n");
Dave Airlie34b8686e2009-01-15 14:03:07 +10006501 ret = -ENOMEM;
6502 goto fail;
Jesse Barnes79e53942008-11-07 14:24:08 -08006503 }
6504
Dave Airlie71acb5e2008-12-30 20:31:46 +10006505 /* we only need to pin inside GTT if cursor is non-phy */
Kristian Høgsberg7f9872e2009-02-13 20:56:49 -05006506 mutex_lock(&dev->struct_mutex);
Kristian Høgsbergb295d1b2009-12-16 15:16:17 -05006507 if (!dev_priv->info->cursor_needs_physical) {
Chris Wilson693db182013-03-05 14:52:39 +00006508 unsigned alignment;
6509
Chris Wilsond9e86c02010-11-10 16:40:20 +00006510 if (obj->tiling_mode) {
6511 DRM_ERROR("cursor cannot be tiled\n");
6512 ret = -EINVAL;
6513 goto fail_locked;
6514 }
6515
Chris Wilson693db182013-03-05 14:52:39 +00006516 /* Note that the w/a also requires 2 PTE of padding following
6517 * the bo. We currently fill all unused PTE with the shadow
6518 * page and so we should always have valid PTE following the
6519 * cursor preventing the VT-d warning.
6520 */
6521 alignment = 0;
6522 if (need_vtd_wa(dev))
6523 alignment = 64*1024;
6524
6525 ret = i915_gem_object_pin_to_display_plane(obj, alignment, NULL);
Chris Wilsone7b526b2010-06-02 08:30:48 +01006526 if (ret) {
6527 DRM_ERROR("failed to move cursor bo into the GTT\n");
Chris Wilson2da3b9b2011-04-14 09:41:17 +01006528 goto fail_locked;
Chris Wilsone7b526b2010-06-02 08:30:48 +01006529 }
6530
Chris Wilsond9e86c02010-11-10 16:40:20 +00006531 ret = i915_gem_object_put_fence(obj);
6532 if (ret) {
Chris Wilson2da3b9b2011-04-14 09:41:17 +01006533 DRM_ERROR("failed to release fence for cursor");
Chris Wilsond9e86c02010-11-10 16:40:20 +00006534 goto fail_unpin;
6535 }
6536
Chris Wilson05394f32010-11-08 19:18:58 +00006537 addr = obj->gtt_offset;
Dave Airlie71acb5e2008-12-30 20:31:46 +10006538 } else {
Chris Wilson6eeefaf2010-08-07 11:01:39 +01006539 int align = IS_I830(dev) ? 16 * 1024 : 256;
Chris Wilson05394f32010-11-08 19:18:58 +00006540 ret = i915_gem_attach_phys_object(dev, obj,
Chris Wilson6eeefaf2010-08-07 11:01:39 +01006541 (intel_crtc->pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1,
6542 align);
Dave Airlie71acb5e2008-12-30 20:31:46 +10006543 if (ret) {
6544 DRM_ERROR("failed to attach phys object\n");
Kristian Høgsberg7f9872e2009-02-13 20:56:49 -05006545 goto fail_locked;
Dave Airlie71acb5e2008-12-30 20:31:46 +10006546 }
Chris Wilson05394f32010-11-08 19:18:58 +00006547 addr = obj->phys_obj->handle->busaddr;
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006548 }
6549
Chris Wilsona6c45cf2010-09-17 00:32:17 +01006550 if (IS_GEN2(dev))
Jesse Barnes14b60392009-05-20 16:47:08 -04006551 I915_WRITE(CURSIZE, (height << 12) | width);
6552
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006553 finish:
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006554 if (intel_crtc->cursor_bo) {
Kristian Høgsbergb295d1b2009-12-16 15:16:17 -05006555 if (dev_priv->info->cursor_needs_physical) {
Chris Wilson05394f32010-11-08 19:18:58 +00006556 if (intel_crtc->cursor_bo != obj)
Dave Airlie71acb5e2008-12-30 20:31:46 +10006557 i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo);
6558 } else
6559 i915_gem_object_unpin(intel_crtc->cursor_bo);
Chris Wilson05394f32010-11-08 19:18:58 +00006560 drm_gem_object_unreference(&intel_crtc->cursor_bo->base);
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006561 }
Jesse Barnes80824002009-09-10 15:28:06 -07006562
Kristian Høgsberg7f9872e2009-02-13 20:56:49 -05006563 mutex_unlock(&dev->struct_mutex);
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006564
6565 intel_crtc->cursor_addr = addr;
Chris Wilson05394f32010-11-08 19:18:58 +00006566 intel_crtc->cursor_bo = obj;
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006567 intel_crtc->cursor_width = width;
6568 intel_crtc->cursor_height = height;
6569
Chris Wilson6b383a72010-09-13 13:54:26 +01006570 intel_crtc_update_cursor(crtc, true);
Kristian Høgsberg3f8bc372008-12-17 22:14:59 -05006571
Jesse Barnes79e53942008-11-07 14:24:08 -08006572 return 0;
Chris Wilsone7b526b2010-06-02 08:30:48 +01006573fail_unpin:
Chris Wilson05394f32010-11-08 19:18:58 +00006574 i915_gem_object_unpin(obj);
Kristian Høgsberg7f9872e2009-02-13 20:56:49 -05006575fail_locked:
Dave Airlie34b8686e2009-01-15 14:03:07 +10006576 mutex_unlock(&dev->struct_mutex);
Luca Barbieribc9025b2010-02-09 05:49:12 +00006577fail:
Chris Wilson05394f32010-11-08 19:18:58 +00006578 drm_gem_object_unreference_unlocked(&obj->base);
Dave Airlie34b8686e2009-01-15 14:03:07 +10006579 return ret;
Jesse Barnes79e53942008-11-07 14:24:08 -08006580}
6581
6582static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
6583{
Jesse Barnes79e53942008-11-07 14:24:08 -08006584 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Jesse Barnes79e53942008-11-07 14:24:08 -08006585
Chris Wilsoncda4b7d2010-07-09 08:45:04 +01006586 intel_crtc->cursor_x = x;
6587 intel_crtc->cursor_y = y;
Jesse Barnes652c3932009-08-17 13:31:43 -07006588
Chris Wilson6b383a72010-09-13 13:54:26 +01006589 intel_crtc_update_cursor(crtc, true);
Jesse Barnes79e53942008-11-07 14:24:08 -08006590
6591 return 0;
6592}
6593
6594/** Sets the color ramps on behalf of RandR */
6595void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
6596 u16 blue, int regno)
6597{
6598 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6599
6600 intel_crtc->lut_r[regno] = red >> 8;
6601 intel_crtc->lut_g[regno] = green >> 8;
6602 intel_crtc->lut_b[regno] = blue >> 8;
6603}
6604
Dave Airlieb8c00ac2009-10-06 13:54:01 +10006605void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
6606 u16 *blue, int regno)
6607{
6608 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6609
6610 *red = intel_crtc->lut_r[regno] << 8;
6611 *green = intel_crtc->lut_g[regno] << 8;
6612 *blue = intel_crtc->lut_b[regno] << 8;
6613}
6614
Jesse Barnes79e53942008-11-07 14:24:08 -08006615static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
James Simmons72034252010-08-03 01:33:19 +01006616 u16 *blue, uint32_t start, uint32_t size)
Jesse Barnes79e53942008-11-07 14:24:08 -08006617{
James Simmons72034252010-08-03 01:33:19 +01006618 int end = (start + size > 256) ? 256 : start + size, i;
Jesse Barnes79e53942008-11-07 14:24:08 -08006619 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Jesse Barnes79e53942008-11-07 14:24:08 -08006620
James Simmons72034252010-08-03 01:33:19 +01006621 for (i = start; i < end; i++) {
Jesse Barnes79e53942008-11-07 14:24:08 -08006622 intel_crtc->lut_r[i] = red[i] >> 8;
6623 intel_crtc->lut_g[i] = green[i] >> 8;
6624 intel_crtc->lut_b[i] = blue[i] >> 8;
6625 }
6626
6627 intel_crtc_load_lut(crtc);
6628}
6629
Jesse Barnes79e53942008-11-07 14:24:08 -08006630/* VESA 640x480x72Hz mode to set on the pipe */
6631static struct drm_display_mode load_detect_mode = {
6632 DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 31500, 640, 664,
6633 704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
6634};
6635
Chris Wilsond2dff872011-04-19 08:36:26 +01006636static struct drm_framebuffer *
6637intel_framebuffer_create(struct drm_device *dev,
Jesse Barnes308e5bc2011-11-14 14:51:28 -08006638 struct drm_mode_fb_cmd2 *mode_cmd,
Chris Wilsond2dff872011-04-19 08:36:26 +01006639 struct drm_i915_gem_object *obj)
6640{
6641 struct intel_framebuffer *intel_fb;
6642 int ret;
6643
6644 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
6645 if (!intel_fb) {
6646 drm_gem_object_unreference_unlocked(&obj->base);
6647 return ERR_PTR(-ENOMEM);
6648 }
6649
6650 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj);
6651 if (ret) {
6652 drm_gem_object_unreference_unlocked(&obj->base);
6653 kfree(intel_fb);
6654 return ERR_PTR(ret);
6655 }
6656
6657 return &intel_fb->base;
6658}
6659
6660static u32
6661intel_framebuffer_pitch_for_width(int width, int bpp)
6662{
6663 u32 pitch = DIV_ROUND_UP(width * bpp, 8);
6664 return ALIGN(pitch, 64);
6665}
6666
6667static u32
6668intel_framebuffer_size_for_mode(struct drm_display_mode *mode, int bpp)
6669{
6670 u32 pitch = intel_framebuffer_pitch_for_width(mode->hdisplay, bpp);
6671 return ALIGN(pitch * mode->vdisplay, PAGE_SIZE);
6672}
6673
6674static struct drm_framebuffer *
6675intel_framebuffer_create_for_mode(struct drm_device *dev,
6676 struct drm_display_mode *mode,
6677 int depth, int bpp)
6678{
6679 struct drm_i915_gem_object *obj;
Chris Wilson0fed39b2012-11-05 22:25:07 +00006680 struct drm_mode_fb_cmd2 mode_cmd = { 0 };
Chris Wilsond2dff872011-04-19 08:36:26 +01006681
6682 obj = i915_gem_alloc_object(dev,
6683 intel_framebuffer_size_for_mode(mode, bpp));
6684 if (obj == NULL)
6685 return ERR_PTR(-ENOMEM);
6686
6687 mode_cmd.width = mode->hdisplay;
6688 mode_cmd.height = mode->vdisplay;
Jesse Barnes308e5bc2011-11-14 14:51:28 -08006689 mode_cmd.pitches[0] = intel_framebuffer_pitch_for_width(mode_cmd.width,
6690 bpp);
Dave Airlie5ca0c342012-02-23 15:33:40 +00006691 mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
Chris Wilsond2dff872011-04-19 08:36:26 +01006692
6693 return intel_framebuffer_create(dev, &mode_cmd, obj);
6694}
6695
6696static struct drm_framebuffer *
6697mode_fits_in_fbdev(struct drm_device *dev,
6698 struct drm_display_mode *mode)
6699{
6700 struct drm_i915_private *dev_priv = dev->dev_private;
6701 struct drm_i915_gem_object *obj;
6702 struct drm_framebuffer *fb;
6703
6704 if (dev_priv->fbdev == NULL)
6705 return NULL;
6706
6707 obj = dev_priv->fbdev->ifb.obj;
6708 if (obj == NULL)
6709 return NULL;
6710
6711 fb = &dev_priv->fbdev->ifb.base;
Ville Syrjälä01f2c772011-12-20 00:06:49 +02006712 if (fb->pitches[0] < intel_framebuffer_pitch_for_width(mode->hdisplay,
6713 fb->bits_per_pixel))
Chris Wilsond2dff872011-04-19 08:36:26 +01006714 return NULL;
6715
Ville Syrjälä01f2c772011-12-20 00:06:49 +02006716 if (obj->base.size < mode->vdisplay * fb->pitches[0])
Chris Wilsond2dff872011-04-19 08:36:26 +01006717 return NULL;
6718
6719 return fb;
6720}
6721
Daniel Vetterd2434ab2012-08-12 21:20:10 +02006722bool intel_get_load_detect_pipe(struct drm_connector *connector,
Chris Wilson71731882011-04-19 23:10:58 +01006723 struct drm_display_mode *mode,
Chris Wilson8261b192011-04-19 23:18:09 +01006724 struct intel_load_detect_pipe *old)
Jesse Barnes79e53942008-11-07 14:24:08 -08006725{
6726 struct intel_crtc *intel_crtc;
Daniel Vetterd2434ab2012-08-12 21:20:10 +02006727 struct intel_encoder *intel_encoder =
6728 intel_attached_encoder(connector);
Jesse Barnes79e53942008-11-07 14:24:08 -08006729 struct drm_crtc *possible_crtc;
Chris Wilson4ef69c72010-09-09 15:14:28 +01006730 struct drm_encoder *encoder = &intel_encoder->base;
Jesse Barnes79e53942008-11-07 14:24:08 -08006731 struct drm_crtc *crtc = NULL;
6732 struct drm_device *dev = encoder->dev;
Daniel Vetter94352cf2012-07-05 22:51:56 +02006733 struct drm_framebuffer *fb;
Jesse Barnes79e53942008-11-07 14:24:08 -08006734 int i = -1;
6735
Chris Wilsond2dff872011-04-19 08:36:26 +01006736 DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
6737 connector->base.id, drm_get_connector_name(connector),
6738 encoder->base.id, drm_get_encoder_name(encoder));
6739
Jesse Barnes79e53942008-11-07 14:24:08 -08006740 /*
6741 * Algorithm gets a little messy:
Chris Wilson7a5e4802011-04-19 23:21:12 +01006742 *
Jesse Barnes79e53942008-11-07 14:24:08 -08006743 * - if the connector already has an assigned crtc, use it (but make
6744 * sure it's on first)
Chris Wilson7a5e4802011-04-19 23:21:12 +01006745 *
Jesse Barnes79e53942008-11-07 14:24:08 -08006746 * - try to find the first unused crtc that can drive this connector,
6747 * and use that if we find one
Jesse Barnes79e53942008-11-07 14:24:08 -08006748 */
6749
6750 /* See if we already have a CRTC for this connector */
6751 if (encoder->crtc) {
6752 crtc = encoder->crtc;
Chris Wilson8261b192011-04-19 23:18:09 +01006753
Daniel Vetter7b240562012-12-12 00:35:33 +01006754 mutex_lock(&crtc->mutex);
6755
Daniel Vetter24218aa2012-08-12 19:27:11 +02006756 old->dpms_mode = connector->dpms;
Chris Wilson8261b192011-04-19 23:18:09 +01006757 old->load_detect_temp = false;
6758
6759 /* Make sure the crtc and connector are running */
Daniel Vetter24218aa2012-08-12 19:27:11 +02006760 if (connector->dpms != DRM_MODE_DPMS_ON)
6761 connector->funcs->dpms(connector, DRM_MODE_DPMS_ON);
Chris Wilson8261b192011-04-19 23:18:09 +01006762
Chris Wilson71731882011-04-19 23:10:58 +01006763 return true;
Jesse Barnes79e53942008-11-07 14:24:08 -08006764 }
6765
6766 /* Find an unused one (if possible) */
6767 list_for_each_entry(possible_crtc, &dev->mode_config.crtc_list, head) {
6768 i++;
6769 if (!(encoder->possible_crtcs & (1 << i)))
6770 continue;
6771 if (!possible_crtc->enabled) {
6772 crtc = possible_crtc;
6773 break;
6774 }
Jesse Barnes79e53942008-11-07 14:24:08 -08006775 }
6776
6777 /*
6778 * If we didn't find an unused CRTC, don't use any.
6779 */
6780 if (!crtc) {
Chris Wilson71731882011-04-19 23:10:58 +01006781 DRM_DEBUG_KMS("no pipe available for load-detect\n");
6782 return false;
Jesse Barnes79e53942008-11-07 14:24:08 -08006783 }
6784
Daniel Vetter7b240562012-12-12 00:35:33 +01006785 mutex_lock(&crtc->mutex);
Daniel Vetterfc303102012-07-09 10:40:58 +02006786 intel_encoder->new_crtc = to_intel_crtc(crtc);
6787 to_intel_connector(connector)->new_encoder = intel_encoder;
Jesse Barnes79e53942008-11-07 14:24:08 -08006788
6789 intel_crtc = to_intel_crtc(crtc);
Daniel Vetter24218aa2012-08-12 19:27:11 +02006790 old->dpms_mode = connector->dpms;
Chris Wilson8261b192011-04-19 23:18:09 +01006791 old->load_detect_temp = true;
Chris Wilsond2dff872011-04-19 08:36:26 +01006792 old->release_fb = NULL;
Jesse Barnes79e53942008-11-07 14:24:08 -08006793
Chris Wilson64927112011-04-20 07:25:26 +01006794 if (!mode)
6795 mode = &load_detect_mode;
Jesse Barnes79e53942008-11-07 14:24:08 -08006796
Chris Wilsond2dff872011-04-19 08:36:26 +01006797 /* We need a framebuffer large enough to accommodate all accesses
6798 * that the plane may generate whilst we perform load detection.
6799 * We can not rely on the fbcon either being present (we get called
6800 * during its initialisation to detect all boot displays, or it may
6801 * not even exist) or that it is large enough to satisfy the
6802 * requested mode.
6803 */
Daniel Vetter94352cf2012-07-05 22:51:56 +02006804 fb = mode_fits_in_fbdev(dev, mode);
6805 if (fb == NULL) {
Chris Wilsond2dff872011-04-19 08:36:26 +01006806 DRM_DEBUG_KMS("creating tmp fb for load-detection\n");
Daniel Vetter94352cf2012-07-05 22:51:56 +02006807 fb = intel_framebuffer_create_for_mode(dev, mode, 24, 32);
6808 old->release_fb = fb;
Chris Wilsond2dff872011-04-19 08:36:26 +01006809 } else
6810 DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n");
Daniel Vetter94352cf2012-07-05 22:51:56 +02006811 if (IS_ERR(fb)) {
Chris Wilsond2dff872011-04-19 08:36:26 +01006812 DRM_DEBUG_KMS("failed to allocate framebuffer for load-detection\n");
Daniel Vetter7b240562012-12-12 00:35:33 +01006813 mutex_unlock(&crtc->mutex);
Chris Wilson0e8b3d32012-11-05 22:25:08 +00006814 return false;
Jesse Barnes79e53942008-11-07 14:24:08 -08006815 }
Chris Wilsond2dff872011-04-19 08:36:26 +01006816
Chris Wilsonc0c36b942012-12-19 16:08:43 +00006817 if (intel_set_mode(crtc, mode, 0, 0, fb)) {
Chris Wilson64927112011-04-20 07:25:26 +01006818 DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
Chris Wilsond2dff872011-04-19 08:36:26 +01006819 if (old->release_fb)
6820 old->release_fb->funcs->destroy(old->release_fb);
Daniel Vetter7b240562012-12-12 00:35:33 +01006821 mutex_unlock(&crtc->mutex);
Chris Wilson0e8b3d32012-11-05 22:25:08 +00006822 return false;
Jesse Barnes79e53942008-11-07 14:24:08 -08006823 }
Chris Wilson71731882011-04-19 23:10:58 +01006824
Jesse Barnes79e53942008-11-07 14:24:08 -08006825 /* let the connector get through one full cycle before testing */
Jesse Barnes9d0498a2010-08-18 13:20:54 -07006826 intel_wait_for_vblank(dev, intel_crtc->pipe);
Chris Wilson71731882011-04-19 23:10:58 +01006827 return true;
Jesse Barnes79e53942008-11-07 14:24:08 -08006828}
6829
Daniel Vetterd2434ab2012-08-12 21:20:10 +02006830void intel_release_load_detect_pipe(struct drm_connector *connector,
Chris Wilson8261b192011-04-19 23:18:09 +01006831 struct intel_load_detect_pipe *old)
Jesse Barnes79e53942008-11-07 14:24:08 -08006832{
Daniel Vetterd2434ab2012-08-12 21:20:10 +02006833 struct intel_encoder *intel_encoder =
6834 intel_attached_encoder(connector);
Chris Wilson4ef69c72010-09-09 15:14:28 +01006835 struct drm_encoder *encoder = &intel_encoder->base;
Daniel Vetter7b240562012-12-12 00:35:33 +01006836 struct drm_crtc *crtc = encoder->crtc;
Jesse Barnes79e53942008-11-07 14:24:08 -08006837
Chris Wilsond2dff872011-04-19 08:36:26 +01006838 DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
6839 connector->base.id, drm_get_connector_name(connector),
6840 encoder->base.id, drm_get_encoder_name(encoder));
6841
Chris Wilson8261b192011-04-19 23:18:09 +01006842 if (old->load_detect_temp) {
Daniel Vetterfc303102012-07-09 10:40:58 +02006843 to_intel_connector(connector)->new_encoder = NULL;
6844 intel_encoder->new_crtc = NULL;
6845 intel_set_mode(crtc, NULL, 0, 0, NULL);
Chris Wilsond2dff872011-04-19 08:36:26 +01006846
Daniel Vetter36206362012-12-10 20:42:17 +01006847 if (old->release_fb) {
6848 drm_framebuffer_unregister_private(old->release_fb);
6849 drm_framebuffer_unreference(old->release_fb);
6850 }
Chris Wilsond2dff872011-04-19 08:36:26 +01006851
Daniel Vetter67c96402013-01-23 16:25:09 +00006852 mutex_unlock(&crtc->mutex);
Chris Wilson0622a532011-04-21 09:32:11 +01006853 return;
Jesse Barnes79e53942008-11-07 14:24:08 -08006854 }
6855
Eric Anholtc751ce42010-03-25 11:48:48 -07006856 /* Switch crtc and encoder back off if necessary */
Daniel Vetter24218aa2012-08-12 19:27:11 +02006857 if (old->dpms_mode != DRM_MODE_DPMS_ON)
6858 connector->funcs->dpms(connector, old->dpms_mode);
Daniel Vetter7b240562012-12-12 00:35:33 +01006859
6860 mutex_unlock(&crtc->mutex);
Jesse Barnes79e53942008-11-07 14:24:08 -08006861}
6862
6863/* Returns the clock of the currently programmed mode of the given pipe. */
6864static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)
6865{
6866 struct drm_i915_private *dev_priv = dev->dev_private;
6867 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6868 int pipe = intel_crtc->pipe;
Jesse Barnes548f2452011-02-17 10:40:53 -08006869 u32 dpll = I915_READ(DPLL(pipe));
Jesse Barnes79e53942008-11-07 14:24:08 -08006870 u32 fp;
6871 intel_clock_t clock;
6872
6873 if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
Chris Wilson39adb7a2011-04-22 22:17:21 +01006874 fp = I915_READ(FP0(pipe));
Jesse Barnes79e53942008-11-07 14:24:08 -08006875 else
Chris Wilson39adb7a2011-04-22 22:17:21 +01006876 fp = I915_READ(FP1(pipe));
Jesse Barnes79e53942008-11-07 14:24:08 -08006877
6878 clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
Adam Jacksonf2b115e2009-12-03 17:14:42 -05006879 if (IS_PINEVIEW(dev)) {
6880 clock.n = ffs((fp & FP_N_PINEVIEW_DIV_MASK) >> FP_N_DIV_SHIFT) - 1;
6881 clock.m2 = (fp & FP_M2_PINEVIEW_DIV_MASK) >> FP_M2_DIV_SHIFT;
Shaohua Li21778322009-02-23 15:19:16 +08006882 } else {
6883 clock.n = (fp & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT;
6884 clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT;
6885 }
6886
Chris Wilsona6c45cf2010-09-17 00:32:17 +01006887 if (!IS_GEN2(dev)) {
Adam Jacksonf2b115e2009-12-03 17:14:42 -05006888 if (IS_PINEVIEW(dev))
6889 clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW) >>
6890 DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW);
Shaohua Li21778322009-02-23 15:19:16 +08006891 else
6892 clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK) >>
Jesse Barnes79e53942008-11-07 14:24:08 -08006893 DPLL_FPA01_P1_POST_DIV_SHIFT);
6894
6895 switch (dpll & DPLL_MODE_MASK) {
6896 case DPLLB_MODE_DAC_SERIAL:
6897 clock.p2 = dpll & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ?
6898 5 : 10;
6899 break;
6900 case DPLLB_MODE_LVDS:
6901 clock.p2 = dpll & DPLLB_LVDS_P2_CLOCK_DIV_7 ?
6902 7 : 14;
6903 break;
6904 default:
Zhao Yakui28c97732009-10-09 11:39:41 +08006905 DRM_DEBUG_KMS("Unknown DPLL mode %08x in programmed "
Jesse Barnes79e53942008-11-07 14:24:08 -08006906 "mode\n", (int)(dpll & DPLL_MODE_MASK));
6907 return 0;
6908 }
6909
6910 /* XXX: Handle the 100Mhz refclk */
Shaohua Li21778322009-02-23 15:19:16 +08006911 intel_clock(dev, 96000, &clock);
Jesse Barnes79e53942008-11-07 14:24:08 -08006912 } else {
6913 bool is_lvds = (pipe == 1) && (I915_READ(LVDS) & LVDS_PORT_EN);
6914
6915 if (is_lvds) {
6916 clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS) >>
6917 DPLL_FPA01_P1_POST_DIV_SHIFT);
6918 clock.p2 = 14;
6919
6920 if ((dpll & PLL_REF_INPUT_MASK) ==
6921 PLLB_REF_INPUT_SPREADSPECTRUMIN) {
6922 /* XXX: might not be 66MHz */
Shaohua Li21778322009-02-23 15:19:16 +08006923 intel_clock(dev, 66000, &clock);
Jesse Barnes79e53942008-11-07 14:24:08 -08006924 } else
Shaohua Li21778322009-02-23 15:19:16 +08006925 intel_clock(dev, 48000, &clock);
Jesse Barnes79e53942008-11-07 14:24:08 -08006926 } else {
6927 if (dpll & PLL_P1_DIVIDE_BY_TWO)
6928 clock.p1 = 2;
6929 else {
6930 clock.p1 = ((dpll & DPLL_FPA01_P1_POST_DIV_MASK_I830) >>
6931 DPLL_FPA01_P1_POST_DIV_SHIFT) + 2;
6932 }
6933 if (dpll & PLL_P2_DIVIDE_BY_4)
6934 clock.p2 = 4;
6935 else
6936 clock.p2 = 2;
6937
Shaohua Li21778322009-02-23 15:19:16 +08006938 intel_clock(dev, 48000, &clock);
Jesse Barnes79e53942008-11-07 14:24:08 -08006939 }
6940 }
6941
6942 /* XXX: It would be nice to validate the clocks, but we can't reuse
6943 * i830PllIsValid() because it relies on the xf86_config connector
6944 * configuration being accurate, which it isn't necessarily.
6945 */
6946
6947 return clock.dot;
6948}
6949
6950/** Returns the currently programmed mode of the given pipe. */
6951struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
6952 struct drm_crtc *crtc)
6953{
Jesse Barnes548f2452011-02-17 10:40:53 -08006954 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes79e53942008-11-07 14:24:08 -08006955 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter3b117c82013-04-17 20:15:07 +02006956 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
Jesse Barnes79e53942008-11-07 14:24:08 -08006957 struct drm_display_mode *mode;
Paulo Zanonife2b8f92012-10-23 18:30:02 -02006958 int htot = I915_READ(HTOTAL(cpu_transcoder));
6959 int hsync = I915_READ(HSYNC(cpu_transcoder));
6960 int vtot = I915_READ(VTOTAL(cpu_transcoder));
6961 int vsync = I915_READ(VSYNC(cpu_transcoder));
Jesse Barnes79e53942008-11-07 14:24:08 -08006962
6963 mode = kzalloc(sizeof(*mode), GFP_KERNEL);
6964 if (!mode)
6965 return NULL;
6966
6967 mode->clock = intel_crtc_clock_get(dev, crtc);
6968 mode->hdisplay = (htot & 0xffff) + 1;
6969 mode->htotal = ((htot & 0xffff0000) >> 16) + 1;
6970 mode->hsync_start = (hsync & 0xffff) + 1;
6971 mode->hsync_end = ((hsync & 0xffff0000) >> 16) + 1;
6972 mode->vdisplay = (vtot & 0xffff) + 1;
6973 mode->vtotal = ((vtot & 0xffff0000) >> 16) + 1;
6974 mode->vsync_start = (vsync & 0xffff) + 1;
6975 mode->vsync_end = ((vsync & 0xffff0000) >> 16) + 1;
6976
6977 drm_mode_set_name(mode);
Jesse Barnes79e53942008-11-07 14:24:08 -08006978
6979 return mode;
6980}
6981
Daniel Vetter3dec0092010-08-20 21:40:52 +02006982static void intel_increase_pllclock(struct drm_crtc *crtc)
Jesse Barnes652c3932009-08-17 13:31:43 -07006983{
6984 struct drm_device *dev = crtc->dev;
6985 drm_i915_private_t *dev_priv = dev->dev_private;
6986 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6987 int pipe = intel_crtc->pipe;
Jesse Barnesdbdc6472010-12-30 09:36:39 -08006988 int dpll_reg = DPLL(pipe);
6989 int dpll;
Jesse Barnes652c3932009-08-17 13:31:43 -07006990
Eric Anholtbad720f2009-10-22 16:11:14 -07006991 if (HAS_PCH_SPLIT(dev))
Jesse Barnes652c3932009-08-17 13:31:43 -07006992 return;
6993
6994 if (!dev_priv->lvds_downclock_avail)
6995 return;
6996
Jesse Barnesdbdc6472010-12-30 09:36:39 -08006997 dpll = I915_READ(dpll_reg);
Jesse Barnes652c3932009-08-17 13:31:43 -07006998 if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) {
Zhao Yakui44d98a62009-10-09 11:39:40 +08006999 DRM_DEBUG_DRIVER("upclocking LVDS\n");
Jesse Barnes652c3932009-08-17 13:31:43 -07007000
Sean Paul8ac5a6d2012-02-13 13:14:51 -05007001 assert_panel_unlocked(dev_priv, pipe);
Jesse Barnes652c3932009-08-17 13:31:43 -07007002
7003 dpll &= ~DISPLAY_RATE_SELECT_FPA1;
7004 I915_WRITE(dpll_reg, dpll);
Jesse Barnes9d0498a2010-08-18 13:20:54 -07007005 intel_wait_for_vblank(dev, pipe);
Jesse Barnesdbdc6472010-12-30 09:36:39 -08007006
Jesse Barnes652c3932009-08-17 13:31:43 -07007007 dpll = I915_READ(dpll_reg);
7008 if (dpll & DISPLAY_RATE_SELECT_FPA1)
Zhao Yakui44d98a62009-10-09 11:39:40 +08007009 DRM_DEBUG_DRIVER("failed to upclock LVDS!\n");
Jesse Barnes652c3932009-08-17 13:31:43 -07007010 }
Jesse Barnes652c3932009-08-17 13:31:43 -07007011}
7012
7013static void intel_decrease_pllclock(struct drm_crtc *crtc)
7014{
7015 struct drm_device *dev = crtc->dev;
7016 drm_i915_private_t *dev_priv = dev->dev_private;
7017 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Jesse Barnes652c3932009-08-17 13:31:43 -07007018
Eric Anholtbad720f2009-10-22 16:11:14 -07007019 if (HAS_PCH_SPLIT(dev))
Jesse Barnes652c3932009-08-17 13:31:43 -07007020 return;
7021
7022 if (!dev_priv->lvds_downclock_avail)
7023 return;
7024
7025 /*
7026 * Since this is called by a timer, we should never get here in
7027 * the manual case.
7028 */
7029 if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) {
Chris Wilson074b5e12012-05-02 12:07:06 +01007030 int pipe = intel_crtc->pipe;
7031 int dpll_reg = DPLL(pipe);
Daniel Vetterdc257cf2012-05-07 11:30:46 +02007032 int dpll;
Chris Wilson074b5e12012-05-02 12:07:06 +01007033
Zhao Yakui44d98a62009-10-09 11:39:40 +08007034 DRM_DEBUG_DRIVER("downclocking LVDS\n");
Jesse Barnes652c3932009-08-17 13:31:43 -07007035
Sean Paul8ac5a6d2012-02-13 13:14:51 -05007036 assert_panel_unlocked(dev_priv, pipe);
Jesse Barnes652c3932009-08-17 13:31:43 -07007037
Chris Wilson074b5e12012-05-02 12:07:06 +01007038 dpll = I915_READ(dpll_reg);
Jesse Barnes652c3932009-08-17 13:31:43 -07007039 dpll |= DISPLAY_RATE_SELECT_FPA1;
7040 I915_WRITE(dpll_reg, dpll);
Jesse Barnes9d0498a2010-08-18 13:20:54 -07007041 intel_wait_for_vblank(dev, pipe);
Jesse Barnes652c3932009-08-17 13:31:43 -07007042 dpll = I915_READ(dpll_reg);
7043 if (!(dpll & DISPLAY_RATE_SELECT_FPA1))
Zhao Yakui44d98a62009-10-09 11:39:40 +08007044 DRM_DEBUG_DRIVER("failed to downclock LVDS!\n");
Jesse Barnes652c3932009-08-17 13:31:43 -07007045 }
7046
7047}
7048
Chris Wilsonf047e392012-07-21 12:31:41 +01007049void intel_mark_busy(struct drm_device *dev)
Jesse Barnes652c3932009-08-17 13:31:43 -07007050{
Chris Wilsonf047e392012-07-21 12:31:41 +01007051 i915_update_gfx_val(dev->dev_private);
7052}
7053
7054void intel_mark_idle(struct drm_device *dev)
7055{
Chris Wilson725a5b52013-01-08 11:02:57 +00007056 struct drm_crtc *crtc;
7057
7058 if (!i915_powersave)
7059 return;
7060
7061 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
7062 if (!crtc->fb)
7063 continue;
7064
7065 intel_decrease_pllclock(crtc);
7066 }
Chris Wilsonf047e392012-07-21 12:31:41 +01007067}
7068
7069void intel_mark_fb_busy(struct drm_i915_gem_object *obj)
7070{
7071 struct drm_device *dev = obj->base.dev;
Jesse Barnes652c3932009-08-17 13:31:43 -07007072 struct drm_crtc *crtc;
Jesse Barnes652c3932009-08-17 13:31:43 -07007073
7074 if (!i915_powersave)
7075 return;
7076
Jesse Barnes652c3932009-08-17 13:31:43 -07007077 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
Jesse Barnes652c3932009-08-17 13:31:43 -07007078 if (!crtc->fb)
7079 continue;
7080
Chris Wilsonf047e392012-07-21 12:31:41 +01007081 if (to_intel_framebuffer(crtc->fb)->obj == obj)
7082 intel_increase_pllclock(crtc);
Jesse Barnes652c3932009-08-17 13:31:43 -07007083 }
Jesse Barnes652c3932009-08-17 13:31:43 -07007084}
7085
Jesse Barnes79e53942008-11-07 14:24:08 -08007086static void intel_crtc_destroy(struct drm_crtc *crtc)
7087{
7088 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter67e77c52010-08-20 22:26:30 +02007089 struct drm_device *dev = crtc->dev;
7090 struct intel_unpin_work *work;
7091 unsigned long flags;
7092
7093 spin_lock_irqsave(&dev->event_lock, flags);
7094 work = intel_crtc->unpin_work;
7095 intel_crtc->unpin_work = NULL;
7096 spin_unlock_irqrestore(&dev->event_lock, flags);
7097
7098 if (work) {
7099 cancel_work_sync(&work->work);
7100 kfree(work);
7101 }
Jesse Barnes79e53942008-11-07 14:24:08 -08007102
7103 drm_crtc_cleanup(crtc);
Daniel Vetter67e77c52010-08-20 22:26:30 +02007104
Jesse Barnes79e53942008-11-07 14:24:08 -08007105 kfree(intel_crtc);
7106}
7107
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007108static void intel_unpin_work_fn(struct work_struct *__work)
7109{
7110 struct intel_unpin_work *work =
7111 container_of(__work, struct intel_unpin_work, work);
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007112 struct drm_device *dev = work->crtc->dev;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007113
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007114 mutex_lock(&dev->struct_mutex);
Chris Wilson1690e1e2011-12-14 13:57:08 +01007115 intel_unpin_fb_obj(work->old_fb_obj);
Chris Wilson05394f32010-11-08 19:18:58 +00007116 drm_gem_object_unreference(&work->pending_flip_obj->base);
7117 drm_gem_object_unreference(&work->old_fb_obj->base);
Chris Wilsond9e86c02010-11-10 16:40:20 +00007118
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007119 intel_update_fbc(dev);
7120 mutex_unlock(&dev->struct_mutex);
7121
7122 BUG_ON(atomic_read(&to_intel_crtc(work->crtc)->unpin_work_count) == 0);
7123 atomic_dec(&to_intel_crtc(work->crtc)->unpin_work_count);
7124
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007125 kfree(work);
7126}
7127
Jesse Barnes1afe3e92010-03-26 10:35:20 -07007128static void do_intel_finish_page_flip(struct drm_device *dev,
Mario Kleiner49b14a52010-12-09 07:00:07 +01007129 struct drm_crtc *crtc)
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007130{
7131 drm_i915_private_t *dev_priv = dev->dev_private;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007132 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
7133 struct intel_unpin_work *work;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007134 unsigned long flags;
7135
7136 /* Ignore early vblank irqs */
7137 if (intel_crtc == NULL)
7138 return;
7139
7140 spin_lock_irqsave(&dev->event_lock, flags);
7141 work = intel_crtc->unpin_work;
Chris Wilsone7d841c2012-12-03 11:36:30 +00007142
7143 /* Ensure we don't miss a work->pending update ... */
7144 smp_rmb();
7145
7146 if (work == NULL || atomic_read(&work->pending) < INTEL_FLIP_COMPLETE) {
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007147 spin_unlock_irqrestore(&dev->event_lock, flags);
7148 return;
7149 }
7150
Chris Wilsone7d841c2012-12-03 11:36:30 +00007151 /* and that the unpin work is consistent wrt ->pending. */
7152 smp_rmb();
7153
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007154 intel_crtc->unpin_work = NULL;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007155
Rob Clark45a066e2012-10-08 14:50:40 -05007156 if (work->event)
7157 drm_send_vblank_event(dev, intel_crtc->pipe, work->event);
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007158
Mario Kleiner0af7e4d2010-12-08 04:07:19 +01007159 drm_vblank_put(dev, intel_crtc->pipe);
7160
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007161 spin_unlock_irqrestore(&dev->event_lock, flags);
7162
Daniel Vetter2c10d572012-12-20 21:24:07 +01007163 wake_up_all(&dev_priv->pending_flip_queue);
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007164
7165 queue_work(dev_priv->wq, &work->work);
Jesse Barnese5510fa2010-07-01 16:48:37 -07007166
7167 trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj);
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007168}
7169
Jesse Barnes1afe3e92010-03-26 10:35:20 -07007170void intel_finish_page_flip(struct drm_device *dev, int pipe)
7171{
7172 drm_i915_private_t *dev_priv = dev->dev_private;
7173 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
7174
Mario Kleiner49b14a52010-12-09 07:00:07 +01007175 do_intel_finish_page_flip(dev, crtc);
Jesse Barnes1afe3e92010-03-26 10:35:20 -07007176}
7177
7178void intel_finish_page_flip_plane(struct drm_device *dev, int plane)
7179{
7180 drm_i915_private_t *dev_priv = dev->dev_private;
7181 struct drm_crtc *crtc = dev_priv->plane_to_crtc_mapping[plane];
7182
Mario Kleiner49b14a52010-12-09 07:00:07 +01007183 do_intel_finish_page_flip(dev, crtc);
Jesse Barnes1afe3e92010-03-26 10:35:20 -07007184}
7185
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007186void intel_prepare_page_flip(struct drm_device *dev, int plane)
7187{
7188 drm_i915_private_t *dev_priv = dev->dev_private;
7189 struct intel_crtc *intel_crtc =
7190 to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]);
7191 unsigned long flags;
7192
Chris Wilsone7d841c2012-12-03 11:36:30 +00007193 /* NB: An MMIO update of the plane base pointer will also
7194 * generate a page-flip completion irq, i.e. every modeset
7195 * is also accompanied by a spurious intel_prepare_page_flip().
7196 */
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007197 spin_lock_irqsave(&dev->event_lock, flags);
Chris Wilsone7d841c2012-12-03 11:36:30 +00007198 if (intel_crtc->unpin_work)
7199 atomic_inc_not_zero(&intel_crtc->unpin_work->pending);
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007200 spin_unlock_irqrestore(&dev->event_lock, flags);
7201}
7202
Chris Wilsone7d841c2012-12-03 11:36:30 +00007203inline static void intel_mark_page_flip_active(struct intel_crtc *intel_crtc)
7204{
7205 /* Ensure that the work item is consistent when activating it ... */
7206 smp_wmb();
7207 atomic_set(&intel_crtc->unpin_work->pending, INTEL_FLIP_PENDING);
7208 /* and that it is marked active as soon as the irq could fire. */
7209 smp_wmb();
7210}
7211
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007212static int intel_gen2_queue_flip(struct drm_device *dev,
7213 struct drm_crtc *crtc,
7214 struct drm_framebuffer *fb,
7215 struct drm_i915_gem_object *obj)
7216{
7217 struct drm_i915_private *dev_priv = dev->dev_private;
7218 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007219 u32 flip_mask;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007220 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007221 int ret;
7222
Daniel Vetter6d90c952012-04-26 23:28:05 +02007223 ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007224 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007225 goto err;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007226
Daniel Vetter6d90c952012-04-26 23:28:05 +02007227 ret = intel_ring_begin(ring, 6);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007228 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007229 goto err_unpin;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007230
7231 /* Can't queue multiple flips, so wait for the previous
7232 * one to finish before executing the next.
7233 */
7234 if (intel_crtc->plane)
7235 flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
7236 else
7237 flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007238 intel_ring_emit(ring, MI_WAIT_FOR_EVENT | flip_mask);
7239 intel_ring_emit(ring, MI_NOOP);
7240 intel_ring_emit(ring, MI_DISPLAY_FLIP |
7241 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
7242 intel_ring_emit(ring, fb->pitches[0]);
Daniel Vettere506a0c2012-07-05 12:17:29 +02007243 intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007244 intel_ring_emit(ring, 0); /* aux display base address, unused */
Chris Wilsone7d841c2012-12-03 11:36:30 +00007245
7246 intel_mark_page_flip_active(intel_crtc);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007247 intel_ring_advance(ring);
Chris Wilson83d40922012-04-17 19:35:53 +01007248 return 0;
7249
7250err_unpin:
7251 intel_unpin_fb_obj(obj);
7252err:
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007253 return ret;
7254}
7255
7256static int intel_gen3_queue_flip(struct drm_device *dev,
7257 struct drm_crtc *crtc,
7258 struct drm_framebuffer *fb,
7259 struct drm_i915_gem_object *obj)
7260{
7261 struct drm_i915_private *dev_priv = dev->dev_private;
7262 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007263 u32 flip_mask;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007264 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007265 int ret;
7266
Daniel Vetter6d90c952012-04-26 23:28:05 +02007267 ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007268 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007269 goto err;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007270
Daniel Vetter6d90c952012-04-26 23:28:05 +02007271 ret = intel_ring_begin(ring, 6);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007272 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007273 goto err_unpin;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007274
7275 if (intel_crtc->plane)
7276 flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
7277 else
7278 flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007279 intel_ring_emit(ring, MI_WAIT_FOR_EVENT | flip_mask);
7280 intel_ring_emit(ring, MI_NOOP);
7281 intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 |
7282 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
7283 intel_ring_emit(ring, fb->pitches[0]);
Daniel Vettere506a0c2012-07-05 12:17:29 +02007284 intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007285 intel_ring_emit(ring, MI_NOOP);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007286
Chris Wilsone7d841c2012-12-03 11:36:30 +00007287 intel_mark_page_flip_active(intel_crtc);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007288 intel_ring_advance(ring);
Chris Wilson83d40922012-04-17 19:35:53 +01007289 return 0;
7290
7291err_unpin:
7292 intel_unpin_fb_obj(obj);
7293err:
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007294 return ret;
7295}
7296
7297static int intel_gen4_queue_flip(struct drm_device *dev,
7298 struct drm_crtc *crtc,
7299 struct drm_framebuffer *fb,
7300 struct drm_i915_gem_object *obj)
7301{
7302 struct drm_i915_private *dev_priv = dev->dev_private;
7303 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
7304 uint32_t pf, pipesrc;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007305 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007306 int ret;
7307
Daniel Vetter6d90c952012-04-26 23:28:05 +02007308 ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007309 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007310 goto err;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007311
Daniel Vetter6d90c952012-04-26 23:28:05 +02007312 ret = intel_ring_begin(ring, 4);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007313 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007314 goto err_unpin;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007315
7316 /* i965+ uses the linear or tiled offsets from the
7317 * Display Registers (which do not change across a page-flip)
7318 * so we need only reprogram the base address.
7319 */
Daniel Vetter6d90c952012-04-26 23:28:05 +02007320 intel_ring_emit(ring, MI_DISPLAY_FLIP |
7321 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
7322 intel_ring_emit(ring, fb->pitches[0]);
Daniel Vetterc2c75132012-07-05 12:17:30 +02007323 intel_ring_emit(ring,
7324 (obj->gtt_offset + intel_crtc->dspaddr_offset) |
7325 obj->tiling_mode);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007326
7327 /* XXX Enabling the panel-fitter across page-flip is so far
7328 * untested on non-native modes, so ignore it for now.
7329 * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
7330 */
7331 pf = 0;
7332 pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007333 intel_ring_emit(ring, pf | pipesrc);
Chris Wilsone7d841c2012-12-03 11:36:30 +00007334
7335 intel_mark_page_flip_active(intel_crtc);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007336 intel_ring_advance(ring);
Chris Wilson83d40922012-04-17 19:35:53 +01007337 return 0;
7338
7339err_unpin:
7340 intel_unpin_fb_obj(obj);
7341err:
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007342 return ret;
7343}
7344
7345static int intel_gen6_queue_flip(struct drm_device *dev,
7346 struct drm_crtc *crtc,
7347 struct drm_framebuffer *fb,
7348 struct drm_i915_gem_object *obj)
7349{
7350 struct drm_i915_private *dev_priv = dev->dev_private;
7351 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007352 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007353 uint32_t pf, pipesrc;
7354 int ret;
7355
Daniel Vetter6d90c952012-04-26 23:28:05 +02007356 ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007357 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007358 goto err;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007359
Daniel Vetter6d90c952012-04-26 23:28:05 +02007360 ret = intel_ring_begin(ring, 4);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007361 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007362 goto err_unpin;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007363
Daniel Vetter6d90c952012-04-26 23:28:05 +02007364 intel_ring_emit(ring, MI_DISPLAY_FLIP |
7365 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
7366 intel_ring_emit(ring, fb->pitches[0] | obj->tiling_mode);
Daniel Vetterc2c75132012-07-05 12:17:30 +02007367 intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset);
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007368
Chris Wilson99d9acd2012-04-17 20:37:00 +01007369 /* Contrary to the suggestions in the documentation,
7370 * "Enable Panel Fitter" does not seem to be required when page
7371 * flipping with a non-native mode, and worse causes a normal
7372 * modeset to fail.
7373 * pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
7374 */
7375 pf = 0;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007376 pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
Daniel Vetter6d90c952012-04-26 23:28:05 +02007377 intel_ring_emit(ring, pf | pipesrc);
Chris Wilsone7d841c2012-12-03 11:36:30 +00007378
7379 intel_mark_page_flip_active(intel_crtc);
Daniel Vetter6d90c952012-04-26 23:28:05 +02007380 intel_ring_advance(ring);
Chris Wilson83d40922012-04-17 19:35:53 +01007381 return 0;
7382
7383err_unpin:
7384 intel_unpin_fb_obj(obj);
7385err:
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007386 return ret;
7387}
7388
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007389/*
7390 * On gen7 we currently use the blit ring because (in early silicon at least)
7391 * the render ring doesn't give us interrpts for page flip completion, which
7392 * means clients will hang after the first flip is queued. Fortunately the
7393 * blit ring generates interrupts properly, so use it instead.
7394 */
7395static int intel_gen7_queue_flip(struct drm_device *dev,
7396 struct drm_crtc *crtc,
7397 struct drm_framebuffer *fb,
7398 struct drm_i915_gem_object *obj)
7399{
7400 struct drm_i915_private *dev_priv = dev->dev_private;
7401 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
7402 struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
Daniel Vettercb05d8d2012-05-23 14:02:00 +02007403 uint32_t plane_bit = 0;
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007404 int ret;
7405
7406 ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
7407 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007408 goto err;
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007409
Daniel Vettercb05d8d2012-05-23 14:02:00 +02007410 switch(intel_crtc->plane) {
7411 case PLANE_A:
7412 plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_A;
7413 break;
7414 case PLANE_B:
7415 plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_B;
7416 break;
7417 case PLANE_C:
7418 plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_C;
7419 break;
7420 default:
7421 WARN_ONCE(1, "unknown plane in flip command\n");
7422 ret = -ENODEV;
Eugeni Dodonovab3951e2012-06-18 19:03:38 -03007423 goto err_unpin;
Daniel Vettercb05d8d2012-05-23 14:02:00 +02007424 }
7425
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007426 ret = intel_ring_begin(ring, 4);
7427 if (ret)
Chris Wilson83d40922012-04-17 19:35:53 +01007428 goto err_unpin;
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007429
Daniel Vettercb05d8d2012-05-23 14:02:00 +02007430 intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit);
Ville Syrjälä01f2c772011-12-20 00:06:49 +02007431 intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode));
Daniel Vetterc2c75132012-07-05 12:17:30 +02007432 intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset);
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007433 intel_ring_emit(ring, (MI_NOOP));
Chris Wilsone7d841c2012-12-03 11:36:30 +00007434
7435 intel_mark_page_flip_active(intel_crtc);
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007436 intel_ring_advance(ring);
Chris Wilson83d40922012-04-17 19:35:53 +01007437 return 0;
7438
7439err_unpin:
7440 intel_unpin_fb_obj(obj);
7441err:
Jesse Barnes7c9017e2011-06-16 12:18:54 -07007442 return ret;
7443}
7444
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007445static int intel_default_queue_flip(struct drm_device *dev,
7446 struct drm_crtc *crtc,
7447 struct drm_framebuffer *fb,
7448 struct drm_i915_gem_object *obj)
7449{
7450 return -ENODEV;
7451}
7452
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007453static int intel_crtc_page_flip(struct drm_crtc *crtc,
7454 struct drm_framebuffer *fb,
7455 struct drm_pending_vblank_event *event)
7456{
7457 struct drm_device *dev = crtc->dev;
7458 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjälä4a35f832013-02-22 16:53:38 +02007459 struct drm_framebuffer *old_fb = crtc->fb;
7460 struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007461 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
7462 struct intel_unpin_work *work;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007463 unsigned long flags;
Chris Wilson52e68632010-08-08 10:15:59 +01007464 int ret;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007465
Ville Syrjäläe6a595d2012-05-24 21:08:59 +03007466 /* Can't change pixel format via MI display flips. */
7467 if (fb->pixel_format != crtc->fb->pixel_format)
7468 return -EINVAL;
7469
7470 /*
7471 * TILEOFF/LINOFF registers can't be changed via MI display flips.
7472 * Note that pitch changes could also affect these register.
7473 */
7474 if (INTEL_INFO(dev)->gen > 3 &&
7475 (fb->offsets[0] != crtc->fb->offsets[0] ||
7476 fb->pitches[0] != crtc->fb->pitches[0]))
7477 return -EINVAL;
7478
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007479 work = kzalloc(sizeof *work, GFP_KERNEL);
7480 if (work == NULL)
7481 return -ENOMEM;
7482
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007483 work->event = event;
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007484 work->crtc = crtc;
Ville Syrjälä4a35f832013-02-22 16:53:38 +02007485 work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007486 INIT_WORK(&work->work, intel_unpin_work_fn);
7487
Jesse Barnes7317c75e62011-08-29 09:45:28 -07007488 ret = drm_vblank_get(dev, intel_crtc->pipe);
7489 if (ret)
7490 goto free_work;
7491
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007492 /* We borrow the event spin lock for protecting unpin_work */
7493 spin_lock_irqsave(&dev->event_lock, flags);
7494 if (intel_crtc->unpin_work) {
7495 spin_unlock_irqrestore(&dev->event_lock, flags);
7496 kfree(work);
Jesse Barnes7317c75e62011-08-29 09:45:28 -07007497 drm_vblank_put(dev, intel_crtc->pipe);
Chris Wilson468f0b42010-05-27 13:18:13 +01007498
7499 DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007500 return -EBUSY;
7501 }
7502 intel_crtc->unpin_work = work;
7503 spin_unlock_irqrestore(&dev->event_lock, flags);
7504
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007505 if (atomic_read(&intel_crtc->unpin_work_count) >= 2)
7506 flush_workqueue(dev_priv->wq);
7507
Chris Wilson79158102012-05-23 11:13:58 +01007508 ret = i915_mutex_lock_interruptible(dev);
7509 if (ret)
7510 goto cleanup;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007511
Jesse Barnes75dfca82010-02-10 15:09:44 -08007512 /* Reference the objects for the scheduled work. */
Chris Wilson05394f32010-11-08 19:18:58 +00007513 drm_gem_object_reference(&work->old_fb_obj->base);
7514 drm_gem_object_reference(&obj->base);
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007515
7516 crtc->fb = fb;
Chris Wilson96b099f2010-06-07 14:03:04 +01007517
Chris Wilsone1f99ce2010-10-27 12:45:26 +01007518 work->pending_flip_obj = obj;
Chris Wilsone1f99ce2010-10-27 12:45:26 +01007519
Simon Farnsworth4e5359c2010-09-01 17:47:52 +01007520 work->enable_stall_check = true;
7521
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007522 atomic_inc(&intel_crtc->unpin_work_count);
Ville Syrjälä10d83732013-01-29 18:13:34 +02007523 intel_crtc->reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
Chris Wilsone1f99ce2010-10-27 12:45:26 +01007524
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007525 ret = dev_priv->display.queue_flip(dev, crtc, fb, obj);
7526 if (ret)
7527 goto cleanup_pending;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007528
Chris Wilson7782de32011-07-08 12:22:41 +01007529 intel_disable_fbc(dev);
Chris Wilsonf047e392012-07-21 12:31:41 +01007530 intel_mark_fb_busy(obj);
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007531 mutex_unlock(&dev->struct_mutex);
7532
Jesse Barnese5510fa2010-07-01 16:48:37 -07007533 trace_i915_flip_request(intel_crtc->plane, obj);
7534
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007535 return 0;
Chris Wilson96b099f2010-06-07 14:03:04 +01007536
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07007537cleanup_pending:
Chris Wilsonb4a98e52012-11-01 09:26:26 +00007538 atomic_dec(&intel_crtc->unpin_work_count);
Ville Syrjälä4a35f832013-02-22 16:53:38 +02007539 crtc->fb = old_fb;
Chris Wilson05394f32010-11-08 19:18:58 +00007540 drm_gem_object_unreference(&work->old_fb_obj->base);
7541 drm_gem_object_unreference(&obj->base);
Chris Wilson96b099f2010-06-07 14:03:04 +01007542 mutex_unlock(&dev->struct_mutex);
7543
Chris Wilson79158102012-05-23 11:13:58 +01007544cleanup:
Chris Wilson96b099f2010-06-07 14:03:04 +01007545 spin_lock_irqsave(&dev->event_lock, flags);
7546 intel_crtc->unpin_work = NULL;
7547 spin_unlock_irqrestore(&dev->event_lock, flags);
7548
Jesse Barnes7317c75e62011-08-29 09:45:28 -07007549 drm_vblank_put(dev, intel_crtc->pipe);
7550free_work:
Chris Wilson96b099f2010-06-07 14:03:04 +01007551 kfree(work);
7552
7553 return ret;
Kristian Høgsberg6b95a202009-11-18 11:25:18 -05007554}
7555
Chris Wilsonf6e5b162011-04-12 18:06:51 +01007556static struct drm_crtc_helper_funcs intel_helper_funcs = {
Chris Wilsonf6e5b162011-04-12 18:06:51 +01007557 .mode_set_base_atomic = intel_pipe_set_base_atomic,
7558 .load_lut = intel_crtc_load_lut,
Chris Wilsonf6e5b162011-04-12 18:06:51 +01007559};
7560
Daniel Vetter6ed0f792012-07-08 19:41:43 +02007561bool intel_encoder_check_is_cloned(struct intel_encoder *encoder)
7562{
7563 struct intel_encoder *other_encoder;
7564 struct drm_crtc *crtc = &encoder->new_crtc->base;
7565
7566 if (WARN_ON(!crtc))
7567 return false;
7568
7569 list_for_each_entry(other_encoder,
7570 &crtc->dev->mode_config.encoder_list,
7571 base.head) {
7572
7573 if (&other_encoder->new_crtc->base != crtc ||
7574 encoder == other_encoder)
7575 continue;
7576 else
7577 return true;
7578 }
7579
7580 return false;
7581}
7582
Daniel Vetter50f56112012-07-02 09:35:43 +02007583static bool intel_encoder_crtc_ok(struct drm_encoder *encoder,
7584 struct drm_crtc *crtc)
7585{
7586 struct drm_device *dev;
7587 struct drm_crtc *tmp;
7588 int crtc_mask = 1;
7589
7590 WARN(!crtc, "checking null crtc?\n");
7591
7592 dev = crtc->dev;
7593
7594 list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
7595 if (tmp == crtc)
7596 break;
7597 crtc_mask <<= 1;
7598 }
7599
7600 if (encoder->possible_crtcs & crtc_mask)
7601 return true;
7602 return false;
7603}
7604
Daniel Vetter9a935852012-07-05 22:34:27 +02007605/**
7606 * intel_modeset_update_staged_output_state
7607 *
7608 * Updates the staged output configuration state, e.g. after we've read out the
7609 * current hw state.
7610 */
7611static void intel_modeset_update_staged_output_state(struct drm_device *dev)
7612{
7613 struct intel_encoder *encoder;
7614 struct intel_connector *connector;
7615
7616 list_for_each_entry(connector, &dev->mode_config.connector_list,
7617 base.head) {
7618 connector->new_encoder =
7619 to_intel_encoder(connector->base.encoder);
7620 }
7621
7622 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
7623 base.head) {
7624 encoder->new_crtc =
7625 to_intel_crtc(encoder->base.crtc);
7626 }
7627}
7628
7629/**
7630 * intel_modeset_commit_output_state
7631 *
7632 * This function copies the stage display pipe configuration to the real one.
7633 */
7634static void intel_modeset_commit_output_state(struct drm_device *dev)
7635{
7636 struct intel_encoder *encoder;
7637 struct intel_connector *connector;
7638
7639 list_for_each_entry(connector, &dev->mode_config.connector_list,
7640 base.head) {
7641 connector->base.encoder = &connector->new_encoder->base;
7642 }
7643
7644 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
7645 base.head) {
7646 encoder->base.crtc = &encoder->new_crtc->base;
7647 }
7648}
7649
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007650static int
7651pipe_config_set_bpp(struct drm_crtc *crtc,
7652 struct drm_framebuffer *fb,
7653 struct intel_crtc_config *pipe_config)
7654{
7655 struct drm_device *dev = crtc->dev;
7656 struct drm_connector *connector;
7657 int bpp;
7658
Daniel Vetterd42264b2013-03-28 16:38:08 +01007659 switch (fb->pixel_format) {
7660 case DRM_FORMAT_C8:
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007661 bpp = 8*3; /* since we go through a colormap */
7662 break;
Daniel Vetterd42264b2013-03-28 16:38:08 +01007663 case DRM_FORMAT_XRGB1555:
7664 case DRM_FORMAT_ARGB1555:
7665 /* checked in intel_framebuffer_init already */
7666 if (WARN_ON(INTEL_INFO(dev)->gen > 3))
7667 return -EINVAL;
7668 case DRM_FORMAT_RGB565:
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007669 bpp = 6*3; /* min is 18bpp */
7670 break;
Daniel Vetterd42264b2013-03-28 16:38:08 +01007671 case DRM_FORMAT_XBGR8888:
7672 case DRM_FORMAT_ABGR8888:
7673 /* checked in intel_framebuffer_init already */
7674 if (WARN_ON(INTEL_INFO(dev)->gen < 4))
7675 return -EINVAL;
7676 case DRM_FORMAT_XRGB8888:
7677 case DRM_FORMAT_ARGB8888:
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007678 bpp = 8*3;
7679 break;
Daniel Vetterd42264b2013-03-28 16:38:08 +01007680 case DRM_FORMAT_XRGB2101010:
7681 case DRM_FORMAT_ARGB2101010:
7682 case DRM_FORMAT_XBGR2101010:
7683 case DRM_FORMAT_ABGR2101010:
7684 /* checked in intel_framebuffer_init already */
7685 if (WARN_ON(INTEL_INFO(dev)->gen < 4))
Daniel Vetterbaba1332013-03-27 00:45:00 +01007686 return -EINVAL;
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007687 bpp = 10*3;
7688 break;
Daniel Vetterbaba1332013-03-27 00:45:00 +01007689 /* TODO: gen4+ supports 16 bpc floating point, too. */
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007690 default:
7691 DRM_DEBUG_KMS("unsupported depth\n");
7692 return -EINVAL;
7693 }
7694
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007695 pipe_config->pipe_bpp = bpp;
7696
7697 /* Clamp display bpp to EDID value */
7698 list_for_each_entry(connector, &dev->mode_config.connector_list,
7699 head) {
7700 if (connector->encoder && connector->encoder->crtc != crtc)
7701 continue;
7702
7703 /* Don't use an invalid EDID bpc value */
7704 if (connector->display_info.bpc &&
7705 connector->display_info.bpc * 3 < bpp) {
7706 DRM_DEBUG_KMS("clamping display bpp (was %d) to EDID reported max of %d\n",
7707 bpp, connector->display_info.bpc*3);
7708 pipe_config->pipe_bpp = connector->display_info.bpc*3;
7709 }
7710 }
7711
7712 return bpp;
7713}
7714
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007715static struct intel_crtc_config *
7716intel_modeset_pipe_config(struct drm_crtc *crtc,
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007717 struct drm_framebuffer *fb,
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007718 struct drm_display_mode *mode)
Daniel Vetter7758a112012-07-08 19:40:39 +02007719{
7720 struct drm_device *dev = crtc->dev;
Daniel Vetter7758a112012-07-08 19:40:39 +02007721 struct drm_encoder_helper_funcs *encoder_funcs;
7722 struct intel_encoder *encoder;
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007723 struct intel_crtc_config *pipe_config;
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007724 int plane_bpp;
Daniel Vetter7758a112012-07-08 19:40:39 +02007725
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007726 pipe_config = kzalloc(sizeof(*pipe_config), GFP_KERNEL);
7727 if (!pipe_config)
Daniel Vetter7758a112012-07-08 19:40:39 +02007728 return ERR_PTR(-ENOMEM);
7729
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007730 drm_mode_copy(&pipe_config->adjusted_mode, mode);
7731 drm_mode_copy(&pipe_config->requested_mode, mode);
7732
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007733 plane_bpp = pipe_config_set_bpp(crtc, fb, pipe_config);
7734 if (plane_bpp < 0)
7735 goto fail;
7736
Daniel Vetter7758a112012-07-08 19:40:39 +02007737 /* Pass our mode to the connectors and the CRTC to give them a chance to
7738 * adjust it according to limitations or connector properties, and also
7739 * a chance to reject the mode entirely.
7740 */
7741 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
7742 base.head) {
7743
7744 if (&encoder->new_crtc->base != crtc)
7745 continue;
Daniel Vetter7ae89232013-03-27 00:44:52 +01007746
7747 if (encoder->compute_config) {
7748 if (!(encoder->compute_config(encoder, pipe_config))) {
7749 DRM_DEBUG_KMS("Encoder config failure\n");
7750 goto fail;
7751 }
7752
7753 continue;
7754 }
7755
Daniel Vetter7758a112012-07-08 19:40:39 +02007756 encoder_funcs = encoder->base.helper_private;
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007757 if (!(encoder_funcs->mode_fixup(&encoder->base,
7758 &pipe_config->requested_mode,
7759 &pipe_config->adjusted_mode))) {
Daniel Vetter7758a112012-07-08 19:40:39 +02007760 DRM_DEBUG_KMS("Encoder fixup failed\n");
7761 goto fail;
7762 }
7763 }
7764
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007765 if (!(intel_crtc_compute_config(crtc, pipe_config))) {
Daniel Vetter7758a112012-07-08 19:40:39 +02007766 DRM_DEBUG_KMS("CRTC fixup failed\n");
7767 goto fail;
7768 }
7769 DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id);
7770
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01007771 pipe_config->dither = pipe_config->pipe_bpp != plane_bpp;
7772 DRM_DEBUG_KMS("plane bpp: %i, pipe bpp: %i, dithering: %i\n",
7773 plane_bpp, pipe_config->pipe_bpp, pipe_config->dither);
7774
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007775 return pipe_config;
Daniel Vetter7758a112012-07-08 19:40:39 +02007776fail:
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01007777 kfree(pipe_config);
Daniel Vetter7758a112012-07-08 19:40:39 +02007778 return ERR_PTR(-EINVAL);
7779}
7780
Daniel Vettere2e1ed42012-07-08 21:14:38 +02007781/* Computes which crtcs are affected and sets the relevant bits in the mask. For
7782 * simplicity we use the crtc's pipe number (because it's easier to obtain). */
7783static void
7784intel_modeset_affected_pipes(struct drm_crtc *crtc, unsigned *modeset_pipes,
7785 unsigned *prepare_pipes, unsigned *disable_pipes)
7786{
7787 struct intel_crtc *intel_crtc;
7788 struct drm_device *dev = crtc->dev;
7789 struct intel_encoder *encoder;
7790 struct intel_connector *connector;
7791 struct drm_crtc *tmp_crtc;
7792
7793 *disable_pipes = *modeset_pipes = *prepare_pipes = 0;
7794
7795 /* Check which crtcs have changed outputs connected to them, these need
7796 * to be part of the prepare_pipes mask. We don't (yet) support global
7797 * modeset across multiple crtcs, so modeset_pipes will only have one
7798 * bit set at most. */
7799 list_for_each_entry(connector, &dev->mode_config.connector_list,
7800 base.head) {
7801 if (connector->base.encoder == &connector->new_encoder->base)
7802 continue;
7803
7804 if (connector->base.encoder) {
7805 tmp_crtc = connector->base.encoder->crtc;
7806
7807 *prepare_pipes |= 1 << to_intel_crtc(tmp_crtc)->pipe;
7808 }
7809
7810 if (connector->new_encoder)
7811 *prepare_pipes |=
7812 1 << connector->new_encoder->new_crtc->pipe;
7813 }
7814
7815 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
7816 base.head) {
7817 if (encoder->base.crtc == &encoder->new_crtc->base)
7818 continue;
7819
7820 if (encoder->base.crtc) {
7821 tmp_crtc = encoder->base.crtc;
7822
7823 *prepare_pipes |= 1 << to_intel_crtc(tmp_crtc)->pipe;
7824 }
7825
7826 if (encoder->new_crtc)
7827 *prepare_pipes |= 1 << encoder->new_crtc->pipe;
7828 }
7829
7830 /* Check for any pipes that will be fully disabled ... */
7831 list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list,
7832 base.head) {
7833 bool used = false;
7834
7835 /* Don't try to disable disabled crtcs. */
7836 if (!intel_crtc->base.enabled)
7837 continue;
7838
7839 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
7840 base.head) {
7841 if (encoder->new_crtc == intel_crtc)
7842 used = true;
7843 }
7844
7845 if (!used)
7846 *disable_pipes |= 1 << intel_crtc->pipe;
7847 }
7848
7849
7850 /* set_mode is also used to update properties on life display pipes. */
7851 intel_crtc = to_intel_crtc(crtc);
7852 if (crtc->enabled)
7853 *prepare_pipes |= 1 << intel_crtc->pipe;
7854
Daniel Vetterb6c51642013-04-12 18:48:43 +02007855 /*
7856 * For simplicity do a full modeset on any pipe where the output routing
7857 * changed. We could be more clever, but that would require us to be
7858 * more careful with calling the relevant encoder->mode_set functions.
7859 */
Daniel Vettere2e1ed42012-07-08 21:14:38 +02007860 if (*prepare_pipes)
7861 *modeset_pipes = *prepare_pipes;
7862
7863 /* ... and mask these out. */
7864 *modeset_pipes &= ~(*disable_pipes);
7865 *prepare_pipes &= ~(*disable_pipes);
Daniel Vetterb6c51642013-04-12 18:48:43 +02007866
7867 /*
7868 * HACK: We don't (yet) fully support global modesets. intel_set_config
7869 * obies this rule, but the modeset restore mode of
7870 * intel_modeset_setup_hw_state does not.
7871 */
7872 *modeset_pipes &= 1 << intel_crtc->pipe;
7873 *prepare_pipes &= 1 << intel_crtc->pipe;
Daniel Vettere3641d32013-04-11 19:49:07 +02007874
7875 DRM_DEBUG_KMS("set mode pipe masks: modeset: %x, prepare: %x, disable: %x\n",
7876 *modeset_pipes, *prepare_pipes, *disable_pipes);
Daniel Vettere2e1ed42012-07-08 21:14:38 +02007877}
7878
Daniel Vetterea9d7582012-07-10 10:42:52 +02007879static bool intel_crtc_in_use(struct drm_crtc *crtc)
7880{
7881 struct drm_encoder *encoder;
7882 struct drm_device *dev = crtc->dev;
7883
7884 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
7885 if (encoder->crtc == crtc)
7886 return true;
7887
7888 return false;
7889}
7890
7891static void
7892intel_modeset_update_state(struct drm_device *dev, unsigned prepare_pipes)
7893{
7894 struct intel_encoder *intel_encoder;
7895 struct intel_crtc *intel_crtc;
7896 struct drm_connector *connector;
7897
7898 list_for_each_entry(intel_encoder, &dev->mode_config.encoder_list,
7899 base.head) {
7900 if (!intel_encoder->base.crtc)
7901 continue;
7902
7903 intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
7904
7905 if (prepare_pipes & (1 << intel_crtc->pipe))
7906 intel_encoder->connectors_active = false;
7907 }
7908
7909 intel_modeset_commit_output_state(dev);
7910
7911 /* Update computed state. */
7912 list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list,
7913 base.head) {
7914 intel_crtc->base.enabled = intel_crtc_in_use(&intel_crtc->base);
7915 }
7916
7917 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
7918 if (!connector->encoder || !connector->encoder->crtc)
7919 continue;
7920
7921 intel_crtc = to_intel_crtc(connector->encoder->crtc);
7922
7923 if (prepare_pipes & (1 << intel_crtc->pipe)) {
Daniel Vetter68d34722012-09-06 22:08:35 +02007924 struct drm_property *dpms_property =
7925 dev->mode_config.dpms_property;
7926
Daniel Vetterea9d7582012-07-10 10:42:52 +02007927 connector->dpms = DRM_MODE_DPMS_ON;
Rob Clark662595d2012-10-11 20:36:04 -05007928 drm_object_property_set_value(&connector->base,
Daniel Vetter68d34722012-09-06 22:08:35 +02007929 dpms_property,
7930 DRM_MODE_DPMS_ON);
Daniel Vetterea9d7582012-07-10 10:42:52 +02007931
7932 intel_encoder = to_intel_encoder(connector->encoder);
7933 intel_encoder->connectors_active = true;
7934 }
7935 }
7936
7937}
7938
Daniel Vetter25c5b262012-07-08 22:08:04 +02007939#define for_each_intel_crtc_masked(dev, mask, intel_crtc) \
7940 list_for_each_entry((intel_crtc), \
7941 &(dev)->mode_config.crtc_list, \
7942 base.head) \
7943 if (mask & (1 <<(intel_crtc)->pipe)) \
7944
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01007945static bool
7946intel_pipe_config_compare(struct intel_crtc_config *current_config,
7947 struct intel_crtc_config *pipe_config)
7948{
Daniel Vetter88adfff2013-03-28 10:42:01 +01007949 if (current_config->has_pch_encoder != pipe_config->has_pch_encoder) {
7950 DRM_ERROR("mismatch in has_pch_encoder "
7951 "(expected %i, found %i)\n",
7952 current_config->has_pch_encoder,
7953 pipe_config->has_pch_encoder);
7954 return false;
7955 }
7956
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01007957 return true;
7958}
7959
Daniel Vetterb9805142012-08-31 17:37:33 +02007960void
Daniel Vetter8af6cf82012-07-10 09:50:11 +02007961intel_modeset_check_state(struct drm_device *dev)
7962{
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01007963 drm_i915_private_t *dev_priv = dev->dev_private;
Daniel Vetter8af6cf82012-07-10 09:50:11 +02007964 struct intel_crtc *crtc;
7965 struct intel_encoder *encoder;
7966 struct intel_connector *connector;
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01007967 struct intel_crtc_config pipe_config;
Daniel Vetter8af6cf82012-07-10 09:50:11 +02007968
7969 list_for_each_entry(connector, &dev->mode_config.connector_list,
7970 base.head) {
7971 /* This also checks the encoder/connector hw state with the
7972 * ->get_hw_state callbacks. */
7973 intel_connector_check_state(connector);
7974
7975 WARN(&connector->new_encoder->base != connector->base.encoder,
7976 "connector's staged encoder doesn't match current encoder\n");
7977 }
7978
7979 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
7980 base.head) {
7981 bool enabled = false;
7982 bool active = false;
7983 enum pipe pipe, tracked_pipe;
7984
7985 DRM_DEBUG_KMS("[ENCODER:%d:%s]\n",
7986 encoder->base.base.id,
7987 drm_get_encoder_name(&encoder->base));
7988
7989 WARN(&encoder->new_crtc->base != encoder->base.crtc,
7990 "encoder's stage crtc doesn't match current crtc\n");
7991 WARN(encoder->connectors_active && !encoder->base.crtc,
7992 "encoder's active_connectors set, but no crtc\n");
7993
7994 list_for_each_entry(connector, &dev->mode_config.connector_list,
7995 base.head) {
7996 if (connector->base.encoder != &encoder->base)
7997 continue;
7998 enabled = true;
7999 if (connector->base.dpms != DRM_MODE_DPMS_OFF)
8000 active = true;
8001 }
8002 WARN(!!encoder->base.crtc != enabled,
8003 "encoder's enabled state mismatch "
8004 "(expected %i, found %i)\n",
8005 !!encoder->base.crtc, enabled);
8006 WARN(active && !encoder->base.crtc,
8007 "active encoder with no crtc\n");
8008
8009 WARN(encoder->connectors_active != active,
8010 "encoder's computed active state doesn't match tracked active state "
8011 "(expected %i, found %i)\n", active, encoder->connectors_active);
8012
8013 active = encoder->get_hw_state(encoder, &pipe);
8014 WARN(active != encoder->connectors_active,
8015 "encoder's hw state doesn't match sw tracking "
8016 "(expected %i, found %i)\n",
8017 encoder->connectors_active, active);
8018
8019 if (!encoder->base.crtc)
8020 continue;
8021
8022 tracked_pipe = to_intel_crtc(encoder->base.crtc)->pipe;
8023 WARN(active && pipe != tracked_pipe,
8024 "active encoder's pipe doesn't match"
8025 "(expected %i, found %i)\n",
8026 tracked_pipe, pipe);
8027
8028 }
8029
8030 list_for_each_entry(crtc, &dev->mode_config.crtc_list,
8031 base.head) {
8032 bool enabled = false;
8033 bool active = false;
8034
8035 DRM_DEBUG_KMS("[CRTC:%d]\n",
8036 crtc->base.base.id);
8037
8038 WARN(crtc->active && !crtc->base.enabled,
8039 "active crtc, but not enabled in sw tracking\n");
8040
8041 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
8042 base.head) {
8043 if (encoder->base.crtc != &crtc->base)
8044 continue;
8045 enabled = true;
8046 if (encoder->connectors_active)
8047 active = true;
8048 }
8049 WARN(active != crtc->active,
8050 "crtc's computed active state doesn't match tracked active state "
8051 "(expected %i, found %i)\n", active, crtc->active);
8052 WARN(enabled != crtc->base.enabled,
8053 "crtc's computed enabled state doesn't match tracked enabled state "
8054 "(expected %i, found %i)\n", enabled, crtc->base.enabled);
8055
Daniel Vetter88adfff2013-03-28 10:42:01 +01008056 memset(&pipe_config, 0, sizeof(pipe_config));
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01008057 active = dev_priv->display.get_pipe_config(crtc,
8058 &pipe_config);
8059 WARN(crtc->active != active,
8060 "crtc active state doesn't match with hw state "
8061 "(expected %i, found %i)\n", crtc->active, active);
8062
8063 WARN(active &&
8064 !intel_pipe_config_compare(&crtc->config, &pipe_config),
8065 "pipe state doesn't match!\n");
Daniel Vetter8af6cf82012-07-10 09:50:11 +02008066 }
8067}
8068
Daniel Vetterf30da182013-04-11 20:22:50 +02008069static int __intel_set_mode(struct drm_crtc *crtc,
8070 struct drm_display_mode *mode,
8071 int x, int y, struct drm_framebuffer *fb)
Daniel Vettera6778b32012-07-02 09:56:42 +02008072{
8073 struct drm_device *dev = crtc->dev;
Daniel Vetterdbf2b54e2012-07-02 11:18:29 +02008074 drm_i915_private_t *dev_priv = dev->dev_private;
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008075 struct drm_display_mode *saved_mode, *saved_hwmode;
8076 struct intel_crtc_config *pipe_config = NULL;
Daniel Vetter25c5b262012-07-08 22:08:04 +02008077 struct intel_crtc *intel_crtc;
8078 unsigned disable_pipes, prepare_pipes, modeset_pipes;
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008079 int ret = 0;
Daniel Vettera6778b32012-07-02 09:56:42 +02008080
Tim Gardner3ac18232012-12-07 07:54:26 -07008081 saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL);
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008082 if (!saved_mode)
8083 return -ENOMEM;
Tim Gardner3ac18232012-12-07 07:54:26 -07008084 saved_hwmode = saved_mode + 1;
Daniel Vettera6778b32012-07-02 09:56:42 +02008085
Daniel Vettere2e1ed42012-07-08 21:14:38 +02008086 intel_modeset_affected_pipes(crtc, &modeset_pipes,
Daniel Vetter25c5b262012-07-08 22:08:04 +02008087 &prepare_pipes, &disable_pipes);
8088
Tim Gardner3ac18232012-12-07 07:54:26 -07008089 *saved_hwmode = crtc->hwmode;
8090 *saved_mode = crtc->mode;
Daniel Vettera6778b32012-07-02 09:56:42 +02008091
Daniel Vetter25c5b262012-07-08 22:08:04 +02008092 /* Hack: Because we don't (yet) support global modeset on multiple
8093 * crtcs, we don't keep track of the new mode for more than one crtc.
8094 * Hence simply check whether any bit is set in modeset_pipes in all the
8095 * pieces of code that are not yet converted to deal with mutliple crtcs
8096 * changing their mode at the same time. */
Daniel Vetter25c5b262012-07-08 22:08:04 +02008097 if (modeset_pipes) {
Daniel Vetter4e53c2e2013-03-27 00:44:58 +01008098 pipe_config = intel_modeset_pipe_config(crtc, fb, mode);
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008099 if (IS_ERR(pipe_config)) {
8100 ret = PTR_ERR(pipe_config);
8101 pipe_config = NULL;
8102
Tim Gardner3ac18232012-12-07 07:54:26 -07008103 goto out;
Daniel Vetter25c5b262012-07-08 22:08:04 +02008104 }
Daniel Vettera6778b32012-07-02 09:56:42 +02008105 }
8106
Daniel Vetter460da9162013-03-27 00:44:51 +01008107 for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc)
8108 intel_crtc_disable(&intel_crtc->base);
8109
Daniel Vetterea9d7582012-07-10 10:42:52 +02008110 for_each_intel_crtc_masked(dev, prepare_pipes, intel_crtc) {
8111 if (intel_crtc->base.enabled)
8112 dev_priv->display.crtc_disable(&intel_crtc->base);
8113 }
Daniel Vettera6778b32012-07-02 09:56:42 +02008114
Daniel Vetter6c4c86f2012-09-10 21:58:30 +02008115 /* crtc->mode is already used by the ->mode_set callbacks, hence we need
8116 * to set it here already despite that we pass it down the callchain.
8117 */
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008118 if (modeset_pipes) {
Daniel Vetter3b117c82013-04-17 20:15:07 +02008119 enum transcoder tmp = to_intel_crtc(crtc)->config.cpu_transcoder;
Daniel Vetter25c5b262012-07-08 22:08:04 +02008120 crtc->mode = *mode;
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008121 /* mode_set/enable/disable functions rely on a correct pipe
8122 * config. */
8123 to_intel_crtc(crtc)->config = *pipe_config;
Daniel Vetter3b117c82013-04-17 20:15:07 +02008124 to_intel_crtc(crtc)->config.cpu_transcoder = tmp;
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008125 }
Daniel Vetter7758a112012-07-08 19:40:39 +02008126
Daniel Vetterea9d7582012-07-10 10:42:52 +02008127 /* Only after disabling all output pipelines that will be changed can we
8128 * update the the output configuration. */
8129 intel_modeset_update_state(dev, prepare_pipes);
8130
Daniel Vetter47fab732012-10-26 10:58:18 +02008131 if (dev_priv->display.modeset_global_resources)
8132 dev_priv->display.modeset_global_resources(dev);
8133
Daniel Vettera6778b32012-07-02 09:56:42 +02008134 /* Set up the DPLL and any encoders state that needs to adjust or depend
8135 * on the DPLL.
8136 */
Daniel Vetter25c5b262012-07-08 22:08:04 +02008137 for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) {
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008138 ret = intel_crtc_mode_set(&intel_crtc->base,
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008139 x, y, fb);
8140 if (ret)
8141 goto done;
Daniel Vettera6778b32012-07-02 09:56:42 +02008142 }
8143
8144 /* Now enable the clocks, plane, pipe, and connectors that we set up. */
Daniel Vetter25c5b262012-07-08 22:08:04 +02008145 for_each_intel_crtc_masked(dev, prepare_pipes, intel_crtc)
8146 dev_priv->display.crtc_enable(&intel_crtc->base);
Daniel Vettera6778b32012-07-02 09:56:42 +02008147
Daniel Vetter25c5b262012-07-08 22:08:04 +02008148 if (modeset_pipes) {
8149 /* Store real post-adjustment hardware mode. */
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008150 crtc->hwmode = pipe_config->adjusted_mode;
Daniel Vettera6778b32012-07-02 09:56:42 +02008151
Daniel Vetter25c5b262012-07-08 22:08:04 +02008152 /* Calculate and store various constants which
8153 * are later needed by vblank and swap-completion
8154 * timestamping. They are derived from true hwmode.
8155 */
8156 drm_calc_timestamping_constants(crtc);
8157 }
Daniel Vettera6778b32012-07-02 09:56:42 +02008158
8159 /* FIXME: add subpixel order */
8160done:
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008161 if (ret && crtc->enabled) {
Tim Gardner3ac18232012-12-07 07:54:26 -07008162 crtc->hwmode = *saved_hwmode;
8163 crtc->mode = *saved_mode;
Daniel Vettera6778b32012-07-02 09:56:42 +02008164 }
8165
Tim Gardner3ac18232012-12-07 07:54:26 -07008166out:
Daniel Vetterb8cecdf2013-03-27 00:44:50 +01008167 kfree(pipe_config);
Tim Gardner3ac18232012-12-07 07:54:26 -07008168 kfree(saved_mode);
Daniel Vettera6778b32012-07-02 09:56:42 +02008169 return ret;
8170}
8171
Daniel Vetterf30da182013-04-11 20:22:50 +02008172int intel_set_mode(struct drm_crtc *crtc,
8173 struct drm_display_mode *mode,
8174 int x, int y, struct drm_framebuffer *fb)
8175{
8176 int ret;
8177
8178 ret = __intel_set_mode(crtc, mode, x, y, fb);
8179
8180 if (ret == 0)
8181 intel_modeset_check_state(crtc->dev);
8182
8183 return ret;
8184}
8185
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008186void intel_crtc_restore_mode(struct drm_crtc *crtc)
8187{
8188 intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
8189}
8190
Daniel Vetter25c5b262012-07-08 22:08:04 +02008191#undef for_each_intel_crtc_masked
8192
Daniel Vetterd9e55602012-07-04 22:16:09 +02008193static void intel_set_config_free(struct intel_set_config *config)
8194{
8195 if (!config)
8196 return;
8197
Daniel Vetter1aa4b622012-07-05 16:20:48 +02008198 kfree(config->save_connector_encoders);
8199 kfree(config->save_encoder_crtcs);
Daniel Vetterd9e55602012-07-04 22:16:09 +02008200 kfree(config);
8201}
8202
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008203static int intel_set_config_save_state(struct drm_device *dev,
8204 struct intel_set_config *config)
8205{
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008206 struct drm_encoder *encoder;
8207 struct drm_connector *connector;
8208 int count;
8209
Daniel Vetter1aa4b622012-07-05 16:20:48 +02008210 config->save_encoder_crtcs =
8211 kcalloc(dev->mode_config.num_encoder,
8212 sizeof(struct drm_crtc *), GFP_KERNEL);
8213 if (!config->save_encoder_crtcs)
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008214 return -ENOMEM;
8215
Daniel Vetter1aa4b622012-07-05 16:20:48 +02008216 config->save_connector_encoders =
8217 kcalloc(dev->mode_config.num_connector,
8218 sizeof(struct drm_encoder *), GFP_KERNEL);
8219 if (!config->save_connector_encoders)
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008220 return -ENOMEM;
8221
8222 /* Copy data. Note that driver private data is not affected.
8223 * Should anything bad happen only the expected state is
8224 * restored, not the drivers personal bookkeeping.
8225 */
8226 count = 0;
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008227 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
Daniel Vetter1aa4b622012-07-05 16:20:48 +02008228 config->save_encoder_crtcs[count++] = encoder->crtc;
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008229 }
8230
8231 count = 0;
8232 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
Daniel Vetter1aa4b622012-07-05 16:20:48 +02008233 config->save_connector_encoders[count++] = connector->encoder;
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008234 }
8235
8236 return 0;
8237}
8238
8239static void intel_set_config_restore_state(struct drm_device *dev,
8240 struct intel_set_config *config)
8241{
Daniel Vetter9a935852012-07-05 22:34:27 +02008242 struct intel_encoder *encoder;
8243 struct intel_connector *connector;
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008244 int count;
8245
8246 count = 0;
Daniel Vetter9a935852012-07-05 22:34:27 +02008247 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
8248 encoder->new_crtc =
8249 to_intel_crtc(config->save_encoder_crtcs[count++]);
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008250 }
8251
8252 count = 0;
Daniel Vetter9a935852012-07-05 22:34:27 +02008253 list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) {
8254 connector->new_encoder =
8255 to_intel_encoder(config->save_connector_encoders[count++]);
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008256 }
8257}
8258
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008259static void
8260intel_set_config_compute_mode_changes(struct drm_mode_set *set,
8261 struct intel_set_config *config)
8262{
8263
8264 /* We should be able to check here if the fb has the same properties
8265 * and then just flip_or_move it */
8266 if (set->crtc->fb != set->fb) {
8267 /* If we have no fb then treat it as a full mode set */
8268 if (set->crtc->fb == NULL) {
8269 DRM_DEBUG_KMS("crtc has no fb, full mode set\n");
8270 config->mode_changed = true;
8271 } else if (set->fb == NULL) {
8272 config->mode_changed = true;
Daniel Vetter72f49012013-03-28 16:01:35 +01008273 } else if (set->fb->pixel_format !=
8274 set->crtc->fb->pixel_format) {
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008275 config->mode_changed = true;
8276 } else
8277 config->fb_changed = true;
8278 }
8279
Daniel Vetter835c5872012-07-10 18:11:08 +02008280 if (set->fb && (set->x != set->crtc->x || set->y != set->crtc->y))
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008281 config->fb_changed = true;
8282
8283 if (set->mode && !drm_mode_equal(set->mode, &set->crtc->mode)) {
8284 DRM_DEBUG_KMS("modes are different, full mode set\n");
8285 drm_mode_debug_printmodeline(&set->crtc->mode);
8286 drm_mode_debug_printmodeline(set->mode);
8287 config->mode_changed = true;
8288 }
8289}
8290
Daniel Vetter2e431052012-07-04 22:42:15 +02008291static int
Daniel Vetter9a935852012-07-05 22:34:27 +02008292intel_modeset_stage_output_state(struct drm_device *dev,
8293 struct drm_mode_set *set,
8294 struct intel_set_config *config)
Daniel Vetter50f56112012-07-02 09:35:43 +02008295{
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008296 struct drm_crtc *new_crtc;
Daniel Vetter9a935852012-07-05 22:34:27 +02008297 struct intel_connector *connector;
8298 struct intel_encoder *encoder;
Daniel Vetter2e431052012-07-04 22:42:15 +02008299 int count, ro;
Daniel Vetter50f56112012-07-02 09:35:43 +02008300
Damien Lespiau9abdda72013-02-13 13:29:23 +00008301 /* The upper layers ensure that we either disable a crtc or have a list
Daniel Vetter9a935852012-07-05 22:34:27 +02008302 * of connectors. For paranoia, double-check this. */
8303 WARN_ON(!set->fb && (set->num_connectors != 0));
8304 WARN_ON(set->fb && (set->num_connectors == 0));
8305
Daniel Vetter50f56112012-07-02 09:35:43 +02008306 count = 0;
Daniel Vetter9a935852012-07-05 22:34:27 +02008307 list_for_each_entry(connector, &dev->mode_config.connector_list,
8308 base.head) {
8309 /* Otherwise traverse passed in connector list and get encoders
8310 * for them. */
Daniel Vetter50f56112012-07-02 09:35:43 +02008311 for (ro = 0; ro < set->num_connectors; ro++) {
Daniel Vetter9a935852012-07-05 22:34:27 +02008312 if (set->connectors[ro] == &connector->base) {
8313 connector->new_encoder = connector->encoder;
Daniel Vetter50f56112012-07-02 09:35:43 +02008314 break;
8315 }
8316 }
8317
Daniel Vetter9a935852012-07-05 22:34:27 +02008318 /* If we disable the crtc, disable all its connectors. Also, if
8319 * the connector is on the changing crtc but not on the new
8320 * connector list, disable it. */
8321 if ((!set->fb || ro == set->num_connectors) &&
8322 connector->base.encoder &&
8323 connector->base.encoder->crtc == set->crtc) {
8324 connector->new_encoder = NULL;
8325
8326 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [NOCRTC]\n",
8327 connector->base.base.id,
8328 drm_get_connector_name(&connector->base));
8329 }
8330
8331
8332 if (&connector->new_encoder->base != connector->base.encoder) {
Daniel Vetter50f56112012-07-02 09:35:43 +02008333 DRM_DEBUG_KMS("encoder changed, full mode switch\n");
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008334 config->mode_changed = true;
Daniel Vetter50f56112012-07-02 09:35:43 +02008335 }
Daniel Vetter9a935852012-07-05 22:34:27 +02008336 }
8337 /* connector->new_encoder is now updated for all connectors. */
8338
8339 /* Update crtc of enabled connectors. */
Daniel Vetter50f56112012-07-02 09:35:43 +02008340 count = 0;
Daniel Vetter9a935852012-07-05 22:34:27 +02008341 list_for_each_entry(connector, &dev->mode_config.connector_list,
8342 base.head) {
8343 if (!connector->new_encoder)
Daniel Vetter50f56112012-07-02 09:35:43 +02008344 continue;
8345
Daniel Vetter9a935852012-07-05 22:34:27 +02008346 new_crtc = connector->new_encoder->base.crtc;
Daniel Vetter50f56112012-07-02 09:35:43 +02008347
8348 for (ro = 0; ro < set->num_connectors; ro++) {
Daniel Vetter9a935852012-07-05 22:34:27 +02008349 if (set->connectors[ro] == &connector->base)
Daniel Vetter50f56112012-07-02 09:35:43 +02008350 new_crtc = set->crtc;
8351 }
8352
8353 /* Make sure the new CRTC will work with the encoder */
Daniel Vetter9a935852012-07-05 22:34:27 +02008354 if (!intel_encoder_crtc_ok(&connector->new_encoder->base,
8355 new_crtc)) {
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008356 return -EINVAL;
Daniel Vetter50f56112012-07-02 09:35:43 +02008357 }
Daniel Vetter9a935852012-07-05 22:34:27 +02008358 connector->encoder->new_crtc = to_intel_crtc(new_crtc);
8359
8360 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [CRTC:%d]\n",
8361 connector->base.base.id,
8362 drm_get_connector_name(&connector->base),
8363 new_crtc->base.id);
8364 }
8365
8366 /* Check for any encoders that needs to be disabled. */
8367 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
8368 base.head) {
8369 list_for_each_entry(connector,
8370 &dev->mode_config.connector_list,
8371 base.head) {
8372 if (connector->new_encoder == encoder) {
8373 WARN_ON(!connector->new_encoder->new_crtc);
8374
8375 goto next_encoder;
8376 }
8377 }
8378 encoder->new_crtc = NULL;
8379next_encoder:
8380 /* Only now check for crtc changes so we don't miss encoders
8381 * that will be disabled. */
8382 if (&encoder->new_crtc->base != encoder->base.crtc) {
Daniel Vetter50f56112012-07-02 09:35:43 +02008383 DRM_DEBUG_KMS("crtc changed, full mode switch\n");
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008384 config->mode_changed = true;
Daniel Vetter50f56112012-07-02 09:35:43 +02008385 }
8386 }
Daniel Vetter9a935852012-07-05 22:34:27 +02008387 /* Now we've also updated encoder->new_crtc for all encoders. */
Daniel Vetter50f56112012-07-02 09:35:43 +02008388
Daniel Vetter2e431052012-07-04 22:42:15 +02008389 return 0;
8390}
8391
8392static int intel_crtc_set_config(struct drm_mode_set *set)
8393{
8394 struct drm_device *dev;
Daniel Vetter2e431052012-07-04 22:42:15 +02008395 struct drm_mode_set save_set;
8396 struct intel_set_config *config;
8397 int ret;
Daniel Vetter2e431052012-07-04 22:42:15 +02008398
Daniel Vetter8d3e3752012-07-05 16:09:09 +02008399 BUG_ON(!set);
8400 BUG_ON(!set->crtc);
8401 BUG_ON(!set->crtc->helper_private);
Daniel Vetter2e431052012-07-04 22:42:15 +02008402
Daniel Vetter7e53f3a2013-01-21 10:52:17 +01008403 /* Enforce sane interface api - has been abused by the fb helper. */
8404 BUG_ON(!set->mode && set->fb);
8405 BUG_ON(set->fb && set->num_connectors == 0);
Daniel Vetter431e50f2012-07-10 17:53:42 +02008406
Daniel Vetter2e431052012-07-04 22:42:15 +02008407 if (set->fb) {
8408 DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
8409 set->crtc->base.id, set->fb->base.id,
8410 (int)set->num_connectors, set->x, set->y);
8411 } else {
8412 DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
Daniel Vetter2e431052012-07-04 22:42:15 +02008413 }
8414
8415 dev = set->crtc->dev;
8416
8417 ret = -ENOMEM;
8418 config = kzalloc(sizeof(*config), GFP_KERNEL);
8419 if (!config)
8420 goto out_config;
8421
8422 ret = intel_set_config_save_state(dev, config);
8423 if (ret)
8424 goto out_config;
8425
8426 save_set.crtc = set->crtc;
8427 save_set.mode = &set->crtc->mode;
8428 save_set.x = set->crtc->x;
8429 save_set.y = set->crtc->y;
8430 save_set.fb = set->crtc->fb;
8431
8432 /* Compute whether we need a full modeset, only an fb base update or no
8433 * change at all. In the future we might also check whether only the
8434 * mode changed, e.g. for LVDS where we only change the panel fitter in
8435 * such cases. */
8436 intel_set_config_compute_mode_changes(set, config);
8437
Daniel Vetter9a935852012-07-05 22:34:27 +02008438 ret = intel_modeset_stage_output_state(dev, set, config);
Daniel Vetter2e431052012-07-04 22:42:15 +02008439 if (ret)
8440 goto fail;
8441
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008442 if (config->mode_changed) {
Daniel Vetter87f1faa2012-07-05 23:36:17 +02008443 if (set->mode) {
Daniel Vetter50f56112012-07-02 09:35:43 +02008444 DRM_DEBUG_KMS("attempting to set mode from"
8445 " userspace\n");
8446 drm_mode_debug_printmodeline(set->mode);
Daniel Vetter87f1faa2012-07-05 23:36:17 +02008447 }
8448
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008449 ret = intel_set_mode(set->crtc, set->mode,
8450 set->x, set->y, set->fb);
8451 if (ret) {
8452 DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n",
8453 set->crtc->base.id, ret);
Daniel Vetter87f1faa2012-07-05 23:36:17 +02008454 goto fail;
8455 }
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008456 } else if (config->fb_changed) {
Ville Syrjälä4878cae2013-02-18 19:08:48 +02008457 intel_crtc_wait_for_pending_flips(set->crtc);
8458
Daniel Vetter4f660f42012-07-02 09:47:37 +02008459 ret = intel_pipe_set_base(set->crtc,
Daniel Vetter94352cf2012-07-05 22:51:56 +02008460 set->x, set->y, set->fb);
Daniel Vetter50f56112012-07-02 09:35:43 +02008461 }
8462
Daniel Vetterd9e55602012-07-04 22:16:09 +02008463 intel_set_config_free(config);
8464
Daniel Vetter50f56112012-07-02 09:35:43 +02008465 return 0;
8466
8467fail:
Daniel Vetter85f9eb72012-07-04 22:24:08 +02008468 intel_set_config_restore_state(dev, config);
Daniel Vetter50f56112012-07-02 09:35:43 +02008469
8470 /* Try to restore the config */
Daniel Vetter5e2b5842012-07-04 22:41:29 +02008471 if (config->mode_changed &&
Chris Wilsonc0c36b942012-12-19 16:08:43 +00008472 intel_set_mode(save_set.crtc, save_set.mode,
8473 save_set.x, save_set.y, save_set.fb))
Daniel Vetter50f56112012-07-02 09:35:43 +02008474 DRM_ERROR("failed to restore config after modeset failure\n");
8475
Daniel Vetterd9e55602012-07-04 22:16:09 +02008476out_config:
8477 intel_set_config_free(config);
Daniel Vetter50f56112012-07-02 09:35:43 +02008478 return ret;
8479}
8480
Chris Wilsonf6e5b162011-04-12 18:06:51 +01008481static const struct drm_crtc_funcs intel_crtc_funcs = {
Chris Wilsonf6e5b162011-04-12 18:06:51 +01008482 .cursor_set = intel_crtc_cursor_set,
8483 .cursor_move = intel_crtc_cursor_move,
8484 .gamma_set = intel_crtc_gamma_set,
Daniel Vetter50f56112012-07-02 09:35:43 +02008485 .set_config = intel_crtc_set_config,
Chris Wilsonf6e5b162011-04-12 18:06:51 +01008486 .destroy = intel_crtc_destroy,
8487 .page_flip = intel_crtc_page_flip,
8488};
8489
Paulo Zanoni79f689a2012-10-05 12:05:52 -03008490static void intel_cpu_pll_init(struct drm_device *dev)
8491{
Paulo Zanoniaffa9352012-11-23 15:30:39 -02008492 if (HAS_DDI(dev))
Paulo Zanoni79f689a2012-10-05 12:05:52 -03008493 intel_ddi_pll_init(dev);
8494}
8495
Jesse Barnesee7b9f92012-04-20 17:11:53 +01008496static void intel_pch_pll_init(struct drm_device *dev)
8497{
8498 drm_i915_private_t *dev_priv = dev->dev_private;
8499 int i;
8500
8501 if (dev_priv->num_pch_pll == 0) {
8502 DRM_DEBUG_KMS("No PCH PLLs on this hardware, skipping initialisation\n");
8503 return;
8504 }
8505
8506 for (i = 0; i < dev_priv->num_pch_pll; i++) {
8507 dev_priv->pch_plls[i].pll_reg = _PCH_DPLL(i);
8508 dev_priv->pch_plls[i].fp0_reg = _PCH_FP0(i);
8509 dev_priv->pch_plls[i].fp1_reg = _PCH_FP1(i);
8510 }
8511}
8512
Hannes Ederb358d0a2008-12-18 21:18:47 +01008513static void intel_crtc_init(struct drm_device *dev, int pipe)
Jesse Barnes79e53942008-11-07 14:24:08 -08008514{
Jesse Barnes22fd0fa2009-12-02 13:42:53 -08008515 drm_i915_private_t *dev_priv = dev->dev_private;
Jesse Barnes79e53942008-11-07 14:24:08 -08008516 struct intel_crtc *intel_crtc;
8517 int i;
8518
8519 intel_crtc = kzalloc(sizeof(struct intel_crtc) + (INTELFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
8520 if (intel_crtc == NULL)
8521 return;
8522
8523 drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs);
8524
8525 drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256);
Jesse Barnes79e53942008-11-07 14:24:08 -08008526 for (i = 0; i < 256; i++) {
8527 intel_crtc->lut_r[i] = i;
8528 intel_crtc->lut_g[i] = i;
8529 intel_crtc->lut_b[i] = i;
8530 }
8531
Jesse Barnes80824002009-09-10 15:28:06 -07008532 /* Swap pipes & planes for FBC on pre-965 */
8533 intel_crtc->pipe = pipe;
8534 intel_crtc->plane = pipe;
Daniel Vetter3b117c82013-04-17 20:15:07 +02008535 intel_crtc->config.cpu_transcoder = pipe;
Chris Wilsone2e767a2010-09-13 16:53:12 +01008536 if (IS_MOBILE(dev) && IS_GEN3(dev)) {
Zhao Yakui28c97732009-10-09 11:39:41 +08008537 DRM_DEBUG_KMS("swapping pipes & planes for FBC\n");
Chris Wilsone2e767a2010-09-13 16:53:12 +01008538 intel_crtc->plane = !pipe;
Jesse Barnes80824002009-09-10 15:28:06 -07008539 }
8540
Jesse Barnes22fd0fa2009-12-02 13:42:53 -08008541 BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
8542 dev_priv->plane_to_crtc_mapping[intel_crtc->plane] != NULL);
8543 dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base;
8544 dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base;
8545
Jesse Barnes79e53942008-11-07 14:24:08 -08008546 drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
Jesse Barnes79e53942008-11-07 14:24:08 -08008547}
8548
Carl Worth08d7b3d2009-04-29 14:43:54 -07008549int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
Chris Wilson05394f32010-11-08 19:18:58 +00008550 struct drm_file *file)
Carl Worth08d7b3d2009-04-29 14:43:54 -07008551{
Carl Worth08d7b3d2009-04-29 14:43:54 -07008552 struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data;
Daniel Vetterc05422d2009-08-11 16:05:30 +02008553 struct drm_mode_object *drmmode_obj;
8554 struct intel_crtc *crtc;
Carl Worth08d7b3d2009-04-29 14:43:54 -07008555
Daniel Vetter1cff8f62012-04-24 09:55:08 +02008556 if (!drm_core_check_feature(dev, DRIVER_MODESET))
8557 return -ENODEV;
Carl Worth08d7b3d2009-04-29 14:43:54 -07008558
Daniel Vetterc05422d2009-08-11 16:05:30 +02008559 drmmode_obj = drm_mode_object_find(dev, pipe_from_crtc_id->crtc_id,
8560 DRM_MODE_OBJECT_CRTC);
Carl Worth08d7b3d2009-04-29 14:43:54 -07008561
Daniel Vetterc05422d2009-08-11 16:05:30 +02008562 if (!drmmode_obj) {
Carl Worth08d7b3d2009-04-29 14:43:54 -07008563 DRM_ERROR("no such CRTC id\n");
8564 return -EINVAL;
8565 }
8566
Daniel Vetterc05422d2009-08-11 16:05:30 +02008567 crtc = to_intel_crtc(obj_to_crtc(drmmode_obj));
8568 pipe_from_crtc_id->pipe = crtc->pipe;
Carl Worth08d7b3d2009-04-29 14:43:54 -07008569
Daniel Vetterc05422d2009-08-11 16:05:30 +02008570 return 0;
Carl Worth08d7b3d2009-04-29 14:43:54 -07008571}
8572
Daniel Vetter66a92782012-07-12 20:08:18 +02008573static int intel_encoder_clones(struct intel_encoder *encoder)
Jesse Barnes79e53942008-11-07 14:24:08 -08008574{
Daniel Vetter66a92782012-07-12 20:08:18 +02008575 struct drm_device *dev = encoder->base.dev;
8576 struct intel_encoder *source_encoder;
Jesse Barnes79e53942008-11-07 14:24:08 -08008577 int index_mask = 0;
Jesse Barnes79e53942008-11-07 14:24:08 -08008578 int entry = 0;
8579
Daniel Vetter66a92782012-07-12 20:08:18 +02008580 list_for_each_entry(source_encoder,
8581 &dev->mode_config.encoder_list, base.head) {
8582
8583 if (encoder == source_encoder)
Jesse Barnes79e53942008-11-07 14:24:08 -08008584 index_mask |= (1 << entry);
Daniel Vetter66a92782012-07-12 20:08:18 +02008585
8586 /* Intel hw has only one MUX where enocoders could be cloned. */
8587 if (encoder->cloneable && source_encoder->cloneable)
8588 index_mask |= (1 << entry);
8589
Jesse Barnes79e53942008-11-07 14:24:08 -08008590 entry++;
8591 }
Chris Wilson4ef69c72010-09-09 15:14:28 +01008592
Jesse Barnes79e53942008-11-07 14:24:08 -08008593 return index_mask;
8594}
8595
Chris Wilson4d302442010-12-14 19:21:29 +00008596static bool has_edp_a(struct drm_device *dev)
8597{
8598 struct drm_i915_private *dev_priv = dev->dev_private;
8599
8600 if (!IS_MOBILE(dev))
8601 return false;
8602
8603 if ((I915_READ(DP_A) & DP_DETECTED) == 0)
8604 return false;
8605
8606 if (IS_GEN5(dev) &&
8607 (I915_READ(ILK_DISPLAY_CHICKEN_FUSES) & ILK_eDP_A_DISABLE))
8608 return false;
8609
8610 return true;
8611}
8612
Jesse Barnes79e53942008-11-07 14:24:08 -08008613static void intel_setup_outputs(struct drm_device *dev)
8614{
Eric Anholt725e30a2009-01-22 13:01:02 -08008615 struct drm_i915_private *dev_priv = dev->dev_private;
Chris Wilson4ef69c72010-09-09 15:14:28 +01008616 struct intel_encoder *encoder;
Adam Jacksoncb0953d2010-07-16 14:46:29 -04008617 bool dpd_is_edp = false;
Chris Wilsonf3cfcba2012-02-09 09:35:53 +00008618 bool has_lvds;
Jesse Barnes79e53942008-11-07 14:24:08 -08008619
Chris Wilsonf3cfcba2012-02-09 09:35:53 +00008620 has_lvds = intel_lvds_init(dev);
Chris Wilsonc5d1b512010-11-29 18:00:23 +00008621 if (!has_lvds && !HAS_PCH_SPLIT(dev)) {
8622 /* disable the panel fitter on everything but LVDS */
8623 I915_WRITE(PFIT_CONTROL, 0);
8624 }
Jesse Barnes79e53942008-11-07 14:24:08 -08008625
Paulo Zanonic40c0f52013-04-12 18:16:53 -03008626 if (!IS_ULT(dev))
Paulo Zanoni79935fc2012-11-20 13:27:40 -02008627 intel_crt_init(dev);
Adam Jacksoncb0953d2010-07-16 14:46:29 -04008628
Paulo Zanoniaffa9352012-11-23 15:30:39 -02008629 if (HAS_DDI(dev)) {
Eugeni Dodonov0e72a5b2012-05-09 15:37:27 -03008630 int found;
8631
8632 /* Haswell uses DDI functions to detect digital outputs */
8633 found = I915_READ(DDI_BUF_CTL_A) & DDI_INIT_DISPLAY_DETECTED;
8634 /* DDI A only supports eDP */
8635 if (found)
8636 intel_ddi_init(dev, PORT_A);
8637
8638 /* DDI B, C and D detection is indicated by the SFUSE_STRAP
8639 * register */
8640 found = I915_READ(SFUSE_STRAP);
8641
8642 if (found & SFUSE_STRAP_DDIB_DETECTED)
8643 intel_ddi_init(dev, PORT_B);
8644 if (found & SFUSE_STRAP_DDIC_DETECTED)
8645 intel_ddi_init(dev, PORT_C);
8646 if (found & SFUSE_STRAP_DDID_DETECTED)
8647 intel_ddi_init(dev, PORT_D);
8648 } else if (HAS_PCH_SPLIT(dev)) {
Adam Jacksoncb0953d2010-07-16 14:46:29 -04008649 int found;
Daniel Vetter270b3042012-10-27 15:52:05 +02008650 dpd_is_edp = intel_dpd_is_edp(dev);
8651
8652 if (has_edp_a(dev))
8653 intel_dp_init(dev, DP_A, PORT_A);
Adam Jacksoncb0953d2010-07-16 14:46:29 -04008654
Paulo Zanonidc0fa712013-02-19 16:21:46 -03008655 if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
Zhao Yakui461ed3c2010-03-30 15:11:33 +08008656 /* PCH SDVOB multiplex with HDMIB */
Daniel Vettereef4eac2012-03-23 23:43:35 +01008657 found = intel_sdvo_init(dev, PCH_SDVOB, true);
Zhenyu Wang30ad48b2009-06-05 15:38:43 +08008658 if (!found)
Paulo Zanonie2debe92013-02-18 19:00:27 -03008659 intel_hdmi_init(dev, PCH_HDMIB, PORT_B);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08008660 if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03008661 intel_dp_init(dev, PCH_DP_B, PORT_B);
Zhenyu Wang30ad48b2009-06-05 15:38:43 +08008662 }
8663
Paulo Zanonidc0fa712013-02-19 16:21:46 -03008664 if (I915_READ(PCH_HDMIC) & SDVO_DETECTED)
Paulo Zanonie2debe92013-02-18 19:00:27 -03008665 intel_hdmi_init(dev, PCH_HDMIC, PORT_C);
Zhenyu Wang30ad48b2009-06-05 15:38:43 +08008666
Paulo Zanonidc0fa712013-02-19 16:21:46 -03008667 if (!dpd_is_edp && I915_READ(PCH_HDMID) & SDVO_DETECTED)
Paulo Zanonie2debe92013-02-18 19:00:27 -03008668 intel_hdmi_init(dev, PCH_HDMID, PORT_D);
Zhenyu Wang30ad48b2009-06-05 15:38:43 +08008669
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08008670 if (I915_READ(PCH_DP_C) & DP_DETECTED)
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03008671 intel_dp_init(dev, PCH_DP_C, PORT_C);
Zhenyu Wang5eb08b62009-07-24 01:00:31 +08008672
Daniel Vetter270b3042012-10-27 15:52:05 +02008673 if (I915_READ(PCH_DP_D) & DP_DETECTED)
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03008674 intel_dp_init(dev, PCH_DP_D, PORT_D);
Jesse Barnes4a87d652012-06-15 11:55:16 -07008675 } else if (IS_VALLEYVIEW(dev)) {
Gajanan Bhat19c03922012-09-27 19:13:07 +05308676 /* Check for built-in panel first. Shares lanes with HDMI on SDVOC */
Ville Syrjälä67cfc202013-01-25 21:44:44 +02008677 if (I915_READ(VLV_DISPLAY_BASE + DP_C) & DP_DETECTED)
8678 intel_dp_init(dev, VLV_DISPLAY_BASE + DP_C, PORT_C);
Gajanan Bhat19c03922012-09-27 19:13:07 +05308679
Paulo Zanonidc0fa712013-02-19 16:21:46 -03008680 if (I915_READ(VLV_DISPLAY_BASE + GEN4_HDMIB) & SDVO_DETECTED) {
Paulo Zanonie2debe92013-02-18 19:00:27 -03008681 intel_hdmi_init(dev, VLV_DISPLAY_BASE + GEN4_HDMIB,
8682 PORT_B);
Ville Syrjälä67cfc202013-01-25 21:44:44 +02008683 if (I915_READ(VLV_DISPLAY_BASE + DP_B) & DP_DETECTED)
8684 intel_dp_init(dev, VLV_DISPLAY_BASE + DP_B, PORT_B);
Jesse Barnes4a87d652012-06-15 11:55:16 -07008685 }
Zhenyu Wang103a1962009-11-27 11:44:36 +08008686 } else if (SUPPORTS_DIGITAL_OUTPUTS(dev)) {
Ma Ling27185ae2009-08-24 13:50:23 +08008687 bool found = false;
Eric Anholt7d573822009-01-02 13:33:00 -08008688
Paulo Zanonie2debe92013-02-18 19:00:27 -03008689 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008690 DRM_DEBUG_KMS("probing SDVOB\n");
Paulo Zanonie2debe92013-02-18 19:00:27 -03008691 found = intel_sdvo_init(dev, GEN3_SDVOB, true);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008692 if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) {
8693 DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
Paulo Zanonie2debe92013-02-18 19:00:27 -03008694 intel_hdmi_init(dev, GEN4_HDMIB, PORT_B);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008695 }
Ma Ling27185ae2009-08-24 13:50:23 +08008696
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008697 if (!found && SUPPORTS_INTEGRATED_DP(dev)) {
8698 DRM_DEBUG_KMS("probing DP_B\n");
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03008699 intel_dp_init(dev, DP_B, PORT_B);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008700 }
Eric Anholt725e30a2009-01-22 13:01:02 -08008701 }
Kristian Høgsberg13520b02009-03-13 15:42:14 -04008702
8703 /* Before G4X SDVOC doesn't have its own detect register */
Kristian Høgsberg13520b02009-03-13 15:42:14 -04008704
Paulo Zanonie2debe92013-02-18 19:00:27 -03008705 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008706 DRM_DEBUG_KMS("probing SDVOC\n");
Paulo Zanonie2debe92013-02-18 19:00:27 -03008707 found = intel_sdvo_init(dev, GEN3_SDVOC, false);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008708 }
Ma Ling27185ae2009-08-24 13:50:23 +08008709
Paulo Zanonie2debe92013-02-18 19:00:27 -03008710 if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
Ma Ling27185ae2009-08-24 13:50:23 +08008711
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008712 if (SUPPORTS_INTEGRATED_HDMI(dev)) {
8713 DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
Paulo Zanonie2debe92013-02-18 19:00:27 -03008714 intel_hdmi_init(dev, GEN4_HDMIC, PORT_C);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008715 }
8716 if (SUPPORTS_INTEGRATED_DP(dev)) {
8717 DRM_DEBUG_KMS("probing DP_C\n");
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03008718 intel_dp_init(dev, DP_C, PORT_C);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008719 }
Eric Anholt725e30a2009-01-22 13:01:02 -08008720 }
Ma Ling27185ae2009-08-24 13:50:23 +08008721
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008722 if (SUPPORTS_INTEGRATED_DP(dev) &&
8723 (I915_READ(DP_D) & DP_DETECTED)) {
8724 DRM_DEBUG_KMS("probing DP_D\n");
Paulo Zanoniab9d7c32012-07-17 17:53:45 -03008725 intel_dp_init(dev, DP_D, PORT_D);
Jesse Barnesb01f2c32009-12-11 11:07:17 -08008726 }
Eric Anholtbad720f2009-10-22 16:11:14 -07008727 } else if (IS_GEN2(dev))
Jesse Barnes79e53942008-11-07 14:24:08 -08008728 intel_dvo_init(dev);
8729
Zhenyu Wang103a1962009-11-27 11:44:36 +08008730 if (SUPPORTS_TV(dev))
Jesse Barnes79e53942008-11-07 14:24:08 -08008731 intel_tv_init(dev);
8732
Chris Wilson4ef69c72010-09-09 15:14:28 +01008733 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
8734 encoder->base.possible_crtcs = encoder->crtc_mask;
8735 encoder->base.possible_clones =
Daniel Vetter66a92782012-07-12 20:08:18 +02008736 intel_encoder_clones(encoder);
Jesse Barnes79e53942008-11-07 14:24:08 -08008737 }
Chris Wilson47356eb2011-01-11 17:06:04 +00008738
Paulo Zanonidde86e22012-12-01 12:04:25 -02008739 intel_init_pch_refclk(dev);
Daniel Vetter270b3042012-10-27 15:52:05 +02008740
8741 drm_helper_move_panel_connectors_to_head(dev);
Jesse Barnes79e53942008-11-07 14:24:08 -08008742}
8743
8744static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
8745{
8746 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
Jesse Barnes79e53942008-11-07 14:24:08 -08008747
8748 drm_framebuffer_cleanup(fb);
Chris Wilson05394f32010-11-08 19:18:58 +00008749 drm_gem_object_unreference_unlocked(&intel_fb->obj->base);
Jesse Barnes79e53942008-11-07 14:24:08 -08008750
8751 kfree(intel_fb);
8752}
8753
8754static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
Chris Wilson05394f32010-11-08 19:18:58 +00008755 struct drm_file *file,
Jesse Barnes79e53942008-11-07 14:24:08 -08008756 unsigned int *handle)
8757{
8758 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
Chris Wilson05394f32010-11-08 19:18:58 +00008759 struct drm_i915_gem_object *obj = intel_fb->obj;
Jesse Barnes79e53942008-11-07 14:24:08 -08008760
Chris Wilson05394f32010-11-08 19:18:58 +00008761 return drm_gem_handle_create(file, &obj->base, handle);
Jesse Barnes79e53942008-11-07 14:24:08 -08008762}
8763
8764static const struct drm_framebuffer_funcs intel_fb_funcs = {
8765 .destroy = intel_user_framebuffer_destroy,
8766 .create_handle = intel_user_framebuffer_create_handle,
8767};
8768
Dave Airlie38651672010-03-30 05:34:13 +00008769int intel_framebuffer_init(struct drm_device *dev,
8770 struct intel_framebuffer *intel_fb,
Jesse Barnes308e5bc2011-11-14 14:51:28 -08008771 struct drm_mode_fb_cmd2 *mode_cmd,
Chris Wilson05394f32010-11-08 19:18:58 +00008772 struct drm_i915_gem_object *obj)
Jesse Barnes79e53942008-11-07 14:24:08 -08008773{
Jesse Barnes79e53942008-11-07 14:24:08 -08008774 int ret;
8775
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008776 if (obj->tiling_mode == I915_TILING_Y) {
8777 DRM_DEBUG("hardware does not support tiling Y\n");
Chris Wilson57cd6502010-08-08 12:34:44 +01008778 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008779 }
Chris Wilson57cd6502010-08-08 12:34:44 +01008780
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008781 if (mode_cmd->pitches[0] & 63) {
8782 DRM_DEBUG("pitch (%d) must be at least 64 byte aligned\n",
8783 mode_cmd->pitches[0]);
Chris Wilson57cd6502010-08-08 12:34:44 +01008784 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008785 }
Chris Wilson57cd6502010-08-08 12:34:44 +01008786
Ville Syrjälä5d7bd702012-10-31 17:50:18 +02008787 /* FIXME <= Gen4 stride limits are bit unclear */
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008788 if (mode_cmd->pitches[0] > 32768) {
8789 DRM_DEBUG("pitch (%d) must be at less than 32768\n",
8790 mode_cmd->pitches[0]);
Ville Syrjälä5d7bd702012-10-31 17:50:18 +02008791 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008792 }
Ville Syrjälä5d7bd702012-10-31 17:50:18 +02008793
8794 if (obj->tiling_mode != I915_TILING_NONE &&
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008795 mode_cmd->pitches[0] != obj->stride) {
8796 DRM_DEBUG("pitch (%d) must match tiling stride (%d)\n",
8797 mode_cmd->pitches[0], obj->stride);
Ville Syrjälä5d7bd702012-10-31 17:50:18 +02008798 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008799 }
Ville Syrjälä5d7bd702012-10-31 17:50:18 +02008800
Ville Syrjälä57779d02012-10-31 17:50:14 +02008801 /* Reject formats not supported by any plane early. */
Jesse Barnes308e5bc2011-11-14 14:51:28 -08008802 switch (mode_cmd->pixel_format) {
Ville Syrjälä57779d02012-10-31 17:50:14 +02008803 case DRM_FORMAT_C8:
Ville Syrjälä04b39242011-11-17 18:05:13 +02008804 case DRM_FORMAT_RGB565:
8805 case DRM_FORMAT_XRGB8888:
8806 case DRM_FORMAT_ARGB8888:
Ville Syrjälä57779d02012-10-31 17:50:14 +02008807 break;
8808 case DRM_FORMAT_XRGB1555:
8809 case DRM_FORMAT_ARGB1555:
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008810 if (INTEL_INFO(dev)->gen > 3) {
8811 DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);
Ville Syrjälä57779d02012-10-31 17:50:14 +02008812 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008813 }
Ville Syrjälä57779d02012-10-31 17:50:14 +02008814 break;
8815 case DRM_FORMAT_XBGR8888:
8816 case DRM_FORMAT_ABGR8888:
Ville Syrjälä04b39242011-11-17 18:05:13 +02008817 case DRM_FORMAT_XRGB2101010:
8818 case DRM_FORMAT_ARGB2101010:
Ville Syrjälä57779d02012-10-31 17:50:14 +02008819 case DRM_FORMAT_XBGR2101010:
8820 case DRM_FORMAT_ABGR2101010:
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008821 if (INTEL_INFO(dev)->gen < 4) {
8822 DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);
Ville Syrjälä57779d02012-10-31 17:50:14 +02008823 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008824 }
Jesse Barnesb5626742011-06-24 12:19:27 -07008825 break;
Ville Syrjälä04b39242011-11-17 18:05:13 +02008826 case DRM_FORMAT_YUYV:
8827 case DRM_FORMAT_UYVY:
8828 case DRM_FORMAT_YVYU:
8829 case DRM_FORMAT_VYUY:
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008830 if (INTEL_INFO(dev)->gen < 5) {
8831 DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);
Ville Syrjälä57779d02012-10-31 17:50:14 +02008832 return -EINVAL;
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008833 }
Chris Wilson57cd6502010-08-08 12:34:44 +01008834 break;
8835 default:
Chris Wilsonc16ed4b2012-12-18 22:13:14 +00008836 DRM_DEBUG("unsupported pixel format 0x%08x\n", mode_cmd->pixel_format);
Chris Wilson57cd6502010-08-08 12:34:44 +01008837 return -EINVAL;
8838 }
8839
Ville Syrjälä90f9a332012-10-31 17:50:19 +02008840 /* FIXME need to adjust LINOFF/TILEOFF accordingly. */
8841 if (mode_cmd->offsets[0] != 0)
8842 return -EINVAL;
8843
Daniel Vetterc7d73f62012-12-13 23:38:38 +01008844 drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
8845 intel_fb->obj = obj;
8846
Jesse Barnes79e53942008-11-07 14:24:08 -08008847 ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs);
8848 if (ret) {
8849 DRM_ERROR("framebuffer init failed %d\n", ret);
8850 return ret;
8851 }
8852
Jesse Barnes79e53942008-11-07 14:24:08 -08008853 return 0;
8854}
8855
Jesse Barnes79e53942008-11-07 14:24:08 -08008856static struct drm_framebuffer *
8857intel_user_framebuffer_create(struct drm_device *dev,
8858 struct drm_file *filp,
Jesse Barnes308e5bc2011-11-14 14:51:28 -08008859 struct drm_mode_fb_cmd2 *mode_cmd)
Jesse Barnes79e53942008-11-07 14:24:08 -08008860{
Chris Wilson05394f32010-11-08 19:18:58 +00008861 struct drm_i915_gem_object *obj;
Jesse Barnes79e53942008-11-07 14:24:08 -08008862
Jesse Barnes308e5bc2011-11-14 14:51:28 -08008863 obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
8864 mode_cmd->handles[0]));
Chris Wilsonc8725222011-02-19 11:31:06 +00008865 if (&obj->base == NULL)
Chris Wilsoncce13ff2010-08-08 13:36:38 +01008866 return ERR_PTR(-ENOENT);
Jesse Barnes79e53942008-11-07 14:24:08 -08008867
Chris Wilsond2dff872011-04-19 08:36:26 +01008868 return intel_framebuffer_create(dev, mode_cmd, obj);
Jesse Barnes79e53942008-11-07 14:24:08 -08008869}
8870
Jesse Barnes79e53942008-11-07 14:24:08 -08008871static const struct drm_mode_config_funcs intel_mode_funcs = {
Jesse Barnes79e53942008-11-07 14:24:08 -08008872 .fb_create = intel_user_framebuffer_create,
Dave Airlieeb1f8e42010-05-07 06:42:51 +00008873 .output_poll_changed = intel_fb_output_poll_changed,
Jesse Barnes79e53942008-11-07 14:24:08 -08008874};
8875
Jesse Barnese70236a2009-09-21 10:42:27 -07008876/* Set up chip specific display functions */
8877static void intel_init_display(struct drm_device *dev)
8878{
8879 struct drm_i915_private *dev_priv = dev->dev_private;
8880
Paulo Zanoniaffa9352012-11-23 15:30:39 -02008881 if (HAS_DDI(dev)) {
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01008882 dev_priv->display.get_pipe_config = haswell_get_pipe_config;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03008883 dev_priv->display.crtc_mode_set = haswell_crtc_mode_set;
Paulo Zanoni4f771f12012-10-23 18:29:51 -02008884 dev_priv->display.crtc_enable = haswell_crtc_enable;
8885 dev_priv->display.crtc_disable = haswell_crtc_disable;
Paulo Zanoni6441ab52012-10-05 12:05:58 -03008886 dev_priv->display.off = haswell_crtc_off;
Paulo Zanoni09b4ddf2012-10-05 12:05:55 -03008887 dev_priv->display.update_plane = ironlake_update_plane;
8888 } else if (HAS_PCH_SPLIT(dev)) {
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01008889 dev_priv->display.get_pipe_config = ironlake_get_pipe_config;
Eric Anholtf564048e2011-03-30 13:01:02 -07008890 dev_priv->display.crtc_mode_set = ironlake_crtc_mode_set;
Daniel Vetter76e5a892012-06-29 22:39:33 +02008891 dev_priv->display.crtc_enable = ironlake_crtc_enable;
8892 dev_priv->display.crtc_disable = ironlake_crtc_disable;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01008893 dev_priv->display.off = ironlake_crtc_off;
Jesse Barnes17638cd2011-06-24 12:19:23 -07008894 dev_priv->display.update_plane = ironlake_update_plane;
Jesse Barnes89b667f2013-04-18 14:51:36 -07008895 } else if (IS_VALLEYVIEW(dev)) {
8896 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
8897 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set;
8898 dev_priv->display.crtc_enable = valleyview_crtc_enable;
8899 dev_priv->display.crtc_disable = i9xx_crtc_disable;
8900 dev_priv->display.off = i9xx_crtc_off;
8901 dev_priv->display.update_plane = i9xx_update_plane;
Eric Anholtf564048e2011-03-30 13:01:02 -07008902 } else {
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01008903 dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
Eric Anholtf564048e2011-03-30 13:01:02 -07008904 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set;
Daniel Vetter76e5a892012-06-29 22:39:33 +02008905 dev_priv->display.crtc_enable = i9xx_crtc_enable;
8906 dev_priv->display.crtc_disable = i9xx_crtc_disable;
Jesse Barnesee7b9f92012-04-20 17:11:53 +01008907 dev_priv->display.off = i9xx_crtc_off;
Jesse Barnes17638cd2011-06-24 12:19:23 -07008908 dev_priv->display.update_plane = i9xx_update_plane;
Eric Anholtf564048e2011-03-30 13:01:02 -07008909 }
Jesse Barnese70236a2009-09-21 10:42:27 -07008910
Jesse Barnese70236a2009-09-21 10:42:27 -07008911 /* Returns the core display clock speed */
Jesse Barnes25eb05fc2012-03-28 13:39:23 -07008912 if (IS_VALLEYVIEW(dev))
8913 dev_priv->display.get_display_clock_speed =
8914 valleyview_get_display_clock_speed;
8915 else if (IS_I945G(dev) || (IS_G33(dev) && !IS_PINEVIEW_M(dev)))
Jesse Barnese70236a2009-09-21 10:42:27 -07008916 dev_priv->display.get_display_clock_speed =
8917 i945_get_display_clock_speed;
8918 else if (IS_I915G(dev))
8919 dev_priv->display.get_display_clock_speed =
8920 i915_get_display_clock_speed;
Adam Jacksonf2b115e2009-12-03 17:14:42 -05008921 else if (IS_I945GM(dev) || IS_845G(dev) || IS_PINEVIEW_M(dev))
Jesse Barnese70236a2009-09-21 10:42:27 -07008922 dev_priv->display.get_display_clock_speed =
8923 i9xx_misc_get_display_clock_speed;
8924 else if (IS_I915GM(dev))
8925 dev_priv->display.get_display_clock_speed =
8926 i915gm_get_display_clock_speed;
8927 else if (IS_I865G(dev))
8928 dev_priv->display.get_display_clock_speed =
8929 i865_get_display_clock_speed;
Daniel Vetterf0f8a9c2009-09-15 22:57:33 +02008930 else if (IS_I85X(dev))
Jesse Barnese70236a2009-09-21 10:42:27 -07008931 dev_priv->display.get_display_clock_speed =
8932 i855_get_display_clock_speed;
8933 else /* 852, 830 */
8934 dev_priv->display.get_display_clock_speed =
8935 i830_get_display_clock_speed;
8936
Zhenyu Wang7f8a8562010-04-01 13:07:53 +08008937 if (HAS_PCH_SPLIT(dev)) {
Chris Wilsonf00a3dd2010-10-21 14:57:17 +01008938 if (IS_GEN5(dev)) {
Jesse Barnes674cf962011-04-28 14:27:04 -07008939 dev_priv->display.fdi_link_train = ironlake_fdi_link_train;
Wu Fengguange0dac652011-09-05 14:25:34 +08008940 dev_priv->display.write_eld = ironlake_write_eld;
Yuanhan Liu13982612010-12-15 15:42:31 +08008941 } else if (IS_GEN6(dev)) {
Jesse Barnes674cf962011-04-28 14:27:04 -07008942 dev_priv->display.fdi_link_train = gen6_fdi_link_train;
Wu Fengguange0dac652011-09-05 14:25:34 +08008943 dev_priv->display.write_eld = ironlake_write_eld;
Jesse Barnes357555c2011-04-28 15:09:55 -07008944 } else if (IS_IVYBRIDGE(dev)) {
8945 /* FIXME: detect B0+ stepping and use auto training */
8946 dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train;
Wu Fengguange0dac652011-09-05 14:25:34 +08008947 dev_priv->display.write_eld = ironlake_write_eld;
Daniel Vetter01a415f2012-10-27 15:58:40 +02008948 dev_priv->display.modeset_global_resources =
8949 ivb_modeset_global_resources;
Eugeni Dodonovc82e4d22012-05-09 15:37:21 -03008950 } else if (IS_HASWELL(dev)) {
8951 dev_priv->display.fdi_link_train = hsw_fdi_link_train;
Wang Xingchao83358c852012-08-16 22:43:37 +08008952 dev_priv->display.write_eld = haswell_write_eld;
Daniel Vetterd6dd9eb2013-01-29 16:35:20 -02008953 dev_priv->display.modeset_global_resources =
8954 haswell_modeset_global_resources;
Paulo Zanonia0e63c22012-12-06 11:12:39 -02008955 }
Jesse Barnes6067aae2011-04-28 15:04:31 -07008956 } else if (IS_G4X(dev)) {
Wu Fengguange0dac652011-09-05 14:25:34 +08008957 dev_priv->display.write_eld = g4x_write_eld;
Jesse Barnese70236a2009-09-21 10:42:27 -07008958 }
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07008959
8960 /* Default just returns -ENODEV to indicate unsupported */
8961 dev_priv->display.queue_flip = intel_default_queue_flip;
8962
8963 switch (INTEL_INFO(dev)->gen) {
8964 case 2:
8965 dev_priv->display.queue_flip = intel_gen2_queue_flip;
8966 break;
8967
8968 case 3:
8969 dev_priv->display.queue_flip = intel_gen3_queue_flip;
8970 break;
8971
8972 case 4:
8973 case 5:
8974 dev_priv->display.queue_flip = intel_gen4_queue_flip;
8975 break;
8976
8977 case 6:
8978 dev_priv->display.queue_flip = intel_gen6_queue_flip;
8979 break;
Jesse Barnes7c9017e2011-06-16 12:18:54 -07008980 case 7:
8981 dev_priv->display.queue_flip = intel_gen7_queue_flip;
8982 break;
Jesse Barnes8c9f3aa2011-06-16 09:19:13 -07008983 }
Jesse Barnese70236a2009-09-21 10:42:27 -07008984}
8985
Jesse Barnesb690e962010-07-19 13:53:12 -07008986/*
8987 * Some BIOSes insist on assuming the GPU's pipe A is enabled at suspend,
8988 * resume, or other times. This quirk makes sure that's the case for
8989 * affected systems.
8990 */
Akshay Joshi0206e352011-08-16 15:34:10 -04008991static void quirk_pipea_force(struct drm_device *dev)
Jesse Barnesb690e962010-07-19 13:53:12 -07008992{
8993 struct drm_i915_private *dev_priv = dev->dev_private;
8994
8995 dev_priv->quirks |= QUIRK_PIPEA_FORCE;
Daniel Vetterbc0daf42012-04-01 13:16:49 +02008996 DRM_INFO("applying pipe a force quirk\n");
Jesse Barnesb690e962010-07-19 13:53:12 -07008997}
8998
Keith Packard435793d2011-07-12 14:56:22 -07008999/*
9000 * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
9001 */
9002static void quirk_ssc_force_disable(struct drm_device *dev)
9003{
9004 struct drm_i915_private *dev_priv = dev->dev_private;
9005 dev_priv->quirks |= QUIRK_LVDS_SSC_DISABLE;
Daniel Vetterbc0daf42012-04-01 13:16:49 +02009006 DRM_INFO("applying lvds SSC disable quirk\n");
Keith Packard435793d2011-07-12 14:56:22 -07009007}
9008
Carsten Emde4dca20e2012-03-15 15:56:26 +01009009/*
Carsten Emde5a15ab52012-03-15 15:56:27 +01009010 * A machine (e.g. Acer Aspire 5734Z) may need to invert the panel backlight
9011 * brightness value
Carsten Emde4dca20e2012-03-15 15:56:26 +01009012 */
9013static void quirk_invert_brightness(struct drm_device *dev)
9014{
9015 struct drm_i915_private *dev_priv = dev->dev_private;
9016 dev_priv->quirks |= QUIRK_INVERT_BRIGHTNESS;
Daniel Vetterbc0daf42012-04-01 13:16:49 +02009017 DRM_INFO("applying inverted panel brightness quirk\n");
Jesse Barnesb690e962010-07-19 13:53:12 -07009018}
9019
9020struct intel_quirk {
9021 int device;
9022 int subsystem_vendor;
9023 int subsystem_device;
9024 void (*hook)(struct drm_device *dev);
9025};
9026
Egbert Eich5f85f1762012-10-14 15:46:38 +02009027/* For systems that don't have a meaningful PCI subdevice/subvendor ID */
9028struct intel_dmi_quirk {
9029 void (*hook)(struct drm_device *dev);
9030 const struct dmi_system_id (*dmi_id_list)[];
9031};
9032
9033static int intel_dmi_reverse_brightness(const struct dmi_system_id *id)
9034{
9035 DRM_INFO("Backlight polarity reversed on %s\n", id->ident);
9036 return 1;
9037}
9038
9039static const struct intel_dmi_quirk intel_dmi_quirks[] = {
9040 {
9041 .dmi_id_list = &(const struct dmi_system_id[]) {
9042 {
9043 .callback = intel_dmi_reverse_brightness,
9044 .ident = "NCR Corporation",
9045 .matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"),
9046 DMI_MATCH(DMI_PRODUCT_NAME, ""),
9047 },
9048 },
9049 { } /* terminating entry */
9050 },
9051 .hook = quirk_invert_brightness,
9052 },
9053};
9054
Ben Widawskyc43b5632012-04-16 14:07:40 -07009055static struct intel_quirk intel_quirks[] = {
Jesse Barnesb690e962010-07-19 13:53:12 -07009056 /* HP Mini needs pipe A force quirk (LP: #322104) */
Akshay Joshi0206e352011-08-16 15:34:10 -04009057 { 0x27ae, 0x103c, 0x361a, quirk_pipea_force },
Jesse Barnesb690e962010-07-19 13:53:12 -07009058
Jesse Barnesb690e962010-07-19 13:53:12 -07009059 /* Toshiba Protege R-205, S-209 needs pipe A force quirk */
9060 { 0x2592, 0x1179, 0x0001, quirk_pipea_force },
9061
Jesse Barnesb690e962010-07-19 13:53:12 -07009062 /* ThinkPad T60 needs pipe A force quirk (bug #16494) */
9063 { 0x2782, 0x17aa, 0x201a, quirk_pipea_force },
9064
Daniel Vetterccd0d362012-10-10 23:13:59 +02009065 /* 830/845 need to leave pipe A & dpll A up */
Jesse Barnesb690e962010-07-19 13:53:12 -07009066 { 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },
Daniel Vetterdcdaed62012-08-12 21:19:34 +02009067 { 0x3577, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },
Keith Packard435793d2011-07-12 14:56:22 -07009068
9069 /* Lenovo U160 cannot use SSC on LVDS */
9070 { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable },
Michel Alexandre Salim070d3292011-07-28 18:52:06 +02009071
9072 /* Sony Vaio Y cannot use SSC on LVDS */
9073 { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
Carsten Emde5a15ab52012-03-15 15:56:27 +01009074
9075 /* Acer Aspire 5734Z must invert backlight brightness */
9076 { 0x2a42, 0x1025, 0x0459, quirk_invert_brightness },
Jani Nikula1ffff602013-01-22 12:50:34 +02009077
9078 /* Acer/eMachines G725 */
9079 { 0x2a42, 0x1025, 0x0210, quirk_invert_brightness },
Jani Nikula01e3a8f2013-01-22 12:50:35 +02009080
9081 /* Acer/eMachines e725 */
9082 { 0x2a42, 0x1025, 0x0212, quirk_invert_brightness },
Jani Nikula5559eca2013-01-22 12:50:36 +02009083
9084 /* Acer/Packard Bell NCL20 */
9085 { 0x2a42, 0x1025, 0x034b, quirk_invert_brightness },
Daniel Vetterac4199e2013-02-15 18:35:30 +01009086
9087 /* Acer Aspire 4736Z */
9088 { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness },
Jesse Barnesb690e962010-07-19 13:53:12 -07009089};
9090
9091static void intel_init_quirks(struct drm_device *dev)
9092{
9093 struct pci_dev *d = dev->pdev;
9094 int i;
9095
9096 for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
9097 struct intel_quirk *q = &intel_quirks[i];
9098
9099 if (d->device == q->device &&
9100 (d->subsystem_vendor == q->subsystem_vendor ||
9101 q->subsystem_vendor == PCI_ANY_ID) &&
9102 (d->subsystem_device == q->subsystem_device ||
9103 q->subsystem_device == PCI_ANY_ID))
9104 q->hook(dev);
9105 }
Egbert Eich5f85f1762012-10-14 15:46:38 +02009106 for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) {
9107 if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0)
9108 intel_dmi_quirks[i].hook(dev);
9109 }
Jesse Barnesb690e962010-07-19 13:53:12 -07009110}
9111
Jesse Barnes9cce37f2010-08-13 15:11:26 -07009112/* Disable the VGA plane that we never use */
9113static void i915_disable_vga(struct drm_device *dev)
9114{
9115 struct drm_i915_private *dev_priv = dev->dev_private;
9116 u8 sr1;
Ville Syrjälä766aa1c2013-01-25 21:44:46 +02009117 u32 vga_reg = i915_vgacntrl_reg(dev);
Jesse Barnes9cce37f2010-08-13 15:11:26 -07009118
9119 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
Jesse Barnes3fdcf432012-04-06 11:46:27 -07009120 outb(SR01, VGA_SR_INDEX);
Jesse Barnes9cce37f2010-08-13 15:11:26 -07009121 sr1 = inb(VGA_SR_DATA);
9122 outb(sr1 | 1<<5, VGA_SR_DATA);
9123 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
9124 udelay(300);
9125
9126 I915_WRITE(vga_reg, VGA_DISP_DISABLE);
9127 POSTING_READ(vga_reg);
9128}
9129
Daniel Vetterf8175862012-04-10 15:50:11 +02009130void intel_modeset_init_hw(struct drm_device *dev)
9131{
Paulo Zanonifa42e232013-01-25 16:59:11 -02009132 intel_init_power_well(dev);
Eugeni Dodonov0232e922012-07-06 15:42:36 -03009133
Eugeni Dodonova8f78b52012-06-28 15:55:35 -03009134 intel_prepare_ddi(dev);
9135
Daniel Vetterf8175862012-04-10 15:50:11 +02009136 intel_init_clock_gating(dev);
9137
Daniel Vetter79f5b2c2012-06-24 16:42:33 +02009138 mutex_lock(&dev->struct_mutex);
Daniel Vetter8090c6b2012-06-24 16:42:32 +02009139 intel_enable_gt_powersave(dev);
Daniel Vetter79f5b2c2012-06-24 16:42:33 +02009140 mutex_unlock(&dev->struct_mutex);
Daniel Vetterf8175862012-04-10 15:50:11 +02009141}
9142
Jesse Barnes79e53942008-11-07 14:24:08 -08009143void intel_modeset_init(struct drm_device *dev)
9144{
Jesse Barnes652c3932009-08-17 13:31:43 -07009145 struct drm_i915_private *dev_priv = dev->dev_private;
Jesse Barnes7f1f3852013-04-02 11:22:20 -07009146 int i, j, ret;
Jesse Barnes79e53942008-11-07 14:24:08 -08009147
9148 drm_mode_config_init(dev);
9149
9150 dev->mode_config.min_width = 0;
9151 dev->mode_config.min_height = 0;
9152
Dave Airlie019d96c2011-09-29 16:20:42 +01009153 dev->mode_config.preferred_depth = 24;
9154 dev->mode_config.prefer_shadow = 1;
9155
Laurent Pincharte6ecefa2012-05-17 13:27:23 +02009156 dev->mode_config.funcs = &intel_mode_funcs;
Jesse Barnes79e53942008-11-07 14:24:08 -08009157
Jesse Barnesb690e962010-07-19 13:53:12 -07009158 intel_init_quirks(dev);
9159
Eugeni Dodonov1fa61102012-04-18 15:29:26 -03009160 intel_init_pm(dev);
9161
Ben Widawskye3c74752013-04-05 13:12:39 -07009162 if (INTEL_INFO(dev)->num_pipes == 0)
9163 return;
9164
Jesse Barnese70236a2009-09-21 10:42:27 -07009165 intel_init_display(dev);
9166
Chris Wilsona6c45cf2010-09-17 00:32:17 +01009167 if (IS_GEN2(dev)) {
9168 dev->mode_config.max_width = 2048;
9169 dev->mode_config.max_height = 2048;
9170 } else if (IS_GEN3(dev)) {
Keith Packard5e4d6fa2009-07-12 23:53:17 -07009171 dev->mode_config.max_width = 4096;
9172 dev->mode_config.max_height = 4096;
Jesse Barnes79e53942008-11-07 14:24:08 -08009173 } else {
Chris Wilsona6c45cf2010-09-17 00:32:17 +01009174 dev->mode_config.max_width = 8192;
9175 dev->mode_config.max_height = 8192;
Jesse Barnes79e53942008-11-07 14:24:08 -08009176 }
Ben Widawsky5d4545a2013-01-17 12:45:15 -08009177 dev->mode_config.fb_base = dev_priv->gtt.mappable_base;
Jesse Barnes79e53942008-11-07 14:24:08 -08009178
Zhao Yakui28c97732009-10-09 11:39:41 +08009179 DRM_DEBUG_KMS("%d display pipe%s available.\n",
Ben Widawsky7eb552a2013-03-13 14:05:41 -07009180 INTEL_INFO(dev)->num_pipes,
9181 INTEL_INFO(dev)->num_pipes > 1 ? "s" : "");
Jesse Barnes79e53942008-11-07 14:24:08 -08009182
Ben Widawsky7eb552a2013-03-13 14:05:41 -07009183 for (i = 0; i < INTEL_INFO(dev)->num_pipes; i++) {
Jesse Barnes79e53942008-11-07 14:24:08 -08009184 intel_crtc_init(dev, i);
Jesse Barnes7f1f3852013-04-02 11:22:20 -07009185 for (j = 0; j < dev_priv->num_plane; j++) {
9186 ret = intel_plane_init(dev, i, j);
9187 if (ret)
Ville Syrjälä06da8da2013-04-17 17:48:51 +03009188 DRM_DEBUG_KMS("pipe %c sprite %c init failed: %d\n",
9189 pipe_name(i), sprite_name(i, j), ret);
Jesse Barnes7f1f3852013-04-02 11:22:20 -07009190 }
Jesse Barnes79e53942008-11-07 14:24:08 -08009191 }
9192
Paulo Zanoni79f689a2012-10-05 12:05:52 -03009193 intel_cpu_pll_init(dev);
Jesse Barnesee7b9f92012-04-20 17:11:53 +01009194 intel_pch_pll_init(dev);
9195
Jesse Barnes9cce37f2010-08-13 15:11:26 -07009196 /* Just disable it once at startup */
9197 i915_disable_vga(dev);
Jesse Barnes79e53942008-11-07 14:24:08 -08009198 intel_setup_outputs(dev);
Chris Wilson11be49e2012-11-15 11:32:20 +00009199
9200 /* Just in case the BIOS is doing something questionable. */
9201 intel_disable_fbc(dev);
Chris Wilson2c7111d2011-03-29 10:40:27 +01009202}
Jesse Barnesd5bb0812011-01-05 12:01:26 -08009203
Daniel Vetter24929352012-07-02 20:28:59 +02009204static void
9205intel_connector_break_all_links(struct intel_connector *connector)
9206{
9207 connector->base.dpms = DRM_MODE_DPMS_OFF;
9208 connector->base.encoder = NULL;
9209 connector->encoder->connectors_active = false;
9210 connector->encoder->base.crtc = NULL;
9211}
9212
Daniel Vetter7fad7982012-07-04 17:51:47 +02009213static void intel_enable_pipe_a(struct drm_device *dev)
9214{
9215 struct intel_connector *connector;
9216 struct drm_connector *crt = NULL;
9217 struct intel_load_detect_pipe load_detect_temp;
9218
9219 /* We can't just switch on the pipe A, we need to set things up with a
9220 * proper mode and output configuration. As a gross hack, enable pipe A
9221 * by enabling the load detect pipe once. */
9222 list_for_each_entry(connector,
9223 &dev->mode_config.connector_list,
9224 base.head) {
9225 if (connector->encoder->type == INTEL_OUTPUT_ANALOG) {
9226 crt = &connector->base;
9227 break;
9228 }
9229 }
9230
9231 if (!crt)
9232 return;
9233
9234 if (intel_get_load_detect_pipe(crt, NULL, &load_detect_temp))
9235 intel_release_load_detect_pipe(crt, &load_detect_temp);
9236
9237
9238}
9239
Daniel Vetterfa555832012-10-10 23:14:00 +02009240static bool
9241intel_check_plane_mapping(struct intel_crtc *crtc)
9242{
Ben Widawsky7eb552a2013-03-13 14:05:41 -07009243 struct drm_device *dev = crtc->base.dev;
9244 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterfa555832012-10-10 23:14:00 +02009245 u32 reg, val;
9246
Ben Widawsky7eb552a2013-03-13 14:05:41 -07009247 if (INTEL_INFO(dev)->num_pipes == 1)
Daniel Vetterfa555832012-10-10 23:14:00 +02009248 return true;
9249
9250 reg = DSPCNTR(!crtc->plane);
9251 val = I915_READ(reg);
9252
9253 if ((val & DISPLAY_PLANE_ENABLE) &&
9254 (!!(val & DISPPLANE_SEL_PIPE_MASK) == crtc->pipe))
9255 return false;
9256
9257 return true;
9258}
9259
Daniel Vetter24929352012-07-02 20:28:59 +02009260static void intel_sanitize_crtc(struct intel_crtc *crtc)
9261{
9262 struct drm_device *dev = crtc->base.dev;
9263 struct drm_i915_private *dev_priv = dev->dev_private;
Daniel Vetterfa555832012-10-10 23:14:00 +02009264 u32 reg;
Daniel Vetter24929352012-07-02 20:28:59 +02009265
Daniel Vetter24929352012-07-02 20:28:59 +02009266 /* Clear any frame start delays used for debugging left by the BIOS */
Daniel Vetter3b117c82013-04-17 20:15:07 +02009267 reg = PIPECONF(crtc->config.cpu_transcoder);
Daniel Vetter24929352012-07-02 20:28:59 +02009268 I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
9269
9270 /* We need to sanitize the plane -> pipe mapping first because this will
Daniel Vetterfa555832012-10-10 23:14:00 +02009271 * disable the crtc (and hence change the state) if it is wrong. Note
9272 * that gen4+ has a fixed plane -> pipe mapping. */
9273 if (INTEL_INFO(dev)->gen < 4 && !intel_check_plane_mapping(crtc)) {
Daniel Vetter24929352012-07-02 20:28:59 +02009274 struct intel_connector *connector;
9275 bool plane;
9276
Daniel Vetter24929352012-07-02 20:28:59 +02009277 DRM_DEBUG_KMS("[CRTC:%d] wrong plane connection detected!\n",
9278 crtc->base.base.id);
9279
9280 /* Pipe has the wrong plane attached and the plane is active.
9281 * Temporarily change the plane mapping and disable everything
9282 * ... */
9283 plane = crtc->plane;
9284 crtc->plane = !plane;
9285 dev_priv->display.crtc_disable(&crtc->base);
9286 crtc->plane = plane;
9287
9288 /* ... and break all links. */
9289 list_for_each_entry(connector, &dev->mode_config.connector_list,
9290 base.head) {
9291 if (connector->encoder->base.crtc != &crtc->base)
9292 continue;
9293
9294 intel_connector_break_all_links(connector);
9295 }
9296
9297 WARN_ON(crtc->active);
9298 crtc->base.enabled = false;
9299 }
Daniel Vetter24929352012-07-02 20:28:59 +02009300
Daniel Vetter7fad7982012-07-04 17:51:47 +02009301 if (dev_priv->quirks & QUIRK_PIPEA_FORCE &&
9302 crtc->pipe == PIPE_A && !crtc->active) {
9303 /* BIOS forgot to enable pipe A, this mostly happens after
9304 * resume. Force-enable the pipe to fix this, the update_dpms
9305 * call below we restore the pipe to the right state, but leave
9306 * the required bits on. */
9307 intel_enable_pipe_a(dev);
9308 }
9309
Daniel Vetter24929352012-07-02 20:28:59 +02009310 /* Adjust the state of the output pipe according to whether we
9311 * have active connectors/encoders. */
9312 intel_crtc_update_dpms(&crtc->base);
9313
9314 if (crtc->active != crtc->base.enabled) {
9315 struct intel_encoder *encoder;
9316
9317 /* This can happen either due to bugs in the get_hw_state
9318 * functions or because the pipe is force-enabled due to the
9319 * pipe A quirk. */
9320 DRM_DEBUG_KMS("[CRTC:%d] hw state adjusted, was %s, now %s\n",
9321 crtc->base.base.id,
9322 crtc->base.enabled ? "enabled" : "disabled",
9323 crtc->active ? "enabled" : "disabled");
9324
9325 crtc->base.enabled = crtc->active;
9326
9327 /* Because we only establish the connector -> encoder ->
9328 * crtc links if something is active, this means the
9329 * crtc is now deactivated. Break the links. connector
9330 * -> encoder links are only establish when things are
9331 * actually up, hence no need to break them. */
9332 WARN_ON(crtc->active);
9333
9334 for_each_encoder_on_crtc(dev, &crtc->base, encoder) {
9335 WARN_ON(encoder->connectors_active);
9336 encoder->base.crtc = NULL;
9337 }
9338 }
9339}
9340
9341static void intel_sanitize_encoder(struct intel_encoder *encoder)
9342{
9343 struct intel_connector *connector;
9344 struct drm_device *dev = encoder->base.dev;
9345
9346 /* We need to check both for a crtc link (meaning that the
9347 * encoder is active and trying to read from a pipe) and the
9348 * pipe itself being active. */
9349 bool has_active_crtc = encoder->base.crtc &&
9350 to_intel_crtc(encoder->base.crtc)->active;
9351
9352 if (encoder->connectors_active && !has_active_crtc) {
9353 DRM_DEBUG_KMS("[ENCODER:%d:%s] has active connectors but no active pipe!\n",
9354 encoder->base.base.id,
9355 drm_get_encoder_name(&encoder->base));
9356
9357 /* Connector is active, but has no active pipe. This is
9358 * fallout from our resume register restoring. Disable
9359 * the encoder manually again. */
9360 if (encoder->base.crtc) {
9361 DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n",
9362 encoder->base.base.id,
9363 drm_get_encoder_name(&encoder->base));
9364 encoder->disable(encoder);
9365 }
9366
9367 /* Inconsistent output/port/pipe state happens presumably due to
9368 * a bug in one of the get_hw_state functions. Or someplace else
9369 * in our code, like the register restore mess on resume. Clamp
9370 * things to off as a safer default. */
9371 list_for_each_entry(connector,
9372 &dev->mode_config.connector_list,
9373 base.head) {
9374 if (connector->encoder != encoder)
9375 continue;
9376
9377 intel_connector_break_all_links(connector);
9378 }
9379 }
9380 /* Enabled encoders without active connectors will be fixed in
9381 * the crtc fixup. */
9382}
9383
Daniel Vetter44cec742013-01-25 17:53:21 +01009384void i915_redisable_vga(struct drm_device *dev)
Krzysztof Mazur0fde9012012-12-19 11:03:41 +01009385{
9386 struct drm_i915_private *dev_priv = dev->dev_private;
Ville Syrjälä766aa1c2013-01-25 21:44:46 +02009387 u32 vga_reg = i915_vgacntrl_reg(dev);
Krzysztof Mazur0fde9012012-12-19 11:03:41 +01009388
9389 if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
9390 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
Ville Syrjälä209d5212013-01-25 21:44:48 +02009391 i915_disable_vga(dev);
Krzysztof Mazur0fde9012012-12-19 11:03:41 +01009392 }
9393}
9394
Daniel Vetter24929352012-07-02 20:28:59 +02009395/* Scan out the current hw modeset state, sanitizes it and maps it into the drm
9396 * and i915 state tracking structures. */
Daniel Vetter45e2b5f2012-11-23 18:16:34 +01009397void intel_modeset_setup_hw_state(struct drm_device *dev,
9398 bool force_restore)
Daniel Vetter24929352012-07-02 20:28:59 +02009399{
9400 struct drm_i915_private *dev_priv = dev->dev_private;
9401 enum pipe pipe;
9402 u32 tmp;
Jesse Barnesb5644d02013-03-26 13:25:27 -07009403 struct drm_plane *plane;
Daniel Vetter24929352012-07-02 20:28:59 +02009404 struct intel_crtc *crtc;
9405 struct intel_encoder *encoder;
9406 struct intel_connector *connector;
9407
Paulo Zanoniaffa9352012-11-23 15:30:39 -02009408 if (HAS_DDI(dev)) {
Paulo Zanonie28d54c2012-10-24 16:09:25 -02009409 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
9410
9411 if (tmp & TRANS_DDI_FUNC_ENABLE) {
9412 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
9413 case TRANS_DDI_EDP_INPUT_A_ON:
9414 case TRANS_DDI_EDP_INPUT_A_ONOFF:
9415 pipe = PIPE_A;
9416 break;
9417 case TRANS_DDI_EDP_INPUT_B_ONOFF:
9418 pipe = PIPE_B;
9419 break;
9420 case TRANS_DDI_EDP_INPUT_C_ONOFF:
9421 pipe = PIPE_C;
9422 break;
Damien Lespiauaaa148e2013-03-07 15:30:26 +00009423 default:
9424 /* A bogus value has been programmed, disable
9425 * the transcoder */
9426 WARN(1, "Bogus eDP source %08x\n", tmp);
9427 intel_ddi_disable_transcoder_func(dev_priv,
9428 TRANSCODER_EDP);
9429 goto setup_pipes;
Paulo Zanonie28d54c2012-10-24 16:09:25 -02009430 }
9431
9432 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
Daniel Vetter3b117c82013-04-17 20:15:07 +02009433 crtc->config.cpu_transcoder = TRANSCODER_EDP;
Paulo Zanonie28d54c2012-10-24 16:09:25 -02009434
9435 DRM_DEBUG_KMS("Pipe %c using transcoder EDP\n",
9436 pipe_name(pipe));
9437 }
9438 }
9439
Damien Lespiauaaa148e2013-03-07 15:30:26 +00009440setup_pipes:
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01009441 list_for_each_entry(crtc, &dev->mode_config.crtc_list,
9442 base.head) {
Daniel Vetter3b117c82013-04-17 20:15:07 +02009443 enum transcoder tmp = crtc->config.cpu_transcoder;
Daniel Vetter88adfff2013-03-28 10:42:01 +01009444 memset(&crtc->config, 0, sizeof(crtc->config));
Daniel Vetter3b117c82013-04-17 20:15:07 +02009445 crtc->config.cpu_transcoder = tmp;
9446
Daniel Vetter0e8ffe12013-03-28 10:42:00 +01009447 crtc->active = dev_priv->display.get_pipe_config(crtc,
9448 &crtc->config);
Daniel Vetter24929352012-07-02 20:28:59 +02009449
9450 crtc->base.enabled = crtc->active;
9451
9452 DRM_DEBUG_KMS("[CRTC:%d] hw state readout: %s\n",
9453 crtc->base.base.id,
9454 crtc->active ? "enabled" : "disabled");
9455 }
9456
Paulo Zanoniaffa9352012-11-23 15:30:39 -02009457 if (HAS_DDI(dev))
Paulo Zanoni6441ab52012-10-05 12:05:58 -03009458 intel_ddi_setup_hw_pll_state(dev);
9459
Daniel Vetter24929352012-07-02 20:28:59 +02009460 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
9461 base.head) {
9462 pipe = 0;
9463
9464 if (encoder->get_hw_state(encoder, &pipe)) {
9465 encoder->base.crtc =
9466 dev_priv->pipe_to_crtc_mapping[pipe];
9467 } else {
9468 encoder->base.crtc = NULL;
9469 }
9470
9471 encoder->connectors_active = false;
9472 DRM_DEBUG_KMS("[ENCODER:%d:%s] hw state readout: %s, pipe=%i\n",
9473 encoder->base.base.id,
9474 drm_get_encoder_name(&encoder->base),
9475 encoder->base.crtc ? "enabled" : "disabled",
9476 pipe);
9477 }
9478
9479 list_for_each_entry(connector, &dev->mode_config.connector_list,
9480 base.head) {
9481 if (connector->get_hw_state(connector)) {
9482 connector->base.dpms = DRM_MODE_DPMS_ON;
9483 connector->encoder->connectors_active = true;
9484 connector->base.encoder = &connector->encoder->base;
9485 } else {
9486 connector->base.dpms = DRM_MODE_DPMS_OFF;
9487 connector->base.encoder = NULL;
9488 }
9489 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] hw state readout: %s\n",
9490 connector->base.base.id,
9491 drm_get_connector_name(&connector->base),
9492 connector->base.encoder ? "enabled" : "disabled");
9493 }
9494
9495 /* HW state is read out, now we need to sanitize this mess. */
9496 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
9497 base.head) {
9498 intel_sanitize_encoder(encoder);
9499 }
9500
9501 for_each_pipe(pipe) {
9502 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
9503 intel_sanitize_crtc(crtc);
9504 }
Daniel Vetter9a935852012-07-05 22:34:27 +02009505
Daniel Vetter45e2b5f2012-11-23 18:16:34 +01009506 if (force_restore) {
Daniel Vetterf30da182013-04-11 20:22:50 +02009507 /*
9508 * We need to use raw interfaces for restoring state to avoid
9509 * checking (bogus) intermediate states.
9510 */
Daniel Vetter45e2b5f2012-11-23 18:16:34 +01009511 for_each_pipe(pipe) {
Jesse Barnesb5644d02013-03-26 13:25:27 -07009512 struct drm_crtc *crtc =
9513 dev_priv->pipe_to_crtc_mapping[pipe];
Daniel Vetterf30da182013-04-11 20:22:50 +02009514
9515 __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
9516 crtc->fb);
Daniel Vetter45e2b5f2012-11-23 18:16:34 +01009517 }
Jesse Barnesb5644d02013-03-26 13:25:27 -07009518 list_for_each_entry(plane, &dev->mode_config.plane_list, head)
9519 intel_plane_restore(plane);
Krzysztof Mazur0fde9012012-12-19 11:03:41 +01009520
9521 i915_redisable_vga(dev);
Daniel Vetter45e2b5f2012-11-23 18:16:34 +01009522 } else {
9523 intel_modeset_update_staged_output_state(dev);
9524 }
Daniel Vetter8af6cf82012-07-10 09:50:11 +02009525
9526 intel_modeset_check_state(dev);
Daniel Vetter2e938892012-10-11 20:08:24 +02009527
9528 drm_mode_config_reset(dev);
Chris Wilson2c7111d2011-03-29 10:40:27 +01009529}
9530
9531void intel_modeset_gem_init(struct drm_device *dev)
9532{
Chris Wilson1833b132012-05-09 11:56:28 +01009533 intel_modeset_init_hw(dev);
Daniel Vetter02e792f2009-09-15 22:57:34 +02009534
9535 intel_setup_overlay(dev);
Daniel Vetter24929352012-07-02 20:28:59 +02009536
Daniel Vetter45e2b5f2012-11-23 18:16:34 +01009537 intel_modeset_setup_hw_state(dev, false);
Jesse Barnes79e53942008-11-07 14:24:08 -08009538}
9539
9540void intel_modeset_cleanup(struct drm_device *dev)
9541{
Jesse Barnes652c3932009-08-17 13:31:43 -07009542 struct drm_i915_private *dev_priv = dev->dev_private;
9543 struct drm_crtc *crtc;
9544 struct intel_crtc *intel_crtc;
9545
Keith Packardf87ea762010-10-03 19:36:26 -07009546 drm_kms_helper_poll_fini(dev);
Jesse Barnes652c3932009-08-17 13:31:43 -07009547 mutex_lock(&dev->struct_mutex);
9548
Jesse Barnes723bfd72010-10-07 16:01:13 -07009549 intel_unregister_dsm_handler();
9550
9551
Jesse Barnes652c3932009-08-17 13:31:43 -07009552 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
9553 /* Skip inactive CRTCs */
9554 if (!crtc->fb)
9555 continue;
9556
9557 intel_crtc = to_intel_crtc(crtc);
Daniel Vetter3dec0092010-08-20 21:40:52 +02009558 intel_increase_pllclock(crtc);
Jesse Barnes652c3932009-08-17 13:31:43 -07009559 }
9560
Chris Wilson973d04f2011-07-08 12:22:37 +01009561 intel_disable_fbc(dev);
Jesse Barnese70236a2009-09-21 10:42:27 -07009562
Daniel Vetter8090c6b2012-06-24 16:42:32 +02009563 intel_disable_gt_powersave(dev);
Chris Wilson0cdab212010-12-05 17:27:06 +00009564
Daniel Vetter930ebb42012-06-29 23:32:16 +02009565 ironlake_teardown_rc6(dev);
9566
Kristian Høgsberg69341a52009-11-11 12:19:17 -05009567 mutex_unlock(&dev->struct_mutex);
9568
Daniel Vetter6c0d93502010-08-20 18:26:46 +02009569 /* Disable the irq before mode object teardown, for the irq might
9570 * enqueue unpin/hotplug work. */
9571 drm_irq_uninstall(dev);
9572 cancel_work_sync(&dev_priv->hotplug_work);
Daniel Vetterc6a828d2012-08-08 23:35:35 +02009573 cancel_work_sync(&dev_priv->rps.work);
Daniel Vetter6c0d93502010-08-20 18:26:46 +02009574
Chris Wilson1630fe72011-07-08 12:22:42 +01009575 /* flush any delayed tasks or pending work */
9576 flush_scheduled_work();
9577
Jani Nikuladc652f92013-04-12 15:18:38 +03009578 /* destroy backlight, if any, before the connectors */
9579 intel_panel_destroy_backlight(dev);
9580
Jesse Barnes79e53942008-11-07 14:24:08 -08009581 drm_mode_config_cleanup(dev);
Daniel Vetter4d7bb012012-12-18 15:24:37 +01009582
9583 intel_cleanup_overlay(dev);
Jesse Barnes79e53942008-11-07 14:24:08 -08009584}
9585
Dave Airlie28d52042009-09-21 14:33:58 +10009586/*
Zhenyu Wangf1c79df2010-03-30 14:39:29 +08009587 * Return which encoder is currently attached for connector.
9588 */
Chris Wilsondf0e9242010-09-09 16:20:55 +01009589struct drm_encoder *intel_best_encoder(struct drm_connector *connector)
Jesse Barnes79e53942008-11-07 14:24:08 -08009590{
Chris Wilsondf0e9242010-09-09 16:20:55 +01009591 return &intel_attached_encoder(connector)->base;
9592}
Jesse Barnes79e53942008-11-07 14:24:08 -08009593
Chris Wilsondf0e9242010-09-09 16:20:55 +01009594void intel_connector_attach_encoder(struct intel_connector *connector,
9595 struct intel_encoder *encoder)
9596{
9597 connector->encoder = encoder;
9598 drm_mode_connector_attach_encoder(&connector->base,
9599 &encoder->base);
Jesse Barnes79e53942008-11-07 14:24:08 -08009600}
Dave Airlie28d52042009-09-21 14:33:58 +10009601
9602/*
9603 * set vga decode state - true == enable VGA decode
9604 */
9605int intel_modeset_vga_set_state(struct drm_device *dev, bool state)
9606{
9607 struct drm_i915_private *dev_priv = dev->dev_private;
9608 u16 gmch_ctrl;
9609
9610 pci_read_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, &gmch_ctrl);
9611 if (state)
9612 gmch_ctrl &= ~INTEL_GMCH_VGA_DISABLE;
9613 else
9614 gmch_ctrl |= INTEL_GMCH_VGA_DISABLE;
9615 pci_write_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl);
9616 return 0;
9617}
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009618
9619#ifdef CONFIG_DEBUG_FS
9620#include <linux/seq_file.h>
9621
9622struct intel_display_error_state {
9623 struct intel_cursor_error_state {
9624 u32 control;
9625 u32 position;
9626 u32 base;
9627 u32 size;
Damien Lespiau52331302012-08-15 19:23:25 +01009628 } cursor[I915_MAX_PIPES];
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009629
9630 struct intel_pipe_error_state {
9631 u32 conf;
9632 u32 source;
9633
9634 u32 htotal;
9635 u32 hblank;
9636 u32 hsync;
9637 u32 vtotal;
9638 u32 vblank;
9639 u32 vsync;
Damien Lespiau52331302012-08-15 19:23:25 +01009640 } pipe[I915_MAX_PIPES];
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009641
9642 struct intel_plane_error_state {
9643 u32 control;
9644 u32 stride;
9645 u32 size;
9646 u32 pos;
9647 u32 addr;
9648 u32 surface;
9649 u32 tile_offset;
Damien Lespiau52331302012-08-15 19:23:25 +01009650 } plane[I915_MAX_PIPES];
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009651};
9652
9653struct intel_display_error_state *
9654intel_display_capture_error_state(struct drm_device *dev)
9655{
Akshay Joshi0206e352011-08-16 15:34:10 -04009656 drm_i915_private_t *dev_priv = dev->dev_private;
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009657 struct intel_display_error_state *error;
Paulo Zanoni702e7a52012-10-23 18:29:59 -02009658 enum transcoder cpu_transcoder;
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009659 int i;
9660
9661 error = kmalloc(sizeof(*error), GFP_ATOMIC);
9662 if (error == NULL)
9663 return NULL;
9664
Damien Lespiau52331302012-08-15 19:23:25 +01009665 for_each_pipe(i) {
Paulo Zanoni702e7a52012-10-23 18:29:59 -02009666 cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, i);
9667
Paulo Zanonia18c4c32013-03-06 20:03:12 -03009668 if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) {
9669 error->cursor[i].control = I915_READ(CURCNTR(i));
9670 error->cursor[i].position = I915_READ(CURPOS(i));
9671 error->cursor[i].base = I915_READ(CURBASE(i));
9672 } else {
9673 error->cursor[i].control = I915_READ(CURCNTR_IVB(i));
9674 error->cursor[i].position = I915_READ(CURPOS_IVB(i));
9675 error->cursor[i].base = I915_READ(CURBASE_IVB(i));
9676 }
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009677
9678 error->plane[i].control = I915_READ(DSPCNTR(i));
9679 error->plane[i].stride = I915_READ(DSPSTRIDE(i));
Paulo Zanoni80ca3782013-03-22 14:20:57 -03009680 if (INTEL_INFO(dev)->gen <= 3) {
Paulo Zanoni51889b32013-03-06 20:03:13 -03009681 error->plane[i].size = I915_READ(DSPSIZE(i));
Paulo Zanoni80ca3782013-03-22 14:20:57 -03009682 error->plane[i].pos = I915_READ(DSPPOS(i));
9683 }
Paulo Zanonica291362013-03-06 20:03:14 -03009684 if (INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev))
9685 error->plane[i].addr = I915_READ(DSPADDR(i));
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009686 if (INTEL_INFO(dev)->gen >= 4) {
9687 error->plane[i].surface = I915_READ(DSPSURF(i));
9688 error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
9689 }
9690
Paulo Zanoni702e7a52012-10-23 18:29:59 -02009691 error->pipe[i].conf = I915_READ(PIPECONF(cpu_transcoder));
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009692 error->pipe[i].source = I915_READ(PIPESRC(i));
Paulo Zanonife2b8f92012-10-23 18:30:02 -02009693 error->pipe[i].htotal = I915_READ(HTOTAL(cpu_transcoder));
9694 error->pipe[i].hblank = I915_READ(HBLANK(cpu_transcoder));
9695 error->pipe[i].hsync = I915_READ(HSYNC(cpu_transcoder));
9696 error->pipe[i].vtotal = I915_READ(VTOTAL(cpu_transcoder));
9697 error->pipe[i].vblank = I915_READ(VBLANK(cpu_transcoder));
9698 error->pipe[i].vsync = I915_READ(VSYNC(cpu_transcoder));
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009699 }
9700
9701 return error;
9702}
9703
9704void
9705intel_display_print_error_state(struct seq_file *m,
9706 struct drm_device *dev,
9707 struct intel_display_error_state *error)
9708{
9709 int i;
9710
Ben Widawsky7eb552a2013-03-13 14:05:41 -07009711 seq_printf(m, "Num Pipes: %d\n", INTEL_INFO(dev)->num_pipes);
Damien Lespiau52331302012-08-15 19:23:25 +01009712 for_each_pipe(i) {
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009713 seq_printf(m, "Pipe [%d]:\n", i);
9714 seq_printf(m, " CONF: %08x\n", error->pipe[i].conf);
9715 seq_printf(m, " SRC: %08x\n", error->pipe[i].source);
9716 seq_printf(m, " HTOTAL: %08x\n", error->pipe[i].htotal);
9717 seq_printf(m, " HBLANK: %08x\n", error->pipe[i].hblank);
9718 seq_printf(m, " HSYNC: %08x\n", error->pipe[i].hsync);
9719 seq_printf(m, " VTOTAL: %08x\n", error->pipe[i].vtotal);
9720 seq_printf(m, " VBLANK: %08x\n", error->pipe[i].vblank);
9721 seq_printf(m, " VSYNC: %08x\n", error->pipe[i].vsync);
9722
9723 seq_printf(m, "Plane [%d]:\n", i);
9724 seq_printf(m, " CNTR: %08x\n", error->plane[i].control);
9725 seq_printf(m, " STRIDE: %08x\n", error->plane[i].stride);
Paulo Zanoni80ca3782013-03-22 14:20:57 -03009726 if (INTEL_INFO(dev)->gen <= 3) {
Paulo Zanoni51889b32013-03-06 20:03:13 -03009727 seq_printf(m, " SIZE: %08x\n", error->plane[i].size);
Paulo Zanoni80ca3782013-03-22 14:20:57 -03009728 seq_printf(m, " POS: %08x\n", error->plane[i].pos);
9729 }
Paulo Zanoni4b71a572013-03-22 14:19:21 -03009730 if (INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev))
Paulo Zanonica291362013-03-06 20:03:14 -03009731 seq_printf(m, " ADDR: %08x\n", error->plane[i].addr);
Chris Wilsonc4a1d9e2010-11-21 13:12:35 +00009732 if (INTEL_INFO(dev)->gen >= 4) {
9733 seq_printf(m, " SURF: %08x\n", error->plane[i].surface);
9734 seq_printf(m, " TILEOFF: %08x\n", error->plane[i].tile_offset);
9735 }
9736
9737 seq_printf(m, "Cursor [%d]:\n", i);
9738 seq_printf(m, " CNTR: %08x\n", error->cursor[i].control);
9739 seq_printf(m, " POS: %08x\n", error->cursor[i].position);
9740 seq_printf(m, " BASE: %08x\n", error->cursor[i].base);
9741 }
9742}
9743#endif