[PATCH v2 7/8] drm/xe: msix support preparations - enable memirq

Niranjana Vishwanathapura niranjana.vishwanathapura at intel.com
Wed Jul 10 16:44:39 UTC 2024


On Thu, Jun 27, 2024 at 03:40:42PM +0300, Dani Liberman wrote:
>From: Ilia Levi <illevi at habana.ai>
>
>In order to configure the HW engines to use MSIX, we first need to
>enable memory based interrupts (memirq). Up until now only VF used
>memirq.
>
>Thus before enabling memirq, we need to test whether MSIX is enabled.
>For this purpose we move IRQ vectors allocation to an earlier entry
>point.
>
>Signed-off-by: Ilia Levi <illevi at habana.ai>
>---
> drivers/gpu/drm/xe/xe_device.c |  6 +++-
> drivers/gpu/drm/xe/xe_device.h | 12 ++++++++
> drivers/gpu/drm/xe/xe_irq.c    | 56 +++++++++++++++++++++-------------
> drivers/gpu/drm/xe/xe_irq.h    |  1 +
> 4 files changed, 53 insertions(+), 22 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
>index e4c7ecefa33d..1f5d40904927 100644
>--- a/drivers/gpu/drm/xe/xe_device.c
>+++ b/drivers/gpu/drm/xe/xe_device.c
>@@ -591,6 +591,10 @@ int xe_device_probe(struct xe_device *xe)
> 			return err;
> 	}
>
>+	err = xe_irq_init(xe);
>+	if (err)
>+		return err;
>+
> 	for_each_tile(tile, xe, id) {
> 		if (IS_SRIOV_VF(xe)) {
> 			xe_guc_comm_init_early(&tile->primary_gt->uc.guc);
>@@ -604,7 +608,7 @@ int xe_device_probe(struct xe_device *xe)
> 		err = xe_ggtt_init_early(tile->mem.ggtt);
> 		if (err)
> 			return err;
>-		if (IS_SRIOV_VF(xe)) {
>+		if (xe_device_needs_memirq(xe)) {
> 			err = xe_memirq_init(&tile->memirq);
> 			if (err)
> 				return err;
>diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
>index bb07f5669dbb..7b4f651652e9 100644
>--- a/drivers/gpu/drm/xe/xe_device.h
>+++ b/drivers/gpu/drm/xe/xe_device.h
>@@ -9,6 +9,7 @@
> #include <drm/drm_util.h>
>
> #include "xe_device_types.h"
>+#include "xe_sriov.h"
>
> static inline struct xe_device *to_xe_device(const struct drm_device *dev)
> {
>@@ -154,6 +155,17 @@ static inline bool xe_device_has_memirq(struct xe_device *xe)
> 	return GRAPHICS_VERx100(xe) >= 1250;
> }
>
>+static inline bool xe_device_has_msix(struct xe_device *xe)
>+{
>+	return xe->irq.msix_enabled;
>+}
>+
>+static inline bool xe_device_needs_memirq(struct xe_device *xe)
>+{
>+	return (IS_SRIOV_VF(xe) || xe_device_has_msix(xe)) &&
>+		xe_device_has_memirq(xe);
>+}
>+
> u32 xe_device_ccs_bytes(struct xe_device *xe, u64 size);
>
> void xe_device_snapshot_print(struct xe_device *xe, struct drm_printer *p);
>diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
>index 3fdd297516ab..24e8445b2a76 100644
>--- a/drivers/gpu/drm/xe/xe_irq.c
>+++ b/drivers/gpu/drm/xe/xe_irq.c
>@@ -559,19 +559,15 @@ static void vf_irq_reset(struct xe_device *xe)
> 	struct xe_tile *tile;
> 	unsigned int id;
>
>-	xe_assert(xe, IS_SRIOV_VF(xe));

As this function is still VF specific, we should probably not remove
this assert.

Niranjana

>-
>-	if (GRAPHICS_VERx100(xe) < 1210)
>-		xelp_intr_disable(xe);
>-	else
>+	if (GRAPHICS_VERx100(xe) >= 1210) {
> 		xe_assert(xe, xe_device_has_memirq(xe));
>-
>-	for_each_tile(tile, xe, id) {
>-		if (xe_device_has_memirq(xe))
>-			xe_memirq_reset(&tile->memirq);
>-		else
>-			gt_irq_reset(tile);
>+		return;
> 	}
>+
>+	xelp_intr_disable(xe);
>+
>+	for_each_tile(tile, xe, id)
>+		gt_irq_reset(tile);
> }
>
> static void xe_irq_reset(struct xe_device *xe)
>@@ -579,6 +575,11 @@ static void xe_irq_reset(struct xe_device *xe)
> 	struct xe_tile *tile;
> 	u8 id;
>
>+	if (xe_device_needs_memirq(xe)) {
>+		for_each_tile(tile, xe, id)
>+			xe_memirq_reset(&tile->memirq);
>+	}
>+
> 	if (IS_SRIOV_VF(xe))
> 		return vf_irq_reset(xe);
>
>@@ -606,13 +607,6 @@ static void xe_irq_reset(struct xe_device *xe)
>
> static void vf_irq_postinstall(struct xe_device *xe)
> {
>-	struct xe_tile *tile;
>-	unsigned int id;
>-
>-	for_each_tile(tile, xe, id)
>-		if (xe_device_has_memirq(xe))
>-			xe_memirq_postinstall(&tile->memirq);
>-
> 	if (GRAPHICS_VERx100(xe) < 1210)
> 		xelp_intr_enable(xe, true);
> 	else
>@@ -621,6 +615,17 @@ static void vf_irq_postinstall(struct xe_device *xe)
>
> static void xe_irq_postinstall(struct xe_device *xe)
> {
>+	struct xe_tile *tile;
>+	unsigned int id;
>+
>+	if (!xe->info.gt_count)
>+		return;
>+
>+	if (xe_device_needs_memirq(xe)) {
>+		for_each_tile(tile, xe, id)
>+			xe_memirq_postinstall(&tile->memirq);
>+	}
>+
> 	if (IS_SRIOV_VF(xe))
> 		return vf_irq_postinstall(xe);
>
>@@ -731,7 +736,7 @@ static int xe_irq_msix_request(struct xe_device *xe)
> 	return 0;
> }
>
>-int xe_irq_install(struct xe_device *xe)
>+int xe_irq_init(struct xe_device *xe)
> {
> 	struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> 	unsigned int irq_flags = PCI_IRQ_MSIX;
>@@ -750,14 +755,23 @@ int xe_irq_install(struct xe_device *xe)
> 		return nvec;
> 	}
>
>-	xe_irq_reset(xe);
>-
> 	err = pci_alloc_irq_vectors(pdev, nvec, nvec, irq_flags);
> 	if (err < 0) {
> 		drm_err(&xe->drm, "MSI/MSIX: Failed to enable support %d\n", err);
> 		return err;
> 	}
>
>+	xe->irq.num_of_interrupts = nvec;
>+
>+	return 0;
>+}
>+
>+int xe_irq_install(struct xe_device *xe)
>+{
>+	int err;
>+
>+	xe_irq_reset(xe);
>+
> 	if (xe->irq.msix_enabled)
> 		err = xe_irq_msix_request(xe);
> 	else
>diff --git a/drivers/gpu/drm/xe/xe_irq.h b/drivers/gpu/drm/xe/xe_irq.h
>index 4ab63e61a062..428ec3eb484f 100644
>--- a/drivers/gpu/drm/xe/xe_irq.h
>+++ b/drivers/gpu/drm/xe/xe_irq.h
>@@ -12,6 +12,7 @@ struct xe_device;
> struct xe_tile;
> struct xe_gt;
>
>+int xe_irq_init(struct xe_device *xe);
> int xe_irq_install(struct xe_device *xe);
> void xe_irq_suspend(struct xe_device *xe);
> void xe_irq_resume(struct xe_device *xe);
>-- 
>2.34.1
>


More information about the Intel-xe mailing list