Unverified Commit aeb4ae66 authored by Ilia Levi's avatar Ilia Levi Committed by Rodrigo Vivi
Browse files

drm/xe: move the kernel lrc from hwe to execlist port



The kernel lrc is used solely by the execlist infra.
Move it to the execlist port struct and initialize it only when
execlists are used.

v2: Rebase, improve error handling readability (Jonathan)

Signed-off-by: default avatarIlia Levi <ilia.levi@intel.com>
Reviewed-by: default avatarJonathan Cavitt <jonathan.cavitt@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240826100655.1719060-1-ilia.levi@intel.com


Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 3adcf970
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -123,8 +123,8 @@ static void __xe_execlist_port_idle(struct xe_execlist_port *port)
	if (!port->running_exl)
		return;

	xe_lrc_write_ring(port->hwe->kernel_lrc, noop, sizeof(noop));
	__start_lrc(port->hwe, port->hwe->kernel_lrc, 0);
	xe_lrc_write_ring(port->lrc, noop, sizeof(noop));
	__start_lrc(port->hwe, port->lrc, 0);
	port->running_exl = NULL;
}

@@ -254,14 +254,22 @@ struct xe_execlist_port *xe_execlist_port_create(struct xe_device *xe,
{
	struct drm_device *drm = &xe->drm;
	struct xe_execlist_port *port;
	int i;
	int i, err;

	port = drmm_kzalloc(drm, sizeof(*port), GFP_KERNEL);
	if (!port)
		return ERR_PTR(-ENOMEM);
	if (!port) {
		err = -ENOMEM;
		goto err;
	}

	port->hwe = hwe;

	port->lrc = xe_lrc_create(hwe, NULL, SZ_16K);
	if (IS_ERR(port->lrc)) {
		err = PTR_ERR(port->lrc);
		goto err;
	}

	spin_lock_init(&port->lock);
	for (i = 0; i < ARRAY_SIZE(port->active); i++)
		INIT_LIST_HEAD(&port->active[i]);
@@ -277,6 +285,9 @@ struct xe_execlist_port *xe_execlist_port_create(struct xe_device *xe,
	add_timer(&port->irq_fail);

	return port;

err:
	return ERR_PTR(err);
}

void xe_execlist_port_destroy(struct xe_execlist_port *port)
@@ -287,6 +298,8 @@ void xe_execlist_port_destroy(struct xe_execlist_port *port)
	spin_lock_irq(&gt_to_xe(port->hwe->gt)->irq.lock);
	port->hwe->irq_handler = NULL;
	spin_unlock_irq(&gt_to_xe(port->hwe->gt)->irq.lock);

	xe_lrc_put(port->lrc);
}

static struct dma_fence *
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ struct xe_execlist_port {
	struct xe_execlist_exec_queue *running_exl;

	struct timer_list irq_fail;

	struct xe_lrc *lrc;
};

struct xe_execlist_exec_queue {
+2 −13
Original line number Diff line number Diff line
@@ -273,7 +273,6 @@ static void hw_engine_fini(void *arg)

	if (hwe->exl_port)
		xe_execlist_port_destroy(hwe->exl_port);
	xe_lrc_put(hwe->kernel_lrc);

	hwe->gt = NULL;
}
@@ -558,21 +557,13 @@ static int hw_engine_init(struct xe_gt *gt, struct xe_hw_engine *hwe,
		goto err_name;
	}

	hwe->kernel_lrc = xe_lrc_create(hwe, NULL, SZ_16K);
	if (IS_ERR(hwe->kernel_lrc)) {
		err = PTR_ERR(hwe->kernel_lrc);
		goto err_hwsp;
	}

	if (!xe_device_uc_enabled(xe)) {
		hwe->exl_port = xe_execlist_port_create(xe, hwe);
		if (IS_ERR(hwe->exl_port)) {
			err = PTR_ERR(hwe->exl_port);
			goto err_kernel_lrc;
		}
			goto err_hwsp;
		}

	if (xe_device_uc_enabled(xe)) {
	} else {
		/* GSCCS has a special interrupt for reset */
		if (hwe->class == XE_ENGINE_CLASS_OTHER)
			hwe->irq_handler = xe_gsc_hwe_irq_handler;
@@ -587,8 +578,6 @@ static int hw_engine_init(struct xe_gt *gt, struct xe_hw_engine *hwe,

	return devm_add_action_or_reset(xe->drm.dev, hw_engine_fini, hwe);

err_kernel_lrc:
	xe_lrc_put(hwe->kernel_lrc);
err_hwsp:
	xe_bo_unpin_map_no_vm(hwe->hwsp);
err_name:
+0 −2
Original line number Diff line number Diff line
@@ -136,8 +136,6 @@ struct xe_hw_engine {
	enum xe_force_wake_domains domain;
	/** @hwsp: hardware status page buffer object */
	struct xe_bo *hwsp;
	/** @kernel_lrc: Kernel LRC (should be replaced /w an xe_engine) */
	struct xe_lrc *kernel_lrc;
	/** @exl_port: execlists port */
	struct xe_execlist_port *exl_port;
	/** @fence_irq: fence IRQ to run when a hw engine IRQ is received */