Skip to contentSkip to conversation

Disable automatic load CCS load balancing

PATCH Superseded Andi Shyti 4 participants 18 messages Feb 20, 2024 – Feb 22, 2024

Subsystems (3)

v1 of 8 Superseded Latest is v8 →

lore
Share & tools
lore

Andi Shyti

author
#0 lore raw

cover Disable automatic load CCS load balancing

Hi,

this series does basically two things:

1. Disables automatic load balancing as adviced by the hardware workaround.

2. Assigns all the CCS slices to one single user engine. The user will then be able to query only one CCS engine

Changelog
=========
- In Patch 1 use the correct workaround number (thanks Matt).
- In Patch 2 do not add the extra CCS engines to the exposed UABI engine list and adapt the engine counting accordingly (thanks Tvrtko).
- Reword the commit of Patch 2 (thanks John).

Andi Shyti (2):
drm/i915/gt: Disable HW load balancing for CCS drm/i915/gt: Enable only one CCS for compute workload

 drivers/gpu/drm/i915/gt/intel_engine_user.c |  9 +++++++++
 drivers/gpu/drm/i915/gt/intel_gt.c          | 11 +++++++++++
 drivers/gpu/drm/i915/gt/intel_gt_regs.h     |  3 +++
 drivers/gpu/drm/i915/gt/intel_workarounds.c |  6 ++++++
 drivers/gpu/drm/i915/i915_query.c           |  1 +
 5 files changed, 30 insertions(+)
Signature · 1 line
2.43.0
author
#1 lore raw

PATCH v2 1/2 drm/i915/gt: Disable HW load balancing for CCS

The hardware should not dynamically balance the load between CCS engines. Wa_14019159160 recommends disabling it across all platforms.

Fixes d2eae8e98d59 ("drm/i915/dg2: Drop force_probe requirement")
Cc Chris Wilson <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Matt Roper <[email protected]>
Cc <[email protected]> # v6.2+
---
 drivers/gpu/drm/i915/gt/intel_gt_regs.h     | 1 +
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 6 ++++++
 2 files changed, 7 insertions(+)
drivers/gpu/drm/i915/gt/intel_gt_regs.h +1 -0
index 50962cfd1353..cf709f6c05ae 100644
@@ -1478,6 +1478,7 @@
 
 #define GEN12_RCU_MODE				_MMIO(0x14800)
 #define   GEN12_RCU_MODE_CCS_ENABLE		REG_BIT(0)
+#define   XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE	REG_BIT(1)
 
 #define CHV_FUSE_GT				_MMIO(VLV_GUNIT_BASE + 0x2168)
 #define   CHV_FGT_DISABLE_SS0			(1 << 10)
drivers/gpu/drm/i915/gt/intel_workarounds.c +6 -0
index d67d44611c28..9126b37186fc 100644
@@ -2988,6 +2988,12 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
 		wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN1,
 				 GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE);
 	}
+
+	/*
+	 * Wa_14019159160: disable the CCS load balancing
+	 * indiscriminately for all the platforms
+	 */
+	wa_masked_en(wal, GEN12_RCU_MODE, XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE);
 }
 
 static void
Signature · 1 line
2.43.0
#2 lore raw

Re: [PATCH v2 1/2] drm/i915/gt: Disable HW load balancing for CCS

Quoted 32 lines · Andi Shyti

The hardware should not dynamically balance the load between CCS engines. Wa_14019159160 recommends disabling it across all platforms.

Fixes d2eae8e98d59 ("drm/i915/dg2: Drop force_probe requirement")
Cc Chris Wilson <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Matt Roper <[email protected]>
Cc <[email protected]> # v6.2+
---
 drivers/gpu/drm/i915/gt/intel_gt_regs.h     | 1 +
 drivers/gpu/drm/i915/gt/intel_workarounds.c | 6 ++++++
 2 files changed, 7 insertions(+)
drivers/gpu/drm/i915/gt/intel_gt_regs.h +1 -0
index 50962cfd1353..cf709f6c05ae 100644
@@ -1478,6 +1478,7 @@
 
 #define GEN12_RCU_MODE				_MMIO(0x14800)
 #define   GEN12_RCU_MODE_CCS_ENABLE		REG_BIT(0)
+#define   XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE	REG_BIT(1)
 
 #define CHV_FUSE_GT				_MMIO(VLV_GUNIT_BASE + 0x2168)
 #define   CHV_FGT_DISABLE_SS0			(1 << 10)
drivers/gpu/drm/i915/gt/intel_workarounds.c +0 -0
index d67d44611c28..9126b37186fc 100644

drivers/gpu/drm/i915/gt/intel_workarounds.c general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li · line 2994

Quoted 7 lines
drivers/gpu/drm/i915/gt/intel_workarounds.c +4 -0
@@ -2988,6 +2988,12 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
 		wa_mcr_masked_en(wal, GEN8_HALF_SLICE_CHICKEN1,
 				 GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE);
 	}
+
+	/*
+	 * Wa_14019159160: disable the CCS load balancing
+	 * indiscriminately for all the platforms

The database's description of this workaround is a bit confusing since it's been modified a few times, but if I'm reading it correctly it doesn't sound like this is what it's asking us to do. What I see says that load balancing shouldn't be allowed specifically while the RCS is active. If the RCS is sitting idle, I believe you're free to use as many CCS engines as you like, with load balancing still active.

We already have other workarounds that prevent different address spaces from executing on the RCS/CCS engines at the same time, so the part about "same address space" in the description should already be satisfied. It sounds like the issues now are if 2+ CCS's are in use and something new shows up to run on the previously-idle RCS, or if something's already running on the RCS and 1 CCS, and something new shows up to run on an additional CCS. The workaround details make it sound like it's supposed to be the GuC's responsibility to prevent the new work from getting scheduled onto the additional engine while we're already in one of those two situations, so I don't see anything asking us to change the hardware-level load balance enable/disable (actually the spec specifically tells us *not* to do this). Aren't we supposed to be just setting a GuC workaround flag for this?

Matt

Quoted 8 lines
drivers/gpu/drm/i915/gt/intel_workarounds.c +2 -0
+	 */
+	wa_masked_en(wal, GEN12_RCU_MODE, XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE);
 }
 
 static void
Signature · 1 line
2.43.0
Signature · 4 lines
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
author
#3 lore raw

PATCH v2 2/2 drm/i915/gt: Enable only one CCS for compute workload

In reply to Andi Shyti

Enable only one CCS engine by default with all the compute sices allocated to it.

While generating the list of UABI engines to be exposed to the user, exclude any additional CCS engines beyond the first instance.

This change can be tested with igt i915_query.

Fixes d2eae8e98d59 ("drm/i915/dg2: Drop force_probe requirement")
Cc Chris Wilson <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Matt Roper <[email protected]>
Cc <[email protected]> # v6.2+
---
 drivers/gpu/drm/i915/gt/intel_engine_user.c |  9 +++++++++
 drivers/gpu/drm/i915/gt/intel_gt.c          | 11 +++++++++++
 drivers/gpu/drm/i915/gt/intel_gt_regs.h     |  2 ++
 drivers/gpu/drm/i915/i915_query.c           |  1 +
 4 files changed, 23 insertions(+)
drivers/gpu/drm/i915/gt/intel_engine_user.c +9 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
 		if (engine->uabi_class == I915_NO_UABI_CLASS)
 			continue;
 
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}
+
 		rb_link_node(&engine->uabi_node, prev, p);
 		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
