at v5.13 7846 lines 240 kB view raw
1/* 2 * Copyright © 2012 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 DEALINGS 21 * IN THE SOFTWARE. 22 * 23 * Authors: 24 * Eugeni Dodonov <eugeni.dodonov@intel.com> 25 * 26 */ 27 28#include <linux/module.h> 29#include <linux/pm_runtime.h> 30 31#include <drm/drm_atomic_helper.h> 32#include <drm/drm_fourcc.h> 33#include <drm/drm_plane_helper.h> 34 35#include "display/intel_atomic.h" 36#include "display/intel_atomic_plane.h" 37#include "display/intel_bw.h" 38#include "display/intel_display_types.h" 39#include "display/intel_fbc.h" 40#include "display/intel_sprite.h" 41#include "display/skl_universal_plane.h" 42 43#include "gt/intel_llc.h" 44 45#include "i915_drv.h" 46#include "i915_fixed.h" 47#include "i915_irq.h" 48#include "i915_trace.h" 49#include "intel_pm.h" 50#include "intel_sideband.h" 51#include "../../../platform/x86/intel_ips.h" 52 53/* Stores plane specific WM parameters */ 54struct skl_wm_params { 55 bool x_tiled, y_tiled; 56 bool rc_surface; 57 bool is_planar; 58 u32 width; 59 u8 cpp; 60 u32 plane_pixel_rate; 61 u32 y_min_scanlines; 62 u32 plane_bytes_per_line; 63 uint_fixed_16_16_t plane_blocks_per_line; 64 uint_fixed_16_16_t y_tile_minimum; 65 u32 linetime_us; 66 u32 dbuf_block_size; 67}; 68 69/* used in computing the new watermarks state */ 70struct intel_wm_config { 71 unsigned int num_pipes_active; 72 bool sprites_enabled; 73 bool sprites_scaled; 74}; 75 76static void gen9_init_clock_gating(struct drm_i915_private *dev_priv) 77{ 78 if (HAS_LLC(dev_priv)) { 79 /* 80 * WaCompressedResourceDisplayNewHashMode:skl,kbl 81 * Display WA #0390: skl,kbl 82 * 83 * Must match Sampler, Pixel Back End, and Media. See 84 * WaCompressedResourceSamplerPbeMediaNewHashMode. 85 */ 86 intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1, 87 intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | 88 SKL_DE_COMPRESSED_HASH_MODE); 89 } 90 91 /* See Bspec note for PSR2_CTL bit 31, Wa#828:skl,bxt,kbl,cfl */ 92 intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1, 93 intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP); 94 95 /* WaEnableChickenDCPR:skl,bxt,kbl,glk,cfl */ 96 intel_uncore_write(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, 97 intel_uncore_read(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM); 98 99 /* 100 * WaFbcWakeMemOn:skl,bxt,kbl,glk,cfl 101 * Display WA #0859: skl,bxt,kbl,glk,cfl 102 */ 103 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 104 DISP_FBC_MEMORY_WAKE); 105} 106 107static void bxt_init_clock_gating(struct drm_i915_private *dev_priv) 108{ 109 gen9_init_clock_gating(dev_priv); 110 111 /* WaDisableSDEUnitClockGating:bxt */ 112 intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | 113 GEN8_SDEUNIT_CLOCK_GATE_DISABLE); 114 115 /* 116 * FIXME: 117 * GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ applies on 3x6 GT SKUs only. 118 */ 119 intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | 120 GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ); 121 122 /* 123 * Wa: Backlight PWM may stop in the asserted state, causing backlight 124 * to stay fully on. 125 */ 126 intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_0, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_0) | 127 PWM1_GATING_DIS | PWM2_GATING_DIS); 128 129 /* 130 * Lower the display internal timeout. 131 * This is needed to avoid any hard hangs when DSI port PLL 132 * is off and a MMIO access is attempted by any privilege 133 * application, using batch buffers or any other means. 134 */ 135 intel_uncore_write(&dev_priv->uncore, RM_TIMEOUT, MMIO_TIMEOUT_US(950)); 136 137 /* 138 * WaFbcTurnOffFbcWatermark:bxt 139 * Display WA #0562: bxt 140 */ 141 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 142 DISP_FBC_WM_DIS); 143 144 /* 145 * WaFbcHighMemBwCorruptionAvoidance:bxt 146 * Display WA #0883: bxt 147 */ 148 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | 149 ILK_DPFC_DISABLE_DUMMY0); 150} 151 152static void glk_init_clock_gating(struct drm_i915_private *dev_priv) 153{ 154 gen9_init_clock_gating(dev_priv); 155 156 /* 157 * WaDisablePWMClockGating:glk 158 * Backlight PWM may stop in the asserted state, causing backlight 159 * to stay fully on. 160 */ 161 intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_0, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_0) | 162 PWM1_GATING_DIS | PWM2_GATING_DIS); 163} 164 165static void pnv_get_mem_freq(struct drm_i915_private *dev_priv) 166{ 167 u32 tmp; 168 169 tmp = intel_uncore_read(&dev_priv->uncore, CLKCFG); 170 171 switch (tmp & CLKCFG_FSB_MASK) { 172 case CLKCFG_FSB_533: 173 dev_priv->fsb_freq = 533; /* 133*4 */ 174 break; 175 case CLKCFG_FSB_800: 176 dev_priv->fsb_freq = 800; /* 200*4 */ 177 break; 178 case CLKCFG_FSB_667: 179 dev_priv->fsb_freq = 667; /* 167*4 */ 180 break; 181 case CLKCFG_FSB_400: 182 dev_priv->fsb_freq = 400; /* 100*4 */ 183 break; 184 } 185 186 switch (tmp & CLKCFG_MEM_MASK) { 187 case CLKCFG_MEM_533: 188 dev_priv->mem_freq = 533; 189 break; 190 case CLKCFG_MEM_667: 191 dev_priv->mem_freq = 667; 192 break; 193 case CLKCFG_MEM_800: 194 dev_priv->mem_freq = 800; 195 break; 196 } 197 198 /* detect pineview DDR3 setting */ 199 tmp = intel_uncore_read(&dev_priv->uncore, CSHRDDR3CTL); 200 dev_priv->is_ddr3 = (tmp & CSHRDDR3CTL_DDR3) ? 1 : 0; 201} 202 203static void ilk_get_mem_freq(struct drm_i915_private *dev_priv) 204{ 205 u16 ddrpll, csipll; 206 207 ddrpll = intel_uncore_read16(&dev_priv->uncore, DDRMPLL1); 208 csipll = intel_uncore_read16(&dev_priv->uncore, CSIPLL0); 209 210 switch (ddrpll & 0xff) { 211 case 0xc: 212 dev_priv->mem_freq = 800; 213 break; 214 case 0x10: 215 dev_priv->mem_freq = 1066; 216 break; 217 case 0x14: 218 dev_priv->mem_freq = 1333; 219 break; 220 case 0x18: 221 dev_priv->mem_freq = 1600; 222 break; 223 default: 224 drm_dbg(&dev_priv->drm, "unknown memory frequency 0x%02x\n", 225 ddrpll & 0xff); 226 dev_priv->mem_freq = 0; 227 break; 228 } 229 230 switch (csipll & 0x3ff) { 231 case 0x00c: 232 dev_priv->fsb_freq = 3200; 233 break; 234 case 0x00e: 235 dev_priv->fsb_freq = 3733; 236 break; 237 case 0x010: 238 dev_priv->fsb_freq = 4266; 239 break; 240 case 0x012: 241 dev_priv->fsb_freq = 4800; 242 break; 243 case 0x014: 244 dev_priv->fsb_freq = 5333; 245 break; 246 case 0x016: 247 dev_priv->fsb_freq = 5866; 248 break; 249 case 0x018: 250 dev_priv->fsb_freq = 6400; 251 break; 252 default: 253 drm_dbg(&dev_priv->drm, "unknown fsb frequency 0x%04x\n", 254 csipll & 0x3ff); 255 dev_priv->fsb_freq = 0; 256 break; 257 } 258} 259 260static const struct cxsr_latency cxsr_latency_table[] = { 261 {1, 0, 800, 400, 3382, 33382, 3983, 33983}, /* DDR2-400 SC */ 262 {1, 0, 800, 667, 3354, 33354, 3807, 33807}, /* DDR2-667 SC */ 263 {1, 0, 800, 800, 3347, 33347, 3763, 33763}, /* DDR2-800 SC */ 264 {1, 1, 800, 667, 6420, 36420, 6873, 36873}, /* DDR3-667 SC */ 265 {1, 1, 800, 800, 5902, 35902, 6318, 36318}, /* DDR3-800 SC */ 266 267 {1, 0, 667, 400, 3400, 33400, 4021, 34021}, /* DDR2-400 SC */ 268 {1, 0, 667, 667, 3372, 33372, 3845, 33845}, /* DDR2-667 SC */ 269 {1, 0, 667, 800, 3386, 33386, 3822, 33822}, /* DDR2-800 SC */ 270 {1, 1, 667, 667, 6438, 36438, 6911, 36911}, /* DDR3-667 SC */ 271 {1, 1, 667, 800, 5941, 35941, 6377, 36377}, /* DDR3-800 SC */ 272 273 {1, 0, 400, 400, 3472, 33472, 4173, 34173}, /* DDR2-400 SC */ 274 {1, 0, 400, 667, 3443, 33443, 3996, 33996}, /* DDR2-667 SC */ 275 {1, 0, 400, 800, 3430, 33430, 3946, 33946}, /* DDR2-800 SC */ 276 {1, 1, 400, 667, 6509, 36509, 7062, 37062}, /* DDR3-667 SC */ 277 {1, 1, 400, 800, 5985, 35985, 6501, 36501}, /* DDR3-800 SC */ 278 279 {0, 0, 800, 400, 3438, 33438, 4065, 34065}, /* DDR2-400 SC */ 280 {0, 0, 800, 667, 3410, 33410, 3889, 33889}, /* DDR2-667 SC */ 281 {0, 0, 800, 800, 3403, 33403, 3845, 33845}, /* DDR2-800 SC */ 282 {0, 1, 800, 667, 6476, 36476, 6955, 36955}, /* DDR3-667 SC */ 283 {0, 1, 800, 800, 5958, 35958, 6400, 36400}, /* DDR3-800 SC */ 284 285 {0, 0, 667, 400, 3456, 33456, 4103, 34106}, /* DDR2-400 SC */ 286 {0, 0, 667, 667, 3428, 33428, 3927, 33927}, /* DDR2-667 SC */ 287 {0, 0, 667, 800, 3443, 33443, 3905, 33905}, /* DDR2-800 SC */ 288 {0, 1, 667, 667, 6494, 36494, 6993, 36993}, /* DDR3-667 SC */ 289 {0, 1, 667, 800, 5998, 35998, 6460, 36460}, /* DDR3-800 SC */ 290 291 {0, 0, 400, 400, 3528, 33528, 4255, 34255}, /* DDR2-400 SC */ 292 {0, 0, 400, 667, 3500, 33500, 4079, 34079}, /* DDR2-667 SC */ 293 {0, 0, 400, 800, 3487, 33487, 4029, 34029}, /* DDR2-800 SC */ 294 {0, 1, 400, 667, 6566, 36566, 7145, 37145}, /* DDR3-667 SC */ 295 {0, 1, 400, 800, 6042, 36042, 6584, 36584}, /* DDR3-800 SC */ 296}; 297 298static const struct cxsr_latency *intel_get_cxsr_latency(bool is_desktop, 299 bool is_ddr3, 300 int fsb, 301 int mem) 302{ 303 const struct cxsr_latency *latency; 304 int i; 305 306 if (fsb == 0 || mem == 0) 307 return NULL; 308 309 for (i = 0; i < ARRAY_SIZE(cxsr_latency_table); i++) { 310 latency = &cxsr_latency_table[i]; 311 if (is_desktop == latency->is_desktop && 312 is_ddr3 == latency->is_ddr3 && 313 fsb == latency->fsb_freq && mem == latency->mem_freq) 314 return latency; 315 } 316 317 DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n"); 318 319 return NULL; 320} 321 322static void chv_set_memory_dvfs(struct drm_i915_private *dev_priv, bool enable) 323{ 324 u32 val; 325 326 vlv_punit_get(dev_priv); 327 328 val = vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2); 329 if (enable) 330 val &= ~FORCE_DDR_HIGH_FREQ; 331 else 332 val |= FORCE_DDR_HIGH_FREQ; 333 val &= ~FORCE_DDR_LOW_FREQ; 334 val |= FORCE_DDR_FREQ_REQ_ACK; 335 vlv_punit_write(dev_priv, PUNIT_REG_DDR_SETUP2, val); 336 337 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2) & 338 FORCE_DDR_FREQ_REQ_ACK) == 0, 3)) 339 drm_err(&dev_priv->drm, 340 "timed out waiting for Punit DDR DVFS request\n"); 341 342 vlv_punit_put(dev_priv); 343} 344 345static void chv_set_memory_pm5(struct drm_i915_private *dev_priv, bool enable) 346{ 347 u32 val; 348 349 vlv_punit_get(dev_priv); 350 351 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM); 352 if (enable) 353 val |= DSP_MAXFIFO_PM5_ENABLE; 354 else 355 val &= ~DSP_MAXFIFO_PM5_ENABLE; 356 vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val); 357 358 vlv_punit_put(dev_priv); 359} 360 361#define FW_WM(value, plane) \ 362 (((value) << DSPFW_ ## plane ## _SHIFT) & DSPFW_ ## plane ## _MASK) 363 364static bool _intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable) 365{ 366 bool was_enabled; 367 u32 val; 368 369 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { 370 was_enabled = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF_VLV) & FW_CSPWRDWNEN; 371 intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF_VLV, enable ? FW_CSPWRDWNEN : 0); 372 intel_uncore_posting_read(&dev_priv->uncore, FW_BLC_SELF_VLV); 373 } else if (IS_G4X(dev_priv) || IS_I965GM(dev_priv)) { 374 was_enabled = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF) & FW_BLC_SELF_EN; 375 intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, enable ? FW_BLC_SELF_EN : 0); 376 intel_uncore_posting_read(&dev_priv->uncore, FW_BLC_SELF); 377 } else if (IS_PINEVIEW(dev_priv)) { 378 val = intel_uncore_read(&dev_priv->uncore, DSPFW3); 379 was_enabled = val & PINEVIEW_SELF_REFRESH_EN; 380 if (enable) 381 val |= PINEVIEW_SELF_REFRESH_EN; 382 else 383 val &= ~PINEVIEW_SELF_REFRESH_EN; 384 intel_uncore_write(&dev_priv->uncore, DSPFW3, val); 385 intel_uncore_posting_read(&dev_priv->uncore, DSPFW3); 386 } else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv)) { 387 was_enabled = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF) & FW_BLC_SELF_EN; 388 val = enable ? _MASKED_BIT_ENABLE(FW_BLC_SELF_EN) : 389 _MASKED_BIT_DISABLE(FW_BLC_SELF_EN); 390 intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, val); 391 intel_uncore_posting_read(&dev_priv->uncore, FW_BLC_SELF); 392 } else if (IS_I915GM(dev_priv)) { 393 /* 394 * FIXME can't find a bit like this for 915G, and 395 * and yet it does have the related watermark in 396 * FW_BLC_SELF. What's going on? 397 */ 398 was_enabled = intel_uncore_read(&dev_priv->uncore, INSTPM) & INSTPM_SELF_EN; 399 val = enable ? _MASKED_BIT_ENABLE(INSTPM_SELF_EN) : 400 _MASKED_BIT_DISABLE(INSTPM_SELF_EN); 401 intel_uncore_write(&dev_priv->uncore, INSTPM, val); 402 intel_uncore_posting_read(&dev_priv->uncore, INSTPM); 403 } else { 404 return false; 405 } 406 407 trace_intel_memory_cxsr(dev_priv, was_enabled, enable); 408 409 drm_dbg_kms(&dev_priv->drm, "memory self-refresh is %s (was %s)\n", 410 enableddisabled(enable), 411 enableddisabled(was_enabled)); 412 413 return was_enabled; 414} 415 416/** 417 * intel_set_memory_cxsr - Configure CxSR state 418 * @dev_priv: i915 device 419 * @enable: Allow vs. disallow CxSR 420 * 421 * Allow or disallow the system to enter a special CxSR 422 * (C-state self refresh) state. What typically happens in CxSR mode 423 * is that several display FIFOs may get combined into a single larger 424 * FIFO for a particular plane (so called max FIFO mode) to allow the 425 * system to defer memory fetches longer, and the memory will enter 426 * self refresh. 427 * 428 * Note that enabling CxSR does not guarantee that the system enter 429 * this special mode, nor does it guarantee that the system stays 430 * in that mode once entered. So this just allows/disallows the system 431 * to autonomously utilize the CxSR mode. Other factors such as core 432 * C-states will affect when/if the system actually enters/exits the 433 * CxSR mode. 434 * 435 * Note that on VLV/CHV this actually only controls the max FIFO mode, 436 * and the system is free to enter/exit memory self refresh at any time 437 * even when the use of CxSR has been disallowed. 438 * 439 * While the system is actually in the CxSR/max FIFO mode, some plane 440 * control registers will not get latched on vblank. Thus in order to 441 * guarantee the system will respond to changes in the plane registers 442 * we must always disallow CxSR prior to making changes to those registers. 443 * Unfortunately the system will re-evaluate the CxSR conditions at 444 * frame start which happens after vblank start (which is when the plane 445 * registers would get latched), so we can't proceed with the plane update 446 * during the same frame where we disallowed CxSR. 447 * 448 * Certain platforms also have a deeper HPLL SR mode. Fortunately the 449 * HPLL SR mode depends on CxSR itself, so we don't have to hand hold 450 * the hardware w.r.t. HPLL SR when writing to plane registers. 451 * Disallowing just CxSR is sufficient. 452 */ 453bool intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable) 454{ 455 bool ret; 456 457 mutex_lock(&dev_priv->wm.wm_mutex); 458 ret = _intel_set_memory_cxsr(dev_priv, enable); 459 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 460 dev_priv->wm.vlv.cxsr = enable; 461 else if (IS_G4X(dev_priv)) 462 dev_priv->wm.g4x.cxsr = enable; 463 mutex_unlock(&dev_priv->wm.wm_mutex); 464 465 return ret; 466} 467 468/* 469 * Latency for FIFO fetches is dependent on several factors: 470 * - memory configuration (speed, channels) 471 * - chipset 472 * - current MCH state 473 * It can be fairly high in some situations, so here we assume a fairly 474 * pessimal value. It's a tradeoff between extra memory fetches (if we 475 * set this value too high, the FIFO will fetch frequently to stay full) 476 * and power consumption (set it too low to save power and we might see 477 * FIFO underruns and display "flicker"). 478 * 479 * A value of 5us seems to be a good balance; safe for very low end 480 * platforms but not overly aggressive on lower latency configs. 481 */ 482static const int pessimal_latency_ns = 5000; 483 484#define VLV_FIFO_START(dsparb, dsparb2, lo_shift, hi_shift) \ 485 ((((dsparb) >> (lo_shift)) & 0xff) | ((((dsparb2) >> (hi_shift)) & 0x1) << 8)) 486 487static void vlv_get_fifo_size(struct intel_crtc_state *crtc_state) 488{ 489 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 490 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 491 struct vlv_fifo_state *fifo_state = &crtc_state->wm.vlv.fifo_state; 492 enum pipe pipe = crtc->pipe; 493 int sprite0_start, sprite1_start; 494 u32 dsparb, dsparb2, dsparb3; 495 496 switch (pipe) { 497 case PIPE_A: 498 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB); 499 dsparb2 = intel_uncore_read(&dev_priv->uncore, DSPARB2); 500 sprite0_start = VLV_FIFO_START(dsparb, dsparb2, 0, 0); 501 sprite1_start = VLV_FIFO_START(dsparb, dsparb2, 8, 4); 502 break; 503 case PIPE_B: 504 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB); 505 dsparb2 = intel_uncore_read(&dev_priv->uncore, DSPARB2); 506 sprite0_start = VLV_FIFO_START(dsparb, dsparb2, 16, 8); 507 sprite1_start = VLV_FIFO_START(dsparb, dsparb2, 24, 12); 508 break; 509 case PIPE_C: 510 dsparb2 = intel_uncore_read(&dev_priv->uncore, DSPARB2); 511 dsparb3 = intel_uncore_read(&dev_priv->uncore, DSPARB3); 512 sprite0_start = VLV_FIFO_START(dsparb3, dsparb2, 0, 16); 513 sprite1_start = VLV_FIFO_START(dsparb3, dsparb2, 8, 20); 514 break; 515 default: 516 MISSING_CASE(pipe); 517 return; 518 } 519 520 fifo_state->plane[PLANE_PRIMARY] = sprite0_start; 521 fifo_state->plane[PLANE_SPRITE0] = sprite1_start - sprite0_start; 522 fifo_state->plane[PLANE_SPRITE1] = 511 - sprite1_start; 523 fifo_state->plane[PLANE_CURSOR] = 63; 524} 525 526static int i9xx_get_fifo_size(struct drm_i915_private *dev_priv, 527 enum i9xx_plane_id i9xx_plane) 528{ 529 u32 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB); 530 int size; 531 532 size = dsparb & 0x7f; 533 if (i9xx_plane == PLANE_B) 534 size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - size; 535 536 drm_dbg_kms(&dev_priv->drm, "FIFO size - (0x%08x) %c: %d\n", 537 dsparb, plane_name(i9xx_plane), size); 538 539 return size; 540} 541 542static int i830_get_fifo_size(struct drm_i915_private *dev_priv, 543 enum i9xx_plane_id i9xx_plane) 544{ 545 u32 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB); 546 int size; 547 548 size = dsparb & 0x1ff; 549 if (i9xx_plane == PLANE_B) 550 size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) - size; 551 size >>= 1; /* Convert to cachelines */ 552 553 drm_dbg_kms(&dev_priv->drm, "FIFO size - (0x%08x) %c: %d\n", 554 dsparb, plane_name(i9xx_plane), size); 555 556 return size; 557} 558 559static int i845_get_fifo_size(struct drm_i915_private *dev_priv, 560 enum i9xx_plane_id i9xx_plane) 561{ 562 u32 dsparb = intel_uncore_read(&dev_priv->uncore, DSPARB); 563 int size; 564 565 size = dsparb & 0x7f; 566 size >>= 2; /* Convert to cachelines */ 567 568 drm_dbg_kms(&dev_priv->drm, "FIFO size - (0x%08x) %c: %d\n", 569 dsparb, plane_name(i9xx_plane), size); 570 571 return size; 572} 573 574/* Pineview has different values for various configs */ 575static const struct intel_watermark_params pnv_display_wm = { 576 .fifo_size = PINEVIEW_DISPLAY_FIFO, 577 .max_wm = PINEVIEW_MAX_WM, 578 .default_wm = PINEVIEW_DFT_WM, 579 .guard_size = PINEVIEW_GUARD_WM, 580 .cacheline_size = PINEVIEW_FIFO_LINE_SIZE, 581}; 582 583static const struct intel_watermark_params pnv_display_hplloff_wm = { 584 .fifo_size = PINEVIEW_DISPLAY_FIFO, 585 .max_wm = PINEVIEW_MAX_WM, 586 .default_wm = PINEVIEW_DFT_HPLLOFF_WM, 587 .guard_size = PINEVIEW_GUARD_WM, 588 .cacheline_size = PINEVIEW_FIFO_LINE_SIZE, 589}; 590 591static const struct intel_watermark_params pnv_cursor_wm = { 592 .fifo_size = PINEVIEW_CURSOR_FIFO, 593 .max_wm = PINEVIEW_CURSOR_MAX_WM, 594 .default_wm = PINEVIEW_CURSOR_DFT_WM, 595 .guard_size = PINEVIEW_CURSOR_GUARD_WM, 596 .cacheline_size = PINEVIEW_FIFO_LINE_SIZE, 597}; 598 599static const struct intel_watermark_params pnv_cursor_hplloff_wm = { 600 .fifo_size = PINEVIEW_CURSOR_FIFO, 601 .max_wm = PINEVIEW_CURSOR_MAX_WM, 602 .default_wm = PINEVIEW_CURSOR_DFT_WM, 603 .guard_size = PINEVIEW_CURSOR_GUARD_WM, 604 .cacheline_size = PINEVIEW_FIFO_LINE_SIZE, 605}; 606 607static const struct intel_watermark_params i965_cursor_wm_info = { 608 .fifo_size = I965_CURSOR_FIFO, 609 .max_wm = I965_CURSOR_MAX_WM, 610 .default_wm = I965_CURSOR_DFT_WM, 611 .guard_size = 2, 612 .cacheline_size = I915_FIFO_LINE_SIZE, 613}; 614 615static const struct intel_watermark_params i945_wm_info = { 616 .fifo_size = I945_FIFO_SIZE, 617 .max_wm = I915_MAX_WM, 618 .default_wm = 1, 619 .guard_size = 2, 620 .cacheline_size = I915_FIFO_LINE_SIZE, 621}; 622 623static const struct intel_watermark_params i915_wm_info = { 624 .fifo_size = I915_FIFO_SIZE, 625 .max_wm = I915_MAX_WM, 626 .default_wm = 1, 627 .guard_size = 2, 628 .cacheline_size = I915_FIFO_LINE_SIZE, 629}; 630 631static const struct intel_watermark_params i830_a_wm_info = { 632 .fifo_size = I855GM_FIFO_SIZE, 633 .max_wm = I915_MAX_WM, 634 .default_wm = 1, 635 .guard_size = 2, 636 .cacheline_size = I830_FIFO_LINE_SIZE, 637}; 638 639static const struct intel_watermark_params i830_bc_wm_info = { 640 .fifo_size = I855GM_FIFO_SIZE, 641 .max_wm = I915_MAX_WM/2, 642 .default_wm = 1, 643 .guard_size = 2, 644 .cacheline_size = I830_FIFO_LINE_SIZE, 645}; 646 647static const struct intel_watermark_params i845_wm_info = { 648 .fifo_size = I830_FIFO_SIZE, 649 .max_wm = I915_MAX_WM, 650 .default_wm = 1, 651 .guard_size = 2, 652 .cacheline_size = I830_FIFO_LINE_SIZE, 653}; 654 655/** 656 * intel_wm_method1 - Method 1 / "small buffer" watermark formula 657 * @pixel_rate: Pipe pixel rate in kHz 658 * @cpp: Plane bytes per pixel 659 * @latency: Memory wakeup latency in 0.1us units 660 * 661 * Compute the watermark using the method 1 or "small buffer" 662 * formula. The caller may additonally add extra cachelines 663 * to account for TLB misses and clock crossings. 664 * 665 * This method is concerned with the short term drain rate 666 * of the FIFO, ie. it does not account for blanking periods 667 * which would effectively reduce the average drain rate across 668 * a longer period. The name "small" refers to the fact the 669 * FIFO is relatively small compared to the amount of data 670 * fetched. 671 * 672 * The FIFO level vs. time graph might look something like: 673 * 674 * |\ |\ 675 * | \ | \ 676 * __---__---__ (- plane active, _ blanking) 677 * -> time 678 * 679 * or perhaps like this: 680 * 681 * |\|\ |\|\ 682 * __----__----__ (- plane active, _ blanking) 683 * -> time 684 * 685 * Returns: 686 * The watermark in bytes 687 */ 688static unsigned int intel_wm_method1(unsigned int pixel_rate, 689 unsigned int cpp, 690 unsigned int latency) 691{ 692 u64 ret; 693 694 ret = mul_u32_u32(pixel_rate, cpp * latency); 695 ret = DIV_ROUND_UP_ULL(ret, 10000); 696 697 return ret; 698} 699 700/** 701 * intel_wm_method2 - Method 2 / "large buffer" watermark formula 702 * @pixel_rate: Pipe pixel rate in kHz 703 * @htotal: Pipe horizontal total 704 * @width: Plane width in pixels 705 * @cpp: Plane bytes per pixel 706 * @latency: Memory wakeup latency in 0.1us units 707 * 708 * Compute the watermark using the method 2 or "large buffer" 709 * formula. The caller may additonally add extra cachelines 710 * to account for TLB misses and clock crossings. 711 * 712 * This method is concerned with the long term drain rate 713 * of the FIFO, ie. it does account for blanking periods 714 * which effectively reduce the average drain rate across 715 * a longer period. The name "large" refers to the fact the 716 * FIFO is relatively large compared to the amount of data 717 * fetched. 718 * 719 * The FIFO level vs. time graph might look something like: 720 * 721 * |\___ |\___ 722 * | \___ | \___ 723 * | \ | \ 724 * __ --__--__--__--__--__--__ (- plane active, _ blanking) 725 * -> time 726 * 727 * Returns: 728 * The watermark in bytes 729 */ 730static unsigned int intel_wm_method2(unsigned int pixel_rate, 731 unsigned int htotal, 732 unsigned int width, 733 unsigned int cpp, 734 unsigned int latency) 735{ 736 unsigned int ret; 737 738 /* 739 * FIXME remove once all users are computing 740 * watermarks in the correct place. 741 */ 742 if (WARN_ON_ONCE(htotal == 0)) 743 htotal = 1; 744 745 ret = (latency * pixel_rate) / (htotal * 10000); 746 ret = (ret + 1) * width * cpp; 747 748 return ret; 749} 750 751/** 752 * intel_calculate_wm - calculate watermark level 753 * @pixel_rate: pixel clock 754 * @wm: chip FIFO params 755 * @fifo_size: size of the FIFO buffer 756 * @cpp: bytes per pixel 757 * @latency_ns: memory latency for the platform 758 * 759 * Calculate the watermark level (the level at which the display plane will 760 * start fetching from memory again). Each chip has a different display 761 * FIFO size and allocation, so the caller needs to figure that out and pass 762 * in the correct intel_watermark_params structure. 763 * 764 * As the pixel clock runs, the FIFO will be drained at a rate that depends 765 * on the pixel size. When it reaches the watermark level, it'll start 766 * fetching FIFO line sized based chunks from memory until the FIFO fills 767 * past the watermark point. If the FIFO drains completely, a FIFO underrun 768 * will occur, and a display engine hang could result. 769 */ 770static unsigned int intel_calculate_wm(int pixel_rate, 771 const struct intel_watermark_params *wm, 772 int fifo_size, int cpp, 773 unsigned int latency_ns) 774{ 775 int entries, wm_size; 776 777 /* 778 * Note: we need to make sure we don't overflow for various clock & 779 * latency values. 780 * clocks go from a few thousand to several hundred thousand. 781 * latency is usually a few thousand 782 */ 783 entries = intel_wm_method1(pixel_rate, cpp, 784 latency_ns / 100); 785 entries = DIV_ROUND_UP(entries, wm->cacheline_size) + 786 wm->guard_size; 787 DRM_DEBUG_KMS("FIFO entries required for mode: %d\n", entries); 788 789 wm_size = fifo_size - entries; 790 DRM_DEBUG_KMS("FIFO watermark level: %d\n", wm_size); 791 792 /* Don't promote wm_size to unsigned... */ 793 if (wm_size > wm->max_wm) 794 wm_size = wm->max_wm; 795 if (wm_size <= 0) 796 wm_size = wm->default_wm; 797 798 /* 799 * Bspec seems to indicate that the value shouldn't be lower than 800 * 'burst size + 1'. Certainly 830 is quite unhappy with low values. 801 * Lets go for 8 which is the burst size since certain platforms 802 * already use a hardcoded 8 (which is what the spec says should be 803 * done). 804 */ 805 if (wm_size <= 8) 806 wm_size = 8; 807 808 return wm_size; 809} 810 811static bool is_disabling(int old, int new, int threshold) 812{ 813 return old >= threshold && new < threshold; 814} 815 816static bool is_enabling(int old, int new, int threshold) 817{ 818 return old < threshold && new >= threshold; 819} 820 821static int intel_wm_num_levels(struct drm_i915_private *dev_priv) 822{ 823 return dev_priv->wm.max_level + 1; 824} 825 826static bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state, 827 const struct intel_plane_state *plane_state) 828{ 829 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 830 831 /* FIXME check the 'enable' instead */ 832 if (!crtc_state->hw.active) 833 return false; 834 835 /* 836 * Treat cursor with fb as always visible since cursor updates 837 * can happen faster than the vrefresh rate, and the current 838 * watermark code doesn't handle that correctly. Cursor updates 839 * which set/clear the fb or change the cursor size are going 840 * to get throttled by intel_legacy_cursor_update() to work 841 * around this problem with the watermark code. 842 */ 843 if (plane->id == PLANE_CURSOR) 844 return plane_state->hw.fb != NULL; 845 else 846 return plane_state->uapi.visible; 847} 848 849static bool intel_crtc_active(struct intel_crtc *crtc) 850{ 851 /* Be paranoid as we can arrive here with only partial 852 * state retrieved from the hardware during setup. 853 * 854 * We can ditch the adjusted_mode.crtc_clock check as soon 855 * as Haswell has gained clock readout/fastboot support. 856 * 857 * We can ditch the crtc->primary->state->fb check as soon as we can 858 * properly reconstruct framebuffers. 859 * 860 * FIXME: The intel_crtc->active here should be switched to 861 * crtc->state->active once we have proper CRTC states wired up 862 * for atomic. 863 */ 864 return crtc->active && crtc->base.primary->state->fb && 865 crtc->config->hw.adjusted_mode.crtc_clock; 866} 867 868static struct intel_crtc *single_enabled_crtc(struct drm_i915_private *dev_priv) 869{ 870 struct intel_crtc *crtc, *enabled = NULL; 871 872 for_each_intel_crtc(&dev_priv->drm, crtc) { 873 if (intel_crtc_active(crtc)) { 874 if (enabled) 875 return NULL; 876 enabled = crtc; 877 } 878 } 879 880 return enabled; 881} 882 883static void pnv_update_wm(struct intel_crtc *unused_crtc) 884{ 885 struct drm_i915_private *dev_priv = to_i915(unused_crtc->base.dev); 886 struct intel_crtc *crtc; 887 const struct cxsr_latency *latency; 888 u32 reg; 889 unsigned int wm; 890 891 latency = intel_get_cxsr_latency(!IS_MOBILE(dev_priv), 892 dev_priv->is_ddr3, 893 dev_priv->fsb_freq, 894 dev_priv->mem_freq); 895 if (!latency) { 896 drm_dbg_kms(&dev_priv->drm, 897 "Unknown FSB/MEM found, disable CxSR\n"); 898 intel_set_memory_cxsr(dev_priv, false); 899 return; 900 } 901 902 crtc = single_enabled_crtc(dev_priv); 903 if (crtc) { 904 const struct drm_display_mode *pipe_mode = 905 &crtc->config->hw.pipe_mode; 906 const struct drm_framebuffer *fb = 907 crtc->base.primary->state->fb; 908 int cpp = fb->format->cpp[0]; 909 int clock = pipe_mode->crtc_clock; 910 911 /* Display SR */ 912 wm = intel_calculate_wm(clock, &pnv_display_wm, 913 pnv_display_wm.fifo_size, 914 cpp, latency->display_sr); 915 reg = intel_uncore_read(&dev_priv->uncore, DSPFW1); 916 reg &= ~DSPFW_SR_MASK; 917 reg |= FW_WM(wm, SR); 918 intel_uncore_write(&dev_priv->uncore, DSPFW1, reg); 919 drm_dbg_kms(&dev_priv->drm, "DSPFW1 register is %x\n", reg); 920 921 /* cursor SR */ 922 wm = intel_calculate_wm(clock, &pnv_cursor_wm, 923 pnv_display_wm.fifo_size, 924 4, latency->cursor_sr); 925 reg = intel_uncore_read(&dev_priv->uncore, DSPFW3); 926 reg &= ~DSPFW_CURSOR_SR_MASK; 927 reg |= FW_WM(wm, CURSOR_SR); 928 intel_uncore_write(&dev_priv->uncore, DSPFW3, reg); 929 930 /* Display HPLL off SR */ 931 wm = intel_calculate_wm(clock, &pnv_display_hplloff_wm, 932 pnv_display_hplloff_wm.fifo_size, 933 cpp, latency->display_hpll_disable); 934 reg = intel_uncore_read(&dev_priv->uncore, DSPFW3); 935 reg &= ~DSPFW_HPLL_SR_MASK; 936 reg |= FW_WM(wm, HPLL_SR); 937 intel_uncore_write(&dev_priv->uncore, DSPFW3, reg); 938 939 /* cursor HPLL off SR */ 940 wm = intel_calculate_wm(clock, &pnv_cursor_hplloff_wm, 941 pnv_display_hplloff_wm.fifo_size, 942 4, latency->cursor_hpll_disable); 943 reg = intel_uncore_read(&dev_priv->uncore, DSPFW3); 944 reg &= ~DSPFW_HPLL_CURSOR_MASK; 945 reg |= FW_WM(wm, HPLL_CURSOR); 946 intel_uncore_write(&dev_priv->uncore, DSPFW3, reg); 947 drm_dbg_kms(&dev_priv->drm, "DSPFW3 register is %x\n", reg); 948 949 intel_set_memory_cxsr(dev_priv, true); 950 } else { 951 intel_set_memory_cxsr(dev_priv, false); 952 } 953} 954 955/* 956 * Documentation says: 957 * "If the line size is small, the TLB fetches can get in the way of the 958 * data fetches, causing some lag in the pixel data return which is not 959 * accounted for in the above formulas. The following adjustment only 960 * needs to be applied if eight whole lines fit in the buffer at once. 961 * The WM is adjusted upwards by the difference between the FIFO size 962 * and the size of 8 whole lines. This adjustment is always performed 963 * in the actual pixel depth regardless of whether FBC is enabled or not." 964 */ 965static unsigned int g4x_tlb_miss_wa(int fifo_size, int width, int cpp) 966{ 967 int tlb_miss = fifo_size * 64 - width * cpp * 8; 968 969 return max(0, tlb_miss); 970} 971 972static void g4x_write_wm_values(struct drm_i915_private *dev_priv, 973 const struct g4x_wm_values *wm) 974{ 975 enum pipe pipe; 976 977 for_each_pipe(dev_priv, pipe) 978 trace_g4x_wm(intel_get_crtc_for_pipe(dev_priv, pipe), wm); 979 980 intel_uncore_write(&dev_priv->uncore, DSPFW1, 981 FW_WM(wm->sr.plane, SR) | 982 FW_WM(wm->pipe[PIPE_B].plane[PLANE_CURSOR], CURSORB) | 983 FW_WM(wm->pipe[PIPE_B].plane[PLANE_PRIMARY], PLANEB) | 984 FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY], PLANEA)); 985 intel_uncore_write(&dev_priv->uncore, DSPFW2, 986 (wm->fbc_en ? DSPFW_FBC_SR_EN : 0) | 987 FW_WM(wm->sr.fbc, FBC_SR) | 988 FW_WM(wm->hpll.fbc, FBC_HPLL_SR) | 989 FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEB) | 990 FW_WM(wm->pipe[PIPE_A].plane[PLANE_CURSOR], CURSORA) | 991 FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0], SPRITEA)); 992 intel_uncore_write(&dev_priv->uncore, DSPFW3, 993 (wm->hpll_en ? DSPFW_HPLL_SR_EN : 0) | 994 FW_WM(wm->sr.cursor, CURSOR_SR) | 995 FW_WM(wm->hpll.cursor, HPLL_CURSOR) | 996 FW_WM(wm->hpll.plane, HPLL_SR)); 997 998 intel_uncore_posting_read(&dev_priv->uncore, DSPFW1); 999} 1000 1001#define FW_WM_VLV(value, plane) \ 1002 (((value) << DSPFW_ ## plane ## _SHIFT) & DSPFW_ ## plane ## _MASK_VLV) 1003 1004static void vlv_write_wm_values(struct drm_i915_private *dev_priv, 1005 const struct vlv_wm_values *wm) 1006{ 1007 enum pipe pipe; 1008 1009 for_each_pipe(dev_priv, pipe) { 1010 trace_vlv_wm(intel_get_crtc_for_pipe(dev_priv, pipe), wm); 1011 1012 intel_uncore_write(&dev_priv->uncore, VLV_DDL(pipe), 1013 (wm->ddl[pipe].plane[PLANE_CURSOR] << DDL_CURSOR_SHIFT) | 1014 (wm->ddl[pipe].plane[PLANE_SPRITE1] << DDL_SPRITE_SHIFT(1)) | 1015 (wm->ddl[pipe].plane[PLANE_SPRITE0] << DDL_SPRITE_SHIFT(0)) | 1016 (wm->ddl[pipe].plane[PLANE_PRIMARY] << DDL_PLANE_SHIFT)); 1017 } 1018 1019 /* 1020 * Zero the (unused) WM1 watermarks, and also clear all the 1021 * high order bits so that there are no out of bounds values 1022 * present in the registers during the reprogramming. 1023 */ 1024 intel_uncore_write(&dev_priv->uncore, DSPHOWM, 0); 1025 intel_uncore_write(&dev_priv->uncore, DSPHOWM1, 0); 1026 intel_uncore_write(&dev_priv->uncore, DSPFW4, 0); 1027 intel_uncore_write(&dev_priv->uncore, DSPFW5, 0); 1028 intel_uncore_write(&dev_priv->uncore, DSPFW6, 0); 1029 1030 intel_uncore_write(&dev_priv->uncore, DSPFW1, 1031 FW_WM(wm->sr.plane, SR) | 1032 FW_WM(wm->pipe[PIPE_B].plane[PLANE_CURSOR], CURSORB) | 1033 FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_PRIMARY], PLANEB) | 1034 FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_PRIMARY], PLANEA)); 1035 intel_uncore_write(&dev_priv->uncore, DSPFW2, 1036 FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_SPRITE1], SPRITEB) | 1037 FW_WM(wm->pipe[PIPE_A].plane[PLANE_CURSOR], CURSORA) | 1038 FW_WM_VLV(wm->pipe[PIPE_A].plane[PLANE_SPRITE0], SPRITEA)); 1039 intel_uncore_write(&dev_priv->uncore, DSPFW3, 1040 FW_WM(wm->sr.cursor, CURSOR_SR)); 1041 1042 if (IS_CHERRYVIEW(dev_priv)) { 1043 intel_uncore_write(&dev_priv->uncore, DSPFW7_CHV, 1044 FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE1], SPRITED) | 1045 FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEC)); 1046 intel_uncore_write(&dev_priv->uncore, DSPFW8_CHV, 1047 FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_SPRITE1], SPRITEF) | 1048 FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_SPRITE0], SPRITEE)); 1049 intel_uncore_write(&dev_priv->uncore, DSPFW9_CHV, 1050 FW_WM_VLV(wm->pipe[PIPE_C].plane[PLANE_PRIMARY], PLANEC) | 1051 FW_WM(wm->pipe[PIPE_C].plane[PLANE_CURSOR], CURSORC)); 1052 intel_uncore_write(&dev_priv->uncore, DSPHOWM, 1053 FW_WM(wm->sr.plane >> 9, SR_HI) | 1054 FW_WM(wm->pipe[PIPE_C].plane[PLANE_SPRITE1] >> 8, SPRITEF_HI) | 1055 FW_WM(wm->pipe[PIPE_C].plane[PLANE_SPRITE0] >> 8, SPRITEE_HI) | 1056 FW_WM(wm->pipe[PIPE_C].plane[PLANE_PRIMARY] >> 8, PLANEC_HI) | 1057 FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE1] >> 8, SPRITED_HI) | 1058 FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0] >> 8, SPRITEC_HI) | 1059 FW_WM(wm->pipe[PIPE_B].plane[PLANE_PRIMARY] >> 8, PLANEB_HI) | 1060 FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE1] >> 8, SPRITEB_HI) | 1061 FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0] >> 8, SPRITEA_HI) | 1062 FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY] >> 8, PLANEA_HI)); 1063 } else { 1064 intel_uncore_write(&dev_priv->uncore, DSPFW7, 1065 FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE1], SPRITED) | 1066 FW_WM_VLV(wm->pipe[PIPE_B].plane[PLANE_SPRITE0], SPRITEC)); 1067 intel_uncore_write(&dev_priv->uncore, DSPHOWM, 1068 FW_WM(wm->sr.plane >> 9, SR_HI) | 1069 FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE1] >> 8, SPRITED_HI) | 1070 FW_WM(wm->pipe[PIPE_B].plane[PLANE_SPRITE0] >> 8, SPRITEC_HI) | 1071 FW_WM(wm->pipe[PIPE_B].plane[PLANE_PRIMARY] >> 8, PLANEB_HI) | 1072 FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE1] >> 8, SPRITEB_HI) | 1073 FW_WM(wm->pipe[PIPE_A].plane[PLANE_SPRITE0] >> 8, SPRITEA_HI) | 1074 FW_WM(wm->pipe[PIPE_A].plane[PLANE_PRIMARY] >> 8, PLANEA_HI)); 1075 } 1076 1077 intel_uncore_posting_read(&dev_priv->uncore, DSPFW1); 1078} 1079 1080#undef FW_WM_VLV 1081 1082static void g4x_setup_wm_latency(struct drm_i915_private *dev_priv) 1083{ 1084 /* all latencies in usec */ 1085 dev_priv->wm.pri_latency[G4X_WM_LEVEL_NORMAL] = 5; 1086 dev_priv->wm.pri_latency[G4X_WM_LEVEL_SR] = 12; 1087 dev_priv->wm.pri_latency[G4X_WM_LEVEL_HPLL] = 35; 1088 1089 dev_priv->wm.max_level = G4X_WM_LEVEL_HPLL; 1090} 1091 1092static int g4x_plane_fifo_size(enum plane_id plane_id, int level) 1093{ 1094 /* 1095 * DSPCNTR[13] supposedly controls whether the 1096 * primary plane can use the FIFO space otherwise 1097 * reserved for the sprite plane. It's not 100% clear 1098 * what the actual FIFO size is, but it looks like we 1099 * can happily set both primary and sprite watermarks 1100 * up to 127 cachelines. So that would seem to mean 1101 * that either DSPCNTR[13] doesn't do anything, or that 1102 * the total FIFO is >= 256 cachelines in size. Either 1103 * way, we don't seem to have to worry about this 1104 * repartitioning as the maximum watermark value the 1105 * register can hold for each plane is lower than the 1106 * minimum FIFO size. 1107 */ 1108 switch (plane_id) { 1109 case PLANE_CURSOR: 1110 return 63; 1111 case PLANE_PRIMARY: 1112 return level == G4X_WM_LEVEL_NORMAL ? 127 : 511; 1113 case PLANE_SPRITE0: 1114 return level == G4X_WM_LEVEL_NORMAL ? 127 : 0; 1115 default: 1116 MISSING_CASE(plane_id); 1117 return 0; 1118 } 1119} 1120 1121static int g4x_fbc_fifo_size(int level) 1122{ 1123 switch (level) { 1124 case G4X_WM_LEVEL_SR: 1125 return 7; 1126 case G4X_WM_LEVEL_HPLL: 1127 return 15; 1128 default: 1129 MISSING_CASE(level); 1130 return 0; 1131 } 1132} 1133 1134static u16 g4x_compute_wm(const struct intel_crtc_state *crtc_state, 1135 const struct intel_plane_state *plane_state, 1136 int level) 1137{ 1138 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 1139 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 1140 const struct drm_display_mode *pipe_mode = 1141 &crtc_state->hw.pipe_mode; 1142 unsigned int latency = dev_priv->wm.pri_latency[level] * 10; 1143 unsigned int clock, htotal, cpp, width, wm; 1144 1145 if (latency == 0) 1146 return USHRT_MAX; 1147 1148 if (!intel_wm_plane_visible(crtc_state, plane_state)) 1149 return 0; 1150 1151 cpp = plane_state->hw.fb->format->cpp[0]; 1152 1153 /* 1154 * Not 100% sure which way ELK should go here as the 1155 * spec only says CL/CTG should assume 32bpp and BW 1156 * doesn't need to. But as these things followed the 1157 * mobile vs. desktop lines on gen3 as well, let's 1158 * assume ELK doesn't need this. 1159 * 1160 * The spec also fails to list such a restriction for 1161 * the HPLL watermark, which seems a little strange. 1162 * Let's use 32bpp for the HPLL watermark as well. 1163 */ 1164 if (IS_GM45(dev_priv) && plane->id == PLANE_PRIMARY && 1165 level != G4X_WM_LEVEL_NORMAL) 1166 cpp = max(cpp, 4u); 1167 1168 clock = pipe_mode->crtc_clock; 1169 htotal = pipe_mode->crtc_htotal; 1170 1171 width = drm_rect_width(&plane_state->uapi.dst); 1172 1173 if (plane->id == PLANE_CURSOR) { 1174 wm = intel_wm_method2(clock, htotal, width, cpp, latency); 1175 } else if (plane->id == PLANE_PRIMARY && 1176 level == G4X_WM_LEVEL_NORMAL) { 1177 wm = intel_wm_method1(clock, cpp, latency); 1178 } else { 1179 unsigned int small, large; 1180 1181 small = intel_wm_method1(clock, cpp, latency); 1182 large = intel_wm_method2(clock, htotal, width, cpp, latency); 1183 1184 wm = min(small, large); 1185 } 1186 1187 wm += g4x_tlb_miss_wa(g4x_plane_fifo_size(plane->id, level), 1188 width, cpp); 1189 1190 wm = DIV_ROUND_UP(wm, 64) + 2; 1191 1192 return min_t(unsigned int, wm, USHRT_MAX); 1193} 1194 1195static bool g4x_raw_plane_wm_set(struct intel_crtc_state *crtc_state, 1196 int level, enum plane_id plane_id, u16 value) 1197{ 1198 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1199 bool dirty = false; 1200 1201 for (; level < intel_wm_num_levels(dev_priv); level++) { 1202 struct g4x_pipe_wm *raw = &crtc_state->wm.g4x.raw[level]; 1203 1204 dirty |= raw->plane[plane_id] != value; 1205 raw->plane[plane_id] = value; 1206 } 1207 1208 return dirty; 1209} 1210 1211static bool g4x_raw_fbc_wm_set(struct intel_crtc_state *crtc_state, 1212 int level, u16 value) 1213{ 1214 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1215 bool dirty = false; 1216 1217 /* NORMAL level doesn't have an FBC watermark */ 1218 level = max(level, G4X_WM_LEVEL_SR); 1219 1220 for (; level < intel_wm_num_levels(dev_priv); level++) { 1221 struct g4x_pipe_wm *raw = &crtc_state->wm.g4x.raw[level]; 1222 1223 dirty |= raw->fbc != value; 1224 raw->fbc = value; 1225 } 1226 1227 return dirty; 1228} 1229 1230static u32 ilk_compute_fbc_wm(const struct intel_crtc_state *crtc_state, 1231 const struct intel_plane_state *plane_state, 1232 u32 pri_val); 1233 1234static bool g4x_raw_plane_wm_compute(struct intel_crtc_state *crtc_state, 1235 const struct intel_plane_state *plane_state) 1236{ 1237 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 1238 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1239 int num_levels = intel_wm_num_levels(to_i915(plane->base.dev)); 1240 enum plane_id plane_id = plane->id; 1241 bool dirty = false; 1242 int level; 1243 1244 if (!intel_wm_plane_visible(crtc_state, plane_state)) { 1245 dirty |= g4x_raw_plane_wm_set(crtc_state, 0, plane_id, 0); 1246 if (plane_id == PLANE_PRIMARY) 1247 dirty |= g4x_raw_fbc_wm_set(crtc_state, 0, 0); 1248 goto out; 1249 } 1250 1251 for (level = 0; level < num_levels; level++) { 1252 struct g4x_pipe_wm *raw = &crtc_state->wm.g4x.raw[level]; 1253 int wm, max_wm; 1254 1255 wm = g4x_compute_wm(crtc_state, plane_state, level); 1256 max_wm = g4x_plane_fifo_size(plane_id, level); 1257 1258 if (wm > max_wm) 1259 break; 1260 1261 dirty |= raw->plane[plane_id] != wm; 1262 raw->plane[plane_id] = wm; 1263 1264 if (plane_id != PLANE_PRIMARY || 1265 level == G4X_WM_LEVEL_NORMAL) 1266 continue; 1267 1268 wm = ilk_compute_fbc_wm(crtc_state, plane_state, 1269 raw->plane[plane_id]); 1270 max_wm = g4x_fbc_fifo_size(level); 1271 1272 /* 1273 * FBC wm is not mandatory as we 1274 * can always just disable its use. 1275 */ 1276 if (wm > max_wm) 1277 wm = USHRT_MAX; 1278 1279 dirty |= raw->fbc != wm; 1280 raw->fbc = wm; 1281 } 1282 1283 /* mark watermarks as invalid */ 1284 dirty |= g4x_raw_plane_wm_set(crtc_state, level, plane_id, USHRT_MAX); 1285 1286 if (plane_id == PLANE_PRIMARY) 1287 dirty |= g4x_raw_fbc_wm_set(crtc_state, level, USHRT_MAX); 1288 1289 out: 1290 if (dirty) { 1291 drm_dbg_kms(&dev_priv->drm, 1292 "%s watermarks: normal=%d, SR=%d, HPLL=%d\n", 1293 plane->base.name, 1294 crtc_state->wm.g4x.raw[G4X_WM_LEVEL_NORMAL].plane[plane_id], 1295 crtc_state->wm.g4x.raw[G4X_WM_LEVEL_SR].plane[plane_id], 1296 crtc_state->wm.g4x.raw[G4X_WM_LEVEL_HPLL].plane[plane_id]); 1297 1298 if (plane_id == PLANE_PRIMARY) 1299 drm_dbg_kms(&dev_priv->drm, 1300 "FBC watermarks: SR=%d, HPLL=%d\n", 1301 crtc_state->wm.g4x.raw[G4X_WM_LEVEL_SR].fbc, 1302 crtc_state->wm.g4x.raw[G4X_WM_LEVEL_HPLL].fbc); 1303 } 1304 1305 return dirty; 1306} 1307 1308static bool g4x_raw_plane_wm_is_valid(const struct intel_crtc_state *crtc_state, 1309 enum plane_id plane_id, int level) 1310{ 1311 const struct g4x_pipe_wm *raw = &crtc_state->wm.g4x.raw[level]; 1312 1313 return raw->plane[plane_id] <= g4x_plane_fifo_size(plane_id, level); 1314} 1315 1316static bool g4x_raw_crtc_wm_is_valid(const struct intel_crtc_state *crtc_state, 1317 int level) 1318{ 1319 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1320 1321 if (level > dev_priv->wm.max_level) 1322 return false; 1323 1324 return g4x_raw_plane_wm_is_valid(crtc_state, PLANE_PRIMARY, level) && 1325 g4x_raw_plane_wm_is_valid(crtc_state, PLANE_SPRITE0, level) && 1326 g4x_raw_plane_wm_is_valid(crtc_state, PLANE_CURSOR, level); 1327} 1328 1329/* mark all levels starting from 'level' as invalid */ 1330static void g4x_invalidate_wms(struct intel_crtc *crtc, 1331 struct g4x_wm_state *wm_state, int level) 1332{ 1333 if (level <= G4X_WM_LEVEL_NORMAL) { 1334 enum plane_id plane_id; 1335 1336 for_each_plane_id_on_crtc(crtc, plane_id) 1337 wm_state->wm.plane[plane_id] = USHRT_MAX; 1338 } 1339 1340 if (level <= G4X_WM_LEVEL_SR) { 1341 wm_state->cxsr = false; 1342 wm_state->sr.cursor = USHRT_MAX; 1343 wm_state->sr.plane = USHRT_MAX; 1344 wm_state->sr.fbc = USHRT_MAX; 1345 } 1346 1347 if (level <= G4X_WM_LEVEL_HPLL) { 1348 wm_state->hpll_en = false; 1349 wm_state->hpll.cursor = USHRT_MAX; 1350 wm_state->hpll.plane = USHRT_MAX; 1351 wm_state->hpll.fbc = USHRT_MAX; 1352 } 1353} 1354 1355static bool g4x_compute_fbc_en(const struct g4x_wm_state *wm_state, 1356 int level) 1357{ 1358 if (level < G4X_WM_LEVEL_SR) 1359 return false; 1360 1361 if (level >= G4X_WM_LEVEL_SR && 1362 wm_state->sr.fbc > g4x_fbc_fifo_size(G4X_WM_LEVEL_SR)) 1363 return false; 1364 1365 if (level >= G4X_WM_LEVEL_HPLL && 1366 wm_state->hpll.fbc > g4x_fbc_fifo_size(G4X_WM_LEVEL_HPLL)) 1367 return false; 1368 1369 return true; 1370} 1371 1372static int g4x_compute_pipe_wm(struct intel_crtc_state *crtc_state) 1373{ 1374 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1375 struct intel_atomic_state *state = 1376 to_intel_atomic_state(crtc_state->uapi.state); 1377 struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal; 1378 int num_active_planes = hweight8(crtc_state->active_planes & 1379 ~BIT(PLANE_CURSOR)); 1380 const struct g4x_pipe_wm *raw; 1381 const struct intel_plane_state *old_plane_state; 1382 const struct intel_plane_state *new_plane_state; 1383 struct intel_plane *plane; 1384 enum plane_id plane_id; 1385 int i, level; 1386 unsigned int dirty = 0; 1387 1388 for_each_oldnew_intel_plane_in_state(state, plane, 1389 old_plane_state, 1390 new_plane_state, i) { 1391 if (new_plane_state->hw.crtc != &crtc->base && 1392 old_plane_state->hw.crtc != &crtc->base) 1393 continue; 1394 1395 if (g4x_raw_plane_wm_compute(crtc_state, new_plane_state)) 1396 dirty |= BIT(plane->id); 1397 } 1398 1399 if (!dirty) 1400 return 0; 1401 1402 level = G4X_WM_LEVEL_NORMAL; 1403 if (!g4x_raw_crtc_wm_is_valid(crtc_state, level)) 1404 goto out; 1405 1406 raw = &crtc_state->wm.g4x.raw[level]; 1407 for_each_plane_id_on_crtc(crtc, plane_id) 1408 wm_state->wm.plane[plane_id] = raw->plane[plane_id]; 1409 1410 level = G4X_WM_LEVEL_SR; 1411 if (!g4x_raw_crtc_wm_is_valid(crtc_state, level)) 1412 goto out; 1413 1414 raw = &crtc_state->wm.g4x.raw[level]; 1415 wm_state->sr.plane = raw->plane[PLANE_PRIMARY]; 1416 wm_state->sr.cursor = raw->plane[PLANE_CURSOR]; 1417 wm_state->sr.fbc = raw->fbc; 1418 1419 wm_state->cxsr = num_active_planes == BIT(PLANE_PRIMARY); 1420 1421 level = G4X_WM_LEVEL_HPLL; 1422 if (!g4x_raw_crtc_wm_is_valid(crtc_state, level)) 1423 goto out; 1424 1425 raw = &crtc_state->wm.g4x.raw[level]; 1426 wm_state->hpll.plane = raw->plane[PLANE_PRIMARY]; 1427 wm_state->hpll.cursor = raw->plane[PLANE_CURSOR]; 1428 wm_state->hpll.fbc = raw->fbc; 1429 1430 wm_state->hpll_en = wm_state->cxsr; 1431 1432 level++; 1433 1434 out: 1435 if (level == G4X_WM_LEVEL_NORMAL) 1436 return -EINVAL; 1437 1438 /* invalidate the higher levels */ 1439 g4x_invalidate_wms(crtc, wm_state, level); 1440 1441 /* 1442 * Determine if the FBC watermark(s) can be used. IF 1443 * this isn't the case we prefer to disable the FBC 1444 * watermark(s) rather than disable the SR/HPLL 1445 * level(s) entirely. 'level-1' is the highest valid 1446 * level here. 1447 */ 1448 wm_state->fbc_en = g4x_compute_fbc_en(wm_state, level - 1); 1449 1450 return 0; 1451} 1452 1453static int g4x_compute_intermediate_wm(struct intel_crtc_state *new_crtc_state) 1454{ 1455 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); 1456 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1457 struct g4x_wm_state *intermediate = &new_crtc_state->wm.g4x.intermediate; 1458 const struct g4x_wm_state *optimal = &new_crtc_state->wm.g4x.optimal; 1459 struct intel_atomic_state *intel_state = 1460 to_intel_atomic_state(new_crtc_state->uapi.state); 1461 const struct intel_crtc_state *old_crtc_state = 1462 intel_atomic_get_old_crtc_state(intel_state, crtc); 1463 const struct g4x_wm_state *active = &old_crtc_state->wm.g4x.optimal; 1464 enum plane_id plane_id; 1465 1466 if (!new_crtc_state->hw.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { 1467 *intermediate = *optimal; 1468 1469 intermediate->cxsr = false; 1470 intermediate->hpll_en = false; 1471 goto out; 1472 } 1473 1474 intermediate->cxsr = optimal->cxsr && active->cxsr && 1475 !new_crtc_state->disable_cxsr; 1476 intermediate->hpll_en = optimal->hpll_en && active->hpll_en && 1477 !new_crtc_state->disable_cxsr; 1478 intermediate->fbc_en = optimal->fbc_en && active->fbc_en; 1479 1480 for_each_plane_id_on_crtc(crtc, plane_id) { 1481 intermediate->wm.plane[plane_id] = 1482 max(optimal->wm.plane[plane_id], 1483 active->wm.plane[plane_id]); 1484 1485 drm_WARN_ON(&dev_priv->drm, intermediate->wm.plane[plane_id] > 1486 g4x_plane_fifo_size(plane_id, G4X_WM_LEVEL_NORMAL)); 1487 } 1488 1489 intermediate->sr.plane = max(optimal->sr.plane, 1490 active->sr.plane); 1491 intermediate->sr.cursor = max(optimal->sr.cursor, 1492 active->sr.cursor); 1493 intermediate->sr.fbc = max(optimal->sr.fbc, 1494 active->sr.fbc); 1495 1496 intermediate->hpll.plane = max(optimal->hpll.plane, 1497 active->hpll.plane); 1498 intermediate->hpll.cursor = max(optimal->hpll.cursor, 1499 active->hpll.cursor); 1500 intermediate->hpll.fbc = max(optimal->hpll.fbc, 1501 active->hpll.fbc); 1502 1503 drm_WARN_ON(&dev_priv->drm, 1504 (intermediate->sr.plane > 1505 g4x_plane_fifo_size(PLANE_PRIMARY, G4X_WM_LEVEL_SR) || 1506 intermediate->sr.cursor > 1507 g4x_plane_fifo_size(PLANE_CURSOR, G4X_WM_LEVEL_SR)) && 1508 intermediate->cxsr); 1509 drm_WARN_ON(&dev_priv->drm, 1510 (intermediate->sr.plane > 1511 g4x_plane_fifo_size(PLANE_PRIMARY, G4X_WM_LEVEL_HPLL) || 1512 intermediate->sr.cursor > 1513 g4x_plane_fifo_size(PLANE_CURSOR, G4X_WM_LEVEL_HPLL)) && 1514 intermediate->hpll_en); 1515 1516 drm_WARN_ON(&dev_priv->drm, 1517 intermediate->sr.fbc > g4x_fbc_fifo_size(1) && 1518 intermediate->fbc_en && intermediate->cxsr); 1519 drm_WARN_ON(&dev_priv->drm, 1520 intermediate->hpll.fbc > g4x_fbc_fifo_size(2) && 1521 intermediate->fbc_en && intermediate->hpll_en); 1522 1523out: 1524 /* 1525 * If our intermediate WM are identical to the final WM, then we can 1526 * omit the post-vblank programming; only update if it's different. 1527 */ 1528 if (memcmp(intermediate, optimal, sizeof(*intermediate)) != 0) 1529 new_crtc_state->wm.need_postvbl_update = true; 1530 1531 return 0; 1532} 1533 1534static void g4x_merge_wm(struct drm_i915_private *dev_priv, 1535 struct g4x_wm_values *wm) 1536{ 1537 struct intel_crtc *crtc; 1538 int num_active_pipes = 0; 1539 1540 wm->cxsr = true; 1541 wm->hpll_en = true; 1542 wm->fbc_en = true; 1543 1544 for_each_intel_crtc(&dev_priv->drm, crtc) { 1545 const struct g4x_wm_state *wm_state = &crtc->wm.active.g4x; 1546 1547 if (!crtc->active) 1548 continue; 1549 1550 if (!wm_state->cxsr) 1551 wm->cxsr = false; 1552 if (!wm_state->hpll_en) 1553 wm->hpll_en = false; 1554 if (!wm_state->fbc_en) 1555 wm->fbc_en = false; 1556 1557 num_active_pipes++; 1558 } 1559 1560 if (num_active_pipes != 1) { 1561 wm->cxsr = false; 1562 wm->hpll_en = false; 1563 wm->fbc_en = false; 1564 } 1565 1566 for_each_intel_crtc(&dev_priv->drm, crtc) { 1567 const struct g4x_wm_state *wm_state = &crtc->wm.active.g4x; 1568 enum pipe pipe = crtc->pipe; 1569 1570 wm->pipe[pipe] = wm_state->wm; 1571 if (crtc->active && wm->cxsr) 1572 wm->sr = wm_state->sr; 1573 if (crtc->active && wm->hpll_en) 1574 wm->hpll = wm_state->hpll; 1575 } 1576} 1577 1578static void g4x_program_watermarks(struct drm_i915_private *dev_priv) 1579{ 1580 struct g4x_wm_values *old_wm = &dev_priv->wm.g4x; 1581 struct g4x_wm_values new_wm = {}; 1582 1583 g4x_merge_wm(dev_priv, &new_wm); 1584 1585 if (memcmp(old_wm, &new_wm, sizeof(new_wm)) == 0) 1586 return; 1587 1588 if (is_disabling(old_wm->cxsr, new_wm.cxsr, true)) 1589 _intel_set_memory_cxsr(dev_priv, false); 1590 1591 g4x_write_wm_values(dev_priv, &new_wm); 1592 1593 if (is_enabling(old_wm->cxsr, new_wm.cxsr, true)) 1594 _intel_set_memory_cxsr(dev_priv, true); 1595 1596 *old_wm = new_wm; 1597} 1598 1599static void g4x_initial_watermarks(struct intel_atomic_state *state, 1600 struct intel_crtc *crtc) 1601{ 1602 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1603 const struct intel_crtc_state *crtc_state = 1604 intel_atomic_get_new_crtc_state(state, crtc); 1605 1606 mutex_lock(&dev_priv->wm.wm_mutex); 1607 crtc->wm.active.g4x = crtc_state->wm.g4x.intermediate; 1608 g4x_program_watermarks(dev_priv); 1609 mutex_unlock(&dev_priv->wm.wm_mutex); 1610} 1611 1612static void g4x_optimize_watermarks(struct intel_atomic_state *state, 1613 struct intel_crtc *crtc) 1614{ 1615 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1616 const struct intel_crtc_state *crtc_state = 1617 intel_atomic_get_new_crtc_state(state, crtc); 1618 1619 if (!crtc_state->wm.need_postvbl_update) 1620 return; 1621 1622 mutex_lock(&dev_priv->wm.wm_mutex); 1623 crtc->wm.active.g4x = crtc_state->wm.g4x.optimal; 1624 g4x_program_watermarks(dev_priv); 1625 mutex_unlock(&dev_priv->wm.wm_mutex); 1626} 1627 1628/* latency must be in 0.1us units. */ 1629static unsigned int vlv_wm_method2(unsigned int pixel_rate, 1630 unsigned int htotal, 1631 unsigned int width, 1632 unsigned int cpp, 1633 unsigned int latency) 1634{ 1635 unsigned int ret; 1636 1637 ret = intel_wm_method2(pixel_rate, htotal, 1638 width, cpp, latency); 1639 ret = DIV_ROUND_UP(ret, 64); 1640 1641 return ret; 1642} 1643 1644static void vlv_setup_wm_latency(struct drm_i915_private *dev_priv) 1645{ 1646 /* all latencies in usec */ 1647 dev_priv->wm.pri_latency[VLV_WM_LEVEL_PM2] = 3; 1648 1649 dev_priv->wm.max_level = VLV_WM_LEVEL_PM2; 1650 1651 if (IS_CHERRYVIEW(dev_priv)) { 1652 dev_priv->wm.pri_latency[VLV_WM_LEVEL_PM5] = 12; 1653 dev_priv->wm.pri_latency[VLV_WM_LEVEL_DDR_DVFS] = 33; 1654 1655 dev_priv->wm.max_level = VLV_WM_LEVEL_DDR_DVFS; 1656 } 1657} 1658 1659static u16 vlv_compute_wm_level(const struct intel_crtc_state *crtc_state, 1660 const struct intel_plane_state *plane_state, 1661 int level) 1662{ 1663 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 1664 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 1665 const struct drm_display_mode *pipe_mode = 1666 &crtc_state->hw.pipe_mode; 1667 unsigned int clock, htotal, cpp, width, wm; 1668 1669 if (dev_priv->wm.pri_latency[level] == 0) 1670 return USHRT_MAX; 1671 1672 if (!intel_wm_plane_visible(crtc_state, plane_state)) 1673 return 0; 1674 1675 cpp = plane_state->hw.fb->format->cpp[0]; 1676 clock = pipe_mode->crtc_clock; 1677 htotal = pipe_mode->crtc_htotal; 1678 width = crtc_state->pipe_src_w; 1679 1680 if (plane->id == PLANE_CURSOR) { 1681 /* 1682 * FIXME the formula gives values that are 1683 * too big for the cursor FIFO, and hence we 1684 * would never be able to use cursors. For 1685 * now just hardcode the watermark. 1686 */ 1687 wm = 63; 1688 } else { 1689 wm = vlv_wm_method2(clock, htotal, width, cpp, 1690 dev_priv->wm.pri_latency[level] * 10); 1691 } 1692 1693 return min_t(unsigned int, wm, USHRT_MAX); 1694} 1695 1696static bool vlv_need_sprite0_fifo_workaround(unsigned int active_planes) 1697{ 1698 return (active_planes & (BIT(PLANE_SPRITE0) | 1699 BIT(PLANE_SPRITE1))) == BIT(PLANE_SPRITE1); 1700} 1701 1702static int vlv_compute_fifo(struct intel_crtc_state *crtc_state) 1703{ 1704 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1705 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1706 const struct g4x_pipe_wm *raw = 1707 &crtc_state->wm.vlv.raw[VLV_WM_LEVEL_PM2]; 1708 struct vlv_fifo_state *fifo_state = &crtc_state->wm.vlv.fifo_state; 1709 unsigned int active_planes = crtc_state->active_planes & ~BIT(PLANE_CURSOR); 1710 int num_active_planes = hweight8(active_planes); 1711 const int fifo_size = 511; 1712 int fifo_extra, fifo_left = fifo_size; 1713 int sprite0_fifo_extra = 0; 1714 unsigned int total_rate; 1715 enum plane_id plane_id; 1716 1717 /* 1718 * When enabling sprite0 after sprite1 has already been enabled 1719 * we tend to get an underrun unless sprite0 already has some 1720 * FIFO space allcoated. Hence we always allocate at least one 1721 * cacheline for sprite0 whenever sprite1 is enabled. 1722 * 1723 * All other plane enable sequences appear immune to this problem. 1724 */ 1725 if (vlv_need_sprite0_fifo_workaround(active_planes)) 1726 sprite0_fifo_extra = 1; 1727 1728 total_rate = raw->plane[PLANE_PRIMARY] + 1729 raw->plane[PLANE_SPRITE0] + 1730 raw->plane[PLANE_SPRITE1] + 1731 sprite0_fifo_extra; 1732 1733 if (total_rate > fifo_size) 1734 return -EINVAL; 1735 1736 if (total_rate == 0) 1737 total_rate = 1; 1738 1739 for_each_plane_id_on_crtc(crtc, plane_id) { 1740 unsigned int rate; 1741 1742 if ((active_planes & BIT(plane_id)) == 0) { 1743 fifo_state->plane[plane_id] = 0; 1744 continue; 1745 } 1746 1747 rate = raw->plane[plane_id]; 1748 fifo_state->plane[plane_id] = fifo_size * rate / total_rate; 1749 fifo_left -= fifo_state->plane[plane_id]; 1750 } 1751 1752 fifo_state->plane[PLANE_SPRITE0] += sprite0_fifo_extra; 1753 fifo_left -= sprite0_fifo_extra; 1754 1755 fifo_state->plane[PLANE_CURSOR] = 63; 1756 1757 fifo_extra = DIV_ROUND_UP(fifo_left, num_active_planes ?: 1); 1758 1759 /* spread the remainder evenly */ 1760 for_each_plane_id_on_crtc(crtc, plane_id) { 1761 int plane_extra; 1762 1763 if (fifo_left == 0) 1764 break; 1765 1766 if ((active_planes & BIT(plane_id)) == 0) 1767 continue; 1768 1769 plane_extra = min(fifo_extra, fifo_left); 1770 fifo_state->plane[plane_id] += plane_extra; 1771 fifo_left -= plane_extra; 1772 } 1773 1774 drm_WARN_ON(&dev_priv->drm, active_planes != 0 && fifo_left != 0); 1775 1776 /* give it all to the first plane if none are active */ 1777 if (active_planes == 0) { 1778 drm_WARN_ON(&dev_priv->drm, fifo_left != fifo_size); 1779 fifo_state->plane[PLANE_PRIMARY] = fifo_left; 1780 } 1781 1782 return 0; 1783} 1784 1785/* mark all levels starting from 'level' as invalid */ 1786static void vlv_invalidate_wms(struct intel_crtc *crtc, 1787 struct vlv_wm_state *wm_state, int level) 1788{ 1789 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1790 1791 for (; level < intel_wm_num_levels(dev_priv); level++) { 1792 enum plane_id plane_id; 1793 1794 for_each_plane_id_on_crtc(crtc, plane_id) 1795 wm_state->wm[level].plane[plane_id] = USHRT_MAX; 1796 1797 wm_state->sr[level].cursor = USHRT_MAX; 1798 wm_state->sr[level].plane = USHRT_MAX; 1799 } 1800} 1801 1802static u16 vlv_invert_wm_value(u16 wm, u16 fifo_size) 1803{ 1804 if (wm > fifo_size) 1805 return USHRT_MAX; 1806 else 1807 return fifo_size - wm; 1808} 1809 1810/* 1811 * Starting from 'level' set all higher 1812 * levels to 'value' in the "raw" watermarks. 1813 */ 1814static bool vlv_raw_plane_wm_set(struct intel_crtc_state *crtc_state, 1815 int level, enum plane_id plane_id, u16 value) 1816{ 1817 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1818 int num_levels = intel_wm_num_levels(dev_priv); 1819 bool dirty = false; 1820 1821 for (; level < num_levels; level++) { 1822 struct g4x_pipe_wm *raw = &crtc_state->wm.vlv.raw[level]; 1823 1824 dirty |= raw->plane[plane_id] != value; 1825 raw->plane[plane_id] = value; 1826 } 1827 1828 return dirty; 1829} 1830 1831static bool vlv_raw_plane_wm_compute(struct intel_crtc_state *crtc_state, 1832 const struct intel_plane_state *plane_state) 1833{ 1834 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 1835 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1836 enum plane_id plane_id = plane->id; 1837 int num_levels = intel_wm_num_levels(to_i915(plane->base.dev)); 1838 int level; 1839 bool dirty = false; 1840 1841 if (!intel_wm_plane_visible(crtc_state, plane_state)) { 1842 dirty |= vlv_raw_plane_wm_set(crtc_state, 0, plane_id, 0); 1843 goto out; 1844 } 1845 1846 for (level = 0; level < num_levels; level++) { 1847 struct g4x_pipe_wm *raw = &crtc_state->wm.vlv.raw[level]; 1848 int wm = vlv_compute_wm_level(crtc_state, plane_state, level); 1849 int max_wm = plane_id == PLANE_CURSOR ? 63 : 511; 1850 1851 if (wm > max_wm) 1852 break; 1853 1854 dirty |= raw->plane[plane_id] != wm; 1855 raw->plane[plane_id] = wm; 1856 } 1857 1858 /* mark all higher levels as invalid */ 1859 dirty |= vlv_raw_plane_wm_set(crtc_state, level, plane_id, USHRT_MAX); 1860 1861out: 1862 if (dirty) 1863 drm_dbg_kms(&dev_priv->drm, 1864 "%s watermarks: PM2=%d, PM5=%d, DDR DVFS=%d\n", 1865 plane->base.name, 1866 crtc_state->wm.vlv.raw[VLV_WM_LEVEL_PM2].plane[plane_id], 1867 crtc_state->wm.vlv.raw[VLV_WM_LEVEL_PM5].plane[plane_id], 1868 crtc_state->wm.vlv.raw[VLV_WM_LEVEL_DDR_DVFS].plane[plane_id]); 1869 1870 return dirty; 1871} 1872 1873static bool vlv_raw_plane_wm_is_valid(const struct intel_crtc_state *crtc_state, 1874 enum plane_id plane_id, int level) 1875{ 1876 const struct g4x_pipe_wm *raw = 1877 &crtc_state->wm.vlv.raw[level]; 1878 const struct vlv_fifo_state *fifo_state = 1879 &crtc_state->wm.vlv.fifo_state; 1880 1881 return raw->plane[plane_id] <= fifo_state->plane[plane_id]; 1882} 1883 1884static bool vlv_raw_crtc_wm_is_valid(const struct intel_crtc_state *crtc_state, int level) 1885{ 1886 return vlv_raw_plane_wm_is_valid(crtc_state, PLANE_PRIMARY, level) && 1887 vlv_raw_plane_wm_is_valid(crtc_state, PLANE_SPRITE0, level) && 1888 vlv_raw_plane_wm_is_valid(crtc_state, PLANE_SPRITE1, level) && 1889 vlv_raw_plane_wm_is_valid(crtc_state, PLANE_CURSOR, level); 1890} 1891 1892static int vlv_compute_pipe_wm(struct intel_crtc_state *crtc_state) 1893{ 1894 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1895 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1896 struct intel_atomic_state *state = 1897 to_intel_atomic_state(crtc_state->uapi.state); 1898 struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal; 1899 const struct vlv_fifo_state *fifo_state = 1900 &crtc_state->wm.vlv.fifo_state; 1901 int num_active_planes = hweight8(crtc_state->active_planes & 1902 ~BIT(PLANE_CURSOR)); 1903 bool needs_modeset = drm_atomic_crtc_needs_modeset(&crtc_state->uapi); 1904 const struct intel_plane_state *old_plane_state; 1905 const struct intel_plane_state *new_plane_state; 1906 struct intel_plane *plane; 1907 enum plane_id plane_id; 1908 int level, ret, i; 1909 unsigned int dirty = 0; 1910 1911 for_each_oldnew_intel_plane_in_state(state, plane, 1912 old_plane_state, 1913 new_plane_state, i) { 1914 if (new_plane_state->hw.crtc != &crtc->base && 1915 old_plane_state->hw.crtc != &crtc->base) 1916 continue; 1917 1918 if (vlv_raw_plane_wm_compute(crtc_state, new_plane_state)) 1919 dirty |= BIT(plane->id); 1920 } 1921 1922 /* 1923 * DSPARB registers may have been reset due to the 1924 * power well being turned off. Make sure we restore 1925 * them to a consistent state even if no primary/sprite 1926 * planes are initially active. 1927 */ 1928 if (needs_modeset) 1929 crtc_state->fifo_changed = true; 1930 1931 if (!dirty) 1932 return 0; 1933 1934 /* cursor changes don't warrant a FIFO recompute */ 1935 if (dirty & ~BIT(PLANE_CURSOR)) { 1936 const struct intel_crtc_state *old_crtc_state = 1937 intel_atomic_get_old_crtc_state(state, crtc); 1938 const struct vlv_fifo_state *old_fifo_state = 1939 &old_crtc_state->wm.vlv.fifo_state; 1940 1941 ret = vlv_compute_fifo(crtc_state); 1942 if (ret) 1943 return ret; 1944 1945 if (needs_modeset || 1946 memcmp(old_fifo_state, fifo_state, 1947 sizeof(*fifo_state)) != 0) 1948 crtc_state->fifo_changed = true; 1949 } 1950 1951 /* initially allow all levels */ 1952 wm_state->num_levels = intel_wm_num_levels(dev_priv); 1953 /* 1954 * Note that enabling cxsr with no primary/sprite planes 1955 * enabled can wedge the pipe. Hence we only allow cxsr 1956 * with exactly one enabled primary/sprite plane. 1957 */ 1958 wm_state->cxsr = crtc->pipe != PIPE_C && num_active_planes == 1; 1959 1960 for (level = 0; level < wm_state->num_levels; level++) { 1961 const struct g4x_pipe_wm *raw = &crtc_state->wm.vlv.raw[level]; 1962 const int sr_fifo_size = INTEL_NUM_PIPES(dev_priv) * 512 - 1; 1963 1964 if (!vlv_raw_crtc_wm_is_valid(crtc_state, level)) 1965 break; 1966 1967 for_each_plane_id_on_crtc(crtc, plane_id) { 1968 wm_state->wm[level].plane[plane_id] = 1969 vlv_invert_wm_value(raw->plane[plane_id], 1970 fifo_state->plane[plane_id]); 1971 } 1972 1973 wm_state->sr[level].plane = 1974 vlv_invert_wm_value(max3(raw->plane[PLANE_PRIMARY], 1975 raw->plane[PLANE_SPRITE0], 1976 raw->plane[PLANE_SPRITE1]), 1977 sr_fifo_size); 1978 1979 wm_state->sr[level].cursor = 1980 vlv_invert_wm_value(raw->plane[PLANE_CURSOR], 1981 63); 1982 } 1983 1984 if (level == 0) 1985 return -EINVAL; 1986 1987 /* limit to only levels we can actually handle */ 1988 wm_state->num_levels = level; 1989 1990 /* invalidate the higher levels */ 1991 vlv_invalidate_wms(crtc, wm_state, level); 1992 1993 return 0; 1994} 1995 1996#define VLV_FIFO(plane, value) \ 1997 (((value) << DSPARB_ ## plane ## _SHIFT_VLV) & DSPARB_ ## plane ## _MASK_VLV) 1998 1999static void vlv_atomic_update_fifo(struct intel_atomic_state *state, 2000 struct intel_crtc *crtc) 2001{ 2002 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2003 struct intel_uncore *uncore = &dev_priv->uncore; 2004 const struct intel_crtc_state *crtc_state = 2005 intel_atomic_get_new_crtc_state(state, crtc); 2006 const struct vlv_fifo_state *fifo_state = 2007 &crtc_state->wm.vlv.fifo_state; 2008 int sprite0_start, sprite1_start, fifo_size; 2009 u32 dsparb, dsparb2, dsparb3; 2010 2011 if (!crtc_state->fifo_changed) 2012 return; 2013 2014 sprite0_start = fifo_state->plane[PLANE_PRIMARY]; 2015 sprite1_start = fifo_state->plane[PLANE_SPRITE0] + sprite0_start; 2016 fifo_size = fifo_state->plane[PLANE_SPRITE1] + sprite1_start; 2017 2018 drm_WARN_ON(&dev_priv->drm, fifo_state->plane[PLANE_CURSOR] != 63); 2019 drm_WARN_ON(&dev_priv->drm, fifo_size != 511); 2020 2021 trace_vlv_fifo_size(crtc, sprite0_start, sprite1_start, fifo_size); 2022 2023 /* 2024 * uncore.lock serves a double purpose here. It allows us to 2025 * use the less expensive I915_{READ,WRITE}_FW() functions, and 2026 * it protects the DSPARB registers from getting clobbered by 2027 * parallel updates from multiple pipes. 2028 * 2029 * intel_pipe_update_start() has already disabled interrupts 2030 * for us, so a plain spin_lock() is sufficient here. 2031 */ 2032 spin_lock(&uncore->lock); 2033 2034 switch (crtc->pipe) { 2035 case PIPE_A: 2036 dsparb = intel_uncore_read_fw(uncore, DSPARB); 2037 dsparb2 = intel_uncore_read_fw(uncore, DSPARB2); 2038 2039 dsparb &= ~(VLV_FIFO(SPRITEA, 0xff) | 2040 VLV_FIFO(SPRITEB, 0xff)); 2041 dsparb |= (VLV_FIFO(SPRITEA, sprite0_start) | 2042 VLV_FIFO(SPRITEB, sprite1_start)); 2043 2044 dsparb2 &= ~(VLV_FIFO(SPRITEA_HI, 0x1) | 2045 VLV_FIFO(SPRITEB_HI, 0x1)); 2046 dsparb2 |= (VLV_FIFO(SPRITEA_HI, sprite0_start >> 8) | 2047 VLV_FIFO(SPRITEB_HI, sprite1_start >> 8)); 2048 2049 intel_uncore_write_fw(uncore, DSPARB, dsparb); 2050 intel_uncore_write_fw(uncore, DSPARB2, dsparb2); 2051 break; 2052 case PIPE_B: 2053 dsparb = intel_uncore_read_fw(uncore, DSPARB); 2054 dsparb2 = intel_uncore_read_fw(uncore, DSPARB2); 2055 2056 dsparb &= ~(VLV_FIFO(SPRITEC, 0xff) | 2057 VLV_FIFO(SPRITED, 0xff)); 2058 dsparb |= (VLV_FIFO(SPRITEC, sprite0_start) | 2059 VLV_FIFO(SPRITED, sprite1_start)); 2060 2061 dsparb2 &= ~(VLV_FIFO(SPRITEC_HI, 0xff) | 2062 VLV_FIFO(SPRITED_HI, 0xff)); 2063 dsparb2 |= (VLV_FIFO(SPRITEC_HI, sprite0_start >> 8) | 2064 VLV_FIFO(SPRITED_HI, sprite1_start >> 8)); 2065 2066 intel_uncore_write_fw(uncore, DSPARB, dsparb); 2067 intel_uncore_write_fw(uncore, DSPARB2, dsparb2); 2068 break; 2069 case PIPE_C: 2070 dsparb3 = intel_uncore_read_fw(uncore, DSPARB3); 2071 dsparb2 = intel_uncore_read_fw(uncore, DSPARB2); 2072 2073 dsparb3 &= ~(VLV_FIFO(SPRITEE, 0xff) | 2074 VLV_FIFO(SPRITEF, 0xff)); 2075 dsparb3 |= (VLV_FIFO(SPRITEE, sprite0_start) | 2076 VLV_FIFO(SPRITEF, sprite1_start)); 2077 2078 dsparb2 &= ~(VLV_FIFO(SPRITEE_HI, 0xff) | 2079 VLV_FIFO(SPRITEF_HI, 0xff)); 2080 dsparb2 |= (VLV_FIFO(SPRITEE_HI, sprite0_start >> 8) | 2081 VLV_FIFO(SPRITEF_HI, sprite1_start >> 8)); 2082 2083 intel_uncore_write_fw(uncore, DSPARB3, dsparb3); 2084 intel_uncore_write_fw(uncore, DSPARB2, dsparb2); 2085 break; 2086 default: 2087 break; 2088 } 2089 2090 intel_uncore_posting_read_fw(uncore, DSPARB); 2091 2092 spin_unlock(&uncore->lock); 2093} 2094 2095#undef VLV_FIFO 2096 2097static int vlv_compute_intermediate_wm(struct intel_crtc_state *new_crtc_state) 2098{ 2099 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); 2100 struct vlv_wm_state *intermediate = &new_crtc_state->wm.vlv.intermediate; 2101 const struct vlv_wm_state *optimal = &new_crtc_state->wm.vlv.optimal; 2102 struct intel_atomic_state *intel_state = 2103 to_intel_atomic_state(new_crtc_state->uapi.state); 2104 const struct intel_crtc_state *old_crtc_state = 2105 intel_atomic_get_old_crtc_state(intel_state, crtc); 2106 const struct vlv_wm_state *active = &old_crtc_state->wm.vlv.optimal; 2107 int level; 2108 2109 if (!new_crtc_state->hw.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { 2110 *intermediate = *optimal; 2111 2112 intermediate->cxsr = false; 2113 goto out; 2114 } 2115 2116 intermediate->num_levels = min(optimal->num_levels, active->num_levels); 2117 intermediate->cxsr = optimal->cxsr && active->cxsr && 2118 !new_crtc_state->disable_cxsr; 2119 2120 for (level = 0; level < intermediate->num_levels; level++) { 2121 enum plane_id plane_id; 2122 2123 for_each_plane_id_on_crtc(crtc, plane_id) { 2124 intermediate->wm[level].plane[plane_id] = 2125 min(optimal->wm[level].plane[plane_id], 2126 active->wm[level].plane[plane_id]); 2127 } 2128 2129 intermediate->sr[level].plane = min(optimal->sr[level].plane, 2130 active->sr[level].plane); 2131 intermediate->sr[level].cursor = min(optimal->sr[level].cursor, 2132 active->sr[level].cursor); 2133 } 2134 2135 vlv_invalidate_wms(crtc, intermediate, level); 2136 2137out: 2138 /* 2139 * If our intermediate WM are identical to the final WM, then we can 2140 * omit the post-vblank programming; only update if it's different. 2141 */ 2142 if (memcmp(intermediate, optimal, sizeof(*intermediate)) != 0) 2143 new_crtc_state->wm.need_postvbl_update = true; 2144 2145 return 0; 2146} 2147 2148static void vlv_merge_wm(struct drm_i915_private *dev_priv, 2149 struct vlv_wm_values *wm) 2150{ 2151 struct intel_crtc *crtc; 2152 int num_active_pipes = 0; 2153 2154 wm->level = dev_priv->wm.max_level; 2155 wm->cxsr = true; 2156 2157 for_each_intel_crtc(&dev_priv->drm, crtc) { 2158 const struct vlv_wm_state *wm_state = &crtc->wm.active.vlv; 2159 2160 if (!crtc->active) 2161 continue; 2162 2163 if (!wm_state->cxsr) 2164 wm->cxsr = false; 2165 2166 num_active_pipes++; 2167 wm->level = min_t(int, wm->level, wm_state->num_levels - 1); 2168 } 2169 2170 if (num_active_pipes != 1) 2171 wm->cxsr = false; 2172 2173 if (num_active_pipes > 1) 2174 wm->level = VLV_WM_LEVEL_PM2; 2175 2176 for_each_intel_crtc(&dev_priv->drm, crtc) { 2177 const struct vlv_wm_state *wm_state = &crtc->wm.active.vlv; 2178 enum pipe pipe = crtc->pipe; 2179 2180 wm->pipe[pipe] = wm_state->wm[wm->level]; 2181 if (crtc->active && wm->cxsr) 2182 wm->sr = wm_state->sr[wm->level]; 2183 2184 wm->ddl[pipe].plane[PLANE_PRIMARY] = DDL_PRECISION_HIGH | 2; 2185 wm->ddl[pipe].plane[PLANE_SPRITE0] = DDL_PRECISION_HIGH | 2; 2186 wm->ddl[pipe].plane[PLANE_SPRITE1] = DDL_PRECISION_HIGH | 2; 2187 wm->ddl[pipe].plane[PLANE_CURSOR] = DDL_PRECISION_HIGH | 2; 2188 } 2189} 2190 2191static void vlv_program_watermarks(struct drm_i915_private *dev_priv) 2192{ 2193 struct vlv_wm_values *old_wm = &dev_priv->wm.vlv; 2194 struct vlv_wm_values new_wm = {}; 2195 2196 vlv_merge_wm(dev_priv, &new_wm); 2197 2198 if (memcmp(old_wm, &new_wm, sizeof(new_wm)) == 0) 2199 return; 2200 2201 if (is_disabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_DDR_DVFS)) 2202 chv_set_memory_dvfs(dev_priv, false); 2203 2204 if (is_disabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_PM5)) 2205 chv_set_memory_pm5(dev_priv, false); 2206 2207 if (is_disabling(old_wm->cxsr, new_wm.cxsr, true)) 2208 _intel_set_memory_cxsr(dev_priv, false); 2209 2210 vlv_write_wm_values(dev_priv, &new_wm); 2211 2212 if (is_enabling(old_wm->cxsr, new_wm.cxsr, true)) 2213 _intel_set_memory_cxsr(dev_priv, true); 2214 2215 if (is_enabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_PM5)) 2216 chv_set_memory_pm5(dev_priv, true); 2217 2218 if (is_enabling(old_wm->level, new_wm.level, VLV_WM_LEVEL_DDR_DVFS)) 2219 chv_set_memory_dvfs(dev_priv, true); 2220 2221 *old_wm = new_wm; 2222} 2223 2224static void vlv_initial_watermarks(struct intel_atomic_state *state, 2225 struct intel_crtc *crtc) 2226{ 2227 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2228 const struct intel_crtc_state *crtc_state = 2229 intel_atomic_get_new_crtc_state(state, crtc); 2230 2231 mutex_lock(&dev_priv->wm.wm_mutex); 2232 crtc->wm.active.vlv = crtc_state->wm.vlv.intermediate; 2233 vlv_program_watermarks(dev_priv); 2234 mutex_unlock(&dev_priv->wm.wm_mutex); 2235} 2236 2237static void vlv_optimize_watermarks(struct intel_atomic_state *state, 2238 struct intel_crtc *crtc) 2239{ 2240 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2241 const struct intel_crtc_state *crtc_state = 2242 intel_atomic_get_new_crtc_state(state, crtc); 2243 2244 if (!crtc_state->wm.need_postvbl_update) 2245 return; 2246 2247 mutex_lock(&dev_priv->wm.wm_mutex); 2248 crtc->wm.active.vlv = crtc_state->wm.vlv.optimal; 2249 vlv_program_watermarks(dev_priv); 2250 mutex_unlock(&dev_priv->wm.wm_mutex); 2251} 2252 2253static void i965_update_wm(struct intel_crtc *unused_crtc) 2254{ 2255 struct drm_i915_private *dev_priv = to_i915(unused_crtc->base.dev); 2256 struct intel_crtc *crtc; 2257 int srwm = 1; 2258 int cursor_sr = 16; 2259 bool cxsr_enabled; 2260 2261 /* Calc sr entries for one plane configs */ 2262 crtc = single_enabled_crtc(dev_priv); 2263 if (crtc) { 2264 /* self-refresh has much higher latency */ 2265 static const int sr_latency_ns = 12000; 2266 const struct drm_display_mode *pipe_mode = 2267 &crtc->config->hw.pipe_mode; 2268 const struct drm_framebuffer *fb = 2269 crtc->base.primary->state->fb; 2270 int clock = pipe_mode->crtc_clock; 2271 int htotal = pipe_mode->crtc_htotal; 2272 int hdisplay = crtc->config->pipe_src_w; 2273 int cpp = fb->format->cpp[0]; 2274 int entries; 2275 2276 entries = intel_wm_method2(clock, htotal, 2277 hdisplay, cpp, sr_latency_ns / 100); 2278 entries = DIV_ROUND_UP(entries, I915_FIFO_LINE_SIZE); 2279 srwm = I965_FIFO_SIZE - entries; 2280 if (srwm < 0) 2281 srwm = 1; 2282 srwm &= 0x1ff; 2283 drm_dbg_kms(&dev_priv->drm, 2284 "self-refresh entries: %d, wm: %d\n", 2285 entries, srwm); 2286 2287 entries = intel_wm_method2(clock, htotal, 2288 crtc->base.cursor->state->crtc_w, 4, 2289 sr_latency_ns / 100); 2290 entries = DIV_ROUND_UP(entries, 2291 i965_cursor_wm_info.cacheline_size) + 2292 i965_cursor_wm_info.guard_size; 2293 2294 cursor_sr = i965_cursor_wm_info.fifo_size - entries; 2295 if (cursor_sr > i965_cursor_wm_info.max_wm) 2296 cursor_sr = i965_cursor_wm_info.max_wm; 2297 2298 drm_dbg_kms(&dev_priv->drm, 2299 "self-refresh watermark: display plane %d " 2300 "cursor %d\n", srwm, cursor_sr); 2301 2302 cxsr_enabled = true; 2303 } else { 2304 cxsr_enabled = false; 2305 /* Turn off self refresh if both pipes are enabled */ 2306 intel_set_memory_cxsr(dev_priv, false); 2307 } 2308 2309 drm_dbg_kms(&dev_priv->drm, 2310 "Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", 2311 srwm); 2312 2313 /* 965 has limitations... */ 2314 intel_uncore_write(&dev_priv->uncore, DSPFW1, FW_WM(srwm, SR) | 2315 FW_WM(8, CURSORB) | 2316 FW_WM(8, PLANEB) | 2317 FW_WM(8, PLANEA)); 2318 intel_uncore_write(&dev_priv->uncore, DSPFW2, FW_WM(8, CURSORA) | 2319 FW_WM(8, PLANEC_OLD)); 2320 /* update cursor SR watermark */ 2321 intel_uncore_write(&dev_priv->uncore, DSPFW3, FW_WM(cursor_sr, CURSOR_SR)); 2322 2323 if (cxsr_enabled) 2324 intel_set_memory_cxsr(dev_priv, true); 2325} 2326 2327#undef FW_WM 2328 2329static void i9xx_update_wm(struct intel_crtc *unused_crtc) 2330{ 2331 struct drm_i915_private *dev_priv = to_i915(unused_crtc->base.dev); 2332 const struct intel_watermark_params *wm_info; 2333 u32 fwater_lo; 2334 u32 fwater_hi; 2335 int cwm, srwm = 1; 2336 int fifo_size; 2337 int planea_wm, planeb_wm; 2338 struct intel_crtc *crtc, *enabled = NULL; 2339 2340 if (IS_I945GM(dev_priv)) 2341 wm_info = &i945_wm_info; 2342 else if (!IS_DISPLAY_VER(dev_priv, 2)) 2343 wm_info = &i915_wm_info; 2344 else 2345 wm_info = &i830_a_wm_info; 2346 2347 fifo_size = dev_priv->display.get_fifo_size(dev_priv, PLANE_A); 2348 crtc = intel_get_crtc_for_plane(dev_priv, PLANE_A); 2349 if (intel_crtc_active(crtc)) { 2350 const struct drm_display_mode *pipe_mode = 2351 &crtc->config->hw.pipe_mode; 2352 const struct drm_framebuffer *fb = 2353 crtc->base.primary->state->fb; 2354 int cpp; 2355 2356 if (IS_DISPLAY_VER(dev_priv, 2)) 2357 cpp = 4; 2358 else 2359 cpp = fb->format->cpp[0]; 2360 2361 planea_wm = intel_calculate_wm(pipe_mode->crtc_clock, 2362 wm_info, fifo_size, cpp, 2363 pessimal_latency_ns); 2364 enabled = crtc; 2365 } else { 2366 planea_wm = fifo_size - wm_info->guard_size; 2367 if (planea_wm > (long)wm_info->max_wm) 2368 planea_wm = wm_info->max_wm; 2369 } 2370 2371 if (IS_DISPLAY_VER(dev_priv, 2)) 2372 wm_info = &i830_bc_wm_info; 2373 2374 fifo_size = dev_priv->display.get_fifo_size(dev_priv, PLANE_B); 2375 crtc = intel_get_crtc_for_plane(dev_priv, PLANE_B); 2376 if (intel_crtc_active(crtc)) { 2377 const struct drm_display_mode *pipe_mode = 2378 &crtc->config->hw.pipe_mode; 2379 const struct drm_framebuffer *fb = 2380 crtc->base.primary->state->fb; 2381 int cpp; 2382 2383 if (IS_DISPLAY_VER(dev_priv, 2)) 2384 cpp = 4; 2385 else 2386 cpp = fb->format->cpp[0]; 2387 2388 planeb_wm = intel_calculate_wm(pipe_mode->crtc_clock, 2389 wm_info, fifo_size, cpp, 2390 pessimal_latency_ns); 2391 if (enabled == NULL) 2392 enabled = crtc; 2393 else 2394 enabled = NULL; 2395 } else { 2396 planeb_wm = fifo_size - wm_info->guard_size; 2397 if (planeb_wm > (long)wm_info->max_wm) 2398 planeb_wm = wm_info->max_wm; 2399 } 2400 2401 drm_dbg_kms(&dev_priv->drm, 2402 "FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); 2403 2404 if (IS_I915GM(dev_priv) && enabled) { 2405 struct drm_i915_gem_object *obj; 2406 2407 obj = intel_fb_obj(enabled->base.primary->state->fb); 2408 2409 /* self-refresh seems busted with untiled */ 2410 if (!i915_gem_object_is_tiled(obj)) 2411 enabled = NULL; 2412 } 2413 2414 /* 2415 * Overlay gets an aggressive default since video jitter is bad. 2416 */ 2417 cwm = 2; 2418 2419 /* Play safe and disable self-refresh before adjusting watermarks. */ 2420 intel_set_memory_cxsr(dev_priv, false); 2421 2422 /* Calc sr entries for one plane configs */ 2423 if (HAS_FW_BLC(dev_priv) && enabled) { 2424 /* self-refresh has much higher latency */ 2425 static const int sr_latency_ns = 6000; 2426 const struct drm_display_mode *pipe_mode = 2427 &enabled->config->hw.pipe_mode; 2428 const struct drm_framebuffer *fb = 2429 enabled->base.primary->state->fb; 2430 int clock = pipe_mode->crtc_clock; 2431 int htotal = pipe_mode->crtc_htotal; 2432 int hdisplay = enabled->config->pipe_src_w; 2433 int cpp; 2434 int entries; 2435 2436 if (IS_I915GM(dev_priv) || IS_I945GM(dev_priv)) 2437 cpp = 4; 2438 else 2439 cpp = fb->format->cpp[0]; 2440 2441 entries = intel_wm_method2(clock, htotal, hdisplay, cpp, 2442 sr_latency_ns / 100); 2443 entries = DIV_ROUND_UP(entries, wm_info->cacheline_size); 2444 drm_dbg_kms(&dev_priv->drm, 2445 "self-refresh entries: %d\n", entries); 2446 srwm = wm_info->fifo_size - entries; 2447 if (srwm < 0) 2448 srwm = 1; 2449 2450 if (IS_I945G(dev_priv) || IS_I945GM(dev_priv)) 2451 intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, 2452 FW_BLC_SELF_FIFO_MASK | (srwm & 0xff)); 2453 else 2454 intel_uncore_write(&dev_priv->uncore, FW_BLC_SELF, srwm & 0x3f); 2455 } 2456 2457 drm_dbg_kms(&dev_priv->drm, 2458 "Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", 2459 planea_wm, planeb_wm, cwm, srwm); 2460 2461 fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f); 2462 fwater_hi = (cwm & 0x1f); 2463 2464 /* Set request length to 8 cachelines per fetch */ 2465 fwater_lo = fwater_lo | (1 << 24) | (1 << 8); 2466 fwater_hi = fwater_hi | (1 << 8); 2467 2468 intel_uncore_write(&dev_priv->uncore, FW_BLC, fwater_lo); 2469 intel_uncore_write(&dev_priv->uncore, FW_BLC2, fwater_hi); 2470 2471 if (enabled) 2472 intel_set_memory_cxsr(dev_priv, true); 2473} 2474 2475static void i845_update_wm(struct intel_crtc *unused_crtc) 2476{ 2477 struct drm_i915_private *dev_priv = to_i915(unused_crtc->base.dev); 2478 struct intel_crtc *crtc; 2479 const struct drm_display_mode *pipe_mode; 2480 u32 fwater_lo; 2481 int planea_wm; 2482 2483 crtc = single_enabled_crtc(dev_priv); 2484 if (crtc == NULL) 2485 return; 2486 2487 pipe_mode = &crtc->config->hw.pipe_mode; 2488 planea_wm = intel_calculate_wm(pipe_mode->crtc_clock, 2489 &i845_wm_info, 2490 dev_priv->display.get_fifo_size(dev_priv, PLANE_A), 2491 4, pessimal_latency_ns); 2492 fwater_lo = intel_uncore_read(&dev_priv->uncore, FW_BLC) & ~0xfff; 2493 fwater_lo |= (3<<8) | planea_wm; 2494 2495 drm_dbg_kms(&dev_priv->drm, 2496 "Setting FIFO watermarks - A: %d\n", planea_wm); 2497 2498 intel_uncore_write(&dev_priv->uncore, FW_BLC, fwater_lo); 2499} 2500 2501/* latency must be in 0.1us units. */ 2502static unsigned int ilk_wm_method1(unsigned int pixel_rate, 2503 unsigned int cpp, 2504 unsigned int latency) 2505{ 2506 unsigned int ret; 2507 2508 ret = intel_wm_method1(pixel_rate, cpp, latency); 2509 ret = DIV_ROUND_UP(ret, 64) + 2; 2510 2511 return ret; 2512} 2513 2514/* latency must be in 0.1us units. */ 2515static unsigned int ilk_wm_method2(unsigned int pixel_rate, 2516 unsigned int htotal, 2517 unsigned int width, 2518 unsigned int cpp, 2519 unsigned int latency) 2520{ 2521 unsigned int ret; 2522 2523 ret = intel_wm_method2(pixel_rate, htotal, 2524 width, cpp, latency); 2525 ret = DIV_ROUND_UP(ret, 64) + 2; 2526 2527 return ret; 2528} 2529 2530static u32 ilk_wm_fbc(u32 pri_val, u32 horiz_pixels, u8 cpp) 2531{ 2532 /* 2533 * Neither of these should be possible since this function shouldn't be 2534 * called if the CRTC is off or the plane is invisible. But let's be 2535 * extra paranoid to avoid a potential divide-by-zero if we screw up 2536 * elsewhere in the driver. 2537 */ 2538 if (WARN_ON(!cpp)) 2539 return 0; 2540 if (WARN_ON(!horiz_pixels)) 2541 return 0; 2542 2543 return DIV_ROUND_UP(pri_val * 64, horiz_pixels * cpp) + 2; 2544} 2545 2546struct ilk_wm_maximums { 2547 u16 pri; 2548 u16 spr; 2549 u16 cur; 2550 u16 fbc; 2551}; 2552 2553/* 2554 * For both WM_PIPE and WM_LP. 2555 * mem_value must be in 0.1us units. 2556 */ 2557static u32 ilk_compute_pri_wm(const struct intel_crtc_state *crtc_state, 2558 const struct intel_plane_state *plane_state, 2559 u32 mem_value, bool is_lp) 2560{ 2561 u32 method1, method2; 2562 int cpp; 2563 2564 if (mem_value == 0) 2565 return U32_MAX; 2566 2567 if (!intel_wm_plane_visible(crtc_state, plane_state)) 2568 return 0; 2569 2570 cpp = plane_state->hw.fb->format->cpp[0]; 2571 2572 method1 = ilk_wm_method1(crtc_state->pixel_rate, cpp, mem_value); 2573 2574 if (!is_lp) 2575 return method1; 2576 2577 method2 = ilk_wm_method2(crtc_state->pixel_rate, 2578 crtc_state->hw.pipe_mode.crtc_htotal, 2579 drm_rect_width(&plane_state->uapi.dst), 2580 cpp, mem_value); 2581 2582 return min(method1, method2); 2583} 2584 2585/* 2586 * For both WM_PIPE and WM_LP. 2587 * mem_value must be in 0.1us units. 2588 */ 2589static u32 ilk_compute_spr_wm(const struct intel_crtc_state *crtc_state, 2590 const struct intel_plane_state *plane_state, 2591 u32 mem_value) 2592{ 2593 u32 method1, method2; 2594 int cpp; 2595 2596 if (mem_value == 0) 2597 return U32_MAX; 2598 2599 if (!intel_wm_plane_visible(crtc_state, plane_state)) 2600 return 0; 2601 2602 cpp = plane_state->hw.fb->format->cpp[0]; 2603 2604 method1 = ilk_wm_method1(crtc_state->pixel_rate, cpp, mem_value); 2605 method2 = ilk_wm_method2(crtc_state->pixel_rate, 2606 crtc_state->hw.pipe_mode.crtc_htotal, 2607 drm_rect_width(&plane_state->uapi.dst), 2608 cpp, mem_value); 2609 return min(method1, method2); 2610} 2611 2612/* 2613 * For both WM_PIPE and WM_LP. 2614 * mem_value must be in 0.1us units. 2615 */ 2616static u32 ilk_compute_cur_wm(const struct intel_crtc_state *crtc_state, 2617 const struct intel_plane_state *plane_state, 2618 u32 mem_value) 2619{ 2620 int cpp; 2621 2622 if (mem_value == 0) 2623 return U32_MAX; 2624 2625 if (!intel_wm_plane_visible(crtc_state, plane_state)) 2626 return 0; 2627 2628 cpp = plane_state->hw.fb->format->cpp[0]; 2629 2630 return ilk_wm_method2(crtc_state->pixel_rate, 2631 crtc_state->hw.pipe_mode.crtc_htotal, 2632 drm_rect_width(&plane_state->uapi.dst), 2633 cpp, mem_value); 2634} 2635 2636/* Only for WM_LP. */ 2637static u32 ilk_compute_fbc_wm(const struct intel_crtc_state *crtc_state, 2638 const struct intel_plane_state *plane_state, 2639 u32 pri_val) 2640{ 2641 int cpp; 2642 2643 if (!intel_wm_plane_visible(crtc_state, plane_state)) 2644 return 0; 2645 2646 cpp = plane_state->hw.fb->format->cpp[0]; 2647 2648 return ilk_wm_fbc(pri_val, drm_rect_width(&plane_state->uapi.dst), 2649 cpp); 2650} 2651 2652static unsigned int 2653ilk_display_fifo_size(const struct drm_i915_private *dev_priv) 2654{ 2655 if (DISPLAY_VER(dev_priv) >= 8) 2656 return 3072; 2657 else if (DISPLAY_VER(dev_priv) >= 7) 2658 return 768; 2659 else 2660 return 512; 2661} 2662 2663static unsigned int 2664ilk_plane_wm_reg_max(const struct drm_i915_private *dev_priv, 2665 int level, bool is_sprite) 2666{ 2667 if (DISPLAY_VER(dev_priv) >= 8) 2668 /* BDW primary/sprite plane watermarks */ 2669 return level == 0 ? 255 : 2047; 2670 else if (DISPLAY_VER(dev_priv) >= 7) 2671 /* IVB/HSW primary/sprite plane watermarks */ 2672 return level == 0 ? 127 : 1023; 2673 else if (!is_sprite) 2674 /* ILK/SNB primary plane watermarks */ 2675 return level == 0 ? 127 : 511; 2676 else 2677 /* ILK/SNB sprite plane watermarks */ 2678 return level == 0 ? 63 : 255; 2679} 2680 2681static unsigned int 2682ilk_cursor_wm_reg_max(const struct drm_i915_private *dev_priv, int level) 2683{ 2684 if (DISPLAY_VER(dev_priv) >= 7) 2685 return level == 0 ? 63 : 255; 2686 else 2687 return level == 0 ? 31 : 63; 2688} 2689 2690static unsigned int ilk_fbc_wm_reg_max(const struct drm_i915_private *dev_priv) 2691{ 2692 if (DISPLAY_VER(dev_priv) >= 8) 2693 return 31; 2694 else 2695 return 15; 2696} 2697 2698/* Calculate the maximum primary/sprite plane watermark */ 2699static unsigned int ilk_plane_wm_max(const struct drm_i915_private *dev_priv, 2700 int level, 2701 const struct intel_wm_config *config, 2702 enum intel_ddb_partitioning ddb_partitioning, 2703 bool is_sprite) 2704{ 2705 unsigned int fifo_size = ilk_display_fifo_size(dev_priv); 2706 2707 /* if sprites aren't enabled, sprites get nothing */ 2708 if (is_sprite && !config->sprites_enabled) 2709 return 0; 2710 2711 /* HSW allows LP1+ watermarks even with multiple pipes */ 2712 if (level == 0 || config->num_pipes_active > 1) { 2713 fifo_size /= INTEL_NUM_PIPES(dev_priv); 2714 2715 /* 2716 * For some reason the non self refresh 2717 * FIFO size is only half of the self 2718 * refresh FIFO size on ILK/SNB. 2719 */ 2720 if (DISPLAY_VER(dev_priv) <= 6) 2721 fifo_size /= 2; 2722 } 2723 2724 if (config->sprites_enabled) { 2725 /* level 0 is always calculated with 1:1 split */ 2726 if (level > 0 && ddb_partitioning == INTEL_DDB_PART_5_6) { 2727 if (is_sprite) 2728 fifo_size *= 5; 2729 fifo_size /= 6; 2730 } else { 2731 fifo_size /= 2; 2732 } 2733 } 2734 2735 /* clamp to max that the registers can hold */ 2736 return min(fifo_size, ilk_plane_wm_reg_max(dev_priv, level, is_sprite)); 2737} 2738 2739/* Calculate the maximum cursor plane watermark */ 2740static unsigned int ilk_cursor_wm_max(const struct drm_i915_private *dev_priv, 2741 int level, 2742 const struct intel_wm_config *config) 2743{ 2744 /* HSW LP1+ watermarks w/ multiple pipes */ 2745 if (level > 0 && config->num_pipes_active > 1) 2746 return 64; 2747 2748 /* otherwise just report max that registers can hold */ 2749 return ilk_cursor_wm_reg_max(dev_priv, level); 2750} 2751 2752static void ilk_compute_wm_maximums(const struct drm_i915_private *dev_priv, 2753 int level, 2754 const struct intel_wm_config *config, 2755 enum intel_ddb_partitioning ddb_partitioning, 2756 struct ilk_wm_maximums *max) 2757{ 2758 max->pri = ilk_plane_wm_max(dev_priv, level, config, ddb_partitioning, false); 2759 max->spr = ilk_plane_wm_max(dev_priv, level, config, ddb_partitioning, true); 2760 max->cur = ilk_cursor_wm_max(dev_priv, level, config); 2761 max->fbc = ilk_fbc_wm_reg_max(dev_priv); 2762} 2763 2764static void ilk_compute_wm_reg_maximums(const struct drm_i915_private *dev_priv, 2765 int level, 2766 struct ilk_wm_maximums *max) 2767{ 2768 max->pri = ilk_plane_wm_reg_max(dev_priv, level, false); 2769 max->spr = ilk_plane_wm_reg_max(dev_priv, level, true); 2770 max->cur = ilk_cursor_wm_reg_max(dev_priv, level); 2771 max->fbc = ilk_fbc_wm_reg_max(dev_priv); 2772} 2773 2774static bool ilk_validate_wm_level(int level, 2775 const struct ilk_wm_maximums *max, 2776 struct intel_wm_level *result) 2777{ 2778 bool ret; 2779 2780 /* already determined to be invalid? */ 2781 if (!result->enable) 2782 return false; 2783 2784 result->enable = result->pri_val <= max->pri && 2785 result->spr_val <= max->spr && 2786 result->cur_val <= max->cur; 2787 2788 ret = result->enable; 2789 2790 /* 2791 * HACK until we can pre-compute everything, 2792 * and thus fail gracefully if LP0 watermarks 2793 * are exceeded... 2794 */ 2795 if (level == 0 && !result->enable) { 2796 if (result->pri_val > max->pri) 2797 DRM_DEBUG_KMS("Primary WM%d too large %u (max %u)\n", 2798 level, result->pri_val, max->pri); 2799 if (result->spr_val > max->spr) 2800 DRM_DEBUG_KMS("Sprite WM%d too large %u (max %u)\n", 2801 level, result->spr_val, max->spr); 2802 if (result->cur_val > max->cur) 2803 DRM_DEBUG_KMS("Cursor WM%d too large %u (max %u)\n", 2804 level, result->cur_val, max->cur); 2805 2806 result->pri_val = min_t(u32, result->pri_val, max->pri); 2807 result->spr_val = min_t(u32, result->spr_val, max->spr); 2808 result->cur_val = min_t(u32, result->cur_val, max->cur); 2809 result->enable = true; 2810 } 2811 2812 return ret; 2813} 2814 2815static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv, 2816 const struct intel_crtc *crtc, 2817 int level, 2818 struct intel_crtc_state *crtc_state, 2819 const struct intel_plane_state *pristate, 2820 const struct intel_plane_state *sprstate, 2821 const struct intel_plane_state *curstate, 2822 struct intel_wm_level *result) 2823{ 2824 u16 pri_latency = dev_priv->wm.pri_latency[level]; 2825 u16 spr_latency = dev_priv->wm.spr_latency[level]; 2826 u16 cur_latency = dev_priv->wm.cur_latency[level]; 2827 2828 /* WM1+ latency values stored in 0.5us units */ 2829 if (level > 0) { 2830 pri_latency *= 5; 2831 spr_latency *= 5; 2832 cur_latency *= 5; 2833 } 2834 2835 if (pristate) { 2836 result->pri_val = ilk_compute_pri_wm(crtc_state, pristate, 2837 pri_latency, level); 2838 result->fbc_val = ilk_compute_fbc_wm(crtc_state, pristate, result->pri_val); 2839 } 2840 2841 if (sprstate) 2842 result->spr_val = ilk_compute_spr_wm(crtc_state, sprstate, spr_latency); 2843 2844 if (curstate) 2845 result->cur_val = ilk_compute_cur_wm(crtc_state, curstate, cur_latency); 2846 2847 result->enable = true; 2848} 2849 2850static void intel_read_wm_latency(struct drm_i915_private *dev_priv, 2851 u16 wm[8]) 2852{ 2853 struct intel_uncore *uncore = &dev_priv->uncore; 2854 2855 if (DISPLAY_VER(dev_priv) >= 9) { 2856 u32 val; 2857 int ret, i; 2858 int level, max_level = ilk_wm_max_level(dev_priv); 2859 2860 /* read the first set of memory latencies[0:3] */ 2861 val = 0; /* data0 to be programmed to 0 for first set */ 2862 ret = sandybridge_pcode_read(dev_priv, 2863 GEN9_PCODE_READ_MEM_LATENCY, 2864 &val, NULL); 2865 2866 if (ret) { 2867 drm_err(&dev_priv->drm, 2868 "SKL Mailbox read error = %d\n", ret); 2869 return; 2870 } 2871 2872 wm[0] = val & GEN9_MEM_LATENCY_LEVEL_MASK; 2873 wm[1] = (val >> GEN9_MEM_LATENCY_LEVEL_1_5_SHIFT) & 2874 GEN9_MEM_LATENCY_LEVEL_MASK; 2875 wm[2] = (val >> GEN9_MEM_LATENCY_LEVEL_2_6_SHIFT) & 2876 GEN9_MEM_LATENCY_LEVEL_MASK; 2877 wm[3] = (val >> GEN9_MEM_LATENCY_LEVEL_3_7_SHIFT) & 2878 GEN9_MEM_LATENCY_LEVEL_MASK; 2879 2880 /* read the second set of memory latencies[4:7] */ 2881 val = 1; /* data0 to be programmed to 1 for second set */ 2882 ret = sandybridge_pcode_read(dev_priv, 2883 GEN9_PCODE_READ_MEM_LATENCY, 2884 &val, NULL); 2885 if (ret) { 2886 drm_err(&dev_priv->drm, 2887 "SKL Mailbox read error = %d\n", ret); 2888 return; 2889 } 2890 2891 wm[4] = val & GEN9_MEM_LATENCY_LEVEL_MASK; 2892 wm[5] = (val >> GEN9_MEM_LATENCY_LEVEL_1_5_SHIFT) & 2893 GEN9_MEM_LATENCY_LEVEL_MASK; 2894 wm[6] = (val >> GEN9_MEM_LATENCY_LEVEL_2_6_SHIFT) & 2895 GEN9_MEM_LATENCY_LEVEL_MASK; 2896 wm[7] = (val >> GEN9_MEM_LATENCY_LEVEL_3_7_SHIFT) & 2897 GEN9_MEM_LATENCY_LEVEL_MASK; 2898 2899 /* 2900 * If a level n (n > 1) has a 0us latency, all levels m (m >= n) 2901 * need to be disabled. We make sure to sanitize the values out 2902 * of the punit to satisfy this requirement. 2903 */ 2904 for (level = 1; level <= max_level; level++) { 2905 if (wm[level] == 0) { 2906 for (i = level + 1; i <= max_level; i++) 2907 wm[i] = 0; 2908 break; 2909 } 2910 } 2911 2912 /* 2913 * WaWmMemoryReadLatency:skl+,glk 2914 * 2915 * punit doesn't take into account the read latency so we need 2916 * to add 2us to the various latency levels we retrieve from the 2917 * punit when level 0 response data us 0us. 2918 */ 2919 if (wm[0] == 0) { 2920 wm[0] += 2; 2921 for (level = 1; level <= max_level; level++) { 2922 if (wm[level] == 0) 2923 break; 2924 wm[level] += 2; 2925 } 2926 } 2927 2928 /* 2929 * WA Level-0 adjustment for 16GB DIMMs: SKL+ 2930 * If we could not get dimm info enable this WA to prevent from 2931 * any underrun. If not able to get Dimm info assume 16GB dimm 2932 * to avoid any underrun. 2933 */ 2934 if (dev_priv->dram_info.wm_lv_0_adjust_needed) 2935 wm[0] += 1; 2936 2937 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 2938 u64 sskpd = intel_uncore_read64(uncore, MCH_SSKPD); 2939 2940 wm[0] = (sskpd >> 56) & 0xFF; 2941 if (wm[0] == 0) 2942 wm[0] = sskpd & 0xF; 2943 wm[1] = (sskpd >> 4) & 0xFF; 2944 wm[2] = (sskpd >> 12) & 0xFF; 2945 wm[3] = (sskpd >> 20) & 0x1FF; 2946 wm[4] = (sskpd >> 32) & 0x1FF; 2947 } else if (DISPLAY_VER(dev_priv) >= 6) { 2948 u32 sskpd = intel_uncore_read(uncore, MCH_SSKPD); 2949 2950 wm[0] = (sskpd >> SSKPD_WM0_SHIFT) & SSKPD_WM_MASK; 2951 wm[1] = (sskpd >> SSKPD_WM1_SHIFT) & SSKPD_WM_MASK; 2952 wm[2] = (sskpd >> SSKPD_WM2_SHIFT) & SSKPD_WM_MASK; 2953 wm[3] = (sskpd >> SSKPD_WM3_SHIFT) & SSKPD_WM_MASK; 2954 } else if (DISPLAY_VER(dev_priv) >= 5) { 2955 u32 mltr = intel_uncore_read(uncore, MLTR_ILK); 2956 2957 /* ILK primary LP0 latency is 700 ns */ 2958 wm[0] = 7; 2959 wm[1] = (mltr >> MLTR_WM1_SHIFT) & ILK_SRLT_MASK; 2960 wm[2] = (mltr >> MLTR_WM2_SHIFT) & ILK_SRLT_MASK; 2961 } else { 2962 MISSING_CASE(INTEL_DEVID(dev_priv)); 2963 } 2964} 2965 2966static void intel_fixup_spr_wm_latency(struct drm_i915_private *dev_priv, 2967 u16 wm[5]) 2968{ 2969 /* ILK sprite LP0 latency is 1300 ns */ 2970 if (IS_DISPLAY_VER(dev_priv, 5)) 2971 wm[0] = 13; 2972} 2973 2974static void intel_fixup_cur_wm_latency(struct drm_i915_private *dev_priv, 2975 u16 wm[5]) 2976{ 2977 /* ILK cursor LP0 latency is 1300 ns */ 2978 if (IS_DISPLAY_VER(dev_priv, 5)) 2979 wm[0] = 13; 2980} 2981 2982int ilk_wm_max_level(const struct drm_i915_private *dev_priv) 2983{ 2984 /* how many WM levels are we expecting */ 2985 if (DISPLAY_VER(dev_priv) >= 9) 2986 return 7; 2987 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 2988 return 4; 2989 else if (DISPLAY_VER(dev_priv) >= 6) 2990 return 3; 2991 else 2992 return 2; 2993} 2994 2995static void intel_print_wm_latency(struct drm_i915_private *dev_priv, 2996 const char *name, 2997 const u16 wm[]) 2998{ 2999 int level, max_level = ilk_wm_max_level(dev_priv); 3000 3001 for (level = 0; level <= max_level; level++) { 3002 unsigned int latency = wm[level]; 3003 3004 if (latency == 0) { 3005 drm_dbg_kms(&dev_priv->drm, 3006 "%s WM%d latency not provided\n", 3007 name, level); 3008 continue; 3009 } 3010 3011 /* 3012 * - latencies are in us on gen9. 3013 * - before then, WM1+ latency values are in 0.5us units 3014 */ 3015 if (DISPLAY_VER(dev_priv) >= 9) 3016 latency *= 10; 3017 else if (level > 0) 3018 latency *= 5; 3019 3020 drm_dbg_kms(&dev_priv->drm, 3021 "%s WM%d latency %u (%u.%u usec)\n", name, level, 3022 wm[level], latency / 10, latency % 10); 3023 } 3024} 3025 3026static bool ilk_increase_wm_latency(struct drm_i915_private *dev_priv, 3027 u16 wm[5], u16 min) 3028{ 3029 int level, max_level = ilk_wm_max_level(dev_priv); 3030 3031 if (wm[0] >= min) 3032 return false; 3033 3034 wm[0] = max(wm[0], min); 3035 for (level = 1; level <= max_level; level++) 3036 wm[level] = max_t(u16, wm[level], DIV_ROUND_UP(min, 5)); 3037 3038 return true; 3039} 3040 3041static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv) 3042{ 3043 bool changed; 3044 3045 /* 3046 * The BIOS provided WM memory latency values are often 3047 * inadequate for high resolution displays. Adjust them. 3048 */ 3049 changed = ilk_increase_wm_latency(dev_priv, dev_priv->wm.pri_latency, 12) | 3050 ilk_increase_wm_latency(dev_priv, dev_priv->wm.spr_latency, 12) | 3051 ilk_increase_wm_latency(dev_priv, dev_priv->wm.cur_latency, 12); 3052 3053 if (!changed) 3054 return; 3055 3056 drm_dbg_kms(&dev_priv->drm, 3057 "WM latency values increased to avoid potential underruns\n"); 3058 intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency); 3059 intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); 3060 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); 3061} 3062 3063static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv) 3064{ 3065 /* 3066 * On some SNB machines (Thinkpad X220 Tablet at least) 3067 * LP3 usage can cause vblank interrupts to be lost. 3068 * The DEIIR bit will go high but it looks like the CPU 3069 * never gets interrupted. 3070 * 3071 * It's not clear whether other interrupt source could 3072 * be affected or if this is somehow limited to vblank 3073 * interrupts only. To play it safe we disable LP3 3074 * watermarks entirely. 3075 */ 3076 if (dev_priv->wm.pri_latency[3] == 0 && 3077 dev_priv->wm.spr_latency[3] == 0 && 3078 dev_priv->wm.cur_latency[3] == 0) 3079 return; 3080 3081 dev_priv->wm.pri_latency[3] = 0; 3082 dev_priv->wm.spr_latency[3] = 0; 3083 dev_priv->wm.cur_latency[3] = 0; 3084 3085 drm_dbg_kms(&dev_priv->drm, 3086 "LP3 watermarks disabled due to potential for lost interrupts\n"); 3087 intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency); 3088 intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); 3089 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); 3090} 3091 3092static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv) 3093{ 3094 intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency); 3095 3096 memcpy(dev_priv->wm.spr_latency, dev_priv->wm.pri_latency, 3097 sizeof(dev_priv->wm.pri_latency)); 3098 memcpy(dev_priv->wm.cur_latency, dev_priv->wm.pri_latency, 3099 sizeof(dev_priv->wm.pri_latency)); 3100 3101 intel_fixup_spr_wm_latency(dev_priv, dev_priv->wm.spr_latency); 3102 intel_fixup_cur_wm_latency(dev_priv, dev_priv->wm.cur_latency); 3103 3104 intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency); 3105 intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); 3106 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); 3107 3108 if (IS_DISPLAY_VER(dev_priv, 6)) { 3109 snb_wm_latency_quirk(dev_priv); 3110 snb_wm_lp3_irq_quirk(dev_priv); 3111 } 3112} 3113 3114static void skl_setup_wm_latency(struct drm_i915_private *dev_priv) 3115{ 3116 intel_read_wm_latency(dev_priv, dev_priv->wm.skl_latency); 3117 intel_print_wm_latency(dev_priv, "Gen9 Plane", dev_priv->wm.skl_latency); 3118} 3119 3120static bool ilk_validate_pipe_wm(const struct drm_i915_private *dev_priv, 3121 struct intel_pipe_wm *pipe_wm) 3122{ 3123 /* LP0 watermark maximums depend on this pipe alone */ 3124 const struct intel_wm_config config = { 3125 .num_pipes_active = 1, 3126 .sprites_enabled = pipe_wm->sprites_enabled, 3127 .sprites_scaled = pipe_wm->sprites_scaled, 3128 }; 3129 struct ilk_wm_maximums max; 3130 3131 /* LP0 watermarks always use 1/2 DDB partitioning */ 3132 ilk_compute_wm_maximums(dev_priv, 0, &config, INTEL_DDB_PART_1_2, &max); 3133 3134 /* At least LP0 must be valid */ 3135 if (!ilk_validate_wm_level(0, &max, &pipe_wm->wm[0])) { 3136 drm_dbg_kms(&dev_priv->drm, "LP0 watermark invalid\n"); 3137 return false; 3138 } 3139 3140 return true; 3141} 3142 3143/* Compute new watermarks for the pipe */ 3144static int ilk_compute_pipe_wm(struct intel_crtc_state *crtc_state) 3145{ 3146 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 3147 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 3148 struct intel_pipe_wm *pipe_wm; 3149 struct intel_plane *plane; 3150 const struct intel_plane_state *plane_state; 3151 const struct intel_plane_state *pristate = NULL; 3152 const struct intel_plane_state *sprstate = NULL; 3153 const struct intel_plane_state *curstate = NULL; 3154 int level, max_level = ilk_wm_max_level(dev_priv), usable_level; 3155 struct ilk_wm_maximums max; 3156 3157 pipe_wm = &crtc_state->wm.ilk.optimal; 3158 3159 intel_atomic_crtc_state_for_each_plane_state(plane, plane_state, crtc_state) { 3160 if (plane->base.type == DRM_PLANE_TYPE_PRIMARY) 3161 pristate = plane_state; 3162 else if (plane->base.type == DRM_PLANE_TYPE_OVERLAY) 3163 sprstate = plane_state; 3164 else if (plane->base.type == DRM_PLANE_TYPE_CURSOR) 3165 curstate = plane_state; 3166 } 3167 3168 pipe_wm->pipe_enabled = crtc_state->hw.active; 3169 if (sprstate) { 3170 pipe_wm->sprites_enabled = sprstate->uapi.visible; 3171 pipe_wm->sprites_scaled = sprstate->uapi.visible && 3172 (drm_rect_width(&sprstate->uapi.dst) != drm_rect_width(&sprstate->uapi.src) >> 16 || 3173 drm_rect_height(&sprstate->uapi.dst) != drm_rect_height(&sprstate->uapi.src) >> 16); 3174 } 3175 3176 usable_level = max_level; 3177 3178 /* ILK/SNB: LP2+ watermarks only w/o sprites */ 3179 if (DISPLAY_VER(dev_priv) <= 6 && pipe_wm->sprites_enabled) 3180 usable_level = 1; 3181 3182 /* ILK/SNB/IVB: LP1+ watermarks only w/o scaling */ 3183 if (pipe_wm->sprites_scaled) 3184 usable_level = 0; 3185 3186 memset(&pipe_wm->wm, 0, sizeof(pipe_wm->wm)); 3187 ilk_compute_wm_level(dev_priv, crtc, 0, crtc_state, 3188 pristate, sprstate, curstate, &pipe_wm->wm[0]); 3189 3190 if (!ilk_validate_pipe_wm(dev_priv, pipe_wm)) 3191 return -EINVAL; 3192 3193 ilk_compute_wm_reg_maximums(dev_priv, 1, &max); 3194 3195 for (level = 1; level <= usable_level; level++) { 3196 struct intel_wm_level *wm = &pipe_wm->wm[level]; 3197 3198 ilk_compute_wm_level(dev_priv, crtc, level, crtc_state, 3199 pristate, sprstate, curstate, wm); 3200 3201 /* 3202 * Disable any watermark level that exceeds the 3203 * register maximums since such watermarks are 3204 * always invalid. 3205 */ 3206 if (!ilk_validate_wm_level(level, &max, wm)) { 3207 memset(wm, 0, sizeof(*wm)); 3208 break; 3209 } 3210 } 3211 3212 return 0; 3213} 3214 3215/* 3216 * Build a set of 'intermediate' watermark values that satisfy both the old 3217 * state and the new state. These can be programmed to the hardware 3218 * immediately. 3219 */ 3220static int ilk_compute_intermediate_wm(struct intel_crtc_state *newstate) 3221{ 3222 struct intel_crtc *intel_crtc = to_intel_crtc(newstate->uapi.crtc); 3223 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 3224 struct intel_pipe_wm *a = &newstate->wm.ilk.intermediate; 3225 struct intel_atomic_state *intel_state = 3226 to_intel_atomic_state(newstate->uapi.state); 3227 const struct intel_crtc_state *oldstate = 3228 intel_atomic_get_old_crtc_state(intel_state, intel_crtc); 3229 const struct intel_pipe_wm *b = &oldstate->wm.ilk.optimal; 3230 int level, max_level = ilk_wm_max_level(dev_priv); 3231 3232 /* 3233 * Start with the final, target watermarks, then combine with the 3234 * currently active watermarks to get values that are safe both before 3235 * and after the vblank. 3236 */ 3237 *a = newstate->wm.ilk.optimal; 3238 if (!newstate->hw.active || drm_atomic_crtc_needs_modeset(&newstate->uapi) || 3239 intel_state->skip_intermediate_wm) 3240 return 0; 3241 3242 a->pipe_enabled |= b->pipe_enabled; 3243 a->sprites_enabled |= b->sprites_enabled; 3244 a->sprites_scaled |= b->sprites_scaled; 3245 3246 for (level = 0; level <= max_level; level++) { 3247 struct intel_wm_level *a_wm = &a->wm[level]; 3248 const struct intel_wm_level *b_wm = &b->wm[level]; 3249 3250 a_wm->enable &= b_wm->enable; 3251 a_wm->pri_val = max(a_wm->pri_val, b_wm->pri_val); 3252 a_wm->spr_val = max(a_wm->spr_val, b_wm->spr_val); 3253 a_wm->cur_val = max(a_wm->cur_val, b_wm->cur_val); 3254 a_wm->fbc_val = max(a_wm->fbc_val, b_wm->fbc_val); 3255 } 3256 3257 /* 3258 * We need to make sure that these merged watermark values are 3259 * actually a valid configuration themselves. If they're not, 3260 * there's no safe way to transition from the old state to 3261 * the new state, so we need to fail the atomic transaction. 3262 */ 3263 if (!ilk_validate_pipe_wm(dev_priv, a)) 3264 return -EINVAL; 3265 3266 /* 3267 * If our intermediate WM are identical to the final WM, then we can 3268 * omit the post-vblank programming; only update if it's different. 3269 */ 3270 if (memcmp(a, &newstate->wm.ilk.optimal, sizeof(*a)) != 0) 3271 newstate->wm.need_postvbl_update = true; 3272 3273 return 0; 3274} 3275 3276/* 3277 * Merge the watermarks from all active pipes for a specific level. 3278 */ 3279static void ilk_merge_wm_level(struct drm_i915_private *dev_priv, 3280 int level, 3281 struct intel_wm_level *ret_wm) 3282{ 3283 const struct intel_crtc *intel_crtc; 3284 3285 ret_wm->enable = true; 3286 3287 for_each_intel_crtc(&dev_priv->drm, intel_crtc) { 3288 const struct intel_pipe_wm *active = &intel_crtc->wm.active.ilk; 3289 const struct intel_wm_level *wm = &active->wm[level]; 3290 3291 if (!active->pipe_enabled) 3292 continue; 3293 3294 /* 3295 * The watermark values may have been used in the past, 3296 * so we must maintain them in the registers for some 3297 * time even if the level is now disabled. 3298 */ 3299 if (!wm->enable) 3300 ret_wm->enable = false; 3301 3302 ret_wm->pri_val = max(ret_wm->pri_val, wm->pri_val); 3303 ret_wm->spr_val = max(ret_wm->spr_val, wm->spr_val); 3304 ret_wm->cur_val = max(ret_wm->cur_val, wm->cur_val); 3305 ret_wm->fbc_val = max(ret_wm->fbc_val, wm->fbc_val); 3306 } 3307} 3308 3309/* 3310 * Merge all low power watermarks for all active pipes. 3311 */ 3312static void ilk_wm_merge(struct drm_i915_private *dev_priv, 3313 const struct intel_wm_config *config, 3314 const struct ilk_wm_maximums *max, 3315 struct intel_pipe_wm *merged) 3316{ 3317 int level, max_level = ilk_wm_max_level(dev_priv); 3318 int last_enabled_level = max_level; 3319 3320 /* ILK/SNB/IVB: LP1+ watermarks only w/ single pipe */ 3321 if ((DISPLAY_VER(dev_priv) <= 6 || IS_IVYBRIDGE(dev_priv)) && 3322 config->num_pipes_active > 1) 3323 last_enabled_level = 0; 3324 3325 /* ILK: FBC WM must be disabled always */ 3326 merged->fbc_wm_enabled = DISPLAY_VER(dev_priv) >= 6; 3327 3328 /* merge each WM1+ level */ 3329 for (level = 1; level <= max_level; level++) { 3330 struct intel_wm_level *wm = &merged->wm[level]; 3331 3332 ilk_merge_wm_level(dev_priv, level, wm); 3333 3334 if (level > last_enabled_level) 3335 wm->enable = false; 3336 else if (!ilk_validate_wm_level(level, max, wm)) 3337 /* make sure all following levels get disabled */ 3338 last_enabled_level = level - 1; 3339 3340 /* 3341 * The spec says it is preferred to disable 3342 * FBC WMs instead of disabling a WM level. 3343 */ 3344 if (wm->fbc_val > max->fbc) { 3345 if (wm->enable) 3346 merged->fbc_wm_enabled = false; 3347 wm->fbc_val = 0; 3348 } 3349 } 3350 3351 /* ILK: LP2+ must be disabled when FBC WM is disabled but FBC enabled */ 3352 /* 3353 * FIXME this is racy. FBC might get enabled later. 3354 * What we should check here is whether FBC can be 3355 * enabled sometime later. 3356 */ 3357 if (IS_DISPLAY_VER(dev_priv, 5) && !merged->fbc_wm_enabled && 3358 intel_fbc_is_active(dev_priv)) { 3359 for (level = 2; level <= max_level; level++) { 3360 struct intel_wm_level *wm = &merged->wm[level]; 3361 3362 wm->enable = false; 3363 } 3364 } 3365} 3366 3367static int ilk_wm_lp_to_level(int wm_lp, const struct intel_pipe_wm *pipe_wm) 3368{ 3369 /* LP1,LP2,LP3 levels are either 1,2,3 or 1,3,4 */ 3370 return wm_lp + (wm_lp >= 2 && pipe_wm->wm[4].enable); 3371} 3372 3373/* The value we need to program into the WM_LPx latency field */ 3374static unsigned int ilk_wm_lp_latency(struct drm_i915_private *dev_priv, 3375 int level) 3376{ 3377 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 3378 return 2 * level; 3379 else 3380 return dev_priv->wm.pri_latency[level]; 3381} 3382 3383static void ilk_compute_wm_results(struct drm_i915_private *dev_priv, 3384 const struct intel_pipe_wm *merged, 3385 enum intel_ddb_partitioning partitioning, 3386 struct ilk_wm_values *results) 3387{ 3388 struct intel_crtc *intel_crtc; 3389 int level, wm_lp; 3390 3391 results->enable_fbc_wm = merged->fbc_wm_enabled; 3392 results->partitioning = partitioning; 3393 3394 /* LP1+ register values */ 3395 for (wm_lp = 1; wm_lp <= 3; wm_lp++) { 3396 const struct intel_wm_level *r; 3397 3398 level = ilk_wm_lp_to_level(wm_lp, merged); 3399 3400 r = &merged->wm[level]; 3401 3402 /* 3403 * Maintain the watermark values even if the level is 3404 * disabled. Doing otherwise could cause underruns. 3405 */ 3406 results->wm_lp[wm_lp - 1] = 3407 (ilk_wm_lp_latency(dev_priv, level) << WM1_LP_LATENCY_SHIFT) | 3408 (r->pri_val << WM1_LP_SR_SHIFT) | 3409 r->cur_val; 3410 3411 if (r->enable) 3412 results->wm_lp[wm_lp - 1] |= WM1_LP_SR_EN; 3413 3414 if (DISPLAY_VER(dev_priv) >= 8) 3415 results->wm_lp[wm_lp - 1] |= 3416 r->fbc_val << WM1_LP_FBC_SHIFT_BDW; 3417 else 3418 results->wm_lp[wm_lp - 1] |= 3419 r->fbc_val << WM1_LP_FBC_SHIFT; 3420 3421 /* 3422 * Always set WM1S_LP_EN when spr_val != 0, even if the 3423 * level is disabled. Doing otherwise could cause underruns. 3424 */ 3425 if (DISPLAY_VER(dev_priv) <= 6 && r->spr_val) { 3426 drm_WARN_ON(&dev_priv->drm, wm_lp != 1); 3427 results->wm_lp_spr[wm_lp - 1] = WM1S_LP_EN | r->spr_val; 3428 } else 3429 results->wm_lp_spr[wm_lp - 1] = r->spr_val; 3430 } 3431 3432 /* LP0 register values */ 3433 for_each_intel_crtc(&dev_priv->drm, intel_crtc) { 3434 enum pipe pipe = intel_crtc->pipe; 3435 const struct intel_pipe_wm *pipe_wm = &intel_crtc->wm.active.ilk; 3436 const struct intel_wm_level *r = &pipe_wm->wm[0]; 3437 3438 if (drm_WARN_ON(&dev_priv->drm, !r->enable)) 3439 continue; 3440 3441 results->wm_pipe[pipe] = 3442 (r->pri_val << WM0_PIPE_PLANE_SHIFT) | 3443 (r->spr_val << WM0_PIPE_SPRITE_SHIFT) | 3444 r->cur_val; 3445 } 3446} 3447 3448/* Find the result with the highest level enabled. Check for enable_fbc_wm in 3449 * case both are at the same level. Prefer r1 in case they're the same. */ 3450static struct intel_pipe_wm * 3451ilk_find_best_result(struct drm_i915_private *dev_priv, 3452 struct intel_pipe_wm *r1, 3453 struct intel_pipe_wm *r2) 3454{ 3455 int level, max_level = ilk_wm_max_level(dev_priv); 3456 int level1 = 0, level2 = 0; 3457 3458 for (level = 1; level <= max_level; level++) { 3459 if (r1->wm[level].enable) 3460 level1 = level; 3461 if (r2->wm[level].enable) 3462 level2 = level; 3463 } 3464 3465 if (level1 == level2) { 3466 if (r2->fbc_wm_enabled && !r1->fbc_wm_enabled) 3467 return r2; 3468 else 3469 return r1; 3470 } else if (level1 > level2) { 3471 return r1; 3472 } else { 3473 return r2; 3474 } 3475} 3476 3477/* dirty bits used to track which watermarks need changes */ 3478#define WM_DIRTY_PIPE(pipe) (1 << (pipe)) 3479#define WM_DIRTY_LP(wm_lp) (1 << (15 + (wm_lp))) 3480#define WM_DIRTY_LP_ALL (WM_DIRTY_LP(1) | WM_DIRTY_LP(2) | WM_DIRTY_LP(3)) 3481#define WM_DIRTY_FBC (1 << 24) 3482#define WM_DIRTY_DDB (1 << 25) 3483 3484static unsigned int ilk_compute_wm_dirty(struct drm_i915_private *dev_priv, 3485 const struct ilk_wm_values *old, 3486 const struct ilk_wm_values *new) 3487{ 3488 unsigned int dirty = 0; 3489 enum pipe pipe; 3490 int wm_lp; 3491 3492 for_each_pipe(dev_priv, pipe) { 3493 if (old->wm_pipe[pipe] != new->wm_pipe[pipe]) { 3494 dirty |= WM_DIRTY_PIPE(pipe); 3495 /* Must disable LP1+ watermarks too */ 3496 dirty |= WM_DIRTY_LP_ALL; 3497 } 3498 } 3499 3500 if (old->enable_fbc_wm != new->enable_fbc_wm) { 3501 dirty |= WM_DIRTY_FBC; 3502 /* Must disable LP1+ watermarks too */ 3503 dirty |= WM_DIRTY_LP_ALL; 3504 } 3505 3506 if (old->partitioning != new->partitioning) { 3507 dirty |= WM_DIRTY_DDB; 3508 /* Must disable LP1+ watermarks too */ 3509 dirty |= WM_DIRTY_LP_ALL; 3510 } 3511 3512 /* LP1+ watermarks already deemed dirty, no need to continue */ 3513 if (dirty & WM_DIRTY_LP_ALL) 3514 return dirty; 3515 3516 /* Find the lowest numbered LP1+ watermark in need of an update... */ 3517 for (wm_lp = 1; wm_lp <= 3; wm_lp++) { 3518 if (old->wm_lp[wm_lp - 1] != new->wm_lp[wm_lp - 1] || 3519 old->wm_lp_spr[wm_lp - 1] != new->wm_lp_spr[wm_lp - 1]) 3520 break; 3521 } 3522 3523 /* ...and mark it and all higher numbered LP1+ watermarks as dirty */ 3524 for (; wm_lp <= 3; wm_lp++) 3525 dirty |= WM_DIRTY_LP(wm_lp); 3526 3527 return dirty; 3528} 3529 3530static bool _ilk_disable_lp_wm(struct drm_i915_private *dev_priv, 3531 unsigned int dirty) 3532{ 3533 struct ilk_wm_values *previous = &dev_priv->wm.hw; 3534 bool changed = false; 3535 3536 if (dirty & WM_DIRTY_LP(3) && previous->wm_lp[2] & WM1_LP_SR_EN) { 3537 previous->wm_lp[2] &= ~WM1_LP_SR_EN; 3538 intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, previous->wm_lp[2]); 3539 changed = true; 3540 } 3541 if (dirty & WM_DIRTY_LP(2) && previous->wm_lp[1] & WM1_LP_SR_EN) { 3542 previous->wm_lp[1] &= ~WM1_LP_SR_EN; 3543 intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, previous->wm_lp[1]); 3544 changed = true; 3545 } 3546 if (dirty & WM_DIRTY_LP(1) && previous->wm_lp[0] & WM1_LP_SR_EN) { 3547 previous->wm_lp[0] &= ~WM1_LP_SR_EN; 3548 intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, previous->wm_lp[0]); 3549 changed = true; 3550 } 3551 3552 /* 3553 * Don't touch WM1S_LP_EN here. 3554 * Doing so could cause underruns. 3555 */ 3556 3557 return changed; 3558} 3559 3560/* 3561 * The spec says we shouldn't write when we don't need, because every write 3562 * causes WMs to be re-evaluated, expending some power. 3563 */ 3564static void ilk_write_wm_values(struct drm_i915_private *dev_priv, 3565 struct ilk_wm_values *results) 3566{ 3567 struct ilk_wm_values *previous = &dev_priv->wm.hw; 3568 unsigned int dirty; 3569 u32 val; 3570 3571 dirty = ilk_compute_wm_dirty(dev_priv, previous, results); 3572 if (!dirty) 3573 return; 3574 3575 _ilk_disable_lp_wm(dev_priv, dirty); 3576 3577 if (dirty & WM_DIRTY_PIPE(PIPE_A)) 3578 intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_A), results->wm_pipe[0]); 3579 if (dirty & WM_DIRTY_PIPE(PIPE_B)) 3580 intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_B), results->wm_pipe[1]); 3581 if (dirty & WM_DIRTY_PIPE(PIPE_C)) 3582 intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_C), results->wm_pipe[2]); 3583 3584 if (dirty & WM_DIRTY_DDB) { 3585 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 3586 val = intel_uncore_read(&dev_priv->uncore, WM_MISC); 3587 if (results->partitioning == INTEL_DDB_PART_1_2) 3588 val &= ~WM_MISC_DATA_PARTITION_5_6; 3589 else 3590 val |= WM_MISC_DATA_PARTITION_5_6; 3591 intel_uncore_write(&dev_priv->uncore, WM_MISC, val); 3592 } else { 3593 val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2); 3594 if (results->partitioning == INTEL_DDB_PART_1_2) 3595 val &= ~DISP_DATA_PARTITION_5_6; 3596 else 3597 val |= DISP_DATA_PARTITION_5_6; 3598 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL2, val); 3599 } 3600 } 3601 3602 if (dirty & WM_DIRTY_FBC) { 3603 val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL); 3604 if (results->enable_fbc_wm) 3605 val &= ~DISP_FBC_WM_DIS; 3606 else 3607 val |= DISP_FBC_WM_DIS; 3608 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, val); 3609 } 3610 3611 if (dirty & WM_DIRTY_LP(1) && 3612 previous->wm_lp_spr[0] != results->wm_lp_spr[0]) 3613 intel_uncore_write(&dev_priv->uncore, WM1S_LP_ILK, results->wm_lp_spr[0]); 3614 3615 if (DISPLAY_VER(dev_priv) >= 7) { 3616 if (dirty & WM_DIRTY_LP(2) && previous->wm_lp_spr[1] != results->wm_lp_spr[1]) 3617 intel_uncore_write(&dev_priv->uncore, WM2S_LP_IVB, results->wm_lp_spr[1]); 3618 if (dirty & WM_DIRTY_LP(3) && previous->wm_lp_spr[2] != results->wm_lp_spr[2]) 3619 intel_uncore_write(&dev_priv->uncore, WM3S_LP_IVB, results->wm_lp_spr[2]); 3620 } 3621 3622 if (dirty & WM_DIRTY_LP(1) && previous->wm_lp[0] != results->wm_lp[0]) 3623 intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, results->wm_lp[0]); 3624 if (dirty & WM_DIRTY_LP(2) && previous->wm_lp[1] != results->wm_lp[1]) 3625 intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, results->wm_lp[1]); 3626 if (dirty & WM_DIRTY_LP(3) && previous->wm_lp[2] != results->wm_lp[2]) 3627 intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, results->wm_lp[2]); 3628 3629 dev_priv->wm.hw = *results; 3630} 3631 3632bool ilk_disable_lp_wm(struct drm_i915_private *dev_priv) 3633{ 3634 return _ilk_disable_lp_wm(dev_priv, WM_DIRTY_LP_ALL); 3635} 3636 3637u8 intel_enabled_dbuf_slices_mask(struct drm_i915_private *dev_priv) 3638{ 3639 int i; 3640 int max_slices = INTEL_INFO(dev_priv)->num_supported_dbuf_slices; 3641 u8 enabled_slices_mask = 0; 3642 3643 for (i = 0; i < max_slices; i++) { 3644 if (intel_uncore_read(&dev_priv->uncore, DBUF_CTL_S(i)) & DBUF_POWER_STATE) 3645 enabled_slices_mask |= BIT(i); 3646 } 3647 3648 return enabled_slices_mask; 3649} 3650 3651/* 3652 * FIXME: We still don't have the proper code detect if we need to apply the WA, 3653 * so assume we'll always need it in order to avoid underruns. 3654 */ 3655static bool skl_needs_memory_bw_wa(struct drm_i915_private *dev_priv) 3656{ 3657 return IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv); 3658} 3659 3660static bool 3661intel_has_sagv(struct drm_i915_private *dev_priv) 3662{ 3663 return (IS_GEN9_BC(dev_priv) || DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) && 3664 dev_priv->sagv_status != I915_SAGV_NOT_CONTROLLED; 3665} 3666 3667static void 3668skl_setup_sagv_block_time(struct drm_i915_private *dev_priv) 3669{ 3670 if (DISPLAY_VER(dev_priv) >= 12) { 3671 u32 val = 0; 3672 int ret; 3673 3674 ret = sandybridge_pcode_read(dev_priv, 3675 GEN12_PCODE_READ_SAGV_BLOCK_TIME_US, 3676 &val, NULL); 3677 if (!ret) { 3678 dev_priv->sagv_block_time_us = val; 3679 return; 3680 } 3681 3682 drm_dbg(&dev_priv->drm, "Couldn't read SAGV block time!\n"); 3683 } else if (IS_DISPLAY_VER(dev_priv, 11)) { 3684 dev_priv->sagv_block_time_us = 10; 3685 return; 3686 } else if (IS_DISPLAY_VER(dev_priv, 10)) { 3687 dev_priv->sagv_block_time_us = 20; 3688 return; 3689 } else if (IS_DISPLAY_VER(dev_priv, 9)) { 3690 dev_priv->sagv_block_time_us = 30; 3691 return; 3692 } else { 3693 MISSING_CASE(DISPLAY_VER(dev_priv)); 3694 } 3695 3696 /* Default to an unusable block time */ 3697 dev_priv->sagv_block_time_us = -1; 3698} 3699 3700/* 3701 * SAGV dynamically adjusts the system agent voltage and clock frequencies 3702 * depending on power and performance requirements. The display engine access 3703 * to system memory is blocked during the adjustment time. Because of the 3704 * blocking time, having this enabled can cause full system hangs and/or pipe 3705 * underruns if we don't meet all of the following requirements: 3706 * 3707 * - <= 1 pipe enabled 3708 * - All planes can enable watermarks for latencies >= SAGV engine block time 3709 * - We're not using an interlaced display configuration 3710 */ 3711static int 3712intel_enable_sagv(struct drm_i915_private *dev_priv) 3713{ 3714 int ret; 3715 3716 if (!intel_has_sagv(dev_priv)) 3717 return 0; 3718 3719 if (dev_priv->sagv_status == I915_SAGV_ENABLED) 3720 return 0; 3721 3722 drm_dbg_kms(&dev_priv->drm, "Enabling SAGV\n"); 3723 ret = sandybridge_pcode_write(dev_priv, GEN9_PCODE_SAGV_CONTROL, 3724 GEN9_SAGV_ENABLE); 3725 3726 /* We don't need to wait for SAGV when enabling */ 3727 3728 /* 3729 * Some skl systems, pre-release machines in particular, 3730 * don't actually have SAGV. 3731 */ 3732 if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) { 3733 drm_dbg(&dev_priv->drm, "No SAGV found on system, ignoring\n"); 3734 dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED; 3735 return 0; 3736 } else if (ret < 0) { 3737 drm_err(&dev_priv->drm, "Failed to enable SAGV\n"); 3738 return ret; 3739 } 3740 3741 dev_priv->sagv_status = I915_SAGV_ENABLED; 3742 return 0; 3743} 3744 3745static int 3746intel_disable_sagv(struct drm_i915_private *dev_priv) 3747{ 3748 int ret; 3749 3750 if (!intel_has_sagv(dev_priv)) 3751 return 0; 3752 3753 if (dev_priv->sagv_status == I915_SAGV_DISABLED) 3754 return 0; 3755 3756 drm_dbg_kms(&dev_priv->drm, "Disabling SAGV\n"); 3757 /* bspec says to keep retrying for at least 1 ms */ 3758 ret = skl_pcode_request(dev_priv, GEN9_PCODE_SAGV_CONTROL, 3759 GEN9_SAGV_DISABLE, 3760 GEN9_SAGV_IS_DISABLED, GEN9_SAGV_IS_DISABLED, 3761 1); 3762 /* 3763 * Some skl systems, pre-release machines in particular, 3764 * don't actually have SAGV. 3765 */ 3766 if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) { 3767 drm_dbg(&dev_priv->drm, "No SAGV found on system, ignoring\n"); 3768 dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED; 3769 return 0; 3770 } else if (ret < 0) { 3771 drm_err(&dev_priv->drm, "Failed to disable SAGV (%d)\n", ret); 3772 return ret; 3773 } 3774 3775 dev_priv->sagv_status = I915_SAGV_DISABLED; 3776 return 0; 3777} 3778 3779void intel_sagv_pre_plane_update(struct intel_atomic_state *state) 3780{ 3781 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3782 const struct intel_bw_state *new_bw_state; 3783 const struct intel_bw_state *old_bw_state; 3784 u32 new_mask = 0; 3785 3786 /* 3787 * Just return if we can't control SAGV or don't have it. 3788 * This is different from situation when we have SAGV but just can't 3789 * afford it due to DBuf limitation - in case if SAGV is completely 3790 * disabled in a BIOS, we are not even allowed to send a PCode request, 3791 * as it will throw an error. So have to check it here. 3792 */ 3793 if (!intel_has_sagv(dev_priv)) 3794 return; 3795 3796 new_bw_state = intel_atomic_get_new_bw_state(state); 3797 if (!new_bw_state) 3798 return; 3799 3800 if (DISPLAY_VER(dev_priv) < 11 && !intel_can_enable_sagv(dev_priv, new_bw_state)) { 3801 intel_disable_sagv(dev_priv); 3802 return; 3803 } 3804 3805 old_bw_state = intel_atomic_get_old_bw_state(state); 3806 /* 3807 * Nothing to mask 3808 */ 3809 if (new_bw_state->qgv_points_mask == old_bw_state->qgv_points_mask) 3810 return; 3811 3812 new_mask = old_bw_state->qgv_points_mask | new_bw_state->qgv_points_mask; 3813 3814 /* 3815 * If new mask is zero - means there is nothing to mask, 3816 * we can only unmask, which should be done in unmask. 3817 */ 3818 if (!new_mask) 3819 return; 3820 3821 /* 3822 * Restrict required qgv points before updating the configuration. 3823 * According to BSpec we can't mask and unmask qgv points at the same 3824 * time. Also masking should be done before updating the configuration 3825 * and unmasking afterwards. 3826 */ 3827 icl_pcode_restrict_qgv_points(dev_priv, new_mask); 3828} 3829 3830void intel_sagv_post_plane_update(struct intel_atomic_state *state) 3831{ 3832 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3833 const struct intel_bw_state *new_bw_state; 3834 const struct intel_bw_state *old_bw_state; 3835 u32 new_mask = 0; 3836 3837 /* 3838 * Just return if we can't control SAGV or don't have it. 3839 * This is different from situation when we have SAGV but just can't 3840 * afford it due to DBuf limitation - in case if SAGV is completely 3841 * disabled in a BIOS, we are not even allowed to send a PCode request, 3842 * as it will throw an error. So have to check it here. 3843 */ 3844 if (!intel_has_sagv(dev_priv)) 3845 return; 3846 3847 new_bw_state = intel_atomic_get_new_bw_state(state); 3848 if (!new_bw_state) 3849 return; 3850 3851 if (DISPLAY_VER(dev_priv) < 11 && intel_can_enable_sagv(dev_priv, new_bw_state)) { 3852 intel_enable_sagv(dev_priv); 3853 return; 3854 } 3855 3856 old_bw_state = intel_atomic_get_old_bw_state(state); 3857 /* 3858 * Nothing to unmask 3859 */ 3860 if (new_bw_state->qgv_points_mask == old_bw_state->qgv_points_mask) 3861 return; 3862 3863 new_mask = new_bw_state->qgv_points_mask; 3864 3865 /* 3866 * Allow required qgv points after updating the configuration. 3867 * According to BSpec we can't mask and unmask qgv points at the same 3868 * time. Also masking should be done before updating the configuration 3869 * and unmasking afterwards. 3870 */ 3871 icl_pcode_restrict_qgv_points(dev_priv, new_mask); 3872} 3873 3874static bool skl_crtc_can_enable_sagv(const struct intel_crtc_state *crtc_state) 3875{ 3876 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 3877 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 3878 enum plane_id plane_id; 3879 int max_level = INT_MAX; 3880 3881 if (!intel_has_sagv(dev_priv)) 3882 return false; 3883 3884 if (!crtc_state->hw.active) 3885 return true; 3886 3887 if (crtc_state->hw.pipe_mode.flags & DRM_MODE_FLAG_INTERLACE) 3888 return false; 3889 3890 for_each_plane_id_on_crtc(crtc, plane_id) { 3891 const struct skl_plane_wm *wm = 3892 &crtc_state->wm.skl.optimal.planes[plane_id]; 3893 int level; 3894 3895 /* Skip this plane if it's not enabled */ 3896 if (!wm->wm[0].enable) 3897 continue; 3898 3899 /* Find the highest enabled wm level for this plane */ 3900 for (level = ilk_wm_max_level(dev_priv); 3901 !wm->wm[level].enable; --level) 3902 { } 3903 3904 /* Highest common enabled wm level for all planes */ 3905 max_level = min(level, max_level); 3906 } 3907 3908 /* No enabled planes? */ 3909 if (max_level == INT_MAX) 3910 return true; 3911 3912 for_each_plane_id_on_crtc(crtc, plane_id) { 3913 const struct skl_plane_wm *wm = 3914 &crtc_state->wm.skl.optimal.planes[plane_id]; 3915 3916 /* 3917 * All enabled planes must have enabled a common wm level that 3918 * can tolerate memory latencies higher than sagv_block_time_us 3919 */ 3920 if (wm->wm[0].enable && !wm->wm[max_level].can_sagv) 3921 return false; 3922 } 3923 3924 return true; 3925} 3926 3927static bool tgl_crtc_can_enable_sagv(const struct intel_crtc_state *crtc_state) 3928{ 3929 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 3930 enum plane_id plane_id; 3931 3932 if (!crtc_state->hw.active) 3933 return true; 3934 3935 for_each_plane_id_on_crtc(crtc, plane_id) { 3936 const struct skl_plane_wm *wm = 3937 &crtc_state->wm.skl.optimal.planes[plane_id]; 3938 3939 if (wm->wm[0].enable && !wm->sagv.wm0.enable) 3940 return false; 3941 } 3942 3943 return true; 3944} 3945 3946static bool intel_crtc_can_enable_sagv(const struct intel_crtc_state *crtc_state) 3947{ 3948 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 3949 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 3950 3951 if (DISPLAY_VER(dev_priv) >= 12) 3952 return tgl_crtc_can_enable_sagv(crtc_state); 3953 else 3954 return skl_crtc_can_enable_sagv(crtc_state); 3955} 3956 3957bool intel_can_enable_sagv(struct drm_i915_private *dev_priv, 3958 const struct intel_bw_state *bw_state) 3959{ 3960 if (DISPLAY_VER(dev_priv) < 11 && 3961 bw_state->active_pipes && !is_power_of_2(bw_state->active_pipes)) 3962 return false; 3963 3964 return bw_state->pipe_sagv_reject == 0; 3965} 3966 3967static int intel_compute_sagv_mask(struct intel_atomic_state *state) 3968{ 3969 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3970 int ret; 3971 struct intel_crtc *crtc; 3972 struct intel_crtc_state *new_crtc_state; 3973 struct intel_bw_state *new_bw_state = NULL; 3974 const struct intel_bw_state *old_bw_state = NULL; 3975 int i; 3976 3977 for_each_new_intel_crtc_in_state(state, crtc, 3978 new_crtc_state, i) { 3979 new_bw_state = intel_atomic_get_bw_state(state); 3980 if (IS_ERR(new_bw_state)) 3981 return PTR_ERR(new_bw_state); 3982 3983 old_bw_state = intel_atomic_get_old_bw_state(state); 3984 3985 if (intel_crtc_can_enable_sagv(new_crtc_state)) 3986 new_bw_state->pipe_sagv_reject &= ~BIT(crtc->pipe); 3987 else 3988 new_bw_state->pipe_sagv_reject |= BIT(crtc->pipe); 3989 } 3990 3991 if (!new_bw_state) 3992 return 0; 3993 3994 new_bw_state->active_pipes = 3995 intel_calc_active_pipes(state, old_bw_state->active_pipes); 3996 3997 if (new_bw_state->active_pipes != old_bw_state->active_pipes) { 3998 ret = intel_atomic_lock_global_state(&new_bw_state->base); 3999 if (ret) 4000 return ret; 4001 } 4002 4003 for_each_new_intel_crtc_in_state(state, crtc, 4004 new_crtc_state, i) { 4005 struct skl_pipe_wm *pipe_wm = &new_crtc_state->wm.skl.optimal; 4006 4007 /* 4008 * We store use_sagv_wm in the crtc state rather than relying on 4009 * that bw state since we have no convenient way to get at the 4010 * latter from the plane commit hooks (especially in the legacy 4011 * cursor case) 4012 */ 4013 pipe_wm->use_sagv_wm = DISPLAY_VER(dev_priv) >= 12 && 4014 intel_can_enable_sagv(dev_priv, new_bw_state); 4015 } 4016 4017 if (intel_can_enable_sagv(dev_priv, new_bw_state) != 4018 intel_can_enable_sagv(dev_priv, old_bw_state)) { 4019 ret = intel_atomic_serialize_global_state(&new_bw_state->base); 4020 if (ret) 4021 return ret; 4022 } else if (new_bw_state->pipe_sagv_reject != old_bw_state->pipe_sagv_reject) { 4023 ret = intel_atomic_lock_global_state(&new_bw_state->base); 4024 if (ret) 4025 return ret; 4026 } 4027 4028 return 0; 4029} 4030 4031static int intel_dbuf_size(struct drm_i915_private *dev_priv) 4032{ 4033 int ddb_size = INTEL_INFO(dev_priv)->ddb_size; 4034 4035 drm_WARN_ON(&dev_priv->drm, ddb_size == 0); 4036 4037 if (DISPLAY_VER(dev_priv) < 11) 4038 return ddb_size - 4; /* 4 blocks for bypass path allocation */ 4039 4040 return ddb_size; 4041} 4042 4043static int intel_dbuf_slice_size(struct drm_i915_private *dev_priv) 4044{ 4045 return intel_dbuf_size(dev_priv) / 4046 INTEL_INFO(dev_priv)->num_supported_dbuf_slices; 4047} 4048 4049static void 4050skl_ddb_entry_for_slices(struct drm_i915_private *dev_priv, u8 slice_mask, 4051 struct skl_ddb_entry *ddb) 4052{ 4053 int slice_size = intel_dbuf_slice_size(dev_priv); 4054 4055 if (!slice_mask) { 4056 ddb->start = 0; 4057 ddb->end = 0; 4058 return; 4059 } 4060 4061 ddb->start = (ffs(slice_mask) - 1) * slice_size; 4062 ddb->end = fls(slice_mask) * slice_size; 4063 4064 WARN_ON(ddb->start >= ddb->end); 4065 WARN_ON(ddb->end > intel_dbuf_size(dev_priv)); 4066} 4067 4068u32 skl_ddb_dbuf_slice_mask(struct drm_i915_private *dev_priv, 4069 const struct skl_ddb_entry *entry) 4070{ 4071 u32 slice_mask = 0; 4072 u16 ddb_size = intel_dbuf_size(dev_priv); 4073 u16 num_supported_slices = INTEL_INFO(dev_priv)->num_supported_dbuf_slices; 4074 u16 slice_size = ddb_size / num_supported_slices; 4075 u16 start_slice; 4076 u16 end_slice; 4077 4078 if (!skl_ddb_entry_size(entry)) 4079 return 0; 4080 4081 start_slice = entry->start / slice_size; 4082 end_slice = (entry->end - 1) / slice_size; 4083 4084 /* 4085 * Per plane DDB entry can in a really worst case be on multiple slices 4086 * but single entry is anyway contigious. 4087 */ 4088 while (start_slice <= end_slice) { 4089 slice_mask |= BIT(start_slice); 4090 start_slice++; 4091 } 4092 4093 return slice_mask; 4094} 4095 4096static unsigned int intel_crtc_ddb_weight(const struct intel_crtc_state *crtc_state) 4097{ 4098 const struct drm_display_mode *pipe_mode = &crtc_state->hw.pipe_mode; 4099 int hdisplay, vdisplay; 4100 4101 if (!crtc_state->hw.active) 4102 return 0; 4103 4104 /* 4105 * Watermark/ddb requirement highly depends upon width of the 4106 * framebuffer, So instead of allocating DDB equally among pipes 4107 * distribute DDB based on resolution/width of the display. 4108 */ 4109 drm_mode_get_hv_timing(pipe_mode, &hdisplay, &vdisplay); 4110 4111 return hdisplay; 4112} 4113 4114static void intel_crtc_dbuf_weights(const struct intel_dbuf_state *dbuf_state, 4115 enum pipe for_pipe, 4116 unsigned int *weight_start, 4117 unsigned int *weight_end, 4118 unsigned int *weight_total) 4119{ 4120 struct drm_i915_private *dev_priv = 4121 to_i915(dbuf_state->base.state->base.dev); 4122 enum pipe pipe; 4123 4124 *weight_start = 0; 4125 *weight_end = 0; 4126 *weight_total = 0; 4127 4128 for_each_pipe(dev_priv, pipe) { 4129 int weight = dbuf_state->weight[pipe]; 4130 4131 /* 4132 * Do not account pipes using other slice sets 4133 * luckily as of current BSpec slice sets do not partially 4134 * intersect(pipes share either same one slice or same slice set 4135 * i.e no partial intersection), so it is enough to check for 4136 * equality for now. 4137 */ 4138 if (dbuf_state->slices[pipe] != dbuf_state->slices[for_pipe]) 4139 continue; 4140 4141 *weight_total += weight; 4142 if (pipe < for_pipe) { 4143 *weight_start += weight; 4144 *weight_end += weight; 4145 } else if (pipe == for_pipe) { 4146 *weight_end += weight; 4147 } 4148 } 4149} 4150 4151static int 4152skl_crtc_allocate_ddb(struct intel_atomic_state *state, struct intel_crtc *crtc) 4153{ 4154 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 4155 unsigned int weight_total, weight_start, weight_end; 4156 const struct intel_dbuf_state *old_dbuf_state = 4157 intel_atomic_get_old_dbuf_state(state); 4158 struct intel_dbuf_state *new_dbuf_state = 4159 intel_atomic_get_new_dbuf_state(state); 4160 struct intel_crtc_state *crtc_state; 4161 struct skl_ddb_entry ddb_slices; 4162 enum pipe pipe = crtc->pipe; 4163 u32 ddb_range_size; 4164 u32 dbuf_slice_mask; 4165 u32 start, end; 4166 int ret; 4167 4168 if (new_dbuf_state->weight[pipe] == 0) { 4169 new_dbuf_state->ddb[pipe].start = 0; 4170 new_dbuf_state->ddb[pipe].end = 0; 4171 goto out; 4172 } 4173 4174 dbuf_slice_mask = new_dbuf_state->slices[pipe]; 4175 4176 skl_ddb_entry_for_slices(dev_priv, dbuf_slice_mask, &ddb_slices); 4177 ddb_range_size = skl_ddb_entry_size(&ddb_slices); 4178 4179 intel_crtc_dbuf_weights(new_dbuf_state, pipe, 4180 &weight_start, &weight_end, &weight_total); 4181 4182 start = ddb_range_size * weight_start / weight_total; 4183 end = ddb_range_size * weight_end / weight_total; 4184 4185 new_dbuf_state->ddb[pipe].start = ddb_slices.start + start; 4186 new_dbuf_state->ddb[pipe].end = ddb_slices.start + end; 4187 4188out: 4189 if (skl_ddb_entry_equal(&old_dbuf_state->ddb[pipe], 4190 &new_dbuf_state->ddb[pipe])) 4191 return 0; 4192 4193 ret = intel_atomic_lock_global_state(&new_dbuf_state->base); 4194 if (ret) 4195 return ret; 4196 4197 crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); 4198 if (IS_ERR(crtc_state)) 4199 return PTR_ERR(crtc_state); 4200 4201 crtc_state->wm.skl.ddb = new_dbuf_state->ddb[pipe]; 4202 4203 drm_dbg_kms(&dev_priv->drm, 4204 "[CRTC:%d:%s] dbuf slices 0x%x -> 0x%x, ddb (%d - %d) -> (%d - %d), active pipes 0x%x -> 0x%x\n", 4205 crtc->base.base.id, crtc->base.name, 4206 old_dbuf_state->slices[pipe], new_dbuf_state->slices[pipe], 4207 old_dbuf_state->ddb[pipe].start, old_dbuf_state->ddb[pipe].end, 4208 new_dbuf_state->ddb[pipe].start, new_dbuf_state->ddb[pipe].end, 4209 old_dbuf_state->active_pipes, new_dbuf_state->active_pipes); 4210 4211 return 0; 4212} 4213 4214static int skl_compute_wm_params(const struct intel_crtc_state *crtc_state, 4215 int width, const struct drm_format_info *format, 4216 u64 modifier, unsigned int rotation, 4217 u32 plane_pixel_rate, struct skl_wm_params *wp, 4218 int color_plane); 4219static void skl_compute_plane_wm(const struct intel_crtc_state *crtc_state, 4220 int level, 4221 unsigned int latency, 4222 const struct skl_wm_params *wp, 4223 const struct skl_wm_level *result_prev, 4224 struct skl_wm_level *result /* out */); 4225 4226static unsigned int 4227skl_cursor_allocation(const struct intel_crtc_state *crtc_state, 4228 int num_active) 4229{ 4230 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 4231 int level, max_level = ilk_wm_max_level(dev_priv); 4232 struct skl_wm_level wm = {}; 4233 int ret, min_ddb_alloc = 0; 4234 struct skl_wm_params wp; 4235 4236 ret = skl_compute_wm_params(crtc_state, 256, 4237 drm_format_info(DRM_FORMAT_ARGB8888), 4238 DRM_FORMAT_MOD_LINEAR, 4239 DRM_MODE_ROTATE_0, 4240 crtc_state->pixel_rate, &wp, 0); 4241 drm_WARN_ON(&dev_priv->drm, ret); 4242 4243 for (level = 0; level <= max_level; level++) { 4244 unsigned int latency = dev_priv->wm.skl_latency[level]; 4245 4246 skl_compute_plane_wm(crtc_state, level, latency, &wp, &wm, &wm); 4247 if (wm.min_ddb_alloc == U16_MAX) 4248 break; 4249 4250 min_ddb_alloc = wm.min_ddb_alloc; 4251 } 4252 4253 return max(num_active == 1 ? 32 : 8, min_ddb_alloc); 4254} 4255 4256static void skl_ddb_entry_init_from_hw(struct drm_i915_private *dev_priv, 4257 struct skl_ddb_entry *entry, u32 reg) 4258{ 4259 4260 entry->start = reg & DDB_ENTRY_MASK; 4261 entry->end = (reg >> DDB_ENTRY_END_SHIFT) & DDB_ENTRY_MASK; 4262 4263 if (entry->end) 4264 entry->end += 1; 4265} 4266 4267static void 4268skl_ddb_get_hw_plane_state(struct drm_i915_private *dev_priv, 4269 const enum pipe pipe, 4270 const enum plane_id plane_id, 4271 struct skl_ddb_entry *ddb_y, 4272 struct skl_ddb_entry *ddb_uv) 4273{ 4274 u32 val, val2; 4275 u32 fourcc = 0; 4276 4277 /* Cursor doesn't support NV12/planar, so no extra calculation needed */ 4278 if (plane_id == PLANE_CURSOR) { 4279 val = intel_uncore_read(&dev_priv->uncore, CUR_BUF_CFG(pipe)); 4280 skl_ddb_entry_init_from_hw(dev_priv, ddb_y, val); 4281 return; 4282 } 4283 4284 val = intel_uncore_read(&dev_priv->uncore, PLANE_CTL(pipe, plane_id)); 4285 4286 /* No DDB allocated for disabled planes */ 4287 if (val & PLANE_CTL_ENABLE) 4288 fourcc = skl_format_to_fourcc(val & PLANE_CTL_FORMAT_MASK, 4289 val & PLANE_CTL_ORDER_RGBX, 4290 val & PLANE_CTL_ALPHA_MASK); 4291 4292 if (DISPLAY_VER(dev_priv) >= 11) { 4293 val = intel_uncore_read(&dev_priv->uncore, PLANE_BUF_CFG(pipe, plane_id)); 4294 skl_ddb_entry_init_from_hw(dev_priv, ddb_y, val); 4295 } else { 4296 val = intel_uncore_read(&dev_priv->uncore, PLANE_BUF_CFG(pipe, plane_id)); 4297 val2 = intel_uncore_read(&dev_priv->uncore, PLANE_NV12_BUF_CFG(pipe, plane_id)); 4298 4299 if (fourcc && 4300 drm_format_info_is_yuv_semiplanar(drm_format_info(fourcc))) 4301 swap(val, val2); 4302 4303 skl_ddb_entry_init_from_hw(dev_priv, ddb_y, val); 4304 skl_ddb_entry_init_from_hw(dev_priv, ddb_uv, val2); 4305 } 4306} 4307 4308void skl_pipe_ddb_get_hw_state(struct intel_crtc *crtc, 4309 struct skl_ddb_entry *ddb_y, 4310 struct skl_ddb_entry *ddb_uv) 4311{ 4312 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 4313 enum intel_display_power_domain power_domain; 4314 enum pipe pipe = crtc->pipe; 4315 intel_wakeref_t wakeref; 4316 enum plane_id plane_id; 4317 4318 power_domain = POWER_DOMAIN_PIPE(pipe); 4319 wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain); 4320 if (!wakeref) 4321 return; 4322 4323 for_each_plane_id_on_crtc(crtc, plane_id) 4324 skl_ddb_get_hw_plane_state(dev_priv, pipe, 4325 plane_id, 4326 &ddb_y[plane_id], 4327 &ddb_uv[plane_id]); 4328 4329 intel_display_power_put(dev_priv, power_domain, wakeref); 4330} 4331 4332/* 4333 * Determines the downscale amount of a plane for the purposes of watermark calculations. 4334 * The bspec defines downscale amount as: 4335 * 4336 * """ 4337 * Horizontal down scale amount = maximum[1, Horizontal source size / 4338 * Horizontal destination size] 4339 * Vertical down scale amount = maximum[1, Vertical source size / 4340 * Vertical destination size] 4341 * Total down scale amount = Horizontal down scale amount * 4342 * Vertical down scale amount 4343 * """ 4344 * 4345 * Return value is provided in 16.16 fixed point form to retain fractional part. 4346 * Caller should take care of dividing & rounding off the value. 4347 */ 4348static uint_fixed_16_16_t 4349skl_plane_downscale_amount(const struct intel_crtc_state *crtc_state, 4350 const struct intel_plane_state *plane_state) 4351{ 4352 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 4353 u32 src_w, src_h, dst_w, dst_h; 4354 uint_fixed_16_16_t fp_w_ratio, fp_h_ratio; 4355 uint_fixed_16_16_t downscale_h, downscale_w; 4356 4357 if (drm_WARN_ON(&dev_priv->drm, 4358 !intel_wm_plane_visible(crtc_state, plane_state))) 4359 return u32_to_fixed16(0); 4360 4361 /* 4362 * Src coordinates are already rotated by 270 degrees for 4363 * the 90/270 degree plane rotation cases (to match the 4364 * GTT mapping), hence no need to account for rotation here. 4365 * 4366 * n.b., src is 16.16 fixed point, dst is whole integer. 4367 */ 4368 src_w = drm_rect_width(&plane_state->uapi.src) >> 16; 4369 src_h = drm_rect_height(&plane_state->uapi.src) >> 16; 4370 dst_w = drm_rect_width(&plane_state->uapi.dst); 4371 dst_h = drm_rect_height(&plane_state->uapi.dst); 4372 4373 fp_w_ratio = div_fixed16(src_w, dst_w); 4374 fp_h_ratio = div_fixed16(src_h, dst_h); 4375 downscale_w = max_fixed16(fp_w_ratio, u32_to_fixed16(1)); 4376 downscale_h = max_fixed16(fp_h_ratio, u32_to_fixed16(1)); 4377 4378 return mul_fixed16(downscale_w, downscale_h); 4379} 4380 4381struct dbuf_slice_conf_entry { 4382 u8 active_pipes; 4383 u8 dbuf_mask[I915_MAX_PIPES]; 4384}; 4385 4386/* 4387 * Table taken from Bspec 12716 4388 * Pipes do have some preferred DBuf slice affinity, 4389 * plus there are some hardcoded requirements on how 4390 * those should be distributed for multipipe scenarios. 4391 * For more DBuf slices algorithm can get even more messy 4392 * and less readable, so decided to use a table almost 4393 * as is from BSpec itself - that way it is at least easier 4394 * to compare, change and check. 4395 */ 4396static const struct dbuf_slice_conf_entry icl_allowed_dbufs[] = 4397/* Autogenerated with igt/tools/intel_dbuf_map tool: */ 4398{ 4399 { 4400 .active_pipes = BIT(PIPE_A), 4401 .dbuf_mask = { 4402 [PIPE_A] = BIT(DBUF_S1), 4403 }, 4404 }, 4405 { 4406 .active_pipes = BIT(PIPE_B), 4407 .dbuf_mask = { 4408 [PIPE_B] = BIT(DBUF_S1), 4409 }, 4410 }, 4411 { 4412 .active_pipes = BIT(PIPE_A) | BIT(PIPE_B), 4413 .dbuf_mask = { 4414 [PIPE_A] = BIT(DBUF_S1), 4415 [PIPE_B] = BIT(DBUF_S2), 4416 }, 4417 }, 4418 { 4419 .active_pipes = BIT(PIPE_C), 4420 .dbuf_mask = { 4421 [PIPE_C] = BIT(DBUF_S2), 4422 }, 4423 }, 4424 { 4425 .active_pipes = BIT(PIPE_A) | BIT(PIPE_C), 4426 .dbuf_mask = { 4427 [PIPE_A] = BIT(DBUF_S1), 4428 [PIPE_C] = BIT(DBUF_S2), 4429 }, 4430 }, 4431 { 4432 .active_pipes = BIT(PIPE_B) | BIT(PIPE_C), 4433 .dbuf_mask = { 4434 [PIPE_B] = BIT(DBUF_S1), 4435 [PIPE_C] = BIT(DBUF_S2), 4436 }, 4437 }, 4438 { 4439 .active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), 4440 .dbuf_mask = { 4441 [PIPE_A] = BIT(DBUF_S1), 4442 [PIPE_B] = BIT(DBUF_S1), 4443 [PIPE_C] = BIT(DBUF_S2), 4444 }, 4445 }, 4446 {} 4447}; 4448 4449/* 4450 * Table taken from Bspec 49255 4451 * Pipes do have some preferred DBuf slice affinity, 4452 * plus there are some hardcoded requirements on how 4453 * those should be distributed for multipipe scenarios. 4454 * For more DBuf slices algorithm can get even more messy 4455 * and less readable, so decided to use a table almost 4456 * as is from BSpec itself - that way it is at least easier 4457 * to compare, change and check. 4458 */ 4459static const struct dbuf_slice_conf_entry tgl_allowed_dbufs[] = 4460/* Autogenerated with igt/tools/intel_dbuf_map tool: */ 4461{ 4462 { 4463 .active_pipes = BIT(PIPE_A), 4464 .dbuf_mask = { 4465 [PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2), 4466 }, 4467 }, 4468 { 4469 .active_pipes = BIT(PIPE_B), 4470 .dbuf_mask = { 4471 [PIPE_B] = BIT(DBUF_S1) | BIT(DBUF_S2), 4472 }, 4473 }, 4474 { 4475 .active_pipes = BIT(PIPE_A) | BIT(PIPE_B), 4476 .dbuf_mask = { 4477 [PIPE_A] = BIT(DBUF_S2), 4478 [PIPE_B] = BIT(DBUF_S1), 4479 }, 4480 }, 4481 { 4482 .active_pipes = BIT(PIPE_C), 4483 .dbuf_mask = { 4484 [PIPE_C] = BIT(DBUF_S2) | BIT(DBUF_S1), 4485 }, 4486 }, 4487 { 4488 .active_pipes = BIT(PIPE_A) | BIT(PIPE_C), 4489 .dbuf_mask = { 4490 [PIPE_A] = BIT(DBUF_S1), 4491 [PIPE_C] = BIT(DBUF_S2), 4492 }, 4493 }, 4494 { 4495 .active_pipes = BIT(PIPE_B) | BIT(PIPE_C), 4496 .dbuf_mask = { 4497 [PIPE_B] = BIT(DBUF_S1), 4498 [PIPE_C] = BIT(DBUF_S2), 4499 }, 4500 }, 4501 { 4502 .active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), 4503 .dbuf_mask = { 4504 [PIPE_A] = BIT(DBUF_S1), 4505 [PIPE_B] = BIT(DBUF_S1), 4506 [PIPE_C] = BIT(DBUF_S2), 4507 }, 4508 }, 4509 { 4510 .active_pipes = BIT(PIPE_D), 4511 .dbuf_mask = { 4512 [PIPE_D] = BIT(DBUF_S2) | BIT(DBUF_S1), 4513 }, 4514 }, 4515 { 4516 .active_pipes = BIT(PIPE_A) | BIT(PIPE_D), 4517 .dbuf_mask = { 4518 [PIPE_A] = BIT(DBUF_S1), 4519 [PIPE_D] = BIT(DBUF_S2), 4520 }, 4521 }, 4522 { 4523 .active_pipes = BIT(PIPE_B) | BIT(PIPE_D), 4524 .dbuf_mask = { 4525 [PIPE_B] = BIT(DBUF_S1), 4526 [PIPE_D] = BIT(DBUF_S2), 4527 }, 4528 }, 4529 { 4530 .active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_D), 4531 .dbuf_mask = { 4532 [PIPE_A] = BIT(DBUF_S1), 4533 [PIPE_B] = BIT(DBUF_S1), 4534 [PIPE_D] = BIT(DBUF_S2), 4535 }, 4536 }, 4537 { 4538 .active_pipes = BIT(PIPE_C) | BIT(PIPE_D), 4539 .dbuf_mask = { 4540 [PIPE_C] = BIT(DBUF_S1), 4541 [PIPE_D] = BIT(DBUF_S2), 4542 }, 4543 }, 4544 { 4545 .active_pipes = BIT(PIPE_A) | BIT(PIPE_C) | BIT(PIPE_D), 4546 .dbuf_mask = { 4547 [PIPE_A] = BIT(DBUF_S1), 4548 [PIPE_C] = BIT(DBUF_S2), 4549 [PIPE_D] = BIT(DBUF_S2), 4550 }, 4551 }, 4552 { 4553 .active_pipes = BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), 4554 .dbuf_mask = { 4555 [PIPE_B] = BIT(DBUF_S1), 4556 [PIPE_C] = BIT(DBUF_S2), 4557 [PIPE_D] = BIT(DBUF_S2), 4558 }, 4559 }, 4560 { 4561 .active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), 4562 .dbuf_mask = { 4563 [PIPE_A] = BIT(DBUF_S1), 4564 [PIPE_B] = BIT(DBUF_S1), 4565 [PIPE_C] = BIT(DBUF_S2), 4566 [PIPE_D] = BIT(DBUF_S2), 4567 }, 4568 }, 4569 {} 4570}; 4571 4572static u8 compute_dbuf_slices(enum pipe pipe, u8 active_pipes, 4573 const struct dbuf_slice_conf_entry *dbuf_slices) 4574{ 4575 int i; 4576 4577 for (i = 0; i < dbuf_slices[i].active_pipes; i++) { 4578 if (dbuf_slices[i].active_pipes == active_pipes) 4579 return dbuf_slices[i].dbuf_mask[pipe]; 4580 } 4581 return 0; 4582} 4583 4584/* 4585 * This function finds an entry with same enabled pipe configuration and 4586 * returns correspondent DBuf slice mask as stated in BSpec for particular 4587 * platform. 4588 */ 4589static u8 icl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes) 4590{ 4591 /* 4592 * FIXME: For ICL this is still a bit unclear as prev BSpec revision 4593 * required calculating "pipe ratio" in order to determine 4594 * if one or two slices can be used for single pipe configurations 4595 * as additional constraint to the existing table. 4596 * However based on recent info, it should be not "pipe ratio" 4597 * but rather ratio between pixel_rate and cdclk with additional 4598 * constants, so for now we are using only table until this is 4599 * clarified. Also this is the reason why crtc_state param is 4600 * still here - we will need it once those additional constraints 4601 * pop up. 4602 */ 4603 return compute_dbuf_slices(pipe, active_pipes, icl_allowed_dbufs); 4604} 4605 4606static u8 tgl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes) 4607{ 4608 return compute_dbuf_slices(pipe, active_pipes, tgl_allowed_dbufs); 4609} 4610 4611static u8 skl_compute_dbuf_slices(struct intel_crtc *crtc, u8 active_pipes) 4612{ 4613 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 4614 enum pipe pipe = crtc->pipe; 4615 4616 if (IS_DISPLAY_VER(dev_priv, 12)) 4617 return tgl_compute_dbuf_slices(pipe, active_pipes); 4618 else if (IS_DISPLAY_VER(dev_priv, 11)) 4619 return icl_compute_dbuf_slices(pipe, active_pipes); 4620 /* 4621 * For anything else just return one slice yet. 4622 * Should be extended for other platforms. 4623 */ 4624 return active_pipes & BIT(pipe) ? BIT(DBUF_S1) : 0; 4625} 4626 4627static u64 4628skl_plane_relative_data_rate(const struct intel_crtc_state *crtc_state, 4629 const struct intel_plane_state *plane_state, 4630 int color_plane) 4631{ 4632 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 4633 const struct drm_framebuffer *fb = plane_state->hw.fb; 4634 u32 data_rate; 4635 u32 width = 0, height = 0; 4636 uint_fixed_16_16_t down_scale_amount; 4637 u64 rate; 4638 4639 if (!plane_state->uapi.visible) 4640 return 0; 4641 4642 if (plane->id == PLANE_CURSOR) 4643 return 0; 4644 4645 if (color_plane == 1 && 4646 !intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) 4647 return 0; 4648 4649 /* 4650 * Src coordinates are already rotated by 270 degrees for 4651 * the 90/270 degree plane rotation cases (to match the 4652 * GTT mapping), hence no need to account for rotation here. 4653 */ 4654 width = drm_rect_width(&plane_state->uapi.src) >> 16; 4655 height = drm_rect_height(&plane_state->uapi.src) >> 16; 4656 4657 /* UV plane does 1/2 pixel sub-sampling */ 4658 if (color_plane == 1) { 4659 width /= 2; 4660 height /= 2; 4661 } 4662 4663 data_rate = width * height; 4664 4665 down_scale_amount = skl_plane_downscale_amount(crtc_state, plane_state); 4666 4667 rate = mul_round_up_u32_fixed16(data_rate, down_scale_amount); 4668 4669 rate *= fb->format->cpp[color_plane]; 4670 return rate; 4671} 4672 4673static u64 4674skl_get_total_relative_data_rate(struct intel_atomic_state *state, 4675 struct intel_crtc *crtc) 4676{ 4677 struct intel_crtc_state *crtc_state = 4678 intel_atomic_get_new_crtc_state(state, crtc); 4679 const struct intel_plane_state *plane_state; 4680 struct intel_plane *plane; 4681 u64 total_data_rate = 0; 4682 enum plane_id plane_id; 4683 int i; 4684 4685 /* Calculate and cache data rate for each plane */ 4686 for_each_new_intel_plane_in_state(state, plane, plane_state, i) { 4687 if (plane->pipe != crtc->pipe) 4688 continue; 4689 4690 plane_id = plane->id; 4691 4692 /* packed/y */ 4693 crtc_state->plane_data_rate[plane_id] = 4694 skl_plane_relative_data_rate(crtc_state, plane_state, 0); 4695 4696 /* uv-plane */ 4697 crtc_state->uv_plane_data_rate[plane_id] = 4698 skl_plane_relative_data_rate(crtc_state, plane_state, 1); 4699 } 4700 4701 for_each_plane_id_on_crtc(crtc, plane_id) { 4702 total_data_rate += crtc_state->plane_data_rate[plane_id]; 4703 total_data_rate += crtc_state->uv_plane_data_rate[plane_id]; 4704 } 4705 4706 return total_data_rate; 4707} 4708 4709static u64 4710icl_get_total_relative_data_rate(struct intel_atomic_state *state, 4711 struct intel_crtc *crtc) 4712{ 4713 struct intel_crtc_state *crtc_state = 4714 intel_atomic_get_new_crtc_state(state, crtc); 4715 const struct intel_plane_state *plane_state; 4716 struct intel_plane *plane; 4717 u64 total_data_rate = 0; 4718 enum plane_id plane_id; 4719 int i; 4720 4721 /* Calculate and cache data rate for each plane */ 4722 for_each_new_intel_plane_in_state(state, plane, plane_state, i) { 4723 if (plane->pipe != crtc->pipe) 4724 continue; 4725 4726 plane_id = plane->id; 4727 4728 if (!plane_state->planar_linked_plane) { 4729 crtc_state->plane_data_rate[plane_id] = 4730 skl_plane_relative_data_rate(crtc_state, plane_state, 0); 4731 } else { 4732 enum plane_id y_plane_id; 4733 4734 /* 4735 * The slave plane might not iterate in 4736 * intel_atomic_crtc_state_for_each_plane_state(), 4737 * and needs the master plane state which may be 4738 * NULL if we try get_new_plane_state(), so we 4739 * always calculate from the master. 4740 */ 4741 if (plane_state->planar_slave) 4742 continue; 4743 4744 /* Y plane rate is calculated on the slave */ 4745 y_plane_id = plane_state->planar_linked_plane->id; 4746 crtc_state->plane_data_rate[y_plane_id] = 4747 skl_plane_relative_data_rate(crtc_state, plane_state, 0); 4748 4749 crtc_state->plane_data_rate[plane_id] = 4750 skl_plane_relative_data_rate(crtc_state, plane_state, 1); 4751 } 4752 } 4753 4754 for_each_plane_id_on_crtc(crtc, plane_id) 4755 total_data_rate += crtc_state->plane_data_rate[plane_id]; 4756 4757 return total_data_rate; 4758} 4759 4760const struct skl_wm_level * 4761skl_plane_wm_level(const struct skl_pipe_wm *pipe_wm, 4762 enum plane_id plane_id, 4763 int level) 4764{ 4765 const struct skl_plane_wm *wm = &pipe_wm->planes[plane_id]; 4766 4767 if (level == 0 && pipe_wm->use_sagv_wm) 4768 return &wm->sagv.wm0; 4769 4770 return &wm->wm[level]; 4771} 4772 4773const struct skl_wm_level * 4774skl_plane_trans_wm(const struct skl_pipe_wm *pipe_wm, 4775 enum plane_id plane_id) 4776{ 4777 const struct skl_plane_wm *wm = &pipe_wm->planes[plane_id]; 4778 4779 if (pipe_wm->use_sagv_wm) 4780 return &wm->sagv.trans_wm; 4781 4782 return &wm->trans_wm; 4783} 4784 4785/* 4786 * We only disable the watermarks for each plane if 4787 * they exceed the ddb allocation of said plane. This 4788 * is done so that we don't end up touching cursor 4789 * watermarks needlessly when some other plane reduces 4790 * our max possible watermark level. 4791 * 4792 * Bspec has this to say about the PLANE_WM enable bit: 4793 * "All the watermarks at this level for all enabled 4794 * planes must be enabled before the level will be used." 4795 * So this is actually safe to do. 4796 */ 4797static void 4798skl_check_wm_level(struct skl_wm_level *wm, u64 total) 4799{ 4800 if (wm->min_ddb_alloc > total) 4801 memset(wm, 0, sizeof(*wm)); 4802} 4803 4804static void 4805skl_check_nv12_wm_level(struct skl_wm_level *wm, struct skl_wm_level *uv_wm, 4806 u64 total, u64 uv_total) 4807{ 4808 if (wm->min_ddb_alloc > total || 4809 uv_wm->min_ddb_alloc > uv_total) { 4810 memset(wm, 0, sizeof(*wm)); 4811 memset(uv_wm, 0, sizeof(*uv_wm)); 4812 } 4813} 4814 4815static int 4816skl_allocate_plane_ddb(struct intel_atomic_state *state, 4817 struct intel_crtc *crtc) 4818{ 4819 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 4820 struct intel_crtc_state *crtc_state = 4821 intel_atomic_get_new_crtc_state(state, crtc); 4822 const struct intel_dbuf_state *dbuf_state = 4823 intel_atomic_get_new_dbuf_state(state); 4824 const struct skl_ddb_entry *alloc = &dbuf_state->ddb[crtc->pipe]; 4825 int num_active = hweight8(dbuf_state->active_pipes); 4826 u16 alloc_size, start = 0; 4827 u16 total[I915_MAX_PLANES] = {}; 4828 u16 uv_total[I915_MAX_PLANES] = {}; 4829 u64 total_data_rate; 4830 enum plane_id plane_id; 4831 u32 blocks; 4832 int level; 4833 4834 /* Clear the partitioning for disabled planes. */ 4835 memset(crtc_state->wm.skl.plane_ddb_y, 0, sizeof(crtc_state->wm.skl.plane_ddb_y)); 4836 memset(crtc_state->wm.skl.plane_ddb_uv, 0, sizeof(crtc_state->wm.skl.plane_ddb_uv)); 4837 4838 if (!crtc_state->hw.active) 4839 return 0; 4840 4841 if (DISPLAY_VER(dev_priv) >= 11) 4842 total_data_rate = 4843 icl_get_total_relative_data_rate(state, crtc); 4844 else 4845 total_data_rate = 4846 skl_get_total_relative_data_rate(state, crtc); 4847 4848 alloc_size = skl_ddb_entry_size(alloc); 4849 if (alloc_size == 0) 4850 return 0; 4851 4852 /* Allocate fixed number of blocks for cursor. */ 4853 total[PLANE_CURSOR] = skl_cursor_allocation(crtc_state, num_active); 4854 alloc_size -= total[PLANE_CURSOR]; 4855 crtc_state->wm.skl.plane_ddb_y[PLANE_CURSOR].start = 4856 alloc->end - total[PLANE_CURSOR]; 4857 crtc_state->wm.skl.plane_ddb_y[PLANE_CURSOR].end = alloc->end; 4858 4859 if (total_data_rate == 0) 4860 return 0; 4861 4862 /* 4863 * Find the highest watermark level for which we can satisfy the block 4864 * requirement of active planes. 4865 */ 4866 for (level = ilk_wm_max_level(dev_priv); level >= 0; level--) { 4867 blocks = 0; 4868 for_each_plane_id_on_crtc(crtc, plane_id) { 4869 const struct skl_plane_wm *wm = 4870 &crtc_state->wm.skl.optimal.planes[plane_id]; 4871 4872 if (plane_id == PLANE_CURSOR) { 4873 if (wm->wm[level].min_ddb_alloc > total[PLANE_CURSOR]) { 4874 drm_WARN_ON(&dev_priv->drm, 4875 wm->wm[level].min_ddb_alloc != U16_MAX); 4876 blocks = U32_MAX; 4877 break; 4878 } 4879 continue; 4880 } 4881 4882 blocks += wm->wm[level].min_ddb_alloc; 4883 blocks += wm->uv_wm[level].min_ddb_alloc; 4884 } 4885 4886 if (blocks <= alloc_size) { 4887 alloc_size -= blocks; 4888 break; 4889 } 4890 } 4891 4892 if (level < 0) { 4893 drm_dbg_kms(&dev_priv->drm, 4894 "Requested display configuration exceeds system DDB limitations"); 4895 drm_dbg_kms(&dev_priv->drm, "minimum required %d/%d\n", 4896 blocks, alloc_size); 4897 return -EINVAL; 4898 } 4899 4900 /* 4901 * Grant each plane the blocks it requires at the highest achievable 4902 * watermark level, plus an extra share of the leftover blocks 4903 * proportional to its relative data rate. 4904 */ 4905 for_each_plane_id_on_crtc(crtc, plane_id) { 4906 const struct skl_plane_wm *wm = 4907 &crtc_state->wm.skl.optimal.planes[plane_id]; 4908 u64 rate; 4909 u16 extra; 4910 4911 if (plane_id == PLANE_CURSOR) 4912 continue; 4913 4914 /* 4915 * We've accounted for all active planes; remaining planes are 4916 * all disabled. 4917 */ 4918 if (total_data_rate == 0) 4919 break; 4920 4921 rate = crtc_state->plane_data_rate[plane_id]; 4922 extra = min_t(u16, alloc_size, 4923 DIV64_U64_ROUND_UP(alloc_size * rate, 4924 total_data_rate)); 4925 total[plane_id] = wm->wm[level].min_ddb_alloc + extra; 4926 alloc_size -= extra; 4927 total_data_rate -= rate; 4928 4929 if (total_data_rate == 0) 4930 break; 4931 4932 rate = crtc_state->uv_plane_data_rate[plane_id]; 4933 extra = min_t(u16, alloc_size, 4934 DIV64_U64_ROUND_UP(alloc_size * rate, 4935 total_data_rate)); 4936 uv_total[plane_id] = wm->uv_wm[level].min_ddb_alloc + extra; 4937 alloc_size -= extra; 4938 total_data_rate -= rate; 4939 } 4940 drm_WARN_ON(&dev_priv->drm, alloc_size != 0 || total_data_rate != 0); 4941 4942 /* Set the actual DDB start/end points for each plane */ 4943 start = alloc->start; 4944 for_each_plane_id_on_crtc(crtc, plane_id) { 4945 struct skl_ddb_entry *plane_alloc = 4946 &crtc_state->wm.skl.plane_ddb_y[plane_id]; 4947 struct skl_ddb_entry *uv_plane_alloc = 4948 &crtc_state->wm.skl.plane_ddb_uv[plane_id]; 4949 4950 if (plane_id == PLANE_CURSOR) 4951 continue; 4952 4953 /* Gen11+ uses a separate plane for UV watermarks */ 4954 drm_WARN_ON(&dev_priv->drm, 4955 DISPLAY_VER(dev_priv) >= 11 && uv_total[plane_id]); 4956 4957 /* Leave disabled planes at (0,0) */ 4958 if (total[plane_id]) { 4959 plane_alloc->start = start; 4960 start += total[plane_id]; 4961 plane_alloc->end = start; 4962 } 4963 4964 if (uv_total[plane_id]) { 4965 uv_plane_alloc->start = start; 4966 start += uv_total[plane_id]; 4967 uv_plane_alloc->end = start; 4968 } 4969 } 4970 4971 /* 4972 * When we calculated watermark values we didn't know how high 4973 * of a level we'd actually be able to hit, so we just marked 4974 * all levels as "enabled." Go back now and disable the ones 4975 * that aren't actually possible. 4976 */ 4977 for (level++; level <= ilk_wm_max_level(dev_priv); level++) { 4978 for_each_plane_id_on_crtc(crtc, plane_id) { 4979 struct skl_plane_wm *wm = 4980 &crtc_state->wm.skl.optimal.planes[plane_id]; 4981 4982 skl_check_nv12_wm_level(&wm->wm[level], &wm->uv_wm[level], 4983 total[plane_id], uv_total[plane_id]); 4984 4985 /* 4986 * Wa_1408961008:icl, ehl 4987 * Underruns with WM1+ disabled 4988 */ 4989 if (IS_DISPLAY_VER(dev_priv, 11) && 4990 level == 1 && wm->wm[0].enable) { 4991 wm->wm[level].blocks = wm->wm[0].blocks; 4992 wm->wm[level].lines = wm->wm[0].lines; 4993 wm->wm[level].ignore_lines = wm->wm[0].ignore_lines; 4994 } 4995 } 4996 } 4997 4998 /* 4999 * Go back and disable the transition and SAGV watermarks 5000 * if it turns out we don't have enough DDB blocks for them. 5001 */ 5002 for_each_plane_id_on_crtc(crtc, plane_id) { 5003 struct skl_plane_wm *wm = 5004 &crtc_state->wm.skl.optimal.planes[plane_id]; 5005 5006 skl_check_wm_level(&wm->trans_wm, total[plane_id]); 5007 skl_check_wm_level(&wm->sagv.wm0, total[plane_id]); 5008 skl_check_wm_level(&wm->sagv.trans_wm, total[plane_id]); 5009 } 5010 5011 return 0; 5012} 5013 5014/* 5015 * The max latency should be 257 (max the punit can code is 255 and we add 2us 5016 * for the read latency) and cpp should always be <= 8, so that 5017 * should allow pixel_rate up to ~2 GHz which seems sufficient since max 5018 * 2xcdclk is 1350 MHz and the pixel rate should never exceed that. 5019*/ 5020static uint_fixed_16_16_t 5021skl_wm_method1(const struct drm_i915_private *dev_priv, u32 pixel_rate, 5022 u8 cpp, u32 latency, u32 dbuf_block_size) 5023{ 5024 u32 wm_intermediate_val; 5025 uint_fixed_16_16_t ret; 5026 5027 if (latency == 0) 5028 return FP_16_16_MAX; 5029 5030 wm_intermediate_val = latency * pixel_rate * cpp; 5031 ret = div_fixed16(wm_intermediate_val, 1000 * dbuf_block_size); 5032 5033 if (DISPLAY_VER(dev_priv) >= 10) 5034 ret = add_fixed16_u32(ret, 1); 5035 5036 return ret; 5037} 5038 5039static uint_fixed_16_16_t 5040skl_wm_method2(u32 pixel_rate, u32 pipe_htotal, u32 latency, 5041 uint_fixed_16_16_t plane_blocks_per_line) 5042{ 5043 u32 wm_intermediate_val; 5044 uint_fixed_16_16_t ret; 5045 5046 if (latency == 0) 5047 return FP_16_16_MAX; 5048 5049 wm_intermediate_val = latency * pixel_rate; 5050 wm_intermediate_val = DIV_ROUND_UP(wm_intermediate_val, 5051 pipe_htotal * 1000); 5052 ret = mul_u32_fixed16(wm_intermediate_val, plane_blocks_per_line); 5053 return ret; 5054} 5055 5056static uint_fixed_16_16_t 5057intel_get_linetime_us(const struct intel_crtc_state *crtc_state) 5058{ 5059 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 5060 u32 pixel_rate; 5061 u32 crtc_htotal; 5062 uint_fixed_16_16_t linetime_us; 5063 5064 if (!crtc_state->hw.active) 5065 return u32_to_fixed16(0); 5066 5067 pixel_rate = crtc_state->pixel_rate; 5068 5069 if (drm_WARN_ON(&dev_priv->drm, pixel_rate == 0)) 5070 return u32_to_fixed16(0); 5071 5072 crtc_htotal = crtc_state->hw.pipe_mode.crtc_htotal; 5073 linetime_us = div_fixed16(crtc_htotal * 1000, pixel_rate); 5074 5075 return linetime_us; 5076} 5077 5078static int 5079skl_compute_wm_params(const struct intel_crtc_state *crtc_state, 5080 int width, const struct drm_format_info *format, 5081 u64 modifier, unsigned int rotation, 5082 u32 plane_pixel_rate, struct skl_wm_params *wp, 5083 int color_plane) 5084{ 5085 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 5086 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 5087 u32 interm_pbpl; 5088 5089 /* only planar format has two planes */ 5090 if (color_plane == 1 && 5091 !intel_format_info_is_yuv_semiplanar(format, modifier)) { 5092 drm_dbg_kms(&dev_priv->drm, 5093 "Non planar format have single plane\n"); 5094 return -EINVAL; 5095 } 5096 5097 wp->y_tiled = modifier == I915_FORMAT_MOD_Y_TILED || 5098 modifier == I915_FORMAT_MOD_Yf_TILED || 5099 modifier == I915_FORMAT_MOD_Y_TILED_CCS || 5100 modifier == I915_FORMAT_MOD_Yf_TILED_CCS; 5101 wp->x_tiled = modifier == I915_FORMAT_MOD_X_TILED; 5102 wp->rc_surface = modifier == I915_FORMAT_MOD_Y_TILED_CCS || 5103 modifier == I915_FORMAT_MOD_Yf_TILED_CCS; 5104 wp->is_planar = intel_format_info_is_yuv_semiplanar(format, modifier); 5105 5106 wp->width = width; 5107 if (color_plane == 1 && wp->is_planar) 5108 wp->width /= 2; 5109 5110 wp->cpp = format->cpp[color_plane]; 5111 wp->plane_pixel_rate = plane_pixel_rate; 5112 5113 if (DISPLAY_VER(dev_priv) >= 11 && 5114 modifier == I915_FORMAT_MOD_Yf_TILED && wp->cpp == 1) 5115 wp->dbuf_block_size = 256; 5116 else 5117 wp->dbuf_block_size = 512; 5118 5119 if (drm_rotation_90_or_270(rotation)) { 5120 switch (wp->cpp) { 5121 case 1: 5122 wp->y_min_scanlines = 16; 5123 break; 5124 case 2: 5125 wp->y_min_scanlines = 8; 5126 break; 5127 case 4: 5128 wp->y_min_scanlines = 4; 5129 break; 5130 default: 5131 MISSING_CASE(wp->cpp); 5132 return -EINVAL; 5133 } 5134 } else { 5135 wp->y_min_scanlines = 4; 5136 } 5137 5138 if (skl_needs_memory_bw_wa(dev_priv)) 5139 wp->y_min_scanlines *= 2; 5140 5141 wp->plane_bytes_per_line = wp->width * wp->cpp; 5142 if (wp->y_tiled) { 5143 interm_pbpl = DIV_ROUND_UP(wp->plane_bytes_per_line * 5144 wp->y_min_scanlines, 5145 wp->dbuf_block_size); 5146 5147 if (DISPLAY_VER(dev_priv) >= 10) 5148 interm_pbpl++; 5149 5150 wp->plane_blocks_per_line = div_fixed16(interm_pbpl, 5151 wp->y_min_scanlines); 5152 } else { 5153 interm_pbpl = DIV_ROUND_UP(wp->plane_bytes_per_line, 5154 wp->dbuf_block_size); 5155 5156 if (!wp->x_tiled || DISPLAY_VER(dev_priv) >= 10) 5157 interm_pbpl++; 5158 5159 wp->plane_blocks_per_line = u32_to_fixed16(interm_pbpl); 5160 } 5161 5162 wp->y_tile_minimum = mul_u32_fixed16(wp->y_min_scanlines, 5163 wp->plane_blocks_per_line); 5164 5165 wp->linetime_us = fixed16_to_u32_round_up( 5166 intel_get_linetime_us(crtc_state)); 5167 5168 return 0; 5169} 5170 5171static int 5172skl_compute_plane_wm_params(const struct intel_crtc_state *crtc_state, 5173 const struct intel_plane_state *plane_state, 5174 struct skl_wm_params *wp, int color_plane) 5175{ 5176 const struct drm_framebuffer *fb = plane_state->hw.fb; 5177 int width; 5178 5179 /* 5180 * Src coordinates are already rotated by 270 degrees for 5181 * the 90/270 degree plane rotation cases (to match the 5182 * GTT mapping), hence no need to account for rotation here. 5183 */ 5184 width = drm_rect_width(&plane_state->uapi.src) >> 16; 5185 5186 return skl_compute_wm_params(crtc_state, width, 5187 fb->format, fb->modifier, 5188 plane_state->hw.rotation, 5189 intel_plane_pixel_rate(crtc_state, plane_state), 5190 wp, color_plane); 5191} 5192 5193static bool skl_wm_has_lines(struct drm_i915_private *dev_priv, int level) 5194{ 5195 if (DISPLAY_VER(dev_priv) >= 10) 5196 return true; 5197 5198 /* The number of lines are ignored for the level 0 watermark. */ 5199 return level > 0; 5200} 5201 5202static void skl_compute_plane_wm(const struct intel_crtc_state *crtc_state, 5203 int level, 5204 unsigned int latency, 5205 const struct skl_wm_params *wp, 5206 const struct skl_wm_level *result_prev, 5207 struct skl_wm_level *result /* out */) 5208{ 5209 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 5210 uint_fixed_16_16_t method1, method2; 5211 uint_fixed_16_16_t selected_result; 5212 u32 blocks, lines, min_ddb_alloc = 0; 5213 5214 if (latency == 0) { 5215 /* reject it */ 5216 result->min_ddb_alloc = U16_MAX; 5217 return; 5218 } 5219 5220 /* 5221 * WaIncreaseLatencyIPCEnabled: kbl,cfl 5222 * Display WA #1141: kbl,cfl 5223 */ 5224 if ((IS_KABYLAKE(dev_priv) || 5225 IS_COFFEELAKE(dev_priv) || 5226 IS_COMETLAKE(dev_priv)) && 5227 dev_priv->ipc_enabled) 5228 latency += 4; 5229 5230 if (skl_needs_memory_bw_wa(dev_priv) && wp->x_tiled) 5231 latency += 15; 5232 5233 method1 = skl_wm_method1(dev_priv, wp->plane_pixel_rate, 5234 wp->cpp, latency, wp->dbuf_block_size); 5235 method2 = skl_wm_method2(wp->plane_pixel_rate, 5236 crtc_state->hw.pipe_mode.crtc_htotal, 5237 latency, 5238 wp->plane_blocks_per_line); 5239 5240 if (wp->y_tiled) { 5241 selected_result = max_fixed16(method2, wp->y_tile_minimum); 5242 } else { 5243 if ((wp->cpp * crtc_state->hw.pipe_mode.crtc_htotal / 5244 wp->dbuf_block_size < 1) && 5245 (wp->plane_bytes_per_line / wp->dbuf_block_size < 1)) { 5246 selected_result = method2; 5247 } else if (latency >= wp->linetime_us) { 5248 if (IS_DISPLAY_VER(dev_priv, 9)) 5249 selected_result = min_fixed16(method1, method2); 5250 else 5251 selected_result = method2; 5252 } else { 5253 selected_result = method1; 5254 } 5255 } 5256 5257 blocks = fixed16_to_u32_round_up(selected_result) + 1; 5258 lines = div_round_up_fixed16(selected_result, 5259 wp->plane_blocks_per_line); 5260 5261 if (IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv)) { 5262 /* Display WA #1125: skl,bxt,kbl */ 5263 if (level == 0 && wp->rc_surface) 5264 blocks += fixed16_to_u32_round_up(wp->y_tile_minimum); 5265 5266 /* Display WA #1126: skl,bxt,kbl */ 5267 if (level >= 1 && level <= 7) { 5268 if (wp->y_tiled) { 5269 blocks += fixed16_to_u32_round_up(wp->y_tile_minimum); 5270 lines += wp->y_min_scanlines; 5271 } else { 5272 blocks++; 5273 } 5274 5275 /* 5276 * Make sure result blocks for higher latency levels are 5277 * atleast as high as level below the current level. 5278 * Assumption in DDB algorithm optimization for special 5279 * cases. Also covers Display WA #1125 for RC. 5280 */ 5281 if (result_prev->blocks > blocks) 5282 blocks = result_prev->blocks; 5283 } 5284 } 5285 5286 if (DISPLAY_VER(dev_priv) >= 11) { 5287 if (wp->y_tiled) { 5288 int extra_lines; 5289 5290 if (lines % wp->y_min_scanlines == 0) 5291 extra_lines = wp->y_min_scanlines; 5292 else 5293 extra_lines = wp->y_min_scanlines * 2 - 5294 lines % wp->y_min_scanlines; 5295 5296 min_ddb_alloc = mul_round_up_u32_fixed16(lines + extra_lines, 5297 wp->plane_blocks_per_line); 5298 } else { 5299 min_ddb_alloc = blocks + DIV_ROUND_UP(blocks, 10); 5300 } 5301 } 5302 5303 if (!skl_wm_has_lines(dev_priv, level)) 5304 lines = 0; 5305 5306 if (lines > 31) { 5307 /* reject it */ 5308 result->min_ddb_alloc = U16_MAX; 5309 return; 5310 } 5311 5312 /* 5313 * If lines is valid, assume we can use this watermark level 5314 * for now. We'll come back and disable it after we calculate the 5315 * DDB allocation if it turns out we don't actually have enough 5316 * blocks to satisfy it. 5317 */ 5318 result->blocks = blocks; 5319 result->lines = lines; 5320 /* Bspec says: value >= plane ddb allocation -> invalid, hence the +1 here */ 5321 result->min_ddb_alloc = max(min_ddb_alloc, blocks) + 1; 5322 result->enable = true; 5323 5324 if (DISPLAY_VER(dev_priv) < 12) 5325 result->can_sagv = latency >= dev_priv->sagv_block_time_us; 5326} 5327 5328static void 5329skl_compute_wm_levels(const struct intel_crtc_state *crtc_state, 5330 const struct skl_wm_params *wm_params, 5331 struct skl_wm_level *levels) 5332{ 5333 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 5334 int level, max_level = ilk_wm_max_level(dev_priv); 5335 struct skl_wm_level *result_prev = &levels[0]; 5336 5337 for (level = 0; level <= max_level; level++) { 5338 struct skl_wm_level *result = &levels[level]; 5339 unsigned int latency = dev_priv->wm.skl_latency[level]; 5340 5341 skl_compute_plane_wm(crtc_state, level, latency, 5342 wm_params, result_prev, result); 5343 5344 result_prev = result; 5345 } 5346} 5347 5348static void tgl_compute_sagv_wm(const struct intel_crtc_state *crtc_state, 5349 const struct skl_wm_params *wm_params, 5350 struct skl_plane_wm *plane_wm) 5351{ 5352 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 5353 struct skl_wm_level *sagv_wm = &plane_wm->sagv.wm0; 5354 struct skl_wm_level *levels = plane_wm->wm; 5355 unsigned int latency = dev_priv->wm.skl_latency[0] + dev_priv->sagv_block_time_us; 5356 5357 skl_compute_plane_wm(crtc_state, 0, latency, 5358 wm_params, &levels[0], 5359 sagv_wm); 5360} 5361 5362static void skl_compute_transition_wm(struct drm_i915_private *dev_priv, 5363 struct skl_wm_level *trans_wm, 5364 const struct skl_wm_level *wm0, 5365 const struct skl_wm_params *wp) 5366{ 5367 u16 trans_min, trans_amount, trans_y_tile_min; 5368 u16 wm0_blocks, trans_offset, blocks; 5369 5370 /* Transition WM don't make any sense if ipc is disabled */ 5371 if (!dev_priv->ipc_enabled) 5372 return; 5373 5374 /* 5375 * WaDisableTWM:skl,kbl,cfl,bxt 5376 * Transition WM are not recommended by HW team for GEN9 5377 */ 5378 if (IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv)) 5379 return; 5380 5381 if (DISPLAY_VER(dev_priv) >= 11) 5382 trans_min = 4; 5383 else 5384 trans_min = 14; 5385 5386 /* Display WA #1140: glk,cnl */ 5387 if (IS_DISPLAY_VER(dev_priv, 10)) 5388 trans_amount = 0; 5389 else 5390 trans_amount = 10; /* This is configurable amount */ 5391 5392 trans_offset = trans_min + trans_amount; 5393 5394 /* 5395 * The spec asks for Selected Result Blocks for wm0 (the real value), 5396 * not Result Blocks (the integer value). Pay attention to the capital 5397 * letters. The value wm_l0->blocks is actually Result Blocks, but 5398 * since Result Blocks is the ceiling of Selected Result Blocks plus 1, 5399 * and since we later will have to get the ceiling of the sum in the 5400 * transition watermarks calculation, we can just pretend Selected 5401 * Result Blocks is Result Blocks minus 1 and it should work for the 5402 * current platforms. 5403 */ 5404 wm0_blocks = wm0->blocks - 1; 5405 5406 if (wp->y_tiled) { 5407 trans_y_tile_min = 5408 (u16)mul_round_up_u32_fixed16(2, wp->y_tile_minimum); 5409 blocks = max(wm0_blocks, trans_y_tile_min) + trans_offset; 5410 } else { 5411 blocks = wm0_blocks + trans_offset; 5412 } 5413 blocks++; 5414 5415 /* 5416 * Just assume we can enable the transition watermark. After 5417 * computing the DDB we'll come back and disable it if that 5418 * assumption turns out to be false. 5419 */ 5420 trans_wm->blocks = blocks; 5421 trans_wm->min_ddb_alloc = max_t(u16, wm0->min_ddb_alloc, blocks + 1); 5422 trans_wm->enable = true; 5423} 5424 5425static int skl_build_plane_wm_single(struct intel_crtc_state *crtc_state, 5426 const struct intel_plane_state *plane_state, 5427 enum plane_id plane_id, int color_plane) 5428{ 5429 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 5430 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 5431 struct skl_plane_wm *wm = &crtc_state->wm.skl.raw.planes[plane_id]; 5432 struct skl_wm_params wm_params; 5433 int ret; 5434 5435 ret = skl_compute_plane_wm_params(crtc_state, plane_state, 5436 &wm_params, color_plane); 5437 if (ret) 5438 return ret; 5439 5440 skl_compute_wm_levels(crtc_state, &wm_params, wm->wm); 5441 5442 skl_compute_transition_wm(dev_priv, &wm->trans_wm, 5443 &wm->wm[0], &wm_params); 5444 5445 if (DISPLAY_VER(dev_priv) >= 12) { 5446 tgl_compute_sagv_wm(crtc_state, &wm_params, wm); 5447 5448 skl_compute_transition_wm(dev_priv, &wm->sagv.trans_wm, 5449 &wm->sagv.wm0, &wm_params); 5450 } 5451 5452 return 0; 5453} 5454 5455static int skl_build_plane_wm_uv(struct intel_crtc_state *crtc_state, 5456 const struct intel_plane_state *plane_state, 5457 enum plane_id plane_id) 5458{ 5459 struct skl_plane_wm *wm = &crtc_state->wm.skl.raw.planes[plane_id]; 5460 struct skl_wm_params wm_params; 5461 int ret; 5462 5463 wm->is_planar = true; 5464 5465 /* uv plane watermarks must also be validated for NV12/Planar */ 5466 ret = skl_compute_plane_wm_params(crtc_state, plane_state, 5467 &wm_params, 1); 5468 if (ret) 5469 return ret; 5470 5471 skl_compute_wm_levels(crtc_state, &wm_params, wm->uv_wm); 5472 5473 return 0; 5474} 5475 5476static int skl_build_plane_wm(struct intel_crtc_state *crtc_state, 5477 const struct intel_plane_state *plane_state) 5478{ 5479 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 5480 enum plane_id plane_id = plane->id; 5481 struct skl_plane_wm *wm = &crtc_state->wm.skl.raw.planes[plane_id]; 5482 const struct drm_framebuffer *fb = plane_state->hw.fb; 5483 int ret; 5484 5485 memset(wm, 0, sizeof(*wm)); 5486 5487 if (!intel_wm_plane_visible(crtc_state, plane_state)) 5488 return 0; 5489 5490 ret = skl_build_plane_wm_single(crtc_state, plane_state, 5491 plane_id, 0); 5492 if (ret) 5493 return ret; 5494 5495 if (fb->format->is_yuv && fb->format->num_planes > 1) { 5496 ret = skl_build_plane_wm_uv(crtc_state, plane_state, 5497 plane_id); 5498 if (ret) 5499 return ret; 5500 } 5501 5502 return 0; 5503} 5504 5505static int icl_build_plane_wm(struct intel_crtc_state *crtc_state, 5506 const struct intel_plane_state *plane_state) 5507{ 5508 struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane); 5509 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 5510 enum plane_id plane_id = plane->id; 5511 struct skl_plane_wm *wm = &crtc_state->wm.skl.raw.planes[plane_id]; 5512 int ret; 5513 5514 /* Watermarks calculated in master */ 5515 if (plane_state->planar_slave) 5516 return 0; 5517 5518 memset(wm, 0, sizeof(*wm)); 5519 5520 if (plane_state->planar_linked_plane) { 5521 const struct drm_framebuffer *fb = plane_state->hw.fb; 5522 enum plane_id y_plane_id = plane_state->planar_linked_plane->id; 5523 5524 drm_WARN_ON(&dev_priv->drm, 5525 !intel_wm_plane_visible(crtc_state, plane_state)); 5526 drm_WARN_ON(&dev_priv->drm, !fb->format->is_yuv || 5527 fb->format->num_planes == 1); 5528 5529 ret = skl_build_plane_wm_single(crtc_state, plane_state, 5530 y_plane_id, 0); 5531 if (ret) 5532 return ret; 5533 5534 ret = skl_build_plane_wm_single(crtc_state, plane_state, 5535 plane_id, 1); 5536 if (ret) 5537 return ret; 5538 } else if (intel_wm_plane_visible(crtc_state, plane_state)) { 5539 ret = skl_build_plane_wm_single(crtc_state, plane_state, 5540 plane_id, 0); 5541 if (ret) 5542 return ret; 5543 } 5544 5545 return 0; 5546} 5547 5548static int skl_build_pipe_wm(struct intel_atomic_state *state, 5549 struct intel_crtc *crtc) 5550{ 5551 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 5552 struct intel_crtc_state *crtc_state = 5553 intel_atomic_get_new_crtc_state(state, crtc); 5554 const struct intel_plane_state *plane_state; 5555 struct intel_plane *plane; 5556 int ret, i; 5557 5558 for_each_new_intel_plane_in_state(state, plane, plane_state, i) { 5559 /* 5560 * FIXME should perhaps check {old,new}_plane_crtc->hw.crtc 5561 * instead but we don't populate that correctly for NV12 Y 5562 * planes so for now hack this. 5563 */ 5564 if (plane->pipe != crtc->pipe) 5565 continue; 5566 5567 if (DISPLAY_VER(dev_priv) >= 11) 5568 ret = icl_build_plane_wm(crtc_state, plane_state); 5569 else 5570 ret = skl_build_plane_wm(crtc_state, plane_state); 5571 if (ret) 5572 return ret; 5573 } 5574 5575 crtc_state->wm.skl.optimal = crtc_state->wm.skl.raw; 5576 5577 return 0; 5578} 5579 5580static void skl_ddb_entry_write(struct drm_i915_private *dev_priv, 5581 i915_reg_t reg, 5582 const struct skl_ddb_entry *entry) 5583{ 5584 if (entry->end) 5585 intel_de_write_fw(dev_priv, reg, 5586 (entry->end - 1) << 16 | entry->start); 5587 else 5588 intel_de_write_fw(dev_priv, reg, 0); 5589} 5590 5591static void skl_write_wm_level(struct drm_i915_private *dev_priv, 5592 i915_reg_t reg, 5593 const struct skl_wm_level *level) 5594{ 5595 u32 val = 0; 5596 5597 if (level->enable) 5598 val |= PLANE_WM_EN; 5599 if (level->ignore_lines) 5600 val |= PLANE_WM_IGNORE_LINES; 5601 val |= level->blocks; 5602 val |= level->lines << PLANE_WM_LINES_SHIFT; 5603 5604 intel_de_write_fw(dev_priv, reg, val); 5605} 5606 5607void skl_write_plane_wm(struct intel_plane *plane, 5608 const struct intel_crtc_state *crtc_state) 5609{ 5610 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 5611 int level, max_level = ilk_wm_max_level(dev_priv); 5612 enum plane_id plane_id = plane->id; 5613 enum pipe pipe = plane->pipe; 5614 const struct skl_pipe_wm *pipe_wm = &crtc_state->wm.skl.optimal; 5615 const struct skl_plane_wm *wm = &pipe_wm->planes[plane_id]; 5616 const struct skl_ddb_entry *ddb_y = 5617 &crtc_state->wm.skl.plane_ddb_y[plane_id]; 5618 const struct skl_ddb_entry *ddb_uv = 5619 &crtc_state->wm.skl.plane_ddb_uv[plane_id]; 5620 5621 for (level = 0; level <= max_level; level++) 5622 skl_write_wm_level(dev_priv, PLANE_WM(pipe, plane_id, level), 5623 skl_plane_wm_level(pipe_wm, plane_id, level)); 5624 5625 skl_write_wm_level(dev_priv, PLANE_WM_TRANS(pipe, plane_id), 5626 skl_plane_trans_wm(pipe_wm, plane_id)); 5627 5628 if (DISPLAY_VER(dev_priv) >= 11) { 5629 skl_ddb_entry_write(dev_priv, 5630 PLANE_BUF_CFG(pipe, plane_id), ddb_y); 5631 return; 5632 } 5633 5634 if (wm->is_planar) 5635 swap(ddb_y, ddb_uv); 5636 5637 skl_ddb_entry_write(dev_priv, 5638 PLANE_BUF_CFG(pipe, plane_id), ddb_y); 5639 skl_ddb_entry_write(dev_priv, 5640 PLANE_NV12_BUF_CFG(pipe, plane_id), ddb_uv); 5641} 5642 5643void skl_write_cursor_wm(struct intel_plane *plane, 5644 const struct intel_crtc_state *crtc_state) 5645{ 5646 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 5647 int level, max_level = ilk_wm_max_level(dev_priv); 5648 enum plane_id plane_id = plane->id; 5649 enum pipe pipe = plane->pipe; 5650 const struct skl_pipe_wm *pipe_wm = &crtc_state->wm.skl.optimal; 5651 const struct skl_ddb_entry *ddb = 5652 &crtc_state->wm.skl.plane_ddb_y[plane_id]; 5653 5654 for (level = 0; level <= max_level; level++) 5655 skl_write_wm_level(dev_priv, CUR_WM(pipe, level), 5656 skl_plane_wm_level(pipe_wm, plane_id, level)); 5657 5658 skl_write_wm_level(dev_priv, CUR_WM_TRANS(pipe), 5659 skl_plane_trans_wm(pipe_wm, plane_id)); 5660 5661 skl_ddb_entry_write(dev_priv, CUR_BUF_CFG(pipe), ddb); 5662} 5663 5664bool skl_wm_level_equals(const struct skl_wm_level *l1, 5665 const struct skl_wm_level *l2) 5666{ 5667 return l1->enable == l2->enable && 5668 l1->ignore_lines == l2->ignore_lines && 5669 l1->lines == l2->lines && 5670 l1->blocks == l2->blocks; 5671} 5672 5673static bool skl_plane_wm_equals(struct drm_i915_private *dev_priv, 5674 const struct skl_plane_wm *wm1, 5675 const struct skl_plane_wm *wm2) 5676{ 5677 int level, max_level = ilk_wm_max_level(dev_priv); 5678 5679 for (level = 0; level <= max_level; level++) { 5680 /* 5681 * We don't check uv_wm as the hardware doesn't actually 5682 * use it. It only gets used for calculating the required 5683 * ddb allocation. 5684 */ 5685 if (!skl_wm_level_equals(&wm1->wm[level], &wm2->wm[level])) 5686 return false; 5687 } 5688 5689 return skl_wm_level_equals(&wm1->trans_wm, &wm2->trans_wm) && 5690 skl_wm_level_equals(&wm1->sagv.wm0, &wm2->sagv.wm0) && 5691 skl_wm_level_equals(&wm1->sagv.trans_wm, &wm2->sagv.trans_wm); 5692} 5693 5694static bool skl_ddb_entries_overlap(const struct skl_ddb_entry *a, 5695 const struct skl_ddb_entry *b) 5696{ 5697 return a->start < b->end && b->start < a->end; 5698} 5699 5700static void skl_ddb_entry_union(struct skl_ddb_entry *a, 5701 const struct skl_ddb_entry *b) 5702{ 5703 if (a->end && b->end) { 5704 a->start = min(a->start, b->start); 5705 a->end = max(a->end, b->end); 5706 } else if (b->end) { 5707 a->start = b->start; 5708 a->end = b->end; 5709 } 5710} 5711 5712bool skl_ddb_allocation_overlaps(const struct skl_ddb_entry *ddb, 5713 const struct skl_ddb_entry *entries, 5714 int num_entries, int ignore_idx) 5715{ 5716 int i; 5717 5718 for (i = 0; i < num_entries; i++) { 5719 if (i != ignore_idx && 5720 skl_ddb_entries_overlap(ddb, &entries[i])) 5721 return true; 5722 } 5723 5724 return false; 5725} 5726 5727static int 5728skl_ddb_add_affected_planes(const struct intel_crtc_state *old_crtc_state, 5729 struct intel_crtc_state *new_crtc_state) 5730{ 5731 struct intel_atomic_state *state = to_intel_atomic_state(new_crtc_state->uapi.state); 5732 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); 5733 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 5734 struct intel_plane *plane; 5735 5736 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) { 5737 struct intel_plane_state *plane_state; 5738 enum plane_id plane_id = plane->id; 5739 5740 if (skl_ddb_entry_equal(&old_crtc_state->wm.skl.plane_ddb_y[plane_id], 5741 &new_crtc_state->wm.skl.plane_ddb_y[plane_id]) && 5742 skl_ddb_entry_equal(&old_crtc_state->wm.skl.plane_ddb_uv[plane_id], 5743 &new_crtc_state->wm.skl.plane_ddb_uv[plane_id])) 5744 continue; 5745 5746 plane_state = intel_atomic_get_plane_state(state, plane); 5747 if (IS_ERR(plane_state)) 5748 return PTR_ERR(plane_state); 5749 5750 new_crtc_state->update_planes |= BIT(plane_id); 5751 } 5752 5753 return 0; 5754} 5755 5756static u8 intel_dbuf_enabled_slices(const struct intel_dbuf_state *dbuf_state) 5757{ 5758 struct drm_i915_private *dev_priv = to_i915(dbuf_state->base.state->base.dev); 5759 u8 enabled_slices; 5760 enum pipe pipe; 5761 5762 /* 5763 * FIXME: For now we always enable slice S1 as per 5764 * the Bspec display initialization sequence. 5765 */ 5766 enabled_slices = BIT(DBUF_S1); 5767 5768 for_each_pipe(dev_priv, pipe) 5769 enabled_slices |= dbuf_state->slices[pipe]; 5770 5771 return enabled_slices; 5772} 5773 5774static int 5775skl_compute_ddb(struct intel_atomic_state *state) 5776{ 5777 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 5778 const struct intel_dbuf_state *old_dbuf_state; 5779 struct intel_dbuf_state *new_dbuf_state = NULL; 5780 const struct intel_crtc_state *old_crtc_state; 5781 struct intel_crtc_state *new_crtc_state; 5782 struct intel_crtc *crtc; 5783 int ret, i; 5784 5785 for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) { 5786 new_dbuf_state = intel_atomic_get_dbuf_state(state); 5787 if (IS_ERR(new_dbuf_state)) 5788 return PTR_ERR(new_dbuf_state); 5789 5790 old_dbuf_state = intel_atomic_get_old_dbuf_state(state); 5791 break; 5792 } 5793 5794 if (!new_dbuf_state) 5795 return 0; 5796 5797 new_dbuf_state->active_pipes = 5798 intel_calc_active_pipes(state, old_dbuf_state->active_pipes); 5799 5800 if (old_dbuf_state->active_pipes != new_dbuf_state->active_pipes) { 5801 ret = intel_atomic_lock_global_state(&new_dbuf_state->base); 5802 if (ret) 5803 return ret; 5804 } 5805 5806 for_each_intel_crtc(&dev_priv->drm, crtc) { 5807 enum pipe pipe = crtc->pipe; 5808 5809 new_dbuf_state->slices[pipe] = 5810 skl_compute_dbuf_slices(crtc, new_dbuf_state->active_pipes); 5811 5812 if (old_dbuf_state->slices[pipe] == new_dbuf_state->slices[pipe]) 5813 continue; 5814 5815 ret = intel_atomic_lock_global_state(&new_dbuf_state->base); 5816 if (ret) 5817 return ret; 5818 } 5819 5820 new_dbuf_state->enabled_slices = intel_dbuf_enabled_slices(new_dbuf_state); 5821 5822 if (old_dbuf_state->enabled_slices != new_dbuf_state->enabled_slices) { 5823 ret = intel_atomic_serialize_global_state(&new_dbuf_state->base); 5824 if (ret) 5825 return ret; 5826 5827 drm_dbg_kms(&dev_priv->drm, 5828 "Enabled dbuf slices 0x%x -> 0x%x (out of %d dbuf slices)\n", 5829 old_dbuf_state->enabled_slices, 5830 new_dbuf_state->enabled_slices, 5831 INTEL_INFO(dev_priv)->num_supported_dbuf_slices); 5832 } 5833 5834 for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) { 5835 enum pipe pipe = crtc->pipe; 5836 5837 new_dbuf_state->weight[pipe] = intel_crtc_ddb_weight(new_crtc_state); 5838 5839 if (old_dbuf_state->weight[pipe] == new_dbuf_state->weight[pipe]) 5840 continue; 5841 5842 ret = intel_atomic_lock_global_state(&new_dbuf_state->base); 5843 if (ret) 5844 return ret; 5845 } 5846 5847 for_each_intel_crtc(&dev_priv->drm, crtc) { 5848 ret = skl_crtc_allocate_ddb(state, crtc); 5849 if (ret) 5850 return ret; 5851 } 5852 5853 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, 5854 new_crtc_state, i) { 5855 ret = skl_allocate_plane_ddb(state, crtc); 5856 if (ret) 5857 return ret; 5858 5859 ret = skl_ddb_add_affected_planes(old_crtc_state, 5860 new_crtc_state); 5861 if (ret) 5862 return ret; 5863 } 5864 5865 return 0; 5866} 5867 5868static char enast(bool enable) 5869{ 5870 return enable ? '*' : ' '; 5871} 5872 5873static void 5874skl_print_wm_changes(struct intel_atomic_state *state) 5875{ 5876 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 5877 const struct intel_crtc_state *old_crtc_state; 5878 const struct intel_crtc_state *new_crtc_state; 5879 struct intel_plane *plane; 5880 struct intel_crtc *crtc; 5881 int i; 5882 5883 if (!drm_debug_enabled(DRM_UT_KMS)) 5884 return; 5885 5886 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, 5887 new_crtc_state, i) { 5888 const struct skl_pipe_wm *old_pipe_wm, *new_pipe_wm; 5889 5890 old_pipe_wm = &old_crtc_state->wm.skl.optimal; 5891 new_pipe_wm = &new_crtc_state->wm.skl.optimal; 5892 5893 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) { 5894 enum plane_id plane_id = plane->id; 5895 const struct skl_ddb_entry *old, *new; 5896 5897 old = &old_crtc_state->wm.skl.plane_ddb_y[plane_id]; 5898 new = &new_crtc_state->wm.skl.plane_ddb_y[plane_id]; 5899 5900 if (skl_ddb_entry_equal(old, new)) 5901 continue; 5902 5903 drm_dbg_kms(&dev_priv->drm, 5904 "[PLANE:%d:%s] ddb (%4d - %4d) -> (%4d - %4d), size %4d -> %4d\n", 5905 plane->base.base.id, plane->base.name, 5906 old->start, old->end, new->start, new->end, 5907 skl_ddb_entry_size(old), skl_ddb_entry_size(new)); 5908 } 5909 5910 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) { 5911 enum plane_id plane_id = plane->id; 5912 const struct skl_plane_wm *old_wm, *new_wm; 5913 5914 old_wm = &old_pipe_wm->planes[plane_id]; 5915 new_wm = &new_pipe_wm->planes[plane_id]; 5916 5917 if (skl_plane_wm_equals(dev_priv, old_wm, new_wm)) 5918 continue; 5919 5920 drm_dbg_kms(&dev_priv->drm, 5921 "[PLANE:%d:%s] level %cwm0,%cwm1,%cwm2,%cwm3,%cwm4,%cwm5,%cwm6,%cwm7,%ctwm,%cswm,%cstwm" 5922 " -> %cwm0,%cwm1,%cwm2,%cwm3,%cwm4,%cwm5,%cwm6,%cwm7,%ctwm,%cswm,%cstwm\n", 5923 plane->base.base.id, plane->base.name, 5924 enast(old_wm->wm[0].enable), enast(old_wm->wm[1].enable), 5925 enast(old_wm->wm[2].enable), enast(old_wm->wm[3].enable), 5926 enast(old_wm->wm[4].enable), enast(old_wm->wm[5].enable), 5927 enast(old_wm->wm[6].enable), enast(old_wm->wm[7].enable), 5928 enast(old_wm->trans_wm.enable), 5929 enast(old_wm->sagv.wm0.enable), 5930 enast(old_wm->sagv.trans_wm.enable), 5931 enast(new_wm->wm[0].enable), enast(new_wm->wm[1].enable), 5932 enast(new_wm->wm[2].enable), enast(new_wm->wm[3].enable), 5933 enast(new_wm->wm[4].enable), enast(new_wm->wm[5].enable), 5934 enast(new_wm->wm[6].enable), enast(new_wm->wm[7].enable), 5935 enast(new_wm->trans_wm.enable), 5936 enast(new_wm->sagv.wm0.enable), 5937 enast(new_wm->sagv.trans_wm.enable)); 5938 5939 drm_dbg_kms(&dev_priv->drm, 5940 "[PLANE:%d:%s] lines %c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%4d" 5941 " -> %c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%4d\n", 5942 plane->base.base.id, plane->base.name, 5943 enast(old_wm->wm[0].ignore_lines), old_wm->wm[0].lines, 5944 enast(old_wm->wm[1].ignore_lines), old_wm->wm[1].lines, 5945 enast(old_wm->wm[2].ignore_lines), old_wm->wm[2].lines, 5946 enast(old_wm->wm[3].ignore_lines), old_wm->wm[3].lines, 5947 enast(old_wm->wm[4].ignore_lines), old_wm->wm[4].lines, 5948 enast(old_wm->wm[5].ignore_lines), old_wm->wm[5].lines, 5949 enast(old_wm->wm[6].ignore_lines), old_wm->wm[6].lines, 5950 enast(old_wm->wm[7].ignore_lines), old_wm->wm[7].lines, 5951 enast(old_wm->trans_wm.ignore_lines), old_wm->trans_wm.lines, 5952 enast(old_wm->sagv.wm0.ignore_lines), old_wm->sagv.wm0.lines, 5953 enast(old_wm->sagv.trans_wm.ignore_lines), old_wm->sagv.trans_wm.lines, 5954 enast(new_wm->wm[0].ignore_lines), new_wm->wm[0].lines, 5955 enast(new_wm->wm[1].ignore_lines), new_wm->wm[1].lines, 5956 enast(new_wm->wm[2].ignore_lines), new_wm->wm[2].lines, 5957 enast(new_wm->wm[3].ignore_lines), new_wm->wm[3].lines, 5958 enast(new_wm->wm[4].ignore_lines), new_wm->wm[4].lines, 5959 enast(new_wm->wm[5].ignore_lines), new_wm->wm[5].lines, 5960 enast(new_wm->wm[6].ignore_lines), new_wm->wm[6].lines, 5961 enast(new_wm->wm[7].ignore_lines), new_wm->wm[7].lines, 5962 enast(new_wm->trans_wm.ignore_lines), new_wm->trans_wm.lines, 5963 enast(new_wm->sagv.wm0.ignore_lines), new_wm->sagv.wm0.lines, 5964 enast(new_wm->sagv.trans_wm.ignore_lines), new_wm->sagv.trans_wm.lines); 5965 5966 drm_dbg_kms(&dev_priv->drm, 5967 "[PLANE:%d:%s] blocks %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%5d" 5968 " -> %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%5d\n", 5969 plane->base.base.id, plane->base.name, 5970 old_wm->wm[0].blocks, old_wm->wm[1].blocks, 5971 old_wm->wm[2].blocks, old_wm->wm[3].blocks, 5972 old_wm->wm[4].blocks, old_wm->wm[5].blocks, 5973 old_wm->wm[6].blocks, old_wm->wm[7].blocks, 5974 old_wm->trans_wm.blocks, 5975 old_wm->sagv.wm0.blocks, 5976 old_wm->sagv.trans_wm.blocks, 5977 new_wm->wm[0].blocks, new_wm->wm[1].blocks, 5978 new_wm->wm[2].blocks, new_wm->wm[3].blocks, 5979 new_wm->wm[4].blocks, new_wm->wm[5].blocks, 5980 new_wm->wm[6].blocks, new_wm->wm[7].blocks, 5981 new_wm->trans_wm.blocks, 5982 new_wm->sagv.wm0.blocks, 5983 new_wm->sagv.trans_wm.blocks); 5984 5985 drm_dbg_kms(&dev_priv->drm, 5986 "[PLANE:%d:%s] min_ddb %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%5d" 5987 " -> %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%5d\n", 5988 plane->base.base.id, plane->base.name, 5989 old_wm->wm[0].min_ddb_alloc, old_wm->wm[1].min_ddb_alloc, 5990 old_wm->wm[2].min_ddb_alloc, old_wm->wm[3].min_ddb_alloc, 5991 old_wm->wm[4].min_ddb_alloc, old_wm->wm[5].min_ddb_alloc, 5992 old_wm->wm[6].min_ddb_alloc, old_wm->wm[7].min_ddb_alloc, 5993 old_wm->trans_wm.min_ddb_alloc, 5994 old_wm->sagv.wm0.min_ddb_alloc, 5995 old_wm->sagv.trans_wm.min_ddb_alloc, 5996 new_wm->wm[0].min_ddb_alloc, new_wm->wm[1].min_ddb_alloc, 5997 new_wm->wm[2].min_ddb_alloc, new_wm->wm[3].min_ddb_alloc, 5998 new_wm->wm[4].min_ddb_alloc, new_wm->wm[5].min_ddb_alloc, 5999 new_wm->wm[6].min_ddb_alloc, new_wm->wm[7].min_ddb_alloc, 6000 new_wm->trans_wm.min_ddb_alloc, 6001 new_wm->sagv.wm0.min_ddb_alloc, 6002 new_wm->sagv.trans_wm.min_ddb_alloc); 6003 } 6004 } 6005} 6006 6007static bool skl_plane_selected_wm_equals(struct intel_plane *plane, 6008 const struct skl_pipe_wm *old_pipe_wm, 6009 const struct skl_pipe_wm *new_pipe_wm) 6010{ 6011 struct drm_i915_private *i915 = to_i915(plane->base.dev); 6012 int level, max_level = ilk_wm_max_level(i915); 6013 6014 for (level = 0; level <= max_level; level++) { 6015 /* 6016 * We don't check uv_wm as the hardware doesn't actually 6017 * use it. It only gets used for calculating the required 6018 * ddb allocation. 6019 */ 6020 if (!skl_wm_level_equals(skl_plane_wm_level(old_pipe_wm, plane->id, level), 6021 skl_plane_wm_level(new_pipe_wm, plane->id, level))) 6022 return false; 6023 } 6024 6025 return skl_wm_level_equals(skl_plane_trans_wm(old_pipe_wm, plane->id), 6026 skl_plane_trans_wm(new_pipe_wm, plane->id)); 6027} 6028 6029/* 6030 * To make sure the cursor watermark registers are always consistent 6031 * with our computed state the following scenario needs special 6032 * treatment: 6033 * 6034 * 1. enable cursor 6035 * 2. move cursor entirely offscreen 6036 * 3. disable cursor 6037 * 6038 * Step 2. does call .disable_plane() but does not zero the watermarks 6039 * (since we consider an offscreen cursor still active for the purposes 6040 * of watermarks). Step 3. would not normally call .disable_plane() 6041 * because the actual plane visibility isn't changing, and we don't 6042 * deallocate the cursor ddb until the pipe gets disabled. So we must 6043 * force step 3. to call .disable_plane() to update the watermark 6044 * registers properly. 6045 * 6046 * Other planes do not suffer from this issues as their watermarks are 6047 * calculated based on the actual plane visibility. The only time this 6048 * can trigger for the other planes is during the initial readout as the 6049 * default value of the watermarks registers is not zero. 6050 */ 6051static int skl_wm_add_affected_planes(struct intel_atomic_state *state, 6052 struct intel_crtc *crtc) 6053{ 6054 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 6055 const struct intel_crtc_state *old_crtc_state = 6056 intel_atomic_get_old_crtc_state(state, crtc); 6057 struct intel_crtc_state *new_crtc_state = 6058 intel_atomic_get_new_crtc_state(state, crtc); 6059 struct intel_plane *plane; 6060 6061 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) { 6062 struct intel_plane_state *plane_state; 6063 enum plane_id plane_id = plane->id; 6064 6065 /* 6066 * Force a full wm update for every plane on modeset. 6067 * Required because the reset value of the wm registers 6068 * is non-zero, whereas we want all disabled planes to 6069 * have zero watermarks. So if we turn off the relevant 6070 * power well the hardware state will go out of sync 6071 * with the software state. 6072 */ 6073 if (!drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi) && 6074 skl_plane_selected_wm_equals(plane, 6075 &old_crtc_state->wm.skl.optimal, 6076 &new_crtc_state->wm.skl.optimal)) 6077 continue; 6078 6079 plane_state = intel_atomic_get_plane_state(state, plane); 6080 if (IS_ERR(plane_state)) 6081 return PTR_ERR(plane_state); 6082 6083 new_crtc_state->update_planes |= BIT(plane_id); 6084 } 6085 6086 return 0; 6087} 6088 6089static int 6090skl_compute_wm(struct intel_atomic_state *state) 6091{ 6092 struct intel_crtc *crtc; 6093 struct intel_crtc_state *new_crtc_state; 6094 int ret, i; 6095 6096 for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) { 6097 ret = skl_build_pipe_wm(state, crtc); 6098 if (ret) 6099 return ret; 6100 } 6101 6102 ret = skl_compute_ddb(state); 6103 if (ret) 6104 return ret; 6105 6106 ret = intel_compute_sagv_mask(state); 6107 if (ret) 6108 return ret; 6109 6110 /* 6111 * skl_compute_ddb() will have adjusted the final watermarks 6112 * based on how much ddb is available. Now we can actually 6113 * check if the final watermarks changed. 6114 */ 6115 for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) { 6116 ret = skl_wm_add_affected_planes(state, crtc); 6117 if (ret) 6118 return ret; 6119 } 6120 6121 skl_print_wm_changes(state); 6122 6123 return 0; 6124} 6125 6126static void ilk_compute_wm_config(struct drm_i915_private *dev_priv, 6127 struct intel_wm_config *config) 6128{ 6129 struct intel_crtc *crtc; 6130 6131 /* Compute the currently _active_ config */ 6132 for_each_intel_crtc(&dev_priv->drm, crtc) { 6133 const struct intel_pipe_wm *wm = &crtc->wm.active.ilk; 6134 6135 if (!wm->pipe_enabled) 6136 continue; 6137 6138 config->sprites_enabled |= wm->sprites_enabled; 6139 config->sprites_scaled |= wm->sprites_scaled; 6140 config->num_pipes_active++; 6141 } 6142} 6143 6144static void ilk_program_watermarks(struct drm_i915_private *dev_priv) 6145{ 6146 struct intel_pipe_wm lp_wm_1_2 = {}, lp_wm_5_6 = {}, *best_lp_wm; 6147 struct ilk_wm_maximums max; 6148 struct intel_wm_config config = {}; 6149 struct ilk_wm_values results = {}; 6150 enum intel_ddb_partitioning partitioning; 6151 6152 ilk_compute_wm_config(dev_priv, &config); 6153 6154 ilk_compute_wm_maximums(dev_priv, 1, &config, INTEL_DDB_PART_1_2, &max); 6155 ilk_wm_merge(dev_priv, &config, &max, &lp_wm_1_2); 6156 6157 /* 5/6 split only in single pipe config on IVB+ */ 6158 if (DISPLAY_VER(dev_priv) >= 7 && 6159 config.num_pipes_active == 1 && config.sprites_enabled) { 6160 ilk_compute_wm_maximums(dev_priv, 1, &config, INTEL_DDB_PART_5_6, &max); 6161 ilk_wm_merge(dev_priv, &config, &max, &lp_wm_5_6); 6162 6163 best_lp_wm = ilk_find_best_result(dev_priv, &lp_wm_1_2, &lp_wm_5_6); 6164 } else { 6165 best_lp_wm = &lp_wm_1_2; 6166 } 6167 6168 partitioning = (best_lp_wm == &lp_wm_1_2) ? 6169 INTEL_DDB_PART_1_2 : INTEL_DDB_PART_5_6; 6170 6171 ilk_compute_wm_results(dev_priv, best_lp_wm, partitioning, &results); 6172 6173 ilk_write_wm_values(dev_priv, &results); 6174} 6175 6176static void ilk_initial_watermarks(struct intel_atomic_state *state, 6177 struct intel_crtc *crtc) 6178{ 6179 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 6180 const struct intel_crtc_state *crtc_state = 6181 intel_atomic_get_new_crtc_state(state, crtc); 6182 6183 mutex_lock(&dev_priv->wm.wm_mutex); 6184 crtc->wm.active.ilk = crtc_state->wm.ilk.intermediate; 6185 ilk_program_watermarks(dev_priv); 6186 mutex_unlock(&dev_priv->wm.wm_mutex); 6187} 6188 6189static void ilk_optimize_watermarks(struct intel_atomic_state *state, 6190 struct intel_crtc *crtc) 6191{ 6192 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 6193 const struct intel_crtc_state *crtc_state = 6194 intel_atomic_get_new_crtc_state(state, crtc); 6195 6196 if (!crtc_state->wm.need_postvbl_update) 6197 return; 6198 6199 mutex_lock(&dev_priv->wm.wm_mutex); 6200 crtc->wm.active.ilk = crtc_state->wm.ilk.optimal; 6201 ilk_program_watermarks(dev_priv); 6202 mutex_unlock(&dev_priv->wm.wm_mutex); 6203} 6204 6205static void skl_wm_level_from_reg_val(u32 val, struct skl_wm_level *level) 6206{ 6207 level->enable = val & PLANE_WM_EN; 6208 level->ignore_lines = val & PLANE_WM_IGNORE_LINES; 6209 level->blocks = val & PLANE_WM_BLOCKS_MASK; 6210 level->lines = (val >> PLANE_WM_LINES_SHIFT) & 6211 PLANE_WM_LINES_MASK; 6212} 6213 6214void skl_pipe_wm_get_hw_state(struct intel_crtc *crtc, 6215 struct skl_pipe_wm *out) 6216{ 6217 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 6218 enum pipe pipe = crtc->pipe; 6219 int level, max_level; 6220 enum plane_id plane_id; 6221 u32 val; 6222 6223 max_level = ilk_wm_max_level(dev_priv); 6224 6225 for_each_plane_id_on_crtc(crtc, plane_id) { 6226 struct skl_plane_wm *wm = &out->planes[plane_id]; 6227 6228 for (level = 0; level <= max_level; level++) { 6229 if (plane_id != PLANE_CURSOR) 6230 val = intel_uncore_read(&dev_priv->uncore, PLANE_WM(pipe, plane_id, level)); 6231 else 6232 val = intel_uncore_read(&dev_priv->uncore, CUR_WM(pipe, level)); 6233 6234 skl_wm_level_from_reg_val(val, &wm->wm[level]); 6235 } 6236 6237 if (plane_id != PLANE_CURSOR) 6238 val = intel_uncore_read(&dev_priv->uncore, PLANE_WM_TRANS(pipe, plane_id)); 6239 else 6240 val = intel_uncore_read(&dev_priv->uncore, CUR_WM_TRANS(pipe)); 6241 6242 skl_wm_level_from_reg_val(val, &wm->trans_wm); 6243 6244 if (DISPLAY_VER(dev_priv) >= 12) { 6245 wm->sagv.wm0 = wm->wm[0]; 6246 wm->sagv.trans_wm = wm->trans_wm; 6247 } 6248 } 6249} 6250 6251void skl_wm_get_hw_state(struct drm_i915_private *dev_priv) 6252{ 6253 struct intel_dbuf_state *dbuf_state = 6254 to_intel_dbuf_state(dev_priv->dbuf.obj.state); 6255 struct intel_crtc *crtc; 6256 6257 for_each_intel_crtc(&dev_priv->drm, crtc) { 6258 struct intel_crtc_state *crtc_state = 6259 to_intel_crtc_state(crtc->base.state); 6260 enum pipe pipe = crtc->pipe; 6261 enum plane_id plane_id; 6262 6263 skl_pipe_wm_get_hw_state(crtc, &crtc_state->wm.skl.optimal); 6264 crtc_state->wm.skl.raw = crtc_state->wm.skl.optimal; 6265 6266 memset(&dbuf_state->ddb[pipe], 0, sizeof(dbuf_state->ddb[pipe])); 6267 6268 for_each_plane_id_on_crtc(crtc, plane_id) { 6269 struct skl_ddb_entry *ddb_y = 6270 &crtc_state->wm.skl.plane_ddb_y[plane_id]; 6271 struct skl_ddb_entry *ddb_uv = 6272 &crtc_state->wm.skl.plane_ddb_uv[plane_id]; 6273 6274 skl_ddb_get_hw_plane_state(dev_priv, crtc->pipe, 6275 plane_id, ddb_y, ddb_uv); 6276 6277 skl_ddb_entry_union(&dbuf_state->ddb[pipe], ddb_y); 6278 skl_ddb_entry_union(&dbuf_state->ddb[pipe], ddb_uv); 6279 } 6280 6281 dbuf_state->slices[pipe] = 6282 skl_compute_dbuf_slices(crtc, dbuf_state->active_pipes); 6283 6284 dbuf_state->weight[pipe] = intel_crtc_ddb_weight(crtc_state); 6285 6286 crtc_state->wm.skl.ddb = dbuf_state->ddb[pipe]; 6287 6288 drm_dbg_kms(&dev_priv->drm, 6289 "[CRTC:%d:%s] dbuf slices 0x%x, ddb (%d - %d), active pipes 0x%x\n", 6290 crtc->base.base.id, crtc->base.name, 6291 dbuf_state->slices[pipe], dbuf_state->ddb[pipe].start, 6292 dbuf_state->ddb[pipe].end, dbuf_state->active_pipes); 6293 } 6294 6295 dbuf_state->enabled_slices = dev_priv->dbuf.enabled_slices; 6296} 6297 6298static void ilk_pipe_wm_get_hw_state(struct intel_crtc *crtc) 6299{ 6300 struct drm_device *dev = crtc->base.dev; 6301 struct drm_i915_private *dev_priv = to_i915(dev); 6302 struct ilk_wm_values *hw = &dev_priv->wm.hw; 6303 struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state); 6304 struct intel_pipe_wm *active = &crtc_state->wm.ilk.optimal; 6305 enum pipe pipe = crtc->pipe; 6306 6307 hw->wm_pipe[pipe] = intel_uncore_read(&dev_priv->uncore, WM0_PIPE_ILK(pipe)); 6308 6309 memset(active, 0, sizeof(*active)); 6310 6311 active->pipe_enabled = crtc->active; 6312 6313 if (active->pipe_enabled) { 6314 u32 tmp = hw->wm_pipe[pipe]; 6315 6316 /* 6317 * For active pipes LP0 watermark is marked as 6318 * enabled, and LP1+ watermaks as disabled since 6319 * we can't really reverse compute them in case 6320 * multiple pipes are active. 6321 */ 6322 active->wm[0].enable = true; 6323 active->wm[0].pri_val = (tmp & WM0_PIPE_PLANE_MASK) >> WM0_PIPE_PLANE_SHIFT; 6324 active->wm[0].spr_val = (tmp & WM0_PIPE_SPRITE_MASK) >> WM0_PIPE_SPRITE_SHIFT; 6325 active->wm[0].cur_val = tmp & WM0_PIPE_CURSOR_MASK; 6326 } else { 6327 int level, max_level = ilk_wm_max_level(dev_priv); 6328 6329 /* 6330 * For inactive pipes, all watermark levels 6331 * should be marked as enabled but zeroed, 6332 * which is what we'd compute them to. 6333 */ 6334 for (level = 0; level <= max_level; level++) 6335 active->wm[level].enable = true; 6336 } 6337 6338 crtc->wm.active.ilk = *active; 6339} 6340 6341#define _FW_WM(value, plane) \ 6342 (((value) & DSPFW_ ## plane ## _MASK) >> DSPFW_ ## plane ## _SHIFT) 6343#define _FW_WM_VLV(value, plane) \ 6344 (((value) & DSPFW_ ## plane ## _MASK_VLV) >> DSPFW_ ## plane ## _SHIFT) 6345 6346static void g4x_read_wm_values(struct drm_i915_private *dev_priv, 6347 struct g4x_wm_values *wm) 6348{ 6349 u32 tmp; 6350 6351 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW1); 6352 wm->sr.plane = _FW_WM(tmp, SR); 6353 wm->pipe[PIPE_B].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORB); 6354 wm->pipe[PIPE_B].plane[PLANE_PRIMARY] = _FW_WM(tmp, PLANEB); 6355 wm->pipe[PIPE_A].plane[PLANE_PRIMARY] = _FW_WM(tmp, PLANEA); 6356 6357 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW2); 6358 wm->fbc_en = tmp & DSPFW_FBC_SR_EN; 6359 wm->sr.fbc = _FW_WM(tmp, FBC_SR); 6360 wm->hpll.fbc = _FW_WM(tmp, FBC_HPLL_SR); 6361 wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM(tmp, SPRITEB); 6362 wm->pipe[PIPE_A].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORA); 6363 wm->pipe[PIPE_A].plane[PLANE_SPRITE0] = _FW_WM(tmp, SPRITEA); 6364 6365 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW3); 6366 wm->hpll_en = tmp & DSPFW_HPLL_SR_EN; 6367 wm->sr.cursor = _FW_WM(tmp, CURSOR_SR); 6368 wm->hpll.cursor = _FW_WM(tmp, HPLL_CURSOR); 6369 wm->hpll.plane = _FW_WM(tmp, HPLL_SR); 6370} 6371 6372static void vlv_read_wm_values(struct drm_i915_private *dev_priv, 6373 struct vlv_wm_values *wm) 6374{ 6375 enum pipe pipe; 6376 u32 tmp; 6377 6378 for_each_pipe(dev_priv, pipe) { 6379 tmp = intel_uncore_read(&dev_priv->uncore, VLV_DDL(pipe)); 6380 6381 wm->ddl[pipe].plane[PLANE_PRIMARY] = 6382 (tmp >> DDL_PLANE_SHIFT) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK); 6383 wm->ddl[pipe].plane[PLANE_CURSOR] = 6384 (tmp >> DDL_CURSOR_SHIFT) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK); 6385 wm->ddl[pipe].plane[PLANE_SPRITE0] = 6386 (tmp >> DDL_SPRITE_SHIFT(0)) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK); 6387 wm->ddl[pipe].plane[PLANE_SPRITE1] = 6388 (tmp >> DDL_SPRITE_SHIFT(1)) & (DDL_PRECISION_HIGH | DRAIN_LATENCY_MASK); 6389 } 6390 6391 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW1); 6392 wm->sr.plane = _FW_WM(tmp, SR); 6393 wm->pipe[PIPE_B].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORB); 6394 wm->pipe[PIPE_B].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEB); 6395 wm->pipe[PIPE_A].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEA); 6396 6397 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW2); 6398 wm->pipe[PIPE_A].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITEB); 6399 wm->pipe[PIPE_A].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORA); 6400 wm->pipe[PIPE_A].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEA); 6401 6402 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW3); 6403 wm->sr.cursor = _FW_WM(tmp, CURSOR_SR); 6404 6405 if (IS_CHERRYVIEW(dev_priv)) { 6406 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW7_CHV); 6407 wm->pipe[PIPE_B].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITED); 6408 wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEC); 6409 6410 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW8_CHV); 6411 wm->pipe[PIPE_C].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITEF); 6412 wm->pipe[PIPE_C].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEE); 6413 6414 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW9_CHV); 6415 wm->pipe[PIPE_C].plane[PLANE_PRIMARY] = _FW_WM_VLV(tmp, PLANEC); 6416 wm->pipe[PIPE_C].plane[PLANE_CURSOR] = _FW_WM(tmp, CURSORC); 6417 6418 tmp = intel_uncore_read(&dev_priv->uncore, DSPHOWM); 6419 wm->sr.plane |= _FW_WM(tmp, SR_HI) << 9; 6420 wm->pipe[PIPE_C].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEF_HI) << 8; 6421 wm->pipe[PIPE_C].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEE_HI) << 8; 6422 wm->pipe[PIPE_C].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEC_HI) << 8; 6423 wm->pipe[PIPE_B].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITED_HI) << 8; 6424 wm->pipe[PIPE_B].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEC_HI) << 8; 6425 wm->pipe[PIPE_B].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEB_HI) << 8; 6426 wm->pipe[PIPE_A].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEB_HI) << 8; 6427 wm->pipe[PIPE_A].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEA_HI) << 8; 6428 wm->pipe[PIPE_A].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEA_HI) << 8; 6429 } else { 6430 tmp = intel_uncore_read(&dev_priv->uncore, DSPFW7); 6431 wm->pipe[PIPE_B].plane[PLANE_SPRITE1] = _FW_WM_VLV(tmp, SPRITED); 6432 wm->pipe[PIPE_B].plane[PLANE_SPRITE0] = _FW_WM_VLV(tmp, SPRITEC); 6433 6434 tmp = intel_uncore_read(&dev_priv->uncore, DSPHOWM); 6435 wm->sr.plane |= _FW_WM(tmp, SR_HI) << 9; 6436 wm->pipe[PIPE_B].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITED_HI) << 8; 6437 wm->pipe[PIPE_B].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEC_HI) << 8; 6438 wm->pipe[PIPE_B].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEB_HI) << 8; 6439 wm->pipe[PIPE_A].plane[PLANE_SPRITE1] |= _FW_WM(tmp, SPRITEB_HI) << 8; 6440 wm->pipe[PIPE_A].plane[PLANE_SPRITE0] |= _FW_WM(tmp, SPRITEA_HI) << 8; 6441 wm->pipe[PIPE_A].plane[PLANE_PRIMARY] |= _FW_WM(tmp, PLANEA_HI) << 8; 6442 } 6443} 6444 6445#undef _FW_WM 6446#undef _FW_WM_VLV 6447 6448void g4x_wm_get_hw_state(struct drm_i915_private *dev_priv) 6449{ 6450 struct g4x_wm_values *wm = &dev_priv->wm.g4x; 6451 struct intel_crtc *crtc; 6452 6453 g4x_read_wm_values(dev_priv, wm); 6454 6455 wm->cxsr = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF) & FW_BLC_SELF_EN; 6456 6457 for_each_intel_crtc(&dev_priv->drm, crtc) { 6458 struct intel_crtc_state *crtc_state = 6459 to_intel_crtc_state(crtc->base.state); 6460 struct g4x_wm_state *active = &crtc->wm.active.g4x; 6461 struct g4x_pipe_wm *raw; 6462 enum pipe pipe = crtc->pipe; 6463 enum plane_id plane_id; 6464 int level, max_level; 6465 6466 active->cxsr = wm->cxsr; 6467 active->hpll_en = wm->hpll_en; 6468 active->fbc_en = wm->fbc_en; 6469 6470 active->sr = wm->sr; 6471 active->hpll = wm->hpll; 6472 6473 for_each_plane_id_on_crtc(crtc, plane_id) { 6474 active->wm.plane[plane_id] = 6475 wm->pipe[pipe].plane[plane_id]; 6476 } 6477 6478 if (wm->cxsr && wm->hpll_en) 6479 max_level = G4X_WM_LEVEL_HPLL; 6480 else if (wm->cxsr) 6481 max_level = G4X_WM_LEVEL_SR; 6482 else 6483 max_level = G4X_WM_LEVEL_NORMAL; 6484 6485 level = G4X_WM_LEVEL_NORMAL; 6486 raw = &crtc_state->wm.g4x.raw[level]; 6487 for_each_plane_id_on_crtc(crtc, plane_id) 6488 raw->plane[plane_id] = active->wm.plane[plane_id]; 6489 6490 if (++level > max_level) 6491 goto out; 6492 6493 raw = &crtc_state->wm.g4x.raw[level]; 6494 raw->plane[PLANE_PRIMARY] = active->sr.plane; 6495 raw->plane[PLANE_CURSOR] = active->sr.cursor; 6496 raw->plane[PLANE_SPRITE0] = 0; 6497 raw->fbc = active->sr.fbc; 6498 6499 if (++level > max_level) 6500 goto out; 6501 6502 raw = &crtc_state->wm.g4x.raw[level]; 6503 raw->plane[PLANE_PRIMARY] = active->hpll.plane; 6504 raw->plane[PLANE_CURSOR] = active->hpll.cursor; 6505 raw->plane[PLANE_SPRITE0] = 0; 6506 raw->fbc = active->hpll.fbc; 6507 6508 out: 6509 for_each_plane_id_on_crtc(crtc, plane_id) 6510 g4x_raw_plane_wm_set(crtc_state, level, 6511 plane_id, USHRT_MAX); 6512 g4x_raw_fbc_wm_set(crtc_state, level, USHRT_MAX); 6513 6514 crtc_state->wm.g4x.optimal = *active; 6515 crtc_state->wm.g4x.intermediate = *active; 6516 6517 drm_dbg_kms(&dev_priv->drm, 6518 "Initial watermarks: pipe %c, plane=%d, cursor=%d, sprite=%d\n", 6519 pipe_name(pipe), 6520 wm->pipe[pipe].plane[PLANE_PRIMARY], 6521 wm->pipe[pipe].plane[PLANE_CURSOR], 6522 wm->pipe[pipe].plane[PLANE_SPRITE0]); 6523 } 6524 6525 drm_dbg_kms(&dev_priv->drm, 6526 "Initial SR watermarks: plane=%d, cursor=%d fbc=%d\n", 6527 wm->sr.plane, wm->sr.cursor, wm->sr.fbc); 6528 drm_dbg_kms(&dev_priv->drm, 6529 "Initial HPLL watermarks: plane=%d, SR cursor=%d fbc=%d\n", 6530 wm->hpll.plane, wm->hpll.cursor, wm->hpll.fbc); 6531 drm_dbg_kms(&dev_priv->drm, "Initial SR=%s HPLL=%s FBC=%s\n", 6532 yesno(wm->cxsr), yesno(wm->hpll_en), yesno(wm->fbc_en)); 6533} 6534 6535void g4x_wm_sanitize(struct drm_i915_private *dev_priv) 6536{ 6537 struct intel_plane *plane; 6538 struct intel_crtc *crtc; 6539 6540 mutex_lock(&dev_priv->wm.wm_mutex); 6541 6542 for_each_intel_plane(&dev_priv->drm, plane) { 6543 struct intel_crtc *crtc = 6544 intel_get_crtc_for_pipe(dev_priv, plane->pipe); 6545 struct intel_crtc_state *crtc_state = 6546 to_intel_crtc_state(crtc->base.state); 6547 struct intel_plane_state *plane_state = 6548 to_intel_plane_state(plane->base.state); 6549 struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal; 6550 enum plane_id plane_id = plane->id; 6551 int level; 6552 6553 if (plane_state->uapi.visible) 6554 continue; 6555 6556 for (level = 0; level < 3; level++) { 6557 struct g4x_pipe_wm *raw = 6558 &crtc_state->wm.g4x.raw[level]; 6559 6560 raw->plane[plane_id] = 0; 6561 wm_state->wm.plane[plane_id] = 0; 6562 } 6563 6564 if (plane_id == PLANE_PRIMARY) { 6565 for (level = 0; level < 3; level++) { 6566 struct g4x_pipe_wm *raw = 6567 &crtc_state->wm.g4x.raw[level]; 6568 raw->fbc = 0; 6569 } 6570 6571 wm_state->sr.fbc = 0; 6572 wm_state->hpll.fbc = 0; 6573 wm_state->fbc_en = false; 6574 } 6575 } 6576 6577 for_each_intel_crtc(&dev_priv->drm, crtc) { 6578 struct intel_crtc_state *crtc_state = 6579 to_intel_crtc_state(crtc->base.state); 6580 6581 crtc_state->wm.g4x.intermediate = 6582 crtc_state->wm.g4x.optimal; 6583 crtc->wm.active.g4x = crtc_state->wm.g4x.optimal; 6584 } 6585 6586 g4x_program_watermarks(dev_priv); 6587 6588 mutex_unlock(&dev_priv->wm.wm_mutex); 6589} 6590 6591void vlv_wm_get_hw_state(struct drm_i915_private *dev_priv) 6592{ 6593 struct vlv_wm_values *wm = &dev_priv->wm.vlv; 6594 struct intel_crtc *crtc; 6595 u32 val; 6596 6597 vlv_read_wm_values(dev_priv, wm); 6598 6599 wm->cxsr = intel_uncore_read(&dev_priv->uncore, FW_BLC_SELF_VLV) & FW_CSPWRDWNEN; 6600 wm->level = VLV_WM_LEVEL_PM2; 6601 6602 if (IS_CHERRYVIEW(dev_priv)) { 6603 vlv_punit_get(dev_priv); 6604 6605 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM); 6606 if (val & DSP_MAXFIFO_PM5_ENABLE) 6607 wm->level = VLV_WM_LEVEL_PM5; 6608 6609 /* 6610 * If DDR DVFS is disabled in the BIOS, Punit 6611 * will never ack the request. So if that happens 6612 * assume we don't have to enable/disable DDR DVFS 6613 * dynamically. To test that just set the REQ_ACK 6614 * bit to poke the Punit, but don't change the 6615 * HIGH/LOW bits so that we don't actually change 6616 * the current state. 6617 */ 6618 val = vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2); 6619 val |= FORCE_DDR_FREQ_REQ_ACK; 6620 vlv_punit_write(dev_priv, PUNIT_REG_DDR_SETUP2, val); 6621 6622 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2) & 6623 FORCE_DDR_FREQ_REQ_ACK) == 0, 3)) { 6624 drm_dbg_kms(&dev_priv->drm, 6625 "Punit not acking DDR DVFS request, " 6626 "assuming DDR DVFS is disabled\n"); 6627 dev_priv->wm.max_level = VLV_WM_LEVEL_PM5; 6628 } else { 6629 val = vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2); 6630 if ((val & FORCE_DDR_HIGH_FREQ) == 0) 6631 wm->level = VLV_WM_LEVEL_DDR_DVFS; 6632 } 6633 6634 vlv_punit_put(dev_priv); 6635 } 6636 6637 for_each_intel_crtc(&dev_priv->drm, crtc) { 6638 struct intel_crtc_state *crtc_state = 6639 to_intel_crtc_state(crtc->base.state); 6640 struct vlv_wm_state *active = &crtc->wm.active.vlv; 6641 const struct vlv_fifo_state *fifo_state = 6642 &crtc_state->wm.vlv.fifo_state; 6643 enum pipe pipe = crtc->pipe; 6644 enum plane_id plane_id; 6645 int level; 6646 6647 vlv_get_fifo_size(crtc_state); 6648 6649 active->num_levels = wm->level + 1; 6650 active->cxsr = wm->cxsr; 6651 6652 for (level = 0; level < active->num_levels; level++) { 6653 struct g4x_pipe_wm *raw = 6654 &crtc_state->wm.vlv.raw[level]; 6655 6656 active->sr[level].plane = wm->sr.plane; 6657 active->sr[level].cursor = wm->sr.cursor; 6658 6659 for_each_plane_id_on_crtc(crtc, plane_id) { 6660 active->wm[level].plane[plane_id] = 6661 wm->pipe[pipe].plane[plane_id]; 6662 6663 raw->plane[plane_id] = 6664 vlv_invert_wm_value(active->wm[level].plane[plane_id], 6665 fifo_state->plane[plane_id]); 6666 } 6667 } 6668 6669 for_each_plane_id_on_crtc(crtc, plane_id) 6670 vlv_raw_plane_wm_set(crtc_state, level, 6671 plane_id, USHRT_MAX); 6672 vlv_invalidate_wms(crtc, active, level); 6673 6674 crtc_state->wm.vlv.optimal = *active; 6675 crtc_state->wm.vlv.intermediate = *active; 6676 6677 drm_dbg_kms(&dev_priv->drm, 6678 "Initial watermarks: pipe %c, plane=%d, cursor=%d, sprite0=%d, sprite1=%d\n", 6679 pipe_name(pipe), 6680 wm->pipe[pipe].plane[PLANE_PRIMARY], 6681 wm->pipe[pipe].plane[PLANE_CURSOR], 6682 wm->pipe[pipe].plane[PLANE_SPRITE0], 6683 wm->pipe[pipe].plane[PLANE_SPRITE1]); 6684 } 6685 6686 drm_dbg_kms(&dev_priv->drm, 6687 "Initial watermarks: SR plane=%d, SR cursor=%d level=%d cxsr=%d\n", 6688 wm->sr.plane, wm->sr.cursor, wm->level, wm->cxsr); 6689} 6690 6691void vlv_wm_sanitize(struct drm_i915_private *dev_priv) 6692{ 6693 struct intel_plane *plane; 6694 struct intel_crtc *crtc; 6695 6696 mutex_lock(&dev_priv->wm.wm_mutex); 6697 6698 for_each_intel_plane(&dev_priv->drm, plane) { 6699 struct intel_crtc *crtc = 6700 intel_get_crtc_for_pipe(dev_priv, plane->pipe); 6701 struct intel_crtc_state *crtc_state = 6702 to_intel_crtc_state(crtc->base.state); 6703 struct intel_plane_state *plane_state = 6704 to_intel_plane_state(plane->base.state); 6705 struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal; 6706 const struct vlv_fifo_state *fifo_state = 6707 &crtc_state->wm.vlv.fifo_state; 6708 enum plane_id plane_id = plane->id; 6709 int level; 6710 6711 if (plane_state->uapi.visible) 6712 continue; 6713 6714 for (level = 0; level < wm_state->num_levels; level++) { 6715 struct g4x_pipe_wm *raw = 6716 &crtc_state->wm.vlv.raw[level]; 6717 6718 raw->plane[plane_id] = 0; 6719 6720 wm_state->wm[level].plane[plane_id] = 6721 vlv_invert_wm_value(raw->plane[plane_id], 6722 fifo_state->plane[plane_id]); 6723 } 6724 } 6725 6726 for_each_intel_crtc(&dev_priv->drm, crtc) { 6727 struct intel_crtc_state *crtc_state = 6728 to_intel_crtc_state(crtc->base.state); 6729 6730 crtc_state->wm.vlv.intermediate = 6731 crtc_state->wm.vlv.optimal; 6732 crtc->wm.active.vlv = crtc_state->wm.vlv.optimal; 6733 } 6734 6735 vlv_program_watermarks(dev_priv); 6736 6737 mutex_unlock(&dev_priv->wm.wm_mutex); 6738} 6739 6740/* 6741 * FIXME should probably kill this and improve 6742 * the real watermark readout/sanitation instead 6743 */ 6744static void ilk_init_lp_watermarks(struct drm_i915_private *dev_priv) 6745{ 6746 intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM3_LP_ILK) & ~WM1_LP_SR_EN); 6747 intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM2_LP_ILK) & ~WM1_LP_SR_EN); 6748 intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM1_LP_ILK) & ~WM1_LP_SR_EN); 6749 6750 /* 6751 * Don't touch WM1S_LP_EN here. 6752 * Doing so could cause underruns. 6753 */ 6754} 6755 6756void ilk_wm_get_hw_state(struct drm_i915_private *dev_priv) 6757{ 6758 struct ilk_wm_values *hw = &dev_priv->wm.hw; 6759 struct intel_crtc *crtc; 6760 6761 ilk_init_lp_watermarks(dev_priv); 6762 6763 for_each_intel_crtc(&dev_priv->drm, crtc) 6764 ilk_pipe_wm_get_hw_state(crtc); 6765 6766 hw->wm_lp[0] = intel_uncore_read(&dev_priv->uncore, WM1_LP_ILK); 6767 hw->wm_lp[1] = intel_uncore_read(&dev_priv->uncore, WM2_LP_ILK); 6768 hw->wm_lp[2] = intel_uncore_read(&dev_priv->uncore, WM3_LP_ILK); 6769 6770 hw->wm_lp_spr[0] = intel_uncore_read(&dev_priv->uncore, WM1S_LP_ILK); 6771 if (DISPLAY_VER(dev_priv) >= 7) { 6772 hw->wm_lp_spr[1] = intel_uncore_read(&dev_priv->uncore, WM2S_LP_IVB); 6773 hw->wm_lp_spr[2] = intel_uncore_read(&dev_priv->uncore, WM3S_LP_IVB); 6774 } 6775 6776 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 6777 hw->partitioning = (intel_uncore_read(&dev_priv->uncore, WM_MISC) & WM_MISC_DATA_PARTITION_5_6) ? 6778 INTEL_DDB_PART_5_6 : INTEL_DDB_PART_1_2; 6779 else if (IS_IVYBRIDGE(dev_priv)) 6780 hw->partitioning = (intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2) & DISP_DATA_PARTITION_5_6) ? 6781 INTEL_DDB_PART_5_6 : INTEL_DDB_PART_1_2; 6782 6783 hw->enable_fbc_wm = 6784 !(intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) & DISP_FBC_WM_DIS); 6785} 6786 6787/** 6788 * intel_update_watermarks - update FIFO watermark values based on current modes 6789 * @crtc: the #intel_crtc on which to compute the WM 6790 * 6791 * Calculate watermark values for the various WM regs based on current mode 6792 * and plane configuration. 6793 * 6794 * There are several cases to deal with here: 6795 * - normal (i.e. non-self-refresh) 6796 * - self-refresh (SR) mode 6797 * - lines are large relative to FIFO size (buffer can hold up to 2) 6798 * - lines are small relative to FIFO size (buffer can hold more than 2 6799 * lines), so need to account for TLB latency 6800 * 6801 * The normal calculation is: 6802 * watermark = dotclock * bytes per pixel * latency 6803 * where latency is platform & configuration dependent (we assume pessimal 6804 * values here). 6805 * 6806 * The SR calculation is: 6807 * watermark = (trunc(latency/line time)+1) * surface width * 6808 * bytes per pixel 6809 * where 6810 * line time = htotal / dotclock 6811 * surface width = hdisplay for normal plane and 64 for cursor 6812 * and latency is assumed to be high, as above. 6813 * 6814 * The final value programmed to the register should always be rounded up, 6815 * and include an extra 2 entries to account for clock crossings. 6816 * 6817 * We don't use the sprite, so we can ignore that. And on Crestline we have 6818 * to set the non-SR watermarks to 8. 6819 */ 6820void intel_update_watermarks(struct intel_crtc *crtc) 6821{ 6822 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 6823 6824 if (dev_priv->display.update_wm) 6825 dev_priv->display.update_wm(crtc); 6826} 6827 6828void intel_enable_ipc(struct drm_i915_private *dev_priv) 6829{ 6830 u32 val; 6831 6832 if (!HAS_IPC(dev_priv)) 6833 return; 6834 6835 val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2); 6836 6837 if (dev_priv->ipc_enabled) 6838 val |= DISP_IPC_ENABLE; 6839 else 6840 val &= ~DISP_IPC_ENABLE; 6841 6842 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL2, val); 6843} 6844 6845static bool intel_can_enable_ipc(struct drm_i915_private *dev_priv) 6846{ 6847 /* Display WA #0477 WaDisableIPC: skl */ 6848 if (IS_SKYLAKE(dev_priv)) 6849 return false; 6850 6851 /* Display WA #1141: SKL:all KBL:all CFL */ 6852 if (IS_KABYLAKE(dev_priv) || 6853 IS_COFFEELAKE(dev_priv) || 6854 IS_COMETLAKE(dev_priv)) 6855 return dev_priv->dram_info.symmetric_memory; 6856 6857 return true; 6858} 6859 6860void intel_init_ipc(struct drm_i915_private *dev_priv) 6861{ 6862 if (!HAS_IPC(dev_priv)) 6863 return; 6864 6865 dev_priv->ipc_enabled = intel_can_enable_ipc(dev_priv); 6866 6867 intel_enable_ipc(dev_priv); 6868} 6869 6870static void ibx_init_clock_gating(struct drm_i915_private *dev_priv) 6871{ 6872 /* 6873 * On Ibex Peak and Cougar Point, we need to disable clock 6874 * gating for the panel power sequencer or it will fail to 6875 * start up when no ports are active. 6876 */ 6877 intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); 6878} 6879 6880static void g4x_disable_trickle_feed(struct drm_i915_private *dev_priv) 6881{ 6882 enum pipe pipe; 6883 6884 for_each_pipe(dev_priv, pipe) { 6885 intel_uncore_write(&dev_priv->uncore, DSPCNTR(pipe), 6886 intel_uncore_read(&dev_priv->uncore, DSPCNTR(pipe)) | 6887 DISPPLANE_TRICKLE_FEED_DISABLE); 6888 6889 intel_uncore_write(&dev_priv->uncore, DSPSURF(pipe), intel_uncore_read(&dev_priv->uncore, DSPSURF(pipe))); 6890 intel_uncore_posting_read(&dev_priv->uncore, DSPSURF(pipe)); 6891 } 6892} 6893 6894static void ilk_init_clock_gating(struct drm_i915_private *dev_priv) 6895{ 6896 u32 dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE; 6897 6898 /* 6899 * Required for FBC 6900 * WaFbcDisableDpfcClockGating:ilk 6901 */ 6902 dspclk_gate |= ILK_DPFCRUNIT_CLOCK_GATE_DISABLE | 6903 ILK_DPFCUNIT_CLOCK_GATE_DISABLE | 6904 ILK_DPFDUNIT_CLOCK_GATE_ENABLE; 6905 6906 intel_uncore_write(&dev_priv->uncore, PCH_3DCGDIS0, 6907 MARIUNIT_CLOCK_GATE_DISABLE | 6908 SVSMUNIT_CLOCK_GATE_DISABLE); 6909 intel_uncore_write(&dev_priv->uncore, PCH_3DCGDIS1, 6910 VFMUNIT_CLOCK_GATE_DISABLE); 6911 6912 /* 6913 * According to the spec the following bits should be set in 6914 * order to enable memory self-refresh 6915 * The bit 22/21 of 0x42004 6916 * The bit 5 of 0x42020 6917 * The bit 15 of 0x45000 6918 */ 6919 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 6920 (intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | 6921 ILK_DPARB_GATE | ILK_VSDPFD_FULL)); 6922 dspclk_gate |= ILK_DPARBUNIT_CLOCK_GATE_ENABLE; 6923 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, 6924 (intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 6925 DISP_FBC_WM_DIS)); 6926 6927 /* 6928 * Based on the document from hardware guys the following bits 6929 * should be set unconditionally in order to enable FBC. 6930 * The bit 22 of 0x42000 6931 * The bit 22 of 0x42004 6932 * The bit 7,8,9 of 0x42020. 6933 */ 6934 if (IS_IRONLAKE_M(dev_priv)) { 6935 /* WaFbcAsynchFlipDisableFbcQueue:ilk */ 6936 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 6937 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) | 6938 ILK_FBCQ_DIS); 6939 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 6940 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | 6941 ILK_DPARB_GATE); 6942 } 6943 6944 intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate); 6945 6946 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 6947 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | 6948 ILK_ELPIN_409_SELECT); 6949 6950 g4x_disable_trickle_feed(dev_priv); 6951 6952 ibx_init_clock_gating(dev_priv); 6953} 6954 6955static void cpt_init_clock_gating(struct drm_i915_private *dev_priv) 6956{ 6957 enum pipe pipe; 6958 u32 val; 6959 6960 /* 6961 * On Ibex Peak and Cougar Point, we need to disable clock 6962 * gating for the panel power sequencer or it will fail to 6963 * start up when no ports are active. 6964 */ 6965 intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE | 6966 PCH_DPLUNIT_CLOCK_GATE_DISABLE | 6967 PCH_CPUNIT_CLOCK_GATE_DISABLE); 6968 intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN2, intel_uncore_read(&dev_priv->uncore, SOUTH_CHICKEN2) | 6969 DPLS_EDP_PPS_FIX_DIS); 6970 /* The below fixes the weird display corruption, a few pixels shifted 6971 * downward, on (only) LVDS of some HP laptops with IVY. 6972 */ 6973 for_each_pipe(dev_priv, pipe) { 6974 val = intel_uncore_read(&dev_priv->uncore, TRANS_CHICKEN2(pipe)); 6975 val |= TRANS_CHICKEN2_TIMING_OVERRIDE; 6976 val &= ~TRANS_CHICKEN2_FDI_POLARITY_REVERSED; 6977 if (dev_priv->vbt.fdi_rx_polarity_inverted) 6978 val |= TRANS_CHICKEN2_FDI_POLARITY_REVERSED; 6979 val &= ~TRANS_CHICKEN2_DISABLE_DEEP_COLOR_COUNTER; 6980 val &= ~TRANS_CHICKEN2_DISABLE_DEEP_COLOR_MODESWITCH; 6981 intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN2(pipe), val); 6982 } 6983 /* WADP0ClockGatingDisable */ 6984 for_each_pipe(dev_priv, pipe) { 6985 intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN1(pipe), 6986 TRANS_CHICKEN1_DP0UNIT_GC_DISABLE); 6987 } 6988} 6989 6990static void gen6_check_mch_setup(struct drm_i915_private *dev_priv) 6991{ 6992 u32 tmp; 6993 6994 tmp = intel_uncore_read(&dev_priv->uncore, MCH_SSKPD); 6995 if ((tmp & MCH_SSKPD_WM0_MASK) != MCH_SSKPD_WM0_VAL) 6996 drm_dbg_kms(&dev_priv->drm, 6997 "Wrong MCH_SSKPD value: 0x%08x This can cause underruns.\n", 6998 tmp); 6999} 7000 7001static void gen6_init_clock_gating(struct drm_i915_private *dev_priv) 7002{ 7003 u32 dspclk_gate = ILK_VRHUNIT_CLOCK_GATE_DISABLE; 7004 7005 intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate); 7006 7007 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 7008 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | 7009 ILK_ELPIN_409_SELECT); 7010 7011 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, 7012 intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | 7013 GEN6_BLBUNIT_CLOCK_GATE_DISABLE | 7014 GEN6_CSUNIT_CLOCK_GATE_DISABLE); 7015 7016 /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock 7017 * gating disable must be set. Failure to set it results in 7018 * flickering pixels due to Z write ordering failures after 7019 * some amount of runtime in the Mesa "fire" demo, and Unigine 7020 * Sanctuary and Tropics, and apparently anything else with 7021 * alpha test or pixel discard. 7022 * 7023 * According to the spec, bit 11 (RCCUNIT) must also be set, 7024 * but we didn't debug actual testcases to find it out. 7025 * 7026 * WaDisableRCCUnitClockGating:snb 7027 * WaDisableRCPBUnitClockGating:snb 7028 */ 7029 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL2, 7030 GEN6_RCPBUNIT_CLOCK_GATE_DISABLE | 7031 GEN6_RCCUNIT_CLOCK_GATE_DISABLE); 7032 7033 /* 7034 * According to the spec the following bits should be 7035 * set in order to enable memory self-refresh and fbc: 7036 * The bit21 and bit22 of 0x42000 7037 * The bit21 and bit22 of 0x42004 7038 * The bit5 and bit7 of 0x42020 7039 * The bit14 of 0x70180 7040 * The bit14 of 0x71180 7041 * 7042 * WaFbcAsynchFlipDisableFbcQueue:snb 7043 */ 7044 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 7045 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) | 7046 ILK_FBCQ_DIS | ILK_PABSTRETCH_DIS); 7047 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 7048 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | 7049 ILK_DPARB_GATE | ILK_VSDPFD_FULL); 7050 intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, 7051 intel_uncore_read(&dev_priv->uncore, ILK_DSPCLK_GATE_D) | 7052 ILK_DPARBUNIT_CLOCK_GATE_ENABLE | 7053 ILK_DPFDUNIT_CLOCK_GATE_ENABLE); 7054 7055 g4x_disable_trickle_feed(dev_priv); 7056 7057 cpt_init_clock_gating(dev_priv); 7058 7059 gen6_check_mch_setup(dev_priv); 7060} 7061 7062static void lpt_init_clock_gating(struct drm_i915_private *dev_priv) 7063{ 7064 /* 7065 * TODO: this bit should only be enabled when really needed, then 7066 * disabled when not needed anymore in order to save power. 7067 */ 7068 if (HAS_PCH_LPT_LP(dev_priv)) 7069 intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, 7070 intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) | 7071 PCH_LP_PARTITION_LEVEL_DISABLE); 7072 7073 /* WADPOClockGatingDisable:hsw */ 7074 intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A), 7075 intel_uncore_read(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A)) | 7076 TRANS_CHICKEN1_DP0UNIT_GC_DISABLE); 7077} 7078 7079static void lpt_suspend_hw(struct drm_i915_private *dev_priv) 7080{ 7081 if (HAS_PCH_LPT_LP(dev_priv)) { 7082 u32 val = intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D); 7083 7084 val &= ~PCH_LP_PARTITION_LEVEL_DISABLE; 7085 intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, val); 7086 } 7087} 7088 7089static void gen8_set_l3sqc_credits(struct drm_i915_private *dev_priv, 7090 int general_prio_credits, 7091 int high_prio_credits) 7092{ 7093 u32 misccpctl; 7094 u32 val; 7095 7096 /* WaTempDisableDOPClkGating:bdw */ 7097 misccpctl = intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL); 7098 intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); 7099 7100 val = intel_uncore_read(&dev_priv->uncore, GEN8_L3SQCREG1); 7101 val &= ~L3_PRIO_CREDITS_MASK; 7102 val |= L3_GENERAL_PRIO_CREDITS(general_prio_credits); 7103 val |= L3_HIGH_PRIO_CREDITS(high_prio_credits); 7104 intel_uncore_write(&dev_priv->uncore, GEN8_L3SQCREG1, val); 7105 7106 /* 7107 * Wait at least 100 clocks before re-enabling clock gating. 7108 * See the definition of L3SQCREG1 in BSpec. 7109 */ 7110 intel_uncore_posting_read(&dev_priv->uncore, GEN8_L3SQCREG1); 7111 udelay(1); 7112 intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl); 7113} 7114 7115static void icl_init_clock_gating(struct drm_i915_private *dev_priv) 7116{ 7117 /* Wa_1409120013:icl,ehl */ 7118 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, 7119 ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL); 7120 7121 /* This is not an Wa. Enable to reduce Sampler power */ 7122 intel_uncore_write(&dev_priv->uncore, GEN10_DFR_RATIO_EN_AND_CHICKEN, 7123 intel_uncore_read(&dev_priv->uncore, GEN10_DFR_RATIO_EN_AND_CHICKEN) & ~DFR_DISABLE); 7124 7125 /*Wa_14010594013:icl, ehl */ 7126 intel_uncore_rmw(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, 7127 0, CNL_DELAY_PMRSP); 7128} 7129 7130static void gen12lp_init_clock_gating(struct drm_i915_private *dev_priv) 7131{ 7132 /* Wa_1409120013:tgl,rkl,adl_s,dg1 */ 7133 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, 7134 ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL); 7135 7136 /* Wa_1409825376:tgl (pre-prod)*/ 7137 if (IS_TGL_DISPLAY_STEP(dev_priv, STEP_A0, STEP_B1)) 7138 intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) | 7139 TGL_VRH_GATING_DIS); 7140 7141 /* Wa_14011059788:tgl,rkl,adl_s,dg1 */ 7142 intel_uncore_rmw(&dev_priv->uncore, GEN10_DFR_RATIO_EN_AND_CHICKEN, 7143 0, DFR_DISABLE); 7144} 7145 7146static void dg1_init_clock_gating(struct drm_i915_private *dev_priv) 7147{ 7148 gen12lp_init_clock_gating(dev_priv); 7149 7150 /* Wa_1409836686:dg1[a0] */ 7151 if (IS_DG1_REVID(dev_priv, DG1_REVID_A0, DG1_REVID_A0)) 7152 intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) | 7153 DPT_GATING_DIS); 7154} 7155 7156static void cnp_init_clock_gating(struct drm_i915_private *dev_priv) 7157{ 7158 if (!HAS_PCH_CNP(dev_priv)) 7159 return; 7160 7161 /* Display WA #1181 WaSouthDisplayDisablePWMCGEGating: cnp */ 7162 intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) | 7163 CNP_PWM_CGE_GATING_DISABLE); 7164} 7165 7166static void cnl_init_clock_gating(struct drm_i915_private *dev_priv) 7167{ 7168 u32 val; 7169 cnp_init_clock_gating(dev_priv); 7170 7171 /* This is not an Wa. Enable for better image quality */ 7172 intel_uncore_write(&dev_priv->uncore, _3D_CHICKEN3, 7173 _MASKED_BIT_ENABLE(_3D_CHICKEN3_AA_LINE_QUALITY_FIX_ENABLE)); 7174 7175 /* WaEnableChickenDCPR:cnl */ 7176 intel_uncore_write(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, 7177 intel_uncore_read(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM); 7178 7179 /* 7180 * WaFbcWakeMemOn:cnl 7181 * Display WA #0859: cnl 7182 */ 7183 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 7184 DISP_FBC_MEMORY_WAKE); 7185 7186 val = intel_uncore_read(&dev_priv->uncore, SLICE_UNIT_LEVEL_CLKGATE); 7187 /* ReadHitWriteOnlyDisable:cnl */ 7188 val |= RCCUNIT_CLKGATE_DIS; 7189 intel_uncore_write(&dev_priv->uncore, SLICE_UNIT_LEVEL_CLKGATE, val); 7190 7191 /* Wa_2201832410:cnl */ 7192 val = intel_uncore_read(&dev_priv->uncore, SUBSLICE_UNIT_LEVEL_CLKGATE); 7193 val |= GWUNIT_CLKGATE_DIS; 7194 intel_uncore_write(&dev_priv->uncore, SUBSLICE_UNIT_LEVEL_CLKGATE, val); 7195 7196 /* WaDisableVFclkgate:cnl */ 7197 /* WaVFUnitClockGatingDisable:cnl */ 7198 val = intel_uncore_read(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE); 7199 val |= VFUNIT_CLKGATE_DIS; 7200 intel_uncore_write(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE, val); 7201} 7202 7203static void cfl_init_clock_gating(struct drm_i915_private *dev_priv) 7204{ 7205 cnp_init_clock_gating(dev_priv); 7206 gen9_init_clock_gating(dev_priv); 7207 7208 /* WAC6entrylatency:cfl */ 7209 intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) | 7210 FBC_LLC_FULLY_OPEN); 7211 7212 /* 7213 * WaFbcTurnOffFbcWatermark:cfl 7214 * Display WA #0562: cfl 7215 */ 7216 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 7217 DISP_FBC_WM_DIS); 7218 7219 /* 7220 * WaFbcNukeOnHostModify:cfl 7221 * Display WA #0873: cfl 7222 */ 7223 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | 7224 ILK_DPFC_NUKE_ON_ANY_MODIFICATION); 7225} 7226 7227static void kbl_init_clock_gating(struct drm_i915_private *dev_priv) 7228{ 7229 gen9_init_clock_gating(dev_priv); 7230 7231 /* WAC6entrylatency:kbl */ 7232 intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) | 7233 FBC_LLC_FULLY_OPEN); 7234 7235 /* WaDisableSDEUnitClockGating:kbl */ 7236 if (IS_KBL_GT_STEP(dev_priv, 0, STEP_B0)) 7237 intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | 7238 GEN8_SDEUNIT_CLOCK_GATE_DISABLE); 7239 7240 /* WaDisableGamClockGating:kbl */ 7241 if (IS_KBL_GT_STEP(dev_priv, 0, STEP_B0)) 7242 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | 7243 GEN6_GAMUNIT_CLOCK_GATE_DISABLE); 7244 7245 /* 7246 * WaFbcTurnOffFbcWatermark:kbl 7247 * Display WA #0562: kbl 7248 */ 7249 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 7250 DISP_FBC_WM_DIS); 7251 7252 /* 7253 * WaFbcNukeOnHostModify:kbl 7254 * Display WA #0873: kbl 7255 */ 7256 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | 7257 ILK_DPFC_NUKE_ON_ANY_MODIFICATION); 7258} 7259 7260static void skl_init_clock_gating(struct drm_i915_private *dev_priv) 7261{ 7262 gen9_init_clock_gating(dev_priv); 7263 7264 /* WaDisableDopClockGating:skl */ 7265 intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL) & 7266 ~GEN7_DOP_CLOCK_GATE_ENABLE); 7267 7268 /* WAC6entrylatency:skl */ 7269 intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) | 7270 FBC_LLC_FULLY_OPEN); 7271 7272 /* 7273 * WaFbcTurnOffFbcWatermark:skl 7274 * Display WA #0562: skl 7275 */ 7276 intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | 7277 DISP_FBC_WM_DIS); 7278 7279 /* 7280 * WaFbcNukeOnHostModify:skl 7281 * Display WA #0873: skl 7282 */ 7283 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | 7284 ILK_DPFC_NUKE_ON_ANY_MODIFICATION); 7285 7286 /* 7287 * WaFbcHighMemBwCorruptionAvoidance:skl 7288 * Display WA #0883: skl 7289 */ 7290 intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN, intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN) | 7291 ILK_DPFC_DISABLE_DUMMY0); 7292} 7293 7294static void bdw_init_clock_gating(struct drm_i915_private *dev_priv) 7295{ 7296 enum pipe pipe; 7297 7298 /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */ 7299 intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), 7300 intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) | 7301 HSW_FBCQ_DIS); 7302 7303 /* WaSwitchSolVfFArbitrationPriority:bdw */ 7304 intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); 7305 7306 /* WaPsrDPAMaskVBlankInSRD:bdw */ 7307 intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1, 7308 intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD); 7309 7310 for_each_pipe(dev_priv, pipe) { 7311 /* WaPsrDPRSUnmaskVBlankInSRD:bdw */ 7312 intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe), 7313 intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe)) | 7314 BDW_DPRS_MASK_VBLANK_SRD); 7315 7316 /* Undocumented but fixes async flip + VT-d corruption */ 7317 if (intel_vtd_active()) 7318 intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe), 7319 HSW_PRI_STRETCH_MAX_MASK, HSW_PRI_STRETCH_MAX_X1); 7320 } 7321 7322 /* WaVSRefCountFullforceMissDisable:bdw */ 7323 /* WaDSRefCountFullforceMissDisable:bdw */ 7324 intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE, 7325 intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) & 7326 ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME)); 7327 7328 intel_uncore_write(&dev_priv->uncore, GEN6_RC_SLEEP_PSMI_CONTROL, 7329 _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE)); 7330 7331 /* WaDisableSDEUnitClockGating:bdw */ 7332 intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | 7333 GEN8_SDEUNIT_CLOCK_GATE_DISABLE); 7334 7335 /* WaProgramL3SqcReg1Default:bdw */ 7336 gen8_set_l3sqc_credits(dev_priv, 30, 2); 7337 7338 /* WaKVMNotificationOnConfigChange:bdw */ 7339 intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR2_1, intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR2_1) 7340 | KVM_CONFIG_CHANGE_NOTIFICATION_SELECT); 7341 7342 lpt_init_clock_gating(dev_priv); 7343 7344 /* WaDisableDopClockGating:bdw 7345 * 7346 * Also see the CHICKEN2 write in bdw_init_workarounds() to disable DOP 7347 * clock gating. 7348 */ 7349 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, 7350 intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE); 7351} 7352 7353static void hsw_init_clock_gating(struct drm_i915_private *dev_priv) 7354{ 7355 enum pipe pipe; 7356 7357 /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */ 7358 intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), 7359 intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) | 7360 HSW_FBCQ_DIS); 7361 7362 for_each_pipe(dev_priv, pipe) { 7363 /* Undocumented but fixes async flip + VT-d corruption */ 7364 if (intel_vtd_active()) 7365 intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe), 7366 HSW_PRI_STRETCH_MAX_MASK, HSW_PRI_STRETCH_MAX_X1); 7367 } 7368 7369 /* This is required by WaCatErrorRejectionIssue:hsw */ 7370 intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, 7371 intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | 7372 GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); 7373 7374 /* WaSwitchSolVfFArbitrationPriority:hsw */ 7375 intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); 7376 7377 lpt_init_clock_gating(dev_priv); 7378} 7379 7380static void ivb_init_clock_gating(struct drm_i915_private *dev_priv) 7381{ 7382 u32 snpcr; 7383 7384 intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE); 7385 7386 /* WaFbcAsynchFlipDisableFbcQueue:ivb */ 7387 intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 7388 intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) | 7389 ILK_FBCQ_DIS); 7390 7391 /* WaDisableBackToBackFlipFix:ivb */ 7392 intel_uncore_write(&dev_priv->uncore, IVB_CHICKEN3, 7393 CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | 7394 CHICKEN3_DGMG_DONE_FIX_DISABLE); 7395 7396 if (IS_IVB_GT1(dev_priv)) 7397 intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2, 7398 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); 7399 else { 7400 /* must write both registers */ 7401 intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2, 7402 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); 7403 intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2_GT2, 7404 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); 7405 } 7406 7407 /* 7408 * According to the spec, bit 13 (RCZUNIT) must be set on IVB. 7409 * This implements the WaDisableRCZUnitClockGating:ivb workaround. 7410 */ 7411 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL2, 7412 GEN6_RCZUNIT_CLOCK_GATE_DISABLE); 7413 7414 /* This is required by WaCatErrorRejectionIssue:ivb */ 7415 intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, 7416 intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | 7417 GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); 7418 7419 g4x_disable_trickle_feed(dev_priv); 7420 7421 snpcr = intel_uncore_read(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR); 7422 snpcr &= ~GEN6_MBC_SNPCR_MASK; 7423 snpcr |= GEN6_MBC_SNPCR_MED; 7424 intel_uncore_write(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR, snpcr); 7425 7426 if (!HAS_PCH_NOP(dev_priv)) 7427 cpt_init_clock_gating(dev_priv); 7428 7429 gen6_check_mch_setup(dev_priv); 7430} 7431 7432static void vlv_init_clock_gating(struct drm_i915_private *dev_priv) 7433{ 7434 /* WaDisableBackToBackFlipFix:vlv */ 7435 intel_uncore_write(&dev_priv->uncore, IVB_CHICKEN3, 7436 CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | 7437 CHICKEN3_DGMG_DONE_FIX_DISABLE); 7438 7439 /* WaDisableDopClockGating:vlv */ 7440 intel_uncore_write(&dev_priv->uncore, GEN7_ROW_CHICKEN2, 7441 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); 7442 7443 /* This is required by WaCatErrorRejectionIssue:vlv */ 7444 intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, 7445 intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | 7446 GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); 7447 7448 /* 7449 * According to the spec, bit 13 (RCZUNIT) must be set on IVB. 7450 * This implements the WaDisableRCZUnitClockGating:vlv workaround. 7451 */ 7452 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL2, 7453 GEN6_RCZUNIT_CLOCK_GATE_DISABLE); 7454 7455 /* WaDisableL3Bank2xClockGate:vlv 7456 * Disabling L3 clock gating- MMIO 940c[25] = 1 7457 * Set bit 25, to disable L3_BANK_2x_CLK_GATING */ 7458 intel_uncore_write(&dev_priv->uncore, GEN7_UCGCTL4, 7459 intel_uncore_read(&dev_priv->uncore, GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE); 7460 7461 /* 7462 * WaDisableVLVClockGating_VBIIssue:vlv 7463 * Disable clock gating on th GCFG unit to prevent a delay 7464 * in the reporting of vblank events. 7465 */ 7466 intel_uncore_write(&dev_priv->uncore, VLV_GUNIT_CLOCK_GATE, GCFG_DIS); 7467} 7468 7469static void chv_init_clock_gating(struct drm_i915_private *dev_priv) 7470{ 7471 /* WaVSRefCountFullforceMissDisable:chv */ 7472 /* WaDSRefCountFullforceMissDisable:chv */ 7473 intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE, 7474 intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) & 7475 ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME)); 7476 7477 /* WaDisableSemaphoreAndSyncFlipWait:chv */ 7478 intel_uncore_write(&dev_priv->uncore, GEN6_RC_SLEEP_PSMI_CONTROL, 7479 _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE)); 7480 7481 /* WaDisableCSUnitClockGating:chv */ 7482 intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | 7483 GEN6_CSUNIT_CLOCK_GATE_DISABLE); 7484 7485 /* WaDisableSDEUnitClockGating:chv */ 7486 intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | 7487 GEN8_SDEUNIT_CLOCK_GATE_DISABLE); 7488 7489 /* 7490 * WaProgramL3SqcReg1Default:chv 7491 * See gfxspecs/Related Documents/Performance Guide/ 7492 * LSQC Setting Recommendations. 7493 */ 7494 gen8_set_l3sqc_credits(dev_priv, 38, 2); 7495} 7496 7497static void g4x_init_clock_gating(struct drm_i915_private *dev_priv) 7498{ 7499 u32 dspclk_gate; 7500 7501 intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D1, 0); 7502 intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE | 7503 GS_UNIT_CLOCK_GATE_DISABLE | 7504 CL_UNIT_CLOCK_GATE_DISABLE); 7505 intel_uncore_write(&dev_priv->uncore, RAMCLK_GATE_D, 0); 7506 dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE | 7507 OVRUNIT_CLOCK_GATE_DISABLE | 7508 OVCUNIT_CLOCK_GATE_DISABLE; 7509 if (IS_GM45(dev_priv)) 7510 dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE; 7511 intel_uncore_write(&dev_priv->uncore, DSPCLK_GATE_D, dspclk_gate); 7512 7513 g4x_disable_trickle_feed(dev_priv); 7514} 7515 7516static void i965gm_init_clock_gating(struct drm_i915_private *dev_priv) 7517{ 7518 struct intel_uncore *uncore = &dev_priv->uncore; 7519 7520 intel_uncore_write(uncore, RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE); 7521 intel_uncore_write(uncore, RENCLK_GATE_D2, 0); 7522 intel_uncore_write(uncore, DSPCLK_GATE_D, 0); 7523 intel_uncore_write(uncore, RAMCLK_GATE_D, 0); 7524 intel_uncore_write16(uncore, DEUC, 0); 7525 intel_uncore_write(uncore, 7526 MI_ARB_STATE, 7527 _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE)); 7528} 7529 7530static void i965g_init_clock_gating(struct drm_i915_private *dev_priv) 7531{ 7532 intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE | 7533 I965_RCC_CLOCK_GATE_DISABLE | 7534 I965_RCPB_CLOCK_GATE_DISABLE | 7535 I965_ISC_CLOCK_GATE_DISABLE | 7536 I965_FBC_CLOCK_GATE_DISABLE); 7537 intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D2, 0); 7538 intel_uncore_write(&dev_priv->uncore, MI_ARB_STATE, 7539 _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE)); 7540} 7541 7542static void gen3_init_clock_gating(struct drm_i915_private *dev_priv) 7543{ 7544 u32 dstate = intel_uncore_read(&dev_priv->uncore, D_STATE); 7545 7546 dstate |= DSTATE_PLL_D3_OFF | DSTATE_GFX_CLOCK_GATING | 7547 DSTATE_DOT_CLOCK_GATING; 7548 intel_uncore_write(&dev_priv->uncore, D_STATE, dstate); 7549 7550 if (IS_PINEVIEW(dev_priv)) 7551 intel_uncore_write(&dev_priv->uncore, ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); 7552 7553 /* IIR "flip pending" means done if this bit is set */ 7554 intel_uncore_write(&dev_priv->uncore, ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); 7555 7556 /* interrupts should cause a wake up from C3 */ 7557 intel_uncore_write(&dev_priv->uncore, INSTPM, _MASKED_BIT_ENABLE(INSTPM_AGPBUSY_INT_EN)); 7558 7559 /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ 7560 intel_uncore_write(&dev_priv->uncore, MI_ARB_STATE, _MASKED_BIT_ENABLE(MI_ARB_C3_LP_WRITE_ENABLE)); 7561 7562 intel_uncore_write(&dev_priv->uncore, MI_ARB_STATE, 7563 _MASKED_BIT_ENABLE(MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE)); 7564} 7565 7566static void i85x_init_clock_gating(struct drm_i915_private *dev_priv) 7567{ 7568 intel_uncore_write(&dev_priv->uncore, RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE); 7569 7570 /* interrupts should cause a wake up from C3 */ 7571 intel_uncore_write(&dev_priv->uncore, MI_STATE, _MASKED_BIT_ENABLE(MI_AGPBUSY_INT_EN) | 7572 _MASKED_BIT_DISABLE(MI_AGPBUSY_830_MODE)); 7573 7574 intel_uncore_write(&dev_priv->uncore, MEM_MODE, 7575 _MASKED_BIT_ENABLE(MEM_DISPLAY_TRICKLE_FEED_DISABLE)); 7576 7577 /* 7578 * Have FBC ignore 3D activity since we use software 7579 * render tracking, and otherwise a pure 3D workload 7580 * (even if it just renders a single frame and then does 7581 * abosultely nothing) would not allow FBC to recompress 7582 * until a 2D blit occurs. 7583 */ 7584 intel_uncore_write(&dev_priv->uncore, SCPD0, 7585 _MASKED_BIT_ENABLE(SCPD_FBC_IGNORE_3D)); 7586} 7587 7588static void i830_init_clock_gating(struct drm_i915_private *dev_priv) 7589{ 7590 intel_uncore_write(&dev_priv->uncore, MEM_MODE, 7591 _MASKED_BIT_ENABLE(MEM_DISPLAY_A_TRICKLE_FEED_DISABLE) | 7592 _MASKED_BIT_ENABLE(MEM_DISPLAY_B_TRICKLE_FEED_DISABLE)); 7593} 7594 7595void intel_init_clock_gating(struct drm_i915_private *dev_priv) 7596{ 7597 dev_priv->display.init_clock_gating(dev_priv); 7598} 7599 7600void intel_suspend_hw(struct drm_i915_private *dev_priv) 7601{ 7602 if (HAS_PCH_LPT(dev_priv)) 7603 lpt_suspend_hw(dev_priv); 7604} 7605 7606static void nop_init_clock_gating(struct drm_i915_private *dev_priv) 7607{ 7608 drm_dbg_kms(&dev_priv->drm, 7609 "No clock gating settings or workarounds applied.\n"); 7610} 7611 7612/** 7613 * intel_init_clock_gating_hooks - setup the clock gating hooks 7614 * @dev_priv: device private 7615 * 7616 * Setup the hooks that configure which clocks of a given platform can be 7617 * gated and also apply various GT and display specific workarounds for these 7618 * platforms. Note that some GT specific workarounds are applied separately 7619 * when GPU contexts or batchbuffers start their execution. 7620 */ 7621void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv) 7622{ 7623 if (IS_DG1(dev_priv)) 7624 dev_priv->display.init_clock_gating = dg1_init_clock_gating; 7625 else if (IS_GEN(dev_priv, 12)) 7626 dev_priv->display.init_clock_gating = gen12lp_init_clock_gating; 7627 else if (IS_GEN(dev_priv, 11)) 7628 dev_priv->display.init_clock_gating = icl_init_clock_gating; 7629 else if (IS_CANNONLAKE(dev_priv)) 7630 dev_priv->display.init_clock_gating = cnl_init_clock_gating; 7631 else if (IS_COFFEELAKE(dev_priv) || IS_COMETLAKE(dev_priv)) 7632 dev_priv->display.init_clock_gating = cfl_init_clock_gating; 7633 else if (IS_SKYLAKE(dev_priv)) 7634 dev_priv->display.init_clock_gating = skl_init_clock_gating; 7635 else if (IS_KABYLAKE(dev_priv)) 7636 dev_priv->display.init_clock_gating = kbl_init_clock_gating; 7637 else if (IS_BROXTON(dev_priv)) 7638 dev_priv->display.init_clock_gating = bxt_init_clock_gating; 7639 else if (IS_GEMINILAKE(dev_priv)) 7640 dev_priv->display.init_clock_gating = glk_init_clock_gating; 7641 else if (IS_BROADWELL(dev_priv)) 7642 dev_priv->display.init_clock_gating = bdw_init_clock_gating; 7643 else if (IS_CHERRYVIEW(dev_priv)) 7644 dev_priv->display.init_clock_gating = chv_init_clock_gating; 7645 else if (IS_HASWELL(dev_priv)) 7646 dev_priv->display.init_clock_gating = hsw_init_clock_gating; 7647 else if (IS_IVYBRIDGE(dev_priv)) 7648 dev_priv->display.init_clock_gating = ivb_init_clock_gating; 7649 else if (IS_VALLEYVIEW(dev_priv)) 7650 dev_priv->display.init_clock_gating = vlv_init_clock_gating; 7651 else if (IS_GEN(dev_priv, 6)) 7652 dev_priv->display.init_clock_gating = gen6_init_clock_gating; 7653 else if (IS_GEN(dev_priv, 5)) 7654 dev_priv->display.init_clock_gating = ilk_init_clock_gating; 7655 else if (IS_G4X(dev_priv)) 7656 dev_priv->display.init_clock_gating = g4x_init_clock_gating; 7657 else if (IS_I965GM(dev_priv)) 7658 dev_priv->display.init_clock_gating = i965gm_init_clock_gating; 7659 else if (IS_I965G(dev_priv)) 7660 dev_priv->display.init_clock_gating = i965g_init_clock_gating; 7661 else if (IS_GEN(dev_priv, 3)) 7662 dev_priv->display.init_clock_gating = gen3_init_clock_gating; 7663 else if (IS_I85X(dev_priv) || IS_I865G(dev_priv)) 7664 dev_priv->display.init_clock_gating = i85x_init_clock_gating; 7665 else if (IS_GEN(dev_priv, 2)) 7666 dev_priv->display.init_clock_gating = i830_init_clock_gating; 7667 else { 7668 MISSING_CASE(INTEL_DEVID(dev_priv)); 7669 dev_priv->display.init_clock_gating = nop_init_clock_gating; 7670 } 7671} 7672 7673/* Set up chip specific power management-related functions */ 7674void intel_init_pm(struct drm_i915_private *dev_priv) 7675{ 7676 /* For cxsr */ 7677 if (IS_PINEVIEW(dev_priv)) 7678 pnv_get_mem_freq(dev_priv); 7679 else if (IS_GEN(dev_priv, 5)) 7680 ilk_get_mem_freq(dev_priv); 7681 7682 if (intel_has_sagv(dev_priv)) 7683 skl_setup_sagv_block_time(dev_priv); 7684 7685 /* For FIFO watermark updates */ 7686 if (DISPLAY_VER(dev_priv) >= 9) { 7687 skl_setup_wm_latency(dev_priv); 7688 dev_priv->display.compute_global_watermarks = skl_compute_wm; 7689 } else if (HAS_PCH_SPLIT(dev_priv)) { 7690 ilk_setup_wm_latency(dev_priv); 7691 7692 if ((IS_DISPLAY_VER(dev_priv, 5) && dev_priv->wm.pri_latency[1] && 7693 dev_priv->wm.spr_latency[1] && dev_priv->wm.cur_latency[1]) || 7694 (!IS_DISPLAY_VER(dev_priv, 5) && dev_priv->wm.pri_latency[0] && 7695 dev_priv->wm.spr_latency[0] && dev_priv->wm.cur_latency[0])) { 7696 dev_priv->display.compute_pipe_wm = ilk_compute_pipe_wm; 7697 dev_priv->display.compute_intermediate_wm = 7698 ilk_compute_intermediate_wm; 7699 dev_priv->display.initial_watermarks = 7700 ilk_initial_watermarks; 7701 dev_priv->display.optimize_watermarks = 7702 ilk_optimize_watermarks; 7703 } else { 7704 drm_dbg_kms(&dev_priv->drm, 7705 "Failed to read display plane latency. " 7706 "Disable CxSR\n"); 7707 } 7708 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { 7709 vlv_setup_wm_latency(dev_priv); 7710 dev_priv->display.compute_pipe_wm = vlv_compute_pipe_wm; 7711 dev_priv->display.compute_intermediate_wm = vlv_compute_intermediate_wm; 7712 dev_priv->display.initial_watermarks = vlv_initial_watermarks; 7713 dev_priv->display.optimize_watermarks = vlv_optimize_watermarks; 7714 dev_priv->display.atomic_update_watermarks = vlv_atomic_update_fifo; 7715 } else if (IS_G4X(dev_priv)) { 7716 g4x_setup_wm_latency(dev_priv); 7717 dev_priv->display.compute_pipe_wm = g4x_compute_pipe_wm; 7718 dev_priv->display.compute_intermediate_wm = g4x_compute_intermediate_wm; 7719 dev_priv->display.initial_watermarks = g4x_initial_watermarks; 7720 dev_priv->display.optimize_watermarks = g4x_optimize_watermarks; 7721 } else if (IS_PINEVIEW(dev_priv)) { 7722 if (!intel_get_cxsr_latency(!IS_MOBILE(dev_priv), 7723 dev_priv->is_ddr3, 7724 dev_priv->fsb_freq, 7725 dev_priv->mem_freq)) { 7726 drm_info(&dev_priv->drm, 7727 "failed to find known CxSR latency " 7728 "(found ddr%s fsb freq %d, mem freq %d), " 7729 "disabling CxSR\n", 7730 (dev_priv->is_ddr3 == 1) ? "3" : "2", 7731 dev_priv->fsb_freq, dev_priv->mem_freq); 7732 /* Disable CxSR and never update its watermark again */ 7733 intel_set_memory_cxsr(dev_priv, false); 7734 dev_priv->display.update_wm = NULL; 7735 } else 7736 dev_priv->display.update_wm = pnv_update_wm; 7737 } else if (IS_DISPLAY_VER(dev_priv, 4)) { 7738 dev_priv->display.update_wm = i965_update_wm; 7739 } else if (IS_DISPLAY_VER(dev_priv, 3)) { 7740 dev_priv->display.update_wm = i9xx_update_wm; 7741 dev_priv->display.get_fifo_size = i9xx_get_fifo_size; 7742 } else if (IS_DISPLAY_VER(dev_priv, 2)) { 7743 if (INTEL_NUM_PIPES(dev_priv) == 1) { 7744 dev_priv->display.update_wm = i845_update_wm; 7745 dev_priv->display.get_fifo_size = i845_get_fifo_size; 7746 } else { 7747 dev_priv->display.update_wm = i9xx_update_wm; 7748 dev_priv->display.get_fifo_size = i830_get_fifo_size; 7749 } 7750 } else { 7751 drm_err(&dev_priv->drm, 7752 "unexpected fall-through in %s\n", __func__); 7753 } 7754} 7755 7756void intel_pm_setup(struct drm_i915_private *dev_priv) 7757{ 7758 dev_priv->runtime_pm.suspended = false; 7759 atomic_set(&dev_priv->runtime_pm.wakeref_count, 0); 7760} 7761 7762static struct intel_global_state *intel_dbuf_duplicate_state(struct intel_global_obj *obj) 7763{ 7764 struct intel_dbuf_state *dbuf_state; 7765 7766 dbuf_state = kmemdup(obj->state, sizeof(*dbuf_state), GFP_KERNEL); 7767 if (!dbuf_state) 7768 return NULL; 7769 7770 return &dbuf_state->base; 7771} 7772 7773static void intel_dbuf_destroy_state(struct intel_global_obj *obj, 7774 struct intel_global_state *state) 7775{ 7776 kfree(state); 7777} 7778 7779static const struct intel_global_state_funcs intel_dbuf_funcs = { 7780 .atomic_duplicate_state = intel_dbuf_duplicate_state, 7781 .atomic_destroy_state = intel_dbuf_destroy_state, 7782}; 7783 7784struct intel_dbuf_state * 7785intel_atomic_get_dbuf_state(struct intel_atomic_state *state) 7786{ 7787 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 7788 struct intel_global_state *dbuf_state; 7789 7790 dbuf_state = intel_atomic_get_global_obj_state(state, &dev_priv->dbuf.obj); 7791 if (IS_ERR(dbuf_state)) 7792 return ERR_CAST(dbuf_state); 7793 7794 return to_intel_dbuf_state(dbuf_state); 7795} 7796 7797int intel_dbuf_init(struct drm_i915_private *dev_priv) 7798{ 7799 struct intel_dbuf_state *dbuf_state; 7800 7801 dbuf_state = kzalloc(sizeof(*dbuf_state), GFP_KERNEL); 7802 if (!dbuf_state) 7803 return -ENOMEM; 7804 7805 intel_atomic_global_obj_init(dev_priv, &dev_priv->dbuf.obj, 7806 &dbuf_state->base, &intel_dbuf_funcs); 7807 7808 return 0; 7809} 7810 7811void intel_dbuf_pre_plane_update(struct intel_atomic_state *state) 7812{ 7813 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 7814 const struct intel_dbuf_state *new_dbuf_state = 7815 intel_atomic_get_new_dbuf_state(state); 7816 const struct intel_dbuf_state *old_dbuf_state = 7817 intel_atomic_get_old_dbuf_state(state); 7818 7819 if (!new_dbuf_state || 7820 new_dbuf_state->enabled_slices == old_dbuf_state->enabled_slices) 7821 return; 7822 7823 WARN_ON(!new_dbuf_state->base.changed); 7824 7825 gen9_dbuf_slices_update(dev_priv, 7826 old_dbuf_state->enabled_slices | 7827 new_dbuf_state->enabled_slices); 7828} 7829 7830void intel_dbuf_post_plane_update(struct intel_atomic_state *state) 7831{ 7832 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 7833 const struct intel_dbuf_state *new_dbuf_state = 7834 intel_atomic_get_new_dbuf_state(state); 7835 const struct intel_dbuf_state *old_dbuf_state = 7836 intel_atomic_get_old_dbuf_state(state); 7837 7838 if (!new_dbuf_state || 7839 new_dbuf_state->enabled_slices == old_dbuf_state->enabled_slices) 7840 return; 7841 7842 WARN_ON(!new_dbuf_state->base.changed); 7843 7844 gen9_dbuf_slices_update(dev_priv, 7845 new_dbuf_state->enabled_slices); 7846}