[PATCH v9 2/8] drm/xe: Pass wa bb setup arguments in a struct

Tvrtko Ursulin tvrtko.ursulin at igalia.com
Wed Jul 9 10:54:49 UTC 2025


Group the function arguments in a struct for more readable code and easier
extending.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
Cc: Lucas De Marchi <lucas.demarchi at intel.com>
---
 drivers/gpu/drm/xe/xe_lrc.c | 91 +++++++++++++++++++++----------------
 1 file changed, 52 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index 2385e22437b3..578bef1e8140 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -977,32 +977,39 @@ struct bo_setup {
 			 u32 *batch, size_t max_size);
 };
 
-static u32 *setup_bo(struct xe_lrc *lrc,
-		     struct xe_hw_engine *hwe,
-		     const size_t max_size,
-		     unsigned int offset,
-		     const struct bo_setup *funcs,
-		     unsigned int num_funcs,
-		     u32 **free)
+struct bo_setup_state {
+	/* Input: */
+	struct xe_lrc 		*lrc;
+	struct xe_hw_engine	*hwe;
+	size_t			max_size;
+	unsigned		offset;
+	const struct bo_setup	*funcs;
+	unsigned		num_funcs;
+
+	/* State: */
+	u32			*buffer;
+	u32			*ptr;
+};
+
+static int setup_bo(struct bo_setup_state *state)
 {
-	u32 *cmd, *buf = NULL;
 	ssize_t remain;
 
-	if (lrc->bo->vmap.is_iomem) {
-		buf = kmalloc(max_size, GFP_KERNEL);
-		if (!buf)
-			return ERR_PTR(-ENOMEM);
-		cmd = buf;
-		*free = buf;
+	if (state->lrc->bo->vmap.is_iomem) {
+		state->buffer = kmalloc(state->max_size, GFP_KERNEL);
+		if (!state->buffer)
+			return -ENOMEM;
+		state->ptr = state->buffer;
 	} else {
-		cmd = lrc->bo->vmap.vaddr + offset;
-		*free = NULL;
+		state->ptr = state->lrc->bo->vmap.vaddr + state->offset;
+		state->buffer = NULL;
 	}
 
-	remain = max_size / sizeof(*cmd);
+	remain = state->max_size / sizeof(u32);
 
-	for (size_t i = 0; i < num_funcs; i++) {
-		ssize_t len = funcs[i].setup(lrc, hwe, cmd, remain);
+	for (size_t i = 0; i < state->num_funcs; i++) {
+		ssize_t len = state->funcs[i].setup(state->lrc, state->hwe,
+						    state->ptr, remain);
 
 		remain -= len;
 
@@ -1010,28 +1017,28 @@ static u32 *setup_bo(struct xe_lrc *lrc,
 		 * There should always be at least 1 additional dword for
 		 * the end marker
 		 */
-		if (len < 0 || xe_gt_WARN_ON(lrc->gt, remain < 1))
+		if (len < 0 || xe_gt_WARN_ON(state->lrc->gt, remain < 1))
 			goto fail;
 
-		cmd += len;
+		state->ptr += len;
 	}
 
-	return cmd;
+	return 0;
 
 fail:
-	kfree(buf);
-	return ERR_PTR(-ENOSPC);
+	kfree(state->buffer);
+	return -ENOSPC;
 }
 
-static void finish_bo(struct xe_lrc *lrc, unsigned int offset, u32 *cmd,
-		      u32 *free)
+static void finish_bo(struct bo_setup_state *state)
 {
-	if (!free)
+	if (!state->buffer)
 		return;
 
-	xe_map_memcpy_to(gt_to_xe(lrc->gt), &lrc->bo->vmap, offset, free,
-			 (cmd - free) * sizeof(*cmd));
-	kfree(free);
+	xe_map_memcpy_to(gt_to_xe(state->lrc->gt), &state->lrc->bo->vmap,
+			 state->offset, state->buffer,
+			 (state->ptr - state->buffer) * sizeof(u32));
+	kfree(state->buffer);
 }
 
 static int setup_wa_bb(struct xe_lrc *lrc, struct xe_hw_engine *hwe)
@@ -1039,20 +1046,26 @@ static int setup_wa_bb(struct xe_lrc *lrc, struct xe_hw_engine *hwe)
 	static const struct bo_setup funcs[] = {
 		{ .setup = wa_bb_setup_utilization },
 	};
-	unsigned int offset = __xe_lrc_wa_bb_offset(lrc);
-	u32 *cmd, *buf = NULL;
+	struct bo_setup_state state = {
+		.lrc = lrc,
+		.hwe = hwe,
+		.max_size = LRC_WA_BB_SIZE,
+		.offset = __xe_lrc_wa_bb_offset(lrc),
+		.funcs = funcs,
+		.num_funcs = ARRAY_SIZE(funcs),
+	};
+	int ret;
 
-	cmd = setup_bo(lrc, hwe, LRC_WA_BB_SIZE, offset, funcs,
-		       ARRAY_SIZE(funcs), &buf);
-	if (IS_ERR(cmd))
-		return PTR_ERR(cmd);
+	ret = setup_bo(&state);
+	if (ret)
+		return ret;
 
-	*cmd++ = MI_BATCH_BUFFER_END;
+	*state.ptr++ = MI_BATCH_BUFFER_END;
 
-	finish_bo(lrc, offset, cmd, buf);
+	finish_bo(&state);
 
 	xe_lrc_write_ctx_reg(lrc, CTX_BB_PER_CTX_PTR,
-			     xe_bo_ggtt_addr(lrc->bo) + offset + 1);
+			     xe_bo_ggtt_addr(lrc->bo) + state.offset + 1);
 
 	return 0;
 }
-- 
2.48.0



More information about the Intel-xe mailing list