drivers/gpu/drm/i915/gt/intel_gt.c +11 -0
index a425db5ed3a2..e19df4ef47f6 100644
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
 	}
 }
 
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);
+}
+
 int intel_gt_init_hw(struct intel_gt *gt)
 {
 	struct drm_i915_private *i915 = gt->i915;
@@ -195,6 +203,9 @@ int intel_gt_init_hw(struct intel_gt *gt)
 
 	intel_gt_init_swizzling(gt);
 
+	/* Configure CCS mode */
+	intel_gt_apply_ccs_mode(gt);
+
 	/*
 	 * At least 830 can leave some of the unused rings
 	 * "active" (ie. head != tail) after resume which
drivers/gpu/drm/i915/gt/intel_gt_regs.h +2 -0
index cf709f6c05ae..c148113770ea 100644
@@ -1605,6 +1605,8 @@
 #define   GEN12_VOLTAGE_MASK			REG_GENMASK(10, 0)
 #define   GEN12_CAGF_MASK			REG_GENMASK(19, 11)
 
+#define XEHP_CCS_MODE                          _MMIO(0x14804)
+
 #define GEN11_GT_INTR_DW(x)			_MMIO(0x190018 + ((x) * 4))
 #define   GEN11_CSME				(31)
 #define   GEN12_HECI_2				(30)
drivers/gpu/drm/i915/i915_query.c +1 -0
index 3baa2f54a86e..d5a5143971f5 100644
@@ -124,6 +124,7 @@ static int query_geometry_subslices(struct drm_i915_private *i915,
 	return fill_topology_info(sseu, query_item, sseu->geometry_subslice_mask);
 }
 
+
 static int
 query_engine_info(struct drm_i915_private *i915,
 		  struct drm_i915_query_item *query_item)
Signature · 1 line
2.43.0
author
#4 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Hi,

[...]

drivers/gpu/drm/i915/i915_query.c static int query_geometry_subslices(struct drm_i915_private *i915, · line 127

Quoted 9 lines
drivers/gpu/drm/i915/i915_query.c +1 -0
index 3baa2f54a86e..d5a5143971f5 100644
@@ -124,6 +124,7 @@ static int query_geometry_subslices(struct drm_i915_private *i915,
 	return fill_topology_info(sseu, query_item, sseu->geometry_subslice_mask);
 }
 
+

sorry, this is a leftover from the cleanup.

Andi

Quoted 5 lines
drivers/gpu/drm/i915/i915_query.c +0 -0
 static int
 query_engine_info(struct drm_i915_private *i915,
 		  struct drm_i915_query_item *query_item)
Signature · 1 line
2.43.0
#5 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

In reply to Andi Shyti
Quoted 1 line · Andi Shyti

Enable only one CCS engine by default with all the compute sices

slices

Quoted 27 lines

allocated to it.

While generating the list of UABI engines to be exposed to the user, exclude any additional CCS engines beyond the first instance.

This change can be tested with igt i915_query.

Fixes d2eae8e98d59 ("drm/i915/dg2: Drop force_probe requirement")
Cc Chris Wilson <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Matt Roper <[email protected]>
Cc <[email protected]> # v6.2+
---
  drivers/gpu/drm/i915/gt/intel_engine_user.c |  9 +++++++++
  drivers/gpu/drm/i915/gt/intel_gt.c          | 11 +++++++++++
  drivers/gpu/drm/i915/gt/intel_gt_regs.h     |  2 ++
  drivers/gpu/drm/i915/i915_query.c           |  1 +
  4 files changed, 23 insertions(+)
drivers/gpu/drm/i915/gt/intel_engine_user.c +0 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
  		if (engine->uabi_class == I915_NO_UABI_CLASS)

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +8 -0
  			continue;
 
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

It's a bit ugly to decrement after increment, instead of somehow restructuring the loop to satisfy both cases more elegantly. And I wonder if internally (in dmesg when engine name is logged) we don't end up with ccs0 ccs0 ccs0 ccs0.. for all instances.

Quoted 51 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -0
+
  		rb_link_node(&engine->uabi_node, prev, p);
  		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
drivers/gpu/drm/i915/gt/intel_gt.c +11 -0
index a425db5ed3a2..e19df4ef47f6 100644
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
  	}
  }
 
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);
+}
+
  int intel_gt_init_hw(struct intel_gt *gt)
  {
  	struct drm_i915_private *i915 = gt->i915;
@@ -195,6 +203,9 @@ int intel_gt_init_hw(struct intel_gt *gt)
 
  	intel_gt_init_swizzling(gt);
 
+	/* Configure CCS mode */
+	intel_gt_apply_ccs_mode(gt);
+
  	/*
  	 * At least 830 can leave some of the unused rings
  	 * "active" (ie. head != tail) after resume which
drivers/gpu/drm/i915/gt/intel_gt_regs.h +2 -0
index cf709f6c05ae..c148113770ea 100644
@@ -1605,6 +1605,8 @@
  #define   GEN12_VOLTAGE_MASK			REG_GENMASK(10, 0)
  #define   GEN12_CAGF_MASK			REG_GENMASK(19, 11)
 
+#define XEHP_CCS_MODE                          _MMIO(0x14804)
+
  #define GEN11_GT_INTR_DW(x)			_MMIO(0x190018 + ((x) * 4))
  #define   GEN11_CSME				(31)
  #define   GEN12_HECI_2				(30)
drivers/gpu/drm/i915/i915_query.c +0 -0
index 3baa2f54a86e..d5a5143971f5 100644

drivers/gpu/drm/i915/i915_query.c static int query_geometry_subslices(struct drm_i915_private *i915, · line 127

Quoted 4 lines
drivers/gpu/drm/i915/i915_query.c +1 -0
@@ -124,6 +124,7 @@ static int query_geometry_subslices(struct drm_i915_private *i915,
  	return fill_topology_info(sseu, query_item, sseu->geometry_subslice_mask);
  }
 
+

Zap please.

drivers/gpu/drm/i915/i915_query.c static int query_geometry_subslices(struct drm_i915_private *i915, · line 130

Quoted 3 lines
drivers/gpu/drm/i915/i915_query.c +0 -0
  static int
  query_engine_info(struct drm_i915_private *i915,
  		  struct drm_i915_query_item *query_item)

Regards,

Tvrtko

author
#6 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Hi Tvrtko,

Quoted 4 lines · Tvrtko Ursulin
Quoted 1 line · Andi Shyti

Enable only one CCS engine by default with all the compute sices

slices

Thanks!

Quoted 10 lines
Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +3 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
  		if (engine->uabi_class == I915_NO_UABI_CLASS)
  			continue;
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
Quoted 8 lines

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 5 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +5 -0
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

It's a bit ugly to decrement after increment, instead of somehow restructuring the loop to satisfy both cases more elegantly.

yes, agree, indeed I had a hard time here to accept this change myself.

But moving the check above where the counter was incremented it would have been much uglier.

This check looks ugly everywhere you place it :-)

In any case, I'm working on a patch that is splitting this function in two parts and there is some refactoring happening here (for the first initialization and the dynamic update).

Please let me know if it's OK with you or you want me to fix it in this run.

Quoted 3 lines

And I wonder if
internally (in dmesg when engine name is logged) we don't end up with ccs0 ccs0 ccs0 ccs0.. for all instances.

I don't see this. Even in sysfs we see only one ccs. Where is it?

Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -0
+
  		rb_link_node(&engine->uabi_node, prev, p);
  		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);

[...]

Quoted 10 lines

drivers/gpu/drm/i915/i915_query.c static int query_geometry_subslices(struct drm_i915_private *i915, · line 126

Quoted 8 lines
drivers/gpu/drm/i915/i915_query.c +1 -0
index 3baa2f54a86e..d5a5143971f5 100644
@@ -124,6 +124,7 @@ static int query_geometry_subslices(struct drm_i915_private *i915,
  	return fill_topology_info(sseu, query_item, sseu->geometry_subslice_mask);
  }
+

Zap please.

yes... yes... I noticed it after sending the patch :-)

Thanks,
Andi

#7 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Quoted 29 lines · Andi Shyti

Hi Tvrtko,

Quoted 4 lines · Tvrtko Ursulin
Quoted 1 line · Andi Shyti

Enable only one CCS engine by default with all the compute sices

slices

Thanks!

Quoted 10 lines
Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +3 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
   		if (engine->uabi_class == I915_NO_UABI_CLASS)
   			continue;
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
Quoted 8 lines

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 5 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +5 -0
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

It's a bit ugly to decrement after increment, instead of somehow restructuring the loop to satisfy both cases more elegantly.

Quoted 7 lines

yes, agree, indeed I had a hard time here to accept this change myself.

But moving the check above where the counter was incremented it would have been much uglier.

This check looks ugly everywhere you place it :-)

One idea would be to introduce a separate local counter array for name_instance, so not use i915->engine_uabi_class_count[]. First one increments for every engine, second only for the exposed ones. That way feels wouldn't be too ugly.

Quoted 4 lines

In any case, I'm working on a patch that is splitting this function in two parts and there is some refactoring happening here (for the first initialization and the dynamic update).

Quoted 8 lines

Please let me know if it's OK with you or you want me to fix it in this run.

Quoted 3 lines

And I wonder if
internally (in dmesg when engine name is logged) we don't end up with ccs0 ccs0 ccs0 ccs0.. for all instances.

I don't see this. Even in sysfs we see only one ccs. Where is it?

When you run this patch on something with two or more ccs-es, the "renamed ccs... to ccs.." debug logs do not all log the new name as ccs0?

Regards,

Tvrtko

Quoted 22 lines
Quoted 4 lines
Quoted 4 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -0
+
   		rb_link_node(&engine->uabi_node, prev, p);
   		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);

[...]

Quoted 10 lines

drivers/gpu/drm/i915/i915_query.c static int query_geometry_subslices(struct drm_i915_private *i915, · line 126

Quoted 8 lines
drivers/gpu/drm/i915/i915_query.c +1 -0
index 3baa2f54a86e..d5a5143971f5 100644
@@ -124,6 +124,7 @@ static int query_geometry_subslices(struct drm_i915_private *i915,
   	return fill_topology_info(sseu, query_item, sseu->geometry_subslice_mask);
   }
+

Zap please.

yes... yes... I noticed it after sending the patch :-)

Thanks,
Andi

author
#8 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Hi Tvrtko,

Quoted 34 lines · Tvrtko Ursulin
Quoted 33 lines · Andi Shyti
Quoted 4 lines · Tvrtko Ursulin
Quoted 1 line · Andi Shyti

Enable only one CCS engine by default with all the compute sices

slices

Thanks!

Quoted 10 lines
Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +3 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
   		if (engine->uabi_class == I915_NO_UABI_CLASS)
   			continue;
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
Quoted 8 lines

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 5 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +5 -0
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

It's a bit ugly to decrement after increment, instead of somehow restructuring the loop to satisfy both cases more elegantly.

yes, agree, indeed I had a hard time here to accept this change myself.

But moving the check above where the counter was incremented it would have been much uglier.

Quoted 6 lines
Quoted 1 line

This check looks ugly everywhere you place it :-)

One idea would be to introduce a separate local counter array for name_instance, so not use i915->engine_uabi_class_count[]. First one increments for every engine, second only for the exposed ones. That way feels wouldn't be too ugly.

Ah... you mean that whenever we change the CCS mode, we update the indexes of the exposed engines from list of the real engines. Will try.

My approach was to regenerate the list everytime the CCS mode was changed, but your suggestion looks a bit simplier.

Quoted 7 lines
Quoted 7 lines

In any case, I'm working on a patch that is splitting this function in two parts and there is some refactoring happening here (for the first initialization and the dynamic update).

Please let me know if it's OK with you or you want me to fix it in this run.

Quoted 8 lines
Quoted 5 lines
Quoted 3 lines

And I wonder if
internally (in dmesg when engine name is logged) we don't end up with ccs0 ccs0 ccs0 ccs0.. for all instances.

I don't see this. Even in sysfs we see only one ccs. Where is it?

When you run this patch on something with two or more ccs-es, the "renamed ccs... to ccs.." debug logs do not all log the new name as ccs0?

it shouldn't, because the name_instance is anyway incremented normally... anyway, I will test it.

Thanks a lot!
Andi

#9 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Quoted 44 lines · Andi Shyti

Hi Tvrtko,

Quoted 34 lines · Tvrtko Ursulin
Quoted 33 lines · Andi Shyti
Quoted 4 lines · Tvrtko Ursulin
Quoted 1 line · Andi Shyti

Enable only one CCS engine by default with all the compute sices

slices

Thanks!

Quoted 10 lines
Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +3 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
    		if (engine->uabi_class == I915_NO_UABI_CLASS)
    			continue;
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
Quoted 8 lines

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 252

Quoted 5 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +5 -0
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

It's a bit ugly to decrement after increment, instead of somehow restructuring the loop to satisfy both cases more elegantly.

yes, agree, indeed I had a hard time here to accept this change myself.

But moving the check above where the counter was incremented it would have been much uglier.

Quoted 6 lines
Quoted 1 line

This check looks ugly everywhere you place it :-)

One idea would be to introduce a separate local counter array for name_instance, so not use i915->engine_uabi_class_count[]. First one increments for every engine, second only for the exposed ones. That way feels wouldn't be too ugly.

Quoted 6 lines

Ah... you mean that whenever we change the CCS mode, we update the indexes of the exposed engines from list of the real engines. Will try.

My approach was to regenerate the list everytime the CCS mode was changed, but your suggestion looks a bit simplier.

No, I meant just for this first stage of permanently single engine. For avoiding the decrement after increment. Something like this, but not compile tested even:

drivers/gpu/drm/i915/gt/intel_engine_user.c +15 -11
index 833987015b8b..4c33f30612c4 100644
@@ -203,7 +203,8 @@ static void engine_rename(struct intel_engine_cs *engine, const char *name, u16
 
 void intel_engines_driver_register(struct drm_i915_private *i915)
 {
-       u16 name_instance, other_instance = 0;
+       u16 class_instance[I915_LAST_UABI_ENGINE_CLASS + 2] = { };
+       u16 uabi_class, other_instance = 0;
        struct legacy_ring ring = {};
        struct list_head *it, *next;
        struct rb_node **p, *prev;
@@ -222,15 +223,14 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
 
                GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
                engine->uabi_class = uabi_classes[engine->class];
+
                if (engine->uabi_class == I915_NO_UABI_CLASS) {
-                       name_instance = other_instance++;
-               } else {
-                       GEM_BUG_ON(engine->uabi_class >=
-                                  ARRAY_SIZE(i915->engine_uabi_class_count));
-                       name_instance =
-                               i915->engine_uabi_class_count[engine->uabi_class]++;
-               }
-               engine->uabi_instance = name_instance;
+                       uabi_class = I915_LAST_UABI_ENGINE_CLASS + 1;
+               else
+                       uabi_class = engine->uabi_class;
+
+               GEM_BUG_ON(uabi_class >= ARRAY_SIZE(class_instance));
+               engine->uabi_instance = class_instance[uabi_class]++;
 
                /*
                 * Replace the internal name with the final user and log facing
@@ -238,11 +238,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
                 */
                engine_rename(engine,
                              intel_engine_class_repr(engine->class),
-                             name_instance);
+                             engine->uabi_instance);
 
