[Intel-xe] [PATCH 3/6] drm/xe/pat: Handle unicast vs MCR PAT registers

Das, Nirmoy nirmoy.das at linux.intel.com
Fri Mar 24 21:36:52 UTC 2023


On 3/24/2023 10:04 PM, Matt Roper wrote:
> The PAT_INDEX registers are MCR registers on some platforms and unicast
> on others.  On MTL the handling even varies between GTs:  the primary GT
> uses MCR registers while the media GT uses unicast registers.  Let's add
> proper MCR programming on the relevant platforms/GTs.
>
> Given that we PAT tables to change pretty regularly on future platforms,
> we'll make PAT programming an exception to the usual model of assuming
> new platforms should inherit the previous platform's behavior.  Instead
> we'll raise a warning if the current platform isn't handled in the
> if/else ladder.  This should help prevent subtle cache misbehavior if we
> forget to add the table for a new platform.
>
> Bspec: 66534, 67609, 67788
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>

Reviewed-by: Nirmoy Das<nirmoy.das at intel.com>

> ---
>   drivers/gpu/drm/xe/xe_pat.c | 35 ++++++++++++++++++++++++++++-------
>   1 file changed, 28 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_pat.c b/drivers/gpu/drm/xe/xe_pat.c
> index 75d25e0c0b9a..f511d9a54358 100644
> --- a/drivers/gpu/drm/xe/xe_pat.c
> +++ b/drivers/gpu/drm/xe/xe_pat.c
> @@ -5,9 +5,10 @@
>   
>   #include "regs/xe_reg_defs.h"
>   #include "xe_gt.h"
> +#include "xe_gt_mcr.h"
>   #include "xe_mmio.h"
>   
> -#define GEN12_PAT_INDEX(index)			_MMIO(0x4800 + (index) * 4)
> +#define _PAT_INDEX(index)			(0x4800 + (index) * 4)
>   
>   #define GEN8_PPAT_WB			(3<<0)
>   #define GEN8_PPAT_WT			(2<<0)
> @@ -56,17 +57,37 @@ const u32 mtl_pat_table[] = {
>   
>   #define PROGRAM_PAT_UNICAST(gt, table) do { \
>   	for (int i = 0; i < ARRAY_SIZE(table); i++) \
> -		xe_mmio_write32(gt, GEN12_PAT_INDEX(i).reg, table[i]); \
> +		xe_mmio_write32(gt, _PAT_INDEX(i), table[i]); \
> +} while (0)
> +
> +#define PROGRAM_PAT_MCR(gt, table) do { \
> +	for (int i = 0; i < ARRAY_SIZE(table); i++) \
> +		xe_gt_mcr_multicast_write(gt, MCR_REG(_PAT_INDEX(i)), table[i]); \
>   } while (0)
>   
>   void xe_pat_init(struct xe_gt *gt)
>   {
>   	struct xe_device *xe = gt_to_xe(gt);
>   
> -	if (xe->info.platform == XE_METEORLAKE)
> -		PROGRAM_PAT_UNICAST(gt, mtl_pat_table);
> -	else if (xe->info.platform == XE_PVC)
> -		PROGRAM_PAT_UNICAST(gt, pvc_pat_table);
> -	else
> +	if (xe->info.platform == XE_METEORLAKE) {
> +		if (xe_gt_is_media_type(gt))
> +			PROGRAM_PAT_UNICAST(gt, mtl_pat_table);
> +		else
> +			PROGRAM_PAT_MCR(gt, mtl_pat_table);
> +	} else if (xe->info.platform == XE_PVC) {
> +		PROGRAM_PAT_MCR(gt, pvc_pat_table);
> +	} else if (xe->info.platform == XE_DG2) {
> +		PROGRAM_PAT_MCR(gt, pvc_pat_table);
> +	} else if (GRAPHICS_VERx100(xe) <= 1210) {
>   		PROGRAM_PAT_UNICAST(gt, tgl_pat_table);
> +	} else {
> +		/*
> +		 * Going forward we expect to need new PAT settings for most
> +		 * new platforms; failure to provide a new table can easily
> +		 * lead to subtle, hard-to-debug problems.  If none of the
> +		 * conditions above match the platform we're running on we'll
> +		 * raise an error rather than trying to silently inherit the
> +		 * most recent platform's behavior.
> +		 */
> +	}
>   }


More information about the Intel-xe mailing list