diff options
Diffstat (limited to 'drivers/gpu/drm/i915/gt/intel_mocs.c')
| -rw-r--r-- | drivers/gpu/drm/i915/gt/intel_mocs.c | 70 | 
1 files changed, 69 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/gt/intel_mocs.c b/drivers/gpu/drm/i915/gt/intel_mocs.c index 69b489e8dfed..2c014407225c 100644 --- a/drivers/gpu/drm/i915/gt/intel_mocs.c +++ b/drivers/gpu/drm/i915/gt/intel_mocs.c @@ -40,6 +40,10 @@ struct drm_i915_mocs_table {  #define LE_COS(value)		((value) << 15)  #define LE_SSE(value)		((value) << 17) +/* Defines for the tables (GLOB_MOCS_0 - GLOB_MOCS_16) */ +#define _L4_CACHEABILITY(value)	((value) << 2) +#define IG_PAT(value)		((value) << 8) +  /* Defines for the tables (LNCFMOCS0 - LNCFMOCS31) - two entries per word */  #define L3_ESC(value)		((value) << 0)  #define L3_SCC(value)		((value) << 1) @@ -50,6 +54,7 @@ struct drm_i915_mocs_table {  /* Helper defines */  #define GEN9_NUM_MOCS_ENTRIES	64  /* 63-64 are reserved, but configured. */  #define PVC_NUM_MOCS_ENTRIES	3 +#define MTL_NUM_MOCS_ENTRIES	16  /* (e)LLC caching options */  /* @@ -73,6 +78,12 @@ struct drm_i915_mocs_table {  #define L3_2_RESERVED		_L3_CACHEABILITY(2)  #define L3_3_WB			_L3_CACHEABILITY(3) +/* L4 caching options */ +#define L4_0_WB			_L4_CACHEABILITY(0) +#define L4_1_WT			_L4_CACHEABILITY(1) +#define L4_2_RESERVED		_L4_CACHEABILITY(2) +#define L4_3_UC			_L4_CACHEABILITY(3) +  #define MOCS_ENTRY(__idx, __control_value, __l3cc_value) \  	[__idx] = { \  		.control_value = __control_value, \ @@ -416,6 +427,57 @@ static const struct drm_i915_mocs_entry pvc_mocs_table[] = {  	MOCS_ENTRY(2, 0, L3_3_WB),  }; +static const struct drm_i915_mocs_entry mtl_mocs_table[] = { +	/* Error - Reserved for Non-Use */ +	MOCS_ENTRY(0, +		   IG_PAT(0), +		   L3_LKUP(1) | L3_3_WB), +	/* Cached - L3 + L4 */ +	MOCS_ENTRY(1, +		   IG_PAT(1), +		   L3_LKUP(1) | L3_3_WB), +	/* L4 - GO:L3 */ +	MOCS_ENTRY(2, +		   IG_PAT(1), +		   L3_LKUP(1) | L3_1_UC), +	/* Uncached - GO:L3 */ +	MOCS_ENTRY(3, +		   IG_PAT(1) | L4_3_UC, +		   L3_LKUP(1) | L3_1_UC), +	/* L4 - GO:Mem */ +	MOCS_ENTRY(4, +		   IG_PAT(1), +		   L3_LKUP(1) | L3_GLBGO(1) | L3_1_UC), +	/* Uncached - GO:Mem */ +	MOCS_ENTRY(5, +		   IG_PAT(1) | L4_3_UC, +		   L3_LKUP(1) | L3_GLBGO(1) | L3_1_UC), +	/* L4 - L3:NoLKUP; GO:L3 */ +	MOCS_ENTRY(6, +		   IG_PAT(1), +		   L3_1_UC), +	/* Uncached - L3:NoLKUP; GO:L3 */ +	MOCS_ENTRY(7, +		   IG_PAT(1) | L4_3_UC, +		   L3_1_UC), +	/* L4 - L3:NoLKUP; GO:Mem */ +	MOCS_ENTRY(8, +		   IG_PAT(1), +		   L3_GLBGO(1) | L3_1_UC), +	/* Uncached - L3:NoLKUP; GO:Mem */ +	MOCS_ENTRY(9, +		   IG_PAT(1) | L4_3_UC, +		   L3_GLBGO(1) | L3_1_UC), +	/* Display - L3; L4:WT */ +	MOCS_ENTRY(14, +		   IG_PAT(1) | L4_1_WT, +		   L3_LKUP(1) | L3_3_WB), +	/* CCS - Non-Displayable */ +	MOCS_ENTRY(15, +		   IG_PAT(1), +		   L3_GLBGO(1) | L3_1_UC), +}; +  enum {  	HAS_GLOBAL_MOCS = BIT(0),  	HAS_ENGINE_MOCS = BIT(1), @@ -445,7 +507,13 @@ static unsigned int get_mocs_settings(const struct drm_i915_private *i915,  	memset(table, 0, sizeof(struct drm_i915_mocs_table));  	table->unused_entries_index = I915_MOCS_PTE; -	if (IS_PONTEVECCHIO(i915)) { +	if (IS_METEORLAKE(i915)) { +		table->size = ARRAY_SIZE(mtl_mocs_table); +		table->table = mtl_mocs_table; +		table->n_entries = MTL_NUM_MOCS_ENTRIES; +		table->uc_index = 9; +		table->unused_entries_index = 1; +	} else if (IS_PONTEVECCHIO(i915)) {  		table->size = ARRAY_SIZE(pvc_mocs_table);  		table->table = pvc_mocs_table;  		table->n_entries = PVC_NUM_MOCS_ENTRIES;  |