-               if (engine->uabi_class == I915_NO_UABI_CLASS)
+               if (uabi_class == I915_NO_UABI_CLASS)
                        continue;
 
+               GEM_BUG_ON(uabi_class >=
+                          ARRAY_SIZE(i915->engine_uabi_class_count));
+               i915->engine_uabi_class_count[uabi_class]++;
+
                rb_link_node(&engine->uabi_node, prev, p);
                rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines

In any case, I'm working on a patch that is splitting this function in two parts and there is some refactoring happening here (for the first initialization and the dynamic update).

Please let me know if it's OK with you or you want me to fix it in this run.

Quoted 3 lines

And I wonder if
internally (in dmesg when engine name is logged) we don't end up with ccs0 ccs0 ccs0 ccs0.. for all instances.

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

I don't see this. Even in sysfs we see only one ccs. Where is it?

When you run this patch on something with two or more ccs-es, the "renamed ccs... to ccs.." debug logs do not all log the new name as ccs0?

it shouldn't, because the name_instance is anyway incremented normally... anyway, I will test it.

Hm maybe it needs more than two ccs engines and then it would be ccs0, ccs1, ccs2, ccs2, on a four ccs part. Or something.. It just feels the decrement of i915->engine_uabi_class_count, which engine_instance currently uses, has to mess this up somehow.

