diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 472 | 
1 files changed, 205 insertions, 267 deletions
| diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 8f86f56e7ca4..73c88b1c9545 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -30,6 +30,8 @@  #include "display/skl_watermark.h"  #include "gt/intel_engine_regs.h" +#include "gt/intel_gt.h" +#include "gt/intel_gt_mcr.h"  #include "gt/intel_gt_regs.h"  #include "i915_drv.h" @@ -58,25 +60,20 @@ static void gen9_init_clock_gating(struct drm_i915_private *dev_priv)  		 * Must match Sampler, Pixel Back End, and Media. See  		 * WaCompressedResourceSamplerPbeMediaNewHashMode.  		 */ -		intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1, -			   intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | -			   SKL_DE_COMPRESSED_HASH_MODE); +		intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR1_1, 0, SKL_DE_COMPRESSED_HASH_MODE);  	}  	/* See Bspec note for PSR2_CTL bit 31, Wa#828:skl,bxt,kbl,cfl */ -	intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1, -		   intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | SKL_EDP_PSR_FIX_RDWRAP); +	intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR1_1, 0, SKL_EDP_PSR_FIX_RDWRAP);  	/* WaEnableChickenDCPR:skl,bxt,kbl,glk,cfl */ -	intel_uncore_write(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, -		   intel_uncore_read(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1) | MASK_WAKEMEM); +	intel_uncore_rmw(&dev_priv->uncore, GEN8_CHICKEN_DCPR_1, 0, MASK_WAKEMEM);  	/*  	 * WaFbcWakeMemOn:skl,bxt,kbl,glk,cfl  	 * Display WA #0859: skl,bxt,kbl,glk,cfl  	 */ -	intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | -		   DISP_FBC_MEMORY_WAKE); +	intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_MEMORY_WAKE);  }  static void bxt_init_clock_gating(struct drm_i915_private *dev_priv) @@ -84,15 +81,13 @@ static void bxt_init_clock_gating(struct drm_i915_private *dev_priv)  	gen9_init_clock_gating(dev_priv);  	/* WaDisableSDEUnitClockGating:bxt */ -	intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | -		   GEN8_SDEUNIT_CLOCK_GATE_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);  	/*  	 * FIXME:  	 * GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ applies on 3x6 GT SKUs only.  	 */ -	intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | -		   GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ); +	intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ);  	/*  	 * Wa: Backlight PWM may stop in the asserted state, causing backlight @@ -113,16 +108,13 @@ static void bxt_init_clock_gating(struct drm_i915_private *dev_priv)  	 * WaFbcTurnOffFbcWatermark:bxt  	 * Display WA #0562: bxt  	 */ -	intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | -		   DISP_FBC_WM_DIS); +	intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);  	/*  	 * WaFbcHighMemBwCorruptionAvoidance:bxt  	 * Display WA #0883: bxt  	 */ -	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), -			   intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) | -			   DPFC_DISABLE_DUMMY0); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), 0, DPFC_DISABLE_DUMMY0);  }  static void glk_init_clock_gating(struct drm_i915_private *dev_priv) @@ -895,19 +887,14 @@ static void pnv_update_wm(struct drm_i915_private *dev_priv)  		wm = intel_calculate_wm(pixel_rate, &pnv_cursor_wm,  					pnv_display_wm.fifo_size,  					4, latency->cursor_sr); -		reg = intel_uncore_read(&dev_priv->uncore, DSPFW3); -		reg &= ~DSPFW_CURSOR_SR_MASK; -		reg |= FW_WM(wm, CURSOR_SR); -		intel_uncore_write(&dev_priv->uncore, DSPFW3, reg); +		intel_uncore_rmw(&dev_priv->uncore, DSPFW3, DSPFW_CURSOR_SR_MASK, +				 FW_WM(wm, CURSOR_SR));  		/* Display HPLL off SR */  		wm = intel_calculate_wm(pixel_rate, &pnv_display_hplloff_wm,  					pnv_display_hplloff_wm.fifo_size,  					cpp, latency->display_hpll_disable); -		reg = intel_uncore_read(&dev_priv->uncore, DSPFW3); -		reg &= ~DSPFW_HPLL_SR_MASK; -		reg |= FW_WM(wm, HPLL_SR); -		intel_uncore_write(&dev_priv->uncore, DSPFW3, reg); +		intel_uncore_rmw(&dev_priv->uncore, DSPFW3, DSPFW_HPLL_SR_MASK, FW_WM(wm, HPLL_SR));  		/* cursor HPLL off SR */  		wm = intel_calculate_wm(pixel_rate, &pnv_cursor_hplloff_wm, @@ -1337,34 +1324,14 @@ static bool g4x_compute_fbc_en(const struct g4x_wm_state *wm_state,  	return true;  } -static int g4x_compute_pipe_wm(struct intel_atomic_state *state, -			       struct intel_crtc *crtc) +static int _g4x_compute_pipe_wm(struct intel_crtc_state *crtc_state)  { -	struct intel_crtc_state *crtc_state = -		intel_atomic_get_new_crtc_state(state, crtc); +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);  	struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal;  	u8 active_planes = crtc_state->active_planes & ~BIT(PLANE_CURSOR);  	const struct g4x_pipe_wm *raw; -	const struct intel_plane_state *old_plane_state; -	const struct intel_plane_state *new_plane_state; -	struct intel_plane *plane;  	enum plane_id plane_id; -	int i, level; -	unsigned int dirty = 0; - -	for_each_oldnew_intel_plane_in_state(state, plane, -					     old_plane_state, -					     new_plane_state, i) { -		if (new_plane_state->hw.crtc != &crtc->base && -		    old_plane_state->hw.crtc != &crtc->base) -			continue; - -		if (g4x_raw_plane_wm_compute(crtc_state, new_plane_state)) -			dirty |= BIT(plane->id); -	} - -	if (!dirty) -		return 0; +	int level;  	level = G4X_WM_LEVEL_NORMAL;  	if (!g4x_raw_crtc_wm_is_valid(crtc_state, level)) @@ -1417,6 +1384,34 @@ static int g4x_compute_pipe_wm(struct intel_atomic_state *state,  	return 0;  } +static int g4x_compute_pipe_wm(struct intel_atomic_state *state, +			       struct intel_crtc *crtc) +{ +	struct intel_crtc_state *crtc_state = +		intel_atomic_get_new_crtc_state(state, crtc); +	const struct intel_plane_state *old_plane_state; +	const struct intel_plane_state *new_plane_state; +	struct intel_plane *plane; +	unsigned int dirty = 0; +	int i; + +	for_each_oldnew_intel_plane_in_state(state, plane, +					     old_plane_state, +					     new_plane_state, i) { +		if (new_plane_state->hw.crtc != &crtc->base && +		    old_plane_state->hw.crtc != &crtc->base) +			continue; + +		if (g4x_raw_plane_wm_compute(crtc_state, new_plane_state)) +			dirty |= BIT(plane->id); +	} + +	if (!dirty) +		return 0; + +	return _g4x_compute_pipe_wm(crtc_state); +} +  static int g4x_compute_intermediate_wm(struct intel_atomic_state *state,  				       struct intel_crtc *crtc)  { @@ -1431,7 +1426,7 @@ static int g4x_compute_intermediate_wm(struct intel_atomic_state *state,  	enum plane_id plane_id;  	if (!new_crtc_state->hw.active || -	    drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { +	    intel_crtc_needs_modeset(new_crtc_state)) {  		*intermediate = *optimal;  		intermediate->cxsr = false; @@ -1857,64 +1852,17 @@ static bool vlv_raw_crtc_wm_is_valid(const struct intel_crtc_state *crtc_state,  		vlv_raw_plane_wm_is_valid(crtc_state, PLANE_CURSOR, level);  } -static int vlv_compute_pipe_wm(struct intel_atomic_state *state, -			       struct intel_crtc *crtc) +static int _vlv_compute_pipe_wm(struct intel_crtc_state *crtc_state)  { +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); -	struct intel_crtc_state *crtc_state = -		intel_atomic_get_new_crtc_state(state, crtc);  	struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal;  	const struct vlv_fifo_state *fifo_state =  		&crtc_state->wm.vlv.fifo_state;  	u8 active_planes = crtc_state->active_planes & ~BIT(PLANE_CURSOR);  	int num_active_planes = hweight8(active_planes); -	bool needs_modeset = drm_atomic_crtc_needs_modeset(&crtc_state->uapi); -	const struct intel_plane_state *old_plane_state; -	const struct intel_plane_state *new_plane_state; -	struct intel_plane *plane;  	enum plane_id plane_id; -	int level, ret, i; -	unsigned int dirty = 0; - -	for_each_oldnew_intel_plane_in_state(state, plane, -					     old_plane_state, -					     new_plane_state, i) { -		if (new_plane_state->hw.crtc != &crtc->base && -		    old_plane_state->hw.crtc != &crtc->base) -			continue; - -		if (vlv_raw_plane_wm_compute(crtc_state, new_plane_state)) -			dirty |= BIT(plane->id); -	} - -	/* -	 * DSPARB registers may have been reset due to the -	 * power well being turned off. Make sure we restore -	 * them to a consistent state even if no primary/sprite -	 * planes are initially active. -	 */ -	if (needs_modeset) -		crtc_state->fifo_changed = true; - -	if (!dirty) -		return 0; - -	/* cursor changes don't warrant a FIFO recompute */ -	if (dirty & ~BIT(PLANE_CURSOR)) { -		const struct intel_crtc_state *old_crtc_state = -			intel_atomic_get_old_crtc_state(state, crtc); -		const struct vlv_fifo_state *old_fifo_state = -			&old_crtc_state->wm.vlv.fifo_state; - -		ret = vlv_compute_fifo(crtc_state); -		if (ret) -			return ret; - -		if (needs_modeset || -		    memcmp(old_fifo_state, fifo_state, -			   sizeof(*fifo_state)) != 0) -			crtc_state->fifo_changed = true; -	} +	int level;  	/* initially allow all levels */  	wm_state->num_levels = intel_wm_num_levels(dev_priv); @@ -1961,6 +1909,66 @@ static int vlv_compute_pipe_wm(struct intel_atomic_state *state,  	return 0;  } +static int vlv_compute_pipe_wm(struct intel_atomic_state *state, +			       struct intel_crtc *crtc) +{ +	struct intel_crtc_state *crtc_state = +		intel_atomic_get_new_crtc_state(state, crtc); +	const struct intel_plane_state *old_plane_state; +	const struct intel_plane_state *new_plane_state; +	struct intel_plane *plane; +	unsigned int dirty = 0; +	int i; + +	for_each_oldnew_intel_plane_in_state(state, plane, +					     old_plane_state, +					     new_plane_state, i) { +		if (new_plane_state->hw.crtc != &crtc->base && +		    old_plane_state->hw.crtc != &crtc->base) +			continue; + +		if (vlv_raw_plane_wm_compute(crtc_state, new_plane_state)) +			dirty |= BIT(plane->id); +	} + +	/* +	 * DSPARB registers may have been reset due to the +	 * power well being turned off. Make sure we restore +	 * them to a consistent state even if no primary/sprite +	 * planes are initially active. We also force a FIFO +	 * recomputation so that we are sure to sanitize the +	 * FIFO setting we took over from the BIOS even if there +	 * are no active planes on the crtc. +	 */ +	if (intel_crtc_needs_modeset(crtc_state)) +		dirty = ~0; + +	if (!dirty) +		return 0; + +	/* cursor changes don't warrant a FIFO recompute */ +	if (dirty & ~BIT(PLANE_CURSOR)) { +		const struct intel_crtc_state *old_crtc_state = +			intel_atomic_get_old_crtc_state(state, crtc); +		const struct vlv_fifo_state *old_fifo_state = +			&old_crtc_state->wm.vlv.fifo_state; +		const struct vlv_fifo_state *new_fifo_state = +			&crtc_state->wm.vlv.fifo_state; +		int ret; + +		ret = vlv_compute_fifo(crtc_state); +		if (ret) +			return ret; + +		if (intel_crtc_needs_modeset(crtc_state) || +		    memcmp(old_fifo_state, new_fifo_state, +			   sizeof(*new_fifo_state)) != 0) +			crtc_state->fifo_changed = true; +	} + +	return _vlv_compute_pipe_wm(crtc_state); +} +  #define VLV_FIFO(plane, value) \  	(((value) << DSPARB_ ## plane ## _SHIFT_VLV) & DSPARB_ ## plane ## _MASK_VLV) @@ -2075,7 +2083,7 @@ static int vlv_compute_intermediate_wm(struct intel_atomic_state *state,  	int level;  	if (!new_crtc_state->hw.active || -	    drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { +	    intel_crtc_needs_modeset(new_crtc_state)) {  		*intermediate = *optimal;  		intermediate->cxsr = false; @@ -3133,7 +3141,7 @@ static int ilk_compute_intermediate_wm(struct intel_atomic_state *state,  	 */  	*a = new_crtc_state->wm.ilk.optimal;  	if (!new_crtc_state->hw.active || -	    drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi) || +	    intel_crtc_needs_modeset(new_crtc_state) ||  	    state->skip_intermediate_wm)  		return 0; @@ -3458,7 +3466,6 @@ static void ilk_write_wm_values(struct drm_i915_private *dev_priv,  {  	struct ilk_wm_values *previous = &dev_priv->display.wm.hw;  	unsigned int dirty; -	u32 val;  	dirty = ilk_compute_wm_dirty(dev_priv, previous, results);  	if (!dirty) @@ -3474,32 +3481,20 @@ static void ilk_write_wm_values(struct drm_i915_private *dev_priv,  		intel_uncore_write(&dev_priv->uncore, WM0_PIPE_ILK(PIPE_C), results->wm_pipe[2]);  	if (dirty & WM_DIRTY_DDB) { -		if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { -			val = intel_uncore_read(&dev_priv->uncore, WM_MISC); -			if (results->partitioning == INTEL_DDB_PART_1_2) -				val &= ~WM_MISC_DATA_PARTITION_5_6; -			else -				val |= WM_MISC_DATA_PARTITION_5_6; -			intel_uncore_write(&dev_priv->uncore, WM_MISC, val); -		} else { -			val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL2); -			if (results->partitioning == INTEL_DDB_PART_1_2) -				val &= ~DISP_DATA_PARTITION_5_6; -			else -				val |= DISP_DATA_PARTITION_5_6; -			intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL2, val); -		} -	} - -	if (dirty & WM_DIRTY_FBC) { -		val = intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL); -		if (results->enable_fbc_wm) -			val &= ~DISP_FBC_WM_DIS; +		if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) +			intel_uncore_rmw(&dev_priv->uncore, WM_MISC, WM_MISC_DATA_PARTITION_5_6, +					 results->partitioning == INTEL_DDB_PART_1_2 ? 0 : +					 WM_MISC_DATA_PARTITION_5_6);  		else -			val |= DISP_FBC_WM_DIS; -		intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, val); +			intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL2, DISP_DATA_PARTITION_5_6, +					 results->partitioning == INTEL_DDB_PART_1_2 ? 0 : +					 DISP_DATA_PARTITION_5_6);  	} +	if (dirty & WM_DIRTY_FBC) +		intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, DISP_FBC_WM_DIS, +				 results->enable_fbc_wm ? 0 : DISP_FBC_WM_DIS); +  	if (dirty & WM_DIRTY_LP(1) &&  	    previous->wm_lp_spr[0] != results->wm_lp_spr[0])  		intel_uncore_write(&dev_priv->uncore, WM1S_LP_ILK, results->wm_lp_spr[0]); @@ -3824,6 +3819,8 @@ void g4x_wm_get_hw_state(struct drm_i915_private *dev_priv)  					     plane_id, USHRT_MAX);  		g4x_raw_fbc_wm_set(crtc_state, level, USHRT_MAX); +		g4x_invalidate_wms(crtc, active, level); +  		crtc_state->wm.g4x.optimal = *active;  		crtc_state->wm.g4x.intermediate = *active; @@ -3860,37 +3857,30 @@ void g4x_wm_sanitize(struct drm_i915_private *dev_priv)  			to_intel_crtc_state(crtc->base.state);  		struct intel_plane_state *plane_state =  			to_intel_plane_state(plane->base.state); -		struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal;  		enum plane_id plane_id = plane->id; -		int level; +		int level, num_levels = intel_wm_num_levels(dev_priv);  		if (plane_state->uapi.visible)  			continue; -		for (level = 0; level < 3; level++) { +		for (level = 0; level < num_levels; level++) {  			struct g4x_pipe_wm *raw =  				&crtc_state->wm.g4x.raw[level];  			raw->plane[plane_id] = 0; -			wm_state->wm.plane[plane_id] = 0; -		} -		if (plane_id == PLANE_PRIMARY) { -			for (level = 0; level < 3; level++) { -				struct g4x_pipe_wm *raw = -					&crtc_state->wm.g4x.raw[level]; +			if (plane_id == PLANE_PRIMARY)  				raw->fbc = 0; -			} - -			wm_state->sr.fbc = 0; -			wm_state->hpll.fbc = 0; -			wm_state->fbc_en = false;  		}  	}  	for_each_intel_crtc(&dev_priv->drm, crtc) {  		struct intel_crtc_state *crtc_state =  			to_intel_crtc_state(crtc->base.state); +		int ret; + +		ret = _g4x_compute_pipe_wm(crtc_state); +		drm_WARN_ON(&dev_priv->drm, ret);  		crtc_state->wm.g4x.intermediate =  			crtc_state->wm.g4x.optimal; @@ -4016,30 +4006,27 @@ void vlv_wm_sanitize(struct drm_i915_private *dev_priv)  			to_intel_crtc_state(crtc->base.state);  		struct intel_plane_state *plane_state =  			to_intel_plane_state(plane->base.state); -		struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal; -		const struct vlv_fifo_state *fifo_state = -			&crtc_state->wm.vlv.fifo_state;  		enum plane_id plane_id = plane->id; -		int level; +		int level, num_levels = intel_wm_num_levels(dev_priv);  		if (plane_state->uapi.visible)  			continue; -		for (level = 0; level < wm_state->num_levels; level++) { +		for (level = 0; level < num_levels; level++) {  			struct g4x_pipe_wm *raw =  				&crtc_state->wm.vlv.raw[level];  			raw->plane[plane_id] = 0; - -			wm_state->wm[level].plane[plane_id] = -				vlv_invert_wm_value(raw->plane[plane_id], -						    fifo_state->plane[plane_id]);  		}  	}  	for_each_intel_crtc(&dev_priv->drm, crtc) {  		struct intel_crtc_state *crtc_state =  			to_intel_crtc_state(crtc->base.state); +		int ret; + +		ret = _vlv_compute_pipe_wm(crtc_state); +		drm_WARN_ON(&dev_priv->drm, ret);  		crtc_state->wm.vlv.intermediate =  			crtc_state->wm.vlv.optimal; @@ -4057,9 +4044,9 @@ void vlv_wm_sanitize(struct drm_i915_private *dev_priv)   */  static void ilk_init_lp_watermarks(struct drm_i915_private *dev_priv)  { -	intel_uncore_write(&dev_priv->uncore, WM3_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM3_LP_ILK) & ~WM_LP_ENABLE); -	intel_uncore_write(&dev_priv->uncore, WM2_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM2_LP_ILK) & ~WM_LP_ENABLE); -	intel_uncore_write(&dev_priv->uncore, WM1_LP_ILK, intel_uncore_read(&dev_priv->uncore, WM1_LP_ILK) & ~WM_LP_ENABLE); +	intel_uncore_rmw(&dev_priv->uncore, WM3_LP_ILK, WM_LP_ENABLE, 0); +	intel_uncore_rmw(&dev_priv->uncore, WM2_LP_ILK, WM_LP_ENABLE, 0); +	intel_uncore_rmw(&dev_priv->uncore, WM1_LP_ILK, WM_LP_ENABLE, 0);  	/*  	 * Don't touch WM_LP_SPRITE_ENABLE here. @@ -4113,11 +4100,9 @@ static void g4x_disable_trickle_feed(struct drm_i915_private *dev_priv)  	enum pipe pipe;  	for_each_pipe(dev_priv, pipe) { -		intel_uncore_write(&dev_priv->uncore, DSPCNTR(pipe), -			   intel_uncore_read(&dev_priv->uncore, DSPCNTR(pipe)) | -			   DISP_TRICKLE_FEED_DISABLE); +		intel_uncore_rmw(&dev_priv->uncore, DSPCNTR(pipe), 0, DISP_TRICKLE_FEED_DISABLE); -		intel_uncore_write(&dev_priv->uncore, DSPSURF(pipe), intel_uncore_read(&dev_priv->uncore, DSPSURF(pipe))); +		intel_uncore_rmw(&dev_priv->uncore, DSPSURF(pipe), 0, 0);  		intel_uncore_posting_read(&dev_priv->uncore, DSPSURF(pipe));  	}  } @@ -4164,19 +4149,13 @@ static void ilk_init_clock_gating(struct drm_i915_private *dev_priv)  	 */  	if (IS_IRONLAKE_M(dev_priv)) {  		/* WaFbcAsynchFlipDisableFbcQueue:ilk */ -		intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, -			   intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) | -			   ILK_FBCQ_DIS); -		intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, -			   intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | -			   ILK_DPARB_GATE); +		intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 0, ILK_FBCQ_DIS); +		intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 0, ILK_DPARB_GATE);  	}  	intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate); -	intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, -		   intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | -		   ILK_ELPIN_409_SELECT); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 0, ILK_ELPIN_409_SELECT);  	g4x_disable_trickle_feed(dev_priv); @@ -4196,8 +4175,7 @@ static void cpt_init_clock_gating(struct drm_i915_private *dev_priv)  	intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE |  		   PCH_DPLUNIT_CLOCK_GATE_DISABLE |  		   PCH_CPUNIT_CLOCK_GATE_DISABLE); -	intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN2, intel_uncore_read(&dev_priv->uncore, SOUTH_CHICKEN2) | -		   DPLS_EDP_PPS_FIX_DIS); +	intel_uncore_rmw(&dev_priv->uncore, SOUTH_CHICKEN2, 0, DPLS_EDP_PPS_FIX_DIS);  	/* The below fixes the weird display corruption, a few pixels shifted  	 * downward, on (only) LVDS of some HP laptops with IVY.  	 */ @@ -4235,9 +4213,7 @@ static void gen6_init_clock_gating(struct drm_i915_private *dev_priv)  	intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, dspclk_gate); -	intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, -		   intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2) | -		   ILK_ELPIN_409_SELECT); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN2, 0, ILK_ELPIN_409_SELECT);  	intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1,  		   intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | @@ -4297,14 +4273,12 @@ static void lpt_init_clock_gating(struct drm_i915_private *dev_priv)  	 * disabled when not needed anymore in order to save power.  	 */  	if (HAS_PCH_LPT_LP(dev_priv)) -		intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, -			   intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) | -			   PCH_LP_PARTITION_LEVEL_DISABLE); +		intel_uncore_rmw(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, +				 0, PCH_LP_PARTITION_LEVEL_DISABLE);  	/* WADPOClockGatingDisable:hsw */ -	intel_uncore_write(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A), -		   intel_uncore_read(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A)) | -		   TRANS_CHICKEN1_DP0UNIT_GC_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, TRANS_CHICKEN1(PIPE_A), +			 0, TRANS_CHICKEN1_DP0UNIT_GC_DISABLE);  }  static void lpt_suspend_hw(struct drm_i915_private *dev_priv) @@ -4325,22 +4299,22 @@ static void gen8_set_l3sqc_credits(struct drm_i915_private *dev_priv,  	u32 val;  	/* WaTempDisableDOPClkGating:bdw */ -	misccpctl = intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL); -	intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); +	misccpctl = intel_gt_mcr_multicast_rmw(to_gt(dev_priv), GEN8_MISCCPCTL, +					       GEN8_DOP_CLOCK_GATE_ENABLE, 0); -	val = intel_uncore_read(&dev_priv->uncore, GEN8_L3SQCREG1); +	val = intel_gt_mcr_read_any(to_gt(dev_priv), GEN8_L3SQCREG1);  	val &= ~L3_PRIO_CREDITS_MASK;  	val |= L3_GENERAL_PRIO_CREDITS(general_prio_credits);  	val |= L3_HIGH_PRIO_CREDITS(high_prio_credits); -	intel_uncore_write(&dev_priv->uncore, GEN8_L3SQCREG1, val); +	intel_gt_mcr_multicast_write(to_gt(dev_priv), GEN8_L3SQCREG1, val);  	/*  	 * Wait at least 100 clocks before re-enabling clock gating.  	 * See the definition of L3SQCREG1 in BSpec.  	 */ -	intel_uncore_posting_read(&dev_priv->uncore, GEN8_L3SQCREG1); +	intel_gt_mcr_read_any(to_gt(dev_priv), GEN8_L3SQCREG1);  	udelay(1); -	intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, misccpctl); +	intel_gt_mcr_multicast_write(to_gt(dev_priv), GEN8_MISCCPCTL, misccpctl);  }  static void icl_init_clock_gating(struct drm_i915_private *dev_priv) @@ -4363,8 +4337,7 @@ static void gen12lp_init_clock_gating(struct drm_i915_private *dev_priv)  	/* Wa_1409825376:tgl (pre-prod)*/  	if (IS_TGL_DISPLAY_STEP(dev_priv, STEP_A0, STEP_C0)) -		intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) | -			   TGL_VRH_GATING_DIS); +		intel_uncore_rmw(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, 0, TGL_VRH_GATING_DIS);  	/* Wa_14013723622:tgl,rkl,dg1,adl-s */  	if (DISPLAY_VER(dev_priv) == 12) @@ -4389,8 +4362,7 @@ static void dg1_init_clock_gating(struct drm_i915_private *dev_priv)  	/* Wa_1409836686:dg1[a0] */  	if (IS_DG1_GRAPHICS_STEP(dev_priv, STEP_A0, STEP_B0)) -		intel_uncore_write(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, intel_uncore_read(&dev_priv->uncore, GEN9_CLKGATE_DIS_3) | -			   DPT_GATING_DIS); +		intel_uncore_rmw(&dev_priv->uncore, GEN9_CLKGATE_DIS_3, 0, DPT_GATING_DIS);  }  static void xehpsdv_init_clock_gating(struct drm_i915_private *dev_priv) @@ -4432,8 +4404,7 @@ static void cnp_init_clock_gating(struct drm_i915_private *dev_priv)  		return;  	/* Display WA #1181 WaSouthDisplayDisablePWMCGEGating: cnp */ -	intel_uncore_write(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, intel_uncore_read(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D) | -		   CNP_PWM_CGE_GATING_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, SOUTH_DSPCLK_GATE_D, 0, CNP_PWM_CGE_GATING_DISABLE);  }  static void cfl_init_clock_gating(struct drm_i915_private *dev_priv) @@ -4442,23 +4413,20 @@ static void cfl_init_clock_gating(struct drm_i915_private *dev_priv)  	gen9_init_clock_gating(dev_priv);  	/* WAC6entrylatency:cfl */ -	intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) | -		   FBC_LLC_FULLY_OPEN); +	intel_uncore_rmw(&dev_priv->uncore, FBC_LLC_READ_CTRL, 0, FBC_LLC_FULLY_OPEN);  	/*  	 * WaFbcTurnOffFbcWatermark:cfl  	 * Display WA #0562: cfl  	 */ -	intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | -		   DISP_FBC_WM_DIS); +	intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);  	/*  	 * WaFbcNukeOnHostModify:cfl  	 * Display WA #0873: cfl  	 */ -	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), -			   intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) | -			   DPFC_NUKE_ON_ANY_MODIFICATION); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), +			 0, DPFC_NUKE_ON_ANY_MODIFICATION);  }  static void kbl_init_clock_gating(struct drm_i915_private *dev_priv) @@ -4466,33 +4434,30 @@ static void kbl_init_clock_gating(struct drm_i915_private *dev_priv)  	gen9_init_clock_gating(dev_priv);  	/* WAC6entrylatency:kbl */ -	intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) | -		   FBC_LLC_FULLY_OPEN); +	intel_uncore_rmw(&dev_priv->uncore, FBC_LLC_READ_CTRL, 0, FBC_LLC_FULLY_OPEN);  	/* WaDisableSDEUnitClockGating:kbl */  	if (IS_KBL_GRAPHICS_STEP(dev_priv, 0, STEP_C0)) -		intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | -			   GEN8_SDEUNIT_CLOCK_GATE_DISABLE); +		intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, +				 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);  	/* WaDisableGamClockGating:kbl */  	if (IS_KBL_GRAPHICS_STEP(dev_priv, 0, STEP_C0)) -		intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | -			   GEN6_GAMUNIT_CLOCK_GATE_DISABLE); +		intel_uncore_rmw(&dev_priv->uncore, GEN6_UCGCTL1, +				 0, GEN6_GAMUNIT_CLOCK_GATE_DISABLE);  	/*  	 * WaFbcTurnOffFbcWatermark:kbl  	 * Display WA #0562: kbl  	 */ -	intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | -		   DISP_FBC_WM_DIS); +	intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);  	/*  	 * WaFbcNukeOnHostModify:kbl  	 * Display WA #0873: kbl  	 */ -	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), -			   intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) | -			   DPFC_NUKE_ON_ANY_MODIFICATION); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), +			 0, DPFC_NUKE_ON_ANY_MODIFICATION);  }  static void skl_init_clock_gating(struct drm_i915_private *dev_priv) @@ -4500,35 +4465,30 @@ static void skl_init_clock_gating(struct drm_i915_private *dev_priv)  	gen9_init_clock_gating(dev_priv);  	/* WaDisableDopClockGating:skl */ -	intel_uncore_write(&dev_priv->uncore, GEN7_MISCCPCTL, intel_uncore_read(&dev_priv->uncore, GEN7_MISCCPCTL) & -		   ~GEN7_DOP_CLOCK_GATE_ENABLE); +	intel_gt_mcr_multicast_rmw(to_gt(dev_priv), GEN8_MISCCPCTL, +				   GEN8_DOP_CLOCK_GATE_ENABLE, 0);  	/* WAC6entrylatency:skl */ -	intel_uncore_write(&dev_priv->uncore, FBC_LLC_READ_CTRL, intel_uncore_read(&dev_priv->uncore, FBC_LLC_READ_CTRL) | -		   FBC_LLC_FULLY_OPEN); +	intel_uncore_rmw(&dev_priv->uncore, FBC_LLC_READ_CTRL, 0, FBC_LLC_FULLY_OPEN);  	/*  	 * WaFbcTurnOffFbcWatermark:skl  	 * Display WA #0562: skl  	 */ -	intel_uncore_write(&dev_priv->uncore, DISP_ARB_CTL, intel_uncore_read(&dev_priv->uncore, DISP_ARB_CTL) | -		   DISP_FBC_WM_DIS); +	intel_uncore_rmw(&dev_priv->uncore, DISP_ARB_CTL, 0, DISP_FBC_WM_DIS);  	/*  	 * WaFbcNukeOnHostModify:skl  	 * Display WA #0873: skl  	 */ -	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), -			   intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) | -			   DPFC_NUKE_ON_ANY_MODIFICATION); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), +			 0, DPFC_NUKE_ON_ANY_MODIFICATION);  	/*  	 * WaFbcHighMemBwCorruptionAvoidance:skl  	 * Display WA #0883: skl  	 */ -	intel_uncore_write(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), -			   intel_uncore_read(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A)) | -			   DPFC_DISABLE_DUMMY0); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DPFC_CHICKEN(INTEL_FBC_A), 0, DPFC_DISABLE_DUMMY0);  }  static void bdw_init_clock_gating(struct drm_i915_private *dev_priv) @@ -4536,43 +4496,37 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)  	enum pipe pipe;  	/* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */ -	intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), -		   intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) | -		   HSW_FBCQ_DIS); +	intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), 0, HSW_FBCQ_DIS);  	/* WaSwitchSolVfFArbitrationPriority:bdw */ -	intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); +	intel_uncore_rmw(&dev_priv->uncore, GAM_ECOCHK, 0, HSW_ECOCHK_ARB_PRIO_SOL);  	/* WaPsrDPAMaskVBlankInSRD:bdw */ -	intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR1_1, -		   intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD); +	intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR1_1, 0, DPA_MASK_VBLANK_SRD);  	for_each_pipe(dev_priv, pipe) {  		/* WaPsrDPRSUnmaskVBlankInSRD:bdw */ -		intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe), -			   intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe)) | -			   BDW_DPRS_MASK_VBLANK_SRD); +		intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(pipe), +				 0, BDW_DPRS_MASK_VBLANK_SRD);  	}  	/* WaVSRefCountFullforceMissDisable:bdw */  	/* WaDSRefCountFullforceMissDisable:bdw */ -	intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE, -		   intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) & -		   ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME)); +	intel_uncore_rmw(&dev_priv->uncore, GEN7_FF_THREAD_MODE, +			 GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME, 0);  	intel_uncore_write(&dev_priv->uncore, RING_PSMI_CTL(RENDER_RING_BASE),  		   _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));  	/* WaDisableSDEUnitClockGating:bdw */ -	intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | -		   GEN8_SDEUNIT_CLOCK_GATE_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);  	/* WaProgramL3SqcReg1Default:bdw */  	gen8_set_l3sqc_credits(dev_priv, 30, 2);  	/* WaKVMNotificationOnConfigChange:bdw */ -	intel_uncore_write(&dev_priv->uncore, CHICKEN_PAR2_1, intel_uncore_read(&dev_priv->uncore, CHICKEN_PAR2_1) -		   | KVM_CONFIG_CHANGE_NOTIFICATION_SELECT); +	intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PAR2_1, +			 0, KVM_CONFIG_CHANGE_NOTIFICATION_SELECT);  	lpt_init_clock_gating(dev_priv); @@ -4581,38 +4535,30 @@ static void bdw_init_clock_gating(struct drm_i915_private *dev_priv)  	 * Also see the CHICKEN2 write in bdw_init_workarounds() to disable DOP  	 * clock gating.  	 */ -	intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, -		   intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, GEN6_UCGCTL1, 0, GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE);  }  static void hsw_init_clock_gating(struct drm_i915_private *dev_priv)  {  	/* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */ -	intel_uncore_write(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), -		   intel_uncore_read(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A)) | -		   HSW_FBCQ_DIS); +	intel_uncore_rmw(&dev_priv->uncore, CHICKEN_PIPESL_1(PIPE_A), 0, HSW_FBCQ_DIS);  	/* This is required by WaCatErrorRejectionIssue:hsw */ -	intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, -		   intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | -		   GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); +	intel_uncore_rmw(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, +			 0, GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);  	/* WaSwitchSolVfFArbitrationPriority:hsw */ -	intel_uncore_write(&dev_priv->uncore, GAM_ECOCHK, intel_uncore_read(&dev_priv->uncore, GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); +	intel_uncore_rmw(&dev_priv->uncore, GAM_ECOCHK, 0, HSW_ECOCHK_ARB_PRIO_SOL);  	lpt_init_clock_gating(dev_priv);  }  static void ivb_init_clock_gating(struct drm_i915_private *dev_priv)  { -	u32 snpcr; -  	intel_uncore_write(&dev_priv->uncore, ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);  	/* WaFbcAsynchFlipDisableFbcQueue:ivb */ -	intel_uncore_write(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, -		   intel_uncore_read(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1) | -		   ILK_FBCQ_DIS); +	intel_uncore_rmw(&dev_priv->uncore, ILK_DISPLAY_CHICKEN1, 0, ILK_FBCQ_DIS);  	/* WaDisableBackToBackFlipFix:ivb */  	intel_uncore_write(&dev_priv->uncore, IVB_CHICKEN3, @@ -4638,16 +4584,13 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv)  		   GEN6_RCZUNIT_CLOCK_GATE_DISABLE);  	/* This is required by WaCatErrorRejectionIssue:ivb */ -	intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, -			intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | -			GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); +	intel_uncore_rmw(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, +			 0, GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);  	g4x_disable_trickle_feed(dev_priv); -	snpcr = intel_uncore_read(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR); -	snpcr &= ~GEN6_MBC_SNPCR_MASK; -	snpcr |= GEN6_MBC_SNPCR_MED; -	intel_uncore_write(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR, snpcr); +	intel_uncore_rmw(&dev_priv->uncore, GEN6_MBCUNIT_SNPCR, GEN6_MBC_SNPCR_MASK, +			 GEN6_MBC_SNPCR_MED);  	if (!HAS_PCH_NOP(dev_priv))  		cpt_init_clock_gating(dev_priv); @@ -4667,9 +4610,8 @@ static void vlv_init_clock_gating(struct drm_i915_private *dev_priv)  		   _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));  	/* This is required by WaCatErrorRejectionIssue:vlv */ -	intel_uncore_write(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, -		   intel_uncore_read(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | -		   GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); +	intel_uncore_rmw(&dev_priv->uncore, GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, +			 0, GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB);  	/*  	 * According to the spec, bit 13 (RCZUNIT) must be set on IVB. @@ -4681,8 +4623,7 @@ static void vlv_init_clock_gating(struct drm_i915_private *dev_priv)  	/* WaDisableL3Bank2xClockGate:vlv  	 * Disabling L3 clock gating- MMIO 940c[25] = 1  	 * Set bit 25, to disable L3_BANK_2x_CLK_GATING */ -	intel_uncore_write(&dev_priv->uncore, GEN7_UCGCTL4, -		   intel_uncore_read(&dev_priv->uncore, GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, GEN7_UCGCTL4, 0, GEN7_L3BANK2X_CLOCK_GATE_DISABLE);  	/*  	 * WaDisableVLVClockGating_VBIIssue:vlv @@ -4696,21 +4637,18 @@ static void chv_init_clock_gating(struct drm_i915_private *dev_priv)  {  	/* WaVSRefCountFullforceMissDisable:chv */  	/* WaDSRefCountFullforceMissDisable:chv */ -	intel_uncore_write(&dev_priv->uncore, GEN7_FF_THREAD_MODE, -		   intel_uncore_read(&dev_priv->uncore, GEN7_FF_THREAD_MODE) & -		   ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME)); +	intel_uncore_rmw(&dev_priv->uncore, GEN7_FF_THREAD_MODE, +			 GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME, 0);  	/* WaDisableSemaphoreAndSyncFlipWait:chv */  	intel_uncore_write(&dev_priv->uncore, RING_PSMI_CTL(RENDER_RING_BASE),  		   _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE));  	/* WaDisableCSUnitClockGating:chv */ -	intel_uncore_write(&dev_priv->uncore, GEN6_UCGCTL1, intel_uncore_read(&dev_priv->uncore, GEN6_UCGCTL1) | -		   GEN6_CSUNIT_CLOCK_GATE_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, GEN6_UCGCTL1, 0, GEN6_CSUNIT_CLOCK_GATE_DISABLE);  	/* WaDisableSDEUnitClockGating:chv */ -	intel_uncore_write(&dev_priv->uncore, GEN8_UCGCTL6, intel_uncore_read(&dev_priv->uncore, GEN8_UCGCTL6) | -		   GEN8_SDEUNIT_CLOCK_GATE_DISABLE); +	intel_uncore_rmw(&dev_priv->uncore, GEN8_UCGCTL6, 0, GEN8_SDEUNIT_CLOCK_GATE_DISABLE);  	/*  	 * WaProgramL3SqcReg1Default:chv |