drm/i915: vlv: add runtime PM support
Add runtime PM support for VLV, but leave it disabled. The next patch enables it. The suspend/resume sequence used is based on [1] and [2]. In practice we depend on the GT RC6 mechanism to save the HW context depending on the render and media power wells. By the time we run the runtime suspend callback the display side is also off and the HW context for that is managed by the display power domain framework. Besides the above there are Gunit registers that depend on a system-wide power well. This power well goes off once the device enters any of the S0i[R123] states. To handle this scenario, save/restore these Gunit registers. Note that this is not the complete register set dictated by [2], to remove some overhead, registers that are known not to be used are ignored. Also some registers are fully setup by initialization functions called during resume, these are not saved either. The list of registers can be further reduced, see the TODO note in the code. [1] VLV_gfx_clocking_PM_reset_y12w21d3 / "Driver D3 entry/exit" [2] VLV2_S0IXRegs v2: - unchanged v3: - fix s/GEN6_PMIIR/GEN6_PMIMR/ typo when saving/restoring registers (Ville) v4: - rebased on the previous patch fixing GEN register prefixes Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> [ rebased (according to v4) ] Signed-off-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
@@ -819,6 +819,67 @@ struct i915_suspend_saved_registers {
|
||||
u32 savePCH_PORT_HOTPLUG;
|
||||
};
|
||||
|
||||
struct vlv_s0ix_state {
|
||||
/* GAM */
|
||||
u32 wr_watermark;
|
||||
u32 gfx_prio_ctrl;
|
||||
u32 arb_mode;
|
||||
u32 gfx_pend_tlb0;
|
||||
u32 gfx_pend_tlb1;
|
||||
u32 lra_limits[GEN7_LRA_LIMITS_REG_NUM];
|
||||
u32 media_max_req_count;
|
||||
u32 gfx_max_req_count;
|
||||
u32 render_hwsp;
|
||||
u32 ecochk;
|
||||
u32 bsd_hwsp;
|
||||
u32 blt_hwsp;
|
||||
u32 tlb_rd_addr;
|
||||
|
||||
/* MBC */
|
||||
u32 g3dctl;
|
||||
u32 gsckgctl;
|
||||
u32 mbctl;
|
||||
|
||||
/* GCP */
|
||||
u32 ucgctl1;
|
||||
u32 ucgctl3;
|
||||
u32 rcgctl1;
|
||||
u32 rcgctl2;
|
||||
u32 rstctl;
|
||||
u32 misccpctl;
|
||||
|
||||
/* GPM */
|
||||
u32 gfxpause;
|
||||
u32 rpdeuhwtc;
|
||||
u32 rpdeuc;
|
||||
u32 ecobus;
|
||||
u32 pwrdwnupctl;
|
||||
u32 rp_down_timeout;
|
||||
u32 rp_deucsw;
|
||||
u32 rcubmabdtmr;
|
||||
u32 rcedata;
|
||||
u32 spare2gh;
|
||||
|
||||
/* Display 1 CZ domain */
|
||||
u32 gt_imr;
|
||||
u32 gt_ier;
|
||||
u32 pm_imr;
|
||||
u32 pm_ier;
|
||||
u32 gt_scratch[GEN7_GT_SCRATCH_REG_NUM];
|
||||
|
||||
/* GT SA CZ domain */
|
||||
u32 tilectl;
|
||||
u32 gt_fifoctl;
|
||||
u32 gtlc_wake_ctrl;
|
||||
u32 gtlc_survive;
|
||||
u32 pmwgicz;
|
||||
|
||||
/* Display 2 CZ domain */
|
||||
u32 gu_ctl0;
|
||||
u32 gu_ctl1;
|
||||
u32 clock_gate_dis2;
|
||||
};
|
||||
|
||||
struct intel_gen6_power_mgmt {
|
||||
/* work and pm_iir are protected by dev_priv->irq_lock */
|
||||
struct work_struct work;
|
||||
@@ -1448,6 +1509,7 @@ struct drm_i915_private {
|
||||
|
||||
u32 suspend_count;
|
||||
struct i915_suspend_saved_registers regfile;
|
||||
struct vlv_s0ix_state vlv_s0ix_state;
|
||||
|
||||
struct {
|
||||
/*
|
||||
|
Reference in New Issue
Block a user