Regards,

Tvrtko

#10 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Quoted 100 lines · Tvrtko Ursulin
Quoted 46 lines · Andi Shyti

Hi Tvrtko,

Quoted 36 lines · Tvrtko Ursulin
Quoted 35 lines · Andi Shyti
Quoted 4 lines · Tvrtko Ursulin
Quoted 1 line · Andi Shyti

Enable only one CCS engine by default with all the compute sices

slices

Thanks!

Quoted 12 lines
Quoted 12 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +2 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct 
 drm_i915_private *i915)
             if (engine->uabi_class == I915_NO_UABI_CLASS)
                 continue;
+        /*
+         * Do not list and do not count CCS engines other than 

the first
+         */

Quoted 8 lines
Quoted 5 lines

+        if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE && +            engine->uabi_instance > 0) {
+            i915->engine_uabi_class_count[engine->uabi_class]--; +            continue;
+        }

It's a bit ugly to decrement after increment, instead of somehow restructuring the loop to satisfy both cases more elegantly.

yes, agree, indeed I had a hard time here to accept this change myself.

But moving the check above where the counter was incremented it would have been much uglier.

Quoted 6 lines
Quoted 1 line

This check looks ugly everywhere you place it :-)

One idea would be to introduce a separate local counter array for name_instance, so not use i915->engine_uabi_class_count[]. First one increments for every engine, second only for the exposed ones. That way feels wouldn't be too ugly.

Quoted 6 lines

Ah... you mean that whenever we change the CCS mode, we update the indexes of the exposed engines from list of the real engines. Will try.

My approach was to regenerate the list everytime the CCS mode was changed, but your suggestion looks a bit simplier.

No, I meant just for this first stage of permanently single engine. For avoiding the decrement after increment. Something like this, but not compile tested even:

drivers/gpu/drm/i915/gt/intel_engine_user.c +2 -1
index 833987015b8b..4c33f30612c4 100644
@@ -203,7 +203,8 @@ static void engine_rename(struct intel_engine_cs 
 *engine, const char *name, u16
 
  void intel_engines_driver_register(struct drm_i915_private *i915)
  {
-       u16 name_instance, other_instance = 0;
+       u16 class_instance[I915_LAST_UABI_ENGINE_CLASS + 2] = { };
+       u16 uabi_class, other_instance = 0;
         struct legacy_ring ring = {};
         struct list_head *it, *next;

        struct rb_node **p, *prev;

drivers/gpu/drm/i915/gt/intel_engine_user.c +7 -8
@@ -222,15 +223,14 @@ void intel_engines_driver_register(struct 
 drm_i915_private *i915)
 
                 GEM_BUG_ON(engine->class >= ARRAY_SIZE(uabi_classes));
                 engine->uabi_class = uabi_classes[engine->class];
+
                 if (engine->uabi_class == I915_NO_UABI_CLASS) {
-                       name_instance = other_instance++;
-               } else {
-                       GEM_BUG_ON(engine->uabi_class >=
-                                  
 ARRAY_SIZE(i915->engine_uabi_class_count));
-                       name_instance =
-                               
 i915->engine_uabi_class_count[engine->uabi_class]++;
-               }
-               engine->uabi_instance = name_instance;
+                       uabi_class = I915_LAST_UABI_ENGINE_CLASS + 1;
+               else
+                       uabi_class = engine->uabi_class;
+
+               GEM_BUG_ON(uabi_class >= ARRAY_SIZE(class_instance));
+               engine->uabi_instance = class_instance[uabi_class]++;

                /*
                 * Replace the internal name with the final user and
log facing

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct · line 245

Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +2 -2
@@ -238,11 +238,15 @@ void intel_engines_driver_register(struct 
 drm_i915_private *i915)
                  */
                 engine_rename(engine,
                               intel_engine_class_repr(engine->class),
-                             name_instance);
+                             engine->uabi_instance);
 
-               if (engine->uabi_class == I915_NO_UABI_CLASS)
+               if (uabi_class == I915_NO_UABI_CLASS)
                         continue;

Here you just add the ccs skip condition.

Anyway.. I rushed it a bit so see what you think.

Regards,

Tvrtko

Quoted 33 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +4 -0
+               GEM_BUG_ON(uabi_class >=
+                          ARRAY_SIZE(i915->engine_uabi_class_count));
+               i915->engine_uabi_class_count[uabi_class]++;
+
                 rb_link_node(&engine->uabi_node, prev, p);
                 rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
Quoted 12 lines
Quoted 12 lines
Quoted 12 lines

In any case, I'm working on a patch that is splitting this function in two parts and there is some refactoring happening here (for the first initialization and the dynamic update).

Please let me know if it's OK with you or you want me to fix it in this run.

Quoted 3 lines

And I wonder if
internally (in dmesg when engine name is logged) we don't end up with ccs0 ccs0 ccs0 ccs0.. for all instances.

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

I don't see this. Even in sysfs we see only one ccs. Where is it?

When you run this patch on something with two or more ccs-es, the "renamed ccs... to ccs.." debug logs do not all log the new name as ccs0?

it shouldn't, because the name_instance is anyway incremented normally... anyway, I will test it.

Hm maybe it needs more than two ccs engines and then it would be ccs0, ccs1, ccs2, ccs2, on a four ccs part. Or something.. It just feels the decrement of i915->engine_uabi_class_count, which engine_instance currently uses, has to mess this up somehow.

Regards,

Tvrtko

#11 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

In reply to Andi Shyti
Quoted 28 lines · Andi Shyti

Enable only one CCS engine by default with all the compute sices allocated to it.

While generating the list of UABI engines to be exposed to the user, exclude any additional CCS engines beyond the first instance.

This change can be tested with igt i915_query.

Fixes d2eae8e98d59 ("drm/i915/dg2: Drop force_probe requirement")
Cc Chris Wilson <[email protected]>
Cc Joonas Lahtinen <[email protected]>
Cc Matt Roper <[email protected]>
Cc <[email protected]> # v6.2+
---
 drivers/gpu/drm/i915/gt/intel_engine_user.c |  9 +++++++++
 drivers/gpu/drm/i915/gt/intel_gt.c          | 11 +++++++++++
 drivers/gpu/drm/i915/gt/intel_gt_regs.h     |  2 ++
 drivers/gpu/drm/i915/i915_query.c           |  1 +
 4 files changed, 23 insertions(+)
drivers/gpu/drm/i915/gt/intel_engine_user.c +0 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
 		if (engine->uabi_class == I915_NO_UABI_CLASS)

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +8 -0
 			continue;
 
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

Wouldn't it be simpler to just add a workaround to the end of engine_mask_apply_compute_fuses() if we want to ensure only a single compute engine gets exposed? Then both the driver internals and uapi will agree that's there's just one CCS (and on which one there is).

If we want to do something fancy with "hotplugging" a new engine later on or whatever, that can be handled in the future series (although as noted on the previous patch, it sounds like these changes might not actually be aligned with the workaround we were trying to address).

Quoted 9 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -0
+
 		rb_link_node(&engine->uabi_node, prev, p);
 		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
drivers/gpu/drm/i915/gt/intel_gt.c +0 -0
index a425db5ed3a2..e19df4ef47f6 100644

drivers/gpu/drm/i915/gt/intel_gt.c static void init_unused_rings(struct intel_gt *gt) · line 176

Quoted 9 lines
drivers/gpu/drm/i915/gt/intel_gt.c +6 -0
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
 	}
 }
 
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);

