[PATCH 3/4] drm/i915/dsb: Nuke the MMIO->indexed register write logic

Shankar, Uma uma.shankar at intel.com
Wed Nov 27 18:50:19 UTC 2024



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Wednesday, November 20, 2024 10:11 PM
> To: intel-gfx at lists.freedesktop.org
> Subject: [PATCH 3/4] drm/i915/dsb: Nuke the MMIO->indexed register write logic
> 
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> We've determined that indexed DSB writes are only faster than MMIO writes
> when writing the same register ~5 or more times. That seems very unlikely to
> happen in any other case than when using indexed LUT registers. Simplify the
> code by removing the MMIO->indexed write conversion logic and just emit the
> instruction as an indexed write from the get go.

Changes Look Good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>

> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dsb.c | 58 ++++++------------------
>  1 file changed, 14 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c
> b/drivers/gpu/drm/i915/display/intel_dsb.c
> index 4d3785f5cb52..e6f8fc743fb4 100644
> --- a/drivers/gpu/drm/i915/display/intel_dsb.c
> +++ b/drivers/gpu/drm/i915/display/intel_dsb.c
> @@ -256,15 +256,6 @@ static bool intel_dsb_prev_ins_is_write(struct intel_dsb
> *dsb,
>  	return prev_opcode == opcode && prev_reg ==
> i915_mmio_reg_offset(reg);  }
> 
> -static bool intel_dsb_prev_ins_is_mmio_write(struct intel_dsb *dsb, i915_reg_t
> reg) -{
> -	/* only full byte-enables can be converted to indexed writes */
> -	return intel_dsb_prev_ins_is_write(dsb,
> -					   DSB_OPCODE_MMIO_WRITE <<
> DSB_OPCODE_SHIFT |
> -					   DSB_BYTE_EN <<
> DSB_BYTE_EN_SHIFT,
> -					   reg);
> -}
> -
>  static bool intel_dsb_prev_ins_is_indexed_write(struct intel_dsb *dsb,
> i915_reg_t reg)  {
>  	return intel_dsb_prev_ins_is_write(dsb, @@ -273,7 +264,7 @@ static
> bool intel_dsb_prev_ins_is_indexed_write(struct intel_dsb *dsb, i915_reg_  }
> 
>  /**
> - * intel_dsb_reg_write_indexed() - Emit register wriite to the DSB context
> + * intel_dsb_reg_write_indexed() - Emit indexed register write to the
> + DSB context
>   * @dsb: DSB context
>   * @reg: register address.
>   * @val: value.
> @@ -304,44 +295,23 @@ void intel_dsb_reg_write_indexed(struct intel_dsb
> *dsb,
>  	 * we are writing odd no of dwords, Zeros will be added in the end for
>  	 * padding.
>  	 */
> -	if (!intel_dsb_prev_ins_is_mmio_write(dsb, reg) &&
> -	    !intel_dsb_prev_ins_is_indexed_write(dsb, reg)) {
> -		intel_dsb_emit(dsb, val,
> -			       (DSB_OPCODE_MMIO_WRITE <<
> DSB_OPCODE_SHIFT) |
> -			       (DSB_BYTE_EN << DSB_BYTE_EN_SHIFT) |
> +	if (!intel_dsb_prev_ins_is_indexed_write(dsb, reg))
> +		intel_dsb_emit(dsb, 0, /* count */
> +			       (DSB_OPCODE_INDEXED_WRITE <<
> DSB_OPCODE_SHIFT) |
>  			       i915_mmio_reg_offset(reg));
> -	} else {
> -		if (!assert_dsb_has_room(dsb))
> -			return;
> -
> -		/* convert to indexed write? */
> -		if (intel_dsb_prev_ins_is_mmio_write(dsb, reg)) {
> -			u32 prev_val = dsb->ins[0];
> 
> -			dsb->ins[0] = 1; /* count */
> -			dsb->ins[1] = (DSB_OPCODE_INDEXED_WRITE <<
> DSB_OPCODE_SHIFT) |
> -				i915_mmio_reg_offset(reg);
> -
> -			intel_dsb_buffer_write(&dsb->dsb_buf, dsb-
> >ins_start_offset + 0,
> -					       dsb->ins[0]);
> -			intel_dsb_buffer_write(&dsb->dsb_buf, dsb-
> >ins_start_offset + 1,
> -					       dsb->ins[1]);
> -			intel_dsb_buffer_write(&dsb->dsb_buf, dsb-
> >ins_start_offset + 2,
> -					       prev_val);
> -
> -			dsb->free_pos++;
> -		}
> +	if (!assert_dsb_has_room(dsb))
> +		return;
> 
> -		intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos++, val);
> -		/* Update the count */
> -		dsb->ins[0]++;
> -		intel_dsb_buffer_write(&dsb->dsb_buf, dsb->ins_start_offset +
> 0,
> -				       dsb->ins[0]);
> +	/* Update the count */
> +	dsb->ins[0]++;
> +	intel_dsb_buffer_write(&dsb->dsb_buf, dsb->ins_start_offset + 0,
> +			       dsb->ins[0]);
> 
> -		/* if number of data words is odd, then the last dword should be
> 0.*/
> -		if (dsb->free_pos & 0x1)
> -			intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos,
> 0);
> -	}
> +	intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos++, val);
> +	/* if number of data words is odd, then the last dword should be 0.*/
> +	if (dsb->free_pos & 0x1)
> +		intel_dsb_buffer_write(&dsb->dsb_buf, dsb->free_pos, 0);
>  }
> 
>  void intel_dsb_reg_write(struct intel_dsb *dsb,
> --
> 2.45.2



More information about the Intel-gfx mailing list