blob: fedfe3c720b62af9bc7bc5ea276bd52b2db54ebd [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);
771
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200772 WARN(cdclk != dev_priv->cdclk.hw.cdclk,
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200773 "cdclk requested %d kHz but got %d kHz\n",
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200774 cdclk, dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200775}
776
Ville Syrjäläd305e062017-08-30 21:57:03 +0300777static int skl_calc_cdclk(int min_cdclk, int vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200778{
779 if (vco == 8640000) {
Ville Syrjäläd305e062017-08-30 21:57:03 +0300780 if (min_cdclk > 540000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200781 return 617143;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300782 else if (min_cdclk > 432000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200783 return 540000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300784 else if (min_cdclk > 308571)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200785 return 432000;
786 else
787 return 308571;
788 } else {
Ville Syrjäläd305e062017-08-30 21:57:03 +0300789 if (min_cdclk > 540000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200790 return 675000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300791 else if (min_cdclk > 450000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200792 return 540000;
Ville Syrjäläd305e062017-08-30 21:57:03 +0300793 else if (min_cdclk > 337500)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200794 return 450000;
795 else
796 return 337500;
797 }
798}
799
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300800static u8 skl_calc_voltage_level(int cdclk)
801{
802 switch (cdclk) {
803 default:
804 case 308571:
805 case 337500:
806 return 0;
807 case 450000:
808 case 432000:
809 return 1;
810 case 540000:
811 return 2;
812 case 617143:
813 case 675000:
814 return 3;
815 }
816}
817
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200818static void skl_dpll0_update(struct drm_i915_private *dev_priv,
819 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200820{
821 u32 val;
822
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200823 cdclk_state->ref = 24000;
824 cdclk_state->vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200825
826 val = I915_READ(LCPLL1_CTL);
827 if ((val & LCPLL_PLL_ENABLE) == 0)
828 return;
829
830 if (WARN_ON((val & LCPLL_PLL_LOCK) == 0))
831 return;
832
833 val = I915_READ(DPLL_CTRL1);
834
835 if (WARN_ON((val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
836 DPLL_CTRL1_SSC(SKL_DPLL0) |
837 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
838 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
839 return;
840
841 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
842 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
843 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
844 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
845 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200846 cdclk_state->vco = 8100000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200847 break;
848 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
849 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200850 cdclk_state->vco = 8640000;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200851 break;
852 default:
853 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
854 break;
855 }
856}
857
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200858static void skl_get_cdclk(struct drm_i915_private *dev_priv,
859 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200860{
861 u32 cdctl;
862
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200863 skl_dpll0_update(dev_priv, cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200864
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200865 cdclk_state->cdclk = cdclk_state->ref;
866
867 if (cdclk_state->vco == 0)
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300868 goto out;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200869
870 cdctl = I915_READ(CDCLK_CTL);
871
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200872 if (cdclk_state->vco == 8640000) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200873 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
874 case CDCLK_FREQ_450_432:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200875 cdclk_state->cdclk = 432000;
876 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200877 case CDCLK_FREQ_337_308:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200878 cdclk_state->cdclk = 308571;
879 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200880 case CDCLK_FREQ_540:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200881 cdclk_state->cdclk = 540000;
882 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200883 case CDCLK_FREQ_675_617:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200884 cdclk_state->cdclk = 617143;
885 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200886 default:
887 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200888 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200889 }
890 } else {
891 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
892 case CDCLK_FREQ_450_432:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200893 cdclk_state->cdclk = 450000;
894 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200895 case CDCLK_FREQ_337_308:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200896 cdclk_state->cdclk = 337500;
897 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200898 case CDCLK_FREQ_540:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200899 cdclk_state->cdclk = 540000;
900 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200901 case CDCLK_FREQ_675_617:
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200902 cdclk_state->cdclk = 675000;
903 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200904 default:
905 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200906 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200907 }
908 }
Ville Syrjälä2aa97492017-10-24 12:52:11 +0300909
910 out:
911 /*
912 * Can't read this out :( Let's assume it's
913 * at least what the CDCLK frequency requires.
914 */
915 cdclk_state->voltage_level =
916 skl_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200917}
918
919/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
920static int skl_cdclk_decimal(int cdclk)
921{
922 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
923}
924
925static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
926 int vco)
927{
928 bool changed = dev_priv->skl_preferred_vco_freq != vco;
929
930 dev_priv->skl_preferred_vco_freq = vco;
931
932 if (changed)
933 intel_update_max_cdclk(dev_priv);
934}
935
936static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
937{
938 int min_cdclk = skl_calc_cdclk(0, vco);
939 u32 val;
940
941 WARN_ON(vco != 8100000 && vco != 8640000);
942
943 /* select the minimum CDCLK before enabling DPLL 0 */
944 val = CDCLK_FREQ_337_308 | skl_cdclk_decimal(min_cdclk);
945 I915_WRITE(CDCLK_CTL, val);
946 POSTING_READ(CDCLK_CTL);
947
948 /*
949 * We always enable DPLL0 with the lowest link rate possible, but still
950 * taking into account the VCO required to operate the eDP panel at the
951 * desired frequency. The usual DP link rates operate with a VCO of
952 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
953 * The modeset code is responsible for the selection of the exact link
954 * rate later on, with the constraint of choosing a frequency that
955 * works with vco.
956 */
957 val = I915_READ(DPLL_CTRL1);
958
959 val &= ~(DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) | DPLL_CTRL1_SSC(SKL_DPLL0) |
960 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
961 val |= DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
962 if (vco == 8640000)
963 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
964 SKL_DPLL0);
965 else
966 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
967 SKL_DPLL0);
968
969 I915_WRITE(DPLL_CTRL1, val);
970 POSTING_READ(DPLL_CTRL1);
971
972 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) | LCPLL_PLL_ENABLE);
973
974 if (intel_wait_for_register(dev_priv,
975 LCPLL1_CTL, LCPLL_PLL_LOCK, LCPLL_PLL_LOCK,
976 5))
977 DRM_ERROR("DPLL0 not locked\n");
978
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200979 dev_priv->cdclk.hw.vco = vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200980
981 /* We'll want to keep using the current vco from now on. */
982 skl_set_preferred_cdclk_vco(dev_priv, vco);
983}
984
985static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
986{
987 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
988 if (intel_wait_for_register(dev_priv,
989 LCPLL1_CTL, LCPLL_PLL_LOCK, 0,
990 1))
991 DRM_ERROR("Couldn't disable DPLL0\n");
992
Ville Syrjälä49cd97a2017-02-07 20:33:45 +0200993 dev_priv->cdclk.hw.vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200994}
995
996static void skl_set_cdclk(struct drm_i915_private *dev_priv,
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200997 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +0200998{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +0200999 int cdclk = cdclk_state->cdclk;
1000 int vco = cdclk_state->vco;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001001 u32 freq_select;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001002 int ret;
1003
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001004 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001005 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1006 SKL_CDCLK_PREPARE_FOR_CHANGE,
1007 SKL_CDCLK_READY_FOR_CHANGE,
1008 SKL_CDCLK_READY_FOR_CHANGE, 3);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001009 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001010 if (ret) {
1011 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1012 ret);
1013 return;
1014 }
1015
1016 /* set CDCLK_CTL */
1017 switch (cdclk) {
Ville Syrjälä2b584172017-10-24 12:52:07 +03001018 default:
1019 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1020 WARN_ON(vco != 0);
1021 /* fall through */
1022 case 308571:
1023 case 337500:
1024 freq_select = CDCLK_FREQ_337_308;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001025 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001026 case 450000:
1027 case 432000:
1028 freq_select = CDCLK_FREQ_450_432;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001029 break;
1030 case 540000:
1031 freq_select = CDCLK_FREQ_540;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001032 break;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001033 case 617143:
1034 case 675000:
1035 freq_select = CDCLK_FREQ_675_617;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001036 break;
1037 }
1038
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001039 if (dev_priv->cdclk.hw.vco != 0 &&
1040 dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001041 skl_dpll0_disable(dev_priv);
1042
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001043 if (dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001044 skl_dpll0_enable(dev_priv, vco);
1045
1046 I915_WRITE(CDCLK_CTL, freq_select | skl_cdclk_decimal(cdclk));
1047 POSTING_READ(CDCLK_CTL);
1048
1049 /* inform PCU of the change */
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001050 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001051 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1052 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001053 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001054
1055 intel_update_cdclk(dev_priv);
1056}
1057
1058static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1059{
1060 uint32_t cdctl, expected;
1061
1062 /*
1063 * check if the pre-os initialized the display
1064 * There is SWF18 scratchpad register defined which is set by the
1065 * pre-os which can be used by the OS drivers to check the status
1066 */
1067 if ((I915_READ(SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1068 goto sanitize;
1069
1070 intel_update_cdclk(dev_priv);
1071 /* Is PLL enabled and locked ? */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001072 if (dev_priv->cdclk.hw.vco == 0 ||
1073 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001074 goto sanitize;
1075
1076 /* DPLL okay; verify the cdclock
1077 *
1078 * Noticed in some instances that the freq selection is correct but
1079 * decimal part is programmed wrong from BIOS where pre-os does not
1080 * enable display. Verify the same as well.
1081 */
1082 cdctl = I915_READ(CDCLK_CTL);
1083 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001084 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001085 if (cdctl == expected)
1086 /* All well; nothing to sanitize */
1087 return;
1088
1089sanitize:
1090 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1091
1092 /* force cdclk programming */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001093 dev_priv->cdclk.hw.cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001094 /* force full PLL disable + enable */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001095 dev_priv->cdclk.hw.vco = -1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001096}
1097
1098/**
1099 * skl_init_cdclk - Initialize CDCLK on SKL
1100 * @dev_priv: i915 device
1101 *
1102 * Initialize CDCLK for SKL and derivatives. This is generally
1103 * done only during the display core initialization sequence,
1104 * after which the DMC will take care of turning CDCLK off/on
1105 * as needed.
1106 */
1107void skl_init_cdclk(struct drm_i915_private *dev_priv)
1108{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001109 struct intel_cdclk_state cdclk_state;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001110
1111 skl_sanitize_cdclk(dev_priv);
1112
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001113 if (dev_priv->cdclk.hw.cdclk != 0 &&
1114 dev_priv->cdclk.hw.vco != 0) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001115 /*
1116 * Use the current vco as our initial
1117 * guess as to what the preferred vco is.
1118 */
1119 if (dev_priv->skl_preferred_vco_freq == 0)
1120 skl_set_preferred_cdclk_vco(dev_priv,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001121 dev_priv->cdclk.hw.vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001122 return;
1123 }
1124
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001125 cdclk_state = dev_priv->cdclk.hw;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001126
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001127 cdclk_state.vco = dev_priv->skl_preferred_vco_freq;
1128 if (cdclk_state.vco == 0)
1129 cdclk_state.vco = 8100000;
1130 cdclk_state.cdclk = skl_calc_cdclk(0, cdclk_state.vco);
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001131 cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001132
1133 skl_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001134}
1135
1136/**
1137 * skl_uninit_cdclk - Uninitialize CDCLK on SKL
1138 * @dev_priv: i915 device
1139 *
1140 * Uninitialize CDCLK for SKL and derivatives. This is done only
1141 * during the display core uninitialization sequence.
1142 */
1143void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
1144{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001145 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1146
1147 cdclk_state.cdclk = cdclk_state.ref;
1148 cdclk_state.vco = 0;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03001149 cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001150
1151 skl_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001152}
1153
Ville Syrjäläd305e062017-08-30 21:57:03 +03001154static int bxt_calc_cdclk(int min_cdclk)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001155{
Ville Syrjäläd305e062017-08-30 21:57:03 +03001156 if (min_cdclk > 576000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001157 return 624000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001158 else if (min_cdclk > 384000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001159 return 576000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001160 else if (min_cdclk > 288000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001161 return 384000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001162 else if (min_cdclk > 144000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001163 return 288000;
1164 else
1165 return 144000;
1166}
1167
Ville Syrjäläd305e062017-08-30 21:57:03 +03001168static int glk_calc_cdclk(int min_cdclk)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001169{
Ville Syrjäläd305e062017-08-30 21:57:03 +03001170 if (min_cdclk > 158400)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001171 return 316800;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001172 else if (min_cdclk > 79200)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001173 return 158400;
1174 else
1175 return 79200;
1176}
1177
Ville Syrjälä2123f442017-10-24 12:52:12 +03001178static u8 bxt_calc_voltage_level(int cdclk)
1179{
1180 return DIV_ROUND_UP(cdclk, 25000);
1181}
1182
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001183static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1184{
1185 int ratio;
1186
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001187 if (cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001188 return 0;
1189
1190 switch (cdclk) {
1191 default:
1192 MISSING_CASE(cdclk);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001193 /* fall through */
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001194 case 144000:
1195 case 288000:
1196 case 384000:
1197 case 576000:
1198 ratio = 60;
1199 break;
1200 case 624000:
1201 ratio = 65;
1202 break;
1203 }
1204
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001205 return dev_priv->cdclk.hw.ref * ratio;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001206}
1207
1208static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1209{
1210 int ratio;
1211
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001212 if (cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001213 return 0;
1214
1215 switch (cdclk) {
1216 default:
1217 MISSING_CASE(cdclk);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001218 /* fall through */
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001219 case 79200:
1220 case 158400:
1221 case 316800:
1222 ratio = 33;
1223 break;
1224 }
1225
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001226 return dev_priv->cdclk.hw.ref * ratio;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001227}
1228
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001229static void bxt_de_pll_update(struct drm_i915_private *dev_priv,
1230 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001231{
1232 u32 val;
1233
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001234 cdclk_state->ref = 19200;
1235 cdclk_state->vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001236
1237 val = I915_READ(BXT_DE_PLL_ENABLE);
1238 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1239 return;
1240
1241 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1242 return;
1243
1244 val = I915_READ(BXT_DE_PLL_CTL);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001245 cdclk_state->vco = (val & BXT_DE_PLL_RATIO_MASK) * cdclk_state->ref;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001246}
1247
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001248static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1249 struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001250{
1251 u32 divider;
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001252 int div;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001253
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001254 bxt_de_pll_update(dev_priv, cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001255
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001256 cdclk_state->cdclk = cdclk_state->ref;
1257
1258 if (cdclk_state->vco == 0)
Ville Syrjälä2123f442017-10-24 12:52:12 +03001259 goto out;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001260
1261 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1262
1263 switch (divider) {
1264 case BXT_CDCLK_CD2X_DIV_SEL_1:
1265 div = 2;
1266 break;
1267 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1268 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1269 div = 3;
1270 break;
1271 case BXT_CDCLK_CD2X_DIV_SEL_2:
1272 div = 4;
1273 break;
1274 case BXT_CDCLK_CD2X_DIV_SEL_4:
1275 div = 8;
1276 break;
1277 default:
1278 MISSING_CASE(divider);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001279 return;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001280 }
1281
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001282 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
Ville Syrjälä2123f442017-10-24 12:52:12 +03001283
1284 out:
1285 /*
1286 * Can't read this out :( Let's assume it's
1287 * at least what the CDCLK frequency requires.
1288 */
1289 cdclk_state->voltage_level =
1290 bxt_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001291}
1292
1293static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1294{
1295 I915_WRITE(BXT_DE_PLL_ENABLE, 0);
1296
1297 /* Timeout 200us */
1298 if (intel_wait_for_register(dev_priv,
1299 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 0,
1300 1))
1301 DRM_ERROR("timeout waiting for DE PLL unlock\n");
1302
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001303 dev_priv->cdclk.hw.vco = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001304}
1305
1306static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1307{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001308 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001309 u32 val;
1310
1311 val = I915_READ(BXT_DE_PLL_CTL);
1312 val &= ~BXT_DE_PLL_RATIO_MASK;
1313 val |= BXT_DE_PLL_RATIO(ratio);
1314 I915_WRITE(BXT_DE_PLL_CTL, val);
1315
1316 I915_WRITE(BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1317
1318 /* Timeout 200us */
1319 if (intel_wait_for_register(dev_priv,
1320 BXT_DE_PLL_ENABLE,
1321 BXT_DE_PLL_LOCK,
1322 BXT_DE_PLL_LOCK,
1323 1))
1324 DRM_ERROR("timeout waiting for DE PLL lock\n");
1325
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001326 dev_priv->cdclk.hw.vco = vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001327}
1328
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001329static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001330 const struct intel_cdclk_state *cdclk_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001331{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001332 int cdclk = cdclk_state->cdclk;
1333 int vco = cdclk_state->vco;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001334 u32 val, divider;
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001335 int ret;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001336
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001337 /* cdclk = vco / 2 / div{1,1.5,2,4} */
1338 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
Ville Syrjälä2b584172017-10-24 12:52:07 +03001339 default:
1340 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1341 WARN_ON(vco != 0);
1342 /* fall through */
1343 case 2:
1344 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001345 break;
1346 case 3:
1347 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1348 divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
1349 break;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001350 case 4:
1351 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001352 break;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001353 case 8:
1354 divider = BXT_CDCLK_CD2X_DIV_SEL_4;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001355 break;
1356 }
1357
1358 /* Inform power controller of upcoming frequency change */
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001359 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001360 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1361 0x80000000);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001362 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001363
1364 if (ret) {
1365 DRM_ERROR("PCode CDCLK freq change notify failed (err %d, freq %d)\n",
1366 ret, cdclk);
1367 return;
1368 }
1369
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001370 if (dev_priv->cdclk.hw.vco != 0 &&
1371 dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001372 bxt_de_pll_disable(dev_priv);
1373
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001374 if (dev_priv->cdclk.hw.vco != vco)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001375 bxt_de_pll_enable(dev_priv, vco);
1376
1377 val = divider | skl_cdclk_decimal(cdclk);
1378 /*
1379 * FIXME if only the cd2x divider needs changing, it could be done
1380 * without shutting off the pipe (if only one pipe is active).
1381 */
1382 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1383 /*
1384 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1385 * enable otherwise.
1386 */
1387 if (cdclk >= 500000)
1388 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1389 I915_WRITE(CDCLK_CTL, val);
1390
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001391 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001392 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
Ville Syrjälä2123f442017-10-24 12:52:12 +03001393 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001394 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001395
1396 if (ret) {
1397 DRM_ERROR("PCode CDCLK freq set failed, (err %d, freq %d)\n",
1398 ret, cdclk);
1399 return;
1400 }
1401
1402 intel_update_cdclk(dev_priv);
1403}
1404
1405static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
1406{
1407 u32 cdctl, expected;
1408
1409 intel_update_cdclk(dev_priv);
1410
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001411 if (dev_priv->cdclk.hw.vco == 0 ||
1412 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001413 goto sanitize;
1414
1415 /* DPLL okay; verify the cdclock
1416 *
1417 * Some BIOS versions leave an incorrect decimal frequency value and
1418 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1419 * so sanitize this register.
1420 */
1421 cdctl = I915_READ(CDCLK_CTL);
1422 /*
1423 * Let's ignore the pipe field, since BIOS could have configured the
1424 * dividers both synching to an active pipe, or asynchronously
1425 * (PIPE_NONE).
1426 */
1427 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1428
1429 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001430 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001431 /*
1432 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1433 * enable otherwise.
1434 */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001435 if (dev_priv->cdclk.hw.cdclk >= 500000)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001436 expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1437
1438 if (cdctl == expected)
1439 /* All well; nothing to sanitize */
1440 return;
1441
1442sanitize:
1443 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1444
1445 /* force cdclk programming */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001446 dev_priv->cdclk.hw.cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001447
1448 /* force full PLL disable + enable */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001449 dev_priv->cdclk.hw.vco = -1;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001450}
1451
1452/**
1453 * bxt_init_cdclk - Initialize CDCLK on BXT
1454 * @dev_priv: i915 device
1455 *
1456 * Initialize CDCLK for BXT and derivatives. This is generally
1457 * done only during the display core initialization sequence,
1458 * after which the DMC will take care of turning CDCLK off/on
1459 * as needed.
1460 */
1461void bxt_init_cdclk(struct drm_i915_private *dev_priv)
1462{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001463 struct intel_cdclk_state cdclk_state;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001464
1465 bxt_sanitize_cdclk(dev_priv);
1466
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001467 if (dev_priv->cdclk.hw.cdclk != 0 &&
1468 dev_priv->cdclk.hw.vco != 0)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001469 return;
1470
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001471 cdclk_state = dev_priv->cdclk.hw;
1472
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001473 /*
1474 * FIXME:
1475 * - The initial CDCLK needs to be read from VBT.
1476 * Need to make this change after VBT has changes for BXT.
1477 */
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001478 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001479 cdclk_state.cdclk = glk_calc_cdclk(0);
1480 cdclk_state.vco = glk_de_pll_vco(dev_priv, cdclk_state.cdclk);
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001481 } else {
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001482 cdclk_state.cdclk = bxt_calc_cdclk(0);
1483 cdclk_state.vco = bxt_de_pll_vco(dev_priv, cdclk_state.cdclk);
Ville Syrjälä8f0cfa42017-01-20 20:21:57 +02001484 }
Ville Syrjälä2123f442017-10-24 12:52:12 +03001485 cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001486
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001487 bxt_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001488}
1489
1490/**
1491 * bxt_uninit_cdclk - Uninitialize CDCLK on BXT
1492 * @dev_priv: i915 device
1493 *
1494 * Uninitialize CDCLK for BXT and derivatives. This is done only
1495 * during the display core uninitialization sequence.
1496 */
1497void bxt_uninit_cdclk(struct drm_i915_private *dev_priv)
1498{
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001499 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1500
1501 cdclk_state.cdclk = cdclk_state.ref;
1502 cdclk_state.vco = 0;
Ville Syrjälä2123f442017-10-24 12:52:12 +03001503 cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
Ville Syrjälä83c5fda2017-01-20 20:22:01 +02001504
1505 bxt_set_cdclk(dev_priv, &cdclk_state);
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02001506}
1507
Ville Syrjäläd305e062017-08-30 21:57:03 +03001508static int cnl_calc_cdclk(int min_cdclk)
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001509{
Ville Syrjäläd305e062017-08-30 21:57:03 +03001510 if (min_cdclk > 336000)
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001511 return 528000;
Ville Syrjäläd305e062017-08-30 21:57:03 +03001512 else if (min_cdclk > 168000)
Rodrigo Vivid1999e92017-06-09 15:26:01 -07001513 return 336000;
1514 else
1515 return 168000;
1516}
1517
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001518static u8 cnl_calc_voltage_level(int cdclk)
1519{
1520 switch (cdclk) {
1521 default:
1522 case 168000:
1523 return 0;
1524 case 336000:
1525 return 1;
1526 case 528000:
1527 return 2;
1528 }
1529}
1530
Ville Syrjälä945f2672017-06-09 15:25:58 -07001531static void cnl_cdclk_pll_update(struct drm_i915_private *dev_priv,
1532 struct intel_cdclk_state *cdclk_state)
1533{
1534 u32 val;
1535
1536 if (I915_READ(SKL_DSSM) & CNL_DSSM_CDCLK_PLL_REFCLK_24MHz)
1537 cdclk_state->ref = 24000;
1538 else
1539 cdclk_state->ref = 19200;
1540
1541 cdclk_state->vco = 0;
1542
1543 val = I915_READ(BXT_DE_PLL_ENABLE);
1544 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1545 return;
1546
1547 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1548 return;
1549
1550 cdclk_state->vco = (val & CNL_CDCLK_PLL_RATIO_MASK) * cdclk_state->ref;
1551}
1552
1553static void cnl_get_cdclk(struct drm_i915_private *dev_priv,
1554 struct intel_cdclk_state *cdclk_state)
1555{
1556 u32 divider;
1557 int div;
1558
1559 cnl_cdclk_pll_update(dev_priv, cdclk_state);
1560
1561 cdclk_state->cdclk = cdclk_state->ref;
1562
1563 if (cdclk_state->vco == 0)
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001564 goto out;
Ville Syrjälä945f2672017-06-09 15:25:58 -07001565
1566 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1567
1568 switch (divider) {
1569 case BXT_CDCLK_CD2X_DIV_SEL_1:
1570 div = 2;
1571 break;
1572 case BXT_CDCLK_CD2X_DIV_SEL_2:
1573 div = 4;
1574 break;
1575 default:
1576 MISSING_CASE(divider);
1577 return;
1578 }
1579
1580 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001581
1582 out:
1583 /*
1584 * Can't read this out :( Let's assume it's
1585 * at least what the CDCLK frequency requires.
1586 */
1587 cdclk_state->voltage_level =
1588 cnl_calc_voltage_level(cdclk_state->cdclk);
Ville Syrjälä945f2672017-06-09 15:25:58 -07001589}
1590
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001591static void cnl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
1592{
1593 u32 val;
1594
1595 val = I915_READ(BXT_DE_PLL_ENABLE);
1596 val &= ~BXT_DE_PLL_PLL_ENABLE;
1597 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1598
1599 /* Timeout 200us */
1600 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) == 0, 1))
1601 DRM_ERROR("timout waiting for CDCLK PLL unlock\n");
1602
1603 dev_priv->cdclk.hw.vco = 0;
1604}
1605
1606static void cnl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
1607{
1608 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1609 u32 val;
1610
1611 val = CNL_CDCLK_PLL_RATIO(ratio);
1612 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1613
1614 val |= BXT_DE_PLL_PLL_ENABLE;
1615 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1616
1617 /* Timeout 200us */
1618 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) != 0, 1))
1619 DRM_ERROR("timout waiting for CDCLK PLL lock\n");
1620
1621 dev_priv->cdclk.hw.vco = vco;
1622}
1623
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001624static void cnl_set_cdclk(struct drm_i915_private *dev_priv,
1625 const struct intel_cdclk_state *cdclk_state)
1626{
1627 int cdclk = cdclk_state->cdclk;
1628 int vco = cdclk_state->vco;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001629 u32 val, divider;
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001630 int ret;
1631
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001632 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001633 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1634 SKL_CDCLK_PREPARE_FOR_CHANGE,
1635 SKL_CDCLK_READY_FOR_CHANGE,
1636 SKL_CDCLK_READY_FOR_CHANGE, 3);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001637 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001638 if (ret) {
1639 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1640 ret);
1641 return;
1642 }
1643
1644 /* cdclk = vco / 2 / div{1,2} */
1645 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001646 default:
1647 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1648 WARN_ON(vco != 0);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001649 /* fall through */
1650 case 2:
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001651 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1652 break;
Ville Syrjälä2b584172017-10-24 12:52:07 +03001653 case 4:
1654 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1655 break;
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001656 }
1657
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001658 if (dev_priv->cdclk.hw.vco != 0 &&
1659 dev_priv->cdclk.hw.vco != vco)
1660 cnl_cdclk_pll_disable(dev_priv);
1661
1662 if (dev_priv->cdclk.hw.vco != vco)
1663 cnl_cdclk_pll_enable(dev_priv, vco);
1664
1665 val = divider | skl_cdclk_decimal(cdclk);
1666 /*
1667 * FIXME if only the cd2x divider needs changing, it could be done
1668 * without shutting off the pipe (if only one pipe is active).
1669 */
1670 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1671 I915_WRITE(CDCLK_CTL, val);
1672
1673 /* inform PCU of the change */
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001674 mutex_lock(&dev_priv->pcu_lock);
Ville Syrjälä48469ec2017-10-24 12:52:13 +03001675 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1676 cdclk_state->voltage_level);
Sagar Arun Kamble9f817502017-10-10 22:30:05 +01001677 mutex_unlock(&dev_priv->pcu_lock);
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001678
1679 intel_update_cdclk(dev_priv);
Ville Syrjälä53e9bf52017-10-24 12:52:14 +03001680
1681 /*
1682 * Can't read out the voltage level :(
1683 * Let's just assume everything is as expected.
1684 */
1685 dev_priv->cdclk.hw.voltage_level = cdclk_state->voltage_level;
Ville Syrjäläef4f7a62017-06-09 15:25:59 -07001686}
1687
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001688static int cnl_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1689{
1690 int ratio;
1691
1692 if (cdclk == dev_priv->cdclk.hw.ref)
1693 return 0;
1694
1695 switch (cdclk) {
1696 default:
1697 MISSING_CASE(cdclk);
Ville Syrjälä2b584172017-10-24 12:52:07 +03001698 /* fall through */
Ville Syrjäläd8d4a512017-06-09 15:26:00 -07001699 case 168000:
1700 case 336000:
1701 ratio = dev_priv->cdclk.hw.ref == 19200 ? 35 : 28;
1702 break;
1703 case 528000:
1704 ratio = dev_priv->cdclk.hw.ref == 19200 ? 55 : 44;
1705 break;
1706 }
1707
1708 return dev_priv->cdclk.hw.ref * ratio;
1709}
1710
1711static void cnl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1712{
1713 u32 cdctl, expected;
1714
1715 intel_update_cdclk(dev_priv);
1716
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äb0587e42017-01-26 21:52:01 +02001829/**
1830 * intel_set_cdclk - Push the CDCLK state to the hardware
1831 * @dev_priv: i915 device
1832 * @cdclk_state: new CDCLK state
1833 *
1834 * Program the hardware based on the passed in CDCLK state,
1835 * if necessary.
1836 */
1837void intel_set_cdclk(struct drm_i915_private *dev_priv,
1838 const struct intel_cdclk_state *cdclk_state)
1839{
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001840 if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state))
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001841 return;
1842
1843 if (WARN_ON_ONCE(!dev_priv->display.set_cdclk))
1844 return;
1845
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001846 DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz, VCO %d kHz, ref %d kHz, voltage_level %d\n",
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001847 cdclk_state->cdclk, cdclk_state->vco,
Ville Syrjälä64600bd2017-10-24 12:52:08 +03001848 cdclk_state->ref, cdclk_state->voltage_level);
Ville Syrjäläb0587e42017-01-26 21:52:01 +02001849
1850 dev_priv->display.set_cdclk(dev_priv, cdclk_state);
1851}
1852
Ville Syrjäläd305e062017-08-30 21:57:03 +03001853static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
1854 int pixel_rate)
1855{
1856 if (INTEL_GEN(dev_priv) >= 10)
1857 /*
1858 * FIXME: Switch to DIV_ROUND_UP(pixel_rate, 2)
1859 * once DDI clock voltage requirements are
1860 * handled correctly.
1861 */
1862 return pixel_rate;
1863 else if (IS_GEMINILAKE(dev_priv))
1864 /*
1865 * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
1866 * as a temporary workaround. Use a higher cdclk instead. (Note that
1867 * intel_compute_max_dotclk() limits the max pixel clock to 99% of max
1868 * cdclk.)
1869 */
1870 return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
1871 else if (IS_GEN9(dev_priv) ||
1872 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
1873 return pixel_rate;
1874 else if (IS_CHERRYVIEW(dev_priv))
1875 return DIV_ROUND_UP(pixel_rate * 100, 95);
1876 else
1877 return DIV_ROUND_UP(pixel_rate * 100, 90);
1878}
1879
1880int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001881{
1882 struct drm_i915_private *dev_priv =
1883 to_i915(crtc_state->base.crtc->dev);
Ville Syrjäläd305e062017-08-30 21:57:03 +03001884 int min_cdclk;
1885
1886 if (!crtc_state->base.enable)
1887 return 0;
1888
1889 min_cdclk = intel_pixel_rate_to_cdclk(dev_priv, crtc_state->pixel_rate);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001890
1891 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
1892 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
Ville Syrjäläd305e062017-08-30 21:57:03 +03001893 min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001894
Pandiyan, Dhinakaran78cfa582017-03-07 16:12:51 -08001895 /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
1896 * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
1897 * there may be audio corruption or screen corruption." This cdclk
Ville Syrjäläd305e062017-08-30 21:57:03 +03001898 * restriction for GLK is 316.8 MHz.
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001899 */
1900 if (intel_crtc_has_dp_encoder(crtc_state) &&
1901 crtc_state->has_audio &&
1902 crtc_state->port_clock >= 540000 &&
Pandiyan, Dhinakaran78cfa582017-03-07 16:12:51 -08001903 crtc_state->lane_count == 4) {
Ville Syrjäläd305e062017-08-30 21:57:03 +03001904 if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
1905 /* Display WA #1145: glk,cnl */
1906 min_cdclk = max(316800, min_cdclk);
1907 } else if (IS_GEN9(dev_priv) || IS_BROADWELL(dev_priv)) {
1908 /* Display WA #1144: skl,bxt */
1909 min_cdclk = max(432000, min_cdclk);
1910 }
Pandiyan, Dhinakaran78cfa582017-03-07 16:12:51 -08001911 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001912
Pandiyan, Dhinakaran8cbeb062017-03-14 15:45:56 -07001913 /* According to BSpec, "The CD clock frequency must be at least twice
1914 * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
Pandiyan, Dhinakaran8cbeb062017-03-14 15:45:56 -07001915 */
Ville Syrjäläd305e062017-08-30 21:57:03 +03001916 if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
1917 min_cdclk = max(2 * 96000, min_cdclk);
Pandiyan, Dhinakaran8cbeb062017-03-14 15:45:56 -07001918
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001919 if (min_cdclk > dev_priv->max_cdclk_freq) {
1920 DRM_DEBUG_KMS("required cdclk (%d kHz) exceeds max (%d kHz)\n",
1921 min_cdclk, dev_priv->max_cdclk_freq);
1922 return -EINVAL;
1923 }
1924
Ville Syrjäläd305e062017-08-30 21:57:03 +03001925 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001926}
1927
Ville Syrjäläd305e062017-08-30 21:57:03 +03001928static int intel_compute_min_cdclk(struct drm_atomic_state *state)
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001929{
1930 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1931 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjäläd305e062017-08-30 21:57:03 +03001932 struct intel_crtc *crtc;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001933 struct intel_crtc_state *crtc_state;
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001934 int min_cdclk, i;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001935 enum pipe pipe;
1936
Ville Syrjäläd305e062017-08-30 21:57:03 +03001937 memcpy(intel_state->min_cdclk, dev_priv->min_cdclk,
1938 sizeof(intel_state->min_cdclk));
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001939
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001940 for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
1941 min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
1942 if (min_cdclk < 0)
1943 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001944
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001945 intel_state->min_cdclk[i] = min_cdclk;
1946 }
1947
1948 min_cdclk = 0;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001949 for_each_pipe(dev_priv, pipe)
Ville Syrjäläd305e062017-08-30 21:57:03 +03001950 min_cdclk = max(intel_state->min_cdclk[pipe], min_cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001951
Ville Syrjäläd305e062017-08-30 21:57:03 +03001952 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001953}
1954
Ville Syrjälä53e9bf52017-10-24 12:52:14 +03001955/*
1956 * Note that this functions assumes that 0 is
1957 * the lowest voltage value, and higher values
1958 * correspond to increasingly higher voltages.
1959 *
1960 * Should that relationship no longer hold on
1961 * future platforms this code will need to be
1962 * adjusted.
1963 */
1964static u8 cnl_compute_min_voltage_level(struct intel_atomic_state *state)
1965{
1966 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
1967 struct intel_crtc *crtc;
1968 struct intel_crtc_state *crtc_state;
1969 u8 min_voltage_level;
1970 int i;
1971 enum pipe pipe;
1972
1973 memcpy(state->min_voltage_level, dev_priv->min_voltage_level,
1974 sizeof(state->min_voltage_level));
1975
1976 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
1977 if (crtc_state->base.enable)
1978 state->min_voltage_level[i] =
1979 crtc_state->min_voltage_level;
1980 else
1981 state->min_voltage_level[i] = 0;
1982 }
1983
1984 min_voltage_level = 0;
1985 for_each_pipe(dev_priv, pipe)
1986 min_voltage_level = max(state->min_voltage_level[pipe],
1987 min_voltage_level);
1988
1989 return min_voltage_level;
1990}
1991
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02001992static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
1993{
Ville Syrjälä3d5dbb12017-01-20 20:22:00 +02001994 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03001995 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1996 int min_cdclk, cdclk;
1997
1998 min_cdclk = intel_compute_min_cdclk(state);
1999 if (min_cdclk < 0)
2000 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002001
Ville Syrjäläd305e062017-08-30 21:57:03 +03002002 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002003
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002004 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä999c5762017-10-24 12:52:09 +03002005 intel_state->cdclk.logical.voltage_level =
2006 vlv_calc_voltage_level(dev_priv, cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002007
2008 if (!intel_state->active_crtcs) {
2009 cdclk = vlv_calc_cdclk(dev_priv, 0);
2010
2011 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä999c5762017-10-24 12:52:09 +03002012 intel_state->cdclk.actual.voltage_level =
2013 vlv_calc_voltage_level(dev_priv, cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002014 } else {
2015 intel_state->cdclk.actual =
2016 intel_state->cdclk.logical;
2017 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002018
2019 return 0;
2020}
2021
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002022static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
2023{
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002024 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002025 int min_cdclk, cdclk;
2026
2027 min_cdclk = intel_compute_min_cdclk(state);
2028 if (min_cdclk < 0)
2029 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002030
2031 /*
2032 * FIXME should also account for plane ratio
2033 * once 64bpp pixel formats are supported.
2034 */
Ville Syrjäläd305e062017-08-30 21:57:03 +03002035 cdclk = bdw_calc_cdclk(min_cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002036
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002037 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +03002038 intel_state->cdclk.logical.voltage_level =
2039 bdw_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002040
2041 if (!intel_state->active_crtcs) {
2042 cdclk = bdw_calc_cdclk(0);
2043
2044 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjäläd7ffaee2017-10-24 12:52:10 +03002045 intel_state->cdclk.actual.voltage_level =
2046 bdw_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002047 } else {
2048 intel_state->cdclk.actual =
2049 intel_state->cdclk.logical;
2050 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002051
2052 return 0;
2053}
2054
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002055static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
2056{
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002057 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002058 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2059 int min_cdclk, cdclk, vco;
2060
2061 min_cdclk = intel_compute_min_cdclk(state);
2062 if (min_cdclk < 0)
2063 return min_cdclk;
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002064
2065 vco = intel_state->cdclk.logical.vco;
2066 if (!vco)
2067 vco = dev_priv->skl_preferred_vco_freq;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002068
2069 /*
2070 * FIXME should also account for plane ratio
2071 * once 64bpp pixel formats are supported.
2072 */
Ville Syrjäläd305e062017-08-30 21:57:03 +03002073 cdclk = skl_calc_cdclk(min_cdclk, vco);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002074
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002075 intel_state->cdclk.logical.vco = vco;
2076 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03002077 intel_state->cdclk.logical.voltage_level =
2078 skl_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002079
2080 if (!intel_state->active_crtcs) {
2081 cdclk = skl_calc_cdclk(0, vco);
2082
2083 intel_state->cdclk.actual.vco = vco;
2084 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä2aa97492017-10-24 12:52:11 +03002085 intel_state->cdclk.actual.voltage_level =
2086 skl_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002087 } else {
2088 intel_state->cdclk.actual =
2089 intel_state->cdclk.logical;
2090 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002091
2092 return 0;
2093}
2094
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002095static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
2096{
2097 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002098 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2099 int min_cdclk, cdclk, vco;
2100
2101 min_cdclk = intel_compute_min_cdclk(state);
2102 if (min_cdclk < 0)
2103 return min_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002104
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002105 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjäläd305e062017-08-30 21:57:03 +03002106 cdclk = glk_calc_cdclk(min_cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002107 vco = glk_de_pll_vco(dev_priv, cdclk);
2108 } else {
Ville Syrjäläd305e062017-08-30 21:57:03 +03002109 cdclk = bxt_calc_cdclk(min_cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002110 vco = bxt_de_pll_vco(dev_priv, cdclk);
2111 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002112
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002113 intel_state->cdclk.logical.vco = vco;
2114 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä2123f442017-10-24 12:52:12 +03002115 intel_state->cdclk.logical.voltage_level =
2116 bxt_calc_voltage_level(cdclk);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002117
2118 if (!intel_state->active_crtcs) {
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002119 if (IS_GEMINILAKE(dev_priv)) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002120 cdclk = glk_calc_cdclk(0);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002121 vco = glk_de_pll_vco(dev_priv, cdclk);
2122 } else {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002123 cdclk = bxt_calc_cdclk(0);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002124 vco = bxt_de_pll_vco(dev_priv, cdclk);
2125 }
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002126
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002127 intel_state->cdclk.actual.vco = vco;
2128 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä2123f442017-10-24 12:52:12 +03002129 intel_state->cdclk.actual.voltage_level =
2130 bxt_calc_voltage_level(cdclk);
Ville Syrjäläbb0f4aa2017-01-20 20:21:59 +02002131 } else {
2132 intel_state->cdclk.actual =
2133 intel_state->cdclk.logical;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002134 }
2135
2136 return 0;
2137}
2138
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002139static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state)
2140{
2141 struct drm_i915_private *dev_priv = to_i915(state->dev);
Ville Syrjälä9c61de42017-07-10 22:33:47 +03002142 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2143 int min_cdclk, cdclk, vco;
2144
2145 min_cdclk = intel_compute_min_cdclk(state);
2146 if (min_cdclk < 0)
2147 return min_cdclk;
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002148
Ville Syrjäläd305e062017-08-30 21:57:03 +03002149 cdclk = cnl_calc_cdclk(min_cdclk);
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002150 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2151
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002152 intel_state->cdclk.logical.vco = vco;
2153 intel_state->cdclk.logical.cdclk = cdclk;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03002154 intel_state->cdclk.logical.voltage_level =
Ville Syrjälä53e9bf52017-10-24 12:52:14 +03002155 max(cnl_calc_voltage_level(cdclk),
2156 cnl_compute_min_voltage_level(intel_state));
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002157
2158 if (!intel_state->active_crtcs) {
2159 cdclk = cnl_calc_cdclk(0);
2160 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2161
2162 intel_state->cdclk.actual.vco = vco;
2163 intel_state->cdclk.actual.cdclk = cdclk;
Ville Syrjälä48469ec2017-10-24 12:52:13 +03002164 intel_state->cdclk.actual.voltage_level =
2165 cnl_calc_voltage_level(cdclk);
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002166 } else {
2167 intel_state->cdclk.actual =
2168 intel_state->cdclk.logical;
2169 }
2170
2171 return 0;
2172}
2173
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002174static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
2175{
2176 int max_cdclk_freq = dev_priv->max_cdclk_freq;
2177
Ville Syrjäläd305e062017-08-30 21:57:03 +03002178 if (INTEL_GEN(dev_priv) >= 10)
2179 /*
2180 * FIXME: Allow '2 * max_cdclk_freq'
2181 * once DDI clock voltage requirements are
2182 * handled correctly.
2183 */
2184 return max_cdclk_freq;
2185 else if (IS_GEMINILAKE(dev_priv))
Madhav Chauhan97f55ca2017-04-05 09:04:23 -04002186 /*
2187 * FIXME: Limiting to 99% as a temporary workaround. See
Ville Syrjäläd305e062017-08-30 21:57:03 +03002188 * intel_min_cdclk() for details.
Madhav Chauhan97f55ca2017-04-05 09:04:23 -04002189 */
2190 return 2 * max_cdclk_freq * 99 / 100;
Ville Syrjäläd305e062017-08-30 21:57:03 +03002191 else if (IS_GEN9(dev_priv) ||
2192 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002193 return max_cdclk_freq;
2194 else if (IS_CHERRYVIEW(dev_priv))
2195 return max_cdclk_freq*95/100;
2196 else if (INTEL_INFO(dev_priv)->gen < 4)
2197 return 2*max_cdclk_freq*90/100;
2198 else
2199 return max_cdclk_freq*90/100;
2200}
2201
2202/**
2203 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
2204 * @dev_priv: i915 device
2205 *
2206 * Determine the maximum CDCLK frequency the platform supports, and also
2207 * derive the maximum dot clock frequency the maximum CDCLK frequency
2208 * allows.
2209 */
2210void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
2211{
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002212 if (IS_CANNONLAKE(dev_priv)) {
2213 dev_priv->max_cdclk_freq = 528000;
2214 } else if (IS_GEN9_BC(dev_priv)) {
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002215 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
2216 int max_cdclk, vco;
2217
2218 vco = dev_priv->skl_preferred_vco_freq;
2219 WARN_ON(vco != 8100000 && vco != 8640000);
2220
2221 /*
2222 * Use the lower (vco 8640) cdclk values as a
2223 * first guess. skl_calc_cdclk() will correct it
2224 * if the preferred vco is 8100 instead.
2225 */
2226 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
2227 max_cdclk = 617143;
2228 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
2229 max_cdclk = 540000;
2230 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
2231 max_cdclk = 432000;
2232 else
2233 max_cdclk = 308571;
2234
2235 dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
2236 } else if (IS_GEMINILAKE(dev_priv)) {
2237 dev_priv->max_cdclk_freq = 316800;
2238 } else if (IS_BROXTON(dev_priv)) {
2239 dev_priv->max_cdclk_freq = 624000;
2240 } else if (IS_BROADWELL(dev_priv)) {
2241 /*
2242 * FIXME with extra cooling we can allow
2243 * 540 MHz for ULX and 675 Mhz for ULT.
2244 * How can we know if extra cooling is
2245 * available? PCI ID, VTB, something else?
2246 */
2247 if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
2248 dev_priv->max_cdclk_freq = 450000;
2249 else if (IS_BDW_ULX(dev_priv))
2250 dev_priv->max_cdclk_freq = 450000;
2251 else if (IS_BDW_ULT(dev_priv))
2252 dev_priv->max_cdclk_freq = 540000;
2253 else
2254 dev_priv->max_cdclk_freq = 675000;
2255 } else if (IS_CHERRYVIEW(dev_priv)) {
2256 dev_priv->max_cdclk_freq = 320000;
2257 } else if (IS_VALLEYVIEW(dev_priv)) {
2258 dev_priv->max_cdclk_freq = 400000;
2259 } else {
2260 /* otherwise assume cdclk is fixed */
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002261 dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002262 }
2263
2264 dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
2265
2266 DRM_DEBUG_DRIVER("Max CD clock rate: %d kHz\n",
2267 dev_priv->max_cdclk_freq);
2268
2269 DRM_DEBUG_DRIVER("Max dotclock rate: %d kHz\n",
2270 dev_priv->max_dotclk_freq);
2271}
2272
2273/**
2274 * intel_update_cdclk - Determine the current CDCLK frequency
2275 * @dev_priv: i915 device
2276 *
2277 * Determine the current CDCLK frequency.
2278 */
2279void intel_update_cdclk(struct drm_i915_private *dev_priv)
2280{
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002281 dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002282
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002283 DRM_DEBUG_DRIVER("Current CD clock rate: %d kHz, VCO: %d kHz, ref: %d kHz\n",
2284 dev_priv->cdclk.hw.cdclk, dev_priv->cdclk.hw.vco,
2285 dev_priv->cdclk.hw.ref);
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002286
2287 /*
2288 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
2289 * Programmng [sic] note: bit[9:2] should be programmed to the number
2290 * of cdclk that generates 4MHz reference clock freq which is used to
2291 * generate GMBus clock. This will vary with the cdclk freq.
2292 */
2293 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2294 I915_WRITE(GMBUSFREQ_VLV,
Ville Syrjälä49cd97a2017-02-07 20:33:45 +02002295 DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002296}
2297
Rodrigo Vivi9d81a992017-06-02 13:06:41 -07002298static int cnp_rawclk(struct drm_i915_private *dev_priv)
2299{
2300 u32 rawclk;
2301 int divider, fraction;
2302
2303 if (I915_READ(SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2304 /* 24 MHz */
2305 divider = 24000;
2306 fraction = 0;
2307 } else {
2308 /* 19.2 MHz */
2309 divider = 19000;
2310 fraction = 200;
2311 }
2312
2313 rawclk = CNP_RAWCLK_DIV((divider / 1000) - 1);
2314 if (fraction)
2315 rawclk |= CNP_RAWCLK_FRAC(DIV_ROUND_CLOSEST(1000,
2316 fraction) - 1);
2317
2318 I915_WRITE(PCH_RAWCLK_FREQ, rawclk);
2319 return divider + fraction;
2320}
2321
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002322static int pch_rawclk(struct drm_i915_private *dev_priv)
2323{
2324 return (I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
2325}
2326
2327static int vlv_hrawclk(struct drm_i915_private *dev_priv)
2328{
2329 /* RAWCLK_FREQ_VLV register updated from power well code */
2330 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
2331 CCK_DISPLAY_REF_CLOCK_CONTROL);
2332}
2333
2334static int g4x_hrawclk(struct drm_i915_private *dev_priv)
2335{
2336 uint32_t clkcfg;
2337
2338 /* hrawclock is 1/4 the FSB frequency */
2339 clkcfg = I915_READ(CLKCFG);
2340 switch (clkcfg & CLKCFG_FSB_MASK) {
2341 case CLKCFG_FSB_400:
2342 return 100000;
2343 case CLKCFG_FSB_533:
2344 return 133333;
2345 case CLKCFG_FSB_667:
2346 return 166667;
2347 case CLKCFG_FSB_800:
2348 return 200000;
2349 case CLKCFG_FSB_1067:
Ville Syrjälä6f381232017-05-04 21:15:30 +03002350 case CLKCFG_FSB_1067_ALT:
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002351 return 266667;
2352 case CLKCFG_FSB_1333:
Ville Syrjälä6f381232017-05-04 21:15:30 +03002353 case CLKCFG_FSB_1333_ALT:
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002354 return 333333;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002355 default:
2356 return 133333;
2357 }
2358}
2359
2360/**
2361 * intel_update_rawclk - Determine the current RAWCLK frequency
2362 * @dev_priv: i915 device
2363 *
2364 * Determine the current RAWCLK frequency. RAWCLK is a fixed
2365 * frequency clock so this needs to done only once.
2366 */
2367void intel_update_rawclk(struct drm_i915_private *dev_priv)
2368{
Rodrigo Vivi9d81a992017-06-02 13:06:41 -07002369
2370 if (HAS_PCH_CNP(dev_priv))
2371 dev_priv->rawclk_freq = cnp_rawclk(dev_priv);
2372 else if (HAS_PCH_SPLIT(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002373 dev_priv->rawclk_freq = pch_rawclk(dev_priv);
2374 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2375 dev_priv->rawclk_freq = vlv_hrawclk(dev_priv);
2376 else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
2377 dev_priv->rawclk_freq = g4x_hrawclk(dev_priv);
2378 else
2379 /* no rawclk on other platforms, or no need to know it */
2380 return;
2381
2382 DRM_DEBUG_DRIVER("rawclk rate: %d kHz\n", dev_priv->rawclk_freq);
2383}
2384
2385/**
2386 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
2387 * @dev_priv: i915 device
2388 */
2389void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
2390{
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002391 if (IS_CHERRYVIEW(dev_priv)) {
2392 dev_priv->display.set_cdclk = chv_set_cdclk;
2393 dev_priv->display.modeset_calc_cdclk =
2394 vlv_modeset_calc_cdclk;
2395 } else if (IS_VALLEYVIEW(dev_priv)) {
2396 dev_priv->display.set_cdclk = vlv_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002397 dev_priv->display.modeset_calc_cdclk =
2398 vlv_modeset_calc_cdclk;
2399 } else if (IS_BROADWELL(dev_priv)) {
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002400 dev_priv->display.set_cdclk = bdw_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002401 dev_priv->display.modeset_calc_cdclk =
2402 bdw_modeset_calc_cdclk;
2403 } else if (IS_GEN9_LP(dev_priv)) {
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002404 dev_priv->display.set_cdclk = bxt_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002405 dev_priv->display.modeset_calc_cdclk =
2406 bxt_modeset_calc_cdclk;
2407 } else if (IS_GEN9_BC(dev_priv)) {
Ville Syrjäläb0587e42017-01-26 21:52:01 +02002408 dev_priv->display.set_cdclk = skl_set_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002409 dev_priv->display.modeset_calc_cdclk =
2410 skl_modeset_calc_cdclk;
Rodrigo Vivid1999e92017-06-09 15:26:01 -07002411 } else if (IS_CANNONLAKE(dev_priv)) {
2412 dev_priv->display.set_cdclk = cnl_set_cdclk;
2413 dev_priv->display.modeset_calc_cdclk =
2414 cnl_modeset_calc_cdclk;
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002415 }
2416
Ville Syrjälä945f2672017-06-09 15:25:58 -07002417 if (IS_CANNONLAKE(dev_priv))
2418 dev_priv->display.get_cdclk = cnl_get_cdclk;
2419 else if (IS_GEN9_BC(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002420 dev_priv->display.get_cdclk = skl_get_cdclk;
2421 else if (IS_GEN9_LP(dev_priv))
2422 dev_priv->display.get_cdclk = bxt_get_cdclk;
2423 else if (IS_BROADWELL(dev_priv))
2424 dev_priv->display.get_cdclk = bdw_get_cdclk;
2425 else if (IS_HASWELL(dev_priv))
2426 dev_priv->display.get_cdclk = hsw_get_cdclk;
2427 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2428 dev_priv->display.get_cdclk = vlv_get_cdclk;
2429 else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
2430 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2431 else if (IS_GEN5(dev_priv))
2432 dev_priv->display.get_cdclk = fixed_450mhz_get_cdclk;
2433 else if (IS_GM45(dev_priv))
2434 dev_priv->display.get_cdclk = gm45_get_cdclk;
Paulo Zanoni6b9e4412017-02-20 17:00:41 -03002435 else if (IS_G45(dev_priv))
Ville Syrjälä7ff89ca2017-02-07 20:33:05 +02002436 dev_priv->display.get_cdclk = g33_get_cdclk;
2437 else if (IS_I965GM(dev_priv))
2438 dev_priv->display.get_cdclk = i965gm_get_cdclk;
2439 else if (IS_I965G(dev_priv))
2440 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2441 else if (IS_PINEVIEW(dev_priv))
2442 dev_priv->display.get_cdclk = pnv_get_cdclk;
2443 else if (IS_G33(dev_priv))
2444 dev_priv->display.get_cdclk = g33_get_cdclk;
2445 else if (IS_I945GM(dev_priv))
2446 dev_priv->display.get_cdclk = i945gm_get_cdclk;
2447 else if (IS_I945G(dev_priv))
2448 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2449 else if (IS_I915GM(dev_priv))
2450 dev_priv->display.get_cdclk = i915gm_get_cdclk;
2451 else if (IS_I915G(dev_priv))
2452 dev_priv->display.get_cdclk = fixed_333mhz_get_cdclk;
2453 else if (IS_I865G(dev_priv))
2454 dev_priv->display.get_cdclk = fixed_266mhz_get_cdclk;
2455 else if (IS_I85X(dev_priv))
2456 dev_priv->display.get_cdclk = i85x_get_cdclk;
2457 else if (IS_I845G(dev_priv))
2458 dev_priv->display.get_cdclk = fixed_200mhz_get_cdclk;
2459 else { /* 830 */
2460 WARN(!IS_I830(dev_priv),
2461 "Unknown platform. Assuming 133 MHz CDCLK\n");
2462 dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;
2463 }
2464}