This doesn't look right to me. A value of 0 means every cslice gets associated with CCS0. On a DG2-G11 platform, that will flat out break compute since CCS0 is never present (G11 only has a single CCS and it's always the hardware's CCS1). Even on a G10 or G12 this could also break things depending on the fusing of your card if the hardware CCS0 happens to be missing.

Also, the register says that we need a field value of 0x7 for each cslice that's fused off. By passing 0, we're telling the CCS engine that it can use cslices that may not actually exist.

Quoted 20 lines
drivers/gpu/drm/i915/gt/intel_gt.c +5 -0
+}
+
 int intel_gt_init_hw(struct intel_gt *gt)
 {
 	struct drm_i915_private *i915 = gt->i915;
@@ -195,6 +203,9 @@ int intel_gt_init_hw(struct intel_gt *gt)
 
 	intel_gt_init_swizzling(gt);
 
+	/* Configure CCS mode */
+	intel_gt_apply_ccs_mode(gt);
+
 	/*
 	 * At least 830 can leave some of the unused rings
 	 * "active" (ie. head != tail) after resume which
drivers/gpu/drm/i915/gt/intel_gt_regs.h +0 -0
index cf709f6c05ae..c148113770ea 100644

drivers/gpu/drm/i915/gt/intel_gt_regs.h line 1608

Quoted 4 lines
drivers/gpu/drm/i915/gt/intel_gt_regs.h +1 -0
@@ -1605,6 +1605,8 @@
 #define   GEN12_VOLTAGE_MASK			REG_GENMASK(10, 0)
 #define   GEN12_CAGF_MASK			REG_GENMASK(19, 11)
 
+#define XEHP_CCS_MODE                          _MMIO(0x14804)

Nitpick: this doesn't seem to be in the proper place and also breaks the file's convention of using tabs to move over to column 48 for the definition value.

Matt

Quoted 19 lines
drivers/gpu/drm/i915/gt/intel_gt_regs.h +1 -0
+
 #define GEN11_GT_INTR_DW(x)			_MMIO(0x190018 + ((x) * 4))
 #define   GEN11_CSME				(31)
 #define   GEN12_HECI_2				(30)
drivers/gpu/drm/i915/i915_query.c +1 -0
index 3baa2f54a86e..d5a5143971f5 100644
@@ -124,6 +124,7 @@ static int query_geometry_subslices(struct drm_i915_private *i915,
 	return fill_topology_info(sseu, query_item, sseu->geometry_subslice_mask);
 }
 
+
 static int
 query_engine_info(struct drm_i915_private *i915,
 		  struct drm_i915_query_item *query_item)
Signature · 1 line
2.43.0
Signature · 4 lines
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
author
#12 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Hi Matt,

thanks a lot for looking into this.

Quoted 1 line · Matt Roper

On Tue, Feb 20, 2024 at 03:35:26PM +0100, Andi Shyti wrote:

[...]

Quoted 22 lines
Quoted 6 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +0 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
 		if (engine->uabi_class == I915_NO_UABI_CLASS)

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +8 -0
 			continue;
 
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

Wouldn't it be simpler to just add a workaround to the end of engine_mask_apply_compute_fuses() if we want to ensure only a single compute engine gets exposed? Then both the driver internals and uapi will agree that's there's just one CCS (and on which one there is).

Quoted 4 lines

If we want to do something fancy with "hotplugging" a new engine later on or whatever, that can be handled in the future series (although as noted on the previous patch, it sounds like these changes might not actually be aligned with the workaround we were trying to address).

The hotplugging capability is one of the features I was looking for, actually.

I have done some more refactoring in this piece of code in upcoming patches.

Will check, though, if I can do something with compute_fuses(), even though, the other cslices are not really fused off (read below).

Quoted 12 lines
Quoted 12 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -0
+
 		rb_link_node(&engine->uabi_node, prev, p);
 		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
drivers/gpu/drm/i915/gt/intel_gt.c +0 -0
index a425db5ed3a2..e19df4ef47f6 100644
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
 	}
 }
 
Quoted 9 lines

drivers/gpu/drm/i915/gt/intel_gt.c static void init_unused_rings(struct intel_gt *gt) · line 176

Quoted 6 lines
drivers/gpu/drm/i915/gt/intel_gt.c +6 -0
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);

This doesn't look right to me. A value of 0 means every cslice gets associated with CCS0.

Yes, that's what I'm trying to do. The behavior I'm looking for is this one:

/*
...
* With 1 engine (ccs0):
* slice 0, 1, 2, 3: ccs0
*
* With 2 engines (ccs0, ccs1):
* slice 0, 2: ccs0
* slice 1, 3: ccs1
*
* With 4 engines (ccs0, ccs1, ccs2, ccs3):
* slice 0: ccs0
* slice 1: ccs1
* slice 2: ccs2
* slice 3: ccs3
...
*/

where the user can configure runtime the mode, making sure that no client is connected to i915.

But, this needs to be written

As we are now forcing mode '1', then all cslices are connected with ccs0.

Quoted 9 lines

On a DG2-G11 platform, that will flat out break
compute since CCS0 is never present (G11 only has a single CCS and it's always the hardware's CCS1). Even on a G10 or G12 this could also break things depending on the fusing of your card if the hardware CCS0 happens to be missing.

Also, the register says that we need a field value of 0x7 for each cslice that's fused off. By passing 0, we're telling the CCS engine that it can use cslices that may not actually exist.

does it? Or do I need to write the id (0x0-0x3) of the user engine? That's how the mode is calculated in this algorithm.

Quoted 2 lines
Quoted 2 lines
drivers/gpu/drm/i915/gt/intel_gt.c +2 -0
+}
+

[...]

Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/gt/intel_gt_regs.h +0 -0
index cf709f6c05ae..c148113770ea 100644
@@ -1605,6 +1605,8 @@
 #define   GEN12_VOLTAGE_MASK			REG_GENMASK(10, 0)
 #define   GEN12_CAGF_MASK			REG_GENMASK(19, 11)
 
Quoted 5 lines

drivers/gpu/drm/i915/gt/intel_gt_regs.h line 1608

Quoted 1 line
drivers/gpu/drm/i915/gt/intel_gt_regs.h +1 -0
+#define XEHP_CCS_MODE                          _MMIO(0x14804)

Nitpick: this doesn't seem to be in the proper place and also breaks the file's convention of using tabs to move over to column 48 for the definition value.

This was something I actually forgot to fix. Thanks!

#13 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Quoted 88 lines · Andi Shyti

Hi Matt,

thanks a lot for looking into this.

Quoted 1 line · Matt Roper

On Tue, Feb 20, 2024 at 03:35:26PM +0100, Andi Shyti wrote:

[...]

Quoted 22 lines
Quoted 6 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +0 -0
index 833987015b8b..7041acc77810 100644
@@ -243,6 +243,15 @@ void intel_engines_driver_register(struct drm_i915_private *i915)
 		if (engine->uabi_class == I915_NO_UABI_CLASS)

drivers/gpu/drm/i915/gt/intel_engine_user.c void intel_engines_driver_register(struct drm_i915_private *i915) · line 253

Quoted 10 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +8 -0
 			continue;
 
+		/*
+		 * Do not list and do not count CCS engines other than the first
+		 */
+		if (engine->uabi_class == I915_ENGINE_CLASS_COMPUTE &&
+		    engine->uabi_instance > 0) {
+			i915->engine_uabi_class_count[engine->uabi_class]--;
+			continue;
+		}

Wouldn't it be simpler to just add a workaround to the end of engine_mask_apply_compute_fuses() if we want to ensure only a single compute engine gets exposed? Then both the driver internals and uapi will agree that's there's just one CCS (and on which one there is).

Quoted 4 lines

If we want to do something fancy with "hotplugging" a new engine later on or whatever, that can be handled in the future series (although as noted on the previous patch, it sounds like these changes might not actually be aligned with the workaround we were trying to address).

The hotplugging capability is one of the features I was looking for, actually.

