blob: 4e74e87a8676efcc34cb4b0ecb2538962fc368c1 [file] [log] [blame]
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001/*
2 * Copyright © 2006-2017 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
24#include "intel_drv.h"
25
26/**
27 * DOC: CDCLK / RAWCLK
28 *
29 * The display engine uses several different clocks to do its work. There
30 * are two main clocks involved that aren't directly related to the actual
31 * pixel clock or any symbol/bit clock of the actual output port. These
32 * are the core display clock (CDCLK) and RAWCLK.
33 *
34 * CDCLK clocks most of the display pipe logic, and thus its frequency
35 * must be high enough to support the rate at which pixels are flowing
36 * through the pipes. Downscaling must also be accounted as that increases
37 * the effective pixel rate.
38 *
39 * On several platforms the CDCLK frequency can be changed dynamically
40 * to minimize power consumption for a given display configuration.
41 * Typically changes to the CDCLK frequency require all the display pipes
42 * to be shut down while the frequency is being changed.
43 *
44 * On SKL+ the DMC will toggle the CDCLK off/on during DC5/6 entry/exit.
45 * DMC will not change the active CDCLK frequency however, so that part
46 * will still be performed by the driver directly.
47 *
48 * RAWCLK is a fixed frequency clock, often used by various auxiliary
49 * blocks such as AUX CH or backlight PWM. Hence the only thing we
50 * really need to know about RAWCLK is its frequency so that various
51 * dividers can be programmed correctly.
52 */
53
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020054static void fixed_133mhz_get_cdclk(struct drm_i915_private *dev_priv,
55 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020056{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020057 cdclk_state->cdclk = 133333;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020058}
59
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020060static void fixed_200mhz_get_cdclk(struct drm_i915_private *dev_priv,
61 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020062{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020063 cdclk_state->cdclk = 200000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020064}
65
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020066static void fixed_266mhz_get_cdclk(struct drm_i915_private *dev_priv,
67 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020068{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020069 cdclk_state->cdclk = 266667;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020070}
71
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020072static void fixed_333mhz_get_cdclk(struct drm_i915_private *dev_priv,
73 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020074{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020075 cdclk_state->cdclk = 333333;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020076}
77
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020078static void fixed_400mhz_get_cdclk(struct drm_i915_private *dev_priv,
79 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020080{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020081 cdclk_state->cdclk = 400000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020082}
83
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020084static void fixed_450mhz_get_cdclk(struct drm_i915_private *dev_priv,
85 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020086{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020087 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020088}
89
Ville Syrjälä49cd97a2017-02-07 20:33:45 +020090static void i85x_get_cdclk(struct drm_i915_private *dev_priv,
91 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +020092{
93 struct pci_dev *pdev = dev_priv->drm.pdev;
94 u16 hpllcc = 0;
95
96 /*
97 * 852GM/852GMV only supports 133 MHz and the HPLLCC
98 * encoding is different :(
99 * FIXME is this the right way to detect 852GM/852GMV?
100 */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200101 if (pdev->revision == 0x1) {
102 cdclk_state->cdclk = 133333;
103 return;
104 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200105
106 pci_bus_read_config_word(pdev->bus,
107 PCI_DEVFN(0, 3), HPLLCC, &hpllcc);
108
109 /* Assume that the hardware is in the high speed state. This
110 * should be the default.
111 */
112 switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
113 case GC_CLOCK_133_200:
114 case GC_CLOCK_133_200_2:
115 case GC_CLOCK_100_200:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200116 cdclk_state->cdclk = 200000;
117 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200118 case GC_CLOCK_166_250:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200119 cdclk_state->cdclk = 250000;
120 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200121 case GC_CLOCK_100_133:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200122 cdclk_state->cdclk = 133333;
123 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200124 case GC_CLOCK_133_266:
125 case GC_CLOCK_133_266_2:
126 case GC_CLOCK_166_266:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200127 cdclk_state->cdclk = 266667;
128 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200129 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200130}
131
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200132static void i915gm_get_cdclk(struct drm_i915_private *dev_priv,
133 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200134{
135 struct pci_dev *pdev = dev_priv->drm.pdev;
136 u16 gcfgc = 0;
137
138 pci_read_config_word(pdev, GCFGC, &gcfgc);
139
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200140 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
141 cdclk_state->cdclk = 133333;
142 return;
143 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200144
145 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
146 case GC_DISPLAY_CLOCK_333_320_MHZ:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200147 cdclk_state->cdclk = 333333;
148 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200149 default:
150 case GC_DISPLAY_CLOCK_190_200_MHZ:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200151 cdclk_state->cdclk = 190000;
152 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200153 }
154}
155
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200156static void i945gm_get_cdclk(struct drm_i915_private *dev_priv,
157 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200158{
159 struct pci_dev *pdev = dev_priv->drm.pdev;
160 u16 gcfgc = 0;
161
162 pci_read_config_word(pdev, GCFGC, &gcfgc);
163
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200164 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
165 cdclk_state->cdclk = 133333;
166 return;
167 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200168
169 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
170 case GC_DISPLAY_CLOCK_333_320_MHZ:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200171 cdclk_state->cdclk = 320000;
172 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200173 default:
174 case GC_DISPLAY_CLOCK_190_200_MHZ:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200175 cdclk_state->cdclk = 200000;
176 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200177 }
178}
179
180static unsigned int intel_hpll_vco(struct drm_i915_private *dev_priv)
181{
182 static const unsigned int blb_vco[8] = {
183 [0] = 3200000,
184 [1] = 4000000,
185 [2] = 5333333,
186 [3] = 4800000,
187 [4] = 6400000,
188 };
189 static const unsigned int pnv_vco[8] = {
190 [0] = 3200000,
191 [1] = 4000000,
192 [2] = 5333333,
193 [3] = 4800000,
194 [4] = 2666667,
195 };
196 static const unsigned int cl_vco[8] = {
197 [0] = 3200000,
198 [1] = 4000000,
199 [2] = 5333333,
200 [3] = 6400000,
201 [4] = 3333333,
202 [5] = 3566667,
203 [6] = 4266667,
204 };
205 static const unsigned int elk_vco[8] = {
206 [0] = 3200000,
207 [1] = 4000000,
208 [2] = 5333333,
209 [3] = 4800000,
210 };
211 static const unsigned int ctg_vco[8] = {
212 [0] = 3200000,
213 [1] = 4000000,
214 [2] = 5333333,
215 [3] = 6400000,
216 [4] = 2666667,
217 [5] = 4266667,
218 };
219 const unsigned int *vco_table;
220 unsigned int vco;
221 uint8_t tmp = 0;
222
223 /* FIXME other chipsets? */
224 if (IS_GM45(dev_priv))
225 vco_table = ctg_vco;
226 else if (IS_G4X(dev_priv))
227 vco_table = elk_vco;
228 else if (IS_I965GM(dev_priv))
229 vco_table = cl_vco;
230 else if (IS_PINEVIEW(dev_priv))
231 vco_table = pnv_vco;
232 else if (IS_G33(dev_priv))
233 vco_table = blb_vco;
234 else
235 return 0;
236
237 tmp = I915_READ(IS_MOBILE(dev_priv) ? HPLLVCO_MOBILE : HPLLVCO);
238
239 vco = vco_table[tmp & 0x7];
240 if (vco == 0)
241 DRM_ERROR("Bad HPLL VCO (HPLLVCO=0x%02x)\n", tmp);
242 else
243 DRM_DEBUG_KMS("HPLL VCO %u kHz\n", vco);
244
245 return vco;
246}
247
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200248static void g33_get_cdclk(struct drm_i915_private *dev_priv,
249 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200250{
251 struct pci_dev *pdev = dev_priv->drm.pdev;
252 static const uint8_t div_3200[] = { 12, 10, 8, 7, 5, 16 };
253 static const uint8_t div_4000[] = { 14, 12, 10, 8, 6, 20 };
254 static const uint8_t div_4800[] = { 20, 14, 12, 10, 8, 24 };
255 static const uint8_t div_5333[] = { 20, 16, 12, 12, 8, 28 };
256 const uint8_t *div_table;
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200257 unsigned int cdclk_sel;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200258 uint16_t tmp = 0;
259
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200260 cdclk_state->vco = intel_hpll_vco(dev_priv);
261
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200262 pci_read_config_word(pdev, GCFGC, &tmp);
263
264 cdclk_sel = (tmp >> 4) & 0x7;
265
266 if (cdclk_sel >= ARRAY_SIZE(div_3200))
267 goto fail;
268
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200269 switch (cdclk_state->vco) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200270 case 3200000:
271 div_table = div_3200;
272 break;
273 case 4000000:
274 div_table = div_4000;
275 break;
276 case 4800000:
277 div_table = div_4800;
278 break;
279 case 5333333:
280 div_table = div_5333;
281 break;
282 default:
283 goto fail;
284 }
285
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200286 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco,
287 div_table[cdclk_sel]);
288 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200289
290fail:
291 DRM_ERROR("Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%08x\n",
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200292 cdclk_state->vco, tmp);
293 cdclk_state->cdclk = 190476;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200294}
295
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200296static void pnv_get_cdclk(struct drm_i915_private *dev_priv,
297 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200298{
299 struct pci_dev *pdev = dev_priv->drm.pdev;
300 u16 gcfgc = 0;
301
302 pci_read_config_word(pdev, GCFGC, &gcfgc);
303
304 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
305 case GC_DISPLAY_CLOCK_267_MHZ_PNV:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200306 cdclk_state->cdclk = 266667;
307 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200308 case GC_DISPLAY_CLOCK_333_MHZ_PNV:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200309 cdclk_state->cdclk = 333333;
310 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200311 case GC_DISPLAY_CLOCK_444_MHZ_PNV:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200312 cdclk_state->cdclk = 444444;
313 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200314 case GC_DISPLAY_CLOCK_200_MHZ_PNV:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200315 cdclk_state->cdclk = 200000;
316 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200317 default:
318 DRM_ERROR("Unknown pnv display core clock 0x%04x\n", gcfgc);
319 case GC_DISPLAY_CLOCK_133_MHZ_PNV:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200320 cdclk_state->cdclk = 133333;
321 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200322 case GC_DISPLAY_CLOCK_167_MHZ_PNV:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200323 cdclk_state->cdclk = 166667;
324 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200325 }
326}
327
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200328static void i965gm_get_cdclk(struct drm_i915_private *dev_priv,
329 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200330{
331 struct pci_dev *pdev = dev_priv->drm.pdev;
332 static const uint8_t div_3200[] = { 16, 10, 8 };
333 static const uint8_t div_4000[] = { 20, 12, 10 };
334 static const uint8_t div_5333[] = { 24, 16, 14 };
335 const uint8_t *div_table;
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200336 unsigned int cdclk_sel;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200337 uint16_t tmp = 0;
338
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200339 cdclk_state->vco = intel_hpll_vco(dev_priv);
340
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200341 pci_read_config_word(pdev, GCFGC, &tmp);
342
343 cdclk_sel = ((tmp >> 8) & 0x1f) - 1;
344
345 if (cdclk_sel >= ARRAY_SIZE(div_3200))
346 goto fail;
347
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200348 switch (cdclk_state->vco) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200349 case 3200000:
350 div_table = div_3200;
351 break;
352 case 4000000:
353 div_table = div_4000;
354 break;
355 case 5333333:
356 div_table = div_5333;
357 break;
358 default:
359 goto fail;
360 }
361
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200362 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco,
363 div_table[cdclk_sel]);
364 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200365
366fail:
367 DRM_ERROR("Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%04x\n",
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200368 cdclk_state->vco, tmp);
369 cdclk_state->cdclk = 200000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200370}
371
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200372static void gm45_get_cdclk(struct drm_i915_private *dev_priv,
373 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200374{
375 struct pci_dev *pdev = dev_priv->drm.pdev;
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200376 unsigned int cdclk_sel;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200377 uint16_t tmp = 0;
378
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200379 cdclk_state->vco = intel_hpll_vco(dev_priv);
380
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200381 pci_read_config_word(pdev, GCFGC, &tmp);
382
383 cdclk_sel = (tmp >> 12) & 0x1;
384
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200385 switch (cdclk_state->vco) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200386 case 2666667:
387 case 4000000:
388 case 5333333:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200389 cdclk_state->cdclk = cdclk_sel ? 333333 : 222222;
390 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200391 case 3200000:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200392 cdclk_state->cdclk = cdclk_sel ? 320000 : 228571;
393 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200394 default:
395 DRM_ERROR("Unable to determine CDCLK. HPLL VCO=%u, CFGC=0x%04x\n",
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200396 cdclk_state->vco, tmp);
397 cdclk_state->cdclk = 222222;
398 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200399 }
400}
401
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200402static void hsw_get_cdclk(struct drm_i915_private *dev_priv,
403 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200404{
405 uint32_t lcpll = I915_READ(LCPLL_CTL);
406 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
407
408 if (lcpll & LCPLL_CD_SOURCE_FCLK)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200409 cdclk_state->cdclk = 800000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200410 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200411 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200412 else if (freq == LCPLL_CLK_FREQ_450)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200413 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200414 else if (IS_HSW_ULT(dev_priv))
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200415 cdclk_state->cdclk = 337500;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200416 else
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200417 cdclk_state->cdclk = 540000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200418}
419
420static int vlv_calc_cdclk(struct drm_i915_private *dev_priv,
421 int max_pixclk)
422{
423 int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ?
424 333333 : 320000;
425 int limit = IS_CHERRYVIEW(dev_priv) ? 95 : 90;
426
427 /*
428 * We seem to get an unstable or solid color picture at 200MHz.
429 * Not sure what's wrong. For now use 200MHz only when all pipes
430 * are off.
431 */
432 if (!IS_CHERRYVIEW(dev_priv) &&
433 max_pixclk > freq_320*limit/100)
434 return 400000;
435 else if (max_pixclk > 266667*limit/100)
436 return freq_320;
437 else if (max_pixclk > 0)
438 return 266667;
439 else
440 return 200000;
441}
442
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200443static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
444 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200445{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200446 cdclk_state->vco = vlv_get_hpll_vco(dev_priv);
447 cdclk_state->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
448 CCK_DISPLAY_CLOCK_CONTROL,
449 cdclk_state->vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200450}
451
452static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
453{
454 unsigned int credits, default_credits;
455
456 if (IS_CHERRYVIEW(dev_priv))
457 default_credits = PFI_CREDIT(12);
458 else
459 default_credits = PFI_CREDIT(8);
460
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200461 if (dev_priv->cdclk.hw.cdclk >= dev_priv->czclk_freq) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200462 /* CHV suggested value is 31 or 63 */
463 if (IS_CHERRYVIEW(dev_priv))
464 credits = PFI_CREDIT_63;
465 else
466 credits = PFI_CREDIT(15);
467 } else {
468 credits = default_credits;
469 }
470
471 /*
472 * WA - write default credits before re-programming
473 * FIXME: should we also set the resend bit here?
474 */
475 I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE |
476 default_credits);
477
478 I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE |
479 credits | PFI_CREDIT_RESEND);
480
481 /*
482 * FIXME is this guaranteed to clear
483 * immediately or should we poll for it?
484 */
485 WARN_ON(I915_READ(GCI_CONTROL) & PFI_CREDIT_RESEND);
486}
487
488static void vlv_set_cdclk(struct drm_device *dev, int cdclk)
489{
490 struct drm_i915_private *dev_priv = to_i915(dev);
491 u32 val, cmd;
492
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200493 if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
494 cmd = 2;
495 else if (cdclk == 266667)
496 cmd = 1;
497 else
498 cmd = 0;
499
500 mutex_lock(&dev_priv->rps.hw_lock);
501 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
502 val &= ~DSPFREQGUAR_MASK;
503 val |= (cmd << DSPFREQGUAR_SHIFT);
504 vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
505 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) &
506 DSPFREQSTAT_MASK) == (cmd << DSPFREQSTAT_SHIFT),
507 50)) {
508 DRM_ERROR("timed out waiting for CDclk change\n");
509 }
510 mutex_unlock(&dev_priv->rps.hw_lock);
511
512 mutex_lock(&dev_priv->sb_lock);
513
514 if (cdclk == 400000) {
515 u32 divider;
516
517 divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1,
518 cdclk) - 1;
519
520 /* adjust cdclk divider */
521 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
522 val &= ~CCK_FREQUENCY_VALUES;
523 val |= divider;
524 vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);
525
526 if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
527 CCK_FREQUENCY_STATUS) == (divider << CCK_FREQUENCY_STATUS_SHIFT),
528 50))
529 DRM_ERROR("timed out waiting for CDclk change\n");
530 }
531
532 /* adjust self-refresh exit latency value */
533 val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
534 val &= ~0x7f;
535
536 /*
537 * For high bandwidth configs, we set a higher latency in the bunit
538 * so that the core display fetch happens in time to avoid underruns.
539 */
540 if (cdclk == 400000)
541 val |= 4500 / 250; /* 4.5 usec */
542 else
543 val |= 3000 / 250; /* 3.0 usec */
544 vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);
545
546 mutex_unlock(&dev_priv->sb_lock);
547
548 intel_update_cdclk(dev_priv);
549}
550
551static void chv_set_cdclk(struct drm_device *dev, int cdclk)
552{
553 struct drm_i915_private *dev_priv = to_i915(dev);
554 u32 val, cmd;
555
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200556 switch (cdclk) {
557 case 333333:
558 case 320000:
559 case 266667:
560 case 200000:
561 break;
562 default:
563 MISSING_CASE(cdclk);
564 return;
565 }
566
567 /*
568 * Specs are full of misinformation, but testing on actual
569 * hardware has shown that we just need to write the desired
570 * CCK divider into the Punit register.
571 */
572 cmd = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
573
574 mutex_lock(&dev_priv->rps.hw_lock);
575 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
576 val &= ~DSPFREQGUAR_MASK_CHV;
577 val |= (cmd << DSPFREQGUAR_SHIFT_CHV);
578 vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
579 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) &
580 DSPFREQSTAT_MASK_CHV) == (cmd << DSPFREQSTAT_SHIFT_CHV),
581 50)) {
582 DRM_ERROR("timed out waiting for CDclk change\n");
583 }
584 mutex_unlock(&dev_priv->rps.hw_lock);
585
586 intel_update_cdclk(dev_priv);
587}
588
589static int bdw_calc_cdclk(int max_pixclk)
590{
591 if (max_pixclk > 540000)
592 return 675000;
593 else if (max_pixclk > 450000)
594 return 540000;
595 else if (max_pixclk > 337500)
596 return 450000;
597 else
598 return 337500;
599}
600
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200601static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
602 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200603{
604 uint32_t lcpll = I915_READ(LCPLL_CTL);
605 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
606
607 if (lcpll & LCPLL_CD_SOURCE_FCLK)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200608 cdclk_state->cdclk = 800000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200609 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200610 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200611 else if (freq == LCPLL_CLK_FREQ_450)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200612 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200613 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200614 cdclk_state->cdclk = 540000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200615 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200616 cdclk_state->cdclk = 337500;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200617 else
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200618 cdclk_state->cdclk = 675000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200619}
620
621static void bdw_set_cdclk(struct drm_device *dev, int cdclk)
622{
623 struct drm_i915_private *dev_priv = to_i915(dev);
624 uint32_t val, data;
625 int ret;
626
627 if (WARN((I915_READ(LCPLL_CTL) &
628 (LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
629 LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
630 LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
631 LCPLL_CD_SOURCE_FCLK)) != LCPLL_PLL_LOCK,
632 "trying to change cdclk frequency with cdclk not enabled\n"))
633 return;
634
635 mutex_lock(&dev_priv->rps.hw_lock);
636 ret = sandybridge_pcode_write(dev_priv,
637 BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ, 0x0);
638 mutex_unlock(&dev_priv->rps.hw_lock);
639 if (ret) {
640 DRM_ERROR("failed to inform pcode about cdclk change\n");
641 return;
642 }
643
644 val = I915_READ(LCPLL_CTL);
645 val |= LCPLL_CD_SOURCE_FCLK;
646 I915_WRITE(LCPLL_CTL, val);
647
648 if (wait_for_us(I915_READ(LCPLL_CTL) &
649 LCPLL_CD_SOURCE_FCLK_DONE, 1))
650 DRM_ERROR("Switching to FCLK failed\n");
651
652 val = I915_READ(LCPLL_CTL);
653 val &= ~LCPLL_CLK_FREQ_MASK;
654
655 switch (cdclk) {
656 case 450000:
657 val |= LCPLL_CLK_FREQ_450;
658 data = 0;
659 break;
660 case 540000:
661 val |= LCPLL_CLK_FREQ_54O_BDW;
662 data = 1;
663 break;
664 case 337500:
665 val |= LCPLL_CLK_FREQ_337_5_BDW;
666 data = 2;
667 break;
668 case 675000:
669 val |= LCPLL_CLK_FREQ_675_BDW;
670 data = 3;
671 break;
672 default:
673 WARN(1, "invalid cdclk frequency\n");
674 return;
675 }
676
677 I915_WRITE(LCPLL_CTL, val);
678
679 val = I915_READ(LCPLL_CTL);
680 val &= ~LCPLL_CD_SOURCE_FCLK;
681 I915_WRITE(LCPLL_CTL, val);
682
683 if (wait_for_us((I915_READ(LCPLL_CTL) &
684 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
685 DRM_ERROR("Switching back to LCPLL failed\n");
686
687 mutex_lock(&dev_priv->rps.hw_lock);
688 sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ, data);
689 mutex_unlock(&dev_priv->rps.hw_lock);
690
691 I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
692
693 intel_update_cdclk(dev_priv);
694
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200695 WARN(cdclk != dev_priv->cdclk.hw.cdclk,
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200696 "cdclk requested %d kHz but got %d kHz\n",
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200697 cdclk, dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200698}
699
700static int skl_calc_cdclk(int max_pixclk, int vco)
701{
702 if (vco == 8640000) {
703 if (max_pixclk > 540000)
704 return 617143;
705 else if (max_pixclk > 432000)
706 return 540000;
707 else if (max_pixclk > 308571)
708 return 432000;
709 else
710 return 308571;
711 } else {
712 if (max_pixclk > 540000)
713 return 675000;
714 else if (max_pixclk > 450000)
715 return 540000;
716 else if (max_pixclk > 337500)
717 return 450000;
718 else
719 return 337500;
720 }
721}
722
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200723static void skl_dpll0_update(struct drm_i915_private *dev_priv,
724 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200725{
726 u32 val;
727
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200728 cdclk_state->ref = 24000;
729 cdclk_state->vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200730
731 val = I915_READ(LCPLL1_CTL);
732 if ((val & LCPLL_PLL_ENABLE) == 0)
733 return;
734
735 if (WARN_ON((val & LCPLL_PLL_LOCK) == 0))
736 return;
737
738 val = I915_READ(DPLL_CTRL1);
739
740 if (WARN_ON((val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
741 DPLL_CTRL1_SSC(SKL_DPLL0) |
742 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
743 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
744 return;
745
746 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
747 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
748 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
749 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
750 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200751 cdclk_state->vco = 8100000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200752 break;
753 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
754 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200755 cdclk_state->vco = 8640000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200756 break;
757 default:
758 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
759 break;
760 }
761}
762
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200763static void skl_get_cdclk(struct drm_i915_private *dev_priv,
764 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200765{
766 u32 cdctl;
767
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200768 skl_dpll0_update(dev_priv, cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200769
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200770 cdclk_state->cdclk = cdclk_state->ref;
771
772 if (cdclk_state->vco == 0)
773 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200774
775 cdctl = I915_READ(CDCLK_CTL);
776
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200777 if (cdclk_state->vco == 8640000) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200778 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
779 case CDCLK_FREQ_450_432:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200780 cdclk_state->cdclk = 432000;
781 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200782 case CDCLK_FREQ_337_308:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200783 cdclk_state->cdclk = 308571;
784 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200785 case CDCLK_FREQ_540:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200786 cdclk_state->cdclk = 540000;
787 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200788 case CDCLK_FREQ_675_617:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200789 cdclk_state->cdclk = 617143;
790 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200791 default:
792 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200793 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200794 }
795 } else {
796 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
797 case CDCLK_FREQ_450_432:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200798 cdclk_state->cdclk = 450000;
799 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200800 case CDCLK_FREQ_337_308:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200801 cdclk_state->cdclk = 337500;
802 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200803 case CDCLK_FREQ_540:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200804 cdclk_state->cdclk = 540000;
805 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200806 case CDCLK_FREQ_675_617:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200807 cdclk_state->cdclk = 675000;
808 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200809 default:
810 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200811 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200812 }
813 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200814}
815
816/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
817static int skl_cdclk_decimal(int cdclk)
818{
819 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
820}
821
822static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
823 int vco)
824{
825 bool changed = dev_priv->skl_preferred_vco_freq != vco;
826
827 dev_priv->skl_preferred_vco_freq = vco;
828
829 if (changed)
830 intel_update_max_cdclk(dev_priv);
831}
832
833static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
834{
835 int min_cdclk = skl_calc_cdclk(0, vco);
836 u32 val;
837
838 WARN_ON(vco != 8100000 && vco != 8640000);
839
840 /* select the minimum CDCLK before enabling DPLL 0 */
841 val = CDCLK_FREQ_337_308 | skl_cdclk_decimal(min_cdclk);
842 I915_WRITE(CDCLK_CTL, val);
843 POSTING_READ(CDCLK_CTL);
844
845 /*
846 * We always enable DPLL0 with the lowest link rate possible, but still
847 * taking into account the VCO required to operate the eDP panel at the
848 * desired frequency. The usual DP link rates operate with a VCO of
849 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
850 * The modeset code is responsible for the selection of the exact link
851 * rate later on, with the constraint of choosing a frequency that
852 * works with vco.
853 */
854 val = I915_READ(DPLL_CTRL1);
855
856 val &= ~(DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) | DPLL_CTRL1_SSC(SKL_DPLL0) |
857 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
858 val |= DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
859 if (vco == 8640000)
860 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
861 SKL_DPLL0);
862 else
863 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
864 SKL_DPLL0);
865
866 I915_WRITE(DPLL_CTRL1, val);
867 POSTING_READ(DPLL_CTRL1);
868
869 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) | LCPLL_PLL_ENABLE);
870
871 if (intel_wait_for_register(dev_priv,
872 LCPLL1_CTL, LCPLL_PLL_LOCK, LCPLL_PLL_LOCK,
873 5))
874 DRM_ERROR("DPLL0 not locked\n");
875
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200876 dev_priv->cdclk.hw.vco = vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200877
878 /* We'll want to keep using the current vco from now on. */
879 skl_set_preferred_cdclk_vco(dev_priv, vco);
880}
881
882static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
883{
884 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
885 if (intel_wait_for_register(dev_priv,
886 LCPLL1_CTL, LCPLL_PLL_LOCK, 0,
887 1))
888 DRM_ERROR("Couldn't disable DPLL0\n");
889
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200890 dev_priv->cdclk.hw.vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200891}
892
893static void skl_set_cdclk(struct drm_i915_private *dev_priv,
894 int cdclk, int vco)
895{
896 u32 freq_select, pcu_ack;
897 int ret;
898
899 WARN_ON((cdclk == 24000) != (vco == 0));
900
901 DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz (VCO %d kHz)\n",
902 cdclk, vco);
903
904 mutex_lock(&dev_priv->rps.hw_lock);
905 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
906 SKL_CDCLK_PREPARE_FOR_CHANGE,
907 SKL_CDCLK_READY_FOR_CHANGE,
908 SKL_CDCLK_READY_FOR_CHANGE, 3);
909 mutex_unlock(&dev_priv->rps.hw_lock);
910 if (ret) {
911 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
912 ret);
913 return;
914 }
915
916 /* set CDCLK_CTL */
917 switch (cdclk) {
918 case 450000:
919 case 432000:
920 freq_select = CDCLK_FREQ_450_432;
921 pcu_ack = 1;
922 break;
923 case 540000:
924 freq_select = CDCLK_FREQ_540;
925 pcu_ack = 2;
926 break;
927 case 308571:
928 case 337500:
929 default:
930 freq_select = CDCLK_FREQ_337_308;
931 pcu_ack = 0;
932 break;
933 case 617143:
934 case 675000:
935 freq_select = CDCLK_FREQ_675_617;
936 pcu_ack = 3;
937 break;
938 }
939
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200940 if (dev_priv->cdclk.hw.vco != 0 &&
941 dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200942 skl_dpll0_disable(dev_priv);
943
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200944 if (dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200945 skl_dpll0_enable(dev_priv, vco);
946
947 I915_WRITE(CDCLK_CTL, freq_select | skl_cdclk_decimal(cdclk));
948 POSTING_READ(CDCLK_CTL);
949
950 /* inform PCU of the change */
951 mutex_lock(&dev_priv->rps.hw_lock);
952 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL, pcu_ack);
953 mutex_unlock(&dev_priv->rps.hw_lock);
954
955 intel_update_cdclk(dev_priv);
956}
957
958static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
959{
960 uint32_t cdctl, expected;
961
962 /*
963 * check if the pre-os initialized the display
964 * There is SWF18 scratchpad register defined which is set by the
965 * pre-os which can be used by the OS drivers to check the status
966 */
967 if ((I915_READ(SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
968 goto sanitize;
969
970 intel_update_cdclk(dev_priv);
971 /* Is PLL enabled and locked ? */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200972 if (dev_priv->cdclk.hw.vco == 0 ||
973 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200974 goto sanitize;
975
976 /* DPLL okay; verify the cdclock
977 *
978 * Noticed in some instances that the freq selection is correct but
979 * decimal part is programmed wrong from BIOS where pre-os does not
980 * enable display. Verify the same as well.
981 */
982 cdctl = I915_READ(CDCLK_CTL);
983 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200984 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200985 if (cdctl == expected)
986 /* All well; nothing to sanitize */
987 return;
988
989sanitize:
990 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
991
992 /* force cdclk programming */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200993 dev_priv->cdclk.hw.cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200994 /* force full PLL disable + enable */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200995 dev_priv->cdclk.hw.vco = -1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200996}
997
998/**
999 * skl_init_cdclk - Initialize CDCLK on SKL
1000 * @dev_priv: i915 device
1001 *
1002 * Initialize CDCLK for SKL and derivatives. This is generally
1003 * done only during the display core initialization sequence,
1004 * after which the DMC will take care of turning CDCLK off/on
1005 * as needed.
1006 */
1007void skl_init_cdclk(struct drm_i915_private *dev_priv)
1008{
1009 int cdclk, vco;
1010
1011 skl_sanitize_cdclk(dev_priv);
1012
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001013 if (dev_priv->cdclk.hw.cdclk != 0 &&
1014 dev_priv->cdclk.hw.vco != 0) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001015 /*
1016 * Use the current vco as our initial
1017 * guess as to what the preferred vco is.
1018 */
1019 if (dev_priv->skl_preferred_vco_freq == 0)
1020 skl_set_preferred_cdclk_vco(dev_priv,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001021 dev_priv->cdclk.hw.vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001022 return;
1023 }
1024
1025 vco = dev_priv->skl_preferred_vco_freq;
1026 if (vco == 0)
1027 vco = 8100000;
1028 cdclk = skl_calc_cdclk(0, vco);
1029
1030 skl_set_cdclk(dev_priv, cdclk, vco);
1031}
1032
1033/**
1034 * skl_uninit_cdclk - Uninitialize CDCLK on SKL
1035 * @dev_priv: i915 device
1036 *
1037 * Uninitialize CDCLK for SKL and derivatives. This is done only
1038 * during the display core uninitialization sequence.
1039 */
1040void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
1041{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001042 skl_set_cdclk(dev_priv, dev_priv->cdclk.hw.ref, 0);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001043}
1044
1045static int bxt_calc_cdclk(int max_pixclk)
1046{
1047 if (max_pixclk > 576000)
1048 return 624000;
1049 else if (max_pixclk > 384000)
1050 return 576000;
1051 else if (max_pixclk > 288000)
1052 return 384000;
1053 else if (max_pixclk > 144000)
1054 return 288000;
1055 else
1056 return 144000;
1057}
1058
1059static int glk_calc_cdclk(int max_pixclk)
1060{
1061 if (max_pixclk > 2 * 158400)
1062 return 316800;
1063 else if (max_pixclk > 2 * 79200)
1064 return 158400;
1065 else
1066 return 79200;
1067}
1068
1069static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1070{
1071 int ratio;
1072
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001073 if (cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001074 return 0;
1075
1076 switch (cdclk) {
1077 default:
1078 MISSING_CASE(cdclk);
1079 case 144000:
1080 case 288000:
1081 case 384000:
1082 case 576000:
1083 ratio = 60;
1084 break;
1085 case 624000:
1086 ratio = 65;
1087 break;
1088 }
1089
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001090 return dev_priv->cdclk.hw.ref * ratio;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001091}
1092
1093static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1094{
1095 int ratio;
1096
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001097 if (cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001098 return 0;
1099
1100 switch (cdclk) {
1101 default:
1102 MISSING_CASE(cdclk);
1103 case 79200:
1104 case 158400:
1105 case 316800:
1106 ratio = 33;
1107 break;
1108 }
1109
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001110 return dev_priv->cdclk.hw.ref * ratio;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001111}
1112
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001113static void bxt_de_pll_update(struct drm_i915_private *dev_priv,
1114 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001115{
1116 u32 val;
1117
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001118 cdclk_state->ref = 19200;
1119 cdclk_state->vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001120
1121 val = I915_READ(BXT_DE_PLL_ENABLE);
1122 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1123 return;
1124
1125 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1126 return;
1127
1128 val = I915_READ(BXT_DE_PLL_CTL);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001129 cdclk_state->vco = (val & BXT_DE_PLL_RATIO_MASK) * cdclk_state->ref;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001130}
1131
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001132static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1133 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001134{
1135 u32 divider;
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001136 int div;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001137
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001138 bxt_de_pll_update(dev_priv, cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001139
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001140 cdclk_state->cdclk = cdclk_state->ref;
1141
1142 if (cdclk_state->vco == 0)
1143 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001144
1145 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1146
1147 switch (divider) {
1148 case BXT_CDCLK_CD2X_DIV_SEL_1:
1149 div = 2;
1150 break;
1151 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1152 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1153 div = 3;
1154 break;
1155 case BXT_CDCLK_CD2X_DIV_SEL_2:
1156 div = 4;
1157 break;
1158 case BXT_CDCLK_CD2X_DIV_SEL_4:
1159 div = 8;
1160 break;
1161 default:
1162 MISSING_CASE(divider);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001163 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001164 }
1165
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001166 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001167}
1168
1169static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1170{
1171 I915_WRITE(BXT_DE_PLL_ENABLE, 0);
1172
1173 /* Timeout 200us */
1174 if (intel_wait_for_register(dev_priv,
1175 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 0,
1176 1))
1177 DRM_ERROR("timeout waiting for DE PLL unlock\n");
1178
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001179 dev_priv->cdclk.hw.vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001180}
1181
1182static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1183{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001184 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001185 u32 val;
1186
1187 val = I915_READ(BXT_DE_PLL_CTL);
1188 val &= ~BXT_DE_PLL_RATIO_MASK;
1189 val |= BXT_DE_PLL_RATIO(ratio);
1190 I915_WRITE(BXT_DE_PLL_CTL, val);
1191
1192 I915_WRITE(BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1193
1194 /* Timeout 200us */
1195 if (intel_wait_for_register(dev_priv,
1196 BXT_DE_PLL_ENABLE,
1197 BXT_DE_PLL_LOCK,
1198 BXT_DE_PLL_LOCK,
1199 1))
1200 DRM_ERROR("timeout waiting for DE PLL lock\n");
1201
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001202 dev_priv->cdclk.hw.vco = vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001203}
1204
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001205static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
1206 int cdclk, int vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001207{
1208 u32 val, divider;
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001209 int ret;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001210
1211 DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz (VCO %d kHz)\n",
1212 cdclk, vco);
1213
1214 /* cdclk = vco / 2 / div{1,1.5,2,4} */
1215 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
1216 case 8:
1217 divider = BXT_CDCLK_CD2X_DIV_SEL_4;
1218 break;
1219 case 4:
1220 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1221 break;
1222 case 3:
1223 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1224 divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
1225 break;
1226 case 2:
1227 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1228 break;
1229 default:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001230 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001231 WARN_ON(vco != 0);
1232
1233 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1234 break;
1235 }
1236
1237 /* Inform power controller of upcoming frequency change */
1238 mutex_lock(&dev_priv->rps.hw_lock);
1239 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1240 0x80000000);
1241 mutex_unlock(&dev_priv->rps.hw_lock);
1242
1243 if (ret) {
1244 DRM_ERROR("PCode CDCLK freq change notify failed (err %d, freq %d)\n",
1245 ret, cdclk);
1246 return;
1247 }
1248
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001249 if (dev_priv->cdclk.hw.vco != 0 &&
1250 dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001251 bxt_de_pll_disable(dev_priv);
1252
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001253 if (dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001254 bxt_de_pll_enable(dev_priv, vco);
1255
1256 val = divider | skl_cdclk_decimal(cdclk);
1257 /*
1258 * FIXME if only the cd2x divider needs changing, it could be done
1259 * without shutting off the pipe (if only one pipe is active).
1260 */
1261 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1262 /*
1263 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1264 * enable otherwise.
1265 */
1266 if (cdclk >= 500000)
1267 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1268 I915_WRITE(CDCLK_CTL, val);
1269
1270 mutex_lock(&dev_priv->rps.hw_lock);
1271 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1272 DIV_ROUND_UP(cdclk, 25000));
1273 mutex_unlock(&dev_priv->rps.hw_lock);
1274
1275 if (ret) {
1276 DRM_ERROR("PCode CDCLK freq set failed, (err %d, freq %d)\n",
1277 ret, cdclk);
1278 return;
1279 }
1280
1281 intel_update_cdclk(dev_priv);
1282}
1283
1284static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
1285{
1286 u32 cdctl, expected;
1287
1288 intel_update_cdclk(dev_priv);
1289
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001290 if (dev_priv->cdclk.hw.vco == 0 ||
1291 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001292 goto sanitize;
1293
1294 /* DPLL okay; verify the cdclock
1295 *
1296 * Some BIOS versions leave an incorrect decimal frequency value and
1297 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1298 * so sanitize this register.
1299 */
1300 cdctl = I915_READ(CDCLK_CTL);
1301 /*
1302 * Let's ignore the pipe field, since BIOS could have configured the
1303 * dividers both synching to an active pipe, or asynchronously
1304 * (PIPE_NONE).
1305 */
1306 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1307
1308 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001309 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001310 /*
1311 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1312 * enable otherwise.
1313 */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001314 if (dev_priv->cdclk.hw.cdclk >= 500000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001315 expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1316
1317 if (cdctl == expected)
1318 /* All well; nothing to sanitize */
1319 return;
1320
1321sanitize:
1322 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1323
1324 /* force cdclk programming */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001325 dev_priv->cdclk.hw.cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001326
1327 /* force full PLL disable + enable */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001328 dev_priv->cdclk.hw.vco = -1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001329}
1330
1331/**
1332 * bxt_init_cdclk - Initialize CDCLK on BXT
1333 * @dev_priv: i915 device
1334 *
1335 * Initialize CDCLK for BXT and derivatives. This is generally
1336 * done only during the display core initialization sequence,
1337 * after which the DMC will take care of turning CDCLK off/on
1338 * as needed.
1339 */
1340void bxt_init_cdclk(struct drm_i915_private *dev_priv)
1341{
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001342 int cdclk, vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001343
1344 bxt_sanitize_cdclk(dev_priv);
1345
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001346 if (dev_priv->cdclk.hw.cdclk != 0 &&
1347 dev_priv->cdclk.hw.vco != 0)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001348 return;
1349
1350 /*
1351 * FIXME:
1352 * - The initial CDCLK needs to be read from VBT.
1353 * Need to make this change after VBT has changes for BXT.
1354 */
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001355 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001356 cdclk = glk_calc_cdclk(0);
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001357 vco = glk_de_pll_vco(dev_priv, cdclk);
1358 } else {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001359 cdclk = bxt_calc_cdclk(0);
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001360 vco = bxt_de_pll_vco(dev_priv, cdclk);
1361 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001362
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001363 bxt_set_cdclk(dev_priv, cdclk, vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001364}
1365
1366/**
1367 * bxt_uninit_cdclk - Uninitialize CDCLK on BXT
1368 * @dev_priv: i915 device
1369 *
1370 * Uninitialize CDCLK for BXT and derivatives. This is done only
1371 * during the display core uninitialization sequence.
1372 */
1373void bxt_uninit_cdclk(struct drm_i915_private *dev_priv)
1374{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001375 bxt_set_cdclk(dev_priv, dev_priv->cdclk.hw.ref, 0);
1376}
1377
1378/**
1379 * intel_cdclk_state_compare - Determine if two CDCLK states differ
1380 * @a: first CDCLK state
1381 * @b: second CDCLK state
1382 *
1383 * Returns:
1384 * True if the CDCLK states are identical, false if they differ.
1385 */
1386bool intel_cdclk_state_compare(const struct intel_cdclk_state *a,
1387 const struct intel_cdclk_state *b)
1388{
1389 return memcmp(a, b, sizeof(*a)) == 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001390}
1391
1392static int bdw_adjust_min_pipe_pixel_rate(struct intel_crtc_state *crtc_state,
1393 int pixel_rate)
1394{
1395 struct drm_i915_private *dev_priv =
1396 to_i915(crtc_state->base.crtc->dev);
1397
1398 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
1399 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
1400 pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95);
1401
1402 /* BSpec says "Do not use DisplayPort with CDCLK less than
1403 * 432 MHz, audio enabled, port width x4, and link rate
1404 * HBR2 (5.4 GHz), or else there may be audio corruption or
1405 * screen corruption."
1406 */
1407 if (intel_crtc_has_dp_encoder(crtc_state) &&
1408 crtc_state->has_audio &&
1409 crtc_state->port_clock >= 540000 &&
1410 crtc_state->lane_count == 4)
1411 pixel_rate = max(432000, pixel_rate);
1412
1413 return pixel_rate;
1414}
1415
1416/* compute the max rate for new configuration */
1417static int intel_max_pixel_rate(struct drm_atomic_state *state)
1418{
1419 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1420 struct drm_i915_private *dev_priv = to_i915(state->dev);
1421 struct drm_crtc *crtc;
1422 struct drm_crtc_state *cstate;
1423 struct intel_crtc_state *crtc_state;
1424 unsigned int max_pixel_rate = 0, i;
1425 enum pipe pipe;
1426
1427 memcpy(intel_state->min_pixclk, dev_priv->min_pixclk,
1428 sizeof(intel_state->min_pixclk));
1429
1430 for_each_crtc_in_state(state, crtc, cstate, i) {
1431 int pixel_rate;
1432
1433 crtc_state = to_intel_crtc_state(cstate);
1434 if (!crtc_state->base.enable) {
1435 intel_state->min_pixclk[i] = 0;
1436 continue;
1437 }
1438
1439 pixel_rate = crtc_state->pixel_rate;
1440
1441 if (IS_BROADWELL(dev_priv) || IS_GEN9(dev_priv))
1442 pixel_rate =
1443 bdw_adjust_min_pipe_pixel_rate(crtc_state,
1444 pixel_rate);
1445
1446 intel_state->min_pixclk[i] = pixel_rate;
1447 }
1448
1449 for_each_pipe(dev_priv, pipe)
1450 max_pixel_rate = max(intel_state->min_pixclk[pipe],
1451 max_pixel_rate);
1452
1453 return max_pixel_rate;
1454}
1455
1456static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
1457{
1458 struct drm_device *dev = state->dev;
1459 struct drm_i915_private *dev_priv = to_i915(dev);
1460 int max_pixclk = intel_max_pixel_rate(state);
1461 struct intel_atomic_state *intel_state =
1462 to_intel_atomic_state(state);
1463
1464 intel_state->cdclk = intel_state->dev_cdclk =
1465 vlv_calc_cdclk(dev_priv, max_pixclk);
1466
1467 if (!intel_state->active_crtcs)
1468 intel_state->dev_cdclk = vlv_calc_cdclk(dev_priv, 0);
1469
1470 return 0;
1471}
1472
1473static void vlv_modeset_commit_cdclk(struct drm_atomic_state *old_state)
1474{
1475 struct drm_device *dev = old_state->dev;
1476 struct drm_i915_private *dev_priv = to_i915(dev);
1477 struct intel_atomic_state *old_intel_state =
1478 to_intel_atomic_state(old_state);
1479 unsigned int req_cdclk = old_intel_state->dev_cdclk;
1480
1481 /*
1482 * FIXME: We can end up here with all power domains off, yet
1483 * with a CDCLK frequency other than the minimum. To account
1484 * for this take the PIPE-A power domain, which covers the HW
1485 * blocks needed for the following programming. This can be
1486 * removed once it's guaranteed that we get here either with
1487 * the minimum CDCLK set, or the required power domains
1488 * enabled.
1489 */
1490 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
1491
1492 if (IS_CHERRYVIEW(dev_priv))
1493 chv_set_cdclk(dev, req_cdclk);
1494 else
1495 vlv_set_cdclk(dev, req_cdclk);
1496
1497 vlv_program_pfi_credits(dev_priv);
1498
1499 intel_display_power_put(dev_priv, POWER_DOMAIN_PIPE_A);
1500}
1501
1502static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
1503{
1504 struct drm_i915_private *dev_priv = to_i915(state->dev);
1505 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1506 int max_pixclk = intel_max_pixel_rate(state);
1507 int cdclk;
1508
1509 /*
1510 * FIXME should also account for plane ratio
1511 * once 64bpp pixel formats are supported.
1512 */
1513 cdclk = bdw_calc_cdclk(max_pixclk);
1514
1515 if (cdclk > dev_priv->max_cdclk_freq) {
1516 DRM_DEBUG_KMS("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
1517 cdclk, dev_priv->max_cdclk_freq);
1518 return -EINVAL;
1519 }
1520
1521 intel_state->cdclk = intel_state->dev_cdclk = cdclk;
1522 if (!intel_state->active_crtcs)
1523 intel_state->dev_cdclk = bdw_calc_cdclk(0);
1524
1525 return 0;
1526}
1527
1528static void bdw_modeset_commit_cdclk(struct drm_atomic_state *old_state)
1529{
1530 struct drm_device *dev = old_state->dev;
1531 struct intel_atomic_state *old_intel_state =
1532 to_intel_atomic_state(old_state);
1533 unsigned int req_cdclk = old_intel_state->dev_cdclk;
1534
1535 bdw_set_cdclk(dev, req_cdclk);
1536}
1537
1538static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
1539{
1540 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1541 struct drm_i915_private *dev_priv = to_i915(state->dev);
1542 const int max_pixclk = intel_max_pixel_rate(state);
1543 int vco = intel_state->cdclk_pll_vco;
1544 int cdclk;
1545
1546 /*
1547 * FIXME should also account for plane ratio
1548 * once 64bpp pixel formats are supported.
1549 */
1550 cdclk = skl_calc_cdclk(max_pixclk, vco);
1551
1552 /*
1553 * FIXME move the cdclk caclulation to
1554 * compute_config() so we can fail gracegully.
1555 */
1556 if (cdclk > dev_priv->max_cdclk_freq) {
1557 DRM_ERROR("requested cdclk (%d kHz) exceeds max (%d kHz)\n",
1558 cdclk, dev_priv->max_cdclk_freq);
1559 cdclk = dev_priv->max_cdclk_freq;
1560 }
1561
1562 intel_state->cdclk = intel_state->dev_cdclk = cdclk;
1563 if (!intel_state->active_crtcs)
1564 intel_state->dev_cdclk = skl_calc_cdclk(0, vco);
1565
1566 return 0;
1567}
1568
1569static void skl_modeset_commit_cdclk(struct drm_atomic_state *old_state)
1570{
1571 struct drm_i915_private *dev_priv = to_i915(old_state->dev);
1572 struct intel_atomic_state *intel_state =
1573 to_intel_atomic_state(old_state);
1574 unsigned int req_cdclk = intel_state->dev_cdclk;
1575 unsigned int req_vco = intel_state->cdclk_pll_vco;
1576
1577 skl_set_cdclk(dev_priv, req_cdclk, req_vco);
1578}
1579
1580static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
1581{
1582 struct drm_i915_private *dev_priv = to_i915(state->dev);
1583 int max_pixclk = intel_max_pixel_rate(state);
1584 struct intel_atomic_state *intel_state =
1585 to_intel_atomic_state(state);
1586 int cdclk;
1587
1588 if (IS_GEMINILAKE(dev_priv))
1589 cdclk = glk_calc_cdclk(max_pixclk);
1590 else
1591 cdclk = bxt_calc_cdclk(max_pixclk);
1592
1593 intel_state->cdclk = intel_state->dev_cdclk = cdclk;
1594
1595 if (!intel_state->active_crtcs) {
1596 if (IS_GEMINILAKE(dev_priv))
1597 cdclk = glk_calc_cdclk(0);
1598 else
1599 cdclk = bxt_calc_cdclk(0);
1600
1601 intel_state->dev_cdclk = cdclk;
1602 }
1603
1604 return 0;
1605}
1606
1607static void bxt_modeset_commit_cdclk(struct drm_atomic_state *old_state)
1608{
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001609 struct drm_i915_private *dev_priv = to_i915(old_state->dev);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001610 struct intel_atomic_state *old_intel_state =
1611 to_intel_atomic_state(old_state);
1612 unsigned int req_cdclk = old_intel_state->dev_cdclk;
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001613 unsigned int req_vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001614
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001615 if (IS_GEMINILAKE(dev_priv))
1616 req_vco = glk_de_pll_vco(dev_priv, req_cdclk);
1617 else
1618 req_vco = bxt_de_pll_vco(dev_priv, req_cdclk);
1619
1620 bxt_set_cdclk(dev_priv, req_cdclk, req_vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001621}
1622
1623static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
1624{
1625 int max_cdclk_freq = dev_priv->max_cdclk_freq;
1626
1627 if (IS_GEMINILAKE(dev_priv))
1628 return 2 * max_cdclk_freq;
1629 else if (INTEL_INFO(dev_priv)->gen >= 9 ||
1630 IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
1631 return max_cdclk_freq;
1632 else if (IS_CHERRYVIEW(dev_priv))
1633 return max_cdclk_freq*95/100;
1634 else if (INTEL_INFO(dev_priv)->gen < 4)
1635 return 2*max_cdclk_freq*90/100;
1636 else
1637 return max_cdclk_freq*90/100;
1638}
1639
1640/**
1641 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
1642 * @dev_priv: i915 device
1643 *
1644 * Determine the maximum CDCLK frequency the platform supports, and also
1645 * derive the maximum dot clock frequency the maximum CDCLK frequency
1646 * allows.
1647 */
1648void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
1649{
1650 if (IS_GEN9_BC(dev_priv)) {
1651 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
1652 int max_cdclk, vco;
1653
1654 vco = dev_priv->skl_preferred_vco_freq;
1655 WARN_ON(vco != 8100000 && vco != 8640000);
1656
1657 /*
1658 * Use the lower (vco 8640) cdclk values as a
1659 * first guess. skl_calc_cdclk() will correct it
1660 * if the preferred vco is 8100 instead.
1661 */
1662 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
1663 max_cdclk = 617143;
1664 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
1665 max_cdclk = 540000;
1666 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
1667 max_cdclk = 432000;
1668 else
1669 max_cdclk = 308571;
1670
1671 dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
1672 } else if (IS_GEMINILAKE(dev_priv)) {
1673 dev_priv->max_cdclk_freq = 316800;
1674 } else if (IS_BROXTON(dev_priv)) {
1675 dev_priv->max_cdclk_freq = 624000;
1676 } else if (IS_BROADWELL(dev_priv)) {
1677 /*
1678 * FIXME with extra cooling we can allow
1679 * 540 MHz for ULX and 675 Mhz for ULT.
1680 * How can we know if extra cooling is
1681 * available? PCI ID, VTB, something else?
1682 */
1683 if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
1684 dev_priv->max_cdclk_freq = 450000;
1685 else if (IS_BDW_ULX(dev_priv))
1686 dev_priv->max_cdclk_freq = 450000;
1687 else if (IS_BDW_ULT(dev_priv))
1688 dev_priv->max_cdclk_freq = 540000;
1689 else
1690 dev_priv->max_cdclk_freq = 675000;
1691 } else if (IS_CHERRYVIEW(dev_priv)) {
1692 dev_priv->max_cdclk_freq = 320000;
1693 } else if (IS_VALLEYVIEW(dev_priv)) {
1694 dev_priv->max_cdclk_freq = 400000;
1695 } else {
1696 /* otherwise assume cdclk is fixed */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001697 dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001698 }
1699
1700 dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
1701
1702 DRM_DEBUG_DRIVER("Max CD clock rate: %d kHz\n",
1703 dev_priv->max_cdclk_freq);
1704
1705 DRM_DEBUG_DRIVER("Max dotclock rate: %d kHz\n",
1706 dev_priv->max_dotclk_freq);
1707}
1708
1709/**
1710 * intel_update_cdclk - Determine the current CDCLK frequency
1711 * @dev_priv: i915 device
1712 *
1713 * Determine the current CDCLK frequency.
1714 */
1715void intel_update_cdclk(struct drm_i915_private *dev_priv)
1716{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001717 dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001718
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001719 DRM_DEBUG_DRIVER("Current CD clock rate: %d kHz, VCO: %d kHz, ref: %d kHz\n",
1720 dev_priv->cdclk.hw.cdclk, dev_priv->cdclk.hw.vco,
1721 dev_priv->cdclk.hw.ref);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001722
1723 /*
1724 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
1725 * Programmng [sic] note: bit[9:2] should be programmed to the number
1726 * of cdclk that generates 4MHz reference clock freq which is used to
1727 * generate GMBus clock. This will vary with the cdclk freq.
1728 */
1729 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1730 I915_WRITE(GMBUSFREQ_VLV,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001731 DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001732}
1733
1734static int pch_rawclk(struct drm_i915_private *dev_priv)
1735{
1736 return (I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
1737}
1738
1739static int vlv_hrawclk(struct drm_i915_private *dev_priv)
1740{
1741 /* RAWCLK_FREQ_VLV register updated from power well code */
1742 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
1743 CCK_DISPLAY_REF_CLOCK_CONTROL);
1744}
1745
1746static int g4x_hrawclk(struct drm_i915_private *dev_priv)
1747{
1748 uint32_t clkcfg;
1749
1750 /* hrawclock is 1/4 the FSB frequency */
1751 clkcfg = I915_READ(CLKCFG);
1752 switch (clkcfg & CLKCFG_FSB_MASK) {
1753 case CLKCFG_FSB_400:
1754 return 100000;
1755 case CLKCFG_FSB_533:
1756 return 133333;
1757 case CLKCFG_FSB_667:
1758 return 166667;
1759 case CLKCFG_FSB_800:
1760 return 200000;
1761 case CLKCFG_FSB_1067:
1762 return 266667;
1763 case CLKCFG_FSB_1333:
1764 return 333333;
1765 /* these two are just a guess; one of them might be right */
1766 case CLKCFG_FSB_1600:
1767 case CLKCFG_FSB_1600_ALT:
1768 return 400000;
1769 default:
1770 return 133333;
1771 }
1772}
1773
1774/**
1775 * intel_update_rawclk - Determine the current RAWCLK frequency
1776 * @dev_priv: i915 device
1777 *
1778 * Determine the current RAWCLK frequency. RAWCLK is a fixed
1779 * frequency clock so this needs to done only once.
1780 */
1781void intel_update_rawclk(struct drm_i915_private *dev_priv)
1782{
1783 if (HAS_PCH_SPLIT(dev_priv))
1784 dev_priv->rawclk_freq = pch_rawclk(dev_priv);
1785 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1786 dev_priv->rawclk_freq = vlv_hrawclk(dev_priv);
1787 else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
1788 dev_priv->rawclk_freq = g4x_hrawclk(dev_priv);
1789 else
1790 /* no rawclk on other platforms, or no need to know it */
1791 return;
1792
1793 DRM_DEBUG_DRIVER("rawclk rate: %d kHz\n", dev_priv->rawclk_freq);
1794}
1795
1796/**
1797 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
1798 * @dev_priv: i915 device
1799 */
1800void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
1801{
1802 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1803 dev_priv->display.modeset_commit_cdclk =
1804 vlv_modeset_commit_cdclk;
1805 dev_priv->display.modeset_calc_cdclk =
1806 vlv_modeset_calc_cdclk;
1807 } else if (IS_BROADWELL(dev_priv)) {
1808 dev_priv->display.modeset_commit_cdclk =
1809 bdw_modeset_commit_cdclk;
1810 dev_priv->display.modeset_calc_cdclk =
1811 bdw_modeset_calc_cdclk;
1812 } else if (IS_GEN9_LP(dev_priv)) {
1813 dev_priv->display.modeset_commit_cdclk =
1814 bxt_modeset_commit_cdclk;
1815 dev_priv->display.modeset_calc_cdclk =
1816 bxt_modeset_calc_cdclk;
1817 } else if (IS_GEN9_BC(dev_priv)) {
1818 dev_priv->display.modeset_commit_cdclk =
1819 skl_modeset_commit_cdclk;
1820 dev_priv->display.modeset_calc_cdclk =
1821 skl_modeset_calc_cdclk;
1822 }
1823
1824 if (IS_GEN9_BC(dev_priv))
1825 dev_priv->display.get_cdclk = skl_get_cdclk;
1826 else if (IS_GEN9_LP(dev_priv))
1827 dev_priv->display.get_cdclk = bxt_get_cdclk;
1828 else if (IS_BROADWELL(dev_priv))
1829 dev_priv->display.get_cdclk = bdw_get_cdclk;
1830 else if (IS_HASWELL(dev_priv))
1831 dev_priv->display.get_cdclk = hsw_get_cdclk;
1832 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1833 dev_priv->display.get_cdclk = vlv_get_cdclk;
1834 else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
1835 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
1836 else if (IS_GEN5(dev_priv))
1837 dev_priv->display.get_cdclk = fixed_450mhz_get_cdclk;
1838 else if (IS_GM45(dev_priv))
1839 dev_priv->display.get_cdclk = gm45_get_cdclk;
1840 else if (IS_G4X(dev_priv))
1841 dev_priv->display.get_cdclk = g33_get_cdclk;
1842 else if (IS_I965GM(dev_priv))
1843 dev_priv->display.get_cdclk = i965gm_get_cdclk;
1844 else if (IS_I965G(dev_priv))
1845 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
1846 else if (IS_PINEVIEW(dev_priv))
1847 dev_priv->display.get_cdclk = pnv_get_cdclk;
1848 else if (IS_G33(dev_priv))
1849 dev_priv->display.get_cdclk = g33_get_cdclk;
1850 else if (IS_I945GM(dev_priv))
1851 dev_priv->display.get_cdclk = i945gm_get_cdclk;
1852 else if (IS_I945G(dev_priv))
1853 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
1854 else if (IS_I915GM(dev_priv))
1855 dev_priv->display.get_cdclk = i915gm_get_cdclk;
1856 else if (IS_I915G(dev_priv))
1857 dev_priv->display.get_cdclk = fixed_333mhz_get_cdclk;
1858 else if (IS_I865G(dev_priv))
1859 dev_priv->display.get_cdclk = fixed_266mhz_get_cdclk;
1860 else if (IS_I85X(dev_priv))
1861 dev_priv->display.get_cdclk = i85x_get_cdclk;
1862 else if (IS_I845G(dev_priv))
1863 dev_priv->display.get_cdclk = fixed_200mhz_get_cdclk;
1864 else { /* 830 */
1865 WARN(!IS_I830(dev_priv),
1866 "Unknown platform. Assuming 133 MHz CDCLK\n");
1867 dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;
1868 }
1869}