[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(>->mmio, reg, table[i].value);
> }
> +
> + if (xe->pat.pat_ats)
> + xe_mmio_write32(>->mmio, XE_REG(_PAT_ATS), xe-
> >pat.pat_ats->value);
> + if (xe->pat.pat_pta)
> + xe_mmio_write32(>->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(>->mmio, XE_REG(_PAT_ATS), xe-
> >pat.pat_ats->value);
> - if (xe->pat.pat_pta)
> - xe_mmio_write32(>->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