I have done some more refactoring in this piece of code in upcoming patches.

Will check, though, if I can do something with compute_fuses(), even though, the other cslices are not really fused off (read below).

Quoted 12 lines
Quoted 12 lines
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -0
+
 		rb_link_node(&engine->uabi_node, prev, p);
 		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
 
drivers/gpu/drm/i915/gt/intel_gt.c +0 -0
index a425db5ed3a2..e19df4ef47f6 100644
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
 	}
 }
 
Quoted 9 lines

drivers/gpu/drm/i915/gt/intel_gt.c static void init_unused_rings(struct intel_gt *gt) · line 176

Quoted 6 lines
drivers/gpu/drm/i915/gt/intel_gt.c +6 -0
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);

This doesn't look right to me. A value of 0 means every cslice gets associated with CCS0.

Yes, that's what I'm trying to do. The behavior I'm looking for is this one:

/*
...
* With 1 engine (ccs0):
* slice 0, 1, 2, 3: ccs0
*
* With 2 engines (ccs0, ccs1):
* slice 0, 2: ccs0
* slice 1, 3: ccs1
*
* With 4 engines (ccs0, ccs1, ccs2, ccs3):
* slice 0: ccs0
* slice 1: ccs1
* slice 2: ccs2
* slice 3: ccs3
...
*/

Quoted 7 lines

where the user can configure runtime the mode, making sure that no client is connected to i915.

But, this needs to be written

As we are now forcing mode '1', then all cslices are connected with ccs0.

Right --- and that's what I'm pointing out as illegal. I think that code comment above was taken out of context from a different RFC series; that's not an accurate description of the behavior we want here.

First, the above comment is using ccs# to refer to userspace engines, not hardware engines. As a simple example, DG2-G11 only ever has a single CCS which userspace sees as "instance 0" but which is actually CCS1 at the hardware level. If you try to follow the comment above when programming CCS_MODE, you've assigned all of the cslices to a non-existent engine and assigned no cslices to the CCS engine that actually exists. For DG2-G10 (and I think DG2-G12), there are different combinations of fused-off / not-fused-off engines that will always show up in userspace as CCS0-CCSn, even if those don't match the hardware IDs.

Second, the above comment is assuming that you have a part with a maximum fusing config (i.e., all cslices present). Using DG2-G11 again as an example, there's also only a single cslice (cslice1), so if you tell CCS1 that it's allowed to use EUs from non-existent cslice0, cslice2, and cslice3, you might not get the behavior you were hoping for.

Quoted 7 lines
Quoted 7 lines

On a DG2-G11 platform, that will flat out break
compute since CCS0 is never present (G11 only has a single CCS and it's always the hardware's CCS1). Even on a G10 or G12 this could also break things depending on the fusing of your card if the hardware CCS0 happens to be missing.

Quoted 6 lines
Quoted 3 lines

Also, the register says that we need a field value of 0x7 for each cslice that's fused off. By passing 0, we're telling the CCS engine that it can use cslices that may not actually exist.

does it? Or do I need to write the id (0x0-0x3) of the user engine? That's how the mode is calculated in this algorithm.

0x0 - 0x3 are how you specify that a specific CCS engine can use the cslice. If the cslice can't be used at all (i.e., it's fused off), then you need to program a 0x7 to ensure no engines try to use the non-existent DSS/EUs.

Matt

Quoted 21 lines
Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/i915/gt/intel_gt.c +2 -0
+}
+

[...]

Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/gt/intel_gt_regs.h +0 -0
index cf709f6c05ae..c148113770ea 100644
@@ -1605,6 +1605,8 @@
 #define   GEN12_VOLTAGE_MASK			REG_GENMASK(10, 0)
 #define   GEN12_CAGF_MASK			REG_GENMASK(19, 11)
 
Quoted 5 lines

drivers/gpu/drm/i915/gt/intel_gt_regs.h line 1608

Quoted 1 line
drivers/gpu/drm/i915/gt/intel_gt_regs.h +1 -0
+#define XEHP_CCS_MODE                          _MMIO(0x14804)

Nitpick: this doesn't seem to be in the proper place and also breaks the file's convention of using tabs to move over to column 48 for the definition value.

This was something I actually forgot to fix. Thanks!

Signature · 4 lines
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
author
#14 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Hi Matt,

first of all thanks a lot for the observations you are raising.

Quoted 3 lines · Matt Roper
Quoted 2 lines · Andi Shyti
Quoted 1 line · Matt Roper

On Tue, Feb 20, 2024 at 03:35:26PM +0100, Andi Shyti wrote:

...

Quoted 61 lines
Quoted 38 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/gt/intel_gt.c +0 -0
index a425db5ed3a2..e19df4ef47f6 100644
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
 	}
 }
 
Quoted 9 lines

drivers/gpu/drm/i915/gt/intel_gt.c static void init_unused_rings(struct intel_gt *gt) · line 176

Quoted 6 lines
drivers/gpu/drm/i915/gt/intel_gt.c +6 -0
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);

This doesn't look right to me. A value of 0 means every cslice gets associated with CCS0.

Yes, that's what I'm trying to do. The behavior I'm looking for is this one:

/*
...
* With 1 engine (ccs0):
* slice 0, 1, 2, 3: ccs0
*
* With 2 engines (ccs0, ccs1):
* slice 0, 2: ccs0
* slice 1, 3: ccs1
*
* With 4 engines (ccs0, ccs1, ccs2, ccs3):
* slice 0: ccs0
* slice 1: ccs1
* slice 2: ccs2
* slice 3: ccs3
...
*/

Quoted 7 lines

where the user can configure runtime the mode, making sure that no client is connected to i915.

But, this needs to be written

As we are now forcing mode '1', then all cslices are connected with ccs0.

Right --- and that's what I'm pointing out as illegal. I think that code comment above was taken out of context from a different RFC series; that's not an accurate description of the behavior we want here.

First, the above comment is using ccs# to refer to userspace engines, not hardware engines. As a simple example, DG2-G11 only ever has a single CCS which userspace sees as "instance 0" but which is actually CCS1 at the hardware level. If you try to follow the comment above when programming CCS_MODE, you've assigned all of the cslices to a non-existent engine and assigned no cslices to the CCS engine that actually exists. For DG2-G10 (and I think DG2-G12), there are different combinations of fused-off / not-fused-off engines that will always show up in userspace as CCS0-CCSn, even if those don't match the hardware IDs.

Quoted 6 lines

Second, the above comment is assuming that you have a part with a maximum fusing config (i.e., all cslices present). Using DG2-G11 again as an example, there's also only a single cslice (cslice1), so if you tell CCS1 that it's allowed to use EUs from non-existent cslice0, cslice2, and cslice3, you might not get the behavior you were hoping for.

if the hardware slices are fused off we wouldn't see them in a first place, right? And that's anyway a permanent configuration that wouldn't affect the patch.

BTW, is there any machine I can test this scenario?

Quoted 10 lines
Quoted 10 lines
Quoted 9 lines

On a DG2-G11 platform, that will flat out break
compute since CCS0 is never present (G11 only has a single CCS and it's always the hardware's CCS1). Even on a G10 or G12 this could also break things depending on the fusing of your card if the hardware CCS0 happens to be missing.

Also, the register says that we need a field value of 0x7 for each cslice that's fused off. By passing 0, we're telling the CCS engine that it can use cslices that may not actually exist.

Quoted 7 lines
Quoted 2 lines

does it? Or do I need to write the id (0x0-0x3) of the user engine? That's how the mode is calculated in this algorithm.

0x0 - 0x3 are how you specify that a specific CCS engine can use the cslice. If the cslice can't be used at all (i.e., it's fused off), then you need to program a 0x7 to ensure no engines try to use the non-existent DSS/EUs.

I planned to limit this to the only DG2 (and ATSM, of course). Do you think it would it help?

Andi

#15 lore raw

Re: [PATCH v2 2/2] drm/i915/gt: Enable only one CCS for compute workload

