Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/hsw+: Add support for multiple power well regs

Future platforms increase the number of power wells which require
additional control registers. A convenient way to select the correct
register is to use the high bits of the power well ID as index. This
patch only prepares for this, while upcoming platform enabling patches
will add the actual new power well IDs and corresponding power well
control registers.

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Animesh Manna <animesh.manna@intel.com>
Cc: Rakshmi Bhatia <rakshmi.bhatia@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Animesh Manna <animesh.manna@intel.com>
Reviewed-by: Rakshmi Bhatia <rakshmi.bhatia@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170814151530.24154-2-imre.deak@intel.com

+68 -33
+19 -7
drivers/gpu/drm/i915/gvt/handlers.c
··· 2252 2252 MMIO_D(GEN6_RC6p_THRESHOLD, D_ALL); 2253 2253 MMIO_D(GEN6_RC6pp_THRESHOLD, D_ALL); 2254 2254 MMIO_D(GEN6_PMINTRMSK, D_ALL); 2255 - MMIO_DH(HSW_PWR_WELL_BIOS, D_BDW, NULL, power_well_ctl_mmio_write); 2256 - MMIO_DH(HSW_PWR_WELL_DRIVER, D_BDW, NULL, power_well_ctl_mmio_write); 2257 - MMIO_DH(HSW_PWR_WELL_KVMR, D_BDW, NULL, power_well_ctl_mmio_write); 2258 - MMIO_DH(HSW_PWR_WELL_DEBUG, D_BDW, NULL, power_well_ctl_mmio_write); 2255 + /* 2256 + * Use an arbitrary power well controlled by the PWR_WELL_CTL 2257 + * register. 2258 + */ 2259 + MMIO_DH(HSW_PWR_WELL_CTL_BIOS(HSW_DISP_PW_GLOBAL), D_BDW, NULL, 2260 + power_well_ctl_mmio_write); 2261 + MMIO_DH(HSW_PWR_WELL_CTL_DRIVER(HSW_DISP_PW_GLOBAL), D_BDW, NULL, 2262 + power_well_ctl_mmio_write); 2263 + MMIO_DH(HSW_PWR_WELL_CTL_KVMR, D_BDW, NULL, power_well_ctl_mmio_write); 2264 + MMIO_DH(HSW_PWR_WELL_CTL_DEBUG(HSW_DISP_PW_GLOBAL), D_BDW, NULL, 2265 + power_well_ctl_mmio_write); 2259 2266 MMIO_DH(HSW_PWR_WELL_CTL5, D_BDW, NULL, power_well_ctl_mmio_write); 2260 2267 MMIO_DH(HSW_PWR_WELL_CTL6, D_BDW, NULL, power_well_ctl_mmio_write); 2261 2268 ··· 2652 2645 MMIO_F(_DPD_AUX_CH_CTL, 6 * 4, 0, 0, 0, D_SKL_PLUS, NULL, 2653 2646 dp_aux_ch_ctl_mmio_write); 2654 2647 2655 - MMIO_D(HSW_PWR_WELL_BIOS, D_SKL_PLUS); 2656 - MMIO_DH(HSW_PWR_WELL_DRIVER, D_SKL_PLUS, NULL, 2657 - skl_power_well_ctl_write); 2648 + /* 2649 + * Use an arbitrary power well controlled by the PWR_WELL_CTL 2650 + * register. 2651 + */ 2652 + MMIO_D(HSW_PWR_WELL_CTL_BIOS(SKL_DISP_PW_MISC_IO), D_SKL_PLUS); 2653 + MMIO_DH(HSW_PWR_WELL_CTL_DRIVER(SKL_DISP_PW_MISC_IO), D_SKL_PLUS, NULL, 2654 + skl_power_well_ctl_write); 2655 + MMIO_DH(GEN6_PCODE_MAILBOX, D_SKL_PLUS, NULL, mailbox_write); 2658 2656 2659 2657 MMIO_D(0xa210, D_SKL_PLUS); 2660 2658 MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS);
+25 -7
drivers/gpu/drm/i915/i915_reg.h
··· 1254 1254 1255 1255 /* 1256 1256 * HSW/BDW 1257 - * - HSW_PWR_WELL_DRIVER (status bit: id*2, req bit: id*2+1) 1257 + * - HSW_PWR_WELL_CTL_DRIVER(0) (status bit: id*2, req bit: id*2+1) 1258 1258 */ 1259 1259 HSW_DISP_PW_GLOBAL = 15, 1260 1260 1261 1261 /* 1262 1262 * GEN9+ 1263 - * - HSW_PWR_WELL_DRIVER (status bit: id*2, req bit: id*2+1) 1263 + * - HSW_PWR_WELL_CTL_DRIVER(0) (status bit: id*2, req bit: id*2+1) 1264 1264 */ 1265 1265 SKL_DISP_PW_MISC_IO = 0, 1266 1266 SKL_DISP_PW_DDI_A_E, ··· 8189 8189 #define SKL_AUD_CODEC_WAKE_SIGNAL (1 << 15) 8190 8190 8191 8191 /* HSW Power Wells */ 8192 - #define HSW_PWR_WELL_BIOS _MMIO(0x45400) /* CTL1 */ 8193 - #define HSW_PWR_WELL_DRIVER _MMIO(0x45404) /* CTL2 */ 8194 - #define HSW_PWR_WELL_KVMR _MMIO(0x45408) /* CTL3 */ 8195 - #define HSW_PWR_WELL_DEBUG _MMIO(0x4540C) /* CTL4 */ 8196 - #define _HSW_PW_SHIFT(pw) ((pw) * 2) 8192 + #define _HSW_PWR_WELL_CTL1 0x45400 8193 + #define _HSW_PWR_WELL_CTL2 0x45404 8194 + #define _HSW_PWR_WELL_CTL3 0x45408 8195 + #define _HSW_PWR_WELL_CTL4 0x4540C 8196 + 8197 + /* 8198 + * Each power well control register contains up to 16 (request, status) HW 8199 + * flag tuples. The register index and HW flag shift is determined by the 8200 + * power well ID (see i915_power_well_id). There are 4 possible sources of 8201 + * power well requests each source having its own set of control registers: 8202 + * BIOS, DRIVER, KVMR, DEBUG. 8203 + */ 8204 + #define _HSW_PW_REG_IDX(pw) ((pw) >> 4) 8205 + #define _HSW_PW_SHIFT(pw) (((pw) & 0xf) * 2) 8206 + /* TODO: Add all PWR_WELL_CTL registers below for new platforms */ 8207 + #define HSW_PWR_WELL_CTL_BIOS(pw) _MMIO(_PICK(_HSW_PW_REG_IDX(pw), \ 8208 + _HSW_PWR_WELL_CTL1)) 8209 + #define HSW_PWR_WELL_CTL_DRIVER(pw) _MMIO(_PICK(_HSW_PW_REG_IDX(pw), \ 8210 + _HSW_PWR_WELL_CTL2)) 8211 + #define HSW_PWR_WELL_CTL_KVMR _MMIO(_HSW_PWR_WELL_CTL3) 8212 + #define HSW_PWR_WELL_CTL_DEBUG(pw) _MMIO(_PICK(_HSW_PW_REG_IDX(pw), \ 8213 + _HSW_PWR_WELL_CTL4)) 8214 + 8197 8215 #define HSW_PWR_WELL_CTL_REQ(pw) (1 << (_HSW_PW_SHIFT(pw) + 1)) 8198 8216 #define HSW_PWR_WELL_CTL_STATE(pw) (1 << _HSW_PW_SHIFT(pw)) 8199 8217 #define HSW_PWR_WELL_CTL5 _MMIO(0x45410)
+4 -2
drivers/gpu/drm/i915/intel_display.c
··· 8783 8783 I915_STATE_WARN(crtc->active, "CRTC for pipe %c enabled\n", 8784 8784 pipe_name(crtc->pipe)); 8785 8785 8786 - I915_STATE_WARN(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on\n"); 8786 + I915_STATE_WARN(I915_READ(HSW_PWR_WELL_CTL_DRIVER(HSW_DISP_PW_GLOBAL)), 8787 + "Display power well on\n"); 8787 8788 I915_STATE_WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL enabled\n"); 8788 8789 I915_STATE_WARN(I915_READ(WRPLL_CTL(0)) & WRPLL_PLL_ENABLE, "WRPLL1 enabled\n"); 8789 8790 I915_STATE_WARN(I915_READ(WRPLL_CTL(1)) & WRPLL_PLL_ENABLE, "WRPLL2 enabled\n"); ··· 15349 15348 return NULL; 15350 15349 15351 15350 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 15352 - error->power_well_driver = I915_READ(HSW_PWR_WELL_DRIVER); 15351 + error->power_well_driver = 15352 + I915_READ(HSW_PWR_WELL_CTL_DRIVER(HSW_DISP_PW_GLOBAL)); 15353 15353 15354 15354 for_each_pipe(dev_priv, i) { 15355 15355 error->pipe[i].power_domain_on =
+20 -17
drivers/gpu/drm/i915/intel_runtime_pm.c
··· 307 307 308 308 /* Timeout for PW1:10 us, AUX:not specified, other PWs:20 us. */ 309 309 WARN_ON(intel_wait_for_register(dev_priv, 310 - HSW_PWR_WELL_DRIVER, 310 + HSW_PWR_WELL_CTL_DRIVER(id), 311 311 HSW_PWR_WELL_CTL_STATE(id), 312 312 HSW_PWR_WELL_CTL_STATE(id), 313 313 1)); ··· 319 319 u32 req_mask = HSW_PWR_WELL_CTL_REQ(id); 320 320 u32 ret; 321 321 322 - ret = I915_READ(HSW_PWR_WELL_BIOS) & req_mask ? 1 : 0; 323 - ret |= I915_READ(HSW_PWR_WELL_DRIVER) & req_mask ? 2 : 0; 324 - ret |= I915_READ(HSW_PWR_WELL_KVMR) & req_mask ? 4 : 0; 325 - ret |= I915_READ(HSW_PWR_WELL_DEBUG) & req_mask ? 8 : 0; 322 + ret = I915_READ(HSW_PWR_WELL_CTL_BIOS(id)) & req_mask ? 1 : 0; 323 + ret |= I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) & req_mask ? 2 : 0; 324 + ret |= I915_READ(HSW_PWR_WELL_CTL_KVMR) & req_mask ? 4 : 0; 325 + ret |= I915_READ(HSW_PWR_WELL_CTL_DEBUG(id)) & req_mask ? 8 : 0; 326 326 327 327 return ret; 328 328 } ··· 343 343 * Skip the wait in case any of the request bits are set and print a 344 344 * diagnostic message. 345 345 */ 346 - wait_for((disabled = !(I915_READ(HSW_PWR_WELL_DRIVER) & 346 + wait_for((disabled = !(I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) & 347 347 HSW_PWR_WELL_CTL_STATE(id))) || 348 348 (reqs = hsw_power_well_requesters(dev_priv, id)), 1); 349 349 if (disabled) ··· 384 384 gen9_wait_for_power_well_fuses(dev_priv, SKL_PG0); 385 385 } 386 386 387 - val = I915_READ(HSW_PWR_WELL_DRIVER); 388 - I915_WRITE(HSW_PWR_WELL_DRIVER, val | HSW_PWR_WELL_CTL_REQ(id)); 387 + val = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)); 388 + I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id), val | HSW_PWR_WELL_CTL_REQ(id)); 389 389 hsw_wait_for_power_well_enable(dev_priv, power_well); 390 390 391 391 if (wait_fuses) ··· 403 403 404 404 hsw_power_well_pre_disable(dev_priv, power_well->hsw.irq_pipe_mask); 405 405 406 - val = I915_READ(HSW_PWR_WELL_DRIVER); 407 - I915_WRITE(HSW_PWR_WELL_DRIVER, val & ~HSW_PWR_WELL_CTL_REQ(id)); 406 + val = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)); 407 + I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id), 408 + val & ~HSW_PWR_WELL_CTL_REQ(id)); 408 409 hsw_wait_for_power_well_disable(dev_priv, power_well); 409 410 } 410 411 ··· 420 419 enum i915_power_well_id id = power_well->id; 421 420 u32 mask = HSW_PWR_WELL_CTL_REQ(id) | HSW_PWR_WELL_CTL_STATE(id); 422 421 423 - return (I915_READ(HSW_PWR_WELL_DRIVER) & mask) == mask; 422 + return (I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) & mask) == mask; 424 423 } 425 424 426 425 static void assert_can_enable_dc9(struct drm_i915_private *dev_priv) 427 426 { 427 + enum i915_power_well_id id = SKL_DISP_PW_2; 428 + 428 429 WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9), 429 430 "DC9 already programmed to be enabled.\n"); 430 431 WARN_ONCE(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5, 431 432 "DC5 still not disabled to enable DC9.\n"); 432 - WARN_ONCE(I915_READ(HSW_PWR_WELL_DRIVER) & 433 - HSW_PWR_WELL_CTL_REQ(SKL_DISP_PW_2), 433 + WARN_ONCE(I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)) & 434 + HSW_PWR_WELL_CTL_REQ(id), 434 435 "Power well 2 on.\n"); 435 436 WARN_ONCE(intel_irqs_enabled(dev_priv), 436 437 "Interrupts not disabled yet.\n"); ··· 633 630 { 634 631 enum i915_power_well_id id = power_well->id; 635 632 u32 mask = HSW_PWR_WELL_CTL_REQ(id); 636 - u32 bios_req = I915_READ(HSW_PWR_WELL_BIOS); 633 + u32 bios_req = I915_READ(HSW_PWR_WELL_CTL_BIOS(id)); 637 634 638 635 /* Take over the request bit if set by BIOS. */ 639 636 if (bios_req & mask) { 640 - u32 drv_req = I915_READ(HSW_PWR_WELL_DRIVER); 637 + u32 drv_req = I915_READ(HSW_PWR_WELL_CTL_DRIVER(id)); 641 638 642 639 if (!(drv_req & mask)) 643 - I915_WRITE(HSW_PWR_WELL_DRIVER, drv_req | mask); 644 - I915_WRITE(HSW_PWR_WELL_BIOS, bios_req & ~mask); 640 + I915_WRITE(HSW_PWR_WELL_CTL_DRIVER(id), drv_req | mask); 641 + I915_WRITE(HSW_PWR_WELL_CTL_BIOS(id), bios_req & ~mask); 645 642 } 646 643 } 647 644