[PATCH 2/2] drm/xe/pat: Consolidate PAT programming logic for pre-Xe2 and post-Xe2

Upadhyay, Tejas tejas.upadhyay at intel.com
Mon Jun 16 06:12:28 UTC 2025



> -----Original Message-----
> From: Roper, Matthew D <matthew.d.roper at intel.com>
> Sent: 14 June 2025 03:18
> To: intel-xe at lists.freedesktop.org
> Cc: Upadhyay, Tejas <tejas.upadhyay at intel.com>; Roper, Matthew D
> <matthew.d.roper at intel.com>
> Subject: [PATCH 2/2] drm/xe/pat: Consolidate PAT programming logic for pre-
> Xe2 and post-Xe2
> 
> Now that the PAT settings for the new special entries introduced by Xe2 are
> decided during early software init and left NULL on platforms they don't apply
> to, there's no need to keep separate programming functions for pre-Xe2 and
> post-Xe2 platforms.  Consolidate down to a single pair of programming
> functions (mcr and non-mcr) that can be used on any platform.
> 
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
>  drivers/gpu/drm/xe/xe_pat.c | 44 ++++++++++++++-----------------------
>  1 file changed, 16 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pat.c b/drivers/gpu/drm/xe/xe_pat.c index
> 31663ead7822..2e7cb99ae87a 100644
> --- a/drivers/gpu/drm/xe/xe_pat.c
> +++ b/drivers/gpu/drm/xe/xe_pat.c
> @@ -163,21 +163,35 @@ u16 xe_pat_index_get_coh_mode(struct xe_device
> *xe, u16 pat_index)  static void program_pat(struct xe_gt *gt, const struct
> xe_pat_table_entry table[],
>  			int n_entries)
>  {
> +	struct xe_device *xe = gt_to_xe(gt);
> +
>  	for (int i = 0; i < n_entries; i++) {
>  		struct xe_reg reg = XE_REG(_PAT_INDEX(i));
> 
>  		xe_mmio_write32(&gt->mmio, reg, table[i].value);
>  	}
> +
> +	if (xe->pat.pat_ats)
> +		xe_mmio_write32(&gt->mmio, XE_REG(_PAT_ATS), xe-
> >pat.pat_ats->value);
> +	if (xe->pat.pat_pta)
> +		xe_mmio_write32(&gt->mmio, XE_REG(_PAT_PTA), xe-
> >pat.pat_pta->value);
>  }
> 
>  static void program_pat_mcr(struct xe_gt *gt, const struct xe_pat_table_entry
> table[],
>  			    int n_entries)
>  {
> +	struct xe_device *xe = gt_to_xe(gt);
> +
>  	for (int i = 0; i < n_entries; i++) {
>  		struct xe_reg_mcr reg_mcr = XE_REG_MCR(_PAT_INDEX(i));
> 
>  		xe_gt_mcr_multicast_write(gt, reg_mcr, table[i].value);
>  	}
> +
> +	if (xe->pat.pat_ats)
> +		xe_gt_mcr_multicast_write(gt, XE_REG_MCR(_PAT_ATS), xe-
> >pat.pat_ats->value);
> +	if (xe->pat.pat_pta)
> +		xe_gt_mcr_multicast_write(gt, XE_REG_MCR(_PAT_PTA),
> +xe->pat.pat_pta->value);
>  }
> 
>  static void xelp_dump(struct xe_gt *gt, struct drm_printer *p) @@ -304,32
> +318,6 @@ static const struct xe_pat_ops xelpg_pat_ops = {
>  	.dump = xelpg_dump,
>  };
> 
> -static void xe2lpg_program_pat(struct xe_gt *gt, const struct
> xe_pat_table_entry table[],
> -			       int n_entries)
> -{
> -	struct xe_device *xe = gt_to_xe(gt);
> -
> -	program_pat_mcr(gt, table, n_entries);
> -
> -	if (xe->pat.pat_ats)
> -		xe_gt_mcr_multicast_write(gt, XE_REG_MCR(_PAT_ATS), xe-
> >pat.pat_ats->value);
> -	if (xe->pat.pat_pta)
> -		xe_gt_mcr_multicast_write(gt, XE_REG_MCR(_PAT_PTA), xe-
> >pat.pat_pta->value);
> -}
> -
> -static void xe2lpm_program_pat(struct xe_gt *gt, const struct
> xe_pat_table_entry table[],
> -			       int n_entries)
> -{
> -	struct xe_device *xe = gt_to_xe(gt);
> -
> -	program_pat(gt, table, n_entries);
> -
> -	if (xe->pat.pat_ats)
> -		xe_mmio_write32(&gt->mmio, XE_REG(_PAT_ATS), xe-
> >pat.pat_ats->value);
> -	if (xe->pat.pat_pta)
> -		xe_mmio_write32(&gt->mmio, XE_REG(_PAT_PTA), xe-
> >pat.pat_pta->value);
> -}
> -
>  static void xe2_dump(struct xe_gt *gt, struct drm_printer *p)  {
>  	struct xe_device *xe = gt_to_xe(gt);
> @@ -382,8 +370,8 @@ static void xe2_dump(struct xe_gt *gt, struct
> drm_printer *p)  }
> 
>  static const struct xe_pat_ops xe2_pat_ops = {
> -	.program_graphics = xe2lpg_program_pat,
> -	.program_media = xe2lpm_program_pat,
> +	.program_graphics = program_pat_mcr,
> +	.program_media = program_pat,
>  	.dump = xe2_dump,
>  };

Yes, looks much cleaner. Do we want to keep this as first patch?
Reviewed-by: Tejas Upadhyay <tejas.upadhyay at intel.com>

> 
> --
> 2.49.0



More information about the Intel-xe mailing list