Quoted 79 lines · Andi Shyti

Hi Matt,

first of all thanks a lot for the observations you are raising.

Quoted 3 lines · Matt Roper
Quoted 2 lines · Andi Shyti
Quoted 1 line · Matt Roper

On Tue, Feb 20, 2024 at 03:35:26PM +0100, Andi Shyti wrote:

...

Quoted 61 lines
Quoted 38 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/gt/intel_gt.c +0 -0
index a425db5ed3a2..e19df4ef47f6 100644
@@ -168,6 +168,14 @@ static void init_unused_rings(struct intel_gt *gt)
 	}
 }
 
Quoted 9 lines

drivers/gpu/drm/i915/gt/intel_gt.c static void init_unused_rings(struct intel_gt *gt) · line 176

Quoted 6 lines
drivers/gpu/drm/i915/gt/intel_gt.c +6 -0
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
+{
+	if (!IS_DG2(gt->i915))
+		return;
+
+	intel_uncore_write(gt->uncore, XEHP_CCS_MODE, 0);

This doesn't look right to me. A value of 0 means every cslice gets associated with CCS0.

Yes, that's what I'm trying to do. The behavior I'm looking for is this one:

/*
...
* With 1 engine (ccs0):
* slice 0, 1, 2, 3: ccs0
*
* With 2 engines (ccs0, ccs1):
* slice 0, 2: ccs0
* slice 1, 3: ccs1
*
* With 4 engines (ccs0, ccs1, ccs2, ccs3):
* slice 0: ccs0
* slice 1: ccs1
* slice 2: ccs2
* slice 3: ccs3
...
*/

Quoted 7 lines

where the user can configure runtime the mode, making sure that no client is connected to i915.

But, this needs to be written

As we are now forcing mode '1', then all cslices are connected with ccs0.

Right --- and that's what I'm pointing out as illegal. I think that code comment above was taken out of context from a different RFC series; that's not an accurate description of the behavior we want here.

First, the above comment is using ccs# to refer to userspace engines, not hardware engines. As a simple example, DG2-G11 only ever has a single CCS which userspace sees as "instance 0" but which is actually CCS1 at the hardware level. If you try to follow the comment above when programming CCS_MODE, you've assigned all of the cslices to a non-existent engine and assigned no cslices to the CCS engine that actually exists. For DG2-G10 (and I think DG2-G12), there are different combinations of fused-off / not-fused-off engines that will always show up in userspace as CCS0-CCSn, even if those don't match the hardware IDs.

Quoted 6 lines

Second, the above comment is assuming that you have a part with a maximum fusing config (i.e., all cslices present). Using DG2-G11 again as an example, there's also only a single cslice (cslice1), so if you tell CCS1 that it's allowed to use EUs from non-existent cslice0, cslice2, and cslice3, you might not get the behavior you were hoping for.

Quoted 3 lines

if the hardware slices are fused off we wouldn't see them in a first place, right? And that's anyway a permanent configuration that wouldn't affect the patch.

There are physically four possible cslices in the IP design. The presence/absence of each of those cslices can vary both by SKU and by part-specific fusing. Some SKUs (DG2-G11) wind up only ever having a single possible configuration as far as I know, but the larger SKUs have more part-to-part variation in terms of exactly which specific subset of DSS (and by extension cslices) are present/absent. The KMD determines the configuration at runtime by reading the DSS fuse registers and deriving the cslice presence/absence from that.

The register you're writing in this patch tells the CCS engine which cslice(s) it can use to execute work. If the KMD already knows that cslice<x> doesn't exist, but it tells CCS<y> that it can go ahead and use it anyway, things probably won't work properly. That's why the spec mandates that we always program 0x7 in the register for any cslices that we know aren't present so that none of the CCS engines will incorrectly try to utilize them. If we ignore that rule, then it's a driver bug.

Quoted 2 lines

BTW, is there any machine I can test this scenario?

There should differently-fused DG2 systems in our internal pool, although I'm not sure what the breakdown is. I don't think the reservation system makes the low-level cslice configuration immediately obvious on the summary page, so you might just need to log into a few systems and read the fuse registers to check which ones are best for testing these cases.

Quoted 14 lines
Quoted 14 lines
Quoted 13 lines
Quoted 10 lines

On a DG2-G11 platform, that will flat out break
compute since CCS0 is never present (G11 only has a single CCS and it's always the hardware's CCS1). Even on a G10 or G12 this could also break things depending on the fusing of your card if the hardware CCS0 happens to be missing.

Also, the register says that we need a field value of 0x7 for each cslice that's fused off. By passing 0, we're telling the CCS engine that it can use cslices that may not actually exist.

does it? Or do I need to write the id (0x0-0x3) of the user engine? That's how the mode is calculated in this algorithm.

Quoted 7 lines
Quoted 4 lines

0x0 - 0x3 are how you specify that a specific CCS engine can use the cslice. If the cslice can't be used at all (i.e., it's fused off), then you need to program a 0x7 to ensure no engines try to use the non-existent DSS/EUs.

I planned to limit this to the only DG2 (and ATSM, of course). Do you think it would it help?

Yes, definitely. It's mandatory programming for these platforms.

Matt

Quoted 2 lines

Andi

Signature · 4 lines
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
#16 lore raw

✗ Fi.CI.CHECKPATCH: warning for Disable automatic load CCS load balancing (rev3)

In reply to Andi Shyti
== Series Details ==

== Series Details ==

Series: Disable automatic load CCS load balancing (rev3)
URL : https://patchwork.freedesktop.org/series/129951/
State : warning

== Summary ==

Error: dim checkpatch failed
c2b6f7fef25d drm/i915/gt: Disable HW load balancing for CCS 63fd178cadec drm/i915/gt: Enable only one CCS for compute workload -:92: CHECK:LINE_SPACING: Please don't use multiple blank lines #92: FILE: drivers/gpu/drm/i915/i915_query.c:127:

+

total: 0 errors, 0 warnings, 1 checks, 53 lines checked

#17 lore raw

✗ Fi.CI.BAT: failure for Disable automatic load CCS load balancing (rev3)

In reply to Andi Shyti
== Series Details ==

== Series Details ==

Series: Disable automatic load CCS load balancing (rev3)
URL : https://patchwork.freedesktop.org/series/129951/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_14300 -> Patchwork_129951v3
====================================================

Summary
-------

**FAILURE**

Serious unknown changes coming with Patchwork_129951v3 absolutely need to be verified manually.

If you think the reported changes have nothing to do with the changes
introduced in Patchwork_129951v3, please notify your bug team ([email protected]) to allow them to document this new failure mode, which will reduce false positives in CI.

External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/index.html

Participating hosts (40 -> 40)
------------------------------

Additional (1): bat-arls-3
Missing (1): fi-snb-2520m

Possible new issues
-------------------

Here are the unknown changes that may have been introduced in Patchwork_129951v3:

### IGT changes ###

#### Possible regressions ####

