blob: 51cd23dd867646486caaab7dc22d93497c78c04e [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;
Paulo Zanoni6b9e4412017-02-20 17:00:41 -0300226 else if (IS_G45(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200227 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
Ville Syrjäläd305e062017-08-30 21:57:03 +0300420static int vlv_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200421{
422 int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ?
423 333333 : 320000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200424
425 /*
426 * We seem to get an unstable or solid color picture at 200MHz.
427 * Not sure what's wrong. For now use 200MHz only when all pipes
428 * are off.
429 */
Ville Syrjäläd305e062017-08-30 21:57:03 +0300430 if (IS_VALLEYVIEW(dev_priv) && min_cdclk > freq_320)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200431 return 400000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300432 else if (min_cdclk > 266667)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200433 return freq_320;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300434 else if (min_cdclk > 0)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200435 return 266667;
436 else
437 return 200000;
438}
439
Ville Syrjälä999c5762017-10-24 12:52:09 +0300440static u8 vlv_calc_voltage_level(struct drm_i915_private *dev_priv, int cdclk)
441{
442 if (IS_VALLEYVIEW(dev_priv)) {
443 if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
444 return 2;
445 else if (cdclk >= 266667)
446 return 1;
447 else
448 return 0;
449 } else {
450 /*
451 * Specs are full of misinformation, but testing on actual
452 * hardware has shown that we just need to write the desired
453 * CCK divider into the Punit register.
454 */
455 return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
456 }
457}
458
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200459static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
460 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200461{
Ville Syrjälä999c5762017-10-24 12:52:09 +0300462 u32 val;
463
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200464 cdclk_state->vco = vlv_get_hpll_vco(dev_priv);
465 cdclk_state->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
466 CCK_DISPLAY_CLOCK_CONTROL,
467 cdclk_state->vco);
Ville Syrjälä999c5762017-10-24 12:52:09 +0300468
469 mutex_lock(&dev_priv->pcu_lock);
470 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
471 mutex_unlock(&dev_priv->pcu_lock);
472
473 if (IS_VALLEYVIEW(dev_priv))
474 cdclk_state->voltage_level = (val & DSPFREQGUAR_MASK) >>
475 DSPFREQGUAR_SHIFT;
476 else
477 cdclk_state->voltage_level = (val & DSPFREQGUAR_MASK_CHV) >>
478 DSPFREQGUAR_SHIFT_CHV;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200479}
480
481static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
482{
483 unsigned int credits, default_credits;
484
485 if (IS_CHERRYVIEW(dev_priv))
486 default_credits = PFI_CREDIT(12);
487 else
488 default_credits = PFI_CREDIT(8);
489
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200490 if (dev_priv->cdclk.hw.cdclk >= dev_priv->czclk_freq) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200491 /* CHV suggested value is 31 or 63 */
492 if (IS_CHERRYVIEW(dev_priv))
493 credits = PFI_CREDIT_63;
494 else
495 credits = PFI_CREDIT(15);
496 } else {
497 credits = default_credits;
498 }
499
500 /*
501 * WA - write default credits before re-programming
502 * FIXME: should we also set the resend bit here?
503 */
504 I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE |
505 default_credits);
506
507 I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE |
508 credits | PFI_CREDIT_RESEND);
509
510 /*
511 * FIXME is this guaranteed to clear
512 * immediately or should we poll for it?
513 */
514 WARN_ON(I915_READ(GCI_CONTROL) & PFI_CREDIT_RESEND);
515}
516
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200517static void vlv_set_cdclk(struct drm_i915_private *dev_priv,
518 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200519{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200520 int cdclk = cdclk_state->cdclk;
Ville Syrjälä999c5762017-10-24 12:52:09 +0300521 u32 val, cmd = cdclk_state->voltage_level;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200522
Ville Syrjälä0c9f353f2017-10-24 12:52:15 +0300523 switch (cdclk) {
524 case 400000:
525 case 333333:
526 case 320000:
527 case 266667:
528 case 200000:
529 break;
530 default:
531 MISSING_CASE(cdclk);
532 return;
533 }
534
Gabriel Krisman Bertazi886015a2017-06-28 18:06:05 -0300535 /* There are cases where we can end up here with power domains
536 * off and a CDCLK frequency other than the minimum, like when
537 * issuing a modeset without actually changing any display after
538 * a system suspend. So grab the PIPE-A domain, which covers
539 * the HW blocks needed for the following programming.
540 */
541 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
542
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100543 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200544 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
545 val &= ~DSPFREQGUAR_MASK;
546 val |= (cmd << DSPFREQGUAR_SHIFT);
547 vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
548 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) &
549 DSPFREQSTAT_MASK) == (cmd << DSPFREQSTAT_SHIFT),
550 50)) {
551 DRM_ERROR("timed out waiting for CDclk change\n");
552 }
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100553 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200554
555 mutex_lock(&dev_priv->sb_lock);
556
557 if (cdclk == 400000) {
558 u32 divider;
559
560 divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1,
561 cdclk) - 1;
562
563 /* adjust cdclk divider */
564 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
565 val &= ~CCK_FREQUENCY_VALUES;
566 val |= divider;
567 vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);
568
569 if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
570 CCK_FREQUENCY_STATUS) == (divider << CCK_FREQUENCY_STATUS_SHIFT),
571 50))
572 DRM_ERROR("timed out waiting for CDclk change\n");
573 }
574
575 /* adjust self-refresh exit latency value */
576 val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
577 val &= ~0x7f;
578
579 /*
580 * For high bandwidth configs, we set a higher latency in the bunit
581 * so that the core display fetch happens in time to avoid underruns.
582 */
583 if (cdclk == 400000)
584 val |= 4500 / 250; /* 4.5 usec */
585 else
586 val |= 3000 / 250; /* 3.0 usec */
587 vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);
588
589 mutex_unlock(&dev_priv->sb_lock);
590
591 intel_update_cdclk(dev_priv);
Ville Syrjälä1a5301a2017-01-26 21:57:19 +0200592
593 vlv_program_pfi_credits(dev_priv);
Gabriel Krisman Bertazi886015a2017-06-28 18:06:05 -0300594
595 intel_display_power_put(dev_priv, POWER_DOMAIN_PIPE_A);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200596}
597
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200598static void chv_set_cdclk(struct drm_i915_private *dev_priv,
599 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200600{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200601 int cdclk = cdclk_state->cdclk;
Ville Syrjälä999c5762017-10-24 12:52:09 +0300602 u32 val, cmd = cdclk_state->voltage_level;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200603
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200604 switch (cdclk) {
605 case 333333:
606 case 320000:
607 case 266667:
608 case 200000:
609 break;
610 default:
611 MISSING_CASE(cdclk);
612 return;
613 }
614
Gabriel Krisman Bertazi886015a2017-06-28 18:06:05 -0300615 /* There are cases where we can end up here with power domains
616 * off and a CDCLK frequency other than the minimum, like when
617 * issuing a modeset without actually changing any display after
618 * a system suspend. So grab the PIPE-A domain, which covers
619 * the HW blocks needed for the following programming.
620 */
621 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
622
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100623 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200624 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
625 val &= ~DSPFREQGUAR_MASK_CHV;
626 val |= (cmd << DSPFREQGUAR_SHIFT_CHV);
627 vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
628 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) &
629 DSPFREQSTAT_MASK_CHV) == (cmd << DSPFREQSTAT_SHIFT_CHV),
630 50)) {
631 DRM_ERROR("timed out waiting for CDclk change\n");
632 }
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100633 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200634
635 intel_update_cdclk(dev_priv);
Ville Syrjälä1a5301a2017-01-26 21:57:19 +0200636
637 vlv_program_pfi_credits(dev_priv);
Gabriel Krisman Bertazi886015a2017-06-28 18:06:05 -0300638
639 intel_display_power_put(dev_priv, POWER_DOMAIN_PIPE_A);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200640}
641
Ville Syrjäläd305e062017-08-30 21:57:03 +0300642static int bdw_calc_cdclk(int min_cdclk)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200643{
Ville Syrjäläd305e062017-08-30 21:57:03 +0300644 if (min_cdclk > 540000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200645 return 675000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300646 else if (min_cdclk > 450000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200647 return 540000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300648 else if (min_cdclk > 337500)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200649 return 450000;
650 else
651 return 337500;
652}
653
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +0300654static u8 bdw_calc_voltage_level(int cdclk)
655{
656 switch (cdclk) {
657 default:
658 case 337500:
659 return 2;
660 case 450000:
661 return 0;
662 case 540000:
663 return 1;
664 case 675000:
665 return 3;
666 }
667}
668
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200669static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
670 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200671{
672 uint32_t lcpll = I915_READ(LCPLL_CTL);
673 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
674
675 if (lcpll & LCPLL_CD_SOURCE_FCLK)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200676 cdclk_state->cdclk = 800000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200677 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200678 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200679 else if (freq == LCPLL_CLK_FREQ_450)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200680 cdclk_state->cdclk = 450000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200681 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200682 cdclk_state->cdclk = 540000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200683 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200684 cdclk_state->cdclk = 337500;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200685 else
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200686 cdclk_state->cdclk = 675000;
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +0300687
688 /*
689 * Can't read this out :( Let's assume it's
690 * at least what the CDCLK frequency requires.
691 */
692 cdclk_state->voltage_level =
693 bdw_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200694}
695
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200696static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
697 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200698{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200699 int cdclk = cdclk_state->cdclk;
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +0300700 uint32_t val;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200701 int ret;
702
703 if (WARN((I915_READ(LCPLL_CTL) &
704 (LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
705 LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
706 LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
707 LCPLL_CD_SOURCE_FCLK)) != LCPLL_PLL_LOCK,
708 "trying to change cdclk frequency with cdclk not enabled\n"))
709 return;
710
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100711 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200712 ret = sandybridge_pcode_write(dev_priv,
713 BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ, 0x0);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100714 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200715 if (ret) {
716 DRM_ERROR("failed to inform pcode about cdclk change\n");
717 return;
718 }
719
720 val = I915_READ(LCPLL_CTL);
721 val |= LCPLL_CD_SOURCE_FCLK;
722 I915_WRITE(LCPLL_CTL, val);
723
Marta Lofstedt31648882017-09-08 16:28:29 +0300724 /*
725 * According to the spec, it should be enough to poll for this 1 us.
726 * However, extensive testing shows that this can take longer.
727 */
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200728 if (wait_for_us(I915_READ(LCPLL_CTL) &
Marta Lofstedt31648882017-09-08 16:28:29 +0300729 LCPLL_CD_SOURCE_FCLK_DONE, 100))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200730 DRM_ERROR("Switching to FCLK failed\n");
731
732 val = I915_READ(LCPLL_CTL);
733 val &= ~LCPLL_CLK_FREQ_MASK;
734
735 switch (cdclk) {
Ville Syrjälä2b584172017-10-24 12:52:07 +0300736 default:
737 MISSING_CASE(cdclk);
738 /* fall through */
739 case 337500:
740 val |= LCPLL_CLK_FREQ_337_5_BDW;
Ville Syrjälä2b584172017-10-24 12:52:07 +0300741 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200742 case 450000:
743 val |= LCPLL_CLK_FREQ_450;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200744 break;
745 case 540000:
746 val |= LCPLL_CLK_FREQ_54O_BDW;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200747 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200748 case 675000:
749 val |= LCPLL_CLK_FREQ_675_BDW;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200750 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200751 }
752
753 I915_WRITE(LCPLL_CTL, val);
754
755 val = I915_READ(LCPLL_CTL);
756 val &= ~LCPLL_CD_SOURCE_FCLK;
757 I915_WRITE(LCPLL_CTL, val);
758
759 if (wait_for_us((I915_READ(LCPLL_CTL) &
760 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
761 DRM_ERROR("Switching back to LCPLL failed\n");
762
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100763 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +0300764 sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
765 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +0100766 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200767
768 I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
769
770 intel_update_cdclk(dev_priv);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200771}
772
Ville Syrjäläd305e062017-08-30 21:57:03 +0300773static int skl_calc_cdclk(int min_cdclk, int vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200774{
775 if (vco == 8640000) {
Ville Syrjäläd305e062017-08-30 21:57:03 +0300776 if (min_cdclk > 540000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200777 return 617143;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300778 else if (min_cdclk > 432000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200779 return 540000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300780 else if (min_cdclk > 308571)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200781 return 432000;
782 else
783 return 308571;
784 } else {
Ville Syrjäläd305e062017-08-30 21:57:03 +0300785 if (min_cdclk > 540000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200786 return 675000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300787 else if (min_cdclk > 450000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200788 return 540000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300789 else if (min_cdclk > 337500)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200790 return 450000;
791 else
792 return 337500;
793 }
794}
795
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300796static u8 skl_calc_voltage_level(int cdclk)
797{
798 switch (cdclk) {
799 default:
800 case 308571:
801 case 337500:
802 return 0;
803 case 450000:
804 case 432000:
805 return 1;
806 case 540000:
807 return 2;
808 case 617143:
809 case 675000:
810 return 3;
811 }
812}
813
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200814static void skl_dpll0_update(struct drm_i915_private *dev_priv,
815 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200816{
817 u32 val;
818
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200819 cdclk_state->ref = 24000;
820 cdclk_state->vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200821
822 val = I915_READ(LCPLL1_CTL);
823 if ((val & LCPLL_PLL_ENABLE) == 0)
824 return;
825
826 if (WARN_ON((val & LCPLL_PLL_LOCK) == 0))
827 return;
828
829 val = I915_READ(DPLL_CTRL1);
830
831 if (WARN_ON((val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
832 DPLL_CTRL1_SSC(SKL_DPLL0) |
833 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
834 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
835 return;
836
837 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
838 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
839 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
840 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
841 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200842 cdclk_state->vco = 8100000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200843 break;
844 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
845 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200846 cdclk_state->vco = 8640000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200847 break;
848 default:
849 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
850 break;
851 }
852}
853
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200854static void skl_get_cdclk(struct drm_i915_private *dev_priv,
855 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200856{
857 u32 cdctl;
858
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200859 skl_dpll0_update(dev_priv, cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200860
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200861 cdclk_state->cdclk = cdclk_state->ref;
862
863 if (cdclk_state->vco == 0)
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300864 goto out;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200865
866 cdctl = I915_READ(CDCLK_CTL);
867
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200868 if (cdclk_state->vco == 8640000) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200869 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
870 case CDCLK_FREQ_450_432:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200871 cdclk_state->cdclk = 432000;
872 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200873 case CDCLK_FREQ_337_308:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200874 cdclk_state->cdclk = 308571;
875 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200876 case CDCLK_FREQ_540:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200877 cdclk_state->cdclk = 540000;
878 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200879 case CDCLK_FREQ_675_617:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200880 cdclk_state->cdclk = 617143;
881 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200882 default:
883 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200884 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200885 }
886 } else {
887 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
888 case CDCLK_FREQ_450_432:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200889 cdclk_state->cdclk = 450000;
890 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200891 case CDCLK_FREQ_337_308:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200892 cdclk_state->cdclk = 337500;
893 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200894 case CDCLK_FREQ_540:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200895 cdclk_state->cdclk = 540000;
896 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200897 case CDCLK_FREQ_675_617:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200898 cdclk_state->cdclk = 675000;
899 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200900 default:
901 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200902 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200903 }
904 }
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300905
906 out:
907 /*
908 * Can't read this out :( Let's assume it's
909 * at least what the CDCLK frequency requires.
910 */
911 cdclk_state->voltage_level =
912 skl_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200913}
914
915/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
916static int skl_cdclk_decimal(int cdclk)
917{
918 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
919}
920
921static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
922 int vco)
923{
924 bool changed = dev_priv->skl_preferred_vco_freq != vco;
925
926 dev_priv->skl_preferred_vco_freq = vco;
927
928 if (changed)
929 intel_update_max_cdclk(dev_priv);
930}
931
932static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
933{
934 int min_cdclk = skl_calc_cdclk(0, vco);
935 u32 val;
936
937 WARN_ON(vco != 8100000 && vco != 8640000);
938
939 /* select the minimum CDCLK before enabling DPLL 0 */
940 val = CDCLK_FREQ_337_308 | skl_cdclk_decimal(min_cdclk);
941 I915_WRITE(CDCLK_CTL, val);
942 POSTING_READ(CDCLK_CTL);
943
944 /*
945 * We always enable DPLL0 with the lowest link rate possible, but still
946 * taking into account the VCO required to operate the eDP panel at the
947 * desired frequency. The usual DP link rates operate with a VCO of
948 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
949 * The modeset code is responsible for the selection of the exact link
950 * rate later on, with the constraint of choosing a frequency that
951 * works with vco.
952 */
953 val = I915_READ(DPLL_CTRL1);
954
955 val &= ~(DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) | DPLL_CTRL1_SSC(SKL_DPLL0) |
956 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
957 val |= DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
958 if (vco == 8640000)
959 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
960 SKL_DPLL0);
961 else
962 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
963 SKL_DPLL0);
964
965 I915_WRITE(DPLL_CTRL1, val);
966 POSTING_READ(DPLL_CTRL1);
967
968 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) | LCPLL_PLL_ENABLE);
969
970 if (intel_wait_for_register(dev_priv,
971 LCPLL1_CTL, LCPLL_PLL_LOCK, LCPLL_PLL_LOCK,
972 5))
973 DRM_ERROR("DPLL0 not locked\n");
974
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200975 dev_priv->cdclk.hw.vco = vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200976
977 /* We'll want to keep using the current vco from now on. */
978 skl_set_preferred_cdclk_vco(dev_priv, vco);
979}
980
981static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
982{
983 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
984 if (intel_wait_for_register(dev_priv,
985 LCPLL1_CTL, LCPLL_PLL_LOCK, 0,
986 1))
987 DRM_ERROR("Couldn't disable DPLL0\n");
988
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200989 dev_priv->cdclk.hw.vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200990}
991
992static void skl_set_cdclk(struct drm_i915_private *dev_priv,
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200993 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200994{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200995 int cdclk = cdclk_state->cdclk;
996 int vco = cdclk_state->vco;
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300997 u32 freq_select;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200998 int ret;
999
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001000 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001001 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1002 SKL_CDCLK_PREPARE_FOR_CHANGE,
1003 SKL_CDCLK_READY_FOR_CHANGE,
1004 SKL_CDCLK_READY_FOR_CHANGE, 3);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001005 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001006 if (ret) {
1007 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1008 ret);
1009 return;
1010 }
1011
1012 /* set CDCLK_CTL */
1013 switch (cdclk) {
Ville Syrjälä2b584172017-10-24 12:52:07 +03001014 default:
1015 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1016 WARN_ON(vco != 0);
1017 /* fall through */
1018 case 308571:
1019 case 337500:
1020 freq_select = CDCLK_FREQ_337_308;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001021 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001022 case 450000:
1023 case 432000:
1024 freq_select = CDCLK_FREQ_450_432;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001025 break;
1026 case 540000:
1027 freq_select = CDCLK_FREQ_540;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001028 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001029 case 617143:
1030 case 675000:
1031 freq_select = CDCLK_FREQ_675_617;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001032 break;
1033 }
1034
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001035 if (dev_priv->cdclk.hw.vco != 0 &&
1036 dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001037 skl_dpll0_disable(dev_priv);
1038
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001039 if (dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001040 skl_dpll0_enable(dev_priv, vco);
1041
1042 I915_WRITE(CDCLK_CTL, freq_select | skl_cdclk_decimal(cdclk));
1043 POSTING_READ(CDCLK_CTL);
1044
1045 /* inform PCU of the change */
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001046 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001047 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1048 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001049 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001050
1051 intel_update_cdclk(dev_priv);
1052}
1053
1054static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1055{
1056 uint32_t cdctl, expected;
1057
1058 /*
1059 * check if the pre-os initialized the display
1060 * There is SWF18 scratchpad register defined which is set by the
1061 * pre-os which can be used by the OS drivers to check the status
1062 */
1063 if ((I915_READ(SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1064 goto sanitize;
1065
1066 intel_update_cdclk(dev_priv);
Ville Syrjäläcfddadc2017-10-24 12:52:16 +03001067 intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
1068
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001069 /* Is PLL enabled and locked ? */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001070 if (dev_priv->cdclk.hw.vco == 0 ||
1071 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001072 goto sanitize;
1073
1074 /* DPLL okay; verify the cdclock
1075 *
1076 * Noticed in some instances that the freq selection is correct but
1077 * decimal part is programmed wrong from BIOS where pre-os does not
1078 * enable display. Verify the same as well.
1079 */
1080 cdctl = I915_READ(CDCLK_CTL);
1081 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001082 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001083 if (cdctl == expected)
1084 /* All well; nothing to sanitize */
1085 return;
1086
1087sanitize:
1088 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1089
1090 /* force cdclk programming */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001091 dev_priv->cdclk.hw.cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001092 /* force full PLL disable + enable */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001093 dev_priv->cdclk.hw.vco = -1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001094}
1095
1096/**
1097 * skl_init_cdclk - Initialize CDCLK on SKL
1098 * @dev_priv: i915 device
1099 *
1100 * Initialize CDCLK for SKL and derivatives. This is generally
1101 * done only during the display core initialization sequence,
1102 * after which the DMC will take care of turning CDCLK off/on
1103 * as needed.
1104 */
1105void skl_init_cdclk(struct drm_i915_private *dev_priv)
1106{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001107 struct intel_cdclk_state cdclk_state;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001108
1109 skl_sanitize_cdclk(dev_priv);
1110
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001111 if (dev_priv->cdclk.hw.cdclk != 0 &&
1112 dev_priv->cdclk.hw.vco != 0) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001113 /*
1114 * Use the current vco as our initial
1115 * guess as to what the preferred vco is.
1116 */
1117 if (dev_priv->skl_preferred_vco_freq == 0)
1118 skl_set_preferred_cdclk_vco(dev_priv,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001119 dev_priv->cdclk.hw.vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001120 return;
1121 }
1122
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001123 cdclk_state = dev_priv->cdclk.hw;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001124
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001125 cdclk_state.vco = dev_priv->skl_preferred_vco_freq;
1126 if (cdclk_state.vco == 0)
1127 cdclk_state.vco = 8100000;
1128 cdclk_state.cdclk = skl_calc_cdclk(0, cdclk_state.vco);
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001129 cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001130
1131 skl_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001132}
1133
1134/**
1135 * skl_uninit_cdclk - Uninitialize CDCLK on SKL
1136 * @dev_priv: i915 device
1137 *
1138 * Uninitialize CDCLK for SKL and derivatives. This is done only
1139 * during the display core uninitialization sequence.
1140 */
1141void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
1142{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001143 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1144
1145 cdclk_state.cdclk = cdclk_state.ref;
1146 cdclk_state.vco = 0;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001147 cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001148
1149 skl_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001150}
1151
Ville Syrjäläd305e062017-08-30 21:57:03 +03001152static int bxt_calc_cdclk(int min_cdclk)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001153{
Ville Syrjäläd305e062017-08-30 21:57:03 +03001154 if (min_cdclk > 576000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001155 return 624000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001156 else if (min_cdclk > 384000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001157 return 576000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001158 else if (min_cdclk > 288000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001159 return 384000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001160 else if (min_cdclk > 144000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001161 return 288000;
1162 else
1163 return 144000;
1164}
1165
Ville Syrjäläd305e062017-08-30 21:57:03 +03001166static int glk_calc_cdclk(int min_cdclk)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001167{
Ville Syrjäläd305e062017-08-30 21:57:03 +03001168 if (min_cdclk > 158400)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001169 return 316800;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001170 else if (min_cdclk > 79200)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001171 return 158400;
1172 else
1173 return 79200;
1174}
1175
Ville Syrjälä2123f442017-10-24 12:52:12 +03001176static u8 bxt_calc_voltage_level(int cdclk)
1177{
1178 return DIV_ROUND_UP(cdclk, 25000);
1179}
1180
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001181static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1182{
1183 int ratio;
1184
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001185 if (cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001186 return 0;
1187
1188 switch (cdclk) {
1189 default:
1190 MISSING_CASE(cdclk);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001191 /* fall through */
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001192 case 144000:
1193 case 288000:
1194 case 384000:
1195 case 576000:
1196 ratio = 60;
1197 break;
1198 case 624000:
1199 ratio = 65;
1200 break;
1201 }
1202
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001203 return dev_priv->cdclk.hw.ref * ratio;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001204}
1205
1206static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1207{
1208 int ratio;
1209
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001210 if (cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001211 return 0;
1212
1213 switch (cdclk) {
1214 default:
1215 MISSING_CASE(cdclk);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001216 /* fall through */
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001217 case 79200:
1218 case 158400:
1219 case 316800:
1220 ratio = 33;
1221 break;
1222 }
1223
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001224 return dev_priv->cdclk.hw.ref * ratio;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001225}
1226
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001227static void bxt_de_pll_update(struct drm_i915_private *dev_priv,
1228 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001229{
1230 u32 val;
1231
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001232 cdclk_state->ref = 19200;
1233 cdclk_state->vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001234
1235 val = I915_READ(BXT_DE_PLL_ENABLE);
1236 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1237 return;
1238
1239 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1240 return;
1241
1242 val = I915_READ(BXT_DE_PLL_CTL);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001243 cdclk_state->vco = (val & BXT_DE_PLL_RATIO_MASK) * cdclk_state->ref;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001244}
1245
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001246static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1247 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001248{
1249 u32 divider;
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001250 int div;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001251
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001252 bxt_de_pll_update(dev_priv, cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001253
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001254 cdclk_state->cdclk = cdclk_state->ref;
1255
1256 if (cdclk_state->vco == 0)
Ville Syrjälä2123f442017-10-24 12:52:12 +03001257 goto out;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001258
1259 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1260
1261 switch (divider) {
1262 case BXT_CDCLK_CD2X_DIV_SEL_1:
1263 div = 2;
1264 break;
1265 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1266 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1267 div = 3;
1268 break;
1269 case BXT_CDCLK_CD2X_DIV_SEL_2:
1270 div = 4;
1271 break;
1272 case BXT_CDCLK_CD2X_DIV_SEL_4:
1273 div = 8;
1274 break;
1275 default:
1276 MISSING_CASE(divider);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001277 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001278 }
1279
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001280 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
Ville Syrjälä2123f442017-10-24 12:52:12 +03001281
1282 out:
1283 /*
1284 * Can't read this out :( Let's assume it's
1285 * at least what the CDCLK frequency requires.
1286 */
1287 cdclk_state->voltage_level =
1288 bxt_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001289}
1290
1291static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1292{
1293 I915_WRITE(BXT_DE_PLL_ENABLE, 0);
1294
1295 /* Timeout 200us */
1296 if (intel_wait_for_register(dev_priv,
1297 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 0,
1298 1))
1299 DRM_ERROR("timeout waiting for DE PLL unlock\n");
1300
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001301 dev_priv->cdclk.hw.vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001302}
1303
1304static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1305{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001306 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001307 u32 val;
1308
1309 val = I915_READ(BXT_DE_PLL_CTL);
1310 val &= ~BXT_DE_PLL_RATIO_MASK;
1311 val |= BXT_DE_PLL_RATIO(ratio);
1312 I915_WRITE(BXT_DE_PLL_CTL, val);
1313
1314 I915_WRITE(BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1315
1316 /* Timeout 200us */
1317 if (intel_wait_for_register(dev_priv,
1318 BXT_DE_PLL_ENABLE,
1319 BXT_DE_PLL_LOCK,
1320 BXT_DE_PLL_LOCK,
1321 1))
1322 DRM_ERROR("timeout waiting for DE PLL lock\n");
1323
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001324 dev_priv->cdclk.hw.vco = vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001325}
1326
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001327static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001328 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001329{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001330 int cdclk = cdclk_state->cdclk;
1331 int vco = cdclk_state->vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001332 u32 val, divider;
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001333 int ret;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001334
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001335 /* cdclk = vco / 2 / div{1,1.5,2,4} */
1336 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
Ville Syrjälä2b584172017-10-24 12:52:07 +03001337 default:
1338 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1339 WARN_ON(vco != 0);
1340 /* fall through */
1341 case 2:
1342 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001343 break;
1344 case 3:
1345 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1346 divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
1347 break;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001348 case 4:
1349 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001350 break;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001351 case 8:
1352 divider = BXT_CDCLK_CD2X_DIV_SEL_4;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001353 break;
1354 }
1355
1356 /* Inform power controller of upcoming frequency change */
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001357 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001358 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1359 0x80000000);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001360 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001361
1362 if (ret) {
1363 DRM_ERROR("PCode CDCLK freq change notify failed (err %d, freq %d)\n",
1364 ret, cdclk);
1365 return;
1366 }
1367
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001368 if (dev_priv->cdclk.hw.vco != 0 &&
1369 dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001370 bxt_de_pll_disable(dev_priv);
1371
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001372 if (dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001373 bxt_de_pll_enable(dev_priv, vco);
1374
1375 val = divider | skl_cdclk_decimal(cdclk);
1376 /*
1377 * FIXME if only the cd2x divider needs changing, it could be done
1378 * without shutting off the pipe (if only one pipe is active).
1379 */
1380 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1381 /*
1382 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1383 * enable otherwise.
1384 */
1385 if (cdclk >= 500000)
1386 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1387 I915_WRITE(CDCLK_CTL, val);
1388
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001389 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001390 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
Ville Syrjälä2123f442017-10-24 12:52:12 +03001391 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001392 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001393
1394 if (ret) {
1395 DRM_ERROR("PCode CDCLK freq set failed, (err %d, freq %d)\n",
1396 ret, cdclk);
1397 return;
1398 }
1399
1400 intel_update_cdclk(dev_priv);
1401}
1402
1403static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
1404{
1405 u32 cdctl, expected;
1406
1407 intel_update_cdclk(dev_priv);
Ville Syrjäläcfddadc2017-10-24 12:52:16 +03001408 intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001409
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001410 if (dev_priv->cdclk.hw.vco == 0 ||
1411 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001412 goto sanitize;
1413
1414 /* DPLL okay; verify the cdclock
1415 *
1416 * Some BIOS versions leave an incorrect decimal frequency value and
1417 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1418 * so sanitize this register.
1419 */
1420 cdctl = I915_READ(CDCLK_CTL);
1421 /*
1422 * Let's ignore the pipe field, since BIOS could have configured the
1423 * dividers both synching to an active pipe, or asynchronously
1424 * (PIPE_NONE).
1425 */
1426 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1427
1428 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001429 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001430 /*
1431 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1432 * enable otherwise.
1433 */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001434 if (dev_priv->cdclk.hw.cdclk >= 500000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001435 expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1436
1437 if (cdctl == expected)
1438 /* All well; nothing to sanitize */
1439 return;
1440
1441sanitize:
1442 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1443
1444 /* force cdclk programming */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001445 dev_priv->cdclk.hw.cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001446
1447 /* force full PLL disable + enable */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001448 dev_priv->cdclk.hw.vco = -1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001449}
1450
1451/**
1452 * bxt_init_cdclk - Initialize CDCLK on BXT
1453 * @dev_priv: i915 device
1454 *
1455 * Initialize CDCLK for BXT and derivatives. This is generally
1456 * done only during the display core initialization sequence,
1457 * after which the DMC will take care of turning CDCLK off/on
1458 * as needed.
1459 */
1460void bxt_init_cdclk(struct drm_i915_private *dev_priv)
1461{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001462 struct intel_cdclk_state cdclk_state;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001463
1464 bxt_sanitize_cdclk(dev_priv);
1465
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001466 if (dev_priv->cdclk.hw.cdclk != 0 &&
1467 dev_priv->cdclk.hw.vco != 0)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001468 return;
1469
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001470 cdclk_state = dev_priv->cdclk.hw;
1471
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001472 /*
1473 * FIXME:
1474 * - The initial CDCLK needs to be read from VBT.
1475 * Need to make this change after VBT has changes for BXT.
1476 */
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001477 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001478 cdclk_state.cdclk = glk_calc_cdclk(0);
1479 cdclk_state.vco = glk_de_pll_vco(dev_priv, cdclk_state.cdclk);
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001480 } else {
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001481 cdclk_state.cdclk = bxt_calc_cdclk(0);
1482 cdclk_state.vco = bxt_de_pll_vco(dev_priv, cdclk_state.cdclk);
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001483 }
Ville Syrjälä2123f442017-10-24 12:52:12 +03001484 cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001485
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001486 bxt_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001487}
1488
1489/**
1490 * bxt_uninit_cdclk - Uninitialize CDCLK on BXT
1491 * @dev_priv: i915 device
1492 *
1493 * Uninitialize CDCLK for BXT and derivatives. This is done only
1494 * during the display core uninitialization sequence.
1495 */
1496void bxt_uninit_cdclk(struct drm_i915_private *dev_priv)
1497{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001498 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1499
1500 cdclk_state.cdclk = cdclk_state.ref;
1501 cdclk_state.vco = 0;
Ville Syrjälä2123f442017-10-24 12:52:12 +03001502 cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001503
1504 bxt_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001505}
1506
Ville Syrjäläd305e062017-08-30 21:57:03 +03001507static int cnl_calc_cdclk(int min_cdclk)
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001508{
Ville Syrjäläd305e062017-08-30 21:57:03 +03001509 if (min_cdclk > 336000)
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001510 return 528000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001511 else if (min_cdclk > 168000)
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001512 return 336000;
1513 else
1514 return 168000;
1515}
1516
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001517static u8 cnl_calc_voltage_level(int cdclk)
1518{
1519 switch (cdclk) {
1520 default:
1521 case 168000:
1522 return 0;
1523 case 336000:
1524 return 1;
1525 case 528000:
1526 return 2;
1527 }
1528}
1529
Ville Syrjälä945f2672017-06-09 15:25:58 -07001530static void cnl_cdclk_pll_update(struct drm_i915_private *dev_priv,
1531 struct intel_cdclk_state *cdclk_state)
1532{
1533 u32 val;
1534
1535 if (I915_READ(SKL_DSSM) & CNL_DSSM_CDCLK_PLL_REFCLK_24MHz)
1536 cdclk_state->ref = 24000;
1537 else
1538 cdclk_state->ref = 19200;
1539
1540 cdclk_state->vco = 0;
1541
1542 val = I915_READ(BXT_DE_PLL_ENABLE);
1543 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1544 return;
1545
1546 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1547 return;
1548
1549 cdclk_state->vco = (val & CNL_CDCLK_PLL_RATIO_MASK) * cdclk_state->ref;
1550}
1551
1552static void cnl_get_cdclk(struct drm_i915_private *dev_priv,
1553 struct intel_cdclk_state *cdclk_state)
1554{
1555 u32 divider;
1556 int div;
1557
1558 cnl_cdclk_pll_update(dev_priv, cdclk_state);
1559
1560 cdclk_state->cdclk = cdclk_state->ref;
1561
1562 if (cdclk_state->vco == 0)
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001563 goto out;
Ville Syrjälä945f2672017-06-09 15:25:58 -07001564
1565 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1566
1567 switch (divider) {
1568 case BXT_CDCLK_CD2X_DIV_SEL_1:
1569 div = 2;
1570 break;
1571 case BXT_CDCLK_CD2X_DIV_SEL_2:
1572 div = 4;
1573 break;
1574 default:
1575 MISSING_CASE(divider);
1576 return;
1577 }
1578
1579 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001580
1581 out:
1582 /*
1583 * Can't read this out :( Let's assume it's
1584 * at least what the CDCLK frequency requires.
1585 */
1586 cdclk_state->voltage_level =
1587 cnl_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä945f2672017-06-09 15:25:58 -07001588}
1589
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001590static void cnl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
1591{
1592 u32 val;
1593
1594 val = I915_READ(BXT_DE_PLL_ENABLE);
1595 val &= ~BXT_DE_PLL_PLL_ENABLE;
1596 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1597
1598 /* Timeout 200us */
1599 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) == 0, 1))
1600 DRM_ERROR("timout waiting for CDCLK PLL unlock\n");
1601
1602 dev_priv->cdclk.hw.vco = 0;
1603}
1604
1605static void cnl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
1606{
1607 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1608 u32 val;
1609
1610 val = CNL_CDCLK_PLL_RATIO(ratio);
1611 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1612
1613 val |= BXT_DE_PLL_PLL_ENABLE;
1614 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1615
1616 /* Timeout 200us */
1617 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) != 0, 1))
1618 DRM_ERROR("timout waiting for CDCLK PLL lock\n");
1619
1620 dev_priv->cdclk.hw.vco = vco;
1621}
1622
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001623static void cnl_set_cdclk(struct drm_i915_private *dev_priv,
1624 const struct intel_cdclk_state *cdclk_state)
1625{
1626 int cdclk = cdclk_state->cdclk;
1627 int vco = cdclk_state->vco;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001628 u32 val, divider;
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001629 int ret;
1630
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001631 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001632 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1633 SKL_CDCLK_PREPARE_FOR_CHANGE,
1634 SKL_CDCLK_READY_FOR_CHANGE,
1635 SKL_CDCLK_READY_FOR_CHANGE, 3);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001636 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001637 if (ret) {
1638 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1639 ret);
1640 return;
1641 }
1642
1643 /* cdclk = vco / 2 / div{1,2} */
1644 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001645 default:
1646 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1647 WARN_ON(vco != 0);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001648 /* fall through */
1649 case 2:
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001650 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1651 break;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001652 case 4:
1653 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1654 break;
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001655 }
1656
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001657 if (dev_priv->cdclk.hw.vco != 0 &&
1658 dev_priv->cdclk.hw.vco != vco)
1659 cnl_cdclk_pll_disable(dev_priv);
1660
1661 if (dev_priv->cdclk.hw.vco != vco)
1662 cnl_cdclk_pll_enable(dev_priv, vco);
1663
1664 val = divider | skl_cdclk_decimal(cdclk);
1665 /*
1666 * FIXME if only the cd2x divider needs changing, it could be done
1667 * without shutting off the pipe (if only one pipe is active).
1668 */
1669 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1670 I915_WRITE(CDCLK_CTL, val);
1671
1672 /* inform PCU of the change */
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001673 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001674 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1675 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001676 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001677
1678 intel_update_cdclk(dev_priv);
Ville Syrjälä53e9bf52017-10-24 12:52:14 +03001679
1680 /*
1681 * Can't read out the voltage level :(
1682 * Let's just assume everything is as expected.
1683 */
1684 dev_priv->cdclk.hw.voltage_level = cdclk_state->voltage_level;
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001685}
1686
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001687static int cnl_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1688{
1689 int ratio;
1690
1691 if (cdclk == dev_priv->cdclk.hw.ref)
1692 return 0;
1693
1694 switch (cdclk) {
1695 default:
1696 MISSING_CASE(cdclk);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001697 /* fall through */
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001698 case 168000:
1699 case 336000:
1700 ratio = dev_priv->cdclk.hw.ref == 19200 ? 35 : 28;
1701 break;
1702 case 528000:
1703 ratio = dev_priv->cdclk.hw.ref == 19200 ? 55 : 44;
1704 break;
1705 }
1706
1707 return dev_priv->cdclk.hw.ref * ratio;
1708}
1709
1710static void cnl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1711{
1712 u32 cdctl, expected;
1713
1714 intel_update_cdclk(dev_priv);
Ville Syrjäläcfddadc2017-10-24 12:52:16 +03001715 intel_dump_cdclk_state(&dev_priv->cdclk.hw, "Current CDCLK");
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001716
1717 if (dev_priv->cdclk.hw.vco == 0 ||
1718 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
1719 goto sanitize;
1720
1721 /* DPLL okay; verify the cdclock
1722 *
1723 * Some BIOS versions leave an incorrect decimal frequency value and
1724 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1725 * so sanitize this register.
1726 */
1727 cdctl = I915_READ(CDCLK_CTL);
1728 /*
1729 * Let's ignore the pipe field, since BIOS could have configured the
1730 * dividers both synching to an active pipe, or asynchronously
1731 * (PIPE_NONE).
1732 */
1733 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1734
1735 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
1736 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
1737
1738 if (cdctl == expected)
1739 /* All well; nothing to sanitize */
1740 return;
1741
1742sanitize:
1743 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1744
1745 /* force cdclk programming */
1746 dev_priv->cdclk.hw.cdclk = 0;
1747
1748 /* force full PLL disable + enable */
1749 dev_priv->cdclk.hw.vco = -1;
1750}
1751
1752/**
1753 * cnl_init_cdclk - Initialize CDCLK on CNL
1754 * @dev_priv: i915 device
1755 *
1756 * Initialize CDCLK for CNL. This is generally
1757 * done only during the display core initialization sequence,
1758 * after which the DMC will take care of turning CDCLK off/on
1759 * as needed.
1760 */
1761void cnl_init_cdclk(struct drm_i915_private *dev_priv)
1762{
1763 struct intel_cdclk_state cdclk_state;
1764
1765 cnl_sanitize_cdclk(dev_priv);
1766
1767 if (dev_priv->cdclk.hw.cdclk != 0 &&
1768 dev_priv->cdclk.hw.vco != 0)
1769 return;
1770
1771 cdclk_state = dev_priv->cdclk.hw;
1772
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001773 cdclk_state.cdclk = cnl_calc_cdclk(0);
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001774 cdclk_state.vco = cnl_cdclk_pll_vco(dev_priv, cdclk_state.cdclk);
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001775 cdclk_state.voltage_level = cnl_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001776
1777 cnl_set_cdclk(dev_priv, &cdclk_state);
1778}
1779
1780/**
1781 * cnl_uninit_cdclk - Uninitialize CDCLK on CNL
1782 * @dev_priv: i915 device
1783 *
1784 * Uninitialize CDCLK for CNL. This is done only
1785 * during the display core uninitialization sequence.
1786 */
1787void cnl_uninit_cdclk(struct drm_i915_private *dev_priv)
1788{
1789 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1790
1791 cdclk_state.cdclk = cdclk_state.ref;
1792 cdclk_state.vco = 0;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001793 cdclk_state.voltage_level = cnl_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001794
1795 cnl_set_cdclk(dev_priv, &cdclk_state);
1796}
1797
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001798/**
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001799 * intel_cdclk_needs_modeset - Determine if two CDCLK states require a modeset on all pipes
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001800 * @a: first CDCLK state
1801 * @b: second CDCLK state
1802 *
1803 * Returns:
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001804 * True if the CDCLK states require pipes to be off during reprogramming, false if not.
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001805 */
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001806bool intel_cdclk_needs_modeset(const struct intel_cdclk_state *a,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001807 const struct intel_cdclk_state *b)
1808{
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001809 return a->cdclk != b->cdclk ||
1810 a->vco != b->vco ||
1811 a->ref != b->ref;
1812}
1813
1814/**
1815 * intel_cdclk_changed - Determine if two CDCLK states are different
1816 * @a: first CDCLK state
1817 * @b: second CDCLK state
1818 *
1819 * Returns:
1820 * True if the CDCLK states don't match, false if they do.
1821 */
1822bool intel_cdclk_changed(const struct intel_cdclk_state *a,
1823 const struct intel_cdclk_state *b)
1824{
1825 return intel_cdclk_needs_modeset(a, b) ||
1826 a->voltage_level != b->voltage_level;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001827}
1828
Ville Syrjäläcfddadc2017-10-24 12:52:16 +03001829void intel_dump_cdclk_state(const struct intel_cdclk_state *cdclk_state,
1830 const char *context)
1831{
1832 DRM_DEBUG_DRIVER("%s %d kHz, VCO %d kHz, ref %d kHz, voltage level %d\n",
1833 context, cdclk_state->cdclk, cdclk_state->vco,
1834 cdclk_state->ref, cdclk_state->voltage_level);
1835}
1836
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001837/**
1838 * intel_set_cdclk - Push the CDCLK state to the hardware
1839 * @dev_priv: i915 device
1840 * @cdclk_state: new CDCLK state
1841 *
1842 * Program the hardware based on the passed in CDCLK state,
1843 * if necessary.
1844 */
1845void intel_set_cdclk(struct drm_i915_private *dev_priv,
1846 const struct intel_cdclk_state *cdclk_state)
1847{
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001848 if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state))
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001849 return;
1850
1851 if (WARN_ON_ONCE(!dev_priv->display.set_cdclk))
1852 return;
1853
Ville Syrjäläcfddadc2017-10-24 12:52:16 +03001854 intel_dump_cdclk_state(cdclk_state, "Changing CDCLK to");
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001855
1856 dev_priv->display.set_cdclk(dev_priv, cdclk_state);
Ville Syrjäläcfddadc2017-10-24 12:52:16 +03001857
1858 if (WARN(intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state),
1859 "cdclk state doesn't match!\n")) {
1860 intel_dump_cdclk_state(&dev_priv->cdclk.hw, "[hw state]");
1861 intel_dump_cdclk_state(cdclk_state, "[sw state]");
1862 }
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001863}
1864
Ville Syrjäläd305e062017-08-30 21:57:03 +03001865static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
1866 int pixel_rate)
1867{
1868 if (INTEL_GEN(dev_priv) >= 10)
1869 /*
1870 * FIXME: Switch to DIV_ROUND_UP(pixel_rate, 2)
1871 * once DDI clock voltage requirements are
1872 * handled correctly.
1873 */
1874 return pixel_rate;
1875 else if (IS_GEMINILAKE(dev_priv))
1876 /*
1877 * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
1878 * as a temporary workaround. Use a higher cdclk instead. (Note that
1879 * intel_compute_max_dotclk() limits the max pixel clock to 99% of max
1880 * cdclk.)
1881 */
1882 return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
1883 else if (IS_GEN9(dev_priv) ||
1884 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
1885 return pixel_rate;
1886 else if (IS_CHERRYVIEW(dev_priv))
1887 return DIV_ROUND_UP(pixel_rate * 100, 95);
1888 else
1889 return DIV_ROUND_UP(pixel_rate * 100, 90);
1890}
1891
1892int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001893{
1894 struct drm_i915_private *dev_priv =
1895 to_i915(crtc_state->base.crtc->dev);
Ville Syrjäläd305e062017-08-30 21:57:03 +03001896 int min_cdclk;
1897
1898 if (!crtc_state->base.enable)
1899 return 0;
1900
1901 min_cdclk = intel_pixel_rate_to_cdclk(dev_priv, crtc_state->pixel_rate);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001902
1903 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
1904 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
Ville Syrjäläd305e062017-08-30 21:57:03 +03001905 min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001906
Pandiyan, Dhinakaran78cfa582017-03-07 16:12:51 -08001907 /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
1908 * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
1909 * there may be audio corruption or screen corruption." This cdclk
Ville Syrjäläd305e062017-08-30 21:57:03 +03001910 * restriction for GLK is 316.8 MHz.
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001911 */
1912 if (intel_crtc_has_dp_encoder(crtc_state) &&
1913 crtc_state->has_audio &&
1914 crtc_state->port_clock >= 540000 &&
Pandiyan, Dhinakaran78cfa582017-03-07 16:12:51 -08001915 crtc_state->lane_count == 4) {
Ville Syrjäläd305e062017-08-30 21:57:03 +03001916 if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
1917 /* Display WA #1145: glk,cnl */
1918 min_cdclk = max(316800, min_cdclk);
1919 } else if (IS_GEN9(dev_priv) || IS_BROADWELL(dev_priv)) {
1920 /* Display WA #1144: skl,bxt */
1921 min_cdclk = max(432000, min_cdclk);
1922 }
Pandiyan, Dhinakaran78cfa582017-03-07 16:12:51 -08001923 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001924
Pandiyan, Dhinakaran8cbeb062017-03-14 15:45:56 -07001925 /* According to BSpec, "The CD clock frequency must be at least twice
1926 * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
Pandiyan, Dhinakaran8cbeb062017-03-14 15:45:56 -07001927 */
Ville Syrjäläd305e062017-08-30 21:57:03 +03001928 if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
1929 min_cdclk = max(2 * 96000, min_cdclk);
Pandiyan, Dhinakaran8cbeb062017-03-14 15:45:56 -07001930
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001931 if (min_cdclk > dev_priv->max_cdclk_freq) {
1932 DRM_DEBUG_KMS("required cdclk (%d kHz) exceeds max (%d kHz)\n",
1933 min_cdclk, dev_priv->max_cdclk_freq);
1934 return -EINVAL;
1935 }
1936
Ville Syrjäläd305e062017-08-30 21:57:03 +03001937 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001938}
1939
Ville Syrjäläd305e062017-08-30 21:57:03 +03001940static int intel_compute_min_cdclk(struct drm_atomic_state *state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001941{
1942 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1943 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjäläd305e062017-08-30 21:57:03 +03001944 struct intel_crtc *crtc;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001945 struct intel_crtc_state *crtc_state;
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001946 int min_cdclk, i;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001947 enum pipe pipe;
1948
Ville Syrjäläd305e062017-08-30 21:57:03 +03001949 memcpy(intel_state->min_cdclk, dev_priv->min_cdclk,
1950 sizeof(intel_state->min_cdclk));
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001951
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001952 for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
1953 min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
1954 if (min_cdclk < 0)
1955 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001956
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001957 intel_state->min_cdclk[i] = min_cdclk;
1958 }
1959
1960 min_cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001961 for_each_pipe(dev_priv, pipe)
Ville Syrjäläd305e062017-08-30 21:57:03 +03001962 min_cdclk = max(intel_state->min_cdclk[pipe], min_cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001963
Ville Syrjäläd305e062017-08-30 21:57:03 +03001964 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001965}
1966
Ville Syrjälä53e9bf52017-10-24 12:52:14 +03001967/*
1968 * Note that this functions assumes that 0 is
1969 * the lowest voltage value, and higher values
1970 * correspond to increasingly higher voltages.
1971 *
1972 * Should that relationship no longer hold on
1973 * future platforms this code will need to be
1974 * adjusted.
1975 */
1976static u8 cnl_compute_min_voltage_level(struct intel_atomic_state *state)
1977{
1978 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
1979 struct intel_crtc *crtc;
1980 struct intel_crtc_state *crtc_state;
1981 u8 min_voltage_level;
1982 int i;
1983 enum pipe pipe;
1984
1985 memcpy(state->min_voltage_level, dev_priv->min_voltage_level,
1986 sizeof(state->min_voltage_level));
1987
1988 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
1989 if (crtc_state->base.enable)
1990 state->min_voltage_level[i] =
1991 crtc_state->min_voltage_level;
1992 else
1993 state->min_voltage_level[i] = 0;
1994 }
1995
1996 min_voltage_level = 0;
1997 for_each_pipe(dev_priv, pipe)
1998 min_voltage_level = max(state->min_voltage_level[pipe],
1999 min_voltage_level);
2000
2001 return min_voltage_level;
2002}
2003
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002004static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
2005{
Ville Syrjälä3d5dbb12017-01-20 20:22:00 +02002006 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002007 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2008 int min_cdclk, cdclk;
2009
2010 min_cdclk = intel_compute_min_cdclk(state);
2011 if (min_cdclk < 0)
2012 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002013
Ville Syrjäläd305e062017-08-30 21:57:03 +03002014 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002015
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002016 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä999c5762017-10-24 12:52:09 +03002017 intel_state->cdclk.logical.voltage_level =
2018 vlv_calc_voltage_level(dev_priv, cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002019
2020 if (!intel_state->active_crtcs) {
2021 cdclk = vlv_calc_cdclk(dev_priv, 0);
2022
2023 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä999c5762017-10-24 12:52:09 +03002024 intel_state->cdclk.actual.voltage_level =
2025 vlv_calc_voltage_level(dev_priv, cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002026 } else {
2027 intel_state->cdclk.actual =
2028 intel_state->cdclk.logical;
2029 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002030
2031 return 0;
2032}
2033
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002034static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
2035{
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002036 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002037 int min_cdclk, cdclk;
2038
2039 min_cdclk = intel_compute_min_cdclk(state);
2040 if (min_cdclk < 0)
2041 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002042
2043 /*
2044 * FIXME should also account for plane ratio
2045 * once 64bpp pixel formats are supported.
2046 */
Ville Syrjäläd305e062017-08-30 21:57:03 +03002047 cdclk = bdw_calc_cdclk(min_cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002048
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002049 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +03002050 intel_state->cdclk.logical.voltage_level =
2051 bdw_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002052
2053 if (!intel_state->active_crtcs) {
2054 cdclk = bdw_calc_cdclk(0);
2055
2056 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +03002057 intel_state->cdclk.actual.voltage_level =
2058 bdw_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002059 } else {
2060 intel_state->cdclk.actual =
2061 intel_state->cdclk.logical;
2062 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002063
2064 return 0;
2065}
2066
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002067static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
2068{
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002069 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002070 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2071 int min_cdclk, cdclk, vco;
2072
2073 min_cdclk = intel_compute_min_cdclk(state);
2074 if (min_cdclk < 0)
2075 return min_cdclk;
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002076
2077 vco = intel_state->cdclk.logical.vco;
2078 if (!vco)
2079 vco = dev_priv->skl_preferred_vco_freq;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002080
2081 /*
2082 * FIXME should also account for plane ratio
2083 * once 64bpp pixel formats are supported.
2084 */
Ville Syrjäläd305e062017-08-30 21:57:03 +03002085 cdclk = skl_calc_cdclk(min_cdclk, vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002086
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002087 intel_state->cdclk.logical.vco = vco;
2088 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03002089 intel_state->cdclk.logical.voltage_level =
2090 skl_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002091
2092 if (!intel_state->active_crtcs) {
2093 cdclk = skl_calc_cdclk(0, vco);
2094
2095 intel_state->cdclk.actual.vco = vco;
2096 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03002097 intel_state->cdclk.actual.voltage_level =
2098 skl_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002099 } else {
2100 intel_state->cdclk.actual =
2101 intel_state->cdclk.logical;
2102 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002103
2104 return 0;
2105}
2106
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002107static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
2108{
2109 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002110 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2111 int min_cdclk, cdclk, vco;
2112
2113 min_cdclk = intel_compute_min_cdclk(state);
2114 if (min_cdclk < 0)
2115 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002116
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002117 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjäläd305e062017-08-30 21:57:03 +03002118 cdclk = glk_calc_cdclk(min_cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002119 vco = glk_de_pll_vco(dev_priv, cdclk);
2120 } else {
Ville Syrjäläd305e062017-08-30 21:57:03 +03002121 cdclk = bxt_calc_cdclk(min_cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002122 vco = bxt_de_pll_vco(dev_priv, cdclk);
2123 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002124
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002125 intel_state->cdclk.logical.vco = vco;
2126 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä2123f442017-10-24 12:52:12 +03002127 intel_state->cdclk.logical.voltage_level =
2128 bxt_calc_voltage_level(cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002129
2130 if (!intel_state->active_crtcs) {
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002131 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002132 cdclk = glk_calc_cdclk(0);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002133 vco = glk_de_pll_vco(dev_priv, cdclk);
2134 } else {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002135 cdclk = bxt_calc_cdclk(0);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002136 vco = bxt_de_pll_vco(dev_priv, cdclk);
2137 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002138
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002139 intel_state->cdclk.actual.vco = vco;
2140 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä2123f442017-10-24 12:52:12 +03002141 intel_state->cdclk.actual.voltage_level =
2142 bxt_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002143 } else {
2144 intel_state->cdclk.actual =
2145 intel_state->cdclk.logical;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002146 }
2147
2148 return 0;
2149}
2150
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002151static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state)
2152{
2153 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002154 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2155 int min_cdclk, cdclk, vco;
2156
2157 min_cdclk = intel_compute_min_cdclk(state);
2158 if (min_cdclk < 0)
2159 return min_cdclk;
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002160
Ville Syrjäläd305e062017-08-30 21:57:03 +03002161 cdclk = cnl_calc_cdclk(min_cdclk);
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002162 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2163
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002164 intel_state->cdclk.logical.vco = vco;
2165 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03002166 intel_state->cdclk.logical.voltage_level =
Ville Syrjälä53e9bf52017-10-24 12:52:14 +03002167 max(cnl_calc_voltage_level(cdclk),
2168 cnl_compute_min_voltage_level(intel_state));
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002169
2170 if (!intel_state->active_crtcs) {
2171 cdclk = cnl_calc_cdclk(0);
2172 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2173
2174 intel_state->cdclk.actual.vco = vco;
2175 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03002176 intel_state->cdclk.actual.voltage_level =
2177 cnl_calc_voltage_level(cdclk);
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002178 } else {
2179 intel_state->cdclk.actual =
2180 intel_state->cdclk.logical;
2181 }
2182
2183 return 0;
2184}
2185
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002186static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
2187{
2188 int max_cdclk_freq = dev_priv->max_cdclk_freq;
2189
Ville Syrjäläd305e062017-08-30 21:57:03 +03002190 if (INTEL_GEN(dev_priv) >= 10)
2191 /*
2192 * FIXME: Allow '2 * max_cdclk_freq'
2193 * once DDI clock voltage requirements are
2194 * handled correctly.
2195 */
2196 return max_cdclk_freq;
2197 else if (IS_GEMINILAKE(dev_priv))
Madhav Chauhan97f55ca2017-04-05 09:04:23 -04002198 /*
2199 * FIXME: Limiting to 99% as a temporary workaround. See
Ville Syrjäläd305e062017-08-30 21:57:03 +03002200 * intel_min_cdclk() for details.
Madhav Chauhan97f55ca2017-04-05 09:04:23 -04002201 */
2202 return 2 * max_cdclk_freq * 99 / 100;
Ville Syrjäläd305e062017-08-30 21:57:03 +03002203 else if (IS_GEN9(dev_priv) ||
2204 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002205 return max_cdclk_freq;
2206 else if (IS_CHERRYVIEW(dev_priv))
2207 return max_cdclk_freq*95/100;
2208 else if (INTEL_INFO(dev_priv)->gen < 4)
2209 return 2*max_cdclk_freq*90/100;
2210 else
2211 return max_cdclk_freq*90/100;
2212}
2213
2214/**
2215 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
2216 * @dev_priv: i915 device
2217 *
2218 * Determine the maximum CDCLK frequency the platform supports, and also
2219 * derive the maximum dot clock frequency the maximum CDCLK frequency
2220 * allows.
2221 */
2222void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
2223{
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002224 if (IS_CANNONLAKE(dev_priv)) {
2225 dev_priv->max_cdclk_freq = 528000;
2226 } else if (IS_GEN9_BC(dev_priv)) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002227 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
2228 int max_cdclk, vco;
2229
2230 vco = dev_priv->skl_preferred_vco_freq;
2231 WARN_ON(vco != 8100000 && vco != 8640000);
2232
2233 /*
2234 * Use the lower (vco 8640) cdclk values as a
2235 * first guess. skl_calc_cdclk() will correct it
2236 * if the preferred vco is 8100 instead.
2237 */
2238 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
2239 max_cdclk = 617143;
2240 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
2241 max_cdclk = 540000;
2242 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
2243 max_cdclk = 432000;
2244 else
2245 max_cdclk = 308571;
2246
2247 dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
2248 } else if (IS_GEMINILAKE(dev_priv)) {
2249 dev_priv->max_cdclk_freq = 316800;
2250 } else if (IS_BROXTON(dev_priv)) {
2251 dev_priv->max_cdclk_freq = 624000;
2252 } else if (IS_BROADWELL(dev_priv)) {
2253 /*
2254 * FIXME with extra cooling we can allow
2255 * 540 MHz for ULX and 675 Mhz for ULT.
2256 * How can we know if extra cooling is
2257 * available? PCI ID, VTB, something else?
2258 */
2259 if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
2260 dev_priv->max_cdclk_freq = 450000;
2261 else if (IS_BDW_ULX(dev_priv))
2262 dev_priv->max_cdclk_freq = 450000;
2263 else if (IS_BDW_ULT(dev_priv))
2264 dev_priv->max_cdclk_freq = 540000;
2265 else
2266 dev_priv->max_cdclk_freq = 675000;
2267 } else if (IS_CHERRYVIEW(dev_priv)) {
2268 dev_priv->max_cdclk_freq = 320000;
2269 } else if (IS_VALLEYVIEW(dev_priv)) {
2270 dev_priv->max_cdclk_freq = 400000;
2271 } else {
2272 /* otherwise assume cdclk is fixed */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002273 dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002274 }
2275
2276 dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
2277
2278 DRM_DEBUG_DRIVER("Max CD clock rate: %d kHz\n",
2279 dev_priv->max_cdclk_freq);
2280
2281 DRM_DEBUG_DRIVER("Max dotclock rate: %d kHz\n",
2282 dev_priv->max_dotclk_freq);
2283}
2284
2285/**
2286 * intel_update_cdclk - Determine the current CDCLK frequency
2287 * @dev_priv: i915 device
2288 *
2289 * Determine the current CDCLK frequency.
2290 */
2291void intel_update_cdclk(struct drm_i915_private *dev_priv)
2292{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002293 dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002294
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002295 /*
2296 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
2297 * Programmng [sic] note: bit[9:2] should be programmed to the number
2298 * of cdclk that generates 4MHz reference clock freq which is used to
2299 * generate GMBus clock. This will vary with the cdclk freq.
2300 */
2301 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2302 I915_WRITE(GMBUSFREQ_VLV,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002303 DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002304}
2305
Rodrigo Vivi9d81a992017-06-02 13:06:41 -07002306static int cnp_rawclk(struct drm_i915_private *dev_priv)
2307{
2308 u32 rawclk;
2309 int divider, fraction;
2310
2311 if (I915_READ(SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2312 /* 24 MHz */
2313 divider = 24000;
2314 fraction = 0;
2315 } else {
2316 /* 19.2 MHz */
2317 divider = 19000;
2318 fraction = 200;
2319 }
2320
2321 rawclk = CNP_RAWCLK_DIV((divider / 1000) - 1);
2322 if (fraction)
2323 rawclk |= CNP_RAWCLK_FRAC(DIV_ROUND_CLOSEST(1000,
2324 fraction) - 1);
2325
2326 I915_WRITE(PCH_RAWCLK_FREQ, rawclk);
2327 return divider + fraction;
2328}
2329
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002330static int pch_rawclk(struct drm_i915_private *dev_priv)
2331{
2332 return (I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
2333}
2334
2335static int vlv_hrawclk(struct drm_i915_private *dev_priv)
2336{
2337 /* RAWCLK_FREQ_VLV register updated from power well code */
2338 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
2339 CCK_DISPLAY_REF_CLOCK_CONTROL);
2340}
2341
2342static int g4x_hrawclk(struct drm_i915_private *dev_priv)
2343{
2344 uint32_t clkcfg;
2345
2346 /* hrawclock is 1/4 the FSB frequency */
2347 clkcfg = I915_READ(CLKCFG);
2348 switch (clkcfg & CLKCFG_FSB_MASK) {
2349 case CLKCFG_FSB_400:
2350 return 100000;
2351 case CLKCFG_FSB_533:
2352 return 133333;
2353 case CLKCFG_FSB_667:
2354 return 166667;
2355 case CLKCFG_FSB_800:
2356 return 200000;
2357 case CLKCFG_FSB_1067:
Ville Syrjälä6f381232017-05-04 21:15:30 +03002358 case CLKCFG_FSB_1067_ALT:
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002359 return 266667;
2360 case CLKCFG_FSB_1333:
Ville Syrjälä6f381232017-05-04 21:15:30 +03002361 case CLKCFG_FSB_1333_ALT:
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002362 return 333333;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002363 default:
2364 return 133333;
2365 }
2366}
2367
2368/**
2369 * intel_update_rawclk - Determine the current RAWCLK frequency
2370 * @dev_priv: i915 device
2371 *
2372 * Determine the current RAWCLK frequency. RAWCLK is a fixed
2373 * frequency clock so this needs to done only once.
2374 */
2375void intel_update_rawclk(struct drm_i915_private *dev_priv)
2376{
Rodrigo Vivi9d81a992017-06-02 13:06:41 -07002377
2378 if (HAS_PCH_CNP(dev_priv))
2379 dev_priv->rawclk_freq = cnp_rawclk(dev_priv);
2380 else if (HAS_PCH_SPLIT(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002381 dev_priv->rawclk_freq = pch_rawclk(dev_priv);
2382 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2383 dev_priv->rawclk_freq = vlv_hrawclk(dev_priv);
2384 else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
2385 dev_priv->rawclk_freq = g4x_hrawclk(dev_priv);
2386 else
2387 /* no rawclk on other platforms, or no need to know it */
2388 return;
2389
2390 DRM_DEBUG_DRIVER("rawclk rate: %d kHz\n", dev_priv->rawclk_freq);
2391}
2392
2393/**
2394 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
2395 * @dev_priv: i915 device
2396 */
2397void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
2398{
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002399 if (IS_CHERRYVIEW(dev_priv)) {
2400 dev_priv->display.set_cdclk = chv_set_cdclk;
2401 dev_priv->display.modeset_calc_cdclk =
2402 vlv_modeset_calc_cdclk;
2403 } else if (IS_VALLEYVIEW(dev_priv)) {
2404 dev_priv->display.set_cdclk = vlv_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002405 dev_priv->display.modeset_calc_cdclk =
2406 vlv_modeset_calc_cdclk;
2407 } else if (IS_BROADWELL(dev_priv)) {
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002408 dev_priv->display.set_cdclk = bdw_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002409 dev_priv->display.modeset_calc_cdclk =
2410 bdw_modeset_calc_cdclk;
2411 } else if (IS_GEN9_LP(dev_priv)) {
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002412 dev_priv->display.set_cdclk = bxt_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002413 dev_priv->display.modeset_calc_cdclk =
2414 bxt_modeset_calc_cdclk;
2415 } else if (IS_GEN9_BC(dev_priv)) {
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002416 dev_priv->display.set_cdclk = skl_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002417 dev_priv->display.modeset_calc_cdclk =
2418 skl_modeset_calc_cdclk;
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002419 } else if (IS_CANNONLAKE(dev_priv)) {
2420 dev_priv->display.set_cdclk = cnl_set_cdclk;
2421 dev_priv->display.modeset_calc_cdclk =
2422 cnl_modeset_calc_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002423 }
2424
Ville Syrjälä945f2672017-06-09 15:25:58 -07002425 if (IS_CANNONLAKE(dev_priv))
2426 dev_priv->display.get_cdclk = cnl_get_cdclk;
2427 else if (IS_GEN9_BC(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002428 dev_priv->display.get_cdclk = skl_get_cdclk;
2429 else if (IS_GEN9_LP(dev_priv))
2430 dev_priv->display.get_cdclk = bxt_get_cdclk;
2431 else if (IS_BROADWELL(dev_priv))
2432 dev_priv->display.get_cdclk = bdw_get_cdclk;
2433 else if (IS_HASWELL(dev_priv))
2434 dev_priv->display.get_cdclk = hsw_get_cdclk;
2435 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2436 dev_priv->display.get_cdclk = vlv_get_cdclk;
2437 else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
2438 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2439 else if (IS_GEN5(dev_priv))
2440 dev_priv->display.get_cdclk = fixed_450mhz_get_cdclk;
2441 else if (IS_GM45(dev_priv))
2442 dev_priv->display.get_cdclk = gm45_get_cdclk;
Paulo Zanoni6b9e4412017-02-20 17:00:41 -03002443 else if (IS_G45(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002444 dev_priv->display.get_cdclk = g33_get_cdclk;
2445 else if (IS_I965GM(dev_priv))
2446 dev_priv->display.get_cdclk = i965gm_get_cdclk;
2447 else if (IS_I965G(dev_priv))
2448 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2449 else if (IS_PINEVIEW(dev_priv))
2450 dev_priv->display.get_cdclk = pnv_get_cdclk;
2451 else if (IS_G33(dev_priv))
2452 dev_priv->display.get_cdclk = g33_get_cdclk;
2453 else if (IS_I945GM(dev_priv))
2454 dev_priv->display.get_cdclk = i945gm_get_cdclk;
2455 else if (IS_I945G(dev_priv))
2456 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2457 else if (IS_I915GM(dev_priv))
2458 dev_priv->display.get_cdclk = i915gm_get_cdclk;
2459 else if (IS_I915G(dev_priv))
2460 dev_priv->display.get_cdclk = fixed_333mhz_get_cdclk;
2461 else if (IS_I865G(dev_priv))
2462 dev_priv->display.get_cdclk = fixed_266mhz_get_cdclk;
2463 else if (IS_I85X(dev_priv))
2464 dev_priv->display.get_cdclk = i85x_get_cdclk;
2465 else if (IS_I845G(dev_priv))
2466 dev_priv->display.get_cdclk = fixed_200mhz_get_cdclk;
2467 else { /* 830 */
2468 WARN(!IS_I830(dev_priv),
2469 "Unknown platform. Assuming 133 MHz CDCLK\n");
2470 dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;
2471 }
2472}