[PATCH 10/11] drm/i915/gt: Implement creation and removal routines for CCS engines

Andi Shyti andi.shyti at linux.intel.com
Mon Aug 19 17:15:21 UTC 2024


In preparation for upcoming patches, we need routines to
dynamically create and destroy CCS engines based on the CCS mode
that the user wants to set.

The process begins by calculating the engine mask for the engines
that need to be added or removed. We then update the UABI list of
exposed engines and create or destroy the corresponding sysfs
interfaces accordingly.

These functions are not yet in use, so no functional changes are
intended at this stage.

Signed-off-by: Andi Shyti <andi.shyti at linux.intel.com>
---
 drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c | 76 +++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c b/drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c
index 66aa2ec82fec..a79a945e1515 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c
@@ -8,6 +8,7 @@
 #include "intel_gt_print.h"
 #include "intel_gt_regs.h"
 #include "intel_gt_sysfs.h"
+#include "sysfs_engines.h"
 
 static void intel_gt_apply_ccs_mode(struct intel_gt *gt)
 {
@@ -119,6 +120,81 @@ void intel_gt_ccs_mode_init(struct intel_gt *gt)
 	mutex_unlock(&gt->ccs.mutex);
 }
 
+static void add_uabi_ccs_engines(struct intel_gt *gt, u32 ccs_mode)
+{
+	struct drm_i915_private *i915 = gt->i915;
+	intel_engine_mask_t new_ccs_mask, tmp;
+	struct intel_engine_cs *engine;
+	struct rb_node **p, *prev;
+
+	/* Store the current ccs mask */
+	new_ccs_mask = gt->ccs.ccs_mask;
+	update_ccs_mask(gt, ccs_mode);
+
+	/*
+	 * Store only the mask of the CCS engines that need to be added by
+	 * removing from the new mask the engines that are already active
+	 */
+	new_ccs_mask = gt->ccs.ccs_mask & ~new_ccs_mask;
+	new_ccs_mask <<= CCS0;
+
+	/* Get to the last item of the list and insert the new engine. */
+	prev = NULL;
+	p = &i915->uabi_engines.rb_node;
+	for_each_uabi_engine(engine, i915) {
+		prev = &engine->uabi_node;
+		p = &prev->rb_right;
+	}
+
+	for_each_engine_masked(engine, gt, new_ccs_mask, tmp) {
+		int err;
+
+		i915->engine_uabi_class_count[I915_ENGINE_CLASS_COMPUTE]++;
+
+		rb_link_node(&engine->uabi_node, prev, p);
+		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
+
+		rb_link_node(&engine->uabi_node, prev, p);
+		rb_insert_color(&engine->uabi_node, &i915->uabi_engines);
+
+		prev = &engine->uabi_node;
+		p = &prev->rb_right;
+
+		err = intel_engine_add_single_sysfs(engine);
+		if (err)
+			gt_warn(gt,
+				"Unable to create sysfs entries for %s engine",
+				engine->name);
+	}
+}
+
+static void remove_uabi_ccs_engines(struct intel_gt *gt, u8 ccs_mode)
+{
+	struct drm_i915_private *i915 = gt->i915;
+	intel_engine_mask_t new_ccs_mask, tmp;
+	struct intel_engine_cs *engine;
+
+	/* Store the current ccs mask */
+	new_ccs_mask = gt->ccs.ccs_mask;
+	update_ccs_mask(gt, ccs_mode);
+
+	/*
+	 * Store only the mask of the CCS engines that need to be removed by
+	 * unmasking them from the new mask the engines that are already active
+	 */
+	new_ccs_mask = new_ccs_mask & ~gt->ccs.ccs_mask;
+	new_ccs_mask <<= CCS0;
+
+	for_each_engine_masked(engine, gt, new_ccs_mask, tmp) {
+		i915->engine_uabi_class_count[I915_ENGINE_CLASS_COMPUTE]--;
+
+		rb_erase(&engine->uabi_node, &i915->uabi_engines);
+		/* Remove sysfs entries */
+		kobject_put(engine->kobj_defaults);
+		kobject_put(engine->kobj);
+	}
+}
+
 static ssize_t num_cslices_show(struct device *dev,
 				struct device_attribute *attr,
 				char *buff)
-- 
2.45.2



More information about the Intel-gfx-trybot mailing list