* igt@i915_module_load@load:
- fi-bsw-n3050: [PASS][1] -> [ABORT][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-bsw-n3050/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-bsw-n3050/igt@[email protected]
- fi-skl-6600u: [PASS][3] -> [ABORT][4]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-skl-6600u/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-skl-6600u/igt@[email protected]
- fi-apl-guc: NOTRUN -> [ABORT][5]
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-apl-guc/igt@[email protected]
- fi-glk-j4005: [PASS][6] -> [ABORT][7]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-glk-j4005/igt@[email protected]
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-glk-j4005/igt@[email protected]
- fi-skl-guc: [PASS][8] -> [ABORT][9]
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-skl-guc/igt@[email protected]
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-skl-guc/igt@[email protected]
- fi-kbl-7567u: [PASS][10] -> [ABORT][11]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-kbl-7567u/igt@[email protected]
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-kbl-7567u/igt@[email protected]
- fi-cfl-8700k: [PASS][12] -> [ABORT][13]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-cfl-8700k/igt@[email protected]
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-cfl-8700k/igt@[email protected]
- fi-bsw-nick: [PASS][14] -> [ABORT][15]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-bsw-nick/igt@[email protected]
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-bsw-nick/igt@[email protected]
- bat-kbl-2: [PASS][16] -> [ABORT][17]
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-kbl-2/igt@[email protected]
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-kbl-2/igt@[email protected]
- fi-cfl-guc: [PASS][18] -> [ABORT][19]
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-cfl-guc/igt@[email protected]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-cfl-guc/igt@[email protected]
- fi-kbl-x1275: [PASS][20] -> [ABORT][21]
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-kbl-x1275/igt@[email protected]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-kbl-x1275/igt@[email protected]
- fi-cfl-8109u: [PASS][22] -> [ABORT][23]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-cfl-8109u/igt@[email protected]
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-cfl-8109u/igt@[email protected]
- fi-ivb-3770: [PASS][24] -> [ABORT][25]
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-ivb-3770/igt@[email protected]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-ivb-3770/igt@[email protected]
- fi-kbl-guc: [PASS][26] -> [ABORT][27]
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-kbl-guc/igt@[email protected]
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-kbl-guc/igt@[email protected]

* igt@i915_selftest@live@client:
- fi-elk-e7500: [PASS][28] -> [DMESG-WARN][29] +42 other tests dmesg-warn
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-elk-e7500/igt@i915_selftest@[email protected]
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-elk-e7500/igt@i915_selftest@[email protected]

* igt@i915_selftest@live@coherency:
- bat-jsl-3: [PASS][30] -> [DMESG-WARN][31] +40 other tests dmesg-warn
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-jsl-3/igt@i915_selftest@[email protected]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-jsl-3/igt@i915_selftest@[email protected]

* igt@i915_selftest@live@gt_contexts:
- fi-ilk-650: [PASS][32] -> [DMESG-WARN][33] +42 other tests dmesg-warn
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-ilk-650/igt@i915_selftest@live@gt_contexts.html
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-ilk-650/igt@i915_selftest@live@gt_contexts.html

* igt@i915_selftest@live@gt_pm:
- bat-jsl-1: [PASS][34] -> [DMESG-WARN][35] +41 other tests dmesg-warn
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-jsl-1/igt@i915_selftest@live@gt_pm.html
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-jsl-1/igt@i915_selftest@live@gt_pm.html

* igt@i915_selftest@live@hangcheck:
- bat-atsm-1: [PASS][36] -> [DMESG-FAIL][37]
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-atsm-1/igt@i915_selftest@[email protected]
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-atsm-1/igt@i915_selftest@[email protected]
- bat-dg2-9: [PASS][38] -> [DMESG-FAIL][39]
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-dg2-9/igt@i915_selftest@[email protected]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-dg2-9/igt@i915_selftest@[email protected]
- bat-dg2-8: [PASS][40] -> [DMESG-FAIL][41]
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-dg2-8/igt@i915_selftest@[email protected]
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-dg2-8/igt@i915_selftest@[email protected]

#### Suppressed ####

The following results come from untrusted machines, tests, or statuses. They do not affect the overall result.

* igt@i915_selftest@live@gt_mocs:
- {bat-arls-2}: NOTRUN -> [INCOMPLETE][42]
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-arls-2/igt@i915_selftest@live@gt_mocs.html

* igt@i915_selftest@live@hangcheck:
- {bat-dg2-14}: [PASS][43] -> [DMESG-FAIL][44]
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-dg2-14/igt@i915_selftest@[email protected]
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-dg2-14/igt@i915_selftest@[email protected]

Known issues
------------

Here are the changes found in Patchwork_129951v3 that come from known issues:

### CI changes ###

#### Issues hit ####

* boot:
- fi-tgl-1115g4: [PASS][45] -> [FAIL][46] ([i915#8293])
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-tgl-1115g4/boot.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-tgl-1115g4/boot.html

#### Possible fixes ####

* boot:
- fi-apl-guc: [FAIL][47] ([i915#8293]) -> [PASS][48]
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/fi-apl-guc/boot.html
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/fi-apl-guc/boot.html

### IGT changes ###

#### Issues hit ####

* igt@i915_module_load@reload:
- bat-jsl-3: [PASS][49] -> [DMESG-WARN][50] ([i915#1982])
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-jsl-3/igt@[email protected]
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-jsl-3/igt@[email protected]

* igt@kms_pipe_crc_basic@nonblocking-crc:
- bat-dg2-11: NOTRUN -> [SKIP][51] ([i915#9197])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-dg2-11/igt@[email protected]

#### Possible fixes ####

* igt@gem_busy@busy@all-engines:
- {bat-arls-2}: [INCOMPLETE][52] ([i915#10194]) -> [PASS][53]
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-arls-2/igt@gem_busy@[email protected]
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-arls-2/igt@gem_busy@[email protected]

* igt@gem_exec_create@basic@smem:
- {bat-arls-1}: [DMESG-WARN][54] ([i915#10194]) -> [PASS][55]
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_14300/bat-arls-1/igt@gem_exec_create@[email protected]
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/bat-arls-1/igt@gem_exec_create@[email protected]

{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).

[i915#10194]: https://gitlab.freedesktop.org/drm/intel/issues/10194
[i915#10196]: https://gitlab.freedesktop.org/drm/intel/issues/10196
[i915#10197]: https://gitlab.freedesktop.org/drm/intel/issues/10197
[i915#10200]: https://gitlab.freedesktop.org/drm/intel/issues/10200
[i915#10202]: https://gitlab.freedesktop.org/drm/intel/issues/10202
[i915#10206]: https://gitlab.freedesktop.org/drm/intel/issues/10206
[i915#10207]: https://gitlab.freedesktop.org/drm/intel/issues/10207
[i915#10208]: https://gitlab.freedesktop.org/drm/intel/issues/10208
[i915#10209]: https://gitlab.freedesktop.org/drm/intel/issues/10209
[i915#10211]: https://gitlab.freedesktop.org/drm/intel/issues/10211
[i915#10212]: https://gitlab.freedesktop.org/drm/intel/issues/10212
[i915#10213]: https://gitlab.freedesktop.org/drm/intel/issues/10213
[i915#10214]: https://gitlab.freedesktop.org/drm/intel/issues/10214
[i915#10215]: https://gitlab.freedesktop.org/drm/intel/issues/10215
[i915#10216]: https://gitlab.freedesktop.org/drm/intel/issues/10216
[i915#10274]: https://gitlab.freedesktop.org/drm/intel/issues/10274
[i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
[i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
[i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
[i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
[i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
[i915#8293]: https://gitlab.freedesktop.org/drm/intel/issues/8293
[i915#8809]: https://gitlab.freedesktop.org/drm/intel/issues/8809
[i915#9197]: https://gitlab.freedesktop.org/drm/intel/issues/9197
[i915#9318]: https://gitlab.freedesktop.org/drm/intel/issues/9318
[i915#9688]: https://gitlab.freedesktop.org/drm/intel/issues/9688
[i915#9732]: https://gitlab.freedesktop.org/drm/intel/issues/9732
[i915#9812]: https://gitlab.freedesktop.org/drm/intel/issues/9812
[i915#9886]: https://gitlab.freedesktop.org/drm/intel/issues/9886

Build changes
-------------

* Linux: CI_DRM_14300 -> Patchwork_129951v3

CI-20190529: 20190529
CI_DRM_14300: e2b02e89746d8eff8c244f938eecd0f1db8eb805 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_7718: 40e8b9122853f455c84afcfa56469a6bc9a0d564 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_129951v3: e2b02e89746d8eff8c244f938eecd0f1db8eb805 @ git://anongit.freedesktop.org/gfx-ci/linux

### Linux commits

3f2d8335dd9c drm/i915/gt: Enable only one CCS for compute workload 48a58957fb31 drm/i915/gt: Disable HW load balancing for CCS

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_129951v3/index.html