On Thu, Oct 06, 2022 at 06:32:00PM +0200, Andrzej Hajda wrote: > There is special helper for register read/modify/write. > > Signed-off-by: Andrzej Hajda <andrzej.hajda@xxxxxxxxx> > Reviewed-by: Andi Shyti <andi.shyti@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_tc.c | 9 +- > drivers/gpu/drm/i915/i915_irq.c | 227 +++++++++--------------- > drivers/gpu/drm/i915/intel_pm.c | 60 ++----- > drivers/gpu/drm/i915/vlv_suspend.c | 28 +-- > 4 files changed, 112 insertions(+), 212 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c > index b0aa1edd830289..8cecd41ed00338 100644 > --- a/drivers/gpu/drm/i915/display/intel_tc.c > +++ b/drivers/gpu/drm/i915/display/intel_tc.c > @@ -408,14 +408,9 @@ static bool adl_tc_phy_take_ownership(struct intel_digital_port *dig_port, > struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); > struct intel_uncore *uncore = &i915->uncore; > enum port port = dig_port->base.port; > - u32 val; > > - val = intel_uncore_read(uncore, DDI_BUF_CTL(port)); > - if (take) > - val |= DDI_BUF_CTL_TC_PHY_OWNERSHIP; > - else > - val &= ~DDI_BUF_CTL_TC_PHY_OWNERSHIP; > - intel_uncore_write(uncore, DDI_BUF_CTL(port), val); > + intel_uncore_rmw(uncore, DDI_BUF_CTL(port), DDI_BUF_CTL_TC_PHY_OWNERSHIP, > + take ? DDI_BUF_CTL_TC_PHY_OWNERSHIP : 0); > > return true; > } > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > index 6cbdefadd09180..c08d092cdccafe 100644 > --- a/drivers/gpu/drm/i915/i915_irq.c > +++ b/drivers/gpu/drm/i915/i915_irq.c > @@ -325,15 +325,10 @@ i915_hotplug_interrupt_update_locked(struct drm_i915_private *dev_priv, > u32 mask, > u32 bits) > { > - u32 val; > - > lockdep_assert_held(&dev_priv->irq_lock); > drm_WARN_ON(&dev_priv->drm, bits & ~mask); > > - val = intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_EN); > - val &= ~mask; > - val |= bits; > - intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_EN, val); > + intel_uncore_rmw(&dev_priv->uncore, PORT_HOTPLUG_EN, mask, bits); > } > > /** > @@ -1057,8 +1052,8 @@ static void ivb_parity_work(struct work_struct *work) > if (drm_WARN_ON(&dev_priv->drm, !dev_priv->l3_parity.which_slice)) > goto out; > > - 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_uncore_rmw(&dev_priv->uncore, GEN7_MISCCPCTL, ~GEN7_DOP_CLOCK_GATE_ENABLE, > + 0); This doesn't look like the right transformation. The original code was clearing the GEN7_DOP_CLOCK_GATE_ENABLE bit and leaving all other bits the way they were. The new code is clearing all of the bits *except* GEN7_DOP_CLOCK_GATE_ENABLE. I think you need to drop the ~ here. > intel_uncore_posting_read(&dev_priv->uncore, GEN7_MISCCPCTL); > > while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) { > @@ -1689,8 +1684,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg) > * bits this time around. > */ > intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, 0); > - ier = intel_uncore_read(&dev_priv->uncore, VLV_IER); > - intel_uncore_write(&dev_priv->uncore, VLV_IER, 0); > + ier = intel_uncore_rmw(&dev_priv->uncore, VLV_IER, ~0, 0); I'm not sure there's really benefit to the interrupt handlers like this one...the original code is doing a read, followed by a write to clear the register. There's no (m)odify step there, so converting this to a rmw makes it harder to read and understand what's going on. If you really want to cut out the extra line of code, it would be better to create a 'read and clear' wrapper function for use in the interrupt handlers so it's at least more intuitive what's happening. > > if (gt_iir) > intel_uncore_write(&dev_priv->uncore, GTIIR, gt_iir); > @@ -1775,8 +1769,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) > * bits this time around. > */ > intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, 0); > - ier = intel_uncore_read(&dev_priv->uncore, VLV_IER); > - intel_uncore_write(&dev_priv->uncore, VLV_IER, 0); > + ier = intel_uncore_rmw(&dev_priv->uncore, VLV_IER, ~0, 0); > > gen8_gt_irq_handler(to_gt(dev_priv), master_ctl); > > @@ -1981,8 +1974,7 @@ static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) > if (ddi_hotplug_trigger) { > u32 dig_hotplug_reg; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_DDI); > - intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_DDI, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_DDI, 0, 0); Similarly, a wrapper function for 'read and w1c' would make these a lot less confusing. Matt > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > ddi_hotplug_trigger, dig_hotplug_reg, > @@ -1993,8 +1985,7 @@ static void icp_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) > if (tc_hotplug_trigger) { > u32 dig_hotplug_reg; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_TC); > - intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_TC, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_TC, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > tc_hotplug_trigger, dig_hotplug_reg, > @@ -2019,8 +2010,7 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) > if (hotplug_trigger) { > u32 dig_hotplug_reg; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > hotplug_trigger, dig_hotplug_reg, > @@ -2031,8 +2021,7 @@ static void spt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir) > if (hotplug2_trigger) { > u32 dig_hotplug_reg; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG2); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG2, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG2, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > hotplug2_trigger, dig_hotplug_reg, > @@ -2052,8 +2041,7 @@ static void ilk_hpd_irq_handler(struct drm_i915_private *dev_priv, > { > u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL); > - intel_uncore_write(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > hotplug_trigger, dig_hotplug_reg, > @@ -2232,8 +2220,7 @@ static void bxt_hpd_irq_handler(struct drm_i915_private *dev_priv, > { > u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > hotplug_trigger, dig_hotplug_reg, > @@ -2252,8 +2239,7 @@ static void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir) > if (trigger_tc) { > u32 dig_hotplug_reg; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL); > - intel_uncore_write(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > trigger_tc, dig_hotplug_reg, > @@ -2264,8 +2250,7 @@ static void gen11_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 iir) > if (trigger_tbt) { > u32 dig_hotplug_reg; > > - dig_hotplug_reg = intel_uncore_read(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL); > - intel_uncore_write(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, dig_hotplug_reg); > + dig_hotplug_reg = intel_uncore_rmw(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, 0, 0); > > intel_get_hpd_pins(dev_priv, &pin_mask, &long_mask, > trigger_tbt, dig_hotplug_reg, > @@ -2355,8 +2340,7 @@ gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir) > else > iir_reg = EDP_PSR_IIR; > > - psr_iir = intel_uncore_read(&dev_priv->uncore, iir_reg); > - intel_uncore_write(&dev_priv->uncore, iir_reg, psr_iir); > + psr_iir = intel_uncore_rmw(&dev_priv->uncore, iir_reg, 0, 0); > > if (psr_iir) > found = true; > @@ -2426,8 +2410,7 @@ static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv, > > /* clear TE in dsi IIR */ > port = (te_trigger & DSI1_TE) ? PORT_B : PORT_A; > - tmp = intel_uncore_read(&dev_priv->uncore, DSI_INTR_IDENT_REG(port)); > - intel_uncore_write(&dev_priv->uncore, DSI_INTR_IDENT_REG(port), tmp); > + tmp = intel_uncore_rmw(&dev_priv->uncore, DSI_INTR_IDENT_REG(port), 0, 0); > } > > static u32 gen8_de_pipe_flip_done_mask(struct drm_i915_private *i915) > @@ -2884,7 +2867,6 @@ static bool gen11_dsi_configure_te(struct intel_crtc *intel_crtc, > { > struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); > enum port port; > - u32 tmp; > > if (!(intel_crtc->mode_flags & > (I915_MODE_FLAG_DSI_USE_TE1 | I915_MODE_FLAG_DSI_USE_TE0))) > @@ -2896,16 +2878,10 @@ static bool gen11_dsi_configure_te(struct intel_crtc *intel_crtc, > else > port = PORT_A; > > - tmp = intel_uncore_read(&dev_priv->uncore, DSI_INTR_MASK_REG(port)); > - if (enable) > - tmp &= ~DSI_TE_EVENT; > - else > - tmp |= DSI_TE_EVENT; > - > - intel_uncore_write(&dev_priv->uncore, DSI_INTR_MASK_REG(port), tmp); > + intel_uncore_rmw(&dev_priv->uncore, DSI_INTR_MASK_REG(port), DSI_TE_EVENT, > + enable ? 0 : DSI_TE_EVENT); > > - tmp = intel_uncore_read(&dev_priv->uncore, DSI_INTR_IDENT_REG(port)); > - intel_uncore_write(&dev_priv->uncore, DSI_INTR_IDENT_REG(port), tmp); > + intel_uncore_rmw(&dev_priv->uncore, DSI_INTR_IDENT_REG(port), 0, 0); > > return true; > } > @@ -3020,7 +2996,7 @@ static void vlv_display_irq_reset(struct drm_i915_private *dev_priv) > intel_uncore_write(uncore, DPINVGTT, DPINVGTT_STATUS_MASK_VLV); > > i915_hotplug_interrupt_update_locked(dev_priv, 0xffffffff, 0); > - intel_uncore_write(uncore, PORT_HOTPLUG_STAT, intel_uncore_read(uncore, PORT_HOTPLUG_STAT)); > + intel_uncore_rmw(uncore, PORT_HOTPLUG_STAT, 0, 0); > > i9xx_pipestat_irq_reset(dev_priv); > > @@ -3290,23 +3266,20 @@ static u32 ibx_hotplug_enables(struct drm_i915_private *i915, > > static void ibx_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > /* > * Enable digital hotplug on the PCH, and configure the DP short pulse > * duration to 2ms (which is the minimum in the Display Port spec). > * The pulse duration bits are reserved on LPT+. > */ > - hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG); > - hotplug &= ~(PORTA_HOTPLUG_ENABLE | > - PORTB_HOTPLUG_ENABLE | > - PORTC_HOTPLUG_ENABLE | > - PORTD_HOTPLUG_ENABLE | > - PORTB_PULSE_DURATION_MASK | > - PORTC_PULSE_DURATION_MASK | > - PORTD_PULSE_DURATION_MASK); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, ibx_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, > + PORTA_HOTPLUG_ENABLE | > + PORTB_HOTPLUG_ENABLE | > + PORTC_HOTPLUG_ENABLE | > + PORTD_HOTPLUG_ENABLE | > + PORTB_PULSE_DURATION_MASK | > + PORTC_PULSE_DURATION_MASK | > + PORTD_PULSE_DURATION_MASK, > + intel_hpd_hotplug_enables(dev_priv, ibx_hotplug_enables)); > } > > static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv) > @@ -3353,30 +3326,24 @@ static u32 icp_tc_hotplug_enables(struct drm_i915_private *i915, > > static void icp_ddi_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > - hotplug = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_DDI); > - hotplug &= ~(SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_A) | > - SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_B) | > - SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_C) | > - SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_D)); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, icp_ddi_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_DDI, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_DDI, > + SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_A) | > + SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_B) | > + SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_C) | > + SHOTPLUG_CTL_DDI_HPD_ENABLE(HPD_PORT_D), > + intel_hpd_hotplug_enables(dev_priv, icp_ddi_hotplug_enables)); > } > > static void icp_tc_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > - hotplug = intel_uncore_read(&dev_priv->uncore, SHOTPLUG_CTL_TC); > - hotplug &= ~(ICP_TC_HPD_ENABLE(HPD_PORT_TC1) | > - ICP_TC_HPD_ENABLE(HPD_PORT_TC2) | > - ICP_TC_HPD_ENABLE(HPD_PORT_TC3) | > - ICP_TC_HPD_ENABLE(HPD_PORT_TC4) | > - ICP_TC_HPD_ENABLE(HPD_PORT_TC5) | > - ICP_TC_HPD_ENABLE(HPD_PORT_TC6)); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, icp_tc_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, SHOTPLUG_CTL_TC, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, SHOTPLUG_CTL_TC, > + ICP_TC_HPD_ENABLE(HPD_PORT_TC1) | > + ICP_TC_HPD_ENABLE(HPD_PORT_TC2) | > + ICP_TC_HPD_ENABLE(HPD_PORT_TC3) | > + ICP_TC_HPD_ENABLE(HPD_PORT_TC4) | > + ICP_TC_HPD_ENABLE(HPD_PORT_TC5) | > + ICP_TC_HPD_ENABLE(HPD_PORT_TC6), > + intel_hpd_hotplug_enables(dev_priv, icp_tc_hotplug_enables)); > } > > static void icp_hpd_irq_setup(struct drm_i915_private *dev_priv) > @@ -3428,46 +3395,37 @@ static void dg1_hpd_irq_setup(struct drm_i915_private *dev_priv) > > static void gen11_tc_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > - hotplug = intel_uncore_read(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL); > - hotplug &= ~(GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC1) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC2) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC3) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC4) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC5) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC6)); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, GEN11_TC_HOTPLUG_CTL, > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC1) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC2) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC3) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC4) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC5) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC6), > + intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables)); > } > > static void gen11_tbt_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > - hotplug = intel_uncore_read(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL); > - hotplug &= ~(GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC1) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC2) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC3) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC4) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC5) | > - GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC6)); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, GEN11_TBT_HOTPLUG_CTL, > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC1) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC2) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC3) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC4) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC5) | > + GEN11_HOTPLUG_CTL_ENABLE(HPD_PORT_TC6), > + intel_hpd_hotplug_enables(dev_priv, gen11_hotplug_enables)); > } > > static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv) > { > u32 hotplug_irqs, enabled_irqs; > - u32 val; > > enabled_irqs = intel_hpd_enabled_irqs(dev_priv, dev_priv->display.hotplug.hpd); > hotplug_irqs = intel_hpd_hotplug_irqs(dev_priv, dev_priv->display.hotplug.hpd); > > - val = intel_uncore_read(&dev_priv->uncore, GEN11_DE_HPD_IMR); > - val &= ~hotplug_irqs; > - val |= ~enabled_irqs & hotplug_irqs; > - intel_uncore_write(&dev_priv->uncore, GEN11_DE_HPD_IMR, val); > + intel_uncore_rmw(&dev_priv->uncore, GEN11_DE_HPD_IMR, hotplug_irqs, > + ~enabled_irqs & hotplug_irqs); > intel_uncore_posting_read(&dev_priv->uncore, GEN11_DE_HPD_IMR); > > gen11_tc_hpd_detection_setup(dev_priv); > @@ -3507,29 +3465,22 @@ static u32 spt_hotplug2_enables(struct drm_i915_private *i915, > > static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 val, hotplug; > - > /* Display WA #1179 WaHardHangonHotPlug: cnp */ > if (HAS_PCH_CNP(dev_priv)) { > - val = intel_uncore_read(&dev_priv->uncore, SOUTH_CHICKEN1); > - val &= ~CHASSIS_CLK_REQ_DURATION_MASK; > - val |= CHASSIS_CLK_REQ_DURATION(0xf); > - intel_uncore_write(&dev_priv->uncore, SOUTH_CHICKEN1, val); > + intel_uncore_rmw(&dev_priv->uncore, SOUTH_CHICKEN1, CHASSIS_CLK_REQ_DURATION_MASK, > + CHASSIS_CLK_REQ_DURATION(0xf)); > } > > /* Enable digital hotplug on the PCH */ > - hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG); > - hotplug &= ~(PORTA_HOTPLUG_ENABLE | > - PORTB_HOTPLUG_ENABLE | > - PORTC_HOTPLUG_ENABLE | > - PORTD_HOTPLUG_ENABLE); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, spt_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, > + PORTA_HOTPLUG_ENABLE | > + PORTB_HOTPLUG_ENABLE | > + PORTC_HOTPLUG_ENABLE | > + PORTD_HOTPLUG_ENABLE, > + intel_hpd_hotplug_enables(dev_priv, spt_hotplug_enables)); > > - hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG2); > - hotplug &= ~PORTE_HOTPLUG_ENABLE; > - hotplug |= intel_hpd_hotplug_enables(dev_priv, spt_hotplug2_enables); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG2, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG2, PORTE_HOTPLUG_ENABLE, > + intel_hpd_hotplug_enables(dev_priv, spt_hotplug2_enables)); > } > > static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) > @@ -3561,18 +3512,14 @@ static u32 ilk_hotplug_enables(struct drm_i915_private *i915, > > static void ilk_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > /* > * Enable digital hotplug on the CPU, and configure the DP short pulse > * duration to 2ms (which is the minimum in the Display Port spec) > * The pulse duration bits are reserved on HSW+. > */ > - hotplug = intel_uncore_read(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL); > - hotplug &= ~(DIGITAL_PORTA_HOTPLUG_ENABLE | > - DIGITAL_PORTA_PULSE_DURATION_MASK); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, ilk_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, DIGITAL_PORT_HOTPLUG_CNTRL, > + DIGITAL_PORTA_HOTPLUG_ENABLE | DIGITAL_PORTA_PULSE_DURATION_MASK, > + intel_hpd_hotplug_enables(dev_priv, ilk_hotplug_enables)); > } > > static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) > @@ -3620,17 +3567,12 @@ static u32 bxt_hotplug_enables(struct drm_i915_private *i915, > > static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv) > { > - u32 hotplug; > - > - hotplug = intel_uncore_read(&dev_priv->uncore, PCH_PORT_HOTPLUG); > - hotplug &= ~(PORTA_HOTPLUG_ENABLE | > - PORTB_HOTPLUG_ENABLE | > - PORTC_HOTPLUG_ENABLE | > - BXT_DDIA_HPD_INVERT | > - BXT_DDIB_HPD_INVERT | > - BXT_DDIC_HPD_INVERT); > - hotplug |= intel_hpd_hotplug_enables(dev_priv, bxt_hotplug_enables); > - intel_uncore_write(&dev_priv->uncore, PCH_PORT_HOTPLUG, hotplug); > + intel_uncore_rmw(&dev_priv->uncore, PCH_PORT_HOTPLUG, > + PORTA_HOTPLUG_ENABLE | > + PORTB_HOTPLUG_ENABLE | > + PORTC_HOTPLUG_ENABLE | > + BXT_DDI_HPD_INVERT_MASK, > + intel_hpd_hotplug_enables(dev_priv, bxt_hotplug_enables)); > } > > static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) > @@ -4010,9 +3952,7 @@ static void i9xx_error_irq_ack(struct drm_i915_private *dev_priv, > { > u32 emr; > > - *eir = intel_uncore_read(&dev_priv->uncore, EIR); > - > - intel_uncore_write(&dev_priv->uncore, EIR, *eir); > + *eir = intel_uncore_rmw(&dev_priv->uncore, EIR, 0, 0); > > *eir_stuck = intel_uncore_read(&dev_priv->uncore, EIR); > if (*eir_stuck == 0) > @@ -4028,8 +3968,7 @@ static void i9xx_error_irq_ack(struct drm_i915_private *dev_priv, > * (or by a GPU reset) so we mask any bit that > * remains set. > */ > - emr = intel_uncore_read(&dev_priv->uncore, EMR); > - intel_uncore_write(&dev_priv->uncore, EMR, 0xffffffff); > + emr = intel_uncore_rmw(&dev_priv->uncore, EMR, ~0, 0xffffffff); > intel_uncore_write(&dev_priv->uncore, EMR, emr | *eir_stuck); > } > > @@ -4096,7 +4035,7 @@ static void i915_irq_reset(struct drm_i915_private *dev_priv) > > if (I915_HAS_HOTPLUG(dev_priv)) { > i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0); > - intel_uncore_write(&dev_priv->uncore, PORT_HOTPLUG_STAT, intel_uncore_read(&dev_priv->uncore, PORT_HOTPLUG_STAT)); > + intel_uncore_rmw(&dev_priv->uncore, PORT_HOTPLUG_STAT, 0, 0); > } > > i9xx_pipestat_irq_reset(dev_priv); > @@ -4206,7 +4145,7 @@ static void i965_irq_reset(struct drm_i915_private *dev_priv) > struct intel_uncore *uncore = &dev_priv->uncore; > > i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0); > - intel_uncore_write(uncore, PORT_HOTPLUG_STAT, intel_uncore_read(uncore, PORT_HOTPLUG_STAT)); > + intel_uncore_rmw(uncore, PORT_HOTPLUG_STAT, 0, 0); > > i9xx_pipestat_irq_reset(dev_priv); > > diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c > index 2595ec5aeb77f6..9f6c58ad8bdb06 100644 > --- a/drivers/gpu/drm/i915/intel_pm.c > +++ b/drivers/gpu/drm/i915/intel_pm.c > @@ -895,19 +895,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, > @@ -3480,7 +3475,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) > @@ -3496,32 +3490,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]); > @@ -4131,7 +4113,7 @@ static void g4x_disable_trickle_feed(struct drm_i915_private *dev_priv) > intel_uncore_read(&dev_priv->uncore, DSPCNTR(pipe)) | > 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)); > } > } > @@ -4339,8 +4321,8 @@ 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_uncore_rmw(&dev_priv->uncore, GEN7_MISCCPCTL, ~GEN7_DOP_CLOCK_GATE_ENABLE, > + 0); > > val = intel_uncore_read(&dev_priv->uncore, GEN8_L3SQCREG1); > val &= ~L3_PRIO_CREDITS_MASK; > @@ -4619,8 +4601,6 @@ static void hsw_init_clock_gating(struct drm_i915_private *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 */ > @@ -4658,10 +4638,8 @@ static void ivb_init_clock_gating(struct drm_i915_private *dev_priv) > > 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); > diff --git a/drivers/gpu/drm/i915/vlv_suspend.c b/drivers/gpu/drm/i915/vlv_suspend.c > index 664fde244f59b0..02e63ed77f608d 100644 > --- a/drivers/gpu/drm/i915/vlv_suspend.c > +++ b/drivers/gpu/drm/i915/vlv_suspend.c > @@ -194,7 +194,6 @@ static void vlv_restore_gunit_s0ix_state(struct drm_i915_private *i915) > { > struct vlv_s0ix_state *s = i915->vlv_s0ix_state; > struct intel_uncore *uncore = &i915->uncore; > - u32 val; > int i; > > if (!s) > @@ -262,15 +261,11 @@ static void vlv_restore_gunit_s0ix_state(struct drm_i915_private *i915) > * be restored, as they are used to control the s0ix suspend/resume > * sequence by the caller. > */ > - val = intel_uncore_read(uncore, VLV_GTLC_WAKE_CTRL); > - val &= VLV_GTLC_ALLOWWAKEREQ; > - val |= s->gtlc_wake_ctrl & ~VLV_GTLC_ALLOWWAKEREQ; > - intel_uncore_write(uncore, VLV_GTLC_WAKE_CTRL, val); > + intel_uncore_rmw(uncore, VLV_GTLC_WAKE_CTRL, ~VLV_GTLC_ALLOWWAKEREQ, > + s->gtlc_wake_ctrl & ~VLV_GTLC_ALLOWWAKEREQ); > > - val = intel_uncore_read(uncore, VLV_GTLC_SURVIVABILITY_REG); > - val &= VLV_GFX_CLK_FORCE_ON_BIT; > - val |= s->gtlc_survive & ~VLV_GFX_CLK_FORCE_ON_BIT; > - intel_uncore_write(uncore, VLV_GTLC_SURVIVABILITY_REG, val); > + intel_uncore_rmw(uncore, VLV_GTLC_SURVIVABILITY_REG, ~VLV_GFX_CLK_FORCE_ON_BIT, > + s->gtlc_survive & ~VLV_GFX_CLK_FORCE_ON_BIT); > > intel_uncore_write(uncore, VLV_PMWGICZ, s->pmwgicz); > > @@ -308,14 +303,10 @@ static int vlv_wait_for_pw_status(struct drm_i915_private *i915, > static int vlv_force_gfx_clock(struct drm_i915_private *i915, bool force_on) > { > struct intel_uncore *uncore = &i915->uncore; > - u32 val; > int err; > > - val = intel_uncore_read(uncore, VLV_GTLC_SURVIVABILITY_REG); > - val &= ~VLV_GFX_CLK_FORCE_ON_BIT; > - if (force_on) > - val |= VLV_GFX_CLK_FORCE_ON_BIT; > - intel_uncore_write(uncore, VLV_GTLC_SURVIVABILITY_REG, val); > + intel_uncore_rmw(uncore, VLV_GTLC_SURVIVABILITY_REG, VLV_GFX_CLK_FORCE_ON_BIT, > + force_on ? VLV_GFX_CLK_FORCE_ON_BIT : 0); > > if (!force_on) > return 0; > @@ -340,11 +331,8 @@ static int vlv_allow_gt_wake(struct drm_i915_private *i915, bool allow) > u32 val; > int err; > > - val = intel_uncore_read(uncore, VLV_GTLC_WAKE_CTRL); > - val &= ~VLV_GTLC_ALLOWWAKEREQ; > - if (allow) > - val |= VLV_GTLC_ALLOWWAKEREQ; > - intel_uncore_write(uncore, VLV_GTLC_WAKE_CTRL, val); > + intel_uncore_rmw(uncore, VLV_GTLC_WAKE_CTRL, VLV_GTLC_ALLOWWAKEREQ, > + allow ? VLV_GTLC_ALLOWWAKEREQ : 0); > intel_uncore_posting_read(uncore, VLV_GTLC_WAKE_CTRL); > > mask = VLV_GTLC_ALLOWWAKEACK; > -- > 2.34.1 > -- Matt Roper Graphics Software Engineer VTT-OSGC Platform Enablement